Pass pointed_thing to on_punch and minetest.register_on_punchnode callbacks
parent
cd7e8372f3
commit
76d4396fa1
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue