Additional cleanup, impelemnt partial item stack pickup

This commit is contained in:
teknomunk 2024-02-16 13:49:15 +00:00
parent 0a294c55a1
commit 13ce4f9092
1 changed files with 33 additions and 30 deletions

View File

@ -116,47 +116,50 @@ end
local function try_object_pickup(player, inv, object, checkpos) local function try_object_pickup(player, inv, object, checkpos)
if not inv then return end if not inv then return end
local le = object:get_luaentity()
-- Check magnet timer -- Check magnet timer
if not (object:get_luaentity()._magnet_timer >= 0) then return end if not (le._magnet_timer >= 0) then return end
if not (object:get_luaentity()._magnet_timer < item_drop_settings.magnet_time) then return end if not (le._magnet_timer < item_drop_settings.magnet_time) then return end
-- Make sure we have room for the item -- Don't try to collect again
local itemstack = ItemStack(object:get_luaentity().itemstring) if le._removed then return end
if not inv:room_for_item("main", itemstack ) then
return
end
-- Collection
if object:get_luaentity()._removed then return end
-- Ignore if itemstring is not set yet -- Ignore if itemstring is not set yet
if object:get_luaentity().itemstring == "" then return end if le.itemstring == "" then return end
inv:add_item("main", itemstack ) -- Add what we can to the inventory
local itemstack = ItemStack(le.itemstring)
local leftovers = inv:add_item("main", itemstack )
check_pickup_achievements(object, player) check_pickup_achievements(object, player)
-- Destroy entity if leftovers:is_empty() then
-- This just prevents this section to be run again because object:remove() doesn't remove the item immediately. -- Destroy entity
object:get_luaentity().target = checkpos -- This just prevents this section to be run again because object:remove() doesn't remove the item immediately.
object:get_luaentity()._removed = true le.target = checkpos
le._removed = true
-- Stop the object -- Stop the object
object:set_velocity(vector.zero()) object:set_velocity(vector.zero())
object:set_acceleration(vector.zero()) object:set_acceleration(vector.zero())
object:move_to(checkpos) object:move_to(checkpos)
-- Update sound pool -- Update sound pool
local name = player:get_player_name() local name = player:get_player_name()
pool[name] = ( pool[name] or 0 ) + 1 pool[name] = ( pool[name] or 0 ) + 1
-- Make sure the object gets removed -- Make sure the object gets removed
minetest.after(0.25, function() minetest.after(0.25, function()
--safety check --safety check
if object and object:get_luaentity() then if object and object:get_luaentity() then
object:remove() object:remove()
end end
end) end)
else
-- Update entity itemstring
le.itemstring = leftovers:to_string()
end
end end
minetest.register_globalstep(function(_) minetest.register_globalstep(function(_)