1
0
mirror of https://github.com/mt-mods/pipeworks.git synced 2025-05-10 20:50:22 +02:00

prevent vacuum tubes breaking and refactor code

This commit is contained in:
OgelGames 2022-11-10 15:45:23 +11:00
parent 8c251800db
commit 330eb973c0
2 changed files with 114 additions and 89 deletions

View File

@ -298,6 +298,24 @@ if pipeworks.enable_mese_tube then
}) })
end end
if pipeworks.enable_sand_tube then
minetest.register_craft( {
output = "pipeworks:sand_tube_1 2",
recipe = {
{"basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet"},
{"group:sand", "group:sand", "group:sand"},
{"basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet"}
},
})
minetest.register_craft( {
output = "pipeworks:sand_tube_1",
recipe = {
{"group:sand", "pipeworks:tube_1", "group:sand"},
},
})
end
if pipeworks.enable_mese_sand_tube then if pipeworks.enable_mese_sand_tube then
minetest.register_craft( { minetest.register_craft( {
output = "pipeworks:mese_sand_tube_1 2", output = "pipeworks:mese_sand_tube_1 2",

View File

@ -1,4 +1,49 @@
local S = minetest.get_translator("pipeworks") local S = minetest.get_translator("pipeworks")
local enable_max = minetest.settings:get_bool("pipeworks_enable_items_per_tube_limit", true)
local max_items = tonumber(minetest.settings:get("pipeworks_max_items_per_tube")) or 30
max_items = math.ceil(max_items / 2) -- Limit vacuuming to half the max limit
local sqrtof3 = math.sqrt(3) -- Distance between opposite corners of a 1x1x1 cube
local function inside_area(p, minp, maxp)
if p.x < minp.x or p.x > maxp.x then return false end
if p.y < minp.y or p.y > maxp.y then return false end
if p.z < minp.z or p.z > maxp.z then return false end
return true
end
local function vacuum(pos, radius)
radius = radius + 0.5
local min_pos = vector.subtract(pos, radius)
local max_pos = vector.add(pos, radius)
local count = 0
for _, obj in pairs(minetest.get_objects_inside_radius(pos, radius * sqrtof3)) do
local entity = obj:get_luaentity()
if entity and entity.name == "__builtin:item" then
local obj_pos = obj:get_pos()
if inside_area(obj_pos, min_pos, max_pos) then
if entity.itemstring ~= "" then
pipeworks.tube_inject_item(pos, pos, vector.new(0, 0, 0), entity.itemstring)
entity.itemstring = ""
count = count + 1
end
obj:remove()
if enable_max and count >= max_items then
return -- Don't break tube by vacuuming too many items
end
end
end
end
end
local function set_timer(pos)
local timer = minetest.get_node_timer(pos)
-- Randomize timer so not all tubes vacuum at the same time
timer:start(math.random(10, 20) * 0.1)
end
if pipeworks.enable_sand_tube then if pipeworks.enable_sand_tube then
pipeworks.register_tube("pipeworks:sand_tube", { pipeworks.register_tube("pipeworks:sand_tube", {
description = S("Vacuuming Pneumatic Tube Segment"), description = S("Vacuuming Pneumatic Tube Segment"),
@ -6,102 +51,64 @@ if pipeworks.enable_sand_tube then
short = "pipeworks_sand_tube_short.png", short = "pipeworks_sand_tube_short.png",
noctr = {"pipeworks_sand_tube_noctr.png"}, noctr = {"pipeworks_sand_tube_noctr.png"},
plain = {"pipeworks_sand_tube_plain.png"}, plain = {"pipeworks_sand_tube_plain.png"},
ends = {"pipeworks_sand_tube_end.png"}, ends = {"pipeworks_sand_tube_end.png"},
node_def = {groups = {vacuum_tube = 1}}, node_def = {
}) groups = {vacuum_tube = 1},
on_construct = set_timer,
minetest.register_craft( { on_timer = function(pos, elapsed)
output = "pipeworks:sand_tube_1 2", vacuum(pos, 2)
recipe = { set_timer(pos)
{"basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet"}, end,
{"group:sand", "group:sand", "group:sand"},
{"basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet"}
},
})
minetest.register_craft( {
output = "pipeworks:sand_tube_1",
recipe = {
{"group:sand", "pipeworks:tube_1", "group:sand"},
}, },
}) })
end end
if pipeworks.enable_mese_sand_tube then if pipeworks.enable_mese_sand_tube then
pipeworks.register_tube("pipeworks:mese_sand_tube", { local formspec = "formspec_version[2]size[8,3]"..
description = S("Adjustable Vacuuming Pneumatic Tube Segment"), pipeworks.fs_helpers.get_prepends("8,3")..
inventory_image = "pipeworks_mese_sand_tube_inv.png", "image[0.5,0.3;1,1;pipeworks_mese_sand_tube_inv.png]"..
short = "pipeworks_mese_sand_tube_short.png", "label[1.75,0.8;"..S("Adjustable Vacuuming Tube").."]"..
noctr = {"pipeworks_mese_sand_tube_noctr.png"}, "field[0.5,1.7;5,0.8;dist;"..S("Radius")..";${dist}]"..
plain = {"pipeworks_mese_sand_tube_plain.png"}, "button_exit[5.5,1.7;2,0.8;save;"..S("Save").."]"
ends = {"pipeworks_mese_sand_tube_end.png"},
node_def = {
groups = {vacuum_tube = 1},
on_construct = function(pos)
local meta = minetest.get_meta(pos)
local size = "6.0,2.4"
meta:set_int("dist", 0)
meta:set_string("formspec",
"size["..size.."]"..
pipeworks.fs_helpers.get_prepends(size) ..
"image[0.2,0;1,1;pipeworks_mese_sand_tube_inv.png]"..
"label[1.2,0.2;"..S("Adjustable Vacuuming Tube").."]"..
"field[0.5,1.6;2.1,1;dist;"..S("Radius")..";${dist}]"..
"button[2.3,1.3;1.5,1;set_dist;"..S("Set").."]"..
"button_exit[3.8,1.3;2,1;close;"..S("Close").."]")
meta:set_string("infotext", S("Adjustable Vacuuming Pneumatic Tube Segment"))
end,
on_receive_fields = function(pos,formname,fields,sender)
if (fields.quit and not fields.key_enter_field)
or (fields.key_enter_field ~= "dist" and not fields.set_dist)
or not pipeworks.may_configure(pos, sender) then
return
end
local meta = minetest.get_meta(pos) pipeworks.register_tube("pipeworks:mese_sand_tube", {
local dist = tonumber(fields.dist) description = S("Adjustable Vacuuming Tube"),
if dist then inventory_image = "pipeworks_mese_sand_tube_inv.png",
dist = math.max(0, dist) short = "pipeworks_mese_sand_tube_short.png",
dist = math.min(8, dist) noctr = {"pipeworks_mese_sand_tube_noctr.png"},
meta:set_int("dist", dist) plain = {"pipeworks_mese_sand_tube_plain.png"},
meta:set_string("infotext", S("Adjustable Vacuuming Pneumatic Tube Segment (@1m)", dist)) ends = {"pipeworks_mese_sand_tube_end.png"},
end node_def = {
end, groups = {vacuum_tube = 1},
}, on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_int("dist", 2)
meta:set_string("formspec", formspec)
meta:set_string("infotext", S("Adjustable Vacuuming Tube (@1m)", 2))
set_timer(pos)
end,
on_timer = function(pos, elapsed)
local radius = minetest.get_meta(pos):get_int("dist")
vacuum(pos, radius)
set_timer(pos)
end,
on_receive_fields = function(pos, _, fields, sender)
if not fields.dist or not pipeworks.may_configure(pos, sender) then
return
end
local meta = minetest.get_meta(pos)
local dist = math.min(math.max(tonumber(fields.dist) or 0, 0), 8)
meta:set_int("dist", dist)
meta:set_string("infotext", S("Adjustable Vacuuming Tube (@1m)", dist))
end,
},
}) })
end end
local function vacuum(pos, radius) minetest.register_lbm({
radius = radius + 0.5 label = "Vacuum tube node timer starter",
for _, object in pairs(minetest.get_objects_inside_radius(pos, math.sqrt(3) * radius)) do name = "pipeworks:vacuum_tube_start",
local lua_entity = object:get_luaentity() nodenames = {"group:vacuum_tube"},
if not object:is_player() and lua_entity and lua_entity.name == "__builtin:item" then run_at_every_load = false,
local obj_pos = object:get_pos() action = set_timer,
local minpos = vector.subtract(pos, radius)
local maxpos = vector.add(pos, radius)
if obj_pos.x >= minpos.x and obj_pos.x <= maxpos.x
and obj_pos.y >= minpos.y and obj_pos.y <= maxpos.y
and obj_pos.z >= minpos.z and obj_pos.z <= maxpos.z then
if lua_entity.itemstring ~= "" then
pipeworks.tube_inject_item(pos, pos, vector.new(0, 0, 0), lua_entity.itemstring)
lua_entity.itemstring = ""
end
object:remove()
end
end
end
end
minetest.register_abm({nodenames = {"group:vacuum_tube"},
interval = 1,
chance = 1,
label = "Vacuum tubes",
action = function(pos, node, active_object_count, active_object_count_wider)
if node.name:find("pipeworks:sand_tube") then
vacuum(pos, 2)
else
local radius = minetest.get_meta(pos):get_int("dist")
vacuum(pos, radius)
end
end
}) })