]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/script/cpp_api/s_node.cpp
[CSM] Add `on_punchnode` callback
[dragonfireclient.git] / src / script / cpp_api / s_node.cpp
index dac058b13a837b7fc151480f82e47a06708df5aa..23c8f43b97b908080a8b61076ebc4b3fa6327c0e 100644 (file)
@@ -57,6 +57,11 @@ struct EnumString ScriptApiNode::es_ContentParamType2[] =
                {CPT2_FACEDIR, "facedir"},
                {CPT2_WALLMOUNTED, "wallmounted"},
                {CPT2_LEVELED, "leveled"},
+               {CPT2_DEGROTATE, "degrotate"},
+               {CPT2_MESHOPTIONS, "meshoptions"},
+               {CPT2_COLOR, "color"},
+               {CPT2_COLORED_FACEDIR, "colorfacedir"},
+               {CPT2_COLORED_WALLMOUNTED, "colorwallmounted"},
                {0, NULL},
        };
 
@@ -81,6 +86,7 @@ struct EnumString ScriptApiNode::es_NodeBoxType[] =
                {NODEBOX_FIXED, "fixed"},
                {NODEBOX_WALLMOUNTED, "wallmounted"},
                {NODEBOX_LEVELED, "leveled"},
+               {NODEBOX_CONNECTED, "connected"},
                {0, NULL},
        };
 
@@ -95,6 +101,8 @@ bool ScriptApiNode::node_on_punch(v3s16 p, MapNode node,
 {
        SCRIPTAPI_PRECHECKHEADER
 
+       int error_handler = PUSH_ERROR_HANDLER(L);
+
        INodeDefManager *ndef = getServer()->ndef();
 
        // Push callback function on stack
@@ -106,7 +114,8 @@ bool ScriptApiNode::node_on_punch(v3s16 p, MapNode node,
        pushnode(L, node, ndef);
        objectrefGetOrCreate(L, puncher);
        pushPointedThing(pointed);
-       PCALL_RES(lua_pcall(L, 4, 0, m_errorhandler));
+       PCALL_RES(lua_pcall(L, 4, 0, error_handler));
+       lua_pop(L, 1);  // Pop error handler
        return true;
 }
 
@@ -115,6 +124,8 @@ bool ScriptApiNode::node_on_dig(v3s16 p, MapNode node,
 {
        SCRIPTAPI_PRECHECKHEADER
 
+       int error_handler = PUSH_ERROR_HANDLER(L);
+
        INodeDefManager *ndef = getServer()->ndef();
 
        // Push callback function on stack
@@ -125,7 +136,8 @@ bool ScriptApiNode::node_on_dig(v3s16 p, MapNode node,
        push_v3s16(L, p);
        pushnode(L, node, ndef);
        objectrefGetOrCreate(L, digger);
-       PCALL_RES(lua_pcall(L, 3, 0, m_errorhandler));
+       PCALL_RES(lua_pcall(L, 3, 0, error_handler));
+       lua_pop(L, 1);  // Pop error handler
        return true;
 }
 
@@ -133,6 +145,8 @@ void ScriptApiNode::node_on_construct(v3s16 p, MapNode node)
 {
        SCRIPTAPI_PRECHECKHEADER
 
+       int error_handler = PUSH_ERROR_HANDLER(L);
+
        INodeDefManager *ndef = getServer()->ndef();
 
        // Push callback function on stack
@@ -141,13 +155,16 @@ void ScriptApiNode::node_on_construct(v3s16 p, MapNode node)
 
        // Call function
        push_v3s16(L, p);
-       PCALL_RES(lua_pcall(L, 1, 0, m_errorhandler));
+       PCALL_RES(lua_pcall(L, 1, 0, error_handler));
+       lua_pop(L, 1);  // Pop error handler
 }
 
 void ScriptApiNode::node_on_destruct(v3s16 p, MapNode node)
 {
        SCRIPTAPI_PRECHECKHEADER
 
+       int error_handler = PUSH_ERROR_HANDLER(L);
+
        INodeDefManager *ndef = getServer()->ndef();
 
        // Push callback function on stack
@@ -156,13 +173,16 @@ void ScriptApiNode::node_on_destruct(v3s16 p, MapNode node)
 
        // Call function
        push_v3s16(L, p);
-       PCALL_RES(lua_pcall(L, 1, 0, m_errorhandler));
+       PCALL_RES(lua_pcall(L, 1, 0, error_handler));
+       lua_pop(L, 1);  // Pop error handler
 }
 
 void ScriptApiNode::node_after_destruct(v3s16 p, MapNode node)
 {
        SCRIPTAPI_PRECHECKHEADER
 
+       int error_handler = PUSH_ERROR_HANDLER(L);
+
        INodeDefManager *ndef = getServer()->ndef();
 
        // Push callback function on stack
@@ -172,13 +192,16 @@ void ScriptApiNode::node_after_destruct(v3s16 p, MapNode node)
        // Call function
        push_v3s16(L, p);
        pushnode(L, node, ndef);
-       PCALL_RES(lua_pcall(L, 2, 0, m_errorhandler));
+       PCALL_RES(lua_pcall(L, 2, 0, error_handler));
+       lua_pop(L, 1);  // Pop error handler
 }
 
 bool ScriptApiNode::node_on_timer(v3s16 p, MapNode node, f32 dtime)
 {
        SCRIPTAPI_PRECHECKHEADER
 
+       int error_handler = PUSH_ERROR_HANDLER(L);
+
        INodeDefManager *ndef = getServer()->ndef();
 
        // Push callback function on stack
@@ -188,7 +211,8 @@ bool ScriptApiNode::node_on_timer(v3s16 p, MapNode node, f32 dtime)
        // Call function
        push_v3s16(L, p);
        lua_pushnumber(L,dtime);
-       PCALL_RES(lua_pcall(L, 2, 1, m_errorhandler));
+       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) == true;
 }
 
@@ -199,6 +223,8 @@ void ScriptApiNode::node_on_receive_fields(v3s16 p,
 {
        SCRIPTAPI_PRECHECKHEADER
 
+       int error_handler = PUSH_ERROR_HANDLER(L);
+
        INodeDefManager *ndef = getServer()->ndef();
 
        // If node doesn't exist, we don't know what callback to call
@@ -223,23 +249,30 @@ void ScriptApiNode::node_on_receive_fields(v3s16 p,
                lua_settable(L, -3);
        }
        objectrefGetOrCreate(L, sender);        // player
-       PCALL_RES(lua_pcall(L, 4, 0, m_errorhandler));
+       PCALL_RES(lua_pcall(L, 4, 0, error_handler));
+       lua_pop(L, 1);  // Pop error handler
 }
 
 void ScriptApiNode::node_falling_update(v3s16 p)
 {
        SCRIPTAPI_PRECHECKHEADER
 
+       int error_handler = PUSH_ERROR_HANDLER(L);
+
        lua_getglobal(L, "nodeupdate");
        push_v3s16(L, p);
-       PCALL_RES(lua_pcall(L, 1, 0, m_errorhandler));
+       PCALL_RES(lua_pcall(L, 1, 0, error_handler));
+       lua_pop(L, 1);  // Pop error handler
 }
 
 void ScriptApiNode::node_falling_update_single(v3s16 p)
 {
        SCRIPTAPI_PRECHECKHEADER
 
+       int error_handler = PUSH_ERROR_HANDLER(L);
+
        lua_getglobal(L, "nodeupdate_single");
        push_v3s16(L, p);
-       PCALL_RES(lua_pcall(L, 1, 0, m_errorhandler));
+       PCALL_RES(lua_pcall(L, 1, 0, error_handler));
+       lua_pop(L, 1);  // Pop error handler
 }