local function drop_attached_node(p)
local n = core.get_node(p)
+ local drops = core.get_node_drops(n, "")
+ local def = core.registered_items[n.name]
+ if def and def.preserve_metadata then
+ local oldmeta = core.get_meta(p):to_table().fields
+ -- Copy pos and node because the callback can modify them.
+ local pos_copy = {x=p.x, y=p.y, z=p.z}
+ local node_copy = {name=n.name, param1=n.param1, param2=n.param2}
+ local drop_stacks = {}
+ for k, v in pairs(drops) do
+ drop_stacks[k] = ItemStack(v)
+ end
+ drops = drop_stacks
+ def.preserve_metadata(pos_copy, node_copy, oldmeta, drops)
+ end
core.remove_node(p)
- for _, item in pairs(core.get_node_drops(n, "")) do
+ for _, item in pairs(drops) do
local pos = {
x = p.x + math.random()/2 - 0.25,
y = p.y + math.random()/2 - 0.25,
digger:set_wielded_item(wielded)
end
+ -- Check to see if metadata should be preserved.
+ if def and def.preserve_metadata then
+ local oldmeta = core.get_meta(pos):to_table().fields
+ -- Copy pos and node because the callback can modify them.
+ local pos_copy = {x=pos.x, y=pos.y, z=pos.z}
+ local node_copy = {name=node.name, param1=node.param1, param2=node.param2}
+ local drop_stacks = {}
+ for k, v in pairs(drops) do
+ drop_stacks[k] = ItemStack(v)
+ end
+ drops = drop_stacks
+ def.preserve_metadata(pos_copy, node_copy, oldmeta, drops)
+ end
+
-- Handle drops
core.handle_node_drops(pos, drops, digger)
^ interval. Default: nil.
^ Warning: making a liquid node 'floodable' does not work and may cause problems. ]]
+ preserve_metadata = func(pos, oldnode, oldmeta, drops) --[[
+ ^ Called when oldnode is about be converted to an item, but before the
+ node is deleted from the world or the drops are added. This is generally
+ the result of either the node being dug or an attached node becoming detached.
+ ^ drops is a table of ItemStacks, so any metadata to be preserved can be
+ added directly to one or more of the dropped items. See "ItemStackMetaRef".
+ ^ default: nil ]]
after_place_node = func(pos, placer, itemstack, pointed_thing) --[[
^ Called after constructing node when node was placed using
minetest.item_place_node / minetest.place_node