From a6641f0d20c574c250b0e14300c6fbc15a544bcd Mon Sep 17 00:00:00 2001 From: Vanessa Ezekowitz Date: Sun, 19 Aug 2012 01:56:30 -0400 Subject: [PATCH] Pumps and valves now fully participate in the auto-rotate/auto-route process. These devices can only be connected to horizontal pipes or to each other. Note that only the device being placed and the pipes around it will adapt; if you have a valve and pump next to one another and they won't connect, put a piece of pipe at one end to show the auto-rotator which way they should go. Removal of a pipe or device will not change the orientation of surrounding devices. --- autoplace.lua | 104 +++++++ devices.lua | 253 ++++++++++++++++ init.lua | 317 ++++----------------- textures/pipeworks_pump_top_x.png | Bin 0 -> 5389 bytes textures/pipeworks_pump_top_z.png | Bin 0 -> 5207 bytes textures/pipeworks_valvebody_top_off_x.png | Bin 0 -> 4557 bytes textures/pipeworks_valvebody_top_off_z.png | Bin 0 -> 4768 bytes textures/pipeworks_valvebody_top_on_x.png | Bin 0 -> 4559 bytes textures/pipeworks_valvebody_top_on_z.png | Bin 0 -> 4726 bytes 9 files changed, 418 insertions(+), 256 deletions(-) create mode 100644 autoplace.lua create mode 100644 devices.lua create mode 100644 textures/pipeworks_pump_top_x.png create mode 100644 textures/pipeworks_pump_top_z.png create mode 100644 textures/pipeworks_valvebody_top_off_x.png create mode 100644 textures/pipeworks_valvebody_top_off_z.png create mode 100644 textures/pipeworks_valvebody_top_on_x.png create mode 100644 textures/pipeworks_valvebody_top_on_z.png diff --git a/autoplace.lua b/autoplace.lua new file mode 100644 index 0000000..2b9a92f --- /dev/null +++ b/autoplace.lua @@ -0,0 +1,104 @@ + +function pipe_autoroute(pos, state) + + nctr = minetest.env:get_node(pos) + if (string.find(nctr.name, "pipeworks:pipe_") == nil) then return end + + pxm=0 + pxp=0 + pym=0 + pyp=0 + pzm=0 + pzp=0 + + nxm = minetest.env:get_node({ x=pos.x-1, y=pos.y , z=pos.z }) + nxp = minetest.env:get_node({ x=pos.x+1, y=pos.y , z=pos.z }) + nym = minetest.env:get_node({ x=pos.x , y=pos.y-1, z=pos.z }) + nyp = minetest.env:get_node({ x=pos.x , y=pos.y+1, z=pos.z }) + nzm = minetest.env:get_node({ x=pos.x , y=pos.y , z=pos.z-1 }) + nzp = minetest.env:get_node({ x=pos.x , y=pos.y , z=pos.z+1 }) + + 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 + + pipe_checkfordevice(pos, "valve") + pipe_checkfordevice(pos, "pump") + + nsurround = pxm..pxp..pym..pyp..pzm..pzp + + if nsurround == "000000" then nsurround = "110000" end + + minetest.env:add_node(pos, { name = "pipeworks:pipe_"..nsurround..state }) +end + +function pipe_device_autorotate(pos, state, bname) + + local nctr = minetest.env:get_node(pos) + + pxm=0 + pxp=0 + pzm=0 + pzp=0 + + nxm = minetest.env:get_node({ x=pos.x-1, y=pos.y , z=pos.z }) + nxp = minetest.env:get_node({ x=pos.x+1, y=pos.y , z=pos.z }) + nzm = minetest.env:get_node({ x=pos.x , y=pos.y , z=pos.z-1 }) + nzp = minetest.env:get_node({ x=pos.x , y=pos.y , z=pos.z+1 }) + + 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(nzm.name, "pipeworks:pipe_") ~= nil) then pzm=1 end + if (string.find(nzp.name, "pipeworks:pipe_") ~= nil) then pzp=1 end + + pipe_checkfordevice(pos, "pump") + pipe_checkfordevice(pos, "valve") + + if (pxm+pxp) ~= 0 then + minetest.env:add_node(pos, { name = bname..state.."_x" }) + return + end + + if (pzm+pzp) ~= 0 then + minetest.env:add_node(pos, { name = bname..state.."_z" }) + end + +end + +pipe_checkfordevice = function(pos, bname) + if (string.find(nxm.name, "pipeworks:"..bname.."_off_x") ~= nil) or + (string.find(nxm.name, "pipeworks:"..bname.."_on_x") ~= nil) then + pxm=1 + end + + if (string.find(nxp.name, "pipeworks:"..bname.."_off_x") ~= nil) or + (string.find(nxp.name, "pipeworks:"..bname.."_on_x") ~= nil) then + pxp=1 + end + + if (string.find(nzm.name, "pipeworks:"..bname.."_off_z") ~= nil) or + (string.find(nzm.name, "pipeworks:"..bname.."_on_z") ~= nil) then + pzm=1 + end + + if (string.find(nzp.name, "pipeworks:"..bname.."_off_z") ~= nil) or + (string.find(nzp.name, "pipeworks:"..bname.."_on_z") ~= nil) then + pzp=1 + end +end + +pipe_scanforobjects = function(pos) + pipe_autoroute({ x=pos.x-1, y=pos.y , z=pos.z }, "_loaded") + pipe_autoroute({ x=pos.x+1, y=pos.y , z=pos.z }, "_loaded") + pipe_autoroute({ x=pos.x , y=pos.y , z=pos.z-1 }, "_loaded") + pipe_autoroute({ x=pos.x , y=pos.y , z=pos.z+1 }, "_loaded") + + pipe_autoroute({ x=pos.x-1, y=pos.y , z=pos.z }, "_empty") + pipe_autoroute({ x=pos.x+1, y=pos.y , z=pos.z }, "_empty") + pipe_autoroute({ x=pos.x , y=pos.y , z=pos.z-1 }, "_empty") + pipe_autoroute({ x=pos.x , y=pos.y , z=pos.z+1 }, "_empty") +end + diff --git a/devices.lua b/devices.lua new file mode 100644 index 0000000..cd78e0e --- /dev/null +++ b/devices.lua @@ -0,0 +1,253 @@ +-- tables + +minetest.register_alias("pipeworks:pump", "pipeworks:pump_off_x") +minetest.register_alias("pipeworks:pump_off", "pipeworks:pump_off_x") +minetest.register_alias("pipeworks:valve", "pipeworks:valve_off_x") +minetest.register_alias("pipeworks:valve_off", "pipeworks:valve_off_x") + +pipe_pumpbody_x = { + { -6/16, -8/16, -6/16, 6/16, 8/16, 6/16 } +} + +pipe_pumpbody_z = { + { -6/16, -8/16, -6/16, 6/16, 8/16, 6/16 } +} + +pipe_valvebody_x = { + { -4/16, -4/16, -4/16, 4/16, 4/16, 4/16 } +} + +pipe_valvebody_z = { + { -4/16, -4/16, -4/16, 4/16, 4/16, 4/16 } +} + +pipe_valvehandle_on_x = { + { -5/16, 4/16, -1/16, 0, 5/16, 1/16 } +} + +pipe_valvehandle_on_z = { + { -1/16, 4/16, -5/16, 1/16, 5/16, 0 } +} + +pipe_valvehandle_off_x = { + { -1/16, 4/16, -5/16, 1/16, 5/16, 0 } +} + +pipe_valvehandle_off_z = { + { -5/16, 4/16, -1/16, 0, 5/16, 1/16 } +} + +-- Now define the nodes. + +local states = { "on", "off" } +local dgroups = "" + +for s in ipairs(states) do + + if s == "off" then + dgroups = {snappy=3, pipe=1} + else + dgroups = {snappy=3, pipe=1, not_in_creative_inventory=1} + end + + local pumpboxes = {} + pipe_addbox(pumpboxes, pipe_leftstub) + pipe_addbox(pumpboxes, pipe_pumpbody_x) + pipe_addbox(pumpboxes, pipe_rightstub) + local tilex = "pipeworks_pump_ends.png" + local tilez = "pipeworks_pump_"..states[s]..".png" + + minetest.register_node("pipeworks:pump_"..states[s].."_x", { + description = "Pump Module ("..states[s]..")", + drawtype = "nodebox", + tiles = { + "pipeworks_pump_top_x.png", + "pipeworks_pump_sides.png", + tilex, + tilex, + tilez, + tilez + }, + paramtype = "light", + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 } + }, + node_box = { + type = "fixed", + fixed = pumpboxes + }, + groups = dgroups, + sounds = default.node_sound_wood_defaults(), + walkable = true, + stack_max = 99, + after_place_node = function(pos) + pipe_device_autorotate(pos, states[s], "pipeworks:pump_") + pipe_scanforobjects(pos) + end, + after_dig_node = function(pos) + pipe_scanforobjects(pos) + end, + drop = "pipeworks:pump_off_x" + }) + + local pumpboxes = {} + pipe_addbox(pumpboxes, pipe_frontstub) + pipe_addbox(pumpboxes, pipe_pumpbody_z) + pipe_addbox(pumpboxes, pipe_backstub) + + minetest.register_node("pipeworks:pump_"..states[s].."_z", { + description = "Pump Module ("..states[s]..", Z-axis)", + drawtype = "nodebox", + tiles = { + "pipeworks_pump_top_z.png", + "pipeworks_pump_sides.png", + tilez, + tilez, + tilex, + tilex + }, + paramtype = "light", + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 } + }, + node_box = { + type = "fixed", + fixed = pumpboxes + }, + groups = {snappy=3, pipe=1, not_in_creative_inventory=1}, + sounds = default.node_sound_wood_defaults(), + walkable = true, + stack_max = 99, + after_place_node = function(pos) + pipe_device_autorotate(pos, states[s], "pipeworks:pump_") + pipe_scanforobjects(pos) + end, + after_dig_node = function(pos) + pipe_scanforobjects(pos) + end, + drop = "pipeworks:pump_off_x" + }) + + local valveboxes = {} + pipe_addbox(valveboxes, pipe_leftstub) + pipe_addbox(valveboxes, pipe_valvebody_x) + if states[s] == "off" then + pipe_addbox(valveboxes, pipe_valvehandle_off_x) + else + pipe_addbox(valveboxes, pipe_valvehandle_on_x) + end + pipe_addbox(valveboxes, pipe_rightstub) + local tilex = "pipeworks_valvebody_ends.png" + local tilez = "pipeworks_valvebody_sides.png" + + minetest.register_node("pipeworks:valve_"..states[s].."_x", { + description = "Valve ("..states[s]..")", + drawtype = "nodebox", + tiles = { + "pipeworks_valvebody_top_"..states[s].."_x.png", + "pipeworks_valvebody_bottom.png", + tilex, + tilex, + tilez, + tilez, + }, + paramtype = "light", + selection_box = { + type = "fixed", + fixed = { -8/16, -4/16, -5/16, 8/16, 5/16, 5/16 } + }, + node_box = { + type = "fixed", + fixed = valveboxes + }, + groups = dgroups, + sounds = default.node_sound_wood_defaults(), + walkable = true, + stack_max = 99, + after_place_node = function(pos) + pipe_device_autorotate(pos, states[s], "pipeworks:valve_") + pipe_scanforobjects(pos) + end, + after_dig_node = function(pos) + pipe_scanforobjects(pos) + end, + drop = "pipeworks:valve_off_x" + }) + + local valveboxes = {} + pipe_addbox(valveboxes, pipe_frontstub) + pipe_addbox(valveboxes, pipe_valvebody_z) + if states[s] == "off" then + pipe_addbox(valveboxes, pipe_valvehandle_off_z) + else + pipe_addbox(valveboxes, pipe_valvehandle_on_z) + end + pipe_addbox(valveboxes, pipe_backstub) + + minetest.register_node("pipeworks:valve_"..states[s].."_z", { + description = "Valve ("..states[s]..", Z-axis)", + drawtype = "nodebox", + tiles = { + "pipeworks_valvebody_top_"..states[s].."_z.png", + "pipeworks_valvebody_bottom.png", + tilez, + tilez, + tilex, + tilex, + }, + paramtype = "light", + selection_box = { + type = "fixed", + fixed = { -5/16, -4/16, -8/16, 5/16, 5/16, 8/16 } + }, + node_box = { + type = "fixed", + fixed = valveboxes + }, + groups = {snappy=3, pipe=1, not_in_creative_inventory=1}, + sounds = default.node_sound_wood_defaults(), + walkable = true, + stack_max = 99, + after_place_node = function(pos) + pipe_device_autorotate(pos, states[s], "pipeworks:valve_") + pipe_scanforobjects(pos) + + end, + after_dig_node = function(pos) + pipe_scanforobjects(pos) + end, + drop = "pipeworks:valve_off_x" + }) +end + +local axes = { "x", "z" } + +for a in ipairs(axes) do + minetest.register_on_punchnode(function (pos, node) + if node.name=="pipeworks:valve_on_"..axes[a] then + minetest.env:add_node(pos, { name = "pipeworks:valve_off_"..axes[a] }) + end + end) + + minetest.register_on_punchnode(function (pos, node) + if node.name=="pipeworks:valve_off_"..axes[a] then + minetest.env:add_node(pos, { name = "pipeworks:valve_on_"..axes[a] }) + end + end) + + minetest.register_on_punchnode(function (pos, node) + if node.name=="pipeworks:pump_on_"..axes[a] then + minetest.env:add_node(pos, { name = "pipeworks:pump_off_"..axes[a] }) + end + end) + + minetest.register_on_punchnode(function (pos, node) + if node.name=="pipeworks:pump_off_"..axes[a] then + minetest.env:add_node(pos, { name = "pipeworks:pump_on_"..axes[a] }) + end + end) +end + +print("Pipeworks loaded!") diff --git a/init.lua b/init.lua index f941d65..2c62afa 100644 --- a/init.lua +++ b/init.lua @@ -13,7 +13,7 @@ dofile(minetest.get_modpath("pipeworks").."/oldpipes.lua") minetest.register_alias("pipeworks:pipe", "pipeworks:pipe_000000_empty") -local leftstub = { +pipe_leftstub = { { -32/64, -2/64, -6/64, 1/64, 2/64, 6/64 }, -- pipe segment against -X face { -32/64, -4/64, -5/64, 1/64, 4/64, 5/64 }, { -32/64, -5/64, -4/64, 1/64, 5/64, 4/64 }, @@ -26,7 +26,7 @@ local leftstub = { { -32/64, -8/64, -3/64, -30/64, 8/64, 3/64 } } -local rightstub = { +pipe_rightstub = { { -1/64, -2/64, -6/64, 32/64, 2/64, 6/64 }, -- pipe segment against +X face { -1/64, -4/64, -5/64, 32/64, 4/64, 5/64 }, { -1/64, -5/64, -4/64, 32/64, 5/64, 4/64 }, @@ -39,7 +39,7 @@ local rightstub = { { 30/64, -8/64, -3/64, 32/64, 8/64, 3/64 } } -local bottomstub = { +pipe_bottomstub = { { -2/64, -32/64, -6/64, 2/64, 1/64, 6/64 }, -- pipe segment against -Y face { -4/64, -32/64, -5/64, 4/64, 1/64, 5/64 }, { -5/64, -32/64, -4/64, 5/64, 1/64, 4/64 }, @@ -53,7 +53,7 @@ local bottomstub = { } -local topstub = { +pipe_topstub = { { -2/64, -1/64, -6/64, 2/64, 32/64, 6/64 }, -- pipe segment against +Y face { -4/64, -1/64, -5/64, 4/64, 32/64, 5/64 }, { -5/64, -1/64, -4/64, 5/64, 32/64, 4/64 }, @@ -66,7 +66,7 @@ local topstub = { { -8/64, 30/64, -3/64, 8/64, 32/64, 3/64 } } -local frontstub = { +pipe_frontstub = { { -6/64, -2/64, -32/64, 6/64, 2/64, 1/64 }, -- pipe segment against -Z face { -5/64, -4/64, -32/64, 5/64, 4/64, 1/64 }, { -4/64, -5/64, -32/64, 4/64, 5/64, 1/64 }, @@ -79,7 +79,7 @@ local frontstub = { { -3/64, -8/64, -32/64, 3/64, 8/64, -30/64 } } -local backstub = { +pipe_backstub = { { -6/64, -2/64, -1/64, 6/64, 2/64, 32/64 }, -- pipe segment against -Z face { -5/64, -4/64, -1/64, 5/64, 4/64, 32/64 }, { -4/64, -5/64, -1/64, 4/64, 5/64, 32/64 }, @@ -92,7 +92,7 @@ local backstub = { { -3/64, -8/64, 30/64, 3/64, 8/64, 32/64 } } -local selectboxes = { +pipe_selectboxes = { { -32/64, -8/64, -8/64, 8/64, 8/64, 8/64 }, { -8/64 , -8/64, -8/64, 32/64, 8/64, 8/64 }, { -8/64 , -32/64, -8/64, 8/64, 8/64, 8/64 }, @@ -101,33 +101,16 @@ local selectboxes = { { -8/64 , -8/64, -8/64, 8/64, 8/64, 32/64 } } -bendsphere = { +pipe_bendsphere = { { -4/64, -4/64, -4/64, 4/64, 4/64, 4/64 }, { -5/64, -3/64, -3/64, 5/64, 3/64, 3/64 }, { -3/64, -5/64, -3/64, 3/64, 5/64, 3/64 }, { -3/64, -3/64, -5/64, 3/64, 3/64, 5/64 } } -pumpbody = { - { -6/16, -8/16, -6/16, 6/16, 8/16, 6/16 } -} +-- Functions -valvebody = { - { -4/16, -4/16, -4/16, 4/16, 4/16, 4/16 } -} - -valvehandle_on = { - { -5/16, 4/16, -1/16, 0, 5/16, 1/16 } -} - -valvehandle_off = { - { -1/16, 4/16, -5/16, 1/16, 5/16, 0 } -} - - --- Local Functions - -local dbg = function(s) +dbg = function(s) if DEBUG == 1 then print('[PIPEWORKS] ' .. s) end @@ -142,45 +125,12 @@ function fix_newpipe_names(table, replacement) return outtable end -local function addbox(t, b) +function pipe_addbox(t, b) for i in ipairs(b) do table.insert(t, b[i]) end end -local function autoroute(pos, state) - - local nctr = minetest.env:get_node(pos) - if (string.find(nctr.name, "pipeworks:pipe_") == nil) then return end - - local pxm=0 - local pxp=0 - local pym=0 - local pyp=0 - local pzm=0 - local pzp=0 - - local nxm = minetest.env:get_node({ x=pos.x-1, y=pos.y , z=pos.z }) - local nxp = minetest.env:get_node({ x=pos.x+1, y=pos.y , z=pos.z }) - local nym = minetest.env:get_node({ x=pos.x , y=pos.y-1, z=pos.z }) - local nyp = minetest.env:get_node({ x=pos.x , y=pos.y+1, z=pos.z }) - local nzm = minetest.env:get_node({ x=pos.x , y=pos.y , z=pos.z-1 }) - local nzp = minetest.env:get_node({ x=pos.x , y=pos.y , z=pos.z+1 }) - - 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 - - local nsurround = pxm..pxp..pym..pyp..pzm..pzp - - if nsurround == "000000" then nsurround = "110000" end - - minetest.env:add_node(pos, { name = "pipeworks:pipe_"..nsurround..state }) -end - -- now define the nodes! for xm = 0, 1 do @@ -189,55 +139,56 @@ for ym = 0, 1 do for yp = 0, 1 do for zm = 0, 1 do for zp = 0, 1 do - outboxes = {} - outsel = {} - outimgs = {} + local outboxes = {} + local outsel = {} + local outimgs = {} + if yp==1 then - addbox(outboxes, topstub) - table.insert(outsel, selectboxes[4]) + pipe_addbox(outboxes, pipe_topstub) + table.insert(outsel, pipe_selectboxes[4]) table.insert(outimgs, "pipeworks_pipe_end.png") else table.insert(outimgs, "pipeworks_plain.png") end if ym==1 then - addbox(outboxes, bottomstub) - table.insert(outsel, selectboxes[3]) + pipe_addbox(outboxes, pipe_bottomstub) + table.insert(outsel, pipe_selectboxes[3]) table.insert(outimgs, "pipeworks_pipe_end.png") else table.insert(outimgs, "pipeworks_plain.png") end if xp==1 then - addbox(outboxes, rightstub) - table.insert(outsel, selectboxes[2]) + pipe_addbox(outboxes, pipe_rightstub) + table.insert(outsel, pipe_selectboxes[2]) table.insert(outimgs, "pipeworks_pipe_end.png") else table.insert(outimgs, "pipeworks_plain.png") end if xm==1 then - addbox(outboxes, leftstub) - table.insert(outsel, selectboxes[1]) + pipe_addbox(outboxes, pipe_leftstub) + table.insert(outsel, pipe_selectboxes[1]) table.insert(outimgs, "pipeworks_pipe_end.png") else table.insert(outimgs, "pipeworks_plain.png") end if zp==1 then - addbox(outboxes, backstub) - table.insert(outsel, selectboxes[6]) + pipe_addbox(outboxes, pipe_backstub) + table.insert(outsel, pipe_selectboxes[6]) table.insert(outimgs, "pipeworks_pipe_end.png") else table.insert(outimgs, "pipeworks_plain.png") end if zm==1 then - addbox(outboxes, frontstub) - table.insert(outsel, selectboxes[5]) + pipe_addbox(outboxes, pipe_frontstub) + table.insert(outsel, pipe_selectboxes[5]) table.insert(outimgs, "pipeworks_pipe_end.png") else table.insert(outimgs, "pipeworks_plain.png") end - jx = xp+xm - jy = yp+ym - jz = zp+zm + local jx = xp+xm + local jy = yp+ym + local jz = zp+zm if (jx+jy+jz) == 1 then if xm == 1 then @@ -267,7 +218,7 @@ for zp = 0, 1 do end if (jx==1 and jy==1 and jz~=1) or (jx==1 and jy~=1 and jz==1) or (jx~= 1 and jy==1 and jz==1) then - addbox(outboxes, bendsphere) + pipe_addbox(outboxes, pipe_bendsphere) end if (jx==2 and jy~=2 and jz~=2) then @@ -284,7 +235,8 @@ for zp = 0, 1 do table.insert(outimgs, 3, "pipeworks_windowed_XXXXX.png") end - pname = xm..xp..ym..yp..zm..zp + local pname = xm..xp..ym..yp..zm..zp + local pgroups = "" if pname ~= "110000" then pgroups = {snappy=3, pipe=1, not_in_creative_inventory=1} @@ -313,21 +265,21 @@ for zp = 0, 1 do stack_max = 99, drop = "pipeworks:pipe_110000_empty", after_place_node = function(pos) - autoroute({ x=pos.x-1, y=pos.y , z=pos.z }, "_empty") - autoroute({ x=pos.x+1, y=pos.y , z=pos.z }, "_empty") - autoroute({ x=pos.x , y=pos.y-1, z=pos.z }, "_empty") - autoroute({ x=pos.x , y=pos.y+1, z=pos.z }, "_empty") - autoroute({ x=pos.x , y=pos.y , z=pos.z-1 }, "_empty") - autoroute({ x=pos.x , y=pos.y , z=pos.z+1 }, "_empty") - autoroute(pos, "_empty") + pipe_autoroute({ x=pos.x-1, y=pos.y , z=pos.z }, "_empty") + pipe_autoroute({ x=pos.x+1, y=pos.y , z=pos.z }, "_empty") + pipe_autoroute({ x=pos.x , y=pos.y-1, z=pos.z }, "_empty") + pipe_autoroute({ x=pos.x , y=pos.y+1, z=pos.z }, "_empty") + pipe_autoroute({ x=pos.x , y=pos.y , z=pos.z-1 }, "_empty") + pipe_autoroute({ x=pos.x , y=pos.y , z=pos.z+1 }, "_empty") + pipe_autoroute(pos, "_empty") end, after_dig_node = function(pos) - autoroute({ x=pos.x-1, y=pos.y , z=pos.z }, "_empty") - autoroute({ x=pos.x+1, y=pos.y , z=pos.z }, "_empty") - autoroute({ x=pos.x , y=pos.y-1, z=pos.z }, "_empty") - autoroute({ x=pos.x , y=pos.y+1, z=pos.z }, "_empty") - autoroute({ x=pos.x , y=pos.y , z=pos.z-1 }, "_empty") - autoroute({ x=pos.x , y=pos.y , z=pos.z+1 }, "_empty") + pipe_autoroute({ x=pos.x-1, y=pos.y , z=pos.z }, "_empty") + pipe_autoroute({ x=pos.x+1, y=pos.y , z=pos.z }, "_empty") + pipe_autoroute({ x=pos.x , y=pos.y-1, z=pos.z }, "_empty") + pipe_autoroute({ x=pos.x , y=pos.y+1, z=pos.z }, "_empty") + pipe_autoroute({ x=pos.x , y=pos.y , z=pos.z-1 }, "_empty") + pipe_autoroute({ x=pos.x , y=pos.y , z=pos.z+1 }, "_empty") end }) @@ -350,21 +302,21 @@ for zp = 0, 1 do stack_max = 99, drop = "pipeworks:pipe_110000_loaded", after_place_node = function(pos) - autoroute({ x=pos.x-1, y=pos.y , z=pos.z }, "_loaded") - autoroute({ x=pos.x+1, y=pos.y , z=pos.z }, "_loaded") - autoroute({ x=pos.x , y=pos.y-1, z=pos.z }, "_loaded") - autoroute({ x=pos.x , y=pos.y+1, z=pos.z }, "_loaded") - autoroute({ x=pos.x , y=pos.y , z=pos.z-1 }, "_loaded") - autoroute({ x=pos.x , y=pos.y , z=pos.z+1 }, "_loaded") - autoroute(pos, "_loaded") + pipe_autoroute({ x=pos.x-1, y=pos.y , z=pos.z }, "_loaded") + pipe_autoroute({ x=pos.x+1, y=pos.y , z=pos.z }, "_loaded") + pipe_autoroute({ x=pos.x , y=pos.y-1, z=pos.z }, "_loaded") + pipe_autoroute({ x=pos.x , y=pos.y+1, z=pos.z }, "_loaded") + pipe_autoroute({ x=pos.x , y=pos.y , z=pos.z-1 }, "_loaded") + pipe_autoroute({ x=pos.x , y=pos.y , z=pos.z+1 }, "_loaded") + pipe_autoroute(pos, "_loaded") end, after_dig_node = function(pos) - autoroute({ x=pos.x-1, y=pos.y , z=pos.z }, "_loaded") - autoroute({ x=pos.x+1, y=pos.y , z=pos.z }, "_loaded") - autoroute({ x=pos.x , y=pos.y-1, z=pos.z }, "_loaded") - autoroute({ x=pos.x , y=pos.y+1, z=pos.z }, "_loaded") - autoroute({ x=pos.x , y=pos.y , z=pos.z-1 }, "_loaded") - autoroute({ x=pos.x , y=pos.y , z=pos.z+1 }, "_loaded") + pipe_autoroute({ x=pos.x-1, y=pos.y , z=pos.z }, "_loaded") + pipe_autoroute({ x=pos.x+1, y=pos.y , z=pos.z }, "_loaded") + pipe_autoroute({ x=pos.x , y=pos.y-1, z=pos.z }, "_loaded") + pipe_autoroute({ x=pos.x , y=pos.y+1, z=pos.z }, "_loaded") + pipe_autoroute({ x=pos.x , y=pos.y , z=pos.z-1 }, "_loaded") + pipe_autoroute({ x=pos.x , y=pos.y , z=pos.z+1 }, "_loaded") end }) end @@ -374,154 +326,7 @@ end end end --- the pump module - -pumpboxes = {} -addbox(pumpboxes, leftstub) -addbox(pumpboxes, pumpbody) -addbox(pumpboxes, rightstub) - -minetest.register_node("pipeworks:pump_on", { - description = "Pump Module (on)", - drawtype = "nodebox", - tiles = { - "pipeworks_pump_sides.png", - "pipeworks_pump_sides.png", - "pipeworks_pump_ends.png", - "pipeworks_pump_ends.png", - "pipeworks_pump_on.png", - "pipeworks_pump_on.png" - }, - paramtype = "light", - selection_box = { - type = "fixed", - fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 } - }, - node_box = { - type = "fixed", - fixed = pumpboxes - }, - groups = {snappy=3, pipe=1, not_in_creative_inventory=1}, - sounds = default.node_sound_wood_defaults(), - walkable = true, - stack_max = 99, -}) - -minetest.register_node("pipeworks:pump_off", { - description = "Pump Module (off)", - drawtype = "nodebox", - tiles = { - "pipeworks_pump_sides.png", - "pipeworks_pump_sides.png", - "pipeworks_pump_ends.png", - "pipeworks_pump_ends.png", - "pipeworks_pump_off.png", - "pipeworks_pump_off.png" - }, - paramtype = "light", - selection_box = { - type = "fixed", - fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 } - }, - node_box = { - type = "fixed", - fixed = pumpboxes - }, - groups = {snappy=3, pipe=1}, - sounds = default.node_sound_wood_defaults(), - walkable = true, - stack_max = 99, -}) - --- valve module - -valveboxes = {} -addbox(valveboxes, leftstub) -addbox(valveboxes, valvebody) -addbox(valveboxes, valvehandle_off) -addbox(valveboxes, rightstub) - -minetest.register_node("pipeworks:valve_off", { - description = "Valve (off)", - drawtype = "nodebox", - tiles = { - "pipeworks_valvebody_top_off.png", - "pipeworks_valvebody_bottom.png", - "pipeworks_valvebody_ends.png", - "pipeworks_valvebody_ends.png", - "pipeworks_valvebody_sides.png", - "pipeworks_valvebody_sides.png", - }, - paramtype = "light", - selection_box = { - type = "fixed", - fixed = { -5/16, -4/16, -5/16, 6/16, 8/16, 6/16 } - }, - node_box = { - type = "fixed", - fixed = valveboxes - }, - groups = {snappy=3, pipe=1}, - sounds = default.node_sound_wood_defaults(), - walkable = true, - stack_max = 99, -}) - -valveboxes = {} -addbox(valveboxes, leftstub) -addbox(valveboxes, valvebody) -addbox(valveboxes, valvehandle_on) -addbox(valveboxes, rightstub) - -minetest.register_node("pipeworks:valve_on", { - description = "Valve (on)", - drawtype = "nodebox", - tiles = { - "pipeworks_valvebody_top_on.png", - "pipeworks_valvebody_bottom.png", - "pipeworks_valvebody_ends.png", - "pipeworks_valvebody_ends.png", - "pipeworks_valvebody_sides.png", - "pipeworks_valvebody_sides.png", - }, - paramtype = "light", - selection_box = { - type = "fixed", - fixed = { -5/16, -4/16, -5/16, 6/16, 8/16, 6/16 } - }, - node_box = { - type = "fixed", - fixed = valveboxes - }, - groups = {snappy=3, pipe=1, not_in_creative_inventory=1}, - sounds = default.node_sound_wood_defaults(), - walkable = true, - stack_max = 99, -}) - -minetest.register_on_punchnode(function (pos, node) - if node.name=="pipeworks:valve_on" then - minetest.env:add_node(pos, { name = "pipeworks:valve_off" }) - end -end) - -minetest.register_on_punchnode(function (pos, node) - if node.name=="pipeworks:valve_off" then - minetest.env:add_node(pos, { name = "pipeworks:valve_on" }) - end -end) - - -minetest.register_on_punchnode(function (pos, node) - if node.name=="pipeworks:pump_on" then - minetest.env:add_node(pos, { name = "pipeworks:pump_off" }) - end -end) - -minetest.register_on_punchnode(function (pos, node) - if node.name=="pipeworks:pump_off" then - minetest.env:add_node(pos, { name = "pipeworks:pump_on" }) - end -end) +dofile(minetest.get_modpath("pipeworks").."/devices.lua") +dofile(minetest.get_modpath("pipeworks").."/autoplace.lua") print("Pipeworks loaded!") diff --git a/textures/pipeworks_pump_top_x.png b/textures/pipeworks_pump_top_x.png new file mode 100644 index 0000000000000000000000000000000000000000..9228bdd0cb302a6e35ceedad85dd30f61bee9067 GIT binary patch literal 5389 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 X99~33Iu8S%GWpQPmPWN#T;u-(PF#2; literal 0 HcmV?d00001 diff --git a/textures/pipeworks_pump_top_z.png b/textures/pipeworks_pump_top_z.png new file mode 100644 index 0000000000000000000000000000000000000000..45837e7429748407ceb8bdcfe74874803c393bf2 GIT binary patch literal 5207 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 PD9B;~vo@`{?iTYufLbZ! literal 0 HcmV?d00001 diff --git a/textures/pipeworks_valvebody_top_off_x.png b/textures/pipeworks_valvebody_top_off_x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ab49389e44a54f02f2d0129d35a8adf3c61ee50 GIT binary patch literal 4557 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 literal 0 HcmV?d00001 diff --git a/textures/pipeworks_valvebody_top_off_z.png b/textures/pipeworks_valvebody_top_off_z.png new file mode 100644 index 0000000000000000000000000000000000000000..d645b2dd5be7f5724825c5b56921801a5bd5ffad GIT binary patch literal 4768 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 Ef|^(HUjP6A literal 0 HcmV?d00001