]> git.lizzy.rs Git - xdecor.git/blob - src/mailbox.lua
Workbench: allow to register custom cuttable nodes (defined by user)
[xdecor.git] / src / mailbox.lua
1 local mailbox = {}
2 screwdriver = screwdriver or {}
3
4 local function get_img(img)
5         local img_name = img:match("(.*)%.png")
6         if img_name then return img_name..".png" end
7 end
8
9 local function img_col(stack)
10         local def = minetest.registered_items[stack]
11         if not def then return "" end
12
13         if def.inventory_image ~= "" then
14                 local img = get_img(def.inventory_image)
15                 if img then return img end
16         end
17
18         if def.tiles then
19                 local img
20                 local tile = def.tiles[1]
21
22                 if type(tile) == "table" then
23                         img = get_img(tile.name)
24                 elseif type(tile) == "string" then
25                         img = get_img(tile)
26                 end
27
28                 if img then return img end
29         end
30
31         return ""
32 end
33
34 function mailbox:formspec(pos, owner, num)
35         local spos = pos.x..","..pos.y..","..pos.z
36         local meta = minetest.get_meta(pos)
37         local giver, img = "", ""
38
39         if num == 1 then
40                 for i = 1, 7 do
41                         local giving = meta:get_string("giver"..i)
42                         if giving ~= "" then
43                                 local stack = meta:get_string("stack"..i)
44                                 local giver_name = giving:sub(1,12)
45                                 local stack_name = stack:match("[%w_:]+")
46                                 local stack_count = stack:match("%s(%d+)") or 1
47
48                                 giver = giver.."#FFFF00,"..giver_name..","..i..",#FFFFFF,x "..stack_count..","
49                                 img = img..i.."="..img_col(stack_name).."^\\[resize:16x16,"
50                         end
51                 end
52
53                 return [[ size[9.5,9]
54                         label[0,0;Mailbox]
55                         label[6,0;Last donators]
56                         box[6,0.72;3.3,3.5;#555555]
57                         listring[current_player;main]
58                         list[current_player;main;0.75,5.25;8,4;]
59                         tableoptions[background=#00000000;highlight=#00000000;border=false] ]]
60                         .."tablecolumns[color;text;image,"..img.."0;color;text]"..
61                         "table[6,0.75;3.3,4;givers;"..giver.."]"..
62                         "list[nodemeta:"..spos..";mailbox;0,0.75;6,4;]"..
63                         "listring[nodemeta:"..spos..";mailbox]"..
64                         xbg..default.get_hotbar_bg(0.75,5.25)
65         else
66                 return [[ size[8,5]
67                         list[current_player;main;0,1.25;8,4;]
68                         tablecolumns[color;text;color;text]
69                         tableoptions[background=#00000000;highlight=#00000000;border=false] ]]
70                         .."table[0,0;3,1;sendform;#FFFFFF,Send your goods to,,,#FFFF00,"..owner.."]"..
71                         "list[nodemeta:"..spos..";drop;3.5,0;1,1;]"..
72                         xbg..default.get_hotbar_bg(0,1.25)
73         end
74 end
75
76 function mailbox.dig(pos, player)
77         local meta = minetest.get_meta(pos)
78         local owner = meta:get_string("owner")
79         local player_name = player and player:get_player_name()
80         local inv = meta:get_inventory()
81
82         return inv:is_empty("mailbox") and player_name == owner
83 end
84
85 function mailbox.after_place_node(pos, placer)
86         local meta = minetest.get_meta(pos)
87         local player_name = placer:get_player_name()
88
89         meta:set_string("owner", player_name)
90         meta:set_string("infotext", player_name.."'s Mailbox")
91
92         local inv = meta:get_inventory()
93         inv:set_size("mailbox", 6*4)
94         inv:set_size("drop", 1)
95 end
96
97 function mailbox.rightclick(pos, node, clicker, itemstack, pointed_thing)
98         local meta = minetest.get_meta(pos)
99         local player = clicker:get_player_name()
100         local owner = meta:get_string("owner")
101
102         if player == owner then
103                 minetest.show_formspec(player, "xdecor:mailbox", mailbox:formspec(pos, owner, 1))
104         else
105                 minetest.show_formspec(player, "xdecor:mailbox", mailbox:formspec(pos, owner, 0))
106         end
107         return itemstack
108 end
109
110 function mailbox.put(pos, listname, _, stack, player)
111         if listname == "drop" then
112                 local inv = minetest.get_meta(pos):get_inventory()
113                 if inv:room_for_item("mailbox", stack) then
114                         return -1
115                 else
116                         minetest.chat_send_player(player:get_player_name(), "The mailbox is full")
117                 end
118         end
119         return 0
120 end
121
122 function mailbox.on_put(pos, listname, _, stack, player)
123         local meta = minetest.get_meta(pos)
124         local inv = meta:get_inventory()
125
126         if listname == "drop" and inv:room_for_item("mailbox", stack) then
127                 inv:set_list("drop", {})
128                 inv:add_item("mailbox", stack)
129
130                 for i = 7, 2, -1 do
131                         meta:set_string("giver"..i, meta:get_string("giver"..(i-1)))
132                         meta:set_string("stack"..i, meta:get_string("stack"..(i-1)))
133                 end
134
135                 meta:set_string("giver1", player:get_player_name())
136                 meta:set_string("stack1", stack:to_string())
137         end
138 end
139
140 xdecor.register("mailbox", {
141         description = "Mailbox",
142         tiles = {"xdecor_mailbox_top.png", "xdecor_mailbox_bottom.png",
143                  "xdecor_mailbox_side.png", "xdecor_mailbox_side.png",
144                  "xdecor_mailbox.png", "xdecor_mailbox.png"},
145         groups = {cracky=3, oddly_breakable_by_hand=1},
146         on_rotate = screwdriver.rotate_simple,
147         can_dig = mailbox.dig,
148         on_rightclick = mailbox.rightclick,
149         on_metadata_inventory_put = mailbox.on_put,
150         allow_metadata_inventory_put = mailbox.put,
151         after_place_node = mailbox.after_place_node
152 })