]> git.lizzy.rs Git - minetest.git/blobdiff - src/script/lua_api/l_env.h
Expose dtime_s to LBM handler
[minetest.git] / src / script / lua_api / l_env.h
index 2e9fab777c642aefc8957ab5b1f766ba1791d975..08782a4fbbd6c820bba5e619fd4a2d267640e422 100644 (file)
@@ -17,11 +17,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
-#ifndef L_ENV_H_
-#define L_ENV_H_
+#pragma once
 
 #include "lua_api/l_base.h"
-#include "environment.h"
+#include "serverenvironment.h"
+#include "raycast.h"
 
 class ModApiEnvMod : public ModApiBase {
 private:
@@ -29,6 +29,10 @@ class ModApiEnvMod : public ModApiBase {
        // pos = {x=num, y=num, z=num}
        static int l_set_node(lua_State *L);
 
+       // bulk_set_node([pos1, pos2, ...], node)
+       // pos = {x=num, y=num, z=num}
+       static int l_bulk_set_node(lua_State *L);
+
        static int l_add_node(lua_State *L);
 
        // remove_node(pos)
@@ -52,6 +56,11 @@ class ModApiEnvMod : public ModApiBase {
        // timeofday: nil = current time, 0 = night, 0.5 = day
        static int l_get_node_light(lua_State *L);
 
+       // get_natural_light(pos, timeofday)
+       // pos = {x=num, y=num, z=num}
+       // timeofday: nil = current time, 0 = night, 0.5 = day
+       static int l_get_natural_light(lua_State *L);
+
        // place_node(pos, node)
        // pos = {x=num, y=num, z=num}
        static int l_place_node(lua_State *L);
@@ -97,12 +106,18 @@ class ModApiEnvMod : public ModApiBase {
        // pos = {x=num, y=num, z=num}
        static int l_add_item(lua_State *L);
 
+       // get_connected_players()
+       static int l_get_connected_players(lua_State *L);
+
        // get_player_by_name(name)
        static int l_get_player_by_name(lua_State *L);
 
        // get_objects_inside_radius(pos, radius)
        static int l_get_objects_inside_radius(lua_State *L);
 
+       // get_objects_in_area(pos, minp, maxp)
+       static int l_get_objects_in_area(lua_State *L);
+
        // set_timeofday(val)
        // val = 0...1
        static int l_set_timeofday(lua_State *L);
@@ -113,7 +128,10 @@ class ModApiEnvMod : public ModApiBase {
        // get_gametime()
        static int l_get_gametime(lua_State *L);
 
-       // find_node_near(pos, radius, nodenames) -> pos or nil
+       // get_day_count() -> int
+       static int l_get_day_count(lua_State *L);
+
+       // find_node_near(pos, radius, nodenames, search_center) -> pos or nil
        // nodenames: eg. {"ignore", "group:tree"} or "default:dirt"
        static int l_find_node_near(lua_State *L);
 
@@ -125,6 +143,12 @@ class ModApiEnvMod : public ModApiBase {
        // nodenames: eg. {"ignore", "group:tree"} or "default:dirt"
        static int l_find_nodes_in_area_under_air(lua_State *L);
 
+       // fix_light(p1, p2) -> true/false
+       static int l_fix_light(lua_State *L);
+
+       // load_area(p1)
+       static int l_load_area(lua_State *L);
+
        // emerge_area(p1, p2)
        static int l_emerge_area(lua_State *L);
 
@@ -150,9 +174,12 @@ class ModApiEnvMod : public ModApiBase {
        // spawn_tree(pos, treedef)
        static int l_spawn_tree(lua_State *L);
 
-       // line_of_sight(pos1, pos2, stepsize) -> true/false
+       // line_of_sight(pos1, pos2) -> true/false
        static int l_line_of_sight(lua_State *L);
 
+       // raycast(pos1, pos2, objects, liquids) -> Raycast
+       static int l_raycast(lua_State *L);
+
        // find_path(pos1, pos2, searchdistance,
        //     max_jump, max_drop, algorithm) -> table containing path
        static int l_find_path(lua_State *L);
@@ -168,39 +195,56 @@ class ModApiEnvMod : public ModApiBase {
        // stops forceloading a position
        static int l_forceload_free_block(lua_State *L);
 
-       // get us precision time
-       static int l_get_us_time(lua_State *L);
+       // compare_block_status(nodepos)
+       static int l_compare_block_status(lua_State *L);
+
+       // Get a string translated server side
+       static int l_get_translated_string(lua_State * L);
+
+       /* Helpers */
+
+       static void collectNodeIds(lua_State *L, int idx,
+               const NodeDefManager *ndef, std::vector<content_t> &filter);
 
 public:
        static void Initialize(lua_State *L, int top);
+       static void InitializeClient(lua_State *L, int top);
+
+       static const EnumString es_ClearObjectsMode[];
+       static const EnumString es_BlockStatusType[];
 };
 
-class LuaABM : public ActiveBlockModifier
-{
+class LuaABM : public ActiveBlockModifier {
 private:
        int m_id;
 
-       std::set<std::string> m_trigger_contents;
-       std::set<std::string> m_required_neighbors;
+       std::vector<std::string> m_trigger_contents;
+       std::vector<std::string> m_required_neighbors;
        float m_trigger_interval;
        u32 m_trigger_chance;
+       bool m_simple_catch_up;
+       s16 m_min_y;
+       s16 m_max_y;
 public:
        LuaABM(lua_State *L, int id,
-                       const std::set<std::string> &trigger_contents,
-                       const std::set<std::string> &required_neighbors,
-                       float trigger_interval, u32 trigger_chance):
+                       const std::vector<std::string> &trigger_contents,
+                       const std::vector<std::string> &required_neighbors,
+                       float trigger_interval, u32 trigger_chance, bool simple_catch_up, s16 min_y, s16 max_y):
                m_id(id),
                m_trigger_contents(trigger_contents),
                m_required_neighbors(required_neighbors),
                m_trigger_interval(trigger_interval),
-               m_trigger_chance(trigger_chance)
+               m_trigger_chance(trigger_chance),
+               m_simple_catch_up(simple_catch_up),
+               m_min_y(min_y),
+               m_max_y(max_y)
        {
        }
-       virtual std::set<std::string> getTriggerContents()
+       virtual const std::vector<std::string> &getTriggerContents() const
        {
                return m_trigger_contents;
        }
-       virtual std::set<std::string> getRequiredNeighbors()
+       virtual const std::vector<std::string> &getRequiredNeighbors() const
        {
                return m_required_neighbors;
        }
@@ -212,8 +256,80 @@ class LuaABM : public ActiveBlockModifier
        {
                return m_trigger_chance;
        }
+       virtual bool getSimpleCatchUp()
+       {
+               return m_simple_catch_up;
+       }
+       virtual s16 getMinY()
+       {
+               return m_min_y;
+       }
+       virtual s16 getMaxY()
+       {
+               return m_max_y;
+       }
        virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n,
                        u32 active_object_count, u32 active_object_count_wider);
 };
 
-#endif /* L_ENV_H_ */
+class LuaLBM : public LoadingBlockModifierDef
+{
+private:
+       int m_id;
+public:
+       LuaLBM(lua_State *L, int id,
+                       const std::set<std::string> &trigger_contents,
+                       const std::string &name,
+                       bool run_at_every_load):
+               m_id(id)
+       {
+               this->run_at_every_load = run_at_every_load;
+               this->trigger_contents = trigger_contents;
+               this->name = name;
+       }
+       virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n, float dtime_s);
+};
+
+//! Lua wrapper for RaycastState objects
+class LuaRaycast : public ModApiBase
+{
+private:
+       static const luaL_Reg methods[];
+       //! Inner state
+       RaycastState state;
+
+       // Exported functions
+
+       // garbage collector
+       static int gc_object(lua_State *L);
+
+       /*!
+        * Raycast:next() -> pointed_thing
+        * Returns the next pointed thing on the ray.
+        */
+       static int l_next(lua_State *L);
+public:
+       //! Constructor with the same arguments as RaycastState.
+       LuaRaycast(
+               const core::line3d<f32> &shootline,
+               bool objects_pointable,
+               bool liquids_pointable) :
+               state(shootline, objects_pointable, liquids_pointable)
+       {}
+
+       //! Creates a LuaRaycast and leaves it on top of the stack.
+       static int create_object(lua_State *L);
+
+       //! Registers Raycast as a Lua userdata type.
+       static void Register(lua_State *L);
+
+       static const char className[];
+};
+
+struct ScriptCallbackState {
+       ServerScripting *script;
+       int callback_ref;
+       int args_ref;
+       unsigned int refcount;
+       std::string origin;
+};