aboutsummaryrefslogtreecommitdiff
path: root/builtin
diff options
context:
space:
mode:
authorDS <ds.desour@proton.me>2023-03-27 20:02:23 +0200
committerGitHub <noreply@github.com>2023-03-27 20:02:23 +0200
commitea095d3f69e7aadbcdbe5294e5dfc42ba2fe93bf (patch)
tree2f5be4f1afe5c43d7eea0539eeb5eca56e95205e /builtin
parent2180dc14ef802961d50d5e5f7fccd2d3a2b9f647 (diff)
downloadminetest-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.lua26
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)