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

View File

@ -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
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]
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
-- ...fountainheads...
if (string.find(nyp.name, "pipeworks:fountainhead") ~= nil) then
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
-- ... and storage tanks.
if (string.find(nym.name, "pipeworks:storage_tank_") ~= nil) then
pym=1
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
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
--
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

View File

@ -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)