Add ability to change the itemstack in placenode callbacks

master
PilzAdam 2012-12-17 19:49:18 +01:00
parent f4ed37ec6f
commit 29c17c14f1
2 changed files with 15 additions and 5 deletions

View File

@ -192,11 +192,15 @@ function minetest.item_place_node(itemstack, placer, pointed_thing)
-- Add node and update -- Add node and update
minetest.env:add_node(place_to, newnode) minetest.env:add_node(place_to, newnode)
local take_item = true
-- Run callback -- Run callback
if def.after_place_node then if def.after_place_node then
-- Copy place_to because callback can modify it -- Copy place_to 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}
def.after_place_node(place_to_copy, placer) if def.after_place_node(place_to_copy, placer, itemstack) then
take_item = false
end
end end
-- Run script hook -- Run script hook
@ -206,10 +210,14 @@ function minetest.item_place_node(itemstack, placer, pointed_thing)
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}
callback(place_to_copy, newnode_copy, placer, oldnode_copy) if callback(place_to_copy, newnode_copy, placer, oldnode_copy, itemstack) then
take_item = false
end
end end
if take_item then
itemstack:take_item() itemstack:take_item()
end
return itemstack return itemstack
end end

View File

@ -810,8 +810,9 @@ minetest.register_on_shutdown(func())
^ WARNING: If the server terminates abnormally (i.e. crashes), the registered ^ WARNING: If the server terminates abnormally (i.e. crashes), the registered
callbacks WILL LIKELY NOT BE RUN. Data should be saved at callbacks WILL LIKELY NOT BE RUN. Data should be saved at
semi-frequent intervals as well as on server shutdown. semi-frequent intervals as well as on server shutdown.
minetest.register_on_placenode(func(pos, newnode, placer, oldnode)) minetest.register_on_placenode(func(pos, newnode, placer, oldnode, itemstack))
^ Called when a node has been placed ^ Called when a node has been placed
^ If return true no item is taken from itemstack
^ Deprecated: Use on_construct or after_place_node in node definition instead ^ Deprecated: Use on_construct or after_place_node in node definition instead
minetest.register_on_dignode(func(pos, oldnode, digger)) minetest.register_on_dignode(func(pos, oldnode, digger))
^ Called when a node has been dug. ^ Called when a node has been dug.
@ -1405,9 +1406,10 @@ Node definition (register_node)
^ Node destructor; always called after removing node ^ Node destructor; always called after removing node
^ default: nil ^ default: nil
after_place_node = func(pos, placer), after_place_node = func(pos, placer, itemstack),
^ Called after constructing node when node was placed using ^ Called after constructing node when node was placed using
minetest.item_place_node / minetest.env:place_node minetest.item_place_node / minetest.env:place_node
^ If return true no item is taken from itemstack
^ default: nil ^ default: nil
after_dig_node = func(pos, oldnode, oldmetadata, digger), after_dig_node = func(pos, oldnode, oldmetadata, digger),
^ oldmetadata is in table format ^ oldmetadata is in table format