245245
246246bones .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+
248300minetest .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