mirror of
				https://github.com/mt-mods/pipeworks.git
				synced 2025-11-04 07:05:29 +01:00 
			
		
		
		
	Prevent vacuum tubes breaking themselves and refactor code (#51)
also bumps `min_minetest_version` to 5.4.0
This commit is contained in:
		
							
								
								
									
										18
									
								
								crafts.lua
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								crafts.lua
									
									
									
									
									
								
							@@ -298,6 +298,24 @@ if pipeworks.enable_mese_tube then
 | 
			
		||||
	})
 | 
			
		||||
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
 | 
			
		||||
	minetest.register_craft( {
 | 
			
		||||
		output = "pipeworks:mese_sand_tube_1 2",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								init.lua
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								init.lua
									
									
									
									
									
								
							@@ -153,7 +153,6 @@ dofile(pipeworks.modpath.."/flowing_logic.lua")
 | 
			
		||||
dofile(pipeworks.modpath.."/tube_registration.lua")
 | 
			
		||||
dofile(pipeworks.modpath.."/routing_tubes.lua")
 | 
			
		||||
dofile(pipeworks.modpath.."/sorting_tubes.lua")
 | 
			
		||||
dofile(pipeworks.modpath.."/vacuum_tubes.lua")
 | 
			
		||||
dofile(pipeworks.modpath.."/signal_tubes.lua")
 | 
			
		||||
dofile(pipeworks.modpath.."/decorative_tubes.lua")
 | 
			
		||||
dofile(pipeworks.modpath.."/filter-injector.lua")
 | 
			
		||||
@@ -170,17 +169,28 @@ dofile(pipeworks.modpath..logicdir.."abms.lua")
 | 
			
		||||
dofile(pipeworks.modpath..logicdir.."abm_register.lua")
 | 
			
		||||
dofile(pipeworks.modpath..logicdir.."flowable_node_registry_install.lua")
 | 
			
		||||
 | 
			
		||||
if pipeworks.enable_pipes then dofile(pipeworks.modpath.."/pipes.lua") end
 | 
			
		||||
if pipeworks.enable_teleport_tube then dofile(pipeworks.modpath.."/teleport_tube.lua") end
 | 
			
		||||
if pipeworks.enable_pipe_devices then dofile(pipeworks.modpath.."/devices.lua") end
 | 
			
		||||
if pipeworks.enable_pipes then
 | 
			
		||||
	dofile(pipeworks.modpath.."/pipes.lua")
 | 
			
		||||
end
 | 
			
		||||
if pipeworks.enable_teleport_tube then
 | 
			
		||||
	dofile(pipeworks.modpath.."/teleport_tube.lua")
 | 
			
		||||
end
 | 
			
		||||
if pipeworks.enable_pipe_devices then
 | 
			
		||||
	dofile(pipeworks.modpath.."/devices.lua")
 | 
			
		||||
end
 | 
			
		||||
if pipeworks.enable_redefines and (minetest.get_modpath("default") or minetest.get_modpath("hades_core")) then
 | 
			
		||||
	dofile(pipeworks.modpath.."/compat-chests.lua")
 | 
			
		||||
	dofile(pipeworks.modpath.."/compat-furnaces.lua")
 | 
			
		||||
end
 | 
			
		||||
if pipeworks.enable_autocrafter then dofile(pipeworks.modpath.."/autocrafter.lua") end
 | 
			
		||||
if pipeworks.enable_autocrafter then
 | 
			
		||||
	dofile(pipeworks.modpath.."/autocrafter.lua")
 | 
			
		||||
end
 | 
			
		||||
if pipeworks.enable_lua_tube and minetest.get_modpath("mesecons") then
 | 
			
		||||
	dofile(pipeworks.modpath.."/lua_tube.lua")
 | 
			
		||||
end
 | 
			
		||||
if pipeworks.enable_sand_tube or pipeworks.enable_mese_sand_tube then
 | 
			
		||||
	dofile(pipeworks.modpath.."/vacuum_tubes.lua")
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
dofile(pipeworks.modpath.."/crafts.lua")
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								mod.conf
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								mod.conf
									
									
									
									
									
								
							@@ -2,4 +2,4 @@ name = pipeworks
 | 
			
		||||
description = This mod uses mesh nodes and nodeboxes to supply a complete set of 3D pipes and tubes, along with devices that work with them.
 | 
			
		||||
depends = basic_materials
 | 
			
		||||
optional_depends = mesecons, mesecons_mvps, digilines, signs_lib, unified_inventory, default, screwdriver, fl_mapgen, sound_api, i3, hades_core, hades_furnaces, hades_chests
 | 
			
		||||
min_minetest_version = 5.2.0
 | 
			
		||||
min_minetest_version = 5.4.0
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										173
									
								
								vacuum_tubes.lua
									
									
									
									
									
								
							
							
						
						
									
										173
									
								
								vacuum_tubes.lua
									
									
									
									
									
								
							@@ -1,4 +1,37 @@
 | 
			
		||||
 | 
			
		||||
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 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_in_area(min_pos, max_pos)) do
 | 
			
		||||
		local entity = obj:get_luaentity()
 | 
			
		||||
		if entity and entity.name == "__builtin:item" 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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
	pipeworks.register_tube("pipeworks:sand_tube", {
 | 
			
		||||
		description = S("Vacuuming Pneumatic Tube Segment"),
 | 
			
		||||
@@ -6,102 +39,64 @@ if pipeworks.enable_sand_tube then
 | 
			
		||||
		short = "pipeworks_sand_tube_short.png",
 | 
			
		||||
		noctr = {"pipeworks_sand_tube_noctr.png"},
 | 
			
		||||
		plain = {"pipeworks_sand_tube_plain.png"},
 | 
			
		||||
		ends  = {"pipeworks_sand_tube_end.png"},
 | 
			
		||||
		node_def = {groups = {vacuum_tube = 1}},
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	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"},
 | 
			
		||||
		ends = {"pipeworks_sand_tube_end.png"},
 | 
			
		||||
		node_def = {
 | 
			
		||||
			groups = {vacuum_tube = 1},
 | 
			
		||||
			on_construct = set_timer,
 | 
			
		||||
			on_timer = function(pos, elapsed)
 | 
			
		||||
				vacuum(pos, 2)
 | 
			
		||||
				set_timer(pos)
 | 
			
		||||
			end,
 | 
			
		||||
		},
 | 
			
		||||
	})
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
if pipeworks.enable_mese_sand_tube then
 | 
			
		||||
	pipeworks.register_tube("pipeworks:mese_sand_tube", {
 | 
			
		||||
			description = S("Adjustable Vacuuming Pneumatic Tube Segment"),
 | 
			
		||||
			inventory_image = "pipeworks_mese_sand_tube_inv.png",
 | 
			
		||||
			short = "pipeworks_mese_sand_tube_short.png",
 | 
			
		||||
			noctr = {"pipeworks_mese_sand_tube_noctr.png"},
 | 
			
		||||
			plain = {"pipeworks_mese_sand_tube_plain.png"},
 | 
			
		||||
			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 formspec = "formspec_version[2]size[8,3]"..
 | 
			
		||||
		pipeworks.fs_helpers.get_prepends("8,3")..
 | 
			
		||||
		"image[0.5,0.3;1,1;pipeworks_mese_sand_tube_inv.png]"..
 | 
			
		||||
		"label[1.75,0.8;"..S("Adjustable Vacuuming Tube").."]"..
 | 
			
		||||
		"field[0.5,1.7;5,0.8;dist;"..S("Radius")..";${dist}]"..
 | 
			
		||||
		"button_exit[5.5,1.7;2,0.8;save;"..S("Save").."]"
 | 
			
		||||
 | 
			
		||||
					local meta = minetest.get_meta(pos)
 | 
			
		||||
					local dist = tonumber(fields.dist)
 | 
			
		||||
					if dist then
 | 
			
		||||
						dist = math.max(0, dist)
 | 
			
		||||
						dist = math.min(8, dist)
 | 
			
		||||
						meta:set_int("dist", dist)
 | 
			
		||||
						meta:set_string("infotext", S("Adjustable Vacuuming Pneumatic Tube Segment (@1m)", dist))
 | 
			
		||||
					end
 | 
			
		||||
				end,
 | 
			
		||||
			},
 | 
			
		||||
	pipeworks.register_tube("pipeworks:mese_sand_tube", {
 | 
			
		||||
		description = S("Adjustable Vacuuming Tube"),
 | 
			
		||||
		inventory_image = "pipeworks_mese_sand_tube_inv.png",
 | 
			
		||||
		short = "pipeworks_mese_sand_tube_short.png",
 | 
			
		||||
		noctr = {"pipeworks_mese_sand_tube_noctr.png"},
 | 
			
		||||
		plain = {"pipeworks_mese_sand_tube_plain.png"},
 | 
			
		||||
		ends = {"pipeworks_mese_sand_tube_end.png"},
 | 
			
		||||
		node_def = {
 | 
			
		||||
			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
 | 
			
		||||
 | 
			
		||||
local function vacuum(pos, radius)
 | 
			
		||||
	radius = radius + 0.5
 | 
			
		||||
	for _, object in pairs(minetest.get_objects_inside_radius(pos, math.sqrt(3) * radius)) do
 | 
			
		||||
		local lua_entity = object:get_luaentity()
 | 
			
		||||
		if not object:is_player() and lua_entity and lua_entity.name == "__builtin:item" then
 | 
			
		||||
			local obj_pos = object:get_pos()
 | 
			
		||||
			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
 | 
			
		||||
minetest.register_lbm({
 | 
			
		||||
	label = "Vacuum tube node timer starter",
 | 
			
		||||
	name = "pipeworks:vacuum_tube_start",
 | 
			
		||||
	nodenames = {"group:vacuum_tube"},
 | 
			
		||||
	run_at_every_load = false,
 | 
			
		||||
	action = set_timer,
 | 
			
		||||
})
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user