Permalink
Browse files

Add callback to preserve node metadata as item metadata

  • Loading branch information...
ashtrayoz authored and paramat committed Nov 9, 2017
1 parent 6e5109f commit abd8a30c0542c75622d8e2b46e3529c9e798d227
Showing with 36 additions and 1 deletion.
  1. +15 −1 builtin/game/falling.lua
  2. +14 −0 builtin/game/item.lua
  3. +7 −0 doc/lua_api.txt
@@ -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,
@@ -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)

@@ -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

0 comments on commit abd8a30

Please sign in to comment.