]> git.lizzy.rs Git - xdecor.git/blob - src/itemframe.lua
Global code style cleaning
[xdecor.git] / src / itemframe.lua
1 local itemframe, tmp = {}, {}
2 screwdriver = screwdriver or {}
3
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
7
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
11                         obj:remove() break
12                 end
13         end
14 end
15
16 local facedir = {
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}
21 }
22
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
29
30         pos = vector.add(pos, vector.multiply(posad, 6.5/16))
31         tmp.nodename = node.name
32         tmp.texture = ItemStack(itemstring):get_name()
33
34         local entity = minetest.add_entity(pos, "xdecor:f_item")
35         local yaw = (math.pi * 2) - node.param2 * (math.pi / 2)
36         entity:set_yaw(yaw)
37
38         local timer = minetest.get_node_timer(pos)
39         timer:start(15.0)
40 end
41
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
46
47         minetest.add_item(pos, item)
48         meta:set_string("item", "")
49         remove_item(pos, node)
50
51         local timer = minetest.get_node_timer(pos)
52         timer:stop()
53 end
54
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 .. ")")
60 end
61
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)
66
67         if num == 0 and meta:get_string("item") ~= "" then
68                 update_item(pos, node)
69         end
70
71         return true
72 end
73
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")
79
80         if not admin and (player_name ~= owner or not itemstack) then
81                 return itemstack
82         end
83
84         drop_item(pos, node)
85         local itemstring = itemstack:take_item():to_string()
86         meta:set_string("item", itemstring)
87         update_item(pos, node)
88
89         return itemstack
90 end
91
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")
97
98         if admin and player_name == owner then
99                 drop_item(pos, node)
100         end
101 end
102
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")
109
110         return admin or player_name == owner
111 end
112
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),
121         tiles = {
122                 "xdecor_wood.png", "xdecor_wood.png", "xdecor_wood.png",
123                 "xdecor_wood.png", "xdecor_wood.png", "xdecor_itemframe.png"
124         },
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
131 })
132
133 minetest.register_entity("xdecor:f_item", {
134         visual = "wielditem",
135         visual_size = {x = 0.33, y = 0.33},
136         collisionbox = {0},
137         physical = false,
138         textures = {"air"},
139         on_activate = function(self, staticdata)
140                 local pos = self.object:get_pos()
141                 if minetest.get_node(pos).name ~= "xdecor:itemframe" then
142                         self.object:remove()
143                 end
144
145                 if tmp.nodename and tmp.texture then
146                         self.nodename = tmp.nodename
147                         tmp.nodename = nil
148                         self.texture = tmp.texture
149                         tmp.texture = nil
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]
155                         end
156                 end
157                 if self.texture then
158                         self.object:set_properties({
159                                 textures = {self.texture}
160                         })
161                 end
162         end,
163         get_staticdata = function(self)
164                 if self.nodename and self.texture then
165                         return self.nodename .. ";" .. self.texture
166                 end
167
168                 return ""
169         end
170 })
171
172 -- Recipes
173
174 minetest.register_craft({
175         output = "xdecor:itemframe",
176         recipe = {
177                 {"group:stick", "group:stick", "group:stick"},
178                 {"group:stick", "default:paper", "group:stick"},
179                 {"group:stick", "group:stick", "group:stick"}
180         }
181 })