From 4ccb053e039237bae91f1a56a961793a3dc2caaa Mon Sep 17 00:00:00 2001 From: Vanessa Ezekowitz Date: Sat, 18 Aug 2012 08:46:17 -0400 Subject: [PATCH] Total rewrite again. All pipes are now nice and round-looking, and they auto-connect! Also added temporary nodes for pump and valve (each with an on/off setting - punch to change). No crafting recipes yet and the pipes still don't do anything useful yet. Soon. --- init.lua | 748 +++++++++++++---------- oldpipes.lua | 353 +++++++++++ textures/pipeworks_pipe_end.png | Bin 423 -> 2149 bytes textures/pipeworks_plain.png | Bin 296 -> 1872 bytes textures/pipeworks_pump_ends.png | Bin 0 -> 6410 bytes textures/pipeworks_pump_off.png | Bin 0 -> 5185 bytes textures/pipeworks_pump_on.png | Bin 0 -> 6488 bytes textures/pipeworks_pump_sides.png | Bin 0 -> 5389 bytes textures/pipeworks_valvebody_bottom.png | Bin 0 -> 5321 bytes textures/pipeworks_valvebody_ends.png | Bin 0 -> 6138 bytes textures/pipeworks_valvebody_sides.png | Bin 0 -> 4592 bytes textures/pipeworks_valvebody_top_off.png | Bin 0 -> 4557 bytes textures/pipeworks_valvebody_top_on.png | Bin 0 -> 4559 bytes textures/pipeworks_windowed_empty.png | Bin 335 -> 1945 bytes textures/pipeworks_windowed_loaded.png | Bin 345 -> 1950 bytes 15 files changed, 790 insertions(+), 311 deletions(-) create mode 100644 oldpipes.lua create mode 100644 textures/pipeworks_pump_ends.png create mode 100644 textures/pipeworks_pump_off.png create mode 100644 textures/pipeworks_pump_on.png create mode 100644 textures/pipeworks_pump_sides.png create mode 100644 textures/pipeworks_valvebody_bottom.png create mode 100644 textures/pipeworks_valvebody_ends.png create mode 100644 textures/pipeworks_valvebody_sides.png create mode 100644 textures/pipeworks_valvebody_top_off.png create mode 100644 textures/pipeworks_valvebody_top_on.png diff --git a/init.lua b/init.lua index 1c8c147..713b5da 100644 --- a/init.lua +++ b/init.lua @@ -6,361 +6,487 @@ -- License: WTFPL -- -local DEBUG = 0 +-- uncomment the following dofile line to enable the old pipe nodes. +-- dofile(minetest.get_modpath("pipeworks").."/oldpipes.lua") --- Local Functions +-- tables -local dbg = function(s) - if DEBUG == 1 then - print('[PIPEWORKS] ' .. s) - end -end +minetest.register_alias("pipeworks:pipe", "pipeworks:pipe_000000_empty") + +local 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 }, + { -32/64, -6/64, -2/64, 1/64, 6/64, 2/64 }, + + { -32/64, -3/64, -8/64, -30/64, 3/64, 8/64 }, -- (the flange for it) + { -32/64, -5/64, -7/64, -30/64, 5/64, 7/64 }, + { -32/64, -6/64, -6/64, -30/64, 6/64, 6/64 }, + { -32/64, -7/64, -5/64, -30/64, 7/64, 5/64 }, + { -32/64, -8/64, -3/64, -30/64, 8/64, 3/64 } +} + +local 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 }, + { -1/64, -6/64, -2/64, 32/64, 6/64, 2/64 }, + + { 30/64, -3/64, -8/64, 32/64, 3/64, 8/64 }, -- (the flange for it) + { 30/64, -5/64, -7/64, 32/64, 5/64, 7/64 }, + { 30/64, -6/64, -6/64, 32/64, 6/64, 6/64 }, + { 30/64, -7/64, -5/64, 32/64, 7/64, 5/64 }, + { 30/64, -8/64, -3/64, 32/64, 8/64, 3/64 } +} + +local 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 }, + { -6/64, -32/64, -2/64, 6/64, 1/64, 2/64 }, + + { -3/64, -32/64, -8/64, 3/64, -30/64, 8/64 }, -- (the flange for it) + { -5/64, -32/64, -7/64, 5/64, -30/64, 7/64 }, + { -6/64, -32/64, -6/64, 6/64, -30/64, 6/64 }, + { -7/64, -32/64, -5/64, 7/64, -30/64, 5/64 }, + { -8/64, -32/64, -3/64, 8/64, -30/64, 3/64 } +} + + +local 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 }, + { -6/64, -1/64, -2/64, 6/64, 32/64, 2/64 }, + + { -3/64, 30/64, -8/64, 3/64, 32/64, 8/64 }, -- (the flange for it) + { -5/64, 30/64, -7/64, 5/64, 32/64, 7/64 }, + { -6/64, 30/64, -6/64, 6/64, 32/64, 6/64 }, + { -7/64, 30/64, -5/64, 7/64, 32/64, 5/64 }, + { -8/64, 30/64, -3/64, 8/64, 32/64, 3/64 } +} + +local 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 }, + { -2/64, -6/64, -32/64, 2/64, 6/64, 1/64 }, + + { -8/64, -3/64, -32/64, 8/64, 3/64, -30/64 }, -- (the flange for it) + { -7/64, -5/64, -32/64, 7/64, 5/64, -30/64 }, + { -6/64, -6/64, -32/64, 6/64, 6/64, -30/64 }, + { -5/64, -7/64, -32/64, 5/64, 7/64, -30/64 }, + { -3/64, -8/64, -32/64, 3/64, 8/64, -30/64 } +} + +local 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 }, + { -2/64, -6/64, -1/64, 2/64, 6/64, 32/64 }, + + { -8/64, -3/64, 30/64, 8/64, 3/64, 32/64 }, -- (the flange for it) + { -7/64, -5/64, 30/64, 7/64, 5/64, 32/64 }, + { -6/64, -6/64, 30/64, 6/64, 6/64, 32/64 }, + { -5/64, -7/64, 30/64, 5/64, 7/64, 32/64 }, + { -3/64, -8/64, 30/64, 3/64, 8/64, 32/64 } +} + +local 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 }, + { -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 , -8/64, -8/64, 8/64, 8/64, 32/64 } +} -local nodenames = { - "vertical", - "horizontal", - "junction_xy", - "junction_xz", - "bend_xy_down", - "bend_xy_up", - "bend_xz", - "crossing_xz", - "crossing_xy", - "crossing_xyz", - "pipe", - "cap_neg_x", - "cap_pos_x", - "cap_neg_y", - "cap_pos_y", - "cap_neg_z", - "cap_pos_z" +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 } } -local descriptions = { - "vertical", - "horizontal", - "junction between X and Y axes", - "junction between X and Z axes", - "downward bend between X and Y axes", - "upward bend between X and Y axes", - "bend between X/Z axes", - "4-way crossing between X and Z axes", - "4-way crossing between X/Z and Y axes", - "6-way crossing", - "basic segment", - "capped, negative X half only", - "capped, positive X half only", - "capped, negative Y half only", - "capped, positive Y half only", - "capped, negative Z half only", - "capped, positive Z half only" +pumpbody = { + { -6/16, -8/16, -6/16, 6/16, 8/16, 6/16 } } -local nodeimages = { - {"pipeworks_pipe_end.png", - "pipeworks_pipe_end.png", - "pipeworks_plain.png", - "pipeworks_plain.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png"}, - - {"pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_pipe_end.png", - "pipeworks_pipe_end.png", - "pipeworks_plain.png", - "pipeworks_plain.png"}, - - {"pipeworks_pipe_end.png", - "pipeworks_pipe_end.png", - "pipeworks_pipe_end.png", - "pipeworks_plain.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png"}, - - {"pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_pipe_end.png", - "pipeworks_pipe_end.png", - "pipeworks_pipe_end.png", - "pipeworks_plain.png"}, - - {"pipeworks_plain.png", - "pipeworks_pipe_end.png", - "pipeworks_pipe_end.png", - "pipeworks_plain.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png"}, - - {"pipeworks_pipe_end.png", - "pipeworks_plain.png", - "pipeworks_pipe_end.png", - "pipeworks_plain.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png"}, - - {"pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_pipe_end.png", - "pipeworks_plain.png", - "pipeworks_pipe_end.png", - "pipeworks_plain.png"}, - - {"pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_pipe_end.png", - "pipeworks_pipe_end.png", - "pipeworks_pipe_end.png", - "pipeworks_pipe_end.png"}, - - {"pipeworks_pipe_end.png", - "pipeworks_pipe_end.png", - "pipeworks_pipe_end.png", - "pipeworks_pipe_end.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png"}, - - {"pipeworks_pipe_end.png", - "pipeworks_pipe_end.png", - "pipeworks_pipe_end.png", - "pipeworks_pipe_end.png", - "pipeworks_pipe_end.png", - "pipeworks_pipe_end.png"}, - --- horizontal short segment - - {"pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_pipe_end.png", - "pipeworks_pipe_end.png", - "pipeworks_plain.png", - "pipeworks_plain.png"}, - --- capped - - {"pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_pipe_end.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png"}, - - {"pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_pipe_end.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png"}, - - {"pipeworks_windowed_XXXXX.png", - "pipeworks_pipe_end.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png"}, - - {"pipeworks_pipe_end.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png"}, - - {"pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_pipe_end.png"}, - - {"pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_windowed_XXXXX.png", - "pipeworks_pipe_end.png", - "pipeworks_windowed_XXXXX.png"}, +valvebody = { + { -4/16, -4/16, -4/16, 4/16, 4/16, 4/16 } } -local selectionboxes = { - { -0.15, -0.5, -0.15, 0.15, 0.5, 0.15 }, - { -0.5, -0.15, -0.15, 0.5, 0.15, 0.15 }, - { -0.15, -0.5, -0.15, 0.5, 0.5, 0.15 }, - { -0.5, -0.15, -0.15, 0.5, 0.15, 0.5 }, - { -0.15, -0.5, -0.15, 0.5, 0.15, 0.15 }, - { -0.15, -0.15, -0.15, 0.5, 0.5, 0.15 }, - { -0.15, -0.15, -0.15, 0.5, 0.15, 0.5 }, - { -0.5, -0.15, -0.5, 0.5, 0.15, 0.5 }, - { -0.5, -0.5, -0.15, 0.5, 0.5, 0.15 }, - { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, - { -0.3, -0.15, -0.15, 0.3, 0.15, 0.15 }, - { -0.5, -0.15, -0.15, 0, 0.15, 0.15 }, - { 0, -0.15, -0.15, 0.5, 0.15, 0.15 }, - { -0.15, -0.5, -0.15, 0.15, 0, 0.15 }, - { -0.15, 0, -0.15, 0.15, 0.5, 0.15 }, - { -0.15, -0.15, -0.5, 0.15, 0.15, 0 }, - { -0.15, -0.15, 0, 0.15, 0.15, 0.5 }, +valvehandle_on = { + { -5/16, 4/16, -1/16, 0, 5/16, 1/16 } } -local nodeboxes = { - {{ -0.15, -0.5 , -0.15, 0.15, -0.45, 0.15 }, -- vertical - { -0.1 , -0.45, -0.1 , 0.1 , 0.45, 0.1 }, - { -0.15, 0.45, -0.15, 0.15, 0.5 , 0.15 }}, - - {{ -0.5 , -0.15, -0.15, -0.45, 0.15, 0.15 }, -- horizontal - { -0.45, -0.1 , -0.1 , 0.45, 0.1 , 0.1 }, - { 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }}, - - {{ -0.15, -0.5 , -0.15, 0.15, -0.45, 0.15 }, -- vertical with X/Z junction - { -0.1 , -0.45, -0.1 , 0.1 , 0.45, 0.1 }, - { -0.15, 0.45, -0.15, 0.15, 0.5 , 0.15 }, - { 0.1 , -0.1 , -0.1 , 0.45, 0.1 , 0.1 }, - { 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }}, - - {{ -0.15, -0.15, 0.45, 0.15, 0.15, 0.5 }, -- horizontal with X/Z junction - { -0.1 , -0.1 , 0.1 , 0.1 , 0.1 , 0.45 }, - { -0.5 , -0.15, -0.15, -0.45, 0.15, 0.15 }, - { -0.45, -0.1 , -0.1 , 0.45, 0.1 , 0.1 }, - { 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }}, - - {{ -0.15, -0.5 , -0.15, 0.15, -0.45, 0.15 }, -- bend down from X/Z to Y axis - { -0.1 , -0.45, -0.1 , 0.1 , 0.1 , 0.1 }, - { -0.1 , -0.1 , -0.1 , 0.45, 0.1 , 0.1 }, - { 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }}, - - {{ -0.15, 0.45 , -0.15, 0.15, 0.5, 0.15 }, -- bend up from X/Z to Y axis - { -0.1 , -0.1 , -0.1 , 0.1 , 0.45, 0.1 }, - { -0.1 , -0.1 , -0.1 , 0.45, 0.1 , 0.1 }, - { 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }}, - - {{ -0.15, -0.15, 0.45, 0.15, 0.15, 0.5 }, -- bend between X and Z axes - { -0.1 , -0.1 , 0.1 , 0.1 , 0.1 , 0.45 }, - { -0.1 , -0.1 , -0.1 , 0.45, 0.1 , 0.1 }, - { 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }}, - - {{ -0.5 , -0.15, -0.15, -0.45, 0.15, 0.15 }, -- 4-way crossing between X and Z axes - { -0.45, -0.1 , -0.1 , 0.45, 0.1 , 0.1 }, - { 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }, - { -0.15, -0.15, -0.5 , 0.15, 0.15, -0.45 }, - { -0.1 , -0.1 , -0.45, 0.1 , 0.1 , 0.45 }, - { -0.15, -0.15, 0.45, 0.15, 0.15, 0.5 }}, - - {{ -0.15, -0.5 , -0.15, 0.15, -0.45, 0.15 }, -- 4-way crossing between X/Z and Y axes - { -0.1 , -0.45, -0.1 , 0.1 , 0.45, 0.1 }, - { -0.15, 0.45, -0.15, 0.15, 0.5 , 0.15 }, - { -0.5 , -0.15, -0.15, -0.45, 0.15, 0.15 }, - { -0.45, -0.1 , -0.1 , 0.45, 0.1 , 0.1 }, - { 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }}, - - {{ -0.5 , -0.15, -0.15, -0.45, 0.15, 0.15 }, -- 6-way crossing (all 3 axes) - { -0.45, -0.1 , -0.1 , 0.45, 0.1 , 0.1 }, - { 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }, - { -0.15, -0.15, -0.5 , 0.15, 0.15, -0.45 }, - { -0.1 , -0.1 , -0.45, 0.1 , 0.1 , 0.45 }, - { -0.15, -0.15, 0.45, 0.15, 0.15, 0.5 }, - { -0.15, -0.5 , -0.15, 0.15, -0.45, 0.15 }, - { -0.1 , -0.45, -0.1 , 0.1 , 0.45, 0.1 }, - { -0.15, 0.45, -0.15, 0.15, 0.5 , 0.15 }}, - - {{ -0.3 , -0.15, -0.15, -0.25, 0.15, 0.15 }, -- main center segment - { -0.25, -0.1 , -0.1 , 0.25, 0.1 , 0.1 }, - { 0.25, -0.15, -0.15, 0.3 , 0.15, 0.15 }}, - - {{ -0.5, -0.15, -0.15, -0.45, 0.15, 0.15 }, -- anchored at -X - { -0.45, -0.1, -0.1, -0.2, 0.1, 0.1 }, - { -0.2, -0.15, -0.15, -0.15, 0.15, 0.15 }, - { -0.15, -0.12, -0.12, -0.1, 0.12, 0.12 }, - { -0.1, -0.08, -0.08, -0.05, 0.08, 0.08 }, - { -0.05, -0.04, -0.04, 0, 0.04, 0.04 }}, - - {{ 0.45, -0.15, -0.15, 0.5, 0.15, 0.15 }, -- anchored at +X - { 0.2, -0.1, -0.1, 0.45, 0.1, 0.1 }, - { 0.15, -0.15, -0.15, 0.2, 0.15, 0.15 }, - { 0.1, -0.12, -0.12, 0.15, 0.12, 0.12 }, - { 0.05, -0.08, -0.08, 0.1, 0.08, 0.08 }, - { 0, -0.04, -0.04, 0.05, 0.04, 0.04 }}, - - {{ -0.15, -0.5, -0.15, 0.15, -0.45, 0.15 }, -- anchored at -Y - { -0.1, -0.45, -0.1, 0.1, -0.2, 0.1 }, - { -0.15, -0.2, -0.15, 0.15, -0.15, 0.15 }, - { -0.12, -0.15, -0.12, 0.12, -0.1, 0.12 }, - { -0.08, -0.1, -0.08, 0.08, -0.05, 0.08 }, - { -0.04, -0.05, -0.04, 0.04, 0, 0.04 }}, - - {{ -0.15, 0.45, -0.15, 0.15, 0.5, 0.15 }, -- anchored at +Y - { -0.1, 0.2, -0.1, 0.1, 0.45, 0.1 }, - { -0.15, 0.15, -0.15, 0.15, 0.2, 0.15 }, - { -0.12, 0.1, -0.12, 0.12, 0.15, 0.12 }, - { -0.08, 0.05, -0.08, 0.08, 0.1, 0.08 } , - { -0.04, 0, -0.04, 0.04, 0.05, 0.04 }}, - - {{ -0.15, -0.15, -0.5, 0.15, 0.15, -0.45 }, -- anchored at -Z - { -0.1, -0.1, -0.45, 0.1, 0.1, -0.2 }, - { -0.15, -0.15, -0.2, 0.15, 0.15, -0.15 }, - { -0.12, -0.12, -0.15, 0.12, 0.12, -0.1 }, - { -0.08, -0.08, -0.1, 0.08, 0.08, -0.05 }, - { -0.04, -0.04, -0.05, 0.04, 0.04, 0 }}, - - {{ -0.15, -0.15, 0.45, 0.15, 0.15, 0.5 }, -- anchored at +Z - { -0.1, -0.1, 0.2, 0.1, 0.1, 0.45 }, - { -0.15, -0.15, 0.15, 0.15, 0.15, 0.2 }, - { -0.12, -0.12, 0.1, 0.12, 0.12, 0.15 }, - { -0.08, -0.08, 0.05, 0.08, 0.08, 0.1 }, - { -0.04, -0.04, 0, 0.04, 0.04, 0.05 }}, +valvehandle_off = { + { -1/16, 4/16, -5/16, 1/16, 5/16, 0 } } -function fix_image_names(node, replacement) + +-- Local Functions + +local dbg = function(s) + if DEBUG == 1 then + print('[PIPEWORKS] ' .. s) + end +end + +function fix_newpipe_names(table, replacement) outtable={} - for i in ipairs(nodeimages[node]) do - outtable[i]=string.gsub(nodeimages[node][i], "_XXXXX", replacement) + for i in ipairs(table) do + outtable[i]=string.gsub(table[i], "_XXXXX", replacement) end return outtable end --- Now define the actual nodes +local function 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 +for xp = 0, 1 do +for ym = 0, 1 do +for yp = 0, 1 do +for zm = 0, 1 do +for zp = 0, 1 do + outboxes = {} + outsel = {} + outimgs = {} + if yp==1 then + addbox(outboxes, topstub) + table.insert(outsel, 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]) + 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]) + 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]) + 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]) + 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]) + table.insert(outimgs, "pipeworks_pipe_end.png") + else + table.insert(outimgs, "pipeworks_plain.png") + end + + jx = xp+xm + jy = yp+ym + jz = zp+zm + + 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) + end + + if (jx==2 and jy~=2 and jz~=2) then + table.remove(outimgs, 5) + table.remove(outimgs, 5) + table.insert(outimgs, 5, "pipeworks_windowed_XXXXX.png") + table.insert(outimgs, 5, "pipeworks_windowed_XXXXX.png") + end + + if (jx~=2 and jy~=2 and jz==2) or (jx~=2 and jy==2 and jz~=2) then + table.remove(outimgs, 3) + table.remove(outimgs, 3) + table.insert(outimgs, 3, "pipeworks_windowed_XXXXX.png") + table.insert(outimgs, 3, "pipeworks_windowed_XXXXX.png") + end + + pname = xm..xp..ym..yp..zm..zp -for node in ipairs(nodenames) do - minetest.register_node("pipeworks:"..nodenames[node], { - description = "Empty Pipe ("..descriptions[node]..")", + minetest.register_node("pipeworks:pipe_"..pname.."_empty", { + description = "Pipe segment (empty, "..pname..").", drawtype = "nodebox", - tiles = fix_image_names(node, "_empty"), + tiles = fix_newpipe_names(outimgs, "_empty"), paramtype = "light", - paramtype2 = "facedir", selection_box = { - type = "fixed", - fixed = selectionboxes[node], + type = "fixed", + fixed = outsel }, node_box = { type = "fixed", - fixed = nodeboxes[node] + fixed = outboxes }, groups = {snappy=3, pipe=1}, sounds = default.node_sound_wood_defaults(), walkable = true, stack_max = 99, - drop = "pipeworks:pipe" + 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") + 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") + end }) - minetest.register_node("pipeworks:"..nodenames[node].."_loaded", { - description = "Loaded Pipe ("..descriptions[node]..")", + minetest.register_node("pipeworks:pipe_"..pname.."_loaded", { + description = "Pipe segment (loaded, "..pname..").", drawtype = "nodebox", - tiles = fix_image_names(node, "_loaded"), + tiles = fix_newpipe_names(outimgs, "_loaded"), paramtype = "light", - paramtype2 = "facedir", selection_box = { - type = "fixed", - fixed = selectionboxes[node], - }, + type = "fixed", + fixed = outsel + }, node_box = { type = "fixed", - fixed = nodeboxes[node] + fixed = outboxes }, groups = {snappy=3, pipe=1}, sounds = default.node_sound_wood_defaults(), walkable = true, stack_max = 99, - drop = "pipeworks:pipe" + 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") + 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") + end }) end +end +end +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}, + 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}, + 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) print("Pipeworks loaded!") diff --git a/oldpipes.lua b/oldpipes.lua new file mode 100644 index 0000000..876fc24 --- /dev/null +++ b/oldpipes.lua @@ -0,0 +1,353 @@ +-- This file is basically most of the old init.lua and only supplies the +-- old nodes created by the previous verison of Pipeworks. +-- +-- License: WTFPL +-- + +local nodenames = { + "vertical", + "horizontal", + "junction_xy", + "junction_xz", + "bend_xy_down", + "bend_xy_up", + "bend_xz", + "crossing_xz", + "crossing_xy", + "crossing_xyz", + "pipe", + "cap_neg_x", + "cap_pos_x", + "cap_neg_y", + "cap_pos_y", + "cap_neg_z", + "cap_pos_z" +} + +local descriptions = { + "vertical", + "horizontal", + "junction between X and Y axes", + "junction between X and Z axes", + "downward bend between X and Y axes", + "upward bend between X and Y axes", + "bend between X/Z axes", + "4-way crossing between X and Z axes", + "4-way crossing between X/Z and Y axes", + "6-way crossing", + "basic segment", + "capped, negative X half only", + "capped, positive X half only", + "capped, negative Y half only", + "capped, positive Y half only", + "capped, negative Z half only", + "capped, positive Z half only" +} + +local nodeimages = { + {"pipeworks_pipe_end.png", + "pipeworks_pipe_end.png", + "pipeworks_plain.png", + "pipeworks_plain.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png"}, + + {"pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_pipe_end.png", + "pipeworks_pipe_end.png", + "pipeworks_plain.png", + "pipeworks_plain.png"}, + + {"pipeworks_pipe_end.png", + "pipeworks_pipe_end.png", + "pipeworks_pipe_end.png", + "pipeworks_plain.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png"}, + + {"pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_pipe_end.png", + "pipeworks_pipe_end.png", + "pipeworks_pipe_end.png", + "pipeworks_plain.png"}, + + {"pipeworks_plain.png", + "pipeworks_pipe_end.png", + "pipeworks_pipe_end.png", + "pipeworks_plain.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png"}, + + {"pipeworks_pipe_end.png", + "pipeworks_plain.png", + "pipeworks_pipe_end.png", + "pipeworks_plain.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png"}, + + {"pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_pipe_end.png", + "pipeworks_plain.png", + "pipeworks_pipe_end.png", + "pipeworks_plain.png"}, + + {"pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_pipe_end.png", + "pipeworks_pipe_end.png", + "pipeworks_pipe_end.png", + "pipeworks_pipe_end.png"}, + + {"pipeworks_pipe_end.png", + "pipeworks_pipe_end.png", + "pipeworks_pipe_end.png", + "pipeworks_pipe_end.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png"}, + + {"pipeworks_pipe_end.png", + "pipeworks_pipe_end.png", + "pipeworks_pipe_end.png", + "pipeworks_pipe_end.png", + "pipeworks_pipe_end.png", + "pipeworks_pipe_end.png"}, + +-- horizontal short segment + + {"pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_pipe_end.png", + "pipeworks_pipe_end.png", + "pipeworks_plain.png", + "pipeworks_plain.png"}, + +-- capped + + {"pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_pipe_end.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png"}, + + {"pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_pipe_end.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png"}, + + {"pipeworks_windowed_XXXXX.png", + "pipeworks_pipe_end.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png"}, + + {"pipeworks_pipe_end.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png"}, + + {"pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_pipe_end.png"}, + + {"pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_windowed_XXXXX.png", + "pipeworks_pipe_end.png", + "pipeworks_windowed_XXXXX.png"}, +} + +local selectionboxes = { + { -0.15, -0.5, -0.15, 0.15, 0.5, 0.15 }, + { -0.5, -0.15, -0.15, 0.5, 0.15, 0.15 }, + { -0.15, -0.5, -0.15, 0.5, 0.5, 0.15 }, + { -0.5, -0.15, -0.15, 0.5, 0.15, 0.5 }, + { -0.15, -0.5, -0.15, 0.5, 0.15, 0.15 }, + { -0.15, -0.15, -0.15, 0.5, 0.5, 0.15 }, + { -0.15, -0.15, -0.15, 0.5, 0.15, 0.5 }, + { -0.5, -0.15, -0.5, 0.5, 0.15, 0.5 }, + { -0.5, -0.5, -0.15, 0.5, 0.5, 0.15 }, + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -0.3, -0.15, -0.15, 0.3, 0.15, 0.15 }, + { -0.5, -0.15, -0.15, 0, 0.15, 0.15 }, + { 0, -0.15, -0.15, 0.5, 0.15, 0.15 }, + { -0.15, -0.5, -0.15, 0.15, 0, 0.15 }, + { -0.15, 0, -0.15, 0.15, 0.5, 0.15 }, + { -0.15, -0.15, -0.5, 0.15, 0.15, 0 }, + { -0.15, -0.15, 0, 0.15, 0.15, 0.5 }, +} + +local nodeboxes = { + {{ -0.15, -0.5 , -0.15, 0.15, -0.45, 0.15 }, -- vertical + { -0.1 , -0.45, -0.1 , 0.1 , 0.45, 0.1 }, + { -0.15, 0.45, -0.15, 0.15, 0.5 , 0.15 }}, + + {{ -0.5 , -0.15, -0.15, -0.45, 0.15, 0.15 }, -- horizontal + { -0.45, -0.1 , -0.1 , 0.45, 0.1 , 0.1 }, + { 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }}, + + {{ -0.15, -0.5 , -0.15, 0.15, -0.45, 0.15 }, -- vertical with X/Z junction + { -0.1 , -0.45, -0.1 , 0.1 , 0.45, 0.1 }, + { -0.15, 0.45, -0.15, 0.15, 0.5 , 0.15 }, + { 0.1 , -0.1 , -0.1 , 0.45, 0.1 , 0.1 }, + { 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }}, + + {{ -0.15, -0.15, 0.45, 0.15, 0.15, 0.5 }, -- horizontal with X/Z junction + { -0.1 , -0.1 , 0.1 , 0.1 , 0.1 , 0.45 }, + { -0.5 , -0.15, -0.15, -0.45, 0.15, 0.15 }, + { -0.45, -0.1 , -0.1 , 0.45, 0.1 , 0.1 }, + { 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }}, + + {{ -0.15, -0.5 , -0.15, 0.15, -0.45, 0.15 }, -- bend down from X/Z to Y axis + { -0.1 , -0.45, -0.1 , 0.1 , 0.1 , 0.1 }, + { -0.1 , -0.1 , -0.1 , 0.45, 0.1 , 0.1 }, + { 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }}, + + {{ -0.15, 0.45 , -0.15, 0.15, 0.5, 0.15 }, -- bend up from X/Z to Y axis + { -0.1 , -0.1 , -0.1 , 0.1 , 0.45, 0.1 }, + { -0.1 , -0.1 , -0.1 , 0.45, 0.1 , 0.1 }, + { 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }}, + + {{ -0.15, -0.15, 0.45, 0.15, 0.15, 0.5 }, -- bend between X and Z axes + { -0.1 , -0.1 , 0.1 , 0.1 , 0.1 , 0.45 }, + { -0.1 , -0.1 , -0.1 , 0.45, 0.1 , 0.1 }, + { 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }}, + + {{ -0.5 , -0.15, -0.15, -0.45, 0.15, 0.15 }, -- 4-way crossing between X and Z axes + { -0.45, -0.1 , -0.1 , 0.45, 0.1 , 0.1 }, + { 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }, + { -0.15, -0.15, -0.5 , 0.15, 0.15, -0.45 }, + { -0.1 , -0.1 , -0.45, 0.1 , 0.1 , 0.45 }, + { -0.15, -0.15, 0.45, 0.15, 0.15, 0.5 }}, + + {{ -0.15, -0.5 , -0.15, 0.15, -0.45, 0.15 }, -- 4-way crossing between X/Z and Y axes + { -0.1 , -0.45, -0.1 , 0.1 , 0.45, 0.1 }, + { -0.15, 0.45, -0.15, 0.15, 0.5 , 0.15 }, + { -0.5 , -0.15, -0.15, -0.45, 0.15, 0.15 }, + { -0.45, -0.1 , -0.1 , 0.45, 0.1 , 0.1 }, + { 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }}, + + {{ -0.5 , -0.15, -0.15, -0.45, 0.15, 0.15 }, -- 6-way crossing (all 3 axes) + { -0.45, -0.1 , -0.1 , 0.45, 0.1 , 0.1 }, + { 0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }, + { -0.15, -0.15, -0.5 , 0.15, 0.15, -0.45 }, + { -0.1 , -0.1 , -0.45, 0.1 , 0.1 , 0.45 }, + { -0.15, -0.15, 0.45, 0.15, 0.15, 0.5 }, + { -0.15, -0.5 , -0.15, 0.15, -0.45, 0.15 }, + { -0.1 , -0.45, -0.1 , 0.1 , 0.45, 0.1 }, + { -0.15, 0.45, -0.15, 0.15, 0.5 , 0.15 }}, + + {{ -0.3 , -0.15, -0.15, -0.25, 0.15, 0.15 }, -- main center segment + { -0.25, -0.1 , -0.1 , 0.25, 0.1 , 0.1 }, + { 0.25, -0.15, -0.15, 0.3 , 0.15, 0.15 }}, + + {{ -0.5, -0.15, -0.15, -0.45, 0.15, 0.15 }, -- anchored at -X + { -0.45, -0.1, -0.1, -0.2, 0.1, 0.1 }, + { -0.2, -0.15, -0.15, -0.15, 0.15, 0.15 }, + { -0.15, -0.12, -0.12, -0.1, 0.12, 0.12 }, + { -0.1, -0.08, -0.08, -0.05, 0.08, 0.08 }, + { -0.05, -0.04, -0.04, 0, 0.04, 0.04 }}, + + {{ 0.45, -0.15, -0.15, 0.5, 0.15, 0.15 }, -- anchored at +X + { 0.2, -0.1, -0.1, 0.45, 0.1, 0.1 }, + { 0.15, -0.15, -0.15, 0.2, 0.15, 0.15 }, + { 0.1, -0.12, -0.12, 0.15, 0.12, 0.12 }, + { 0.05, -0.08, -0.08, 0.1, 0.08, 0.08 }, + { 0, -0.04, -0.04, 0.05, 0.04, 0.04 }}, + + {{ -0.15, -0.5, -0.15, 0.15, -0.45, 0.15 }, -- anchored at -Y + { -0.1, -0.45, -0.1, 0.1, -0.2, 0.1 }, + { -0.15, -0.2, -0.15, 0.15, -0.15, 0.15 }, + { -0.12, -0.15, -0.12, 0.12, -0.1, 0.12 }, + { -0.08, -0.1, -0.08, 0.08, -0.05, 0.08 }, + { -0.04, -0.05, -0.04, 0.04, 0, 0.04 }}, + + {{ -0.15, 0.45, -0.15, 0.15, 0.5, 0.15 }, -- anchored at +Y + { -0.1, 0.2, -0.1, 0.1, 0.45, 0.1 }, + { -0.15, 0.15, -0.15, 0.15, 0.2, 0.15 }, + { -0.12, 0.1, -0.12, 0.12, 0.15, 0.12 }, + { -0.08, 0.05, -0.08, 0.08, 0.1, 0.08 } , + { -0.04, 0, -0.04, 0.04, 0.05, 0.04 }}, + + {{ -0.15, -0.15, -0.5, 0.15, 0.15, -0.45 }, -- anchored at -Z + { -0.1, -0.1, -0.45, 0.1, 0.1, -0.2 }, + { -0.15, -0.15, -0.2, 0.15, 0.15, -0.15 }, + { -0.12, -0.12, -0.15, 0.12, 0.12, -0.1 }, + { -0.08, -0.08, -0.1, 0.08, 0.08, -0.05 }, + { -0.04, -0.04, -0.05, 0.04, 0.04, 0 }}, + + {{ -0.15, -0.15, 0.45, 0.15, 0.15, 0.5 }, -- anchored at +Z + { -0.1, -0.1, 0.2, 0.1, 0.1, 0.45 }, + { -0.15, -0.15, 0.15, 0.15, 0.15, 0.2 }, + { -0.12, -0.12, 0.1, 0.12, 0.12, 0.15 }, + { -0.08, -0.08, 0.05, 0.08, 0.08, 0.1 }, + { -0.04, -0.04, 0, 0.04, 0.04, 0.05 }}, +} + +function fix_image_names(node, replacement) + outtable={} + for i in ipairs(nodeimages[node]) do + outtable[i]=string.gsub(nodeimages[node][i], "_XXXXX", replacement) + end + + return outtable +end + +-- Now define the actual nodes + +for node in ipairs(nodenames) do + minetest.register_node("pipeworks:"..nodenames[node], { + description = "Empty Pipe ("..descriptions[node]..")", + drawtype = "nodebox", + tiles = fix_image_names(node, "_empty"), + paramtype = "light", + paramtype2 = "facedir", + selection_box = { + type = "fixed", + fixed = selectionboxes[node], + }, + node_box = { + type = "fixed", + fixed = nodeboxes[node] + }, + groups = {snappy=3, pipe=1}, + sounds = default.node_sound_wood_defaults(), + walkable = true, + stack_max = 99, + drop = "pipeworks:pipe" + }) + + minetest.register_node("pipeworks:"..nodenames[node].."_loaded", { + description = "Loaded Pipe ("..descriptions[node]..")", + drawtype = "nodebox", + tiles = fix_image_names(node, "_loaded"), + paramtype = "light", + paramtype2 = "facedir", + selection_box = { + type = "fixed", + fixed = selectionboxes[node], + }, + node_box = { + type = "fixed", + fixed = nodeboxes[node] + }, + groups = {snappy=3, pipe=1}, + sounds = default.node_sound_wood_defaults(), + walkable = true, + stack_max = 99, + drop = "pipeworks:pipe" + }) +end + diff --git a/textures/pipeworks_pipe_end.png b/textures/pipeworks_pipe_end.png index 61ec0a1ff19cf521052c6039adeece9531c17d60..cb0e4b9b3a2d394586972548b46aaf114ad7a860 100644 GIT binary patch delta 2143 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 ZW={fAmgakHrbYk&002ovPDHLkV1m_7d;S0b diff --git a/textures/pipeworks_pump_ends.png b/textures/pipeworks_pump_ends.png new file mode 100644 index 0000000000000000000000000000000000000000..a76aea10162ee46acce63fadc747e8a773664bd9 GIT binary patch literal 6410 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 literal 0 HcmV?d00001 diff --git a/textures/pipeworks_pump_off.png b/textures/pipeworks_pump_off.png new file mode 100644 index 0000000000000000000000000000000000000000..4705a9a391ee9455eca2f12c1ff354822e7c071b GIT binary patch literal 5185 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 literal 0 HcmV?d00001 diff --git a/textures/pipeworks_valvebody_bottom.png b/textures/pipeworks_valvebody_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..05f20e37dbc285a7895eb25efc037342830fb796 GIT binary patch literal 5321 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 literal 0 HcmV?d00001 diff --git a/textures/pipeworks_valvebody_ends.png b/textures/pipeworks_valvebody_ends.png new file mode 100644 index 0000000000000000000000000000000000000000..2bc3ecbd730ff4697034cc5084489b1a6361cdd6 GIT binary patch literal 6138 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 aLGXWXcye`3*oN2u000000009a7bBm000XU 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 literal 0 HcmV?d00001 diff --git a/textures/pipeworks_valvebody_top_on.png b/textures/pipeworks_valvebody_top_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e36eb94a2e31443c0b0bf6b89f8ef86baa483341 GIT binary patch literal 4559 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 delta 315 zcmV-B0mS~956=Q2iBL{Q4GJ0x0000DNk~Le0000G0000G2m$~A0FaSrHjyD8e+C!; z1SIRK-SGeb0PaadK~yNujgnE0gD?z4RWOkq@!vf*N8lJe5*L7(L?HGf3DA_THXlx6 zJ$sx{9{av;+XjFnN#sQm>6!xxAjT*M4FXHva|U1tC4m^Db52-jE~h{`g+KtQAja6a z&demM6`E&n5bIC0M>P_XjN^B zcPVCi9LHf8+P1CetPn0WNnx6%=g-s3Dq2+^uh(l?mTXD!TSQc~@B4}_3V{p3J5Q>3 zvGt^#_jXIG>YJ^l_g6Y8G{>*{W0Hf;3je27Rbq^;bM|GD>H#A13pdM?5z+R1>CpfH N002ovPDHLkV1nuwgzf+U diff --git a/textures/pipeworks_windowed_loaded.png b/textures/pipeworks_windowed_loaded.png index e6ceb2a00c696cbe529b681007b696e30482e98c..91c4829eb6d1f135c6e91057a492677acdfe5125 100644 GIT binary patch delta 1942 zcmV;H2Wj}(0-g^ciBL{Q4GJ0x0000DNk~Le0000$0000$2m$~A03{3NiIE{6e+Uu` z5GRG2{C@xd2R%tdK~!ko&00&c+%^m(0D9>QxV*~Ad=?+gr^zDm#+8+YMi$@){Afn= zd8v$D&mKOBYJxzc0gB8lrIb=KGa@oGGsDe~s@@({1)xyCHrJ@aY93T5eHo=Js34!ib1c z$}@U}8QcYm0SwT?zrxpMhBmL8N==Jz_zVg)_lWw`zJbyF%df`uEEl)!e)HE}<_A=uYppR}?7Cr|Tq}C)JUHwO;|l z?Bxno_bt1LzFm9)Ju_#RrRoW8ZmUCjz_8y_kCTeFg`Jt|;Spy$&$)>Hn(ak|nX^?! zDh!g$k|`7iV5jreNI0tBf2)-k^eCLsm-w*8hhhECq8AY&%76k1dH_htI(^_|-b!#S zj@ueKK`#cz;P@UmV=Tq}3>$SDy@=$(nTF2pQ0STGxTQ^TG#2s=Q0+Um5X;~?jW7dx zY~AcGdS=dzj2q%JE-R1mC&NY#JuKKB!;JuJ@p~+sQ%5eN_b|=?e_%*vTHxQZ{op3$ z7k1z;rLSt!JaQ{cJ&u zCYkEI7SmZbQ*--(vaEi{R#>vt&8WSStwcDW_pi)c7NFK~Y<#q>2Se2El>)Z8c8%Hx z`Cf#H+8X?8VQVU0q{h(3pDMs;wra&~@D# z81n>uxrT_GMi=ReC9DH_>;v(p&Uw=BPiM?N_(_2yr_`b z9fqstOz4G(Stz0pEQF{-G1+)_?zh&pax>SCgMEaEdp%H^5~UHO$1!gDsm@td_fiDE z0X@gTu^6a{OgqS-TNY9(W~H!E-KRzH74%s$Ux?bcf7Fr(ie>@SS!k^cP4&1?8IGRw zsO?#pofmhExuPc`CMKa=n8#F)()o;hf2%UQ=l9?ByZti#TfhGP`t6TzcRhzUQMf`=}UKd(+TW{We@h!wtdX^p)cJEKVYiO-CZXT+tY^&oxrIZMPqUG z7W9&tiL00kXaBpXZLOK2Y ze^65D-1>YxYWbv>CLe;HC3YohNvZlG=kWbr+S7jT7I%5-BlVUV#KXztQ{AXHq91sy zM6E>hJ`zr7LdX22Q@1zSzVn#dK6k%&OZkYeB%__wKl+x%mD=jGr*Ow}c*N?)n)L`V z3opGKTPzS6(HXM2i! zHMQId`o;s*9I{`)CEG{z_xPUg`hAd;etC@Af}V*;vhN0;esWdQ_Hb?WBIod+fA3q^ z6rJPylf#L?@}Z`MrjyY7XNIp=hM_nf+W*`lfwC{--1aVp^3-b>(T50|l){UZVKqT* zBuWv;5=WYqPrwhaoMCHw{s^ToGXV<;F*UxIz+tE8YqU^SSgLPc{)csKxQsh`VQDSh zE9lLvytVi!dal{!IrO~=O@Z&FY|_#-+dJm+-e|9_M%;CmhmK^$A5J9vdvVPv%wo^H zj13lNlwVMC(G^*EGJK&_AiII|vjnH`W_cS`*p2QDKC_-}sh9 cN1syq7pGJ?dPPYj(*OVf07*qoM6N<$frSLvSo?+C;!NPwYq zG+8)__3ZC_Hlt9LE0bc|-Es)F6Bv?G!3@3fi82@MQs05Fc@ zfmYR~dbdOekcRZ|$NhPis~qT};JX@kPe`xt*X`@J=hk@X`#z;qEUA9WRn)ZWy7wAc zJV^x4JUPUjts5O;v{PDDRkc}Ns=Ytbi$b&hsy`-K>7wv|T2&?I9NJ(X8zwnCKtz53 X5uB7(KU(q+00000NkvXXu0mjf7x;@U -- 2.30.2