Skip to content

Commit 93637aa

Browse files
committed
fixes as per code review completed (4)
1 parent 5c9ae29 commit 93637aa

File tree

1 file changed

+59
-35
lines changed

1 file changed

+59
-35
lines changed

mods/bones/init.lua

Lines changed: 59 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,58 @@ end
245245

246246
bones.register_dead_player_inv_management(player_dies_transfer_inventory)
247247

248+
local function collect_all_items(player)
249+
local all_inventory = {}
250+
for _, fun in ipairs(dead_player_callbacks) do
251+
local items = fun(player)
252+
-- https://www.programming-idioms.org/idiom/166/concatenate-two-lists/3812/lua
253+
table.move(items, 1, #items, #all_inventory + 1, all_inventory)
254+
end
255+
return all_inventory
256+
end
257+
258+
-- check if it's possible to place bones, if not find space near player
259+
local function find_node_for_bones_on_player_death(player, player_pos)
260+
local bones_pos = nil
261+
local bones_inv = nil
262+
local bones_meta = nil
263+
local bones_mode = "bones"
264+
bones_pos = player_pos
265+
local air
266+
if may_replace(bones_pos, player) then
267+
air = bones_pos
268+
else
269+
air = minetest.find_node_near(bones_pos, 1, {"air"})
270+
end
271+
272+
if air and not minetest.is_protected(air, player_name) then
273+
bones_pos = air
274+
local param2 = minetest.dir_to_facedir(player:get_look_dir())
275+
minetest.set_node(bones_pos, {name = "bones:bones", param2 = param2})
276+
bones_meta = minetest.get_meta(bones_pos)
277+
bones_inv = bones_meta:get_inventory()
278+
--make it so big that anything reasonable will for sure fit inside
279+
bones_inv:set_size("main", bones_max_slots)
280+
else
281+
bones_mode = "drop"
282+
bones_pos = nil
283+
end
284+
return bones_mode, bones_pos, bones_inv, bones_meta
285+
end
286+
287+
local function dump_into(bones_mode, bones_inv, bones_pos, all_inventory)
288+
local dropped = false
289+
for _, item in ipairs(all_inventory) do
290+
if bones_mode == "bones" and bones_inv:room_for_item("main", item) then
291+
bones_inv:add_item("main", item)
292+
else
293+
drop(player_pos, item)
294+
dropped = true
295+
end
296+
end
297+
return dropped
298+
end
299+
248300
minetest.register_on_dieplayer(function(player)
249301
local player_pos = vector.round(player:get_pos())
250302
local bones_mode = minetest.settings:get("bones_mode") or "bones"
@@ -254,7 +306,6 @@ minetest.register_on_dieplayer(function(player)
254306
local player_name = player:get_player_name()
255307
local bones_inv = nil
256308
local bones_pos = nil
257-
local dropped = false
258309
local bones_meta = nil
259310

260311
local bones_position_message = minetest.settings:get_bool("bones_position_message") == true
@@ -270,41 +321,14 @@ minetest.register_on_dieplayer(function(player)
270321
return
271322
end
272323

273-
for _, fun in ipairs(dead_player_callbacks) do
274-
local items = fun(player)
275-
for _, item in ipairs(items) do
276-
-- check if it's possible to place bones, if not find space near player
277-
if bones_mode == "bones" and bones_pos == nil then
278-
bones_pos = player_pos
279-
local air
280-
if may_replace(bones_pos, player) then
281-
air = bones_pos
282-
else
283-
air = minetest.find_node_near(bones_pos, 1, {"air"})
284-
end
285-
286-
if air and not minetest.is_protected(air, player_name) then
287-
bones_pos = air
288-
local param2 = minetest.dir_to_facedir(player:get_look_dir())
289-
minetest.set_node(bones_pos, {name = "bones:bones", param2 = param2})
290-
bones_meta = minetest.get_meta(bones_pos)
291-
bones_inv = bones_meta:get_inventory()
292-
--make it so big that anything reasonable will for sure fit inside
293-
bones_inv:set_size("main", bones_max_slots)
294-
else
295-
bones_mode = "drop"
296-
bones_pos = nil
297-
end
298-
end
299-
300-
if bones_mode == "bones" and bones_inv:room_for_item("main", item) then
301-
bones_inv:add_item("main", item)
302-
else
303-
drop(player_pos, item)
304-
dropped=true
305-
end
306-
end
324+
local all_inventory = collect_all_items(player)
325+
if bones_mode == "bones" and #all_inventory > 0 then
326+
bones_mode, bones_pos, bones_inv, bones_meta = find_node_for_bones_on_player_death(player, player_pos)
327+
end
328+
if bones_mode == "drop" and #all_inventory > 0 then
329+
all_inventory.insert(all_inventory,ItemStack("bones:bones"))
307330
end
331+
local dropped = dump_into(bones_mode, bones_inv, bones_pos, all_inventory)
308332

309333
local log_message
310334
local chat_message

0 commit comments

Comments
 (0)