diff --git a/itemframe.lua b/itemframe.lua index 61d6aeb..b1dcdda 100644 --- a/itemframe.lua +++ b/itemframe.lua @@ -14,13 +14,11 @@ minetest.register_entity("xdecor:f_item", { tmp.nodename = nil self.texture = tmp.texture tmp.texture = nil - else - if staticdata ~= nil and staticdata ~= "" then - local data = staticdata:split(";") - if data and data[1] and data[2] then - self.nodename = data[1] - self.texture = data[2] - end + elseif staticdata ~= nil and staticdata ~= "" then + local data = staticdata:split(";") + if data and data[1] and data[2] then + self.nodename = data[1] + self.texture = data[2] end end if self.texture ~= nil then @@ -38,13 +36,12 @@ minetest.register_entity("xdecor:f_item", { local remove_item = function(pos, node) local objs = nil objs = minetest.get_objects_inside_radius(pos, .5) + if not objs then return end - if objs then - for _, obj in ipairs(objs) do - if obj and obj:get_luaentity() and - obj:get_luaentity().name == "xdecor:f_item" then - obj:remove() - end + for _, obj in pairs(objs) do + if obj and obj:get_luaentity() and + obj:get_luaentity().name == "xdecor:f_item" then + obj:remove() end end end @@ -59,35 +56,32 @@ local update_item = function(pos, node) remove_item(pos, node) local meta = minetest.get_meta(pos) local str_item = meta:get_string("item") + if str_item == "" then return end + + local posad = facedir[node.param2] + if not posad then return end + pos.x = pos.x + posad.x * 6.5/16 + pos.y = pos.y + posad.y * 6.5/16 + pos.z = pos.z + posad.z * 6.5/16 + tmp.nodename = node.name + tmp.texture = ItemStack(str_item):get_name() - if str_item ~= "" then - local posad = facedir[node.param2] - if not posad then return end - pos.x = pos.x + posad.x * 6.5/16 - pos.y = pos.y + posad.y * 6.5/16 - pos.z = pos.z + posad.z * 6.5/16 - - tmp.nodename = node.name - tmp.texture = ItemStack(str_item):get_name() - - local e = minetest.add_entity(pos, "xdecor:f_item") - local yaw = math.pi*2 - node.param2 * math.pi/2 - e:setyaw(yaw) - end + local e = minetest.add_entity(pos, "xdecor:f_item") + local yaw = math.pi*2 - node.param2 * math.pi/2 + e:setyaw(yaw) end local drop_item = function(pos, node) local meta = minetest.get_meta(pos) - if meta:get_string("item") ~= "" then - minetest.add_item(pos, meta:get_string("item")) - meta:set_string("item", "") - end + if meta:get_string("item") == "" then return end + minetest.add_item(pos, meta:get_string("item")) + meta:set_string("item", "") remove_item(pos, node) end xdecor.register("frame", { description = "Item frame", - groups = {snappy=3}, + groups = {choppy=3, snappy=2}, sounds = xdecor.wood, on_rotate = screwdriver.disallow, node_box = { @@ -108,34 +102,41 @@ xdecor.register("frame", { on_rightclick = function(pos, node, clicker, itemstack) if not itemstack then return end 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() - meta:set_string("item", s:to_string()) - update_item(pos, node) - end + local player = clicker:get_player_name() + if player ~= meta:get_string("owner") then return end + drop_item(pos, node) + local s = itemstack:take_item() + meta:set_string("item", s:to_string()) + update_item(pos, node) return itemstack end, on_punch = function(pos, node, puncher) local meta = minetest.get_meta(pos) - if puncher:get_player_name() == meta:get_string("owner") then - drop_item(pos, node) - end + local player = puncher:get_player_name() + if player ~= meta:get_string("owner") then return end + drop_item(pos, node) end, can_dig = function(pos, player) local meta = minetest.get_meta(pos) return player:get_player_name() == meta:get_string("owner") end, - after_destruct = remove_item + on_destruct = function(pos) + local meta = minetest.get_meta(pos) + local node = minetest.get_node(pos) + if meta:get_string("item") == "" then return end + drop_item(pos, node) + end }) minetest.register_abm({ nodenames = {"xdecor:frame"}, - interval = 10, - chance = 1, + interval = 10, 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 + local num + if node.name ~= "xdecor:frame" then return end + num = #minetest.get_objects_inside_radius(pos, 0.5) + if num > 0 then return end update_item(pos, node) end })