52 lines
1.5 KiB
Lua
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
|