From ea095d3f69e7aadbcdbe5294e5dfc42ba2fe93bf Mon Sep 17 00:00:00 2001 From: DS Date: Mon, 27 Mar 2023 20:02:23 +0200 Subject: Fix core.item_eat for same-item replace_with_item and split stacks before dropping (#13286) The replace_with_item can be added to the slot of the wield item, which is afterwards overwritten. This causes item loss. --- builtin/game/item.lua | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) (limited to 'builtin') diff --git a/builtin/game/item.lua b/builtin/game/item.lua index 71126b0a7..17d081f3d 100644 --- a/builtin/game/item.lua +++ b/builtin/game/item.lua @@ -390,22 +390,20 @@ function core.do_item_eat(hp_change, replace_with_item, itemstack, user, pointed -- Changing hp might kill the player causing mods to do who-knows-what to the -- inventory, so do this before set_hp(). - if replace_with_item then - if itemstack:is_empty() then - itemstack:add_item(replace_with_item) - else - local inv = user:get_inventory() - -- Check if inv is null, since non-players don't have one - if inv and inv:room_for_item("main", {name=replace_with_item}) then - inv:add_item("main", replace_with_item) - else - local pos = user:get_pos() - pos.y = math.floor(pos.y + 0.5) - core.add_item(pos, replace_with_item) - end + replace_with_item = itemstack:add_item(replace_with_item) + user:set_wielded_item(itemstack) + if not replace_with_item:is_empty() then + local inv = user:get_inventory() + -- Check if inv is null, since non-players don't have one + if inv then + replace_with_item = inv:add_item("main", replace_with_item) end end - user:set_wielded_item(itemstack) + if not replace_with_item:is_empty() then + local pos = user:get_pos() + pos.y = math.floor(pos.y + 0.5) + core.add_item(pos, replace_with_item) + end user:set_hp(user:get_hp() + hp_change) -- cgit v1.2.3