Pass pointed_thing to on_punch and minetest.register_on_punchnode callbacks
authorShadowNinja <shadowninja@minetest.net>
Fri, 24 Jan 2014 00:21:01 +0000 (19:21 -0500)
committerShadowNinja <shadowninja@minetest.net>
Fri, 24 Jan 2014 00:21:56 +0000 (19:21 -0500)
builtin/item.lua
doc/lua_api.txt
src/script/cpp_api/s_item.h
src/script/cpp_api/s_node.cpp
src/script/cpp_api/s_node.h
src/script/lua_api/l_env.cpp
src/server.cpp

index 7a6bb6cf5c1ebb2c67e41205f28f961d427cae8b..de546c2e7eab4c29dd0b4e17bec0ecee3ebdd973 100644 (file)
@@ -1,5 +1,14 @@
 -- Minetest: builtin/item.lua
 
+local function copy_pointed_thing(pointed_thing)
+       return {
+               type  = pointed_thing.type,
+               above = vector.new(pointed_thing.above),
+               under = vector.new(pointed_thing.under),
+               ref   = pointed_thing.ref,
+       }
+end
+
 --
 -- Item definition helpers
 --
@@ -272,17 +281,7 @@ function minetest.item_place_node(itemstack, placer, pointed_thing, param2)
        if def.after_place_node then
                -- Deepcopy place_to and pointed_thing because callback can modify it
                local place_to_copy = {x=place_to.x, y=place_to.y, z=place_to.z}
-               local pointed_thing_copy = {
-                       type = pointed_thing.type,
-                       under = {
-                               x = pointed_thing.under.x,
-                               y = pointed_thing.under.y,
-                               z = pointed_thing.under.z},
-                       above = {
-                               x = pointed_thing.above.x,
-                               y = pointed_thing.above.y,
-                               z = pointed_thing.above.z}
-               }
+               local pointed_thing_copy = copy_pointed_thing(pointed_thing)
                if def.after_place_node(place_to_copy, placer, itemstack,
                                pointed_thing_copy) then
                        take_item = false
@@ -292,22 +291,12 @@ function minetest.item_place_node(itemstack, placer, pointed_thing, param2)
        -- Run script hook
        local _, callback
        for _, callback in ipairs(minetest.registered_on_placenodes) do
-               -- Deepcopy pos, node and poined_thing because callback can modify them
+               -- Deepcopy pos, node and pointed_thing because callback can modify them
                local place_to_copy = {x=place_to.x, y=place_to.y, z=place_to.z}
                local newnode_copy = {name=newnode.name, param1=newnode.param1, param2=newnode.param2}
                local oldnode_copy = {name=oldnode.name, param1=oldnode.param1, param2=oldnode.param2}
-               local pointed_thing_copy = {
-                       type = pointed_thing.type,
-                       under = {
-                               x = pointed_thing.under.x,
-                               y = pointed_thing.under.y,
-                               z = pointed_thing.under.z},
-                       above = {
-                               x = pointed_thing.above.x,
-                               y = pointed_thing.above.y,
-                               z = pointed_thing.above.z}
-               }
-               if callback(place_to_copy, newnode_copy, placer, oldnode_copy, itemstack, poined_thing_copy) then
+               local pointed_thing_copy = copy_pointed_thing(pointed_thing)
+               if callback(place_to_copy, newnode_copy, placer, oldnode_copy, itemstack, pointed_thing_copy) then
                        take_item = false
                end
        end
@@ -372,14 +361,14 @@ function minetest.item_eat(hp_change, replace_with_item)
        end
 end
 
-function minetest.node_punch(pos, node, puncher)
+function minetest.node_punch(pos, node, puncher, pointed_thing)
        -- Run script hook
-       local _, callback
        for _, callback in ipairs(minetest.registered_on_punchnodes) do
                -- Copy pos and node because callback can modify them
-               local pos_copy = {x=pos.x, y=pos.y, z=pos.z}
+               local pos_copy = vector.new(pos)
                local node_copy = {name=node.name, param1=node.param1, param2=node.param2}
-               callback(pos_copy, node_copy, puncher)
+               local pointed_thing_copy = copy_pointed_thing(pointed_thing)
+               callback(pos_copy, node_copy, puncher, pointed_thing_copy)
        end
 end
 
index 4614ca062d88eb541a05348c805fc1210d969729..736f6ca4f061a87dd01ed03e379800828d3bc6ed 100644 (file)
@@ -1211,7 +1211,7 @@ minetest.register_on_dignode(func(pos, oldnode, digger))
 ^ Called when a node has been dug.
 ^ Not recommended: Use on_destruct or after_dig_node in node definition
 ^                  whenever possible
-minetest.register_on_punchnode(func(pos, node, puncher))
+minetest.register_on_punchnode(func(pos, node, puncher, pointed_thing))
 ^ Called when a node is punched
 minetest.register_on_generated(func(minp, maxp, blockseed))
 ^ Called after generating a piece of world. Modifying nodes inside the area
@@ -1500,7 +1500,7 @@ minetest.item_eat(hp_change, replace_with_item)
 ^ Eat the item. replace_with_item can be nil.
 
 Defaults for the on_punch and on_dig node definition callbacks:
-minetest.node_punch(pos, node, puncher)
+minetest.node_punch(pos, node, puncher, pointed_thing)
 ^ Calls functions registered by minetest.register_on_punchnode()
 minetest.node_dig(pos, node, digger)
 ^ Checks if node can be dug, puts item into inventory, removes node
@@ -2273,9 +2273,9 @@ Node definition (register_node)
     ^ returns true if node can be dug, or false if not
     ^ default: nil
     
-    on_punch = func(pos, node, puncher),
+    on_punch = func(pos, node, puncher, pointed_thing),
     ^ default: minetest.node_punch
-    ^ By default: does nothing
+    ^ By default: Calls minetest.register_on_punchnode callbacks
     on_rightclick = func(pos, node, clicker, itemstack, pointed_thing),
     ^ default: nil
     ^ if defined, itemstack will hold clicker's wielded item
index 4964dd5b422a467b5674454ae9b5cb9b7417a032..cca1641fdf478cb5917ec0154a7641a6dd953f5e 100644 (file)
@@ -52,7 +52,6 @@ protected:
        friend class ModApiItemMod;
 
        bool getItemCallback(const char *name, const char *callbackname);
-private:
        void pushPointedThing(const PointedThing& pointed);
 
 };
index cd8451cf0431ba5d9e7b2a169c0cd827653ad26a..55db43584915409493a4dd0189e5dbbda67bca50 100644 (file)
@@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "nodedef.h"
 #include "server.h"
 #include "environment.h"
+#include "util/pointedthing.h"
 
 
 struct EnumString ScriptApiNode::es_DrawType[] =
@@ -87,7 +88,7 @@ ScriptApiNode::~ScriptApiNode() {
 }
 
 bool ScriptApiNode::node_on_punch(v3s16 p, MapNode node,
-               ServerActiveObject *puncher)
+               ServerActiveObject *puncher, PointedThing pointed)
 {
        SCRIPTAPI_PRECHECKHEADER
 
@@ -104,7 +105,8 @@ bool ScriptApiNode::node_on_punch(v3s16 p, MapNode node,
        push_v3s16(L, p);
        pushnode(L, node, ndef);
        objectrefGetOrCreate(puncher);
-       if(lua_pcall(L, 3, 0, errorhandler))
+       pushPointedThing(pointed);
+       if(lua_pcall(L, 4, 0, errorhandler))
                scriptError();
        lua_pop(L, 1); // Pop error handler
        return true;
index 517b4b04e651e479ad9148681dddb15c16c7cf81..b3a6c83b5cd0fd55c3298770166924c467f7d279 100644 (file)
@@ -38,7 +38,7 @@ public:
        virtual ~ScriptApiNode();
 
        bool node_on_punch(v3s16 p, MapNode node,
-                       ServerActiveObject *puncher);
+                       ServerActiveObject *puncher, PointedThing pointed);
        bool node_on_dig(v3s16 p, MapNode node,
                        ServerActiveObject *digger);
        void node_on_construct(v3s16 p, MapNode node);
index f753347501f3917818a3c15c5291fee0924f383a..6447866cdc7b401cd20863cc6c414801cbf816ce 100644 (file)
@@ -273,7 +273,7 @@ int ModApiEnvMod::l_punch_node(lua_State *L)
        }
        // Punch it with a NULL puncher (appears in Lua as a non-functional
        // ObjectRef)
-       bool success = scriptIfaceNode->node_on_punch(pos, n, NULL);
+       bool success = scriptIfaceNode->node_on_punch(pos, n, NULL, PointedThing());
        lua_pushboolean(L, success);
        return 1;
 }
index 50141f843c64b9a8a95877755fc6ea0f6d5dcbba..47b11d3da3f6a43f1eddfd082c4b89b020f51728 100644 (file)
@@ -2918,7 +2918,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
                                        m_emerge->enqueueBlockEmerge(peer_id, getNodeBlockPos(p_above), false);
                                }
                                if(n.getContent() != CONTENT_IGNORE)
-                                       m_script->node_on_punch(p_under, n, playersao);
+                                       m_script->node_on_punch(p_under, n, playersao, pointed);
                                // Cheat prevention
                                playersao->noCheatDigStart(p_under);
                        }