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.
This commit is contained in:
DS 2023-03-27 20:02:23 +02:00 committed by GitHub
parent 2180dc14ef
commit ea095d3f69
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 16 deletions

@ -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 -- Changing hp might kill the player causing mods to do who-knows-what to the
-- inventory, so do this before set_hp(). -- inventory, so do this before set_hp().
if replace_with_item then replace_with_item = itemstack:add_item(replace_with_item)
if itemstack:is_empty() then user:set_wielded_item(itemstack)
itemstack:add_item(replace_with_item) if not replace_with_item:is_empty() then
else local inv = user:get_inventory()
local inv = user:get_inventory() -- Check if inv is null, since non-players don't have one
-- Check if inv is null, since non-players don't have one if inv then
if inv and inv:room_for_item("main", {name=replace_with_item}) then replace_with_item = inv:add_item("main", replace_with_item)
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
end end
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) user:set_hp(user:get_hp() + hp_change)

@ -6082,8 +6082,8 @@ Defaults for the `on_place` and `on_drop` item definition functions
* Returns `function(itemstack, user, pointed_thing)` as a * Returns `function(itemstack, user, pointed_thing)` as a
function wrapper for `minetest.do_item_eat`. function wrapper for `minetest.do_item_eat`.
* `replace_with_item` is the itemstring which is added to the inventory. * `replace_with_item` is the itemstring which is added to the inventory.
If the player is eating a stack, then replace_with_item goes to a If the player is eating a stack and `replace_with_item` doesn't fit onto
different spot. the eaten stack, then the remainings go to a different spot, or are dropped.
Defaults for the `on_punch` and `on_dig` node definition callbacks Defaults for the `on_punch` and `on_dig` node definition callbacks
------------------------------------------------------------------ ------------------------------------------------------------------