From 2adbc61b22e76f5cb1bf98154a84491dc2ecccf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20P=C3=A9rez-Cerezo?= Date: Mon, 23 Nov 2020 13:47:23 +0100 Subject: Show the name of the item held in infotext, remove legacy stuff Replaced minetest.env:* calls, replaced ABM with LBM to improve efficiency. --- itemframes/init.lua | 60 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/itemframes/init.lua b/itemframes/init.lua index f5c8ce0..9c96df8 100644 --- a/itemframes/init.lua +++ b/itemframes/init.lua @@ -47,9 +47,9 @@ facedir[3] = {x=-1,y=0,z=0} local remove_item = function(pos, node) local objs = nil if node.name == "itemframes:frame" then - objs = minetest.env:get_objects_inside_radius(pos, .5) + objs = minetest.get_objects_inside_radius(pos, .5) elseif node.name == "itemframes:pedestal" then - objs = minetest.env:get_objects_inside_radius({x=pos.x,y=pos.y+1,z=pos.z}, .5) + objs = minetest.get_objects_inside_radius({x=pos.x,y=pos.y+1,z=pos.z}, .5) end if objs then for _, obj in ipairs(objs) do @@ -62,7 +62,7 @@ end local update_item = function(pos, node) remove_item(pos, node) - local meta = minetest.env:get_meta(pos) + local meta = minetest.get_meta(pos) if meta:get_string("item") ~= "" then if node.name == "itemframes:frame" then local posad = facedir[node.param2] @@ -74,22 +74,34 @@ local update_item = function(pos, node) pos.y = pos.y + 12/16+.33 end tmp.nodename = node.name - tmp.texture = ItemStack(meta:get_string("item")):get_name() - local e = minetest.env:add_entity(pos,"itemframes:item") + local stack = ItemStack(meta:get_string("item")) + tmp.texture = stack:get_name() + local e = minetest.add_entity(pos,"itemframes:item") if node.name == "itemframes:frame" then local yaw = math.pi*2 - node.param2 * math.pi/2 e:setyaw(yaw) end + local idef=minetest.registered_items[stack:get_name()] + local desc = stack:get_meta():get_string("description") + local hname = idef.description or stack:get_name() + if desc and desc ~= "" then + hname = desc + end + local owner = meta:get_string("owner") + meta:set_string("infotext", hname .. " (owned by "..owner..")") end end local drop_item = function(pos, node) - local meta = minetest.env:get_meta(pos) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local desc=minetest.registered_items[node.name].description or "" + meta:set_string("infotext", desc .. " (owned by "..owner..")") if meta:get_string("item") ~= "" then if node.name == "itemframes:frame" then - minetest.env:add_item(pos, meta:get_string("item")) + minetest.add_item(pos, meta:get_string("item")) elseif node.name == "itemframes:pedestal" then - minetest.env:add_item({x=pos.x,y=pos.y+1,z=pos.z}, meta:get_string("item")) + minetest.add_item({x=pos.x,y=pos.y+1,z=pos.z}, meta:get_string("item")) end meta:set_string("item","") end @@ -111,13 +123,13 @@ minetest.register_node("itemframes:frame",{ legacy_wallmounted = true, sounds = default.node_sound_defaults(), after_place_node = function(pos, placer, itemstack) - local meta = minetest.env:get_meta(pos) + local meta = minetest.get_meta(pos) meta:set_string("owner",placer:get_player_name()) meta:set_string("infotext","Item frame (owned by "..placer:get_player_name()..")") end, on_rightclick = function(pos, node, clicker, itemstack) if not itemstack then return end - local meta = minetest.env:get_meta(pos) + local meta = minetest.get_meta(pos) if clicker:get_player_name() == meta:get_string("owner") then drop_item(pos,node) local s = itemstack:take_item() @@ -127,14 +139,14 @@ minetest.register_node("itemframes:frame",{ return itemstack end, on_punch = function(pos,node,puncher) - local meta = minetest.env:get_meta(pos) + local meta = minetest.get_meta(pos) if puncher:get_player_name() == meta:get_string("owner") then drop_item(pos, node) end end, can_dig = function(pos,player) - local meta = minetest.env:get_meta(pos) + local meta = minetest.get_meta(pos) return player:get_player_name() == meta:get_string("owner") end, }) @@ -155,13 +167,13 @@ minetest.register_node("itemframes:pedestal",{ groups = { cracky=3 }, sounds = default.node_sound_defaults(), after_place_node = function(pos, placer, itemstack) - local meta = minetest.env:get_meta(pos) + local meta = minetest.get_meta(pos) meta:set_string("owner",placer:get_player_name()) meta:set_string("infotext","Pedestal (owned by "..placer:get_player_name()..")") end, on_rightclick = function(pos, node, clicker, itemstack) if not itemstack then return end - local meta = minetest.env:get_meta(pos) + local meta = minetest.get_meta(pos) if clicker:get_player_name() == meta:get_string("owner") then drop_item(pos,node) local s = itemstack:take_item() @@ -171,14 +183,14 @@ minetest.register_node("itemframes:pedestal",{ return itemstack end, on_punch = function(pos,node,puncher) - local meta = minetest.env:get_meta(pos) + local meta = minetest.get_meta(pos) if puncher:get_player_name() == meta:get_string("owner") then drop_item(pos,node) end end, can_dig = function(pos,player) - local meta = minetest.env:get_meta(pos) + local meta = minetest.get_meta(pos) return player:get_player_name() == meta:get_string("owner") end, }) @@ -186,14 +198,14 @@ minetest.register_node("itemframes:pedestal",{ -- automatically restore entities lost from frames/pedestals -- due to /clearobjects or similar -minetest.register_abm({ - nodenames = { "itemframes:frame", "itemframes:pedestal" }, - interval = 15, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - if #minetest.get_objects_inside_radius(pos, 0.5) > 0 then return end - update_item(pos, node) - end +minetest.register_lbm({ + name = "itemframes:restore_entities", + nodenames = { "itemframes:frame", "itemframes:pedestal" }, + run_at_every_load = true, + action = function(pos, node, active_object_count, active_object_count_wider) + if #minetest.get_objects_inside_radius(pos, 0.5) > 0 then return end + update_item(pos, node) + end }) -- crafts -- cgit v1.2.3