diff --git a/technic/sounds/vacuumcleaner.ogg b/technic/sounds/vacuumcleaner.ogg new file mode 100644 index 0000000..39d72de Binary files /dev/null and b/technic/sounds/vacuumcleaner.ogg differ diff --git a/technic/textures/technic_vacuum.png b/technic/textures/technic_vacuum.png new file mode 100644 index 0000000..1ef5815 Binary files /dev/null and b/technic/textures/technic_vacuum.png differ diff --git a/technic/tools/init.lua b/technic/tools/init.lua index b8d9127..5e0aa02 100644 --- a/technic/tools/init.lua +++ b/technic/tools/init.lua @@ -14,6 +14,7 @@ dofile(path.."/chainsaw.lua") dofile(path.."/tree_tap.lua") dofile(path.."/sonic_screwdriver.lua") dofile(path.."/prospector.lua") +dofile(path.."/vacuum.lua") if minetest.get_modpath("screwdriver") then -- compatibility alias diff --git a/technic/tools/vacuum.lua b/technic/tools/vacuum.lua new file mode 100644 index 0000000..f5fac9a --- /dev/null +++ b/technic/tools/vacuum.lua @@ -0,0 +1,61 @@ +-- Configuration +local vacuum_max_charge = 10000 -- 10000 - Maximum charge of the vacuum cleaner +local vacuum_charge_per_object = 100 -- 100 - Capable of picking up 50 objects +local vacuum_range = 8 -- 8 - Area in which to pick up objects + +local S = technic.getter + +technic.register_power_tool("technic:vacuum", vacuum_max_charge) + +minetest.register_tool("technic:vacuum", { + description = S("Vacuum Cleaner"), + inventory_image = "technic_vacuum.png", + stack_max = 1, + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + on_use = function(itemstack, user, pointed_thing) + local meta = minetest.deserialize(itemstack:get_metadata()) + if not meta or not meta.charge then + return + end + if meta.charge > vacuum_charge_per_object then + minetest.sound_play("vacuumcleaner", { + to_player = user:get_player_name(), + gain = 0.4, + }) + end + local pos = user:getpos() + local inv = user:get_inventory() + for _, object in ipairs(minetest.env:get_objects_inside_radius(pos, vacuum_range)) do + local luaentity = object:get_luaentity() + if not object:is_player() and luaentity and luaentity.name == "__builtin:item" and luaentity.itemstring ~= "" then + if inv and inv:room_for_item("main", ItemStack(luaentity.itemstring)) then + meta.charge = meta.charge - vacuum_charge_per_object + if meta.charge < vacuum_charge_per_object then + return + end + inv:add_item("main", ItemStack(luaentity.itemstring)) + minetest.sound_play("item_drop_pickup", { + to_player = user:get_player_name(), + gain = 0.4, + }) + luaentity.itemstring = "" + object:remove() + end + end + end + + technic.set_RE_wear(itemstack, meta.charge, vacuum_max_charge) + itemstack:set_metadata(minetest.serialize(meta)) + return itemstack + end, +}) + +minetest.register_craft({ + output = 'technic:vacuum', + recipe = { + {'pipeworks:tube_1', 'pipeworks:filter', 'technic:battery'}, + {'pipeworks:tube_1', 'technic:motor', 'technic:battery'}, + {'technic:stainless_steel_ingot', '', ''}, + } +})