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