diff options
| author | DS <ds.desour@proton.me> | 2023-03-27 20:02:23 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-27 20:02:23 +0200 |
| commit | ea095d3f69e7aadbcdbe5294e5dfc42ba2fe93bf (patch) | |
| tree | 2f5be4f1afe5c43d7eea0539eeb5eca56e95205e /builtin | |
| parent | 2180dc14ef802961d50d5e5f7fccd2d3a2b9f647 (diff) | |
| download | minetest-ea095d3f69e7aadbcdbe5294e5dfc42ba2fe93bf.tar.xz | |
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.
Diffstat (limited to 'builtin')
| -rw-r--r-- | builtin/game/item.lua | 26 |
1 files changed, 12 insertions, 14 deletions
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) |
