summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--devices.lua12
-rw-r--r--flowing_logic.lua115
-rw-r--r--init.lua16
3 files changed, 126 insertions, 17 deletions
diff --git a/devices.lua b/devices.lua
index 81a5ca6..d158cbc 100644
--- a/devices.lua
+++ b/devices.lua
@@ -107,15 +107,15 @@ 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_punch = function(pos, node, puncher)
local fdir = minetest.get_node(pos).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
})
end
@@ -148,15 +148,15 @@ 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_punch = function(pos, node, puncher)
local fdir = minetest.get_node(pos).param2
- minetest.add_node(pos, { name = "pipeworks:valve_off_empty", param2 = fdir })
+ minetest.swap_node(pos, { name = "pipeworks:valve_off_empty", param2 = fdir })
end
})
diff --git a/flowing_logic.lua b/flowing_logic.lua
index 3a7eb83..3396a89 100644
--- a/flowing_logic.lua
+++ b/flowing_logic.lua
@@ -178,13 +178,108 @@ minetest.register_abm({
end
})
---[[
-other nodes that need processed separately:
-table.insert(pipeworks.pipe_nodenames,"pipeworks:valve_on_empty")
-table.insert(pipeworks.pipe_nodenames,"pipeworks:valve_off_empty")
-table.insert(pipeworks.pipe_nodenames,"pipeworks:entry_panel_empty")
-table.insert(pipeworks.pipe_nodenames,"pipeworks:flow_sensor_empty")
-table.insert(pipeworks.pipe_nodenames,"pipeworks:valve_on_loaded")
-table.insert(pipeworks.pipe_nodenames,"pipeworks:entry_panel_loaded")
-table.insert(pipeworks.pipe_nodenames,"pipeworks:flow_sensor_loaded")
-]]--
+pipeworks.device_nodenames = {}
+
+table.insert(pipeworks.device_nodenames,"pipeworks:valve_on_empty")
+table.insert(pipeworks.device_nodenames,"pipeworks:valve_off_empty")
+table.insert(pipeworks.device_nodenames,"pipeworks:valve_on_loaded")
+table.insert(pipeworks.device_nodenames,"pipeworks:flow_sensor_empty")
+table.insert(pipeworks.device_nodenames,"pipeworks:flow_sensor_loaded")
+
+print(dump(pipeworks.device_nodenames))
+
+minetest.register_abm({
+ nodenames = pipeworks.device_nodenames,
+ interval = 2,
+ chance = 1,
+ action = function(pos, node, active_object_count, active_object_count_wider)
+ local fdir = node.param2
+ local fdir_mod4 = fdir % 4
+ local fdir_mod4_p2 = (fdir+2) % 4
+
+ local fdir_to_pos = {
+ {x = pos.x+1, y = pos.y, z = pos.z },
+ {x = pos.x, y = pos.y, z = pos.z-1},
+ {x = pos.x-1, y = pos.y, z = pos.z },
+ {x = pos.x, y = pos.y, z = pos.z+1},
+ }
+
+ local pos_adjacent1 = fdir_to_pos[fdir_mod4 + 1]
+ local pos_adjacent2 = fdir_to_pos[fdir_mod4_p2 + 1]
+
+ local adjacent_node1 = minetest.get_node(pos_adjacent1)
+ local adjacent_node2 = minetest.get_node(pos_adjacent2)
+
+ if not adjacent_node1 or not adjacent_node2 then return end
+ print("---------------")
+ print(dump(pos_adjacent1))
+ print(dump(adjacent_node1.name))
+ print(dump(pos_adjacent2))
+ print(dump(adjacent_node2.name))
+
+ local my_level = (minetest.get_meta(pos):get_float("liquid_level")) or 0
+ local adjacent_node_level1 = (minetest.get_meta(pos_adjacent1):get_float("liquid_level")) or 0
+ local adjacent_node_level2 = (minetest.get_meta(pos_adjacent2):get_float("liquid_level")) or 0
+
+ if not string.match(node.name, "pipeworks:valve_off") then
+
+ local num_connections = 1
+ local set1
+ local set2
+ local total_level = my_level
+
+ if string.find(dump(pipeworks.pipe_nodenames), adjacent_node1.name) or
+ (string.find(dump(pipeworks.device_nodenames), adjacent_node1.name) and
+ (adjacent_node1.param2 == fdir_mod4 or adjacent_node1.param2 == fdir_mod4_p2)) then
+ num_connections = num_connections + 1
+ total_level = total_level + adjacent_node_level1
+ set1 = true
+ end
+
+ if string.find(dump(pipeworks.pipe_nodenames), adjacent_node2.name) or
+ (string.find(dump(pipeworks.device_nodenames), adjacent_node2.name) and
+ (adjacent_node2.param2 == fdir_mod4 or adjacent_node2.param2 == fdir_mod4_p2)) then
+ num_connections = num_connections + 1
+ total_level = total_level + adjacent_node_level2
+ set2 = true
+ end
+
+ local average_level = total_level / num_connections
+
+ minetest.get_meta(pos):set_float("liquid_level", average_level)
+
+ if set1 then
+ minetest.get_meta(pos_adjacent1):set_float("liquid_level", average_level)
+ end
+
+ if set2 then
+ minetest.get_meta(pos_adjacent2):set_float("liquid_level", average_level)
+ end
+
+ if node.name == "pipeworks:flow_sensor_empty" or
+ node.name == "pipeworks:flow_sensor_loaded" then
+ print("I'm a flow sensor!")
+
+ local sensor = string.match(node.name, "pipeworks:flow_sensor_")
+ local newnode = nil
+ if my_level > 1 then
+ newnode = sensor.."loaded"
+ else
+ newnode = sensor.."empty"
+ end
+ if newnode then
+ minetest.swap_node(pos, {name = newnode, param2 = node.param2})
+ end
+ end
+ else
+ print("I'm a valve and I'm off!")
+ end
+
+ print("my_level="..dump(my_level))
+ print("adjacent_node_level1="..dump(adjacent_node_level1))
+ print("adjacent_node_level2="..dump(adjacent_node_level2))
+
+ end
+})
+
+-- table.insert(pipeworks.device_nodenames,"pipeworks:entry_panel")
diff --git a/init.lua b/init.lua
index 7c7befa..82bf8f7 100644
--- a/init.lua
+++ b/init.lua
@@ -84,6 +84,18 @@ function pipeworks.replace_name(tbl,tr,name)
return ntbl
end
+function pipeworks.table_copy(t)
+ local nt = { };
+ for k, v in pairs(t) do
+ if type(v) == "table" then
+ nt[k] = pipeworks.table_copy(v)
+ else
+ nt[k] = v
+ end
+ end
+ return nt
+end
+
-------------------------------------------
-- Load the various other parts of the mod
@@ -93,7 +105,10 @@ dofile(pipeworks.modpath.."/autoplace_pipes.lua")
dofile(pipeworks.modpath.."/autoplace_tubes.lua")
dofile(pipeworks.modpath.."/luaentity.lua")
dofile(pipeworks.modpath.."/item_transport.lua")
+
+if pipeworks.enable_pipes then dofile(pipeworks.modpath.."/pipes.lua") end
dofile(pipeworks.modpath.."/flowing_logic.lua")
+
dofile(pipeworks.modpath.."/crafts.lua")
dofile(pipeworks.modpath.."/tube_registration.lua")
dofile(pipeworks.modpath.."/routing_tubes.lua")
@@ -105,7 +120,6 @@ dofile(pipeworks.modpath.."/filter-injector.lua")
dofile(pipeworks.modpath.."/trashcan.lua")
dofile(pipeworks.modpath.."/wielder.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_redefines then dofile(pipeworks.modpath.."/compat.lua") end