From abd8a30c0542c75622d8e2b46e3529c9e798d227 Mon Sep 17 00:00:00 2001 From: ashtrayoz <33517241+ashtrayoz@users.noreply.github.com> Date: Thu, 9 Nov 2017 23:29:04 +1100 Subject: [PATCH] Add callback to preserve node metadata as item metadata --- builtin/game/falling.lua | 16 +++++++++++++++- builtin/game/item.lua | 14 ++++++++++++++ doc/lua_api.txt | 7 +++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/builtin/game/falling.lua b/builtin/game/falling.lua index 1876cf2a8..436350fa1 100644 --- a/builtin/game/falling.lua +++ b/builtin/game/falling.lua @@ -150,8 +150,22 @@ end 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, diff --git a/builtin/game/item.lua b/builtin/game/item.lua index 5e5696ff5..a7176711f 100644 --- a/builtin/game/item.lua +++ b/builtin/game/item.lua @@ -579,6 +579,20 @@ function core.node_dig(pos, node, digger) 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) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index d3b493fc3..7ffd17a42 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -4710,6 +4710,13 @@ Definition tables ^ 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