1 local itemframe, tmp = {}, {}
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 local ent = obj:get_luaentity()
10 if obj and ent and ent.name == "xdecor:f_item" then
17 [0] = {x = 0, y = 0, z = 1},
18 {x = 1, y = 0, z = 0},
19 {x = 0, y = 0, z = -1},
20 {x = -1, y = 0, z = 0}
23 local function update_item(pos, node)
24 remove_item(pos, node)
25 local meta = minetest.get_meta(pos)
26 local itemstring = meta:get_string("item")
27 local posad = facedir[node.param2]
28 if not posad or itemstring == "" then return end
30 pos = vector.add(pos, vector.multiply(posad, 6.5/16))
31 tmp.nodename = node.name
32 tmp.texture = ItemStack(itemstring):get_name()
34 local entity = minetest.add_entity(pos, "xdecor:f_item")
35 local yaw = (math.pi * 2) - node.param2 * (math.pi / 2)
38 local timer = minetest.get_node_timer(pos)
42 local function drop_item(pos, node)
43 local meta = minetest.get_meta(pos)
44 local item = meta:get_string("item")
45 if item == "" then return end
47 minetest.add_item(pos, item)
48 meta:set_string("item", "")
49 remove_item(pos, node)
51 local timer = minetest.get_node_timer(pos)
55 function itemframe.after_place(pos, placer, itemstack)
56 local meta = minetest.get_meta(pos)
57 local name = placer:get_player_name()
58 meta:set_string("owner", name)
59 meta:set_string("infotext", "Item Frame (owned by " .. name .. ")")
62 function itemframe.timer(pos)
63 local node = minetest.get_node(pos)
64 local meta = minetest.get_meta(pos)
65 local num = #minetest.get_objects_inside_radius(pos, 0.5)
67 if num == 0 and meta:get_string("item") ~= "" then
68 update_item(pos, node)
74 function itemframe.rightclick(pos, node, clicker, itemstack)
75 local meta = minetest.get_meta(pos)
76 local player_name = clicker:get_player_name()
77 local owner = meta:get_string("owner")
78 local admin = minetest.check_player_privs(player_name, "protection_bypass")
80 if not admin and (player_name ~= owner or not itemstack) then
85 local itemstring = itemstack:take_item():to_string()
86 meta:set_string("item", itemstring)
87 update_item(pos, node)
92 function itemframe.punch(pos, node, puncher)
93 local meta = minetest.get_meta(pos)
94 local player_name = puncher:get_player_name()
95 local owner = meta:get_string("owner")
96 local admin = minetest.check_player_privs(player_name, "protection_bypass")
98 if admin and player_name == owner then
103 function itemframe.dig(pos, player)
104 if not player then return end
105 local meta = minetest.get_meta(pos)
106 local player_name = player and player:get_player_name()
107 local owner = meta:get_string("owner")
108 local admin = minetest.check_player_privs(player_name, "protection_bypass")
110 return admin or player_name == owner
113 xdecor.register("itemframe", {
114 description = "Item Frame",
115 groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
116 sounds = default.node_sound_wood_defaults(),
117 on_rotate = screwdriver.disallow,
118 sunlight_propagates = true,
119 inventory_image = "xdecor_itemframe.png",
120 node_box = xdecor.nodebox.slab_z(0.9375),
122 "xdecor_wood.png", "xdecor_wood.png", "xdecor_wood.png",
123 "xdecor_wood.png", "xdecor_wood.png", "xdecor_itemframe.png"
125 after_place_node = itemframe.after_place,
126 on_timer = itemframe.timer,
127 on_rightclick = itemframe.rightclick,
128 on_punch = itemframe.punch,
129 can_dig = itemframe.dig,
130 after_destruct = remove_item
133 minetest.register_entity("xdecor:f_item", {
134 visual = "wielditem",
135 visual_size = {x = 0.33, y = 0.33},
139 on_activate = function(self, staticdata)
140 local pos = self.object:get_pos()
141 if minetest.get_node(pos).name ~= "xdecor:itemframe" then
145 if tmp.nodename and tmp.texture then
146 self.nodename = tmp.nodename
148 self.texture = tmp.texture
150 elseif staticdata and staticdata ~= "" then
151 local data = staticdata:split(";")
152 if data and data[1] and data[2] then
153 self.nodename = data[1]
154 self.texture = data[2]
158 self.object:set_properties({
159 textures = {self.texture}
163 get_staticdata = function(self)
164 if self.nodename and self.texture then
165 return self.nodename .. ";" .. self.texture
174 minetest.register_craft({
175 output = "xdecor:itemframe",
177 {"group:stick", "group:stick", "group:stick"},
178 {"group:stick", "default:paper", "group:stick"},
179 {"group:stick", "group:stick", "group:stick"}