2 screwdriver = screwdriver or {}
4 minetest.register_entity("xdecor:f_item", {
7 visual_size = {x=.33, y=.33},
8 collisionbox = {0, 0, 0, 0, 0, 0},
11 on_activate = function(self, staticdata)
12 if tmp.nodename ~= nil and tmp.texture ~= nil then
13 self.nodename = tmp.nodename
15 self.texture = tmp.texture
17 elseif staticdata ~= nil and staticdata ~= "" then
18 local data = staticdata:split(";")
19 if data and data[1] and data[2] then
20 self.nodename = data[1]
21 self.texture = data[2]
24 if self.texture ~= nil then
25 self.object:set_properties({textures={self.texture}})
28 get_staticdata = function(self)
29 if self.nodename ~= nil and self.texture ~= nil then
30 return self.nodename..";"..self.texture
36 local remove_item = function(pos, node)
38 objs = minetest.get_objects_inside_radius(pos, .5)
39 if not objs then return end
41 for _, obj in pairs(objs) do
42 if obj and obj:get_luaentity() and
43 obj:get_luaentity().name == "xdecor:f_item" then
50 facedir[0] = {x=0, y=0, z=1}
51 facedir[1] = {x=1, y=0, z=0}
52 facedir[2] = {x=0, y=0, z=-1}
53 facedir[3] = {x=-1, y=0, z=0}
55 local update_item = function(pos, node)
56 remove_item(pos, node)
57 local meta = minetest.get_meta(pos)
58 local str_item = meta:get_string("item")
59 if str_item == "" then return end
61 local posad = facedir[node.param2]
62 if not posad then return end
63 pos.x = pos.x + posad.x * 6.5/16
64 pos.y = pos.y + posad.y * 6.5/16
65 pos.z = pos.z + posad.z * 6.5/16
66 tmp.nodename = node.name
67 tmp.texture = ItemStack(str_item):get_name()
69 local e = minetest.add_entity(pos, "xdecor:f_item")
70 local yaw = math.pi*2 - node.param2 * math.pi/2
74 local drop_item = function(pos, node)
75 local meta = minetest.get_meta(pos)
76 if meta:get_string("item") == "" then return end
77 minetest.add_item(pos, meta:get_string("item"))
78 meta:set_string("item", "")
79 remove_item(pos, node)
82 xdecor.register("frame", {
83 description = "Item frame",
84 groups = {choppy=3, snappy=2},
85 sounds = default.node_sound_wood_defaults(),
86 on_rotate = screwdriver.disallow,
89 fixed = {-0.5, -0.5, 7/16, 0.5, 0.5, 0.5}
92 "xdecor_wood.png", "xdecor_wood.png", "xdecor_wood.png",
93 "xdecor_wood.png", "xdecor_wood.png", "xdecor_frame.png"
95 inventory_image = "xdecor_frame.png",
96 after_place_node = function(pos, placer, itemstack)
97 local meta = minetest.get_meta(pos)
98 local name = placer:get_player_name()
99 meta:set_string("owner", name)
100 meta:set_string("infotext", "Item frame (owned by "..name..")")
102 on_rightclick = function(pos, node, clicker, itemstack)
103 if not itemstack then return end
104 local meta = minetest.get_meta(pos)
105 local player = clicker:get_player_name()
106 if player ~= meta:get_string("owner") then return end
109 local s = itemstack:take_item()
110 meta:set_string("item", s:to_string())
111 update_item(pos, node)
114 on_punch = function(pos, node, puncher)
115 local meta = minetest.get_meta(pos)
116 local player = puncher:get_player_name()
117 if player ~= meta:get_string("owner") then return end
120 can_dig = function(pos, player)
121 local meta = minetest.get_meta(pos)
122 return player:get_player_name() == meta:get_string("owner")
124 on_destruct = function(pos)
125 local meta = minetest.get_meta(pos)
126 local node = minetest.get_node(pos)
127 if meta:get_string("item") == "" then return end
132 minetest.register_abm({
133 nodenames = {"xdecor:frame"},
134 interval = 15, chance = 1,
135 action = function(pos, node, _, _)
137 if node.name ~= "xdecor:frame" then return end
138 num = #minetest.get_objects_inside_radius(pos, 0.5)
139 if num > 0 then return end
140 update_item(pos, node)