52 lines
1.5 KiB
Lua

local radius = 2 -- Radius of item magnet
local age = 0.5 -- How old an item has to be before collecting
local function collect_items(player)
local pos = player:get_pos()
if not minetest.is_valid_pos(pos) then
return
end
-- Detect
local col_pos = vector.add(pos, {x = 0, y = 1.3, z = 0})
local objects = minetest.get_objects_inside_radius(col_pos, radius)
for _, object in pairs(objects) do
local entity = object:get_luaentity()
if entity and not object:is_player() and
not entity.collectioner and
entity.name == "__builtin:item" and entity.age > age then
local item = ItemStack(entity.itemstring)
local inv = player:get_inventory()
if item:get_name() ~= "" and inv and
inv:room_for_item("main", item) then
-- Magnet
object:move_to(col_pos)
entity.collectioner = true
-- Collect
if entity.collectioner == true then
minetest.after(0.05, function()
minetest.sound_play("item_drop_pickup", {
pos = col_pos,
max_hear_distance = 10,
gain = 0.2,
})
entity.itemstring = ""
object:remove()
inv:add_item("main", item)
end)
end
end
end
end
end
-- Item collection
minetest.register_playerstep(function(dtime, playernames)
for _, name in pairs(playernames) do
local player = minetest.get_player_by_name(name)
if player and player:is_player() and player:get_hp() > 0 then
collect_items(player)
end
end
end, minetest.is_singleplayer()) -- Force step in singlplayer mode only