diff options
Diffstat (limited to 'pipeworks/devices.lua')
| -rw-r--r-- | pipeworks/devices.lua | 135 | 
1 files changed, 102 insertions, 33 deletions
| diff --git a/pipeworks/devices.lua b/pipeworks/devices.lua index 0121e2f..3b215f4 100644 --- a/pipeworks/devices.lua +++ b/pipeworks/devices.lua @@ -1,3 +1,7 @@ +local new_flow_logic_register = pipeworks.flowables.register + +local polys = "" +if pipeworks.enable_lowpoly then polys = "_lowpoly" end  -- rotation handlers @@ -68,7 +72,7 @@ function pipeworks.rotate_on_place(itemstack, placer, pointed_thing)  			local placednode = string.gsub(itemstack:get_name(), "_loaded", "_empty")  			placednode = string.gsub(placednode, "_on", "_off") -			minetest.add_node(pos1, {name = placednode, param2 = fdir }) +			minetest.swap_node(pos1, {name = placednode, param2 = fdir })  			pipeworks.scan_for_pipe_objects(pos1)  			if not pipeworks.expect_infinite_stacks then @@ -129,10 +133,11 @@ for s in ipairs(states) do  		dgroups = {snappy=3, pipe=1, not_in_creative_inventory=1}  	end -	minetest.register_node("pipeworks:pump_"..states[s], { +	local pumpname = "pipeworks:pump_"..states[s] +	minetest.register_node(pumpname, {  		description = "Pump/Intake Module",  		drawtype = "mesh", -		mesh = "pipeworks_pump.obj", +		mesh = "pipeworks_pump"..polys..".obj",  		tiles = { "pipeworks_pump_"..states[s]..".png" },  		paramtype = "light",  		paramtype2 = "facedir", @@ -149,23 +154,33 @@ for s in ipairs(states) do  		drop = "pipeworks:pump_off",  		mesecons = {effector = {  			action_on = function (pos, node) -				minetest.add_node(pos,{name="pipeworks:pump_on", param2 = node.param2})  +				minetest.swap_node(pos,{name="pipeworks:pump_on", param2 = node.param2})  			end,  			action_off = function (pos, node) -				minetest.add_node(pos,{name="pipeworks:pump_off", param2 = node.param2})  +				minetest.swap_node(pos,{name="pipeworks:pump_off", param2 = node.param2})  			end  		}},  		on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)  			local fdir = node.param2 -			minetest.add_node(pos, { name = "pipeworks:pump_"..states[3-s], param2 = fdir }) +			minetest.swap_node(pos, { name = "pipeworks:pump_"..states[3-s], param2 = fdir })  		end,  		on_rotate = screwdriver.rotate_simple  	}) -	 -	minetest.register_node("pipeworks:valve_"..states[s].."_empty", { + +	-- FIXME: this currently assumes that pumps can only rotate around the fixed axis pointing Y+. +	new_flow_logic_register.directional_vertical_fixed(pumpname, true) +	local pump_drive = 4 +	if states[s] ~= "off" then +		new_flow_logic_register.intake_simple(pumpname, pump_drive) +	end + + + +	local nodename_valve_empty = "pipeworks:valve_"..states[s].."_empty" +	minetest.register_node(nodename_valve_empty, {  		description = "Valve",  		drawtype = "mesh", -		mesh = "pipeworks_valve_"..states[s]..".obj", +		mesh = "pipeworks_valve_"..states[s]..polys..".obj",  		tiles = { "pipeworks_valve.png" },  		sunlight_propagates = true,  		paramtype = "light", @@ -188,24 +203,30 @@ for s in ipairs(states) do  		drop = "pipeworks:valve_off_empty",  		mesecons = {effector = {  			action_on = function (pos, node) -				minetest.add_node(pos,{name="pipeworks:valve_on_empty", param2 = node.param2})  +				minetest.swap_node(pos,{name="pipeworks:valve_on_empty", param2 = node.param2})  			end,  			action_off = function (pos, node) -				minetest.add_node(pos,{name="pipeworks:valve_off_empty", param2 = node.param2})  +				minetest.swap_node(pos,{name="pipeworks:valve_off_empty", param2 = node.param2})  			end  		}},  		on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)  			local fdir = node.param2 -			minetest.add_node(pos, { name = "pipeworks:valve_"..states[3-s].."_empty", param2 = fdir }) +			minetest.swap_node(pos, { name = "pipeworks:valve_"..states[3-s].."_empty", param2 = fdir })  		end,  		on_rotate = pipeworks.fix_after_rotation  	}) +	-- only register flow logic for the "on" ABM. +	-- this means that the off state automatically blocks flow by not participating in the balancing operation. +	if states[s] ~= "off" then +		new_flow_logic_register.directional_horizonal_rotate(nodename_valve_empty, true) +	end  end -minetest.register_node("pipeworks:valve_on_loaded", { +local nodename_valve_loaded = "pipeworks:valve_on_loaded" +minetest.register_node(nodename_valve_loaded, {  	description = "Valve",  	drawtype = "mesh", -	mesh = "pipeworks_valve_on.obj", +	mesh = "pipeworks_valve_on"..polys..".obj",  	tiles = { "pipeworks_valve.png" },  	sunlight_propagates = true,  	paramtype = "light", @@ -228,21 +249,28 @@ minetest.register_node("pipeworks:valve_on_loaded", {  	drop = "pipeworks:valve_off_empty",  	mesecons = {effector = {  		action_on = function (pos, node) -			minetest.add_node(pos,{name="pipeworks:valve_on_empty", param2 = node.param2})  +			minetest.swap_node(pos,{name="pipeworks:valve_on_empty", param2 = node.param2})  		end,  		action_off = function (pos, node) -			minetest.add_node(pos,{name="pipeworks:valve_off_empty", param2 = node.param2})  +			minetest.swap_node(pos,{name="pipeworks:valve_off_empty", param2 = node.param2})  		end  	}},  	on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)  		local fdir = node.param2 -		minetest.add_node(pos, { name = "pipeworks:valve_off_empty", param2 = fdir }) +		minetest.swap_node(pos, { name = "pipeworks:valve_off_empty", param2 = fdir })  	end,  	on_rotate = pipeworks.fix_after_rotation  }) +-- register this the same as the on-but-empty variant, so existing nodes of this type work also. +-- note that as new_flow_logic code does not distinguish empty/full in node states, +-- right-clicking a "loaded" valve (becoming an off valve) then turning it on again will yield a on-but-empty valve, +-- but the flow logic will still function. +-- thus under new_flow_logic this serves as a kind of migration. +new_flow_logic_register.directional_horizonal_rotate(nodename_valve_loaded, true)  -- grating +-- FIXME: should this do anything useful in the new flow logic?  minetest.register_node("pipeworks:grating", {  	description = "Decorative grating",  	tiles = { @@ -275,10 +303,11 @@ minetest.register_node("pipeworks:grating", {  -- outlet spigot -minetest.register_node("pipeworks:spigot", { +local nodename_spigot_empty = "pipeworks:spigot" +minetest.register_node(nodename_spigot_empty, {  	description = "Spigot outlet",  	drawtype = "mesh", -	mesh = "pipeworks_spigot.obj", +	mesh = "pipeworks_spigot"..polys..".obj",  	tiles = { "pipeworks_spigot.png" },  	sunlight_propagates = true,  	paramtype = "light", @@ -305,10 +334,11 @@ minetest.register_node("pipeworks:spigot", {  	on_rotate = pipeworks.fix_after_rotation  }) -minetest.register_node("pipeworks:spigot_pouring", { +local nodename_spigot_loaded = "pipeworks:spigot_pouring" +minetest.register_node(nodename_spigot_loaded, {  	description = "Spigot outlet",  	drawtype = "mesh", -	mesh = "pipeworks_spigot_pouring.obj", +	mesh = "pipeworks_spigot_pouring"..polys..".obj",  	tiles = {  		{  			name = "default_water_flowing_animated.png", @@ -347,6 +377,17 @@ minetest.register_node("pipeworks:spigot_pouring", {  	drop = "pipeworks:spigot",  	on_rotate = pipeworks.fix_after_rotation  }) +-- new flow logic does not currently distinguish between these two visual states. +-- register both so existing flowing spigots continue to work (even if the visual doesn't match the spigot's behaviour). +new_flow_logic_register.directional_horizonal_rotate(nodename_spigot_empty, false) +new_flow_logic_register.directional_horizonal_rotate(nodename_spigot_loaded, false) +local spigot_upper = 1.0 +local spigot_lower = 1.0 +local spigot_neighbours={{x=0, y=-1, z=0}} +new_flow_logic_register.output_simple(nodename_spigot_empty, spigot_upper, spigot_lower, spigot_neighbours) +new_flow_logic_register.output_simple(nodename_spigot_loaded, spigot_upper, spigot_lower, spigot_neighbours) + +  -- sealed pipe entry/exit (horizontal pipe passing through a metal  -- wall, for use in places where walls should look like they're airtight) @@ -359,10 +400,11 @@ local panel_cbox = {  	}  } -minetest.register_node("pipeworks:entry_panel_empty", { +local nodename_panel_empty = "pipeworks:entry_panel_empty" +minetest.register_node(nodename_panel_empty, {  	description = "Airtight Pipe entry/exit",  	drawtype = "mesh", -	mesh = "pipeworks_entry_panel.obj", +	mesh = "pipeworks_entry_panel"..polys..".obj",  	tiles = { "pipeworks_entry_panel.png" },  	paramtype = "light",  	paramtype2 = "facedir", @@ -378,10 +420,11 @@ minetest.register_node("pipeworks:entry_panel_empty", {  	on_rotate = pipeworks.fix_after_rotation  }) -minetest.register_node("pipeworks:entry_panel_loaded", { +local nodename_panel_loaded = "pipeworks:entry_panel_loaded" +minetest.register_node(nodename_panel_loaded, {  	description = "Airtight Pipe entry/exit",  	drawtype = "mesh", -	mesh = "pipeworks_entry_panel.obj", +	mesh = "pipeworks_entry_panel"..polys..".obj",  	tiles = { "pipeworks_entry_panel.png" },  	paramtype = "light",  	paramtype2 = "facedir", @@ -397,11 +440,17 @@ minetest.register_node("pipeworks:entry_panel_loaded", {  	drop = "pipeworks:entry_panel_empty",  	on_rotate = pipeworks.fix_after_rotation  }) +-- TODO: AFAIK the two panels have no visual difference, so are redundant under new flow logic - alias? +new_flow_logic_register.directional_horizonal_rotate(nodename_panel_empty, true) +new_flow_logic_register.directional_horizonal_rotate(nodename_panel_loaded, true) + -minetest.register_node("pipeworks:flow_sensor_empty", { + +local nodename_sensor_empty = "pipeworks:flow_sensor_empty" +minetest.register_node(nodename_sensor_empty, {  	description = "Flow Sensor",  	drawtype = "mesh", -	mesh = "pipeworks_flow_sensor.obj", +	mesh = "pipeworks_flow_sensor"..polys..".obj",  	tiles = { "pipeworks_flow_sensor_off.png" },  	sunlight_propagates = true,  	paramtype = "light", @@ -436,10 +485,11 @@ minetest.register_node("pipeworks:flow_sensor_empty", {  	on_rotate = pipeworks.fix_after_rotation  }) -minetest.register_node("pipeworks:flow_sensor_loaded", { +local nodename_sensor_loaded = "pipeworks:flow_sensor_loaded" +minetest.register_node(nodename_sensor_loaded, {  	description = "Flow sensor (on)",  	drawtype = "mesh", -	mesh = "pipeworks_flow_sensor.obj", +	mesh = "pipeworks_flow_sensor"..polys..".obj",  	tiles = { "pipeworks_flow_sensor_on.png" },  	sunlight_propagates = true,  	paramtype = "light", @@ -474,9 +524,17 @@ minetest.register_node("pipeworks:flow_sensor_loaded", {  	mesecons = pipereceptor_on,  	on_rotate = pipeworks.fix_after_rotation  }) +new_flow_logic_register.directional_horizonal_rotate(nodename_sensor_empty, true) +new_flow_logic_register.directional_horizonal_rotate(nodename_sensor_loaded, true) +-- activate flow sensor at roughly half the pressure pumps drive pipes +local sensor_pressure_set = { { nodename_sensor_empty, 0.0 }, { nodename_sensor_loaded, 1.0 } } +new_flow_logic_register.transition_simple_set(sensor_pressure_set, { mesecons=pipeworks.mesecons_rules }) + +  -- tanks +-- TODO flow-logic-stub: these don't currently do anything under the new flow logic.  for fill = 0, 10 do  	local filldesc="empty"  	local sgroups = {snappy=3, pipe=1, tankfill=fill+1} @@ -547,10 +605,11 @@ end  -- fountainhead -minetest.register_node("pipeworks:fountainhead", { +local nodename_fountain_empty = "pipeworks:fountainhead" +minetest.register_node(nodename_fountain_empty, {  	description = "Fountainhead",  	drawtype = "mesh", -	mesh = "pipeworks_fountainhead.obj", +	mesh = "pipeworks_fountainhead"..polys..".obj",  	tiles = { "pipeworks_fountainhead.png" },  	sunlight_propagates = true,  	paramtype = "light", @@ -580,10 +639,11 @@ minetest.register_node("pipeworks:fountainhead", {  	on_rotate = false  }) -minetest.register_node("pipeworks:fountainhead_pouring", { +local nodename_fountain_loaded = "pipeworks:fountainhead_pouring" +minetest.register_node(nodename_fountain_loaded, {  	description = "Fountainhead",  	drawtype = "mesh", -	mesh = "pipeworks_fountainhead.obj", +	mesh = "pipeworks_fountainhead"..polys..".obj",  	tiles = { "pipeworks_fountainhead.png" },  	sunlight_propagates = true,  	paramtype = "light", @@ -614,6 +674,15 @@ minetest.register_node("pipeworks:fountainhead_pouring", {  	drop = "pipeworks:fountainhead",  	on_rotate = false  }) +new_flow_logic_register.directional_vertical_fixed(nodename_fountain_empty, false) +new_flow_logic_register.directional_vertical_fixed(nodename_fountain_loaded, false) +local fountain_upper = 1.0 +local fountain_lower = 1.0 +local fountain_neighbours={{x=0, y=1, z=0}} +new_flow_logic_register.output_simple(nodename_fountain_empty, fountain_upper, fountain_lower, fountain_neighbours) +new_flow_logic_register.output_simple(nodename_fountain_loaded, fountain_upper, fountain_lower, fountain_neighbours) + +  minetest.register_alias("pipeworks:valve_off_loaded", "pipeworks:valve_off_empty")  minetest.register_alias("pipeworks:entry_panel", "pipeworks:entry_panel_empty") | 
