From f44993cd846ab8b45408fba2c4b84664e77f4930 Mon Sep 17 00:00:00 2001 From: Vanessa Ezekowitz Date: Wed, 12 Apr 2017 03:39:43 -0400 Subject: [PATCH] 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 --- autoplace_pipes.lua | 143 +++++++++++++++++++++++--------------------- devices.lua | 15 +++++ 2 files changed, 90 insertions(+), 68 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 = , -- if supplied, search for this pattern instead of the exact node name + left = , -- true (or 1) if the left side of the node needs to connect to a pipe + right = , -- or from the right side, etc. + top = , + bottom = , + front = , + back = , + left_param2 = , -- the node must have this param2 to connect from the left + right_param2 = , -- or right, etc. + top_param2 = , -- Omit some or all of these to skip checking param2 for those sides + bottom_param2 = , + front_param2 = , + back_param2 = , + }, + + ...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 + 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 + 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 --- ...fountainheads... - - 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 --- - + 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)