forked from Mirrorlandia_minetest/minetest
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:
parent
2180dc14ef
commit
ea095d3f69
@ -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
|
||||||
------------------------------------------------------------------
|
------------------------------------------------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user