Skip to content

Commit 283636b

Browse files
t4imSmallJoker
authored andcommitted
Bones: Iterate player inventory lists dynamically (#1229)
Avoid hard-coded player inventory lists. Expose `bones.player_inventory_lists` for mods to look up or change, which player inventory lists are being dropped or placed into bones.
1 parent 094ad00 commit 283636b

File tree

2 files changed

+38
-25
lines changed

2 files changed

+38
-25
lines changed

game_api.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,15 @@ Beds API
6767
}
6868
}
6969

70+
Bones API
71+
---------
72+
73+
An ordered list of listnames (default: "main", "craft") of the player inventory,
74+
that will be placed into bones or dropped on player death can be looked up or changed
75+
in `bones.player_inventory_lists`.
76+
77+
e.g. `table.insert(bones.player_inventory_lists, "backpack")`
78+
7079
Creative API
7180
------------
7281

mods/bones/init.lua

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
-- Minetest 0.4 mod: bones
22
-- See README.txt for licensing and other information.
33

4+
bones = {}
5+
46
local function is_owner(pos, name)
57
local owner = minetest.get_meta(pos):get_string("owner")
68
if owner == "" or owner == name or minetest.check_player_privs(name, "protection_bypass") then
@@ -165,6 +167,18 @@ local drop = function(pos, itemstack)
165167
end
166168
end
167169

170+
local player_inventory_lists = { "main", "craft" }
171+
bones.player_inventory_lists = player_inventory_lists
172+
173+
local function is_all_empty(player_inv)
174+
for _, list_name in ipairs(player_inventory_lists) do
175+
if not player_inv:is_empty(list_name) then
176+
return false
177+
end
178+
end
179+
return true
180+
end
181+
168182
minetest.register_on_dieplayer(function(player)
169183

170184
local bones_mode = minetest.settings:get("bones_mode") or "bones"
@@ -179,8 +193,7 @@ minetest.register_on_dieplayer(function(player)
179193
end
180194

181195
local player_inv = player:get_inventory()
182-
if player_inv:is_empty("main") and
183-
player_inv:is_empty("craft") then
196+
if is_all_empty(player_inv) then
184197
return
185198
end
186199

@@ -198,19 +211,12 @@ minetest.register_on_dieplayer(function(player)
198211
end
199212

200213
if bones_mode == "drop" then
201-
202-
-- drop inventory items
203-
for i = 1, player_inv:get_size("main") do
204-
drop(pos, player_inv:get_stack("main", i))
205-
end
206-
player_inv:set_list("main", {})
207-
208-
-- drop crafting grid items
209-
for i = 1, player_inv:get_size("craft") do
210-
drop(pos, player_inv:get_stack("craft", i))
214+
for _, list_name in ipairs(player_inventory_lists) do
215+
for i = 1, player_inv:get_size(list_name) do
216+
drop(pos, player_inv:get_stack(list_name, i))
217+
end
218+
player_inv:set_list(list_name, {})
211219
end
212-
player_inv:set_list("craft", {})
213-
214220
drop(pos, ItemStack("bones:bones"))
215221
return
216222
end
@@ -221,21 +227,19 @@ minetest.register_on_dieplayer(function(player)
221227
local meta = minetest.get_meta(pos)
222228
local inv = meta:get_inventory()
223229
inv:set_size("main", 8 * 4)
224-
inv:set_list("main", player_inv:get_list("main"))
225230

226-
for i = 1, player_inv:get_size("craft") do
227-
local stack = player_inv:get_stack("craft", i)
228-
if inv:room_for_item("main", stack) then
229-
inv:add_item("main", stack)
230-
else
231-
--drop if no space left
232-
drop(pos, stack)
231+
for _, list_name in ipairs(player_inventory_lists) do
232+
for i = 1, player_inv:get_size(list_name) do
233+
local stack = player_inv:get_stack(list_name, i)
234+
if inv:room_for_item("main", stack) then
235+
inv:add_item("main", stack)
236+
else -- no space left
237+
drop(pos, stack)
238+
end
233239
end
240+
player_inv:set_list(list_name, {})
234241
end
235242

236-
player_inv:set_list("main", {})
237-
player_inv:set_list("craft", {})
238-
239243
meta:set_string("formspec", bones_formspec)
240244
meta:set_string("owner", player_name)
241245

0 commit comments

Comments
 (0)