2 screwdriver = screwdriver or {}
4 local function remove_item(pos, node)
5 local objs = minetest.get_objects_inside_radius(pos, 0.5)
6 if not objs then return end
8 for _, obj in pairs(objs) do
9 if obj and obj:get_luaentity() and
10 obj:get_luaentity().name == "xdecor:f_item" then
17 [0] = {x=0, y=0, z=1}, {x=1, y=0, z=0}, {x=0, y=0, z=-1}, {x=-1, y=0, z=0}
20 local function update_item(pos, node)
21 remove_item(pos, node)
22 local meta = minetest.get_meta(pos)
23 local itemstring = meta:get_string("item")
24 local posad = facedir[node.param2]
25 if not posad or itemstring == "" then return end
27 pos = vector.add(pos, vector.multiply(posad, 6.5/16))
28 tmp.nodename = node.name
29 tmp.texture = ItemStack(itemstring):get_name()
31 local entity = minetest.add_entity(pos, "xdecor:f_item")
32 local yaw = math.pi*2 - node.param2 * math.pi/2
35 local timer = minetest.get_node_timer(pos)
39 local function drop_item(pos, node)
40 local meta = minetest.get_meta(pos)
41 local item = meta:get_string("item")
42 if item == "" then return end
44 minetest.add_item(pos, item)
45 meta:set_string("item", "")
46 remove_item(pos, node)
48 local timer = minetest.get_node_timer(pos)
52 minetest.register_entity("xdecor:f_item", {
54 visual_size = {x=0.33, y=0.33},
58 on_activate = function(self, staticdata)
59 if tmp.nodename and tmp.texture then
60 self.nodename = tmp.nodename
62 self.texture = tmp.texture
64 elseif staticdata and staticdata ~= "" then
65 local data = staticdata:split(";")
66 if data and data[1] and data[2] then
67 self.nodename = data[1]
68 self.texture = data[2]
72 self.object:set_properties({textures={self.texture}})
75 get_staticdata = function(self)
76 if self.nodename and self.texture then
77 return self.nodename..";"..self.texture
83 xdecor.register("frame", {
84 description = "Item Frame",
86 sounds = default.node_sound_wood_defaults(),
87 on_rotate = screwdriver.disallow,
88 sunlight_propagates = true,
89 inventory_image = "xdecor_frame.png",
90 node_box = xdecor.nodebox.slab_z(0.9375),
91 tiles = {"xdecor_wood.png", "xdecor_wood.png", "xdecor_wood.png",
92 "xdecor_wood.png", "xdecor_wood.png", "xdecor_frame.png"},
93 after_place_node = function(pos, placer, itemstack)
94 local meta = minetest.get_meta(pos)
95 local name = placer:get_player_name()
96 meta:set_string("owner", name)
97 meta:set_string("infotext", "Item Frame (owned by "..name..")")
99 on_timer = function(pos)
100 local node = minetest.get_node(pos)
101 local meta = minetest.get_meta(pos)
102 local num = #minetest.get_objects_inside_radius(pos, 0.5)
104 if num == 0 and meta:get_string("item") ~= "" then
105 update_item(pos, node)
109 on_rightclick = function(pos, node, clicker, itemstack)
110 local meta = minetest.get_meta(pos)
111 local player = clicker:get_player_name()
112 local owner = meta:get_string("owner")
113 if player ~= owner or not itemstack then return end
116 local itemstring = itemstack:take_item():get_name()
117 meta:set_string("item", itemstring)
118 update_item(pos, node)
122 on_punch = function(pos, node, puncher)
123 local meta = minetest.get_meta(pos)
124 local player = puncher:get_player_name()
125 local owner = meta:get_string("owner")
127 if player ~= owner then return end
130 can_dig = function(pos, player)
131 local meta = minetest.get_meta(pos)
132 local pname = player:get_player_name()
133 local owner = meta:get_string("owner")
135 return player and pname == owner
137 after_destruct = remove_item