summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--autoplace_pipes.lua137
-rw-r--r--devices.lua15
2 files changed, 87 insertions, 65 deletions
diff --git a/autoplace_pipes.lua b/autoplace_pipes.lua
index efd3bcd..a3f0b65 100644
--- a/autoplace_pipes.lua
+++ b/autoplace_pipes.lua
@@ -1,3 +1,29 @@
+--[[
+
+ autorouting for pipes
+
+ To connect pipes to some node, include this in the node def...
+
+ pipe_connections = {
+ pattern = <string>, -- if supplied, search for this pattern instead of the exact node name
+ left = <bool>, -- true (or 1) if the left side of the node needs to connect to a pipe
+ right = <bool>, -- or from the right side, etc.
+ top = <bool>,
+ bottom = <bool>,
+ front = <bool>,
+ back = <bool>,
+ left_param2 = <num>, -- the node must have this param2 to connect from the left
+ right_param2 = <num>, -- or right, etc.
+ top_param2 = <num>, -- Omit some or all of these to skip checking param2 for those sides
+ bottom_param2 = <num>,
+ front_param2 = <num>,
+ back_param2 = <num>,
+ },
+
+ ...then add, pipeworks.scan_for_pipe_objects(pos)
+ to your node's after_dig_node and after_place_node callbacks.
+
+]]--
-- get the axis dir (just 6 faces) of target node, assumes the pipe is the axis
@@ -37,9 +63,9 @@ function pipeworks.get_axis_dir(nodetable, pattern)
return match,pxm,pxp,pym,pyp,pzm,pzp
end
--- autorouting for pipes
local tube_table = {[0] = 1, 2, 2, 4, 2, 4, 4, 5, 2, 3, 4, 6, 4, 6, 5, 7, 2, 4, 3, 6, 4, 5, 6, 7, 4, 6, 6, 8, 5, 7, 7, 9, 2, 4, 4, 5, 3, 6, 6, 7, 4, 6, 5, 7, 6, 8, 7, 9, 4, 5, 6, 7, 6, 7, 8, 9, 5, 7, 7, 9, 7, 9, 9, 10}
local tube_table_facedirs = {[0] = 0, 0, 5, 0, 3, 4, 3, 0, 2, 0, 2, 0, 6, 4, 3, 0, 7, 12, 5, 12, 7, 4, 5, 5, 18, 20, 16, 0, 7, 4, 7, 0, 1, 8, 1, 1, 1, 13, 1, 1, 10, 8, 2, 2, 17, 4, 3, 6, 9, 9, 9, 9, 21, 13, 1, 1, 10, 10, 11, 2, 19, 4, 3, 0}
+
local function autoroute_pipes(pos)
local nctr = minetest.get_node(pos)
local state = "_empty"
@@ -62,7 +88,7 @@ function pipeworks.scan_for_pipe_objects(pos)
autoroute_pipes(pos)
end
--- auto-rotation code for various devices the tubes attach to
+-- auto-rotation code for various devices the pipes attach to
function pipeworks.scan_pipe_surroundings(pos)
local pxm=0
@@ -88,12 +114,14 @@ function pipeworks.scan_pipe_surroundings(pos)
nzp = nzp
}
- if (string.find(nxm.name, "pipeworks:pipe_") ~= nil) then pxm=1 end
- if (string.find(nxp.name, "pipeworks:pipe_") ~= nil) then pxp=1 end
- if (string.find(nym.name, "pipeworks:pipe_") ~= nil) then pym=1 end
- if (string.find(nyp.name, "pipeworks:pipe_") ~= nil) then pyp=1 end
- if (string.find(nzm.name, "pipeworks:pipe_") ~= nil) then pzm=1 end
- if (string.find(nzp.name, "pipeworks:pipe_") ~= nil) then pzp=1 end
+-- standard handling for pipes...
+
+ if string.find(nxm.name, "pipeworks:pipe_") then pxm=1 end
+ if string.find(nxp.name, "pipeworks:pipe_") then pxp=1 end
+ if string.find(nym.name, "pipeworks:pipe_") then pym=1 end
+ if string.find(nyp.name, "pipeworks:pipe_") then pyp=1 end
+ if string.find(nzm.name, "pipeworks:pipe_") then pzm=1 end
+ if string.find(nzp.name, "pipeworks:pipe_") then pzp=1 end
-- Special handling for valves...
@@ -119,28 +147,6 @@ function pipeworks.scan_pipe_surroundings(pos)
pzp = f or pzp
end
--- ...spigots...
-
- if (string.find(nxm.name, "pipeworks:spigot") ~= nil)
- and nxm.param2 == 1 then
- pxm=1
- end
-
- if (string.find(nxp.name, "pipeworks:spigot") ~= nil)
- and nxp.param2 == 3 then
- pxp=1
- end
-
- if (string.find(nzm.name, "pipeworks:spigot") ~= nil)
- and nzm.param2 == 0 then
- pzm=1
- end
-
- if (string.find(nzp.name, "pipeworks:spigot") ~= nil)
- and nzp.param2 == 2 then
- pzp=1
- end
-
-- ...sealed pipe entry/exit...
local match,a,b,c,d,e,f = pipeworks.get_axis_dir(nodetable, "pipeworks:entry_panel")
@@ -153,46 +159,48 @@ function pipeworks.scan_pipe_surroundings(pos)
pzp = f or pzp
end
--- ...pumps, grates...
+-- ... other nodes
- if (string.find(nym.name, "pipeworks:grating") ~= nil) or
- (string.find(nym.name, "pipeworks:pump") ~= nil) then
- pym=1
- end
+ local def_left = minetest.registered_nodes[nxp.name] -- the node that {pos} is to the left of (not the
+ local def_right = minetest.registered_nodes[nxm.name] -- ...note that is AT the left!), etc.
+ local def_bottom = minetest.registered_nodes[nyp.name]
+ local def_top = minetest.registered_nodes[nym.name]
+ local def_front = minetest.registered_nodes[nzp.name]
+ local def_back = minetest.registered_nodes[nzm.name]
--- ...fountainheads...
-
- if (string.find(nyp.name, "pipeworks:fountainhead") ~= nil) then
- pyp=1
+ if def_left and def_left.pipe_connections and def_left.pipe_connections.left
+ and (not def_left.pipe_connections.pattern or string.find(nxp.name, def_left.pipe_connections.pattern))
+ and (not def_left.pipe_connections.left_param2 or (nxp.param2 == def_left.pipe_connections.left_param2)) then
+ pxp = 1
end
-
--- ... and storage tanks.
-
- if (string.find(nym.name, "pipeworks:storage_tank_") ~= nil) then
- pym=1
+ if def_right and def_right.pipe_connections and def_right.pipe_connections.right
+ and (not def_right.pipe_connections.pattern or string.find(nxm.name, def_right.pipe_connections.pattern))
+ and (not def_right.pipe_connections.right_param2 or (nxm.param2 == def_right.pipe_connections.right_param2)) then
+ pxm = 1
end
-
- if (string.find(nyp.name, "pipeworks:storage_tank_") ~= nil) then
- pyp=1
+ if def_top and def_top.pipe_connections and def_top.pipe_connections.top
+ and (not def_top.pipe_connections.pattern or string.find(nym.name, def_top.pipe_connections.pattern))
+ and (not def_top.pipe_connections.top_param2 or (nym.param2 == def_top.pipe_connections.top_param2)) then
+ pym = 1
+ end
+ if def_bottom and def_bottom.pipe_connections and def_bottom.pipe_connections.bottom
+ and (not def_bottom.pipe_connections.pattern or string.find(nyp.name, def_bottom.pipe_connections.pattern))
+ and (not def_bottom.pipe_connections.bottom_param2 or (nyp.param2 == def_bottom.pipe_connections.bottom_param2)) then
+ pyp = 1
+ end
+ if def_front and def_front.pipe_connections and def_front.pipe_connections.front
+ and (not def_front.pipe_connections.pattern or string.find(nzp.name, def_front.pipe_connections.pattern))
+ and (not def_front.pipe_connections.front_param2 or (nzp.param2 == def_front.pipe_connections.front_param2)) then
+ pzp = 1
+ end
+ if def_back and def_back.pipe_connections and def_back.pipe_connections.back
+ and (not def_back.pipe_connections.pattern or string.find(nzm.name, def_back.pipe_connections.pattern))
+ and (not def_back.pipe_connections.back_param2 or (nzm.param2 == def_back.pipe_connections.back_param2)) then
+ pzm = 1
end
--- ...extra devices specified via the function's parameters
--- ...except that this part is not implemented yet
---
--- xxx = nxm, nxp, nym, nyp, nzm, or nzp depending on the direction to check
--- yyy = pxm, pxp, pym, pyp, pzm, or pzp accordingly.
---
--- if string.find(xxx.name, "modname:nodename") ~= nil then
--- yyy = 1
--- end
---
--- for example:
---
--- if string.find(nym.name, "aero:outlet") ~= nil then
--- pym = 1
--- end
---
-
+ print("stage 2 returns "..pxm+8*pxp+2*pym+16*pyp+4*pzm+32*pzp..
+ " for nodes surrounding "..minetest.get_node(pos).name.." at "..minetest.pos_to_string(pos))
return pxm+8*pxp+2*pym+16*pyp+4*pzm+32*pzp
end
@@ -204,4 +212,3 @@ function pipeworks.look_for_stackable_tanks(pos)
minetest.add_node(pos, { name = "pipeworks:expansion_tank_0", param2 = tym.param2})
end
end
-
diff --git a/devices.lua b/devices.lua
index 4b7f574..0121e2f 100644
--- a/devices.lua
+++ b/devices.lua
@@ -139,6 +139,7 @@ for s in ipairs(states) do
groups = dgroups,
sounds = default.node_sound_wood_defaults(),
walkable = true,
+ pipe_connections = { top = 1 },
after_place_node = function(pos)
pipeworks.scan_for_pipe_objects(pos)
end,
@@ -252,11 +253,17 @@ minetest.register_node("pipeworks:grating", {
"pipeworks_grating_sides.png",
"pipeworks_grating_sides.png"
},
+ drawtype = "nodebox",
+ node_box = {
+ type = "fixed",
+ fixed = { -0.49, -0.49, -0.49, 0.49, 0.5, 0.49 }
+ },
sunlight_propagates = true,
paramtype = "light",
groups = {snappy=3, pipe=1},
sounds = default.node_sound_wood_defaults(),
walkable = true,
+ pipe_connections = { top = 1 },
after_place_node = function(pos)
pipeworks.scan_for_pipe_objects(pos)
end,
@@ -279,6 +286,8 @@ minetest.register_node("pipeworks:spigot", {
groups = {snappy=3, pipe=1},
sounds = default.node_sound_wood_defaults(),
walkable = true,
+ pipe_connections = { left=1, right=1, front=1, back=1,
+ left_param2 = 3, right_param2 = 1, front_param2 = 2, back_param2 = 0 },
after_place_node = function(pos)
pipeworks.scan_for_pipe_objects(pos)
end,
@@ -318,6 +327,8 @@ minetest.register_node("pipeworks:spigot_pouring", {
groups = {snappy=3, pipe=1, not_in_creative_inventory=1},
sounds = default.node_sound_wood_defaults(),
walkable = true,
+ pipe_connections = { left=1, right=1, front=1, back=1,
+ left_param2 = 3, right_param2 = 1, front_param2 = 2, back_param2 = 0 },
after_place_node = function(pos)
minetest.set_node(pos, { name = "pipeworks:spigot", param2 = minetest.get_node(pos).param2 })
pipeworks.scan_for_pipe_objects(pos)
@@ -494,6 +505,7 @@ for fill = 0, 10 do
sounds = default.node_sound_wood_defaults(),
walkable = true,
drop = "pipeworks:storage_tank_0",
+ pipe_connections = { top = 1, bottom = 1},
after_place_node = function(pos)
pipeworks.look_for_stackable_tanks(pos)
pipeworks.scan_for_pipe_objects(pos)
@@ -521,6 +533,7 @@ for fill = 0, 10 do
sounds = default.node_sound_wood_defaults(),
walkable = true,
drop = "pipeworks:storage_tank_0",
+ pipe_connections = { top = 1, bottom = 1},
after_place_node = function(pos)
pipeworks.look_for_stackable_tanks(pos)
pipeworks.scan_for_pipe_objects(pos)
@@ -544,6 +557,7 @@ minetest.register_node("pipeworks:fountainhead", {
groups = {snappy=3, pipe=1},
sounds = default.node_sound_wood_defaults(),
walkable = true,
+ pipe_connections = { bottom = 1 },
after_place_node = function(pos)
pipeworks.scan_for_pipe_objects(pos)
end,
@@ -576,6 +590,7 @@ minetest.register_node("pipeworks:fountainhead_pouring", {
groups = {snappy=3, pipe=1, not_in_creative_inventory=1},
sounds = default.node_sound_wood_defaults(),
walkable = true,
+ pipe_connections = { bottom = 1 },
after_place_node = function(pos)
minetest.set_node(pos, { name = "pipeworks:fountainhead", param2 = minetest.get_node(pos).param2 })
pipeworks.scan_for_pipe_objects(pos)