allow external devices to connect to pipes

and use that feature to handle most of the existing devices)
also, fix the "xray" glitch in the grating
This commit is contained in:
Vanessa Ezekowitz 2017-04-12 03:39:43 -04:00
parent acc2b6802e
commit f44993cd84
2 changed files with 90 additions and 68 deletions

@ -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 -- 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 return match,pxm,pxp,pym,pyp,pzm,pzp
end 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 = {[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 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 function autoroute_pipes(pos)
local nctr = minetest.get_node(pos) local nctr = minetest.get_node(pos)
local state = "_empty" local state = "_empty"
@ -62,7 +88,7 @@ function pipeworks.scan_for_pipe_objects(pos)
autoroute_pipes(pos) autoroute_pipes(pos)
end 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) function pipeworks.scan_pipe_surroundings(pos)
local pxm=0 local pxm=0
@ -88,12 +114,14 @@ function pipeworks.scan_pipe_surroundings(pos)
nzp = nzp nzp = nzp
} }
if (string.find(nxm.name, "pipeworks:pipe_") ~= nil) then pxm=1 end -- standard handling for pipes...
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(nxm.name, "pipeworks:pipe_") then pxm=1 end
if (string.find(nyp.name, "pipeworks:pipe_") ~= nil) then pyp=1 end if string.find(nxp.name, "pipeworks:pipe_") then pxp=1 end
if (string.find(nzm.name, "pipeworks:pipe_") ~= nil) then pzm=1 end if string.find(nym.name, "pipeworks:pipe_") then pym=1 end
if (string.find(nzp.name, "pipeworks:pipe_") ~= nil) then pzp=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... -- Special handling for valves...
@ -119,28 +147,6 @@ function pipeworks.scan_pipe_surroundings(pos)
pzp = f or pzp pzp = f or pzp
end 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... -- ...sealed pipe entry/exit...
local match,a,b,c,d,e,f = pipeworks.get_axis_dir(nodetable, "pipeworks:entry_panel") 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 pzp = f or pzp
end end
-- ...pumps, grates... -- ... other nodes
if (string.find(nym.name, "pipeworks:grating") ~= nil) or local def_left = minetest.registered_nodes[nxp.name] -- the node that {pos} is to the left of (not the
(string.find(nym.name, "pipeworks:pump") ~= nil) then local def_right = minetest.registered_nodes[nxm.name] -- ...note that is AT the left!), etc.
pym=1 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]
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
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 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 end
-- ...fountainheads... 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))
if (string.find(nyp.name, "pipeworks:fountainhead") ~= nil) then
pyp=1
end
-- ... and storage tanks.
if (string.find(nym.name, "pipeworks:storage_tank_") ~= nil) then
pym=1
end
if (string.find(nyp.name, "pipeworks:storage_tank_") ~= nil) then
pyp=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
--
return pxm+8*pxp+2*pym+16*pyp+4*pzm+32*pzp return pxm+8*pxp+2*pym+16*pyp+4*pzm+32*pzp
end end
@ -204,4 +212,3 @@ function pipeworks.look_for_stackable_tanks(pos)
minetest.add_node(pos, { name = "pipeworks:expansion_tank_0", param2 = tym.param2}) minetest.add_node(pos, { name = "pipeworks:expansion_tank_0", param2 = tym.param2})
end end
end end

@ -139,6 +139,7 @@ for s in ipairs(states) do
groups = dgroups, groups = dgroups,
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
walkable = true, walkable = true,
pipe_connections = { top = 1 },
after_place_node = function(pos) after_place_node = function(pos)
pipeworks.scan_for_pipe_objects(pos) pipeworks.scan_for_pipe_objects(pos)
end, end,
@ -252,11 +253,17 @@ minetest.register_node("pipeworks:grating", {
"pipeworks_grating_sides.png", "pipeworks_grating_sides.png",
"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, sunlight_propagates = true,
paramtype = "light", paramtype = "light",
groups = {snappy=3, pipe=1}, groups = {snappy=3, pipe=1},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
walkable = true, walkable = true,
pipe_connections = { top = 1 },
after_place_node = function(pos) after_place_node = function(pos)
pipeworks.scan_for_pipe_objects(pos) pipeworks.scan_for_pipe_objects(pos)
end, end,
@ -279,6 +286,8 @@ minetest.register_node("pipeworks:spigot", {
groups = {snappy=3, pipe=1}, groups = {snappy=3, pipe=1},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
walkable = true, 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) after_place_node = function(pos)
pipeworks.scan_for_pipe_objects(pos) pipeworks.scan_for_pipe_objects(pos)
end, end,
@ -318,6 +327,8 @@ minetest.register_node("pipeworks:spigot_pouring", {
groups = {snappy=3, pipe=1, not_in_creative_inventory=1}, groups = {snappy=3, pipe=1, not_in_creative_inventory=1},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
walkable = true, 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) after_place_node = function(pos)
minetest.set_node(pos, { name = "pipeworks:spigot", param2 = minetest.get_node(pos).param2 }) minetest.set_node(pos, { name = "pipeworks:spigot", param2 = minetest.get_node(pos).param2 })
pipeworks.scan_for_pipe_objects(pos) pipeworks.scan_for_pipe_objects(pos)
@ -494,6 +505,7 @@ for fill = 0, 10 do
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
walkable = true, walkable = true,
drop = "pipeworks:storage_tank_0", drop = "pipeworks:storage_tank_0",
pipe_connections = { top = 1, bottom = 1},
after_place_node = function(pos) after_place_node = function(pos)
pipeworks.look_for_stackable_tanks(pos) pipeworks.look_for_stackable_tanks(pos)
pipeworks.scan_for_pipe_objects(pos) pipeworks.scan_for_pipe_objects(pos)
@ -521,6 +533,7 @@ for fill = 0, 10 do
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
walkable = true, walkable = true,
drop = "pipeworks:storage_tank_0", drop = "pipeworks:storage_tank_0",
pipe_connections = { top = 1, bottom = 1},
after_place_node = function(pos) after_place_node = function(pos)
pipeworks.look_for_stackable_tanks(pos) pipeworks.look_for_stackable_tanks(pos)
pipeworks.scan_for_pipe_objects(pos) pipeworks.scan_for_pipe_objects(pos)
@ -544,6 +557,7 @@ minetest.register_node("pipeworks:fountainhead", {
groups = {snappy=3, pipe=1}, groups = {snappy=3, pipe=1},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
walkable = true, walkable = true,
pipe_connections = { bottom = 1 },
after_place_node = function(pos) after_place_node = function(pos)
pipeworks.scan_for_pipe_objects(pos) pipeworks.scan_for_pipe_objects(pos)
end, end,
@ -576,6 +590,7 @@ minetest.register_node("pipeworks:fountainhead_pouring", {
groups = {snappy=3, pipe=1, not_in_creative_inventory=1}, groups = {snappy=3, pipe=1, not_in_creative_inventory=1},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
walkable = true, walkable = true,
pipe_connections = { bottom = 1 },
after_place_node = function(pos) after_place_node = function(pos)
minetest.set_node(pos, { name = "pipeworks:fountainhead", param2 = minetest.get_node(pos).param2 }) minetest.set_node(pos, { name = "pipeworks:fountainhead", param2 = minetest.get_node(pos).param2 })
pipeworks.scan_for_pipe_objects(pos) pipeworks.scan_for_pipe_objects(pos)