]> git.lizzy.rs Git - minetest.git/blobdiff - src/script/cpp_api/s_node.cpp
Use native packer to transfer globals into async env(s)
[minetest.git] / src / script / cpp_api / s_node.cpp
index c8f85317e63051505a013b6591b3144712579afc..029cb6308c4386cf619823f4481066e71225cda7 100644 (file)
@@ -65,6 +65,7 @@ struct EnumString ScriptApiNode::es_ContentParamType2[] =
                {CPT2_COLORED_FACEDIR, "colorfacedir"},
                {CPT2_COLORED_WALLMOUNTED, "colorwallmounted"},
                {CPT2_GLASSLIKE_LIQUID_LEVEL, "glasslikeliquidlevel"},
+               {CPT2_COLORED_DEGROTATE, "colordegrotate"},
                {0, NULL},
        };
 
@@ -93,17 +94,25 @@ struct EnumString ScriptApiNode::es_NodeBoxType[] =
                {0, NULL},
        };
 
+struct EnumString ScriptApiNode::es_TextureAlphaMode[] =
+       {
+               {ALPHAMODE_OPAQUE, "opaque"},
+               {ALPHAMODE_CLIP, "clip"},
+               {ALPHAMODE_BLEND, "blend"},
+               {0, NULL},
+       };
+
 bool ScriptApiNode::node_on_punch(v3s16 p, MapNode node,
-               ServerActiveObject *puncher, PointedThing pointed)
+               ServerActiveObject *puncher, const PointedThing &pointed)
 {
        SCRIPTAPI_PRECHECKHEADER
 
        int error_handler = PUSH_ERROR_HANDLER(L);
 
-       INodeDefManager *ndef = getServer()->ndef();
+       const NodeDefManager *ndef = getServer()->ndef();
 
        // Push callback function on stack
-       if (!getItemCallback(ndef->get(node).name.c_str(), "on_punch"))
+       if (!getItemCallback(ndef->get(node).name.c_str(), "on_punch", &p))
                return false;
 
        // Call function
@@ -123,19 +132,24 @@ bool ScriptApiNode::node_on_dig(v3s16 p, MapNode node,
 
        int error_handler = PUSH_ERROR_HANDLER(L);
 
-       INodeDefManager *ndef = getServer()->ndef();
+       const NodeDefManager *ndef = getServer()->ndef();
 
        // Push callback function on stack
-       if (!getItemCallback(ndef->get(node).name.c_str(), "on_dig"))
+       if (!getItemCallback(ndef->get(node).name.c_str(), "on_dig", &p))
                return false;
 
        // Call function
        push_v3s16(L, p);
        pushnode(L, node, ndef);
        objectrefGetOrCreate(L, digger);
-       PCALL_RES(lua_pcall(L, 3, 0, error_handler));
-       lua_pop(L, 1);  // Pop error handler
-       return true;
+       PCALL_RES(lua_pcall(L, 3, 1, error_handler));
+
+       // nil is treated as true for backwards compat
+       bool result = lua_isnil(L, -1) || lua_toboolean(L, -1);
+
+       lua_pop(L, 2);  // Pop error handler and result
+
+       return result;
 }
 
 void ScriptApiNode::node_on_construct(v3s16 p, MapNode node)
@@ -144,10 +158,10 @@ void ScriptApiNode::node_on_construct(v3s16 p, MapNode node)
 
        int error_handler = PUSH_ERROR_HANDLER(L);
 
-       INodeDefManager *ndef = getServer()->ndef();
+       const NodeDefManager *ndef = getServer()->ndef();
 
        // Push callback function on stack
-       if (!getItemCallback(ndef->get(node).name.c_str(), "on_construct"))
+       if (!getItemCallback(ndef->get(node).name.c_str(), "on_construct", &p))
                return;
 
        // Call function
@@ -162,10 +176,10 @@ void ScriptApiNode::node_on_destruct(v3s16 p, MapNode node)
 
        int error_handler = PUSH_ERROR_HANDLER(L);
 
-       INodeDefManager *ndef = getServer()->ndef();
+       const NodeDefManager *ndef = getServer()->ndef();
 
        // Push callback function on stack
-       if (!getItemCallback(ndef->get(node).name.c_str(), "on_destruct"))
+       if (!getItemCallback(ndef->get(node).name.c_str(), "on_destruct", &p))
                return;
 
        // Call function
@@ -180,10 +194,10 @@ bool ScriptApiNode::node_on_flood(v3s16 p, MapNode node, MapNode newnode)
 
        int error_handler = PUSH_ERROR_HANDLER(L);
 
-       INodeDefManager *ndef = getServer()->ndef();
+       const NodeDefManager *ndef = getServer()->ndef();
 
        // Push callback function on stack
-       if (!getItemCallback(ndef->get(node).name.c_str(), "on_flood"))
+       if (!getItemCallback(ndef->get(node).name.c_str(), "on_flood", &p))
                return false;
 
        // Call function
@@ -192,7 +206,7 @@ bool ScriptApiNode::node_on_flood(v3s16 p, MapNode node, MapNode newnode)
        pushnode(L, newnode, ndef);
        PCALL_RES(lua_pcall(L, 3, 1, error_handler));
        lua_remove(L, error_handler);
-       return (bool) lua_isboolean(L, -1) && (bool) lua_toboolean(L, -1);
+       return readParam<bool>(L, -1, false);
 }
 
 void ScriptApiNode::node_after_destruct(v3s16 p, MapNode node)
@@ -201,10 +215,10 @@ void ScriptApiNode::node_after_destruct(v3s16 p, MapNode node)
 
        int error_handler = PUSH_ERROR_HANDLER(L);
 
-       INodeDefManager *ndef = getServer()->ndef();
+       const NodeDefManager *ndef = getServer()->ndef();
 
        // Push callback function on stack
-       if (!getItemCallback(ndef->get(node).name.c_str(), "after_destruct"))
+       if (!getItemCallback(ndef->get(node).name.c_str(), "after_destruct", &p))
                return;
 
        // Call function
@@ -220,10 +234,10 @@ bool ScriptApiNode::node_on_timer(v3s16 p, MapNode node, f32 dtime)
 
        int error_handler = PUSH_ERROR_HANDLER(L);
 
-       INodeDefManager *ndef = getServer()->ndef();
+       const NodeDefManager *ndef = getServer()->ndef();
 
        // Push callback function on stack
-       if (!getItemCallback(ndef->get(node).name.c_str(), "on_timer"))
+       if (!getItemCallback(ndef->get(node).name.c_str(), "on_timer", &p))
                return false;
 
        // Call function
@@ -231,7 +245,7 @@ bool ScriptApiNode::node_on_timer(v3s16 p, MapNode node, f32 dtime)
        lua_pushnumber(L,dtime);
        PCALL_RES(lua_pcall(L, 2, 1, error_handler));
        lua_remove(L, error_handler);
-       return (bool) lua_isboolean(L, -1) && (bool) lua_toboolean(L, -1);
+       return readParam<bool>(L, -1, false);
 }
 
 void ScriptApiNode::node_on_receive_fields(v3s16 p,
@@ -243,15 +257,15 @@ void ScriptApiNode::node_on_receive_fields(v3s16 p,
 
        int error_handler = PUSH_ERROR_HANDLER(L);
 
-       INodeDefManager *ndef = getServer()->ndef();
+       const NodeDefManager *ndef = getServer()->ndef();
 
        // If node doesn't exist, we don't know what callback to call
-       MapNode node = getEnv()->getMap().getNodeNoEx(p);
+       MapNode node = getEnv()->getMap().getNode(p);
        if (node.getContent() == CONTENT_IGNORE)
                return;
 
        // Push callback function on stack
-       if (!getItemCallback(ndef->get(node).name.c_str(), "on_receive_fields"))
+       if (!getItemCallback(ndef->get(node).name.c_str(), "on_receive_fields", &p))
                return;
 
        // Call function