Pass pointed_thing to on_punch and minetest.register_on_punchnode callbacks

This commit is contained in:
ShadowNinja 2014-01-23 19:21:01 -05:00
parent cd7e8372f3
commit 76d4396fa1
7 changed files with 28 additions and 38 deletions

@ -1,5 +1,14 @@
-- Minetest: builtin/item.lua -- 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 -- Item definition helpers
-- --
@ -272,17 +281,7 @@ function minetest.item_place_node(itemstack, placer, pointed_thing, param2)
if def.after_place_node then if def.after_place_node then
-- Deepcopy place_to and pointed_thing because callback can modify it -- 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 place_to_copy = {x=place_to.x, y=place_to.y, z=place_to.z}
local pointed_thing_copy = { local pointed_thing_copy = copy_pointed_thing(pointed_thing)
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 def.after_place_node(place_to_copy, placer, itemstack, if def.after_place_node(place_to_copy, placer, itemstack,
pointed_thing_copy) then pointed_thing_copy) then
take_item = false take_item = false
@ -292,22 +291,12 @@ function minetest.item_place_node(itemstack, placer, pointed_thing, param2)
-- Run script hook -- Run script hook
local _, callback local _, callback
for _, callback in ipairs(minetest.registered_on_placenodes) do 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 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 newnode_copy = {name=newnode.name, param1=newnode.param1, param2=newnode.param2}
local oldnode_copy = {name=oldnode.name, param1=oldnode.param1, param2=oldnode.param2} local oldnode_copy = {name=oldnode.name, param1=oldnode.param1, param2=oldnode.param2}
local pointed_thing_copy = { local pointed_thing_copy = copy_pointed_thing(pointed_thing)
type = pointed_thing.type, if callback(place_to_copy, newnode_copy, placer, oldnode_copy, itemstack, pointed_thing_copy) then
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
take_item = false take_item = false
end end
end end
@ -372,14 +361,14 @@ function minetest.item_eat(hp_change, replace_with_item)
end end
end end
function minetest.node_punch(pos, node, puncher) function minetest.node_punch(pos, node, puncher, pointed_thing)
-- Run script hook -- Run script hook
local _, callback
for _, callback in ipairs(minetest.registered_on_punchnodes) do for _, callback in ipairs(minetest.registered_on_punchnodes) do
-- Copy pos and node because callback can modify them -- 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} 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
end end

@ -1211,7 +1211,7 @@ minetest.register_on_dignode(func(pos, oldnode, digger))
^ Called when a node has been dug. ^ Called when a node has been dug.
^ Not recommended: Use on_destruct or after_dig_node in node definition ^ Not recommended: Use on_destruct or after_dig_node in node definition
^ whenever possible ^ 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 ^ Called when a node is punched
minetest.register_on_generated(func(minp, maxp, blockseed)) minetest.register_on_generated(func(minp, maxp, blockseed))
^ Called after generating a piece of world. Modifying nodes inside the area ^ 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. ^ Eat the item. replace_with_item can be nil.
Defaults for the on_punch and on_dig node definition callbacks: 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() ^ Calls functions registered by minetest.register_on_punchnode()
minetest.node_dig(pos, node, digger) minetest.node_dig(pos, node, digger)
^ Checks if node can be dug, puts item into inventory, removes node ^ 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 ^ returns true if node can be dug, or false if not
^ default: nil ^ default: nil
on_punch = func(pos, node, puncher), on_punch = func(pos, node, puncher, pointed_thing),
^ default: minetest.node_punch ^ 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), on_rightclick = func(pos, node, clicker, itemstack, pointed_thing),
^ default: nil ^ default: nil
^ if defined, itemstack will hold clicker's wielded item ^ if defined, itemstack will hold clicker's wielded item

@ -52,7 +52,6 @@ protected:
friend class ModApiItemMod; friend class ModApiItemMod;
bool getItemCallback(const char *name, const char *callbackname); bool getItemCallback(const char *name, const char *callbackname);
private:
void pushPointedThing(const PointedThing& pointed); void pushPointedThing(const PointedThing& pointed);
}; };

@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "nodedef.h" #include "nodedef.h"
#include "server.h" #include "server.h"
#include "environment.h" #include "environment.h"
#include "util/pointedthing.h"
struct EnumString ScriptApiNode::es_DrawType[] = struct EnumString ScriptApiNode::es_DrawType[] =
@ -87,7 +88,7 @@ ScriptApiNode::~ScriptApiNode() {
} }
bool ScriptApiNode::node_on_punch(v3s16 p, MapNode node, bool ScriptApiNode::node_on_punch(v3s16 p, MapNode node,
ServerActiveObject *puncher) ServerActiveObject *puncher, PointedThing pointed)
{ {
SCRIPTAPI_PRECHECKHEADER SCRIPTAPI_PRECHECKHEADER
@ -104,7 +105,8 @@ bool ScriptApiNode::node_on_punch(v3s16 p, MapNode node,
push_v3s16(L, p); push_v3s16(L, p);
pushnode(L, node, ndef); pushnode(L, node, ndef);
objectrefGetOrCreate(puncher); objectrefGetOrCreate(puncher);
if(lua_pcall(L, 3, 0, errorhandler)) pushPointedThing(pointed);
if(lua_pcall(L, 4, 0, errorhandler))
scriptError(); scriptError();
lua_pop(L, 1); // Pop error handler lua_pop(L, 1); // Pop error handler
return true; return true;

@ -38,7 +38,7 @@ public:
virtual ~ScriptApiNode(); virtual ~ScriptApiNode();
bool node_on_punch(v3s16 p, MapNode node, bool node_on_punch(v3s16 p, MapNode node,
ServerActiveObject *puncher); ServerActiveObject *puncher, PointedThing pointed);
bool node_on_dig(v3s16 p, MapNode node, bool node_on_dig(v3s16 p, MapNode node,
ServerActiveObject *digger); ServerActiveObject *digger);
void node_on_construct(v3s16 p, MapNode node); void node_on_construct(v3s16 p, MapNode node);

@ -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 // Punch it with a NULL puncher (appears in Lua as a non-functional
// ObjectRef) // ObjectRef)
bool success = scriptIfaceNode->node_on_punch(pos, n, NULL); bool success = scriptIfaceNode->node_on_punch(pos, n, NULL, PointedThing());
lua_pushboolean(L, success); lua_pushboolean(L, success);
return 1; return 1;
} }

@ -2918,7 +2918,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
m_emerge->enqueueBlockEmerge(peer_id, getNodeBlockPos(p_above), false); m_emerge->enqueueBlockEmerge(peer_id, getNodeBlockPos(p_above), false);
} }
if(n.getContent() != CONTENT_IGNORE) 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 // Cheat prevention
playersao->noCheatDigStart(p_under); playersao->noCheatDigStart(p_under);
} }