From 856072273cfff7490005caf4b6d19b3537d05230 Mon Sep 17 00:00:00 2001 From: HybridDog Date: Wed, 28 May 2014 22:53:48 +0200 Subject: [PATCH] update some more mods --- mods/pipeworks/LICENSE | 17 + mods/pipeworks/README | 20 +- mods/pipeworks/autocrafter.lua | 157 ++- mods/pipeworks/autoplace.lua | 234 ----- mods/pipeworks/autoplace_pipes.lua | 200 ++++ mods/pipeworks/autoplace_tubes.lua | 168 +++ mods/pipeworks/compat.lua | 306 +++--- mods/pipeworks/crafts.lua | 459 ++++++--- mods/pipeworks/default_settings.txt | 18 + mods/pipeworks/depends.txt | 3 +- mods/pipeworks/deployer.lua | 278 +++-- mods/pipeworks/devices.lua | 644 ++++++++---- mods/pipeworks/flowing_logic.lua | 136 +-- mods/pipeworks/init.lua | 394 ++----- mods/pipeworks/item_transport.lua | 676 +++++++----- mods/pipeworks/models.lua | 202 ++++ mods/pipeworks/node_breaker.lua | 412 ++++++-- mods/pipeworks/oldpipes.lua | 360 ------- mods/pipeworks/pipes.lua | 226 ++++ mods/pipeworks/teleport_tube.lua | 168 ++- .../pipeworks/textures/default_chest_side.png | Bin 691 -> 0 bytes .../textures/default_furnace_side.png | Bin 688 -> 0 bytes .../textures/homedecor_plastic_base.png | Bin 0 -> 440 bytes .../textures/homedecor_plastic_base_inv.png | Bin 0 -> 569 bytes .../textures/homedecor_plastic_sheeting.png | Bin 0 -> 169 bytes .../pipeworks_accelerator_tube_end.png | Bin 2836 -> 1272 bytes .../pipeworks_accelerator_tube_inv.png | Bin 1295 -> 721 bytes .../pipeworks_accelerator_tube_noctr.png | Bin 2182 -> 1063 bytes .../pipeworks_accelerator_tube_plain.png | Bin 2742 -> 1240 bytes .../pipeworks_accelerator_tube_short.png | Bin 1378 -> 690 bytes .../textures/pipeworks_autocrafter.png | Bin 167 -> 163 bytes mods/pipeworks/textures/pipeworks_black.png | Bin 150 -> 100 bytes mods/pipeworks/textures/pipeworks_blue.png | Bin 160 -> 100 bytes .../textures/pipeworks_conductor_tube_end.png | Bin 0 -> 2805 bytes .../textures/pipeworks_conductor_tube_inv.png | Bin 0 -> 2067 bytes .../pipeworks_conductor_tube_noctr.png | Bin 0 -> 2133 bytes .../pipeworks_conductor_tube_on_end.png | Bin 0 -> 2778 bytes .../pipeworks_conductor_tube_on_noctr.png | Bin 0 -> 2113 bytes .../pipeworks_conductor_tube_on_plain.png | Bin 0 -> 2657 bytes .../pipeworks_conductor_tube_plain.png | Bin 0 -> 2596 bytes .../pipeworks_conductor_tube_short.png | Bin 0 -> 1192 bytes .../textures/pipeworks_crossing_tube_end.png | Bin 0 -> 1438 bytes .../textures/pipeworks_crossing_tube_inv.png | Bin 0 -> 1263 bytes .../pipeworks_crossing_tube_noctr.png | Bin 0 -> 1236 bytes .../pipeworks_crossing_tube_plain.png | Bin 0 -> 1718 bytes .../pipeworks_crossing_tube_short.png | Bin 0 -> 755 bytes .../textures/pipeworks_deployer_back.png | Bin 757 -> 512 bytes .../textures/pipeworks_deployer_bottom.png | Bin 835 -> 819 bytes .../textures/pipeworks_deployer_front_off.png | Bin 800 -> 685 bytes .../textures/pipeworks_deployer_front_on.png | Bin 719 -> 560 bytes .../textures/pipeworks_deployer_side.png | Bin 908 -> 841 bytes .../textures/pipeworks_deployer_side1.png | Bin 908 -> 841 bytes .../textures/pipeworks_deployer_side2.png | Bin 910 -> 841 bytes .../textures/pipeworks_deployer_top.png | Bin 842 -> 819 bytes .../textures/pipeworks_detector_tube_end.png | Bin 2577 -> 1393 bytes .../textures/pipeworks_detector_tube_inv.png | Bin 1267 -> 853 bytes .../pipeworks_detector_tube_noctr.png | Bin 1979 -> 1169 bytes .../pipeworks_detector_tube_plain.png | Bin 2583 -> 1586 bytes .../pipeworks_detector_tube_short.png | Bin 1248 -> 760 bytes .../textures/pipeworks_filter_input.png | Bin 12686 -> 210 bytes .../textures/pipeworks_filter_output.png | Bin 13205 -> 193 bytes .../textures/pipeworks_filter_side.png | Bin 13194 -> 212 bytes .../textures/pipeworks_filter_top.png | Bin 13137 -> 212 bytes .../textures/pipeworks_fountainhead_top.png | Bin 0 -> 1814 bytes .../textures/pipeworks_grating_sides.png | Bin 6739 -> 4498 bytes .../textures/pipeworks_grating_top.png | Bin 7121 -> 4452 bytes mods/pipeworks/textures/pipeworks_green.png | Bin 160 -> 100 bytes .../textures/pipeworks_mese_filter_input.png | Bin 0 -> 210 bytes .../textures/pipeworks_mese_filter_output.png | Bin 0 -> 193 bytes .../textures/pipeworks_mese_filter_side.png | Bin 0 -> 212 bytes .../textures/pipeworks_mese_filter_top.png | Bin 0 -> 212 bytes .../textures/pipeworks_mese_sand_tube_end.png | Bin 0 -> 1191 bytes .../textures/pipeworks_mese_sand_tube_inv.png | Bin 0 -> 699 bytes .../pipeworks_mese_sand_tube_noctr.png | Bin 0 -> 983 bytes .../pipeworks_mese_sand_tube_plain.png | Bin 0 -> 2464 bytes .../pipeworks_mese_sand_tube_short.png | Bin 0 -> 628 bytes .../textures/pipeworks_mese_tube_end.png | Bin 2532 -> 1272 bytes .../textures/pipeworks_mese_tube_inv.png | Bin 1212 -> 721 bytes .../textures/pipeworks_mese_tube_noctr_1.png | Bin 2063 -> 1131 bytes .../textures/pipeworks_mese_tube_noctr_2.png | Bin 2011 -> 1136 bytes .../textures/pipeworks_mese_tube_noctr_3.png | Bin 2055 -> 1135 bytes .../textures/pipeworks_mese_tube_noctr_4.png | Bin 2056 -> 1136 bytes .../textures/pipeworks_mese_tube_noctr_5.png | Bin 2059 -> 1136 bytes .../textures/pipeworks_mese_tube_noctr_6.png | Bin 2056 -> 1136 bytes .../textures/pipeworks_mese_tube_plain_1.png | Bin 2464 -> 1314 bytes .../textures/pipeworks_mese_tube_plain_2.png | Bin 2468 -> 1319 bytes .../textures/pipeworks_mese_tube_plain_3.png | Bin 2501 -> 1320 bytes .../textures/pipeworks_mese_tube_plain_4.png | Bin 2484 -> 1314 bytes .../textures/pipeworks_mese_tube_plain_5.png | Bin 2497 -> 1314 bytes .../textures/pipeworks_mese_tube_plain_6.png | Bin 2499 -> 1320 bytes .../textures/pipeworks_mese_tube_short.png | Bin 1209 -> 690 bytes .../textures/pipeworks_nodebreaker_back.png | Bin 632 -> 651 bytes .../pipeworks_nodebreaker_bottom_off.png | Bin 556 -> 657 bytes .../pipeworks_nodebreaker_bottom_on.png | Bin 549 -> 660 bytes .../pipeworks_nodebreaker_front_off.png | Bin 653 -> 607 bytes .../pipeworks_nodebreaker_front_on.png | Bin 659 -> 563 bytes .../pipeworks_nodebreaker_side1_off.png | Bin 616 -> 598 bytes .../pipeworks_nodebreaker_side1_on.png | Bin 610 -> 608 bytes .../pipeworks_nodebreaker_side2_off.png | Bin 606 -> 601 bytes .../pipeworks_nodebreaker_side2_on.png | Bin 598 -> 610 bytes .../pipeworks_nodebreaker_top_off.png | Bin 556 -> 656 bytes .../textures/pipeworks_nodebreaker_top_on.png | Bin 558 -> 659 bytes .../textures/pipeworks_one_way_tube_input.png | Bin 0 -> 839 bytes .../pipeworks_one_way_tube_output.png | Bin 0 -> 839 bytes .../textures/pipeworks_one_way_tube_side.png | Bin 0 -> 1665 bytes .../textures/pipeworks_one_way_tube_top.png | Bin 0 -> 1704 bytes .../pipeworks/textures/pipeworks_pipe_end.png | Bin 338 -> 388 bytes .../textures/pipeworks_pipe_end_empty.png | Bin 331 -> 374 bytes .../textures/pipeworks_pipe_end_loaded.png | Bin 347 -> 427 bytes .../pipeworks/textures/pipeworks_pipe_inv.png | Bin 0 -> 1610 bytes mods/pipeworks/textures/pipeworks_plain.png | Bin 274 -> 330 bytes .../textures/pipeworks_plastic_sheeting.png | Bin 198 -> 169 bytes .../textures/pipeworks_pump_bottom.png | Bin 6739 -> 4498 bytes .../pipeworks/textures/pipeworks_pump_off.png | Bin 5128 -> 3621 bytes mods/pipeworks/textures/pipeworks_pump_on.png | Bin 5848 -> 3867 bytes .../textures/pipeworks_pump_sides.png | Bin 5116 -> 3742 bytes .../pipeworks/textures/pipeworks_pump_top.png | Bin 7531 -> 4504 bytes mods/pipeworks/textures/pipeworks_red.png | Bin 160 -> 100 bytes .../textures/pipeworks_sand_tube_end.png | Bin 2561 -> 1201 bytes .../textures/pipeworks_sand_tube_inv.png | Bin 1209 -> 693 bytes .../textures/pipeworks_sand_tube_noctr.png | Bin 1969 -> 1004 bytes .../textures/pipeworks_sand_tube_plain.png | Bin 2433 -> 1176 bytes .../textures/pipeworks_sand_tube_short.png | Bin 1220 -> 638 bytes .../textures/pipeworks_sensor_sides_on.png | Bin 0 -> 293 bytes .../textures/pipeworks_spigot_bottom2.png | Bin 3389 -> 2444 bytes .../textures/pipeworks_spigot_sides.png | Bin 338 -> 229 bytes .../textures/pipeworks_spigot_sides2.png | Bin 267 -> 226 bytes .../textures/pipeworks_storage_tank_back.png | Bin 483 -> 558 bytes .../pipeworks_storage_tank_fittings.png | Bin 631 -> 602 bytes .../pipeworks_storage_tank_front_0.png | Bin 5126 -> 3791 bytes .../pipeworks_storage_tank_front_1.png | Bin 586 -> 739 bytes .../pipeworks_storage_tank_front_10.png | Bin 541 -> 669 bytes .../pipeworks_storage_tank_front_2.png | Bin 581 -> 727 bytes .../pipeworks_storage_tank_front_3.png | Bin 579 -> 716 bytes .../pipeworks_storage_tank_front_4.png | Bin 582 -> 718 bytes .../pipeworks_storage_tank_front_5.png | Bin 577 -> 704 bytes .../pipeworks_storage_tank_front_6.png | Bin 576 -> 691 bytes .../pipeworks_storage_tank_front_7.png | Bin 581 -> 691 bytes .../pipeworks_storage_tank_front_8.png | Bin 581 -> 692 bytes .../pipeworks_storage_tank_front_9.png | Bin 579 -> 670 bytes .../textures/pipeworks_teleport_tube_end.png | Bin 3348 -> 1737 bytes .../textures/pipeworks_teleport_tube_inv.png | Bin 1319 -> 903 bytes .../pipeworks_teleport_tube_noctr.png | Bin 2633 -> 1487 bytes .../pipeworks_teleport_tube_plain.png | Bin 3310 -> 1716 bytes .../pipeworks_teleport_tube_short.png | Bin 1628 -> 990 bytes .../textures/pipeworks_testobject.png | Bin 4781 -> 4083 bytes .../pipeworks_tube_connection_metallic.png | Bin 0 -> 164 bytes .../pipeworks_tube_connection_stony.png | Bin 0 -> 189 bytes .../pipeworks_tube_connection_wooden.png | Bin 0 -> 180 bytes .../pipeworks/textures/pipeworks_tube_end.png | Bin 2577 -> 1393 bytes .../pipeworks/textures/pipeworks_tube_inv.png | Bin 1217 -> 752 bytes .../textures/pipeworks_tube_noctr.png | Bin 1979 -> 1169 bytes .../textures/pipeworks_tube_plain.png | Bin 2444 -> 1362 bytes .../textures/pipeworks_tube_short.png | Bin 1248 -> 760 bytes .../textures/pipeworks_tube_transparent.png | Bin 109 -> 112 bytes .../textures/pipeworks_valvebody_bottom.png | Bin 5321 -> 2914 bytes .../textures/pipeworks_valvebody_ends.png | Bin 6138 -> 3562 bytes .../textures/pipeworks_valvebody_sides.png | Bin 4592 -> 3756 bytes .../textures/pipeworks_valvebody_top_off.png | Bin 4557 -> 3538 bytes .../textures/pipeworks_valvebody_top_on.png | Bin 4559 -> 3539 bytes mods/pipeworks/textures/pipeworks_white.png | Bin 160 -> 100 bytes .../textures/pipeworks_windowed_empty.png | Bin 366 -> 388 bytes .../textures/pipeworks_windowed_loaded.png | Bin 347 -> 427 bytes mods/pipeworks/textures/pipeworks_yellow.png | Bin 160 -> 100 bytes mods/pipeworks/tubes.lua | 965 +++++++++++------- 165 files changed, 3650 insertions(+), 2393 deletions(-) create mode 100644 mods/pipeworks/LICENSE delete mode 100644 mods/pipeworks/autoplace.lua create mode 100644 mods/pipeworks/autoplace_pipes.lua create mode 100644 mods/pipeworks/autoplace_tubes.lua create mode 100644 mods/pipeworks/default_settings.txt create mode 100644 mods/pipeworks/models.lua delete mode 100644 mods/pipeworks/oldpipes.lua create mode 100644 mods/pipeworks/pipes.lua delete mode 100644 mods/pipeworks/textures/default_chest_side.png delete mode 100644 mods/pipeworks/textures/default_furnace_side.png create mode 100644 mods/pipeworks/textures/homedecor_plastic_base.png create mode 100644 mods/pipeworks/textures/homedecor_plastic_base_inv.png create mode 100644 mods/pipeworks/textures/homedecor_plastic_sheeting.png create mode 100644 mods/pipeworks/textures/pipeworks_conductor_tube_end.png create mode 100644 mods/pipeworks/textures/pipeworks_conductor_tube_inv.png create mode 100644 mods/pipeworks/textures/pipeworks_conductor_tube_noctr.png create mode 100644 mods/pipeworks/textures/pipeworks_conductor_tube_on_end.png create mode 100644 mods/pipeworks/textures/pipeworks_conductor_tube_on_noctr.png create mode 100644 mods/pipeworks/textures/pipeworks_conductor_tube_on_plain.png create mode 100644 mods/pipeworks/textures/pipeworks_conductor_tube_plain.png create mode 100644 mods/pipeworks/textures/pipeworks_conductor_tube_short.png create mode 100644 mods/pipeworks/textures/pipeworks_crossing_tube_end.png create mode 100644 mods/pipeworks/textures/pipeworks_crossing_tube_inv.png create mode 100644 mods/pipeworks/textures/pipeworks_crossing_tube_noctr.png create mode 100644 mods/pipeworks/textures/pipeworks_crossing_tube_plain.png create mode 100644 mods/pipeworks/textures/pipeworks_crossing_tube_short.png create mode 100644 mods/pipeworks/textures/pipeworks_fountainhead_top.png create mode 100644 mods/pipeworks/textures/pipeworks_mese_filter_input.png create mode 100644 mods/pipeworks/textures/pipeworks_mese_filter_output.png create mode 100644 mods/pipeworks/textures/pipeworks_mese_filter_side.png create mode 100644 mods/pipeworks/textures/pipeworks_mese_filter_top.png create mode 100644 mods/pipeworks/textures/pipeworks_mese_sand_tube_end.png create mode 100644 mods/pipeworks/textures/pipeworks_mese_sand_tube_inv.png create mode 100644 mods/pipeworks/textures/pipeworks_mese_sand_tube_noctr.png create mode 100644 mods/pipeworks/textures/pipeworks_mese_sand_tube_plain.png create mode 100644 mods/pipeworks/textures/pipeworks_mese_sand_tube_short.png create mode 100644 mods/pipeworks/textures/pipeworks_one_way_tube_input.png create mode 100644 mods/pipeworks/textures/pipeworks_one_way_tube_output.png create mode 100644 mods/pipeworks/textures/pipeworks_one_way_tube_side.png create mode 100644 mods/pipeworks/textures/pipeworks_one_way_tube_top.png create mode 100644 mods/pipeworks/textures/pipeworks_pipe_inv.png create mode 100644 mods/pipeworks/textures/pipeworks_sensor_sides_on.png create mode 100644 mods/pipeworks/textures/pipeworks_tube_connection_metallic.png create mode 100644 mods/pipeworks/textures/pipeworks_tube_connection_stony.png create mode 100644 mods/pipeworks/textures/pipeworks_tube_connection_wooden.png diff --git a/mods/pipeworks/LICENSE b/mods/pipeworks/LICENSE new file mode 100644 index 0000000..eb930e9 --- /dev/null +++ b/mods/pipeworks/LICENSE @@ -0,0 +1,17 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. + +---------- + +This license is commonly known as "WTFPL". diff --git a/mods/pipeworks/README b/mods/pipeworks/README index fb18d4f..b9c68f9 100644 --- a/mods/pipeworks/README +++ b/mods/pipeworks/README @@ -1,5 +1,7 @@ -This simple mod uses nodeboxes to supply a complete set of 3D flanged pipes, -along with "valve" and "pump" devices. +This mod uses nodeboxes to supply a complete set of 3D pipes and tubes, +along devices that work with them. + +See http://vanessae.github.io/pipeworks/ for detailed information about usage of this mod. Unlike the previous version of this mod, these pipes are rounded, and when placed, they'll automatically join together as needed. Pipes can go vertically @@ -14,21 +16,7 @@ windows, as if full (the two colors should also be easy to select if you want to change them in a paint program). These windows only appear on straight lengths and on certain junctions. -There are no crafting recipes, yet, but you can use /giveme as usual, namely -"/giveme pipeworks:pipe 999" or so, and then place them as needed. See -init.lua for more details. - -This mod is intended to be used as a basis or at least as sort of a model for -something else to build on (perhaps a nicer-looking oil mod?), and does not -provide any of the code necessary to cause anything to flow through them. Like -the pipes, the valve and pump don't do anything useful yet, but you can punch -them to turn them "on" and "off". Note that the valve and pump textures and -shapes are not yet complete (hence their boxy appearance). - This mod is a work in progress. Please note that owing to the nature of this mod, I have opted to use 64px textures. Anything less just looks terrible. - -If you don't need the old node names from the previous version of this mod, -edit init.lua and comment-out the 'dofile' line at the top. diff --git a/mods/pipeworks/autocrafter.lua b/mods/pipeworks/autocrafter.lua index ba62c79..b2e50c1 100644 --- a/mods/pipeworks/autocrafter.lua +++ b/mods/pipeworks/autocrafter.lua @@ -1,59 +1,101 @@ +local autocrafterCache = {} -- caches some recipe data to avoid to call the slow function minetest.get_craft_result() every second +local function make_inventory_cache(invlist) + local l = {} + for _, stack in ipairs(invlist) do + l[stack:get_name()] = (l[stack:get_name()] or 0) + stack:get_count() + end + return l +end -function autocraft(inventory) - local recipe=inventory:get_list("recipe") +local function autocraft(inventory, pos) + local recipe = inventory:get_list("recipe") + local recipe_last local result local new - for i=1,9 do - recipe[i]=ItemStack({name=recipe[i]:get_name(),count=1}) + + if autocrafterCache[minetest.hash_node_position(pos)] == nil then + recipe_last = {} + for i = 1, 9 do + recipe_last[i] = recipe[i] + recipe[i] = ItemStack({name = recipe[i]:get_name(), count = 1}) + end + result, new = minetest.get_craft_result({method = "normal", width = 3, items = recipe}) + autocrafterCache[minetest.hash_node_position(pos)] = {["recipe"] = recipe, ["result"] = result, ["new"] = new} + else + local autocrafterCacheEntry = autocrafterCache[minetest.hash_node_position(pos)] + recipe_last = autocrafterCacheEntry["recipe"] + result = autocrafterCacheEntry["result"] + new = autocrafterCacheEntry["new"] + local recipeUnchanged = true + for i = 1, 9 do + if recipe[i]:get_name() ~= recipe_last[i]:get_name() then + recipeUnchanged = false + break + end + if recipe[i]:get_count() ~= recipe_last[i]:get_count() then + recipeUnchanged = false + break + end + end + if recipeUnchanged then + else + for i = 1, 9 do + recipe_last[i] = recipe[i] + recipe[i] = ItemStack({name = recipe[i]:get_name(), count = 1}) + end + result, new = minetest.get_craft_result({method = "normal", width = 3, items = recipe}) + autocrafterCache[minetest.hash_node_position(pos)] = {["recipe"] = recipe, ["result"] = result, ["new"] = new} + end end - result,new=minetest.get_craft_result({method="normal",width=3,items=recipe}) - local input=inventory:get_list("input") + if result.item:is_empty() then return end - result=result.item - local to_use={} - for _,item in ipairs(recipe) do - if item~=nil and not item:is_empty() then - if to_use[item:get_name()]==nil then - to_use[item:get_name()]=1 + result = result.item + if not inventory:room_for_item("dst", result) then return end + local to_use = {} + for _, item in ipairs(recipe) do + if item~= nil and not item:is_empty() then + if to_use[item:get_name()] == nil then + to_use[item:get_name()] = 1 else - to_use[item:get_name()]=to_use[item:get_name()]+1 + to_use[item:get_name()] = to_use[item:get_name()]+1 end end end - local stack - for itemname,number in pairs(to_use) do - stack=ItemStack({name=itemname, count=number}) - if not inventory:contains_item("src",stack) then return end + local invcache = make_inventory_cache(inventory:get_list("src")) + for itemname, number in pairs(to_use) do + if (not invcache[itemname]) or invcache[itemname] < number then return end end - for itemname,number in pairs(to_use) do - stack=ItemStack({name=itemname, count=number}) - inventory:remove_item("src",stack) + for itemname, number in pairs(to_use) do + for i = 1, number do -- We have to do that since remove_item does not work if count > stack_max + inventory:remove_item("src", ItemStack(itemname)) + end end - inventory:add_item("dst",result) - for i=1,9 do - inventory:add_item("dst",new.items[i]) + inventory:add_item("dst", result) + for i = 1, 9 do + inventory:add_item("dst", new.items[i]) end end -minetest.register_node("pipeworks:autocrafter",{ - description = "Autocrafter", - drawtype="normal", - tiles={"pipeworks_autocrafter.png"}, - groups={snappy=3,tubedevice=1,tubedevice_receiver=1}, - tube={insert_object=function(pos,node,stack,direction) - local meta=minetest.env:get_meta(pos) - local inv=meta:get_inventory() - return inv:add_item("src",stack) - end, - can_insert=function(pos,node,stack,direction) - local meta=minetest.env:get_meta(pos) - local inv=meta:get_inventory() - return inv:room_for_item("src",stack) - end, - input_inventory="dst"}, +minetest.register_node("pipeworks:autocrafter", { + description = "Autocrafter", + drawtype = "normal", + tiles = {"pipeworks_autocrafter.png"}, + groups = {snappy = 3, tubedevice = 1, tubedevice_receiver = 1}, + tube = {insert_object = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:add_item("src", stack) + end, + can_insert = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:room_for_item("src", stack) + end, + input_inventory = "dst", + connect_sides = {left = 1, right = 1, front = 1, back = 1, top = 1, bottom = 1}}, on_construct = function(pos) - local meta = minetest.env:get_meta(pos) + local meta = minetest.get_meta(pos) meta:set_string("formspec", "size[8,11]".. "list[current_name;recipe;0,0;3,3;]".. @@ -62,19 +104,28 @@ minetest.register_node("pipeworks:autocrafter",{ "list[current_player;main;0,7;8,4;]") meta:set_string("infotext", "Autocrafter") local inv = meta:get_inventory() - inv:set_size("src",3*8) - inv:set_size("recipe",3*3) - inv:set_size("dst",4*3) - end, - can_dig = function(pos,player) - local meta = minetest.env:get_meta(pos); + inv:set_size("src", 3*8) + inv:set_size("recipe", 3*3) + inv:set_size("dst", 4*3) + end, + can_dig = function(pos, player) + local meta = minetest.get_meta(pos); local inv = meta:get_inventory() return (inv:is_empty("src") and inv:is_empty("recipe") and inv:is_empty("dst")) - end}) + end, + after_place_node = function(pos) + pipeworks.scan_for_tube_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_tube_objects(pos) + autocrafterCache[minetest.hash_node_position(pos)] = nil + end +}) -minetest.register_abm({nodenames={"pipeworks:autocrafter"},interval=1,chance=1, - action=function(pos,node) - local meta=minetest.env:get_meta(pos) - local inv=meta:get_inventory() - autocraft(inv) - end}) \ No newline at end of file +minetest.register_abm({nodenames = {"pipeworks:autocrafter"}, interval = 1, chance = 1, + action = function(pos, node) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + autocraft(inv, pos) + end +}) diff --git a/mods/pipeworks/autoplace.lua b/mods/pipeworks/autoplace.lua deleted file mode 100644 index dbcc423..0000000 --- a/mods/pipeworks/autoplace.lua +++ /dev/null @@ -1,234 +0,0 @@ --- autorouting for pipes - -function pipe_scanforobjects(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-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") - - 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 - -function pipe_autoroute(pos, state) - nctr = minetest.env:get_node(pos) - if (string.find(nctr.name, "pipeworks:pipe_") == nil) then return end - - pipes_scansurroundings(pos) - - 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 - --- autorouting for pneumatic tubes - -function tube_scanforobjects(pos) - tube_autoroute({ x=pos.x-1, y=pos.y , z=pos.z }) - tube_autoroute({ x=pos.x+1, y=pos.y , z=pos.z }) - tube_autoroute({ x=pos.x , y=pos.y-1, z=pos.z }) - tube_autoroute({ x=pos.x , y=pos.y+1, z=pos.z }) - tube_autoroute({ x=pos.x , y=pos.y , z=pos.z-1 }) - tube_autoroute({ x=pos.x , y=pos.y , z=pos.z+1 }) - tube_autoroute(pos) -end - -function in_table(table,element) - for _,el in ipairs(table) do - if el==element then return true end - end - return false -end - -function is_tube(nodename) - return in_table(tubenodes,nodename) -end - -function tube_autoroute(pos) - nctr = minetest.env:get_node(pos) - --print ("minetest.get_item_group("..nctr.name..',"tubedevice") == '..minetest.get_item_group(nctr.name, "tubedevice")) - if (is_tube(nctr.name) == nil) - and minetest.get_item_group(nctr.name, "tubedevice") ~= 1 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 is_tube(nxm.name) - or minetest.get_item_group(nxm.name, "tubedevice") == 1 then pxm=1 end - if is_tube(nxp.name) - or minetest.get_item_group(nxp.name, "tubedevice") == 1 then pxp=1 end - if is_tube(nym.name) - or minetest.get_item_group(nym.name, "tubedevice") == 1 then pym=1 end - if is_tube(nyp.name) - or minetest.get_item_group(nyp.name, "tubedevice") == 1 then pyp=1 end - if is_tube(nzm.name) - or minetest.get_item_group(nzm.name, "tubedevice") == 1 then pzm=1 end - if is_tube(nzp.name) - or minetest.get_item_group(nzp.name, "tubedevice") == 1 then pzp=1 end - - nsurround = pxm..pxp..pym..pyp..pzm..pzp - if is_tube(nctr.name) then - local meta=minetest.env:get_meta(pos) - local meta0=meta:to_table() - nctr.name=string.sub(nctr.name,1,-7)..nsurround - minetest.env:add_node(pos, nctr) - local meta=minetest.env:get_meta(pos) - meta:from_table(meta0) - end - -end - --- auto-rotation code for various devices the tubes attach to - -function pipes_scansurroundings(pos) - 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 - --- Special handling for valves... - - if (string.find(nxm.name, "pipeworks:valve") ~= nil) - and (nxm.param2 == 0 or nxm.param2 == 2) then - pxm=1 - end - - if (string.find(nxp.name, "pipeworks:valve") ~= nil) - and (nxp.param2 == 0 or nxp.param2 == 2) then - pxp=1 - end - - if (string.find(nzm.name, "pipeworks:valve") ~= nil) - and (nzm.param2 == 1 or nzm.param2 == 3) then - pzm=1 - end - - if (string.find(nzp.name, "pipeworks:valve") ~= nil) - and (nzp.param2 == 1 or nzp.param2 == 3) then - pzp=1 - 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... - - if (string.find(nxm.name, "pipeworks:entry_panel") ~= nil) - and (nxm.param2 == 1 or nxm.param2 == 3) then - pxm=1 - end - - if (string.find(nxp.name, "pipeworks:entry_panel") ~= nil) - and (nxp.param2 == 1 or nxp.param2 == 3) then - pxp=1 - end - - if (string.find(nzm.name, "pipeworks:entry_panel") ~= nil) - and (nzm.param2 == 0 or nzm.param2 == 2) then - pzm=1 - end - - if (string.find(nzp.name, "pipeworks:entry_panel") ~= nil) - and (nzp.param2 == 0 or nzp.param2 == 2) then - pzp=1 - end - --- ...pumps, grates... - - if (string.find(nym.name, "pipeworks:grating") ~= nil) or - (string.find(nym.name, "pipeworks:pump") ~= nil) then - pym=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 --- - -end - -function pipe_look_for_stackable_tanks(pos) - local tym = minetest.env:get_node({ x=pos.x , y=pos.y-1, z=pos.z }) - - if string.find(tym.name, "pipeworks:storage_tank_") ~= nil or - string.find(tym.name, "pipeworks:expansion_tank_") ~= nil then - minetest.env:add_node(pos, { name = "pipeworks:expansion_tank_0", param2 = tym.param2}) - end -end - diff --git a/mods/pipeworks/autoplace_pipes.lua b/mods/pipeworks/autoplace_pipes.lua new file mode 100644 index 0000000..69bd90e --- /dev/null +++ b/mods/pipeworks/autoplace_pipes.lua @@ -0,0 +1,200 @@ +-- 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" + if (string.find(nctr.name, "pipeworks:pipe_") == nil) then return end + if (string.find(nctr.name, "_loaded") ~= nil) then state = "_loaded" end + local nsurround = pipeworks.scan_pipe_surroundings(pos) + + if nsurround == 0 then nsurround = 9 end + minetest.add_node(pos, {name = "pipeworks:pipe_"..tube_table[nsurround]..state, + param2 = tube_table_facedirs[nsurround]}) +end + +function pipeworks.scan_for_pipe_objects(pos) + autoroute_pipes({ x=pos.x-1, y=pos.y , z=pos.z }) + autoroute_pipes({ x=pos.x+1, y=pos.y , z=pos.z }) + autoroute_pipes({ x=pos.x , y=pos.y-1, z=pos.z }) + autoroute_pipes({ x=pos.x , y=pos.y+1, z=pos.z }) + autoroute_pipes({ x=pos.x , y=pos.y , z=pos.z-1 }) + autoroute_pipes({ x=pos.x , y=pos.y , z=pos.z+1 }) + autoroute_pipes(pos) +end + +-- auto-rotation code for various devices the tubes attach to + +function pipeworks.scan_pipe_surroundings(pos) + local pxm=0 + local pxp=0 + local pym=0 + local pyp=0 + local pzm=0 + local pzp=0 + + local nxm = minetest.get_node({ x=pos.x-1, y=pos.y , z=pos.z }) + local nxp = minetest.get_node({ x=pos.x+1, y=pos.y , z=pos.z }) + local nym = minetest.get_node({ x=pos.x , y=pos.y-1, z=pos.z }) + local nyp = minetest.get_node({ x=pos.x , y=pos.y+1, z=pos.z }) + local nzm = minetest.get_node({ x=pos.x , y=pos.y , z=pos.z-1 }) + local nzp = minetest.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 + +-- Special handling for valves... + + if (string.find(nxm.name, "pipeworks:valve") ~= nil) + and (nxm.param2 == 0 or nxm.param2 == 2) then + pxm=1 + end + + if (string.find(nxp.name, "pipeworks:valve") ~= nil) + and (nxp.param2 == 0 or nxp.param2 == 2) then + pxp=1 + end + + if (string.find(nzm.name, "pipeworks:valve") ~= nil) + and (nzm.param2 == 1 or nzm.param2 == 3) then + pzm=1 + end + + if (string.find(nzp.name, "pipeworks:valve") ~= nil) + and (nzp.param2 == 1 or nzp.param2 == 3) then + pzp=1 + end + +-- ...flow sensors... + + if (string.find(nxm.name, "pipeworks:flow_sensor") ~= nil) + and (nxm.param2 == 0 or nxm.param2 == 2) then + pxm=1 + end + + if (string.find(nxp.name, "pipeworks:flow_sensor") ~= nil) + and (nxp.param2 == 0 or nxp.param2 == 2) then + pxp=1 + end + + if (string.find(nzm.name, "pipeworks:flow_sensor") ~= nil) + and (nzm.param2 == 1 or nzm.param2 == 3) then + pzm=1 + end + + if (string.find(nzp.name, "pipeworks:flow_sensor") ~= nil) + and (nzp.param2 == 1 or nzp.param2 == 3) then + pzp=1 + 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... + + if (string.find(nxm.name, "pipeworks:entry_panel") ~= nil) + and (nxm.param2 == 1 or nxm.param2 == 3) then + pxm=1 + end + + if (string.find(nxp.name, "pipeworks:entry_panel") ~= nil) + and (nxp.param2 == 1 or nxp.param2 == 3) then + pxp=1 + end + + if (string.find(nzm.name, "pipeworks:entry_panel") ~= nil) + and (nzm.param2 == 0 or nzm.param2 == 2) then + pzm=1 + end + + if (string.find(nzp.name, "pipeworks:entry_panel") ~= nil) + and (nzp.param2 == 0 or nzp.param2 == 2) then + pzp=1 + end + + if (string.find(nym.name, "pipeworks:entry_panel") ~= nil) + and nym.param2 == 13 then + pym=1 + end + + if (string.find(nyp.name, "pipeworks:entry_panel") ~= nil) + and nyp.param2 == 13 then + pyp=1 + end + + +-- ...pumps, grates... + + if (string.find(nym.name, "pipeworks:grating") ~= nil) or + (string.find(nym.name, "pipeworks:pump") ~= nil) then + pym=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 +-- + + return pxm+8*pxp+2*pym+16*pyp+4*pzm+32*pzp +end + +function pipeworks.look_for_stackable_tanks(pos) + local tym = minetest.get_node({ x=pos.x , y=pos.y-1, z=pos.z }) + + if string.find(tym.name, "pipeworks:storage_tank_") ~= nil or + string.find(tym.name, "pipeworks:expansion_tank_") ~= nil then + minetest.add_node(pos, { name = "pipeworks:expansion_tank_0", param2 = tym.param2}) + end +end + diff --git a/mods/pipeworks/autoplace_tubes.lua b/mods/pipeworks/autoplace_tubes.lua new file mode 100644 index 0000000..c9d5d9f --- /dev/null +++ b/mods/pipeworks/autoplace_tubes.lua @@ -0,0 +1,168 @@ +-- autorouting for pneumatic tubes + +local function in_table(table,element) + for _,el in ipairs(table) do + if el==element then return true end + end + return false +end + +local function is_tube(nodename) + return in_table(pipeworks.tubenodes,nodename) +end + +if pipeworks == nil then + pipeworks = {} +end + +--a function for determining which side of the node we are on +local function nodeside(node, tubedir) + if node and (node.param2 < 0 or node.param2 > 23) then node.param2 = 0 end + + --get a vector pointing back + local backdir = minetest.facedir_to_dir(node.param2) + + --check whether the vector is equivalent to the tube direction; if it is, the tube's on the backside + if backdir.x == tubedir.x and backdir.y == tubedir.y and backdir.z == tubedir.z then + return "back" + end + + --check whether the vector is antiparallel with the tube direction; that indicates the front + if backdir.x == -tubedir.x and backdir.y == -tubedir.y and backdir.z == -tubedir.z then + return "front" + end + + --facedir is defined in terms of the top-bottom axis of the node; we'll take advantage of that + local topdir = ({[0]={x=0, y=1, z=0}, + {x=0, y=0, z=1}, + {x=0, y=0, z=-1}, + {x=1, y=0, z=0}, + {x=-1, y=0, z=0}, + {x=0, y=-1, z=0}})[math.floor(node.param2/4)] + + --is this the top? + if topdir.x == tubedir.x and topdir.y == tubedir.y and topdir.z == tubedir.z then + return "top" + end + + --or the bottom? + if topdir.x == -tubedir.x and topdir.y == -tubedir.y and topdir.z == -tubedir.z then + return "bottom" + end + + --we shall apply some maths to obtain the right-facing vector + local rightdir = {x=topdir.y*backdir.z - backdir.y*topdir.z, + y=topdir.z*backdir.x - backdir.z*topdir.x, + z=topdir.x*backdir.y - backdir.x*topdir.y} + + --is this the right side? + if rightdir.x == tubedir.x and rightdir.y == tubedir.y and rightdir.z == tubedir.z then + return "right" + end + + --or the left? + if rightdir.x == -tubedir.x and rightdir.y == -tubedir.y and rightdir.z == -tubedir.z then + return "left" + end + + --we should be done by now; initiate panic mode + minetest.log("error", "nodeside has been confused by its parameters; see pipeworks autoplace_tubes.lua, line 78") +end + +local vts = {0, 3, 1, 4, 2, 5} +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 tube_autoroute(pos) + local active = {0, 0, 0, 0, 0, 0} + local nctr = minetest.get_node(pos) + if not is_tube(nctr.name) then return end + + local adjustments = { + { x=-1, y=0, z=0 }, + { x=1, y=0, z=0 }, + { x=0, y=-1, z=0 }, + { x=0, y=1, z=0 }, + { x=0, y=0, z=-1 }, + { x=0, y=0, z=1 } + } + -- xm = 1, xp = 2, ym = 3, yp = 4, zm = 5, zp = 6 + + local positions = {} + local nodes = {} + for i,adj in ipairs(adjustments) do + positions[i] = {x=pos.x+adj.x, y=pos.y+adj.y, z=pos.z+adj.z} + nodes[i] = minetest.get_node(positions[i]) + end + + for i,node in ipairs(nodes) do + local idef = minetest.registered_nodes[node.name] + -- handle the tubes themselves + if is_tube(node.name) then + active[i] = 1 + -- handle new style connectors + elseif idef and idef.tube and idef.tube.connect_sides then + local dir = adjustments[i] + if idef.tube.connect_sides[nodeside(node, {x=-dir.x, y=-dir.y, z=-dir.z})] then active[i] = 1 end + end + end + + -- all sides checked, now figure which tube to use. + + local nodedef = minetest.registered_nodes[nctr.name] + local basename = nodedef.basename + local newname + if nodedef.style == "old" then + local nsurround = "" + for i,n in ipairs(active) do + nsurround = nsurround .. n + end + nctr.name = basename.."_"..nsurround + elseif nodedef.style == "6d" then + local s = 0 + for i,n in ipairs(active) do + if n == 1 then + s = s+2^vts[i] + end + end + nctr.name = basename.."_"..tube_table[s] + nctr.param2 = tube_table_facedirs[s] + end + minetest.swap_node(pos, nctr) +end + +function pipeworks.scan_for_tube_objects(pos) + if not pos or not pos.x or not pos.y or not pos.z then return end + tube_autoroute({ x=pos.x-1, y=pos.y , z=pos.z }) + tube_autoroute({ x=pos.x+1, y=pos.y , z=pos.z }) + tube_autoroute({ x=pos.x , y=pos.y-1, z=pos.z }) + tube_autoroute({ x=pos.x , y=pos.y+1, z=pos.z }) + tube_autoroute({ x=pos.x , y=pos.y , z=pos.z-1 }) + tube_autoroute({ x=pos.x , y=pos.y , z=pos.z+1 }) + tube_autoroute(pos) +end + +minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) + if minetest.registered_items[newnode.name] + and minetest.registered_items[newnode.name].tube + and minetest.registered_items[newnode.name].tube.connect_sides then + pipeworks.scan_for_tube_objects(pos) + end +end) + +minetest.register_on_dignode(function(pos, oldnode, digger) + if minetest.registered_items[oldnode.name] + and minetest.registered_items[oldnode.name].tube + and minetest.registered_items[oldnode.name].tube.connect_sides then + pipeworks.scan_for_tube_objects(pos) + end +end) + +if minetest.get_modpath("mesecons_mvps") ~= nil then + mesecon:register_on_mvps_move(function(moved_nodes) + for _, n in ipairs(moved_nodes) do + pipeworks.scan_for_tube_objects(n.pos) + pipeworks.scan_for_tube_objects(n.oldpos) + end + end) +end + diff --git a/mods/pipeworks/compat.lua b/mods/pipeworks/compat.lua index 04dcadd..e80fa62 100644 --- a/mods/pipeworks/compat.lua +++ b/mods/pipeworks/compat.lua @@ -1,180 +1,158 @@ +-- this bit of code modifies the default chests and furnaces to be compatible +-- with pipeworks. -default.furnace_inactive_formspec = - "size[8,9]".. - "image[2,2;1,1;default_furnace_fire_bg.png]".. - "list[current_name;fuel;2,3;1,1;]".. - "list[current_name;src;2,1;1,1;]".. - "list[current_name;dst;5,1;2,2;]".. - "list[current_player;main;0,5;8,4;]" +function pipeworks.clone_node(name) + local node2 = {} + local node = minetest.registered_nodes[name] + for k, v in pairs(node) do + node2[k] = v + end + return node2 +end -minetest.register_node(":default:furnace", { - description = "Furnace", - tiles = {"default_furnace_top.png", "default_furnace_bottom.png", "default_furnace_side.png", - "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front.png"}, - paramtype2 = "facedir", - groups = {cracky=2,tubedevice=1,tubedevice_receiver=1}, - tube={insert_object=function(pos,node,stack,direction) - local meta=minetest.env:get_meta(pos) - local inv=meta:get_inventory() - if direction.y==1 then +local furnace = pipeworks.clone_node("default:furnace") + furnace.tiles[1] = "default_furnace_top.png^pipeworks_tube_connection_stony.png" + furnace.tiles[2] = "default_furnace_bottom.png^pipeworks_tube_connection_stony.png" + furnace.tiles[3] = "default_furnace_side.png^pipeworks_tube_connection_stony.png" + furnace.tiles[4] = "default_furnace_side.png^pipeworks_tube_connection_stony.png" + furnace.tiles[5] = "default_furnace_side.png^pipeworks_tube_connection_stony.png" + -- note we don't redefine entry 6 ( front) + furnace.groups.tubedevice = 1 + furnace.groups.tubedevice_receiver = 1 + furnace.tube = { + insert_object = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if direction.y == 1 then return inv:add_item("fuel",stack) else return inv:add_item("src",stack) end end, - can_insert=function(pos,node,stack,direction) - local meta=minetest.env:get_meta(pos) - local inv=meta:get_inventory() - if direction.y==1 then - return inv:room_for_item("fuel",stack) - elseif direction.y==-1 then - return inv:room_for_item("src",stack) + can_insert = function(pos,node,stack,direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if direction.y == 1 then + return inv:room_for_item("fuel", stack) else - return 0 + return inv:room_for_item("src", stack) end end, - input_inventory="dst"}, - legacy_facedir_simple = true, - sounds = default.node_sound_stone_defaults(), - on_construct = function(pos) - local meta = minetest.env:get_meta(pos) - meta:set_string("formspec", default.furnace_inactive_formspec) - meta:set_string("infotext", "Furnace") - local inv = meta:get_inventory() - inv:set_size("fuel", 1) - inv:set_size("src", 1) - inv:set_size("dst", 4) - end, - can_dig = function(pos,player) - local meta = minetest.env:get_meta(pos); - local inv = meta:get_inventory() - if not inv:is_empty("fuel") then - return false - elseif not inv:is_empty("dst") then - return false - elseif not inv:is_empty("src") then - return false - end - return true - end, - after_place_node = function(pos) - tube_scanforobjects(pos) - end, - after_dig_node = function(pos) - tube_scanforobjects(pos) + input_inventory = "dst", + connect_sides = {left=1, right=1, back=1, front=1, bottom=1, top=1} + } + furnace.after_place_node = function(pos) + pipeworks.scan_for_tube_objects(pos) + end + furnace.after_dig_node = function(pos) + pipeworks.scan_for_tube_objects(pos) end -}) -minetest.register_node(":default:furnace_active", { - description = "Furnace", - tiles = {"default_furnace_top.png", "default_furnace_bottom.png", "default_furnace_side.png", - "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front_active.png"}, - paramtype2 = "facedir", - light_source = 8, - drop = "default:furnace", - groups = {cracky=2, not_in_creative_inventory=1,tubedevice=1,tubedevice_receiver=1}, - tube={insert_object=function(pos,node,stack,direction) - local meta=minetest.env:get_meta(pos) - local inv=meta:get_inventory() - if direction.y==1 then - return inv:add_item("fuel",stack) - else - return inv:add_item("src",stack) - end - end, - can_insert=function(pos,node,stack,direction) - local meta=minetest.env:get_meta(pos) - local inv=meta:get_inventory() - if direction.y==1 then - return inv:room_for_item("fuel",stack) - elseif direction.y==-1 then - return inv:room_for_item("src",stack) - else - return 0 - end - end, - input_inventory="dst"}, - legacy_facedir_simple = true, - sounds = default.node_sound_stone_defaults(), - on_construct = function(pos) - local meta = minetest.env:get_meta(pos) - meta:set_string("formspec", default.furnace_inactive_formspec) - meta:set_string("infotext", "Furnace"); - local inv = meta:get_inventory() - inv:set_size("fuel", 1) - inv:set_size("src", 1) - inv:set_size("dst", 4) - end, - can_dig = function(pos,player) - local meta = minetest.env:get_meta(pos); - local inv = meta:get_inventory() - if not inv:is_empty("fuel") then - return false - elseif not inv:is_empty("dst") then - return false - elseif not inv:is_empty("src") then - return false - end - return true - end, - after_place_node = function(pos) - tube_scanforobjects(pos) - end, - after_dig_node = function(pos) - tube_scanforobjects(pos) - end -}) +minetest.register_node(":default:furnace", furnace) -minetest.register_node(":default:chest", { - description = "Chest", - tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", - "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"}, - paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,tubedevice=1,tubedevice_receiver=1}, - tube={insert_object=function(pos,node,stack,direction) - local meta=minetest.env:get_meta(pos) - local inv=meta:get_inventory() - return inv:add_item("main",stack) +local furnace_active = pipeworks.clone_node("default:furnace_active") + furnace_active.tiles[1] = "default_furnace_top.png^pipeworks_tube_connection_stony.png" + furnace_active.tiles[2] = "default_furnace_bottom.png^pipeworks_tube_connection_stony.png" + furnace_active.tiles[3] = "default_furnace_side.png^pipeworks_tube_connection_stony.png" + furnace_active.tiles[4] = "default_furnace_side.png^pipeworks_tube_connection_stony.png" + furnace_active.tiles[5] = "default_furnace_side.png^pipeworks_tube_connection_stony.png" + -- note we don't redefine entry 6 (front) + furnace_active.groups.tubedevice = 1 + furnace_active.groups.tubedevice_receiver = 1 + furnace_active.tube = { + insert_object = function(pos,node,stack,direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if direction.y == 1 then + return inv:add_item("fuel", stack) + else + return inv:add_item("src", stack) + end end, - can_insert=function(pos,node,stack,direction) - local meta=minetest.env:get_meta(pos) - local inv=meta:get_inventory() - return inv:room_for_item("main",stack) + can_insert = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if direction.y == 1 then + return inv:room_for_item("fuel", stack) + else + return inv:room_for_item("src", stack) + end end, - input_inventory="main"}, - legacy_facedir_simple = true, - sounds = default.node_sound_wood_defaults(), - on_construct = function(pos) - local meta = minetest.env:get_meta(pos) - meta:set_string("formspec", - "size[8,9]".. - "list[current_name;main;0,0;8,4;]".. - "list[current_player;main;0,5;8,4;]") - meta:set_string("infotext", "Chest") - local inv = meta:get_inventory() - inv:set_size("main", 8*4) - end, - can_dig = function(pos,player) - local meta = minetest.env:get_meta(pos); - local inv = meta:get_inventory() - return inv:is_empty("main") - end, - on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - minetest.log("action", player:get_player_name().. - " moves stuff in chest at "..minetest.pos_to_string(pos)) - end, - on_metadata_inventory_put = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " moves stuff to chest at "..minetest.pos_to_string(pos)) - end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " takes stuff from chest at "..minetest.pos_to_string(pos)) - end, - after_place_node = function(pos) - tube_scanforobjects(pos) - end, - after_dig_node = function(pos) - tube_scanforobjects(pos) + input_inventory = "dst", + connect_sides = {left=1, right=1, back=1, front=1, bottom=1, top=1} + } + furnace_active.after_place_node= function(pos) + pipeworks.scan_for_tube_objects(pos) end -}) + furnace_active.after_dig_node = function(pos) + pipeworks.scan_for_tube_objects(pos) + end + +minetest.register_node(":default:furnace_active", furnace_active) + + +local chest = pipeworks.clone_node("default:chest") + chest.tiles[1] = "default_chest_top.png^pipeworks_tube_connection_wooden.png" + chest.tiles[2] = "default_chest_top.png^pipeworks_tube_connection_wooden.png" + chest.tiles[3] = "default_chest_side.png^pipeworks_tube_connection_wooden.png" + chest.tiles[4] = "default_chest_side.png^pipeworks_tube_connection_wooden.png" + chest.tiles[5] = "default_chest_side.png^pipeworks_tube_connection_wooden.png" + -- note we don't redefine entry 6 (front). + chest.groups.tubedevice = 1 + chest.groups.tubedevice_receiver = 1 + chest.tube = { + insert_object = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:add_item("main", stack) + end, + can_insert = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:room_for_item("main", stack) + end, + input_inventory = "main", + connect_sides = {left=1, right=1, back=1, front=1, bottom=1, top=1} + } + chest.after_place_node = function(pos) + pipeworks.scan_for_tube_objects(pos) + end + chest.after_dig_node = function(pos) + pipeworks.scan_for_tube_objects(pos) + end + +minetest.register_node(":default:chest", chest) + + +local chest_locked = pipeworks.clone_node("default:chest_locked") + chest_locked.tiles[1] = "default_chest_top.png^pipeworks_tube_connection_wooden.png" + chest_locked.tiles[2] = "default_chest_top.png^pipeworks_tube_connection_wooden.png" + chest_locked.tiles[3] = "default_chest_side.png^pipeworks_tube_connection_wooden.png" + chest_locked.tiles[4] = "default_chest_side.png^pipeworks_tube_connection_wooden.png" + chest_locked.tiles[5] = "default_chest_side.png^pipeworks_tube_connection_wooden.png" + -- note we don't redefine entry 6 (front). + chest_locked.groups.tubedevice = 1 + chest_locked.groups.tubedevice_receiver = 1 + chest_locked.tube = { + insert_object = function(pos, node, stack, direction) + local meta = minetest.env:get_meta(pos) + local inv = meta:get_inventory() + return inv:add_item("main", stack) + end, + can_insert = function(pos, node, stack, direction) + local meta = minetest.env:get_meta(pos) + local inv = meta:get_inventory() + return inv:room_for_item("main", stack) + end, + connect_sides = {left=1, right=1, back=1, front=1, bottom=1, top=1} + } + local old_after_place = minetest.registered_nodes["default:chest_locked"].after_place_node + chest_locked.after_place_node = function(pos, placer) + pipeworks.scan_for_tube_objects(pos) + old_after_place(pos, placer) + end + chest_locked.after_dig_node = function(pos) + pipeworks.scan_for_tube_objects(pos) + end + +minetest.register_node(":default:chest_locked", chest_locked) diff --git a/mods/pipeworks/crafts.lua b/mods/pipeworks/crafts.lua index e5adc4e..25bf345 100644 --- a/mods/pipeworks/crafts.lua +++ b/mods/pipeworks/crafts.lua @@ -1,168 +1,303 @@ --- Crafting recipes for pipeworks +-- Crafting recipes for pipes --- If the technic mod is present, then don't bother registering these recipes --- as that mod supplies its own. - -if io.open(minetest.get_modpath("pipeworks").."/../technic/init.lua", "r") == nil then - - -- If homedecor is not installed, we need to register a few of its crafts - -- manually so we can use them. - - if minetest.get_modpath("homedecor") == nil then - - minetest.register_craftitem(":homedecor:plastic_sheeting", { - description = "Plastic sheet", - inventory_image = "pipeworks_plastic_sheeting.png", - }) - - minetest.register_craft({ - type = "cooking", - output = "homedecor:plastic_sheeting", - recipe = "default:junglegrass", - }) - - minetest.register_craft({ - type = 'fuel', - recipe = 'homedecor:plastic_sheeting', - burntime = 30, - }) - end - - minetest.register_craft( { - output = "pipeworks:pipe_110000_empty 12", - recipe = { - { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }, - { "", "", "" }, - { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" } - }, - }) - - minetest.register_craft( { - output = "pipeworks:pump_off 2", - recipe = { - { "default:stone", "default:steel_ingot", "default:stone" }, - { "moreores:copper_ingot", "default:mese_crystal_fragment", "moreores:copper_ingot" }, - { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" } - }, - }) - - minetest.register_craft( { - output = "pipeworks:valve_off 2", - recipe = { - { "", "default:stick", "" }, - { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }, - { "", "default:steel_ingot", "" } - }, - }) - - minetest.register_craft( { - output = "pipeworks:storage_tank_0 2", - recipe = { - { "", "default:steel_ingot", "default:steel_ingot" }, - { "default:steel_ingot", "default:glass", "default:steel_ingot" }, - { "default:steel_ingot", "default:steel_ingot", "" } - }, - }) - - minetest.register_craft( { - output = "pipeworks:grating 2", - recipe = { - { "default:steel_ingot", "", "default:steel_ingot" }, - { "", "default:steel_ingot", "" }, - { "default:steel_ingot", "", "default:steel_ingot" } - }, - }) - - minetest.register_craft( { - output = "pipeworks:spigot 3", - recipe = { - { "pipeworks:pipe_110000_empty", "" }, - { "", "pipeworks:pipe_110000_empty" }, - }, - }) - - minetest.register_craft( { - output = "pipeworks:tube 12", - recipe = { - { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, - { "", "", "" }, - { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } - }, - }) - - minetest.register_craft( { - output = "pipeworks:mese_tube_000000 2", - recipe = { - { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, - { "", "default:mese_crystal", "" }, - { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } - }, - }) - - minetest.register_craft( { - type = "shapeless", - output = "pipeworks:mese_tube_000000", - recipe = { - "pipeworks:tube_000000", - "default:mese_crystal_fragment", - "default:mese_crystal_fragment", - "default:mese_crystal_fragment", - "default:mese_crystal_fragment" - }, - }) - - minetest.register_craft( { - output = "pipeworks:detector_tube_off_000000 2", - recipe = { - { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, - { "mesecons:mesecon", "mesecons:mesecon", "mesecons:mesecon" }, - { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } - }, - }) - - minetest.register_craft( { - output = "pipeworks:accelerator_tube_000000 2", - recipe = { - { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, - { "default:mese_crystal_fragment", "default:steel_ingot", "default:mese_crystal_fragment" }, - { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } - }, - }) - - minetest.register_craft( { - output = "pipeworks:teleport_tube_000000 2", - recipe = { - { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, - { "default:desert_stone", "default:mese_block", "default:desert_stone" }, - { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } - }, - }) - - minetest.register_craft( { - output = "pipeworks:sand_tube_000000 2", - recipe = { - { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, - { "default:sand", "default:sand", "default:sand" }, - { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } - }, - }) - - minetest.register_craft( { - output = "pipeworks:filter 2", - recipe = { - { "default:steel_ingot", "default:steel_ingot", "homedecor:plastic_sheeting" }, - { "default:stick", "default:mese_crystal", "homedecor:plastic_sheeting" }, - { "default:steel_ingot", "default:steel_ingot", "homedecor:plastic_sheeting" } - }, - }) - - minetest.register_craft( { - output = "pipeworks:entry_panel 2", +minetest.register_craft( { + output = "pipeworks:pipe_1_empty 12", recipe = { - { "", "default:steel_ingot", "" }, - { "", "pipeworks:pipe_110000_empty", "" }, - { "", "default:steel_ingot", "" }, + { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }, + { "", "", "" }, + { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" } }, +}) + +minetest.register_craft( { + output = "pipeworks:spigot 3", + recipe = { + { "pipeworks:pipe_1_empty", "" }, + { "", "pipeworks:pipe_1_empty" }, + }, +}) + +minetest.register_craft( { + output = "pipeworks:entry_panel_empty 2", + recipe = { + { "", "default:steel_ingot", "" }, + { "", "pipeworks:pipe_1_empty", "" }, + { "", "default:steel_ingot", "" }, + }, +}) + +-- Various ancillary pipe devices + +minetest.register_craft( { + output = "pipeworks:pump_off 2", + recipe = { + { "default:stone", "default:steel_ingot", "default:stone" }, + { "moreores:copper_ingot", "default:mese_crystal_fragment", "moreores:copper_ingot" }, + { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" } + }, +}) + +minetest.register_craft( { + output = "pipeworks:valve_off_empty 2", + recipe = { + { "", "default:stick", "" }, + { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }, + { "", "default:steel_ingot", "" } + }, +}) + +minetest.register_craft( { + output = "pipeworks:storage_tank_0 2", + recipe = { + { "", "default:steel_ingot", "default:steel_ingot" }, + { "default:steel_ingot", "default:glass", "default:steel_ingot" }, + { "default:steel_ingot", "default:steel_ingot", "" } + }, +}) + +minetest.register_craft( { + output = "pipeworks:grating 2", + recipe = { + { "default:steel_ingot", "", "default:steel_ingot" }, + { "", "pipeworks:pipe_1_empty", "" }, + { "default:steel_ingot", "", "default:steel_ingot" } + }, +}) + +minetest.register_craft( { + output = "pipeworks:flow_sensor_empty 2", + recipe = { + { "pipeworks:pipe_1_empty", "mesecons:mesecon", "pipeworks:pipe_1_empty" }, + }, +}) + +minetest.register_craft( { + output = "pipeworks:fountainhead 2", + recipe = { + { "pipeworks:pipe_1_empty" }, + { "pipeworks:pipe_1_empty" } + }, +}) + + +-- Crafting recipes for pneumatic tubes + +-- If homedecor is not installed, we need to register its crafting chain for +-- plastic sheeting so that pipeworks remains compatible with it. + +if minetest.get_modpath("homedecor") == nil then + + minetest.register_craftitem(":homedecor:plastic_sheeting", { + description = "Plastic sheet", + inventory_image = "homedecor_plastic_sheeting.png", + }) + + minetest.register_craftitem(":homedecor:plastic_base", { + description = "Unprocessed Plastic base", + wield_image = "homedecor_plastic_base.png", + inventory_image = "homedecor_plastic_base_inv.png", + }) + + minetest.register_craft({ + type = "shapeless", + output = 'homedecor:plastic_base 4', + recipe = { "group:leaves", + "group:leaves", + "group:leaves", + "group:leaves", + "group:leaves", + "group:leaves" + } + }) + + minetest.register_craft({ + type = "cooking", + output = "homedecor:plastic_sheeting", + recipe = "homedecor:plastic_base", + }) + + minetest.register_craft({ + type = 'fuel', + recipe = 'homedecor:plastic_base', + burntime = 30, + }) + + minetest.register_craft({ + type = 'fuel', + recipe = 'homedecor:plastic_sheeting', + burntime = 30, }) end + +minetest.register_craft( { + output = "pipeworks:one_way_tube 2", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "default:stick", "default:mese_crystal", "homedecor:plastic_sheeting" }, + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } + }, +}) + + +minetest.register_craft( { + output = "pipeworks:tube_1 6", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "", "", "" }, + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } + }, +}) + +minetest.register_craft( { + output = "pipeworks:mese_tube_1 2", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "", "default:mese_crystal", "" }, + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } + }, +}) + +minetest.register_craft( { + type = "shapeless", + output = "pipeworks:mese_tube_000000", + recipe = { + "pipeworks:tube_1", + "default:mese_crystal_fragment", + "default:mese_crystal_fragment", + "default:mese_crystal_fragment", + "default:mese_crystal_fragment" + }, +}) + +minetest.register_craft( { + output = "pipeworks:conductor_tube_off_1 6", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "mesecons:mesecon", "mesecons:mesecon", "mesecons:mesecon" }, + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } + }, +}) + +minetest.register_craft( { + output = "pipeworks:detector_tube_off_1 2", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "mesecons:mesecon", "mesecons_materials:silicon", "mesecons:mesecon" }, + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } + }, +}) + +minetest.register_craft( { + output = "pipeworks:accelerator_tube_1 2", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "default:mese_crystal_fragment", "default:steel_ingot", "default:mese_crystal_fragment" }, + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } + }, +}) + +minetest.register_craft( { + output = "pipeworks:teleport_tube_1 2", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "default:desert_stone", "default:mese_block", "default:desert_stone" }, + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } + }, +}) + +minetest.register_craft( { + output = "pipeworks:sand_tube_1 2", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "default:sand", "default:sand", "default:sand" }, + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } + }, +}) + +minetest.register_craft( { + output = "pipeworks:sand_tube_1 2", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "default:desert_sand", "default:desert_sand", "default:desert_sand" }, + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } + }, +}) + +minetest.register_craft( { + output = "pipeworks:sand_tube_1", + recipe = { + { "default:desert_sand", "pipeworks:tube_1", "default:desert_sand" }, + }, +}) + +minetest.register_craft( { + output = "pipeworks:mese_sand_tube_1 2", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "default:sand", "default:mese_crystal", "default:sand" }, + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } + }, +}) + +minetest.register_craft( { + output = "pipeworks:mese_sand_tube_1 2", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "default:desert_sand", "default:mese_crystal", "default:desert_sand" }, + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } + }, +}) + +minetest.register_craft( { + output = "pipeworks:crossing_tube_1 5", + recipe = { + { "", "pipeworks:tube_1", "" }, + { "pipeworks:tube_1", "pipeworks:tube_1", "pipeworks:tube_1" }, + { "", "pipeworks:tube_1", "" } + }, +}) + + +minetest.register_craft( { + type = "shapeless", + output = "pipeworks:mese_sand_tube_1", + recipe = { + "pipeworks:sand_tube_1", + "default:mese_crystal_fragment", + "default:mese_crystal_fragment", + "default:mese_crystal_fragment", + "default:mese_crystal_fragment" + }, +}) + +-- Various ancillary tube devices + +minetest.register_craft( { + output = "pipeworks:filter 2", + recipe = { + { "default:steel_ingot", "default:steel_ingot", "homedecor:plastic_sheeting" }, + { "default:stick", "default:mese_crystal", "homedecor:plastic_sheeting" }, + { "default:steel_ingot", "default:steel_ingot", "homedecor:plastic_sheeting" } + }, +}) + +minetest.register_craft( { + output = "pipeworks:mese_filter 2", + recipe = { + { "default:steel_ingot", "default:steel_ingot", "homedecor:plastic_sheeting" }, + { "default:stick", "default:mese", "homedecor:plastic_sheeting" }, + { "default:steel_ingot", "default:steel_ingot", "homedecor:plastic_sheeting" } + }, +}) + +minetest.register_craft( { + output = "pipeworks:autocrafter 2", + recipe = { + { "default:steel_ingot", "default:mese_crystal", "default:steel_ingot" }, + { "homedecor:plastic_sheeting", "default:steel_ingot", "homedecor:plastic_sheeting" }, + { "default:steel_ingot", "default:mese_crystal", "default:steel_ingot" } + }, +}) + + diff --git a/mods/pipeworks/default_settings.txt b/mods/pipeworks/default_settings.txt new file mode 100644 index 0000000..f594a16 --- /dev/null +++ b/mods/pipeworks/default_settings.txt @@ -0,0 +1,18 @@ +-- Various settings + +pipeworks.enable_pipes = true +pipeworks.enable_autocrafter = true +pipeworks.enable_deployer = true +pipeworks.enable_node_breaker = true +pipeworks.enable_teleport_tube = true +pipeworks.enable_pipe_devices = true +pipeworks.enable_redefines = true +pipeworks.enable_mese_tube = true +pipeworks.enable_detector_tube = true +pipeworks.enable_conductor_tube = true +pipeworks.enable_accelerator_tube = true +pipeworks.enable_crossing_tube = true +pipeworks.enable_sand_tube = true +pipeworks.enable_mese_sand_tube = true +pipeworks.enable_one_way_tube = true +pipeworks.enable_cyclic_mode = true diff --git a/mods/pipeworks/depends.txt b/mods/pipeworks/depends.txt index 3a7daa1..02a542c 100644 --- a/mods/pipeworks/depends.txt +++ b/mods/pipeworks/depends.txt @@ -1,2 +1,3 @@ default - +mesecons? +mesecons_mvps? diff --git a/mods/pipeworks/deployer.lua b/mods/pipeworks/deployer.lua index a57a895..40b5883 100644 --- a/mods/pipeworks/deployer.lua +++ b/mods/pipeworks/deployer.lua @@ -1,64 +1,114 @@ + +--register aliases for when someone had technic installed, but then uninstalled it but not pipeworks +minetest.register_alias("technic:deployer_off", "pipeworks:deployer_off") +minetest.register_alias("technic:deployer_on", "pipeworks:deployer_on") + minetest.register_craft({ output = 'pipeworks:deployer_off 1', recipe = { - {'default:wood', 'default:chest','default:wood'}, + {'group:wood', 'default:chest','group:wood'}, {'default:stone', 'mesecons:piston','default:stone'}, {'default:stone', 'mesecons:mesecon','default:stone'}, - } }) -deployer_on = function(pos, node) - local pos1={} - pos1.x=pos.x - pos1.y=pos.y - pos1.z=pos.z - local pos2={} - pos2.x=pos.x - pos2.y=pos.y - pos2.z=pos.z - if node.param2==3 then - pos1.x=pos1.x+1 - pos2.x=pos2.x+2 - end - if node.param2==2 then - pos1.z=pos1.z+1 - pos2.z=pos2.z+2 - end - if node.param2==1 then - pos1.x=pos1.x-1 - pos2.x=pos2.x-2 - end - if node.param2==0 then - pos1.z=pos1.z-1 - pos2.z=pos2.z-2 - end +local function swap_node(pos, name) + local node = minetest.get_node(pos) + if node.name == name then + return + end + node.name = name + minetest.swap_node(pos, node) +end - if node.name == "pipeworks:deployer_off" then - hacky_swap_node(pos,"pipeworks:deployer_on") - nodeupdate(pos) - local meta = minetest.env:get_meta(pos); - - local inv = meta:get_inventory() - local invlist=inv:get_list("main") - for i,stack in ipairs(invlist) do +local function delay(x) + return (function() return x end) +end - if stack:get_name() ~=nil and stack:get_name() ~="" and minetest.env:get_node(pos1).name == "air" then - local placer={} - function placer:get_player_name() return "deployer" end - function placer:getpos() return pos end - local stack2=minetest.item_place(stack,placer,{type="node", under=pos1, above=pos2}) - invlist[i]=stack2 - inv:set_list("main",invlist) +local function deployer_on(pos, node) + if node.name ~= "pipeworks:deployer_off" then + return + end + + --locate the above and under positions + local dir = minetest.facedir_to_dir(node.param2) + local pos_under, pos_above = {x = pos.x - dir.x, y = pos.y - dir.y, z = pos.z - dir.z}, {x = pos.x - 2*dir.x, y = pos.y - 2*dir.y, z = pos.z - 2*dir.z} + + swap_node(pos, "pipeworks:deployer_on") + nodeupdate(pos) + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local invlist = inv:get_list("main") + for i, stack in ipairs(invlist) do + if stack:get_name() ~= nil and stack:get_name() ~= "" then--and minetest.get_node(pos_under).name == "air" then --obtain the first non-empty item slot + local pitch + local yaw + if dir.z < 0 then + yaw = 0 + pitch = 0 + elseif dir.z > 0 then + yaw = math.pi + pitch = 0 + elseif dir.x < 0 then + yaw = 3*math.pi/2 + pitch = 0 + elseif dir.x > 0 then + yaw = math.pi/2 + pitch = 0 + elseif dir.y > 0 then + yaw = 0 + pitch = -math.pi/2 + else + yaw = 0 + pitch = math.pi/2 + end + local placer = { + get_inventory_formspec = delay(meta:get_string("formspec")), + get_look_dir = delay({x = -dir.x, y = -dir.y, z = -dir.z}), + get_look_pitch = delay(pitch), + get_look_yaw = delay(yaw), + get_player_control = delay({jump=false, right=false, left=false, LMB=false, RMB=false, sneak=false, aux1=false, down=false, up=false}), + get_player_control_bits = delay(0), + get_player_name = delay(meta:get_string("owner")), + is_player = delay(true), + set_inventory_formspec = delay(), + getpos = delay({x = pos.x, y = pos.y - 1.5, z = pos.z}), -- Player height + get_hp = delay(20), + get_inventory = delay(inv), + get_wielded_item = delay(stack), + get_wield_index = delay(i), + get_wield_list = delay("main"), + moveto = delay(), + punch = delay(), + remove = delay(), + right_click = delay(), + setpos = delay(), + set_hp = delay(), + set_properties = delay(), + set_wielded_item = function(self, item) inv:set_stack("main", i, item) end, + set_animation = delay(), + set_attach = delay(), + set_detach = delay(), + set_bone_position = delay(), + } + local pointed_thing = {type="node", under=pos_under, above=pos_above} + local stack2 + if minetest.registered_items[stack:get_name()] then + stack2 = minetest.registered_items[stack:get_name()].on_place(stack, placer, pointed_thing) + end + --if minetest.setting_getbool("creative_mode") and not minetest.get_modpath("unified_inventory") then --infinite stacks ahoy! + -- stack2:take_item() + --end + inv:set_stack("main", i, stack2) return end - end end end -deployer_off = function(pos, node) +local deployer_off = function(pos, node) if node.name == "pipeworks:deployer_on" then - hacky_swap_node(pos,"pipeworks:deployer_off") + swap_node(pos, "pipeworks:deployer_off") nodeupdate(pos) end end @@ -67,24 +117,28 @@ minetest.register_node("pipeworks:deployer_off", { description = "Deployer", tile_images = {"pipeworks_deployer_top.png","pipeworks_deployer_bottom.png","pipeworks_deployer_side2.png","pipeworks_deployer_side1.png", "pipeworks_deployer_back.png","pipeworks_deployer_front_off.png"}, - mesecons = {effector={action_on=deployer_on,action_off=deployer_off}}, + mesecons = {effector={rules=pipeworks.rules_all,action_on=deployer_on,action_off=deployer_off}}, tube={insert_object=function(pos,node,stack,direction) - local meta=minetest.env:get_meta(pos) + local meta=minetest.get_meta(pos) local inv=meta:get_inventory() return inv:add_item("main",stack) end, can_insert=function(pos,node,stack,direction) - local meta=minetest.env:get_meta(pos) + local meta=minetest.get_meta(pos) local inv=meta:get_inventory() return inv:room_for_item("main",stack) end, - input_inventory="main"}, + input_inventory="main", + connect_sides={back=1}, + can_remove = function(pos, node, stack, dir) + return stack:get_count() + end}, is_ground_content = true, paramtype2 = "facedir", groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2,tubedevice=1, tubedevice_receiver=1}, sounds = default.node_sound_stone_defaults(), on_construct = function(pos) - local meta = minetest.env:get_meta(pos) + local meta = minetest.get_meta(pos) meta:set_string("formspec", "invsize[8,9;]".. "label[0,0;Deployer]".. @@ -94,38 +148,85 @@ minetest.register_node("pipeworks:deployer_off", { local inv = meta:get_inventory() inv:set_size("main", 3*3) end, - can_dig = function(pos,player) - local meta = minetest.env:get_meta(pos); + local meta = minetest.get_meta(pos); local inv = meta:get_inventory() return inv:is_empty("main") end, - + after_place_node = function (pos, placer) + pipeworks.scan_for_tube_objects(pos, placer) + local placer_pos = placer:getpos() + + --correct for the player's height + if placer:is_player() then placer_pos.y = placer_pos.y + 1.5 end + + --correct for 6d facedir + if placer_pos then + local dir = { + x = pos.x - placer_pos.x, + y = pos.y - placer_pos.y, + z = pos.z - placer_pos.z + } + local node = minetest.get_node(pos) + node.param2 = minetest.dir_to_facedir(dir, true) + minetest.set_node(pos, node) + minetest.log("action", "real (6d) facedir: " .. node.param2) + end + + minetest.get_meta(pos):set_string("owner", placer:get_player_name()) + end, + after_dig_node = pipeworks.scan_for_tube_objects, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + if player:get_player_name() ~= meta:get_string("owner") and meta:get_string("owner") ~= "" then + return 0 + end + return count + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if player:get_player_name() ~= meta:get_string("owner") and meta:get_string("owner") ~= "" then + return 0 + end + return stack:get_count() + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if player:get_player_name() ~= meta:get_string("owner") and meta:get_string("owner") ~= "" then + return 0 + end + return stack:get_count() + end }) minetest.register_node("pipeworks:deployer_on", { description = "Deployer", tile_images = {"pipeworks_deployer_top.png","pipeworks_deployer_bottom.png","pipeworks_deployer_side2.png","pipeworks_deployer_side1.png", "pipeworks_deployer_back.png","pipeworks_deployer_front_on.png"}, - mesecons = {effector={action_on=deployer_on,action_off=deployer_off}}, + mesecons = {effector={rules=pipeworks.rules_all,action_on=deployer_on,action_off=deployer_off}}, tube={insert_object=function(pos,node,stack,direction) - local meta=minetest.env:get_meta(pos) + local meta=minetest.get_meta(pos) local inv=meta:get_inventory() return inv:add_item("main",stack) end, can_insert=function(pos,node,stack,direction) - local meta=minetest.env:get_meta(pos) + local meta=minetest.get_meta(pos) local inv=meta:get_inventory() return inv:room_for_item("main",stack) end, - input_inventory="main"}, + input_inventory="main", + connect_sides={back=1}, + can_remove = function(pos, node, stack, dir) + return stack:get_count() + end}, is_ground_content = true, paramtype2 = "facedir", tubelike=1, + drop = "pipeworks:deployer_off", groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2,tubedevice=1, tubedevice_receiver=1,not_in_creative_inventory=1}, sounds = default.node_sound_stone_defaults(), on_construct = function(pos) - local meta = minetest.env:get_meta(pos) + local meta = minetest.get_meta(pos) meta:set_string("formspec", "invsize[8,9;]".. "label[0,0;Deployer]".. @@ -136,23 +237,52 @@ minetest.register_node("pipeworks:deployer_on", { inv:set_size("main", 3*3) end, can_dig = function(pos,player) - local meta = minetest.env:get_meta(pos); + local meta = minetest.get_meta(pos); local inv = meta:get_inventory() return inv:is_empty("main") end, + after_place_node = function (pos, placer) + pipeworks.scan_for_tube_objects(pos, placer) + local placer_pos = placer:getpos() + + --correct for the player's height + if placer:is_player() then placer_pos.y = placer_pos.y + 1.5 end + + --correct for 6d facedir + if placer_pos then + local dir = { + x = pos.x - placer_pos.x, + y = pos.y - placer_pos.y, + z = pos.z - placer_pos.z + } + local node = minetest.get_node(pos) + node.param2 = minetest.dir_to_facedir(dir, true) + minetest.set_node(pos, node) + minetest.log("action", "real (6d) facedir: " .. node.param2) + end + + minetest.get_meta(pos):set_string("owner", placer:get_player_name()) + end, + after_dig_node = pipeworks.scan_for_tube_objects, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + if player:get_player_name() ~= meta:get_string("owner") and meta:get_string("owner") ~= "" then + return 0 + end + return count + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if player:get_player_name() ~= meta:get_string("owner") and meta:get_string("owner") ~= "" then + return 0 + end + return stack:get_count() + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if player:get_player_name() ~= meta:get_string("owner") and meta:get_string("owner") ~= "" then + return 0 + end + return stack:get_count() + end }) - -function hacky_swap_node(pos,name) - local node=minetest.env:get_node(pos) - local meta=minetest.env:get_meta(pos) - local meta0=meta:to_table() - node.name=name - minetest.env:add_node(pos, node) - local meta=minetest.env:get_meta(pos) - meta:from_table(meta0) -end - - - - - diff --git a/mods/pipeworks/devices.lua b/mods/pipeworks/devices.lua index faa1b86..ab14a2d 100644 --- a/mods/pipeworks/devices.lua +++ b/mods/pipeworks/devices.lua @@ -1,6 +1,25 @@ -- List of devices that should participate in the autoplace algorithm -pipes_devicelist = { +local pipereceptor_on = nil +local pipereceptor_off = nil + +if mesecon then + pipereceptor_on = { + receptor = { + state = mesecon.state.on, + rules = pipeworks.mesecons_rules + } + } + + pipereceptor_off = { + receptor = { + state = mesecon.state.off, + rules = pipeworks.mesecons_rules + } + } +end + +local pipes_devicelist = { "pump", "valve", "storage_tank_0", @@ -16,51 +35,11 @@ pipes_devicelist = { "storage_tank_10" } --- tables - -pipe_pumpbody = { - { -7/16, -6/16, -7/16, 7/16, 5/16, 7/16 }, - { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 } -} - -pipe_valvebody = { - { -4/16, -4/16, -4/16, 4/16, 4/16, 4/16 } -} - -pipe_valvehandle_on = { - { -5/16, 4/16, -1/16, 0, 5/16, 1/16 } -} - -pipe_valvehandle_off = { - { -1/16, 4/16, -5/16, 1/16, 5/16, 0 } -} - -spigot_bottomstub = { - { -2/64, -16/64, -6/64, 2/64, 1/64, 6/64 }, -- pipe segment against -Y face - { -4/64, -16/64, -5/64, 4/64, 1/64, 5/64 }, - { -5/64, -16/64, -4/64, 5/64, 1/64, 4/64 }, - { -6/64, -16/64, -2/64, 6/64, 1/64, 2/64 }, - - { -3/64, -16/64, -8/64, 3/64, -14/64, 8/64 }, -- (the flange for it) - { -5/64, -16/64, -7/64, 5/64, -14/64, 7/64 }, - { -6/64, -16/64, -6/64, 6/64, -14/64, 6/64 }, - { -7/64, -16/64, -5/64, 7/64, -14/64, 5/64 }, - { -8/64, -16/64, -3/64, 8/64, -14/64, 3/64 } -} - -spigot_stream = { - { -3/64, -48/64, -5/64, 3/64, -16/64, 5/64 }, - { -4/64, -48/64, -4/64, 4/64, -16/64, 4/64 }, - { -5/64, -48/64, -3/64, 5/64, -16/64, 3/64 } -} - -entry_panel = { - { -8/16, -8/16, -1/16, 8/16, 8/16, 1/16 } -} -- Now define the nodes. local states = { "on", "off" } local dgroups = "" +local pumpboxes = {} for s in ipairs(states) do @@ -70,9 +49,10 @@ for s in ipairs(states) do dgroups = {snappy=3, pipe=1, not_in_creative_inventory=1} end - local pumpboxes = {} - pipe_addbox(pumpboxes, pipe_pumpbody) - pipe_addbox(pumpboxes, pipe_topstub) + pumpboxes = {} + + pipeworks.add_node_box(pumpboxes, pipeworks.pipe_pumpbody) + pipeworks.add_node_box(pumpboxes, pipeworks.pipe_topstub) minetest.register_node("pipeworks:pump_"..states[s], { description = "Pump/Intake Module", @@ -98,33 +78,40 @@ for s in ipairs(states) do groups = dgroups, sounds = default.node_sound_wood_defaults(), walkable = true, - pipelike = 1, - on_construct = function(pos) - local meta = minetest.env:get_meta(pos) - meta:set_int("pipelike",1) - end, after_place_node = function(pos) - pipe_scanforobjects(pos) + pipeworks.scan_for_pipe_objects(pos) end, after_dig_node = function(pos) - pipe_scanforobjects(pos) + pipeworks.scan_for_pipe_objects(pos) end, - drop = "pipeworks:pump_off" + drop = "pipeworks:pump_off", + mesecons = {effector = { + action_on = function (pos, node) + minetest.add_node(pos,{name="pipeworks:pump_on", param2 = node.param2}) + end, + action_off = function (pos, node) + minetest.add_node(pos,{name="pipeworks:pump_off", param2 = node.param2}) + end + }}, + on_punch = function(pos, node, puncher) + local fdir = minetest.get_node(pos).param2 + minetest.add_node(pos, { name = "pipeworks:pump_"..states[3-s], param2 = fdir }) + end }) local valveboxes = {} - pipe_addbox(valveboxes, pipe_leftstub) - pipe_addbox(valveboxes, pipe_valvebody) + pipeworks.add_node_box(valveboxes, pipeworks.pipe_leftstub) + pipeworks.add_node_box(valveboxes, pipeworks.pipe_valvebody) if states[s] == "off" then - pipe_addbox(valveboxes, pipe_valvehandle_off) + pipeworks.add_node_box(valveboxes, pipeworks.pipe_valvehandle_off) else - pipe_addbox(valveboxes, pipe_valvehandle_on) + pipeworks.add_node_box(valveboxes, pipeworks.pipe_valvehandle_on) end - pipe_addbox(valveboxes, pipe_rightstub) + pipeworks.add_node_box(valveboxes, pipeworks.pipe_rightstub) local tilex = "pipeworks_valvebody_ends.png" local tilez = "pipeworks_valvebody_sides.png" - minetest.register_node("pipeworks:valve_"..states[s], { + minetest.register_node("pipeworks:valve_"..states[s].."_empty", { description = "Valve", drawtype = "nodebox", tiles = { @@ -135,6 +122,7 @@ for s in ipairs(states) do tilez, tilez, }, + sunlight_propagates = true, paramtype = "light", paramtype2 = "facedir", selection_box = { @@ -148,22 +136,80 @@ for s in ipairs(states) do groups = dgroups, sounds = default.node_sound_wood_defaults(), walkable = true, - pipelike = 1, - on_construct = function(pos) - local meta = minetest.env:get_meta(pos) - meta:set_int("pipelike",1) - end, after_place_node = function(pos) - pipe_scanforobjects(pos) + pipeworks.scan_for_pipe_objects(pos) end, after_dig_node = function(pos) - pipe_scanforobjects(pos) + pipeworks.scan_for_pipe_objects(pos) end, - drop = "pipeworks:valve_off", - pipelike=1, + drop = "pipeworks:valve_off_empty", + mesecons = {effector = { + action_on = function (pos, node) + minetest.add_node(pos,{name="pipeworks:valve_on_empty", param2 = node.param2}) + end, + action_off = function (pos, node) + minetest.add_node(pos,{name="pipeworks:valve_off_empty", param2 = node.param2}) + end + }}, + on_punch = function(pos, node, puncher) + local fdir = minetest.get_node(pos).param2 + minetest.add_node(pos, { name = "pipeworks:valve_"..states[3-s].."_empty", param2 = fdir }) + end }) end +local valveboxes = {} +pipeworks.add_node_box(valveboxes, pipeworks.pipe_leftstub) +pipeworks.add_node_box(valveboxes, pipeworks.pipe_valvebody) +pipeworks.add_node_box(valveboxes, pipeworks.pipe_rightstub) +pipeworks.add_node_box(valveboxes, pipeworks.pipe_valvehandle_on) + +minetest.register_node("pipeworks:valve_on_loaded", { + description = "Valve", + 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", + }, + sunlight_propagates = true, + paramtype = "light", + paramtype2 = "facedir", + selection_box = { + type = "fixed", + fixed = { -8/16, -4/16, -5/16, 8/16, 5/16, 5/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, + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + drop = "pipeworks:valve_off_empty", + mesecons = {effector = { + action_on = function (pos, node) + minetest.add_node(pos,{name="pipeworks:valve_on_empty", param2 = node.param2}) + end, + action_off = function (pos, node) + minetest.add_node(pos,{name="pipeworks:valve_off_empty", param2 = node.param2}) + end + }}, + on_punch = function(pos, node, puncher) + local fdir = minetest.get_node(pos).param2 + minetest.add_node(pos, { name = "pipeworks:valve_off_empty", param2 = fdir }) + end +}) + -- grating minetest.register_node("pipeworks:grating", { @@ -176,62 +222,54 @@ minetest.register_node("pipeworks:grating", { "pipeworks_grating_sides.png", "pipeworks_grating_sides.png" }, + sunlight_propagates = true, paramtype = "light", groups = {snappy=3, pipe=1}, sounds = default.node_sound_wood_defaults(), walkable = true, after_place_node = function(pos) - pipe_scanforobjects(pos) + pipeworks.scan_for_pipe_objects(pos) end, after_dig_node = function(pos) - pipe_scanforobjects(pos) - end, - pipelike=1, - on_construct = function(pos) - local meta = minetest.env:get_meta(pos) - meta:set_int("pipelike",1) + pipeworks.scan_for_pipe_objects(pos) end, }) -- outlet spigot local spigotboxes = {} - pipe_addbox(spigotboxes, pipe_backstub) - pipe_addbox(spigotboxes, spigot_bottomstub) - pipe_addbox(spigotboxes, pipe_bendsphere) + pipeworks.add_node_box(spigotboxes, pipeworks.pipe_backstub) + pipeworks.add_node_box(spigotboxes, pipeworks.spigot_bottomstub) + pipeworks.add_node_box(spigotboxes, pipeworks.pipe_bendsphere) local spigotboxes_pouring = {} - pipe_addbox(spigotboxes_pouring, spigot_stream) - pipe_addbox(spigotboxes_pouring, pipe_backstub) - pipe_addbox(spigotboxes_pouring, spigot_bottomstub) - pipe_addbox(spigotboxes_pouring, pipe_bendsphere) + pipeworks.add_node_box(spigotboxes_pouring, pipeworks.spigot_stream) + pipeworks.add_node_box(spigotboxes_pouring, pipeworks.pipe_backstub) + pipeworks.add_node_box(spigotboxes_pouring, pipeworks.spigot_bottomstub) + pipeworks.add_node_box(spigotboxes_pouring, pipeworks.pipe_bendsphere) minetest.register_node("pipeworks:spigot", { description = "Spigot outlet", drawtype = "nodebox", tiles = { "pipeworks_spigot_sides.png", - "pipeworks_spigot_sides.png", + "pipeworks_pipe_end_empty.png", "pipeworks_spigot_sides.png", "pipeworks_spigot_sides.png", "pipeworks_pipe_end_empty.png", "pipeworks_spigot_sides.png" }, + sunlight_propagates = true, paramtype = "light", paramtype2 = "facedir", groups = {snappy=3, pipe=1}, sounds = default.node_sound_wood_defaults(), walkable = true, - pipelike=1, - on_construct = function(pos) - local meta = minetest.env:get_meta(pos) - meta:set_int("pipelike",1) - end, after_place_node = function(pos) - pipe_scanforobjects(pos) + pipeworks.scan_for_pipe_objects(pos) end, after_dig_node = function(pos) - pipe_scanforobjects(pos) + pipeworks.scan_for_pipe_objects(pos) end, node_box = { type = "fixed", @@ -248,27 +286,51 @@ minetest.register_node("pipeworks:spigot_pouring", { drawtype = "nodebox", tiles = { "pipeworks_spigot_sides.png", - "pipeworks_spigot_sides.png", - "default_water.png^pipeworks_spigot_sides2.png", - "default_water.png^pipeworks_spigot_sides2.png", - "default_water.png^pipeworks_spigot_sides2.png", - "default_water.png^pipeworks_spigot_sides2.png" + "default_water.png^pipeworks_spigot_bottom2.png", + { name = "default_water_flowing_animated.png^pipeworks_spigot_sides2.png", + animation = { + type = "vertical_frames", + aspect_w=16, + aspect_h=16, + length=0.8 + } + }, + { name = "default_water_flowing_animated.png^pipeworks_spigot_sides2.png", + animation = { + type = "vertical_frames", + aspect_w=16, + aspect_h=16, + length=0.8 + } + }, + { name = "default_water_flowing_animated.png^pipeworks_spigot_sides2.png", + animation = { + type = "vertical_frames", + aspect_w=16, + aspect_h=16, + length=0.8 + } + }, + { name = "default_water_flowing_animated.png^pipeworks_spigot_sides2.png", + animation = { + type = "vertical_frames", + aspect_w=16, + aspect_h=16, + length=0.8 + } + }, }, + sunlight_propagates = true, paramtype = "light", paramtype2 = "facedir", - groups = {snappy=3, pipe=1}, + groups = {snappy=3, pipe=1, not_in_creative_inventory=1}, sounds = default.node_sound_wood_defaults(), walkable = true, - pipelike=1, - on_construct = function(pos) - local meta = minetest.env:get_meta(pos) - meta:set_int("pipelike",1) - end, after_place_node = function(pos) - pipe_scanforobjects(pos) + pipeworks.scan_for_pipe_objects(pos) end, after_dig_node = function(pos) - pipe_scanforobjects(pos) + pipeworks.scan_for_pipe_objects(pos) end, node_box = { type = "fixed", @@ -281,16 +343,15 @@ minetest.register_node("pipeworks:spigot_pouring", { drop = "pipeworks:spigot", }) - --- sealed pipe entry/exit (decorative horizontal pipe passing through a metal +-- sealed pipe entry/exit (horizontal pipe passing through a metal -- wall, for use in places where walls should look like they're airtight) - local airtightboxes = {} - pipe_addbox(airtightboxes, pipe_frontstub) - pipe_addbox(airtightboxes, pipe_backstub) - pipe_addbox(airtightboxes, entry_panel) +local airtightboxes = {} +pipeworks.add_node_box(airtightboxes, pipeworks.pipe_frontstub) +pipeworks.add_node_box(airtightboxes, pipeworks.pipe_backstub) +pipeworks.add_node_box(airtightboxes, pipeworks.entry_panel) -minetest.register_node("pipeworks:entry_panel", { +minetest.register_node("pipeworks:entry_panel_empty", { description = "Airtight Pipe entry/exit", drawtype = "nodebox", tiles = { @@ -307,31 +368,210 @@ minetest.register_node("pipeworks:entry_panel", { sounds = default.node_sound_wood_defaults(), walkable = true, after_place_node = function(pos) - pipe_scanforobjects(pos) + pipeworks.scan_for_pipe_objects(pos) end, after_dig_node = function(pos) - pipe_scanforobjects(pos) - end, - pipelike=1, - on_construct = function(pos) - local meta = minetest.env:get_meta(pos) - meta:set_int("pipelike",1) + pipeworks.scan_for_pipe_objects(pos) end, node_box = { type = "fixed", fixed = airtightboxes, }, + selection_box = { + type = "fixed", + fixed = { + { -2/16, -2/16, -8/16, 2/16, 2/16, 8/16 }, + { -8/16, -8/16, -1/16, 8/16, 8/16, 1/16 } + } + }, + on_place = function(itemstack, placer, pointed_thing) + if not pipeworks.node_is_owned(pointed_thing.under, placer) + and not pipeworks.node_is_owned(pointed_thing.above, placer) then + local node = minetest.get_node(pointed_thing.under) + + if not minetest.registered_nodes[node.name] + or not minetest.registered_nodes[node.name].on_rightclick then + local pitch = placer:get_look_pitch() + local above = pointed_thing.above + local under = pointed_thing.under + local fdir = minetest.dir_to_facedir(placer:get_look_dir()) + local undernode = minetest.get_node(under) + local abovenode = minetest.get_node(above) + local uname = undernode.name + local aname = abovenode.name + local isabove = (above.x == under.x) and (above.z == under.z) and (pitch > 0) + local pos1 = above + + if above.x == under.x + and above.z == under.z + and ( string.find(uname, "pipeworks:pipe_") + or string.find(uname, "pipeworks:storage_") + or string.find(uname, "pipeworks:expansion_") + or ( string.find(uname, "pipeworks:grating") and not isabove ) + or ( string.find(uname, "pipeworks:pump_") and not isabove ) + or ( string.find(uname, "pipeworks:entry_panel") + and undernode.param2 == 13 ) + ) + then + fdir = 13 + end + + if minetest.registered_nodes[uname]["buildable_to"] then + pos1 = under + end + + if not minetest.registered_nodes[minetest.get_node(pos1).name]["buildable_to"] then return end + + minetest.add_node(pos1, {name = "pipeworks:entry_panel_empty", param2 = fdir }) + pipeworks.scan_for_pipe_objects(pos1) + + if not pipeworks.expect_infinite_stacks then + itemstack:take_item() + end + + else + minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) + end + end + return itemstack + end +}) + +minetest.register_node("pipeworks:entry_panel_loaded", { + description = "Airtight Pipe entry/exit", + drawtype = "nodebox", + tiles = { + "pipeworks_plain.png", + "pipeworks_plain.png", + "pipeworks_plain.png", + "pipeworks_plain.png", + "pipeworks_pipe_end_empty.png", + "pipeworks_pipe_end_empty.png" + }, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=3, pipe=1, not_in_creative_inventory=1}, + sounds = default.node_sound_wood_defaults(), + walkable = true, + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + node_box = { + type = "fixed", + fixed = airtightboxes, + }, + selection_box = { + type = "fixed", + fixed = { + { -2/16, -2/16, -8/16, 2/16, 2/16, 8/16 }, + { -8/16, -8/16, -1/16, 8/16, 8/16, 1/16 } + } + }, + drop = "pipeworks:entry_panel_empty" +}) + +local sensorboxes = {} +pipeworks.add_node_box(sensorboxes, pipeworks.pipe_leftstub) +pipeworks.add_node_box(sensorboxes, pipeworks.pipe_sensorbody) +pipeworks.add_node_box(sensorboxes, pipeworks.pipe_rightstub) + +minetest.register_node("pipeworks:flow_sensor_empty", { + description = "Flow Sensor", + drawtype = "nodebox", + tiles = { + "pipeworks_plain.png", + "pipeworks_plain.png", + "pipeworks_plain.png", + "pipeworks_plain.png", + "pipeworks_windowed_empty.png", + "pipeworks_windowed_empty.png" + }, + sunlight_propagates = true, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=3, pipe=1}, + sounds = default.node_sound_wood_defaults(), + walkable = true, + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + on_construct = function(pos) + if mesecon then + mesecon:receptor_off(pos, rules) + end + end, + node_box = { + type = "fixed", + fixed = sensorboxes, + }, + selection_box = { + type = "fixed", + fixed = { + { -8/16, -2/16, -2/16, 8/16, 2/16, 2/16 }, + } + }, + mesecons = pipereceptor_off +}) + +minetest.register_node("pipeworks:flow_sensor_loaded", { + description = "Flow sensor (on)", + drawtype = "nodebox", + tiles = { + "pipeworks_plain.png", + "pipeworks_plain.png", + "pipeworks_plain.png", + "pipeworks_plain.png", + "pipeworks_sensor_sides_on.png", + "pipeworks_sensor_sides_on.png" + }, + sunlight_propagates = true, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=3, pipe=1, not_in_creative_inventory=1}, + sounds = default.node_sound_wood_defaults(), + walkable = true, + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + on_construct = function(pos) + if mesecon then + mesecon:receptor_on(pos, rules) + end + end, + node_box = { + type = "fixed", + fixed = sensorboxes, + }, + selection_box = { + type = "fixed", + fixed = { + { -8/16, -2/16, -2/16, 8/16, 2/16, 2/16 }, + } + }, + drop = "pipeworks:flow_sensor_empty", + mesecons = pipereceptor_on }) -- tanks for fill = 0, 10 do - if fill == 0 then - filldesc="empty" - sgroups = {snappy=3, pipe=1, tankfill=fill+1} - else + local filldesc="empty" + local sgroups = {snappy=3, pipe=1, tankfill=fill+1} + local image = nil + + if fill ~= 0 then filldesc=fill.."0% full" sgroups = {snappy=3, pipe=1, tankfill=fill+1, not_in_creative_inventory=1} + image = "pipeworks_storage_tank_fittings.png" end minetest.register_node("pipeworks:expansion_tank_"..fill, { @@ -342,8 +582,9 @@ for fill = 0, 10 do "pipeworks_storage_tank_back.png", "pipeworks_storage_tank_back.png", "pipeworks_storage_tank_back.png", - pipeworks_liquid_texture.."^pipeworks_storage_tank_front_"..fill..".png" + pipeworks.liquid_texture.."^pipeworks_storage_tank_front_"..fill..".png" }, + inventory_image = image, paramtype = "light", paramtype2 = "facedir", groups = {snappy=3, pipe=1, tankfill=fill+1, not_in_creative_inventory=1}, @@ -351,16 +592,11 @@ for fill = 0, 10 do walkable = true, drop = "pipeworks:storage_tank_"..fill, after_place_node = function(pos) - pipe_look_for_stackable_tanks(pos) - pipe_scanforobjects(pos) + pipeworks.look_for_stackable_tanks(pos) + pipeworks.scan_for_pipe_objects(pos) end, after_dig_node = function(pos) - pipe_scanforobjects(pos) - end, - pipelike=0, - on_construct = function(pos) - local meta = minetest.env:get_meta(pos) - meta:set_int("pipelike",0) + pipeworks.scan_for_pipe_objects(pos) end, }) @@ -372,94 +608,94 @@ for fill = 0, 10 do "pipeworks_storage_tank_back.png", "pipeworks_storage_tank_back.png", "pipeworks_storage_tank_back.png", - pipeworks_liquid_texture.."^pipeworks_storage_tank_front_"..fill..".png" + pipeworks.liquid_texture.."^pipeworks_storage_tank_front_"..fill..".png" }, + inventory_image = image, paramtype = "light", paramtype2 = "facedir", groups = sgroups, sounds = default.node_sound_wood_defaults(), walkable = true, after_place_node = function(pos) - pipe_look_for_stackable_tanks(pos) - pipe_scanforobjects(pos) + pipeworks.look_for_stackable_tanks(pos) + pipeworks.scan_for_pipe_objects(pos) end, after_dig_node = function(pos) - pipe_scanforobjects(pos) - end, - pipelike=1, - on_construct = function(pos) - local meta = minetest.env:get_meta(pos) - meta:set_int("pipelike",1) + pipeworks.scan_for_pipe_objects(pos) end, }) end --- various actions +-- fountainhead -minetest.register_on_punchnode(function (pos, node) - if node.name=="pipeworks:valve_on" then - fdir = minetest.env:get_node(pos).param2 - minetest.env:add_node(pos, { name = "pipeworks:valve_off", param2 = fdir }) - local meta = minetest.env:get_meta(pos) - meta:set_int("pipelike",0) - end -end) +minetest.register_node("pipeworks:fountainhead", { + description = "Fountainhead", + drawtype = "nodebox", + tiles = { + "pipeworks_fountainhead_top.png", + "pipeworks_pipe_end.png", + "pipeworks_plain.png", + }, + sunlight_propagates = true, + paramtype = "light", + groups = {snappy=3, pipe=1}, + sounds = default.node_sound_wood_defaults(), + walkable = true, + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + on_construct = function(pos) + if mesecon then + mesecon:receptor_on(pos, rules) + end + end, + node_box = { + type = "fixed", + fixed = pipeworks.fountainhead_model , + }, + selection_box = { + type = "fixed", + fixed = { -2/16, -8/16, -2/16, 2/16, 8/16, 2/16 } + }, +}) -minetest.register_on_punchnode(function (pos, node) - if node.name=="pipeworks:valve_off" then - fdir = minetest.env:get_node(pos).param2 - minetest.env:add_node(pos, { name = "pipeworks:valve_on", param2 = fdir }) - local meta = minetest.env:get_meta(pos) - meta:set_int("pipelike",1) - end -end) +minetest.register_node("pipeworks:fountainhead_pouring", { + description = "Fountainhead", + drawtype = "nodebox", + tiles = { + "pipeworks_fountainhead_top.png", + "pipeworks_pipe_end.png", + "pipeworks_plain.png", + }, + sunlight_propagates = true, + paramtype = "light", + groups = {snappy=3, pipe=1, not_in_creative_inventory=1}, + sounds = default.node_sound_wood_defaults(), + walkable = true, + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + on_construct = function(pos) + if mesecon then + mesecon:receptor_on(pos, rules) + end + end, + node_box = { + type = "fixed", + fixed = pipeworks.fountainhead_model, + }, + selection_box = { + type = "fixed", + fixed = { -2/16, -8/16, -2/16, 2/16, 8/16, 2/16 }, + }, + drop = "pipeworks:fountainhead" +}) -minetest.register_on_punchnode(function (pos, node) - if node.name=="pipeworks:pump_on" then - fdir = minetest.env:get_node(pos).param2 - minetest.env:add_node(pos, { name = "pipeworks:pump_off", param2 = fdir }) - end -end) - -minetest.register_on_punchnode(function (pos, node) - if node.name=="pipeworks:pump_off" then - fdir = minetest.env:get_node(pos).param2 - minetest.env:add_node(pos, { name = "pipeworks:pump_on", param2 = fdir }) - end -end) - --- backwards compatibility - -minetest.register_alias("pipeworks:intake", "pipeworks:grating") -minetest.register_alias("pipeworks:outlet", "pipeworks:grating") -minetest.register_alias("pipeworks:pump_off_x", "pipeworks:pump_off") -minetest.register_alias("pipeworks:pump_off_z", "pipeworks:pump_off") -minetest.register_alias("pipeworks:pump_on_x", "pipeworks:pump_on") -minetest.register_alias("pipeworks:pump_on_z", "pipeworks:pump_on") -minetest.register_alias("pipeworks:valve_off_x", "pipeworks:valve_off") -minetest.register_alias("pipeworks:valve_off_z", "pipeworks:valve_off") -minetest.register_alias("pipeworks:valve_on_x", "pipeworks:valve_on") -minetest.register_alias("pipeworks:valve_on_z", "pipeworks:valve_on") -minetest.register_alias("pipeworks:storage_tank_0_x", "pipeworks:storage_tank_0") -minetest.register_alias("pipeworks:storage_tank_0_z", "pipeworks:storage_tank_0") -minetest.register_alias("pipeworks:storage_tank_1_x", "pipeworks:storage_tank_1") -minetest.register_alias("pipeworks:storage_tank_1_z", "pipeworks:storage_tank_1") -minetest.register_alias("pipeworks:storage_tank_2_x", "pipeworks:storage_tank_2") -minetest.register_alias("pipeworks:storage_tank_2_z", "pipeworks:storage_tank_2") -minetest.register_alias("pipeworks:storage_tank_3_x", "pipeworks:storage_tank_3") -minetest.register_alias("pipeworks:storage_tank_3_z", "pipeworks:storage_tank_3") -minetest.register_alias("pipeworks:storage_tank_4_x", "pipeworks:storage_tank_4") -minetest.register_alias("pipeworks:storage_tank_4_z", "pipeworks:storage_tank_4") -minetest.register_alias("pipeworks:storage_tank_5_x", "pipeworks:storage_tank_5") -minetest.register_alias("pipeworks:storage_tank_5_z", "pipeworks:storage_tank_5") -minetest.register_alias("pipeworks:storage_tank_6_x", "pipeworks:storage_tank_6") -minetest.register_alias("pipeworks:storage_tank_6_z", "pipeworks:storage_tank_6") -minetest.register_alias("pipeworks:storage_tank_7_x", "pipeworks:storage_tank_7") -minetest.register_alias("pipeworks:storage_tank_7_z", "pipeworks:storage_tank_7") -minetest.register_alias("pipeworks:storage_tank_8_x", "pipeworks:storage_tank_8") -minetest.register_alias("pipeworks:storage_tank_8_z", "pipeworks:storage_tank_8") -minetest.register_alias("pipeworks:storage_tank_9_x", "pipeworks:storage_tank_9") -minetest.register_alias("pipeworks:storage_tank_9_z", "pipeworks:storage_tank_9") -minetest.register_alias("pipeworks:storage_tank_10_x", "pipeworks:storage_tank_10") -minetest.register_alias("pipeworks:storage_tank_10_z", "pipeworks:storage_tank_10") +minetest.register_alias("pipeworks:valve_off_loaded", "pipeworks:valve_off_empty") diff --git a/mods/pipeworks/flowing_logic.lua b/mods/pipeworks/flowing_logic.lua index ea5b09e..e0a6236 100644 --- a/mods/pipeworks/flowing_logic.lua +++ b/mods/pipeworks/flowing_logic.lua @@ -1,10 +1,12 @@ -- This file provides the actual flow and pathfinding logic that makes water -- move through the pipes. -- --- Contributed by mauvebic, 2013-01-03, with tweaks by Vanessa Ezekowitz +-- Contributed by mauvebic, 2013-01-03, rewritten a bit by Vanessa Ezekowitz -- -local check4liquids = function(pos) +local finitewater = minetest.setting_getbool("liquid_finite") + +pipeworks.check_for_liquids = function(pos) local coords = { {x=pos.x,y=pos.y-1,z=pos.z}, {x=pos.x,y=pos.y+1,z=pos.z}, @@ -13,13 +15,16 @@ local check4liquids = function(pos) {x=pos.x,y=pos.y,z=pos.z-1}, {x=pos.x,y=pos.y,z=pos.z+1}, } for i =1,6 do - local name = minetest.env:get_node(coords[i]).name - if string.find(name,'water') then return true end + local name = minetest.get_node(coords[i]).name + if name and string.find(name,"water") then + if finitewater then minetest.remove_node(coords[i]) end + return true + end end return false end -local check4inflows = function(pos,node) +pipeworks.check_for_inflows = function(pos,node) local coords = { {x=pos.x,y=pos.y-1,z=pos.z}, {x=pos.x,y=pos.y+1,z=pos.z}, @@ -31,83 +36,86 @@ local check4inflows = function(pos,node) local source = false for i =1,6 do if newnode then break end - local name = minetest.env:get_node(coords[i]).name - if (name == 'pipeworks:pump_on' and check4liquids(coords[i])) or string.find(name,'_loaded') then - if string.find(name,'_loaded') then - local source = minetest.env:get_meta(coords[i]):get_string('source') + local name = minetest.get_node(coords[i]).name + if name and (name == "pipeworks:pump_on" and pipeworks.check_for_liquids(coords[i])) or string.find(name,"_loaded") then + if string.find(name,"_loaded") then + source = minetest.get_meta(coords[i]):get_string("source") if source == minetest.pos_to_string(pos) then break end end - newnode = string.gsub(node.name,'empty','loaded') + newnode = string.gsub(node.name,"empty","loaded") source = {x=coords[i].x,y=coords[i].y,z=coords[i].z} - if newnode ~= nil then dbg(newnode) end end end if newnode then - dbg(newnode..' to replace '..node.name) - minetest.env:add_node(pos,{name=newnode}) - minetest.env:get_meta(pos):set_string('source',minetest.pos_to_string(source)) + minetest.add_node(pos,{name=newnode, param2 = node.param2}) + minetest.get_meta(pos):set_string("source",minetest.pos_to_string(source)) end end -local checksources = function(pos,node) - local sourcepos = minetest.string_to_pos(minetest.env:get_meta(pos):get_string('source')) - local source = minetest.env:get_node(sourcepos).name +pipeworks.check_sources = function(pos,node) + local sourcepos = minetest.string_to_pos(minetest.get_meta(pos):get_string("source")) + if not sourcepos then return end + local source = minetest.get_node(sourcepos).name local newnode = false - if not ((source == 'pipeworks:pump_on' and check4liquids(sourcepos)) or string.find(source,'_loaded') or source == 'ignore' ) then - newnode = string.gsub(node.name,'loaded','empty') + if source and not ((source == "pipeworks:pump_on" and pipeworks.check_for_liquids(sourcepos)) or string.find(source,"_loaded") or source == "ignore" ) then + newnode = string.gsub(node.name,"loaded","empty") end - if newnode then dbg(newnode..' to replace '..node.name) end if newnode then - minetest.env:add_node(pos,{name=newnode}) - minetest.env:get_meta(pos):set_string('source','') + minetest.add_node(pos,{name=newnode, param2 = node.param2}) + minetest.get_meta(pos):set_string("source","") end end -local update_outlet = function(pos) - local top = minetest.env:get_node({x=pos.x,y=pos.y+1,z=pos.z}).name - if string.find(top,'_loaded') then - minetest.env:add_node({x=pos.x,y=pos.y-1,z=pos.z},{name='default:water_source'}) - elseif minetest.env:get_node({x=pos.x,y=pos.y-1,z=pos.z}).name == 'default:water_source' then - minetest.env:remove_node({x=pos.x,y=pos.y-1,z=pos.z}) +pipeworks.spigot_check = function(pos, node) + local belowname = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}).name + if belowname and (belowname == "air" or belowname == "default:water_flowing" or belowname == "default:water_source") then + local spigotname = minetest.get_node(pos).name + local fdir=node.param2 + local check = { + {x=pos.x,y=pos.y,z=pos.z+1}, + {x=pos.x+1,y=pos.y,z=pos.z}, + {x=pos.x,y=pos.y,z=pos.z-1}, + {x=pos.x-1,y=pos.y,z=pos.z} + } + local near_node = minetest.get_node(check[fdir+1]) + if near_node and string.find(near_node.name, "_loaded") then + if spigotname and spigotname == "pipeworks:spigot" then + minetest.add_node(pos,{name = "pipeworks:spigot_pouring", param2 = fdir}) + if finitewater or belowname ~= "default:water_source" then + minetest.add_node({x=pos.x,y=pos.y-1,z=pos.z},{name = "default:water_source"}) + end + end + else + if spigotname == "pipeworks:spigot_pouring" then + minetest.add_node({x=pos.x,y=pos.y,z=pos.z},{name = "pipeworks:spigot", param2 = fdir}) + if belowname == "default:water_source" and not finitewater then + minetest.remove_node({x=pos.x,y=pos.y-1,z=pos.z}) + end + end + end end end -local spigot_check = function(pos,node) - local fdir=node.param2 - local check = {{x=pos.x,y=pos.y,z=pos.z+1},{x=pos.x+1,y=pos.y,z=pos.z},{x=pos.x,y=pos.y,z=pos.z-1},{x=pos.x-1,y=pos.y,z=pos.z} } - dbg(fdir..' checking '..minetest.pos_to_string(check[fdir+1])..' for spigot at '..minetest.pos_to_string(pos)) - local top = minetest.env:get_node(check[fdir+1]).name - dbg('found '..top) - if string.find(top,'_loaded') then - minetest.env:add_node({x=pos.x,y=pos.y,z=pos.z},{name='pipeworks:spigot_pouring', param2 = fdir}) - minetest.env:add_node({x=pos.x,y=pos.y-1,z=pos.z},{name='default:water_source'}) - elseif minetest.env:get_node({x=pos.x,y=pos.y-1,z=pos.z}).name == 'default:water_source' then - minetest.env:add_node({x=pos.x,y=pos.y,z=pos.z},{name='pipeworks:spigot', param2 = fdir}) - minetest.env:remove_node({x=pos.x,y=pos.y-1,z=pos.z}) +pipeworks.fountainhead_check = function(pos, node) + local abovename = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}).name + if abovename and (abovename == "air" or abovename == "default:water_flowing" or abovename == "default:water_source") then + local fountainhead_name = minetest.get_node(pos).name + local near_node = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) + if near_node and string.find(near_node.name, "_loaded") then + if fountainhead_name and fountainhead_name == "pipeworks:fountainhead" then + minetest.add_node(pos,{name = "pipeworks:fountainhead_pouring"}) + if finitewater or abovename ~= "default:water_source" then + minetest.add_node({x=pos.x,y=pos.y+1,z=pos.z},{name = "default:water_source"}) + end + end + else + if fountainhead_name == "pipeworks:fountainhead_pouring" then + minetest.add_node({x=pos.x,y=pos.y,z=pos.z},{name = "pipeworks:fountainhead"}) + if abovename == "default:water_source" and not finitewater then + minetest.remove_node({x=pos.x,y=pos.y+1,z=pos.z}) + end + end + end end end - -minetest.register_abm({ - nodenames = pipes_empty_nodenames, - interval = 1, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) check4inflows(pos,node) end -}) - -minetest.register_abm({ - nodenames = pipes_full_nodenames, - interval = 1, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) checksources(pos,node) end -}) - -minetest.register_abm({ - nodenames = {'pipeworks:outlet','pipeworks:spigot','pipeworks:spigot_pouring'}, - interval = 1, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - if node.name == 'pipeworks:outlet' then update_outlet(pos) - elseif node.name == 'pipeworks:spigot' or node.name == 'pipeworks:spigot_pouring' then spigot_check(pos,node) end - end -}) diff --git a/mods/pipeworks/init.lua b/mods/pipeworks/init.lua index ce6bc3c..6964abc 100644 --- a/mods/pipeworks/init.lua +++ b/mods/pipeworks/init.lua @@ -1,127 +1,48 @@ --- Pipeworks mod by Vanessa Ezekowitz - 2012-08-05 +-- Pipeworks mod by Vanessa Ezekowitz - 2013-07-13 -- --- Entirely my own code. This mod supplies various shapes of pipes --- and devices that they can connect to such as pumps, valves, etc. --- All pipes autoconnect as you lay them out, and devices will auto- --- connect to them. +-- This mod supplies various steel pipes and plastic pneumatic tubes +-- and devices that they can connect to. -- -- License: WTFPL -- --- Un-comment the following dofile line to re-enable the old pipe nodes. --- dofile(minetest.get_modpath("pipeworks").."/oldpipes.lua") --- +pipeworks = {} -minetest.register_alias("pipeworks:pipe", "pipeworks:pipe_110000_empty") local DEBUG = false -pipeworks_liquid_texture = "default_water.png" +pipeworks.worldpath = minetest.get_worldpath() +pipeworks.modpath = minetest.get_modpath("pipeworks") -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 }, - { -32/64, -6/64, -2/64, 1/64, 6/64, 2/64 }, +dofile(pipeworks.modpath.."/default_settings.txt") - { -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 } -} - -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 }, - { -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 } -} - -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 }, - { -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 } -} - - -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 }, - { -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 } -} - -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 }, - { -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 } -} - -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 }, - { -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 } -} - -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 }, - { -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 } -} - -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 } -} - --- Functions - -dbg = function(s) - if DEBUG then - print('[PIPEWORKS] ' .. s) - end +-- Read the external config file if it exists. +if io.open(pipeworks.worldpath.."/pipeworks_settings.txt","r") then + dofile(pipeworks.worldpath.."/pipeworks_settings.txt") + io.close() end -function pipes_fix_image_names(table, replacement) - outtable={} +-- Random variables + +pipeworks.expect_infinite_stacks = true +if minetest.get_modpath("unified_inventory") or not minetest.setting_getbool("creative_mode") then + pipeworks.expect_infinite_stacks = false +end + +pipeworks.meseadjlist={{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=0,y=1,z=0},{x=0,y=-1,z=0},{x=1,y=0,z=0},{x=-1,y=0,z=0}} + +pipeworks.rules_all = {{x=0, y=0, z=1},{x=0, y=0, z=-1},{x=1, y=0, z=0},{x=-1, y=0, z=0}, + {x=0, y=1, z=1},{x=0, y=1, z=-1},{x=1, y=1, z=0},{x=-1, y=1, z=0}, + {x=0, y=-1, z=1},{x=0, y=-1, z=-1},{x=1, y=-1, z=0},{x=-1, y=-1, z=0}, + {x=0, y=1, z=0}, {x=0, y=-1, z=0}} + +pipeworks.mesecons_rules={{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=1,y=0,z=0},{x=-1,y=0,z=0},{x=0,y=1,z=0},{x=0,y=-1,z=0}} + +pipeworks.liquid_texture = "default_water.png" + +-- Helper functions + +function pipeworks.fix_image_names(table, replacement) + local outtable={} for i in ipairs(table) do outtable[i]=string.gsub(table[i], "_XXXXX", replacement) end @@ -129,206 +50,79 @@ function pipes_fix_image_names(table, replacement) return outtable end -function pipe_addbox(t, b) +function pipeworks.add_node_box(t, b) for i in ipairs(b) do table.insert(t, b[i]) end end --- now define the nodes! - -pipes_empty_nodenames = {} -pipes_full_nodenames = {} - -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 - local outboxes = {} - local outsel = {} - local outimgs = {} - - if yp==1 then - 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 - 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 - 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 - 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 - 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 - 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 - - local jx = xp+xm - local jy = yp+ym - local jz = zp+zm - - if (jx+jy+jz) == 1 then - if xm == 1 then - table.remove(outimgs, 3) - table.insert(outimgs, 3, "^pipeworks_plain.png") +function pipeworks.node_is_owned(pos, placer) + local ownername = false + if type(IsPlayerNodeOwner) == "function" then -- node_ownership mod + if HasOwner(pos, placer) then -- returns true if the node is owned + if not IsPlayerNodeOwner(pos, placer:get_player_name()) then + if type(getLastOwner) == "function" then -- ...is an old version + ownername = getLastOwner(pos) + elseif type(GetNodeOwnerName) == "function" then -- ...is a recent version + ownername = GetNodeOwnerName(pos) + else + ownername = S("someone") + end + end end - if xp == 1 then - table.remove(outimgs, 4) - table.insert(outimgs, 4, "^pipeworks_plain.png") + + elseif type(isprotect)=="function" then -- glomie's protection mod + if not isprotect(5, pos, placer) then + ownername = S("someone") end - if ym == 1 then - table.remove(outimgs, 1) - table.insert(outimgs, 1, "^pipeworks_plain.png") - end - if xp == 1 then - table.remove(outimgs, 2) - table.insert(outimgs, 2, "^pipeworks_plain.png") - end - if zm == 1 then - table.remove(outimgs, 5) - table.insert(outimgs, 5, "^pipeworks_plain.png") - end - if zp == 1 then - table.remove(outimgs, 6) - table.insert(outimgs, 6, "^pipeworks_plain.png") + elseif type(protector)=="table" and type(protector.can_dig)=="function" then -- Zeg9's protection mod + if not protector.can_dig(5, pos, placer) then + ownername = S("someone") end end - if jx+jy+jz >= 2 then - pipe_addbox(outboxes, pipe_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_liquid_texture.."^pipeworks_windowed_XXXXX.png") - table.insert(outimgs, 5, pipeworks_liquid_texture.."^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_liquid_texture.."^pipeworks_windowed_XXXXX.png") - table.insert(outimgs, 3, pipeworks_liquid_texture.."^pipeworks_windowed_XXXXX.png") - end - - local pname = xm..xp..ym..yp..zm..zp - local pgroups = "" - - if pname ~= "110000" then - pgroups = {snappy=3, pipe=1, not_in_creative_inventory=1} - pipedesc = "Pipe segment (empty, "..pname..")... You hacker, you." + if ownername ~= false then + minetest.chat_send_player( placer:get_player_name(), S("Sorry, %s owns that spot."):format(ownername) ) + return true else - pgroups = {snappy=3, pipe=1} - pipedesc = "Pipe segment" + return false end - - minetest.register_node("pipeworks:pipe_"..pname.."_empty", { - description = pipedesc, - drawtype = "nodebox", - tiles = pipes_fix_image_names(outimgs, "_empty"), - paramtype = "light", - selection_box = { - type = "fixed", - fixed = outsel - }, - node_box = { - type = "fixed", - fixed = outboxes - }, - groups = pgroups, - sounds = default.node_sound_wood_defaults(), - walkable = true, - drop = "pipeworks:pipe_110000_empty", - pipelike=1, - on_construct = function(pos) - local meta = minetest.env:get_meta(pos) - meta:set_int("pipelike",1) - end, - after_place_node = function(pos) - pipe_scanforobjects(pos) - end, - after_dig_node = function(pos) - pipe_scanforobjects(pos) - end, - }) - - minetest.register_node("pipeworks:pipe_"..pname.."_loaded", { - description = "Pipe segment (loaded, "..pname..")... You hacker, you.", - drawtype = "nodebox", - tiles = pipes_fix_image_names(outimgs, "_loaded"), - paramtype = "light", - selection_box = { - type = "fixed", - fixed = outsel - }, - node_box = { - type = "fixed", - fixed = outboxes - }, - groups = {snappy=3, pipe=1, not_in_creative_inventory=1}, - sounds = default.node_sound_wood_defaults(), - walkable = true, - drop = "pipeworks:pipe_110000_empty", - pipelike=1, - on_construct = function(pos) - local meta = minetest.env:get_meta(pos) - meta:set_int("pipelike",1) - end, - after_place_node = function(pos) - pipe_scanforobjects(pos) - end, - after_dig_node = function(pos) - pipe_scanforobjects(pos) - end - }) - table.insert(pipes_empty_nodenames,"pipeworks:pipe_"..pname.."_empty") -- for the abms - table.insert(pipes_full_nodenames,"pipeworks:pipe_"..pname.."_loaded") -- for bacon -end -end -end -end -end end -dofile(minetest.get_modpath("pipeworks").."/tubes.lua") -dofile(minetest.get_modpath("pipeworks").."/devices.lua") -dofile(minetest.get_modpath("pipeworks").."/autoplace.lua") -dofile(minetest.get_modpath("pipeworks").."/crafts.lua") -dofile(minetest.get_modpath("pipeworks").."/flowing_logic.lua") -dofile(minetest.get_modpath("pipeworks").."/compat.lua") -dofile(minetest.get_modpath("pipeworks").."/item_transport.lua") -dofile(minetest.get_modpath("pipeworks").."/autocrafter.lua") -dofile(minetest.get_modpath("pipeworks").."/deployer.lua") -dofile(minetest.get_modpath("pipeworks").."/node_breaker.lua") +function pipeworks.replace_name(tbl,tr,name) + local ntbl={} + for key,i in pairs(tbl) do + if type(i)=="string" then + ntbl[key]=string.gsub(i,tr,name) + elseif type(i)=="table" then + ntbl[key]=pipeworks.replace_name(i,tr,name) + else + ntbl[key]=i + end + end + return ntbl +end + +------------------------------------------- +-- Load the various other parts of the mod + +dofile(pipeworks.modpath.."/models.lua") +dofile(pipeworks.modpath.."/autoplace_pipes.lua") +dofile(pipeworks.modpath.."/autoplace_tubes.lua") +dofile(pipeworks.modpath.."/item_transport.lua") +dofile(pipeworks.modpath.."/flowing_logic.lua") +dofile(pipeworks.modpath.."/crafts.lua") +dofile(pipeworks.modpath.."/tubes.lua") + +if pipeworks.enable_pipes then dofile(pipeworks.modpath.."/pipes.lua") end +if pipeworks.enable_teleport_tube then dofile(pipeworks.modpath.."/teleport_tube.lua") end +if pipeworks.enable_pipe_devices then dofile(pipeworks.modpath.."/devices.lua") end +if pipeworks.enable_redefines then dofile(pipeworks.modpath.."/compat.lua") end +if pipeworks.enable_autocrafter then dofile(pipeworks.modpath.."/autocrafter.lua") end +if pipeworks.enable_deployer then dofile(pipeworks.modpath.."/deployer.lua") end +if pipeworks.enable_node_breaker then dofile(pipeworks.modpath.."/node_breaker.lua") end + +minetest.register_alias("pipeworks:pipe", "pipeworks:pipe_110000_empty") + print("Pipeworks loaded!") + diff --git a/mods/pipeworks/item_transport.lua b/mods/pipeworks/item_transport.lua index 665516e..525dc94 100644 --- a/mods/pipeworks/item_transport.lua +++ b/mods/pipeworks/item_transport.lua @@ -1,14 +1,91 @@ -modpath=minetest.get_modpath("pipeworks") +dofile(pipeworks.modpath.."/compat.lua") -dofile(modpath.."/compat.lua") +--and an extra function for getting the right-facing vector +local function facedir_to_right_dir(facedir) + + --find the other directions + local backdir = minetest.facedir_to_dir(facedir) + local topdir = ({[0]={x=0, y=1, z=0}, + {x=0, y=0, z=1}, + {x=0, y=0, z=-1}, + {x=1, y=0, z=0}, + {x=-1, y=0, z=0}, + {x=0, y=-1, z=0}})[math.floor(facedir/4)] + + --return a cross product + return {x=topdir.y*backdir.z - backdir.y*topdir.z, + y=topdir.z*backdir.x - backdir.z*topdir.x, + z=topdir.x*backdir.y - backdir.x*topdir.y} +end minetest.register_craftitem("pipeworks:filter", { description = "Filter", stack_max = 99, }) +local fakePlayer = { + get_player_name = function() return ":pipeworks" end, + -- any other player functions called by allow_metadata_inventory_take anywhere... + -- perhaps a custom metaclass that errors specially when fakePlayer. is not found? +} + +function pipeworks.tube_item(pos, item) + -- Take item in any format + local stack = ItemStack(item) + local obj = minetest.add_entity(pos, "pipeworks:tubed_item") + obj:get_luaentity():set_item(stack:to_string()) + return obj +end + +-- adding two tube functions +-- can_remove(pos,node,stack,dir) returns the maximum number of items of that stack that can be removed +-- remove_items(pos,node,stack,dir,count) removes count items and returns them +-- both optional w/ sensible defaults and fallback to normal allow_* function +-- XXX: possibly change insert_object to insert_item + +-- sname = the current name to allow for, or nil if it allows anything + +local function grabAndFire(frominv,frominvname,frompos,fromnode,sname,tube,idef,dir,all) + for spos,stack in ipairs(frominv:get_list(frominvname)) do + if (sname == nil and stack:get_name() ~= "") or stack:get_name() == sname then + local doRemove = stack:get_count() + if tube.can_remove then + doRemove = tube.can_remove(frompos, fromnode, stack, dir) + elseif idef.allow_metadata_inventory_take then + doRemove = idef.allow_metadata_inventory_take(frompos, frominvname,spos, stack, fakePlayer) + end + -- stupid lack of continue statements grumble + if doRemove > 0 then + local item + local count + if all then + count = math.min(stack:get_count(), doRemove) + else + count = 1 + end + if tube.remove_items then + -- it could be the entire stack... + item = tube.remove_items(frompos, fromnode, stack, dir, count) + else + item = stack:take_item(count) + frominv:set_stack(frominvname, spos, stack) + if idef.on_metadata_inventory_take then + idef.on_metadata_inventory_take(frompos, frominvname, spos, item, fakePlayer) + end + end + local item1 = pipeworks.tube_item(vector.add(frompos, vector.multiply(dir, 1.4)), item) + item1:get_luaentity().start_pos = vector.add(frompos, dir) + item1:setvelocity(dir) + item1:setacceleration({x=0, y=0, z=0}) + return true-- only fire one item, please + end + end + end + return false +end + minetest.register_node("pipeworks:filter", { - description = "filter", + description = "Filter", tiles = {"pipeworks_filter_top.png", "pipeworks_filter_top.png", "pipeworks_filter_output.png", "pipeworks_filter_input.png", "pipeworks_filter_side.png", "pipeworks_filter_top.png"}, paramtype2 = "facedir", @@ -16,98 +93,267 @@ minetest.register_node("pipeworks:filter", { legacy_facedir_simple = true, sounds = default.node_sound_wood_defaults(), on_construct = function(pos) - local meta = minetest.env:get_meta(pos) + local meta = minetest.get_meta(pos) meta:set_string("formspec", - "invsize[9,9;]".. - "list[current_name;main;0,2;8,2;]".. - "list[current_player;main;0,5;8,4;]") + "invsize[8,6.5;]".. + "list[current_name;main;0,0;8,2;]".. + "list[current_player;main;0,2.5;8,4;]") meta:set_string("infotext", "Filter") local inv = meta:get_inventory() inv:set_size("main", 8*4) end, can_dig = function(pos,player) - local meta = minetest.env:get_meta(pos); + local meta = minetest.get_meta(pos); local inv = meta:get_inventory() return inv:is_empty("main") end, + after_place_node = function(pos) + pipeworks.scan_for_tube_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_tube_objects(pos) + end, mesecons={effector={action_on=function(pos,node) minetest.registered_nodes[node.name].on_punch(pos,node,nil) end}}, + tube={connect_sides={right=1}}, on_punch = function (pos, node, puncher) - local meta = minetest.env:get_meta(pos); - local inv = meta:get_inventory() - local frompos - local dir - if node.param2==0 then - frompos={x=pos.x-1,y=pos.y,z=pos.z} - dir={x=1,y=0,z=0} - elseif node.param2==1 then - frompos={x=pos.x,y=pos.y,z=pos.z+1} - dir={x=0,y=0,z=-1} - elseif node.param2==2 then - frompos={x=pos.x+1,y=pos.y,z=pos.z} - dir={x=-1,y=0,z=0} - else - frompos={x=pos.x,y=pos.y,z=pos.z-1} - dir={x=0,y=0,z=1} - end - local fromnode=minetest.env:get_node(frompos) - local frominv - if not (minetest.registered_nodes[fromnode.name].tube and - minetest.registered_nodes[fromnode.name].tube.input_inventory) then + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + local dir = facedir_to_right_dir(node.param2) + local frompos = {x=pos.x - dir.x, y=pos.y - dir.y, z=pos.z - dir.z} + local fromnode=minetest.get_node(frompos) + if not fromnode then return end + local idef = minetest.registered_nodes[fromnode.name] + -- assert(idef) + local tube = idef.tube + if not (tube and tube.input_inventory) then return - end - local frommeta=minetest.env:get_meta(frompos) - local frominvname=minetest.registered_nodes[fromnode.name].tube.input_inventory - local frominv=frommeta:get_inventory() - for _,filter in ipairs(inv:get_list("main")) do - local sname=filter:get_name() - if sname ~="" then - for spos,stack in ipairs(frominv:get_list(frominvname)) do - if stack:get_name()==sname then - item=stack:take_item() - frominv:set_stack(frominvname,spos,stack) - pos1=pos - item1=tube_item({x=pos1.x,y=pos1.y,z=pos1.z},item) - item1:get_luaentity().start_pos = {x=pos1.x,y=pos1.y,z=pos1.z} - item1:setvelocity(dir) - item1:setacceleration({x=0, y=0, z=0}) - return + end + if tube.before_filter then + tube.before_filter(frompos) + end + local frommeta = minetest.get_meta(frompos) + local frominv = frommeta:get_inventory() + + local function from_inventory(frominvname) + local sname + for _,filter in ipairs(inv:get_list("main")) do + sname = filter:get_name() + if sname ~= "" then + -- XXX: that's a lot of parameters + if grabAndFire(frominv, frominvname, frompos, fromnode, sname, tube, idef, dir) then + return true + end end end - end - end - if inv:is_empty("main") then - for spos,stack in ipairs(frominv:get_list(frominvname)) do - if stack:get_name()~="" then - item=stack:take_item() - frominv:set_stack(frominvname,spos,stack) - pos1=pos - item1=tube_item({x=pos1.x,y=pos1.y,z=pos1.z},item) - item1:get_luaentity().start_pos = {x=pos1.x,y=pos1.y,z=pos1.z} - item1:setvelocity(dir) - item1:setacceleration({x=0, y=0, z=0}) - return + if inv:is_empty("main") then + grabAndFire(frominv, frominvname, frompos, fromnode, nil, tube, idef, dir) + return true end + return false end - end -end, + + if type(tube.input_inventory) == "table" then + for _, i in ipairs(tube.input_inventory) do + if from_inventory(i) then -- fired an item + break + end + end + else + from_inventory(tube.input_inventory) + end + + if tube.after_filter then + tube.after_filter(frompos) + end + end, }) +minetest.register_craftitem("pipeworks:mese_filter", { + description = "Mese filter", + stack_max = 99, +}) -function tube_item(pos, item) - -- Take item in any format - local stack = ItemStack(item) - local obj = minetest.env:add_entity(pos, "pipeworks:tubed_item") - obj:get_luaentity():set_item(stack:to_string()) - return obj +minetest.register_node("pipeworks:mese_filter", { + description = "Mese filter", + tiles = {"pipeworks_mese_filter_top.png", "pipeworks_mese_filter_top.png", "pipeworks_mese_filter_output.png", + "pipeworks_mese_filter_input.png", "pipeworks_mese_filter_side.png", "pipeworks_mese_filter_top.png"}, + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,tubedevice=1,mesecon=2}, + legacy_facedir_simple = true, + sounds = default.node_sound_wood_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", + "invsize[8,6.5;]".. + "list[current_name;main;0,0;8,2;]".. + "list[current_player;main;0,2.5;8,4;]") + meta:set_string("infotext", "Mese filter") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") + end, + after_place_node = function(pos) + pipeworks.scan_for_tube_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_tube_objects(pos) + end, + mesecons={effector={action_on=function(pos,node) + minetest.registered_nodes[node.name].on_punch(pos,node,nil) + end}}, + tube={connect_sides={right=1}}, + on_punch = function (pos, node, puncher) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + local dir = facedir_to_right_dir(node.param2) + local frompos = {x=pos.x - dir.x, y=pos.y - dir.y, z=pos.z - dir.z} + local fromnode=minetest.get_node(frompos) + local idef = minetest.registered_nodes[fromnode.name] + -- assert(idef) + local tube = idef.tube + if not (tube and tube.input_inventory) then + return + end + + if tube.before_filter then + tube.before_filter(frompos) + end + local frommeta = minetest.get_meta(frompos) + local frominv = frommeta:get_inventory() + + local function from_inventory(frominvname) + local sname + for _,filter in ipairs(inv:get_list("main")) do + sname = filter:get_name() + if sname ~= "" then + -- XXX: that's a lot of parameters + if grabAndFire(frominv, frominvname, frompos, fromnode, sname, tube, idef, dir, true) then + return true + end + end + end + if inv:is_empty("main") then + grabAndFire(frominv, frominvname, frompos, fromnode, nil, tube, idef, dir, true) + return true + end + return false + end + + if type(tube.input_inventory) == "table" then + for _, i in ipairs(tube.input_inventory) do + if from_inventory(i) then -- fired an item + break + end + end + else + from_inventory(tube.input_inventory) + end + + if tube.after_filter then + tube.after_filter(frompos) + end + end, +}) + +local function roundpos(pos) + return {x=math.floor(pos.x+0.5),y=math.floor(pos.y+0.5),z=math.floor(pos.z+0.5)} +end + +local function addVect(pos,vect) + return {x=pos.x+vect.x,y=pos.y+vect.y,z=pos.z+vect.z} +end + +local adjlist={{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=0,y=1,z=0},{x=0,y=-1,z=0},{x=1,y=0,z=0},{x=-1,y=0,z=0}} + +function pipeworks.notvel(tbl, vel) + local tbl2={} + for _,val in ipairs(tbl) do + if val.x ~= -vel.x or val.y ~= -vel.y or val.z ~= -vel.z then table.insert(tbl2, val) end + end + return tbl2 +end + +local function go_next(pos, velocity, stack) + local chests = {} + local tubes = {} + local cnode = minetest.get_node(pos) + local cmeta = minetest.get_meta(pos) + local n + local can_go + local speed = math.abs(velocity.x + velocity.y + velocity.z) + local vel = {x = velocity.x/speed, y = velocity.y/speed, z = velocity.z/speed,speed=speed} + if speed >= 4.1 then + speed = 4 + elseif speed >= 1.1 then + speed = speed-0.1 + else + speed = 1 + end + vel.speed = speed + if minetest.registered_nodes[cnode.name] and minetest.registered_nodes[cnode.name].tube and minetest.registered_nodes[cnode.name].tube.can_go then + can_go = minetest.registered_nodes[cnode.name].tube.can_go(pos, cnode, vel, stack) + else + can_go = pipeworks.notvel(adjlist, vel) + end + local meta = nil + for _,vect in ipairs(can_go) do + local npos = addVect(pos,vect) + local node = minetest.get_node(npos) + local tube_receiver = minetest.get_item_group(node.name,"tubedevice_receiver") + meta = minetest.get_meta(npos) + local tubelike = meta:get_int("tubelike") + if tube_receiver == 1 then + if minetest.registered_nodes[node.name].tube and + minetest.registered_nodes[node.name].tube.can_insert and + minetest.registered_nodes[node.name].tube.can_insert(npos, node, stack, vect) then + local i = #chests + 1 + chests[i] = {} + chests[i].pos = npos + chests[i].vect = vect + end + elseif tubelike == 1 then + local i = #tubes + 1 + tubes[i] = {} + tubes[i].pos = npos + tubes[i].vect = vect + end + end + if chests[1] == nil then--no chests found + if tubes[1] == nil then + return 0 + else + n = (cmeta:get_int("tubedir")%(#tubes)) + 1 + if pipeworks.enable_cyclic_mode then + cmeta:set_int("tubedir",n) + end + velocity.x = tubes[n].vect.x*vel.speed + velocity.y = tubes[n].vect.y*vel.speed + velocity.z = tubes[n].vect.z*vel.speed + end + else + n = (cmeta:get_int("tubedir")%(#chests))+1 + if pipeworks.enable_cyclic_mode then + cmeta:set_int("tubedir",n) + end + velocity.x = chests[n].vect.x*speed + velocity.y = chests[n].vect.y*speed + velocity.z = chests[n].vect.z*speed + end + return 1 end minetest.register_entity("pipeworks:tubed_item", { initial_properties = { hp_max = 1, physical = false, - collisionbox = {0,0,0,0,0,0}, +-- collisionbox = {0,0,0,0,0,0}, + collisionbox = {0.1,0.1,0.1,0.1,0.1,0.1}, visual = "sprite", visual_size = {x=0.5, y=0.5}, textures = {""}, @@ -153,15 +399,14 @@ minetest.register_entity("pipeworks:tubed_item", { end, get_staticdata = function(self) - if self.start_pos==nil then return end - local velocity=self.object:getvelocity() - --self.object:setvelocity({x=0,y=0,z=0}) - self.object:setpos(self.start_pos) - return minetest.serialize({ - itemstring=self.itemstring, - velocity=velocity, - start_pos=self.start_pos - }) + if self.start_pos==nil then return end + local velocity=self.object:getvelocity() + self.object:setpos(self.start_pos) + return minetest.serialize({ + itemstring=self.itemstring, + velocity=velocity, + start_pos=self.start_pos + }) end, on_activate = function(self, staticdata) @@ -184,199 +429,118 @@ minetest.register_entity("pipeworks:tubed_item", { end, on_step = function(self, dtime) - if self.start_pos then - local pos = self.object:getpos() - local node = minetest.env:get_node(pos) - local meta = minetest.env:get_meta(pos) - tubelike=meta:get_int("tubelike") - local stack = ItemStack(self.itemstring) - local drop_pos=nil + if self.start_pos==nil then + local pos = self.object:getpos() + self.start_pos=roundpos(pos) + end + local pos = self.object:getpos() + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + local tubelike = meta:get_int("tubelike") + local stack = ItemStack(self.itemstring) + local drop_pos = nil - local velocity=self.object:getvelocity() + local velocity=self.object:getvelocity() - if velocity==nil then return end + if velocity == nil then return end - local velocitycopy={x=velocity.x,y=velocity.y,z=velocity.z} - - local moved=false - local speed=math.abs(velocity.x+velocity.y+velocity.z) - local vel={x=velocity.x/speed,y=velocity.y/speed,z=velocity.z/speed} - - if math.abs(vel.x)==1 then - local next_node=math.abs(pos.x-self.start_pos.x) + local velocitycopy = {x = velocity.x, y = velocity.y, z = velocity.z} + + local moved = false + local speed = math.abs(velocity.x+velocity.y+velocity.z) + local vel = {x = velocity.x/speed, y = velocity.y/speed, z = velocity.z/speed, speed = speed} + + if math.abs(vel.x) == 1 then + local next_node = math.abs(pos.x-self.start_pos.x) + if next_node >= 1 then + self.start_pos.x = self.start_pos.x+vel.x + moved = true + end + elseif math.abs(vel.y) == 1 then + local next_node = math.abs(pos.y-self.start_pos.y) if next_node >= 1 then - self.start_pos.x=self.start_pos.x+vel.x - moved=true - end - elseif math.abs(vel.y)==1 then - local next_node=math.abs(pos.y-self.start_pos.y) - if next_node >= 1 then - self.start_pos.y=self.start_pos.y+vel.y - moved=true + self.start_pos.y = self.start_pos.y+vel.y + moved = true end - elseif math.abs(vel.z)==1 then - local next_node=math.abs(pos.z-self.start_pos.z) - if next_node >= 1 then - self.start_pos.z=self.start_pos.z+vel.z - moved=true + elseif math.abs(vel.z) == 1 then + local next_node = math.abs(pos.z-self.start_pos.z) + if next_node >= 1 then + self.start_pos.z = self.start_pos.z+vel.z + moved = true + end end - end - - local sposcopy={x=self.start_pos.x,y=self.start_pos.y,z=self.start_pos.z} - - node = minetest.env:get_node(self.start_pos) - if moved and minetest.get_item_group(node.name,"tubedevice_receiver")==1 then - if minetest.registered_nodes[node.name].tube and minetest.registered_nodes[node.name].tube.insert_object then - leftover = minetest.registered_nodes[node.name].tube.insert_object(self.start_pos,node,stack,vel) - else - leftover = stack - end - --drop_pos=minetest.env:find_node_near(self.start_pos,1,"air") - --if drop_pos and not leftover:is_empty() then minetest.item_drop(leftover,"",drop_pos) end - --self.object:remove() - if leftover:is_empty() then - self.object:remove() + + local sposcopy = {x = self.start_pos.x, y = self.start_pos.y, z = self.start_pos.z} + + node = minetest.get_node(self.start_pos) + if moved and minetest.get_item_group(node.name, "tubedevice_receiver") == 1 then + local leftover = nil + if minetest.registered_nodes[node.name].tube and minetest.registered_nodes[node.name].tube.insert_object then + leftover = minetest.registered_nodes[node.name].tube.insert_object(self.start_pos, node, stack, vel) + else + leftover = stack + end + if leftover:is_empty() then + self.object:remove() + return + end + velocity.x = -velocity.x + velocity.y = -velocity.y + velocity.z = -velocity.z + self.object:setvelocity(velocity) + self:set_item(leftover:to_string()) return end - velocity.x=-velocity.x - velocity.y=-velocity.y - velocity.z=-velocity.z - self.object:setvelocity(velocity) - self:set_item(leftover:to_string()) - return - end - - if moved then - if go_next (self.start_pos, velocity, stack)==0 then - drop_pos=minetest.env:find_node_near({x=self.start_pos.x+velocity.x,y=self.start_pos.y+velocity.y,z=self.start_pos.z+velocity.z}, 1, "air") - if drop_pos then - minetest.item_drop(stack, "", drop_pos) - self.object:remove() + + if moved then + if go_next (self.start_pos, velocity, stack) == 0 then + drop_pos = minetest.find_node_near(vector.add(self.start_pos, velocity), 1, "air") + if drop_pos then + minetest.item_drop(stack, "", drop_pos) + self.object:remove() + end end end + + if velocity.x~=velocitycopy.x or velocity.y~=velocitycopy.y or velocity.z~=velocitycopy.z or + self.start_pos.x~=sposcopy.x or self.start_pos.y~=sposcopy.y or self.start_pos.z~=sposcopy.z then + self.object:setpos(self.start_pos) + self.object:setvelocity(velocity) + end end - - if velocity.x~=velocitycopy.x or velocity.y~=velocitycopy.y or velocity.z~=velocitycopy.z or - self.start_pos.x~=sposcopy.x or self.start_pos.y~=sposcopy.y or self.start_pos.z~=sposcopy.z then - self.object:setpos(self.start_pos) - self.object:setvelocity(velocity) - end - - end -end }) - -function addVect(pos,vect) -return {x=pos.x+vect.x,y=pos.y+vect.y,z=pos.z+vect.z} -end - -adjlist={{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=0,y=1,z=0},{x=0,y=-1,z=0},{x=1,y=0,z=0},{x=-1,y=0,z=0}} - -function notvel(tbl,vel) - tbl2={} - for _,val in ipairs(tbl) do - if val.x~=-vel.x or val.y~=-vel.y or val.z~=-vel.z then table.insert(tbl2,val) end - end - return tbl2 -end - -function go_next(pos,velocity,stack) - local chests={} - local tubes={} - local cnode=minetest.env:get_node(pos) - local cmeta=minetest.env:get_meta(pos) - local node - local meta - local tubelike - local tube_receiver - local len=1 - local n - local can_go - local speed=math.abs(velocity.x+velocity.y+velocity.z) - local vel={x=velocity.x/speed,y=velocity.y/speed,z=velocity.z/speed,speed=speed} - if speed>=4.1 then - speed=4 - elseif speed>=1.1 then - speed=speed-0.1 - else - speed=1 - end - vel.speed=speed - if minetest.registered_nodes[cnode.name].tube and minetest.registered_nodes[cnode.name].tube.can_go then - can_go=minetest.registered_nodes[cnode.name].tube.can_go(pos,node,vel,stack) - else - can_go=notvel(adjlist,vel) - end - for _,vect in ipairs(can_go) do - npos=addVect(pos,vect) - node=minetest.env:get_node(npos) - tube_receiver=minetest.get_item_group(node.name,"tubedevice_receiver") - meta=minetest.env:get_meta(npos) - tubelike=meta:get_int("tubelike") - if tube_receiver==1 then - if minetest.registered_nodes[node.name].tube and - minetest.registered_nodes[node.name].tube.can_insert and - minetest.registered_nodes[node.name].tube.can_insert(npos,node,stack,vect) then - local i=1 - repeat - if chests[i]==nil then break end - i=i+1 - until false - chests[i]={} - chests[i].pos=npos - chests[i].vect=vect - end - elseif tubelike==1 then - local i=1 - repeat - if tubes[i]==nil then break end - i=i+1 - until false - tubes[i]={} - tubes[i].pos=npos - tubes[i].vect=vect +if minetest.get_modpath("mesecons_mvps") ~= nil then + local function add_table(table,toadd) + local i = 1 + while true do + o = table[i] + if o == toadd then return end + if o == nil then break end + i = i+1 end + table[i] = toadd end - if chests[1]==nil then--no chests found - if tubes[1]==nil then - return 0 - else - local i=1 - repeat - if tubes[i]==nil then break end - i=i+1 - until false - n=meta:get_int("tubedir")+1 - repeat - if n>=i then - n=n-i+1 - else - break + mesecon:register_mvps_unmov("pipeworks:tubed_item") + mesecon:register_on_mvps_move(function(moved_nodes) + local objects_to_move = {} + for _, n in ipairs(moved_nodes) do + local objects = minetest.get_objects_inside_radius(n.oldpos, 1) + for _, obj in ipairs(objects) do + local entity = obj:get_luaentity() + if entity and entity.name == "pipeworks:tubed_item" then + --objects_to_move[#objects_to_move+1] = obj + add_table(objects_to_move, obj) end - until false - meta:set_int("tubedir",n) - velocity.x=tubes[n].vect.x*vel.speed - velocity.y=tubes[n].vect.y*vel.speed - velocity.z=tubes[n].vect.z*vel.speed - end - else - local i=1 - repeat - if chests[i]==nil then break end - i=i+1 - until false - n=meta:get_int("tubedir")+1 - repeat - if n>=i then - n=n-i+1 - else - break end - until false - velocity.x=chests[n].vect.x*speed - velocity.y=chests[n].vect.y*speed - velocity.z=chests[n].vect.z*speed - end - return 1 -end \ No newline at end of file + end + if #objects_to_move > 0 then + local dir = vector.subtract(moved_nodes[1].pos, moved_nodes[1].oldpos) + for _, obj in ipairs(objects_to_move) do + local entity = obj:get_luaentity() + obj:setpos(vector.add(obj:getpos(), dir)) + entity.start_pos = vector.add(entity.start_pos, dir) + end + end + end) +end diff --git a/mods/pipeworks/models.lua b/mods/pipeworks/models.lua new file mode 100644 index 0000000..6a841d3 --- /dev/null +++ b/mods/pipeworks/models.lua @@ -0,0 +1,202 @@ +--------------------- +-- The various models + +-- Pipe models + +pipeworks.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 }, + { -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 } +} + +pipeworks.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 }, + { -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 } +} + +pipeworks.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 }, + { -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 } +} + +pipeworks.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 }, + { -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 } +} + +pipeworks.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 }, + { -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 } +} + +pipeworks.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 }, + { -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 } +} + +pipeworks.pipe_boxes = {pipeworks.pipe_leftstub, pipeworks.pipe_rightstub, pipeworks.pipe_bottomstub, pipeworks.pipe_topstub, pipeworks.pipe_frontstub, pipeworks.pipe_backstub} + +pipeworks.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 }, + { -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 } +} + +pipeworks.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 } +} + +-- Tube models + +pipeworks.tube_leftstub = { + { -32/64, -9/64, -9/64, 9/64, 9/64, 9/64 }, -- tube segment against -X face +} + +pipeworks.tube_rightstub = { + { -9/64, -9/64, -9/64, 32/64, 9/64, 9/64 }, -- tube segment against +X face +} + +pipeworks.tube_bottomstub = { + { -9/64, -32/64, -9/64, 9/64, 9/64, 9/64 }, -- tube segment against -Y face +} + +pipeworks.tube_topstub = { + { -9/64, -9/64, -9/64, 9/64, 32/64, 9/64 }, -- tube segment against +Y face +} + +pipeworks.tube_frontstub = { + { -9/64, -9/64, -32/64, 9/64, 9/64, 9/64 }, -- tube segment against -Z face +} + +pipeworks.tube_backstub = { + { -9/64, -9/64, -9/64, 9/64, 9/64, 32/64 }, -- tube segment against -Z face +} + +pipeworks.tube_boxes = {pipeworks.tube_leftstub, pipeworks.tube_rightstub, pipeworks.tube_bottomstub, pipeworks.tube_topstub, pipeworks.tube_frontstub, pipeworks.tube_backstub} + +pipeworks.tube_selectboxes = { + { -32/64, -10/64, -10/64, 10/64, 10/64, 10/64 }, + { -10/64 , -10/64, -10/64, 32/64, 10/64, 10/64 }, + { -10/64 , -32/64, -10/64, 10/64, 10/64, 10/64 }, + { -10/64 , -10/64, -10/64, 10/64, 32/64, 10/64 }, + { -10/64 , -10/64, -32/64, 10/64, 10/64, 10/64 }, + { -10/64 , -10/64, -10/64, 10/64, 10/64, 32/64 } +} + +-- Device models + +pipeworks.pipe_pumpbody = { + { -7/16, -6/16, -7/16, 7/16, 5/16, 7/16 }, + { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 } +} + +pipeworks.pipe_valvebody = { + { -4/16, -4/16, -4/16, 4/16, 4/16, 4/16 } +} + +pipeworks.pipe_valvehandle_on = { + { -5/16, 4/16, -1/16, 0, 5/16, 1/16 } +} + +pipeworks.pipe_valvehandle_off = { + { -1/16, 4/16, -5/16, 1/16, 5/16, 0 } +} + +pipeworks.pipe_sensorbody = { + { -3/16, -2/16, -2/16, 3/16, 2/16, 2/16 } +} + +pipeworks.spigot_bottomstub = { + { -2/64, -16/64, -6/64, 2/64, 1/64, 6/64 }, -- pipe segment against -Y face + { -4/64, -16/64, -5/64, 4/64, 1/64, 5/64 }, + { -5/64, -16/64, -4/64, 5/64, 1/64, 4/64 }, + { -6/64, -16/64, -2/64, 6/64, 1/64, 2/64 }, + + { -3/64, -16/64, -8/64, 3/64, -14/64, 8/64 }, -- (the flange for it) + { -5/64, -16/64, -7/64, 5/64, -14/64, 7/64 }, + { -6/64, -16/64, -6/64, 6/64, -14/64, 6/64 }, + { -7/64, -16/64, -5/64, 7/64, -14/64, 5/64 }, + { -8/64, -16/64, -3/64, 8/64, -14/64, 3/64 } +} + +pipeworks.spigot_stream = { + { -3/64, (-41/64)-0.01, -5/64, 3/64, -16/64, 5/64 }, + { -4/64, (-41/64)-0.01, -4/64, 4/64, -16/64, 4/64 }, + { -5/64, (-41/64)-0.01, -3/64, 5/64, -16/64, 3/64 } +} + +pipeworks.entry_panel = { + { -8/16, -8/16, -1/16, 8/16, 8/16, 1/16 } +} + +pipeworks.fountainhead_model = { + { -2/64, -32/64, -6/64, 2/64, 21/64, 6/64 }, -- main segment + { -4/64, -32/64, -5/64, 4/64, 21/64, 5/64 }, + { -5/64, -32/64, -4/64, 5/64, 21/64, 4/64 }, + { -6/64, -32/64, -2/64, 6/64, 21/64, 2/64 }, + + { -3/64, -32/64, -8/64, 3/64, -30/64, 8/64 }, -- bottom flange + { -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 }, + + { -3/64, 20/64, -8/64, 3/64, 32/64, 8/64 }, -- top flange/outlet + { -5/64, 20/64, -7/64, 5/64, 32/64, 7/64 }, + { -6/64, 20/64, -6/64, 6/64, 32/64, 6/64 }, + { -7/64, 20/64, -5/64, 7/64, 32/64, 5/64 }, + { -8/64, 20/64, -3/64, 8/64, 32/64, 3/64 } +} diff --git a/mods/pipeworks/node_breaker.lua b/mods/pipeworks/node_breaker.lua index 3af1902..b9267f4 100644 --- a/mods/pipeworks/node_breaker.lua +++ b/mods/pipeworks/node_breaker.lua @@ -1,36 +1,197 @@ + +--register aliases for when someone had technic installed, but then uninstalled it but not pipeworks +minetest.register_alias("technic:nodebreaker_off", "pipeworks:nodebreaker_off") +minetest.register_alias("technic:nodebreaker_on", "pipeworks:nodebreaker_on") +minetest.register_alias("technic:node_breaker_off", "pipeworks:nodebreaker_off") --old name +minetest.register_alias("technic:node_breaker_on", "pipeworks:nodebreaker_on") --old name + minetest.register_craft({ output = 'pipeworks:nodebreaker_off 1', recipe = { - {'default:wood', 'default:pick_mese','default:wood'}, + {'group:wood', 'default:pick_mese','group:wood'}, {'default:stone', 'mesecons:piston','default:stone'}, {'default:stone', 'mesecons:mesecon','default:stone'}, - } }) - -function hacky_swap_node(pos,name) - local node=minetest.env:get_node(pos) - local meta=minetest.env:get_meta(pos) - local meta0=meta:to_table() - node.name=name - minetest.env:add_node(pos, node) - local meta=minetest.env:get_meta(pos) - meta:from_table(meta0) +local function swap_node(pos, name) + local node = minetest.get_node(pos) + if node.name == name then + return + end + node.name = name + minetest.swap_node(pos, node) end +--define the functions from https://github.com/minetest/minetest/pull/834 while waiting for the devs to notice it +local function dir_to_facedir(dir, is6d) + --account for y if requested + if is6d and math.abs(dir.y) > math.abs(dir.x) and math.abs(dir.y) > math.abs(dir.z) then + + --from above + if dir.y < 0 then + if math.abs(dir.x) > math.abs(dir.z) then + if dir.x < 0 then + return 19 + else + return 13 + end + else + if dir.z < 0 then + return 10 + else + return 4 + end + end + + --from below + else + if math.abs(dir.x) > math.abs(dir.z) then + if dir.x < 0 then + return 15 + else + return 17 + end + else + if dir.z < 0 then + return 6 + else + return 8 + end + end + end + + --otherwise, place horizontally + elseif math.abs(dir.x) > math.abs(dir.z) then + if dir.x < 0 then + return 3 + else + return 1 + end + else + if dir.z < 0 then + return 2 + else + return 0 + end + end +end -node_breaker_on = function(pos, node) +local function delay(x) + return (function() return x end) +end + +local function break_node (pos, facedir) + --locate the outgoing velocity, front, and back of the node via facedir_to_dir + if type(facedir) ~= "number" or facedir < 0 or facedir > 23 then return end + + local vel = minetest.facedir_to_dir(facedir) + local front = {x=pos.x - vel.x, y=pos.y - vel.y, z=pos.z - vel.z} + + local node = minetest.get_node(front) + --if node.name == "air" or node.name == "ignore" then + -- return nil + --elseif minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].liquidtype ~= "none" then + -- return nil + --end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local pick_inv = "pick" + local pick = inv:get_stack("pick", 1) + if pick:is_empty() then + pick = ItemStack("default:pick_mese") + inv:set_stack("ghost_pick", 1, pick) + pick_inv = "ghost_pick" + end + local pitch + local yaw + if vel.z < 0 then + yaw = 0 + pitch = 0 + elseif vel.z > 0 then + yaw = math.pi + pitch = 0 + elseif vel.x < 0 then + yaw = 3*math.pi/2 + pitch = 0 + elseif vel.x > 0 then + yaw = math.pi/2 + pitch = 0 + elseif vel.y > 0 then + yaw = 0 + pitch = -math.pi/2 + else + yaw = 0 + pitch = math.pi/2 + end + local digger = { + get_inventory_formspec = delay(""), + get_look_dir = delay({x = -vel.x, y = -vel.y, z = -vel.z}), + get_look_pitch = delay(pitch), + get_look_yaw = delay(yaw), + get_player_control = delay({jump=false, right=false, left=false, LMB=false, RMB=false, sneak=false, aux1=false, down=false, up=false}), + get_player_control_bits = delay(0), + get_player_name = delay(meta:get_string("owner")), + is_player = delay(true), + set_inventory_formspec = delay(), + getpos = delay({x = pos.x, y = pos.y - 1.5, z = pos.z}), -- Player height + get_hp = delay(20), + get_inventory = delay(inv), + get_wielded_item = delay(pick), + get_wield_index = delay(1), + get_wield_list = delay(pick_inv), + moveto = delay(), + punch = delay(), + remove = delay(), + right_click = delay(), + setpos = delay(), + set_hp = delay(), + set_properties = delay(), + set_wielded_item = function(self, stack) + if stack:get_name() == pick:get_name() then + inv:set_stack(pick_inv, 1, stack) + else + inv:add_item("main", stack) + inv:set_stack(pick_inv, 1, ItemStack("")) + end + end, + set_animation = delay(), + set_attach = delay(), + set_detach = delay(), + set_bone_position = delay(), + } + + if pick_inv == "pick" and minetest.registered_items[pick:get_name()] and minetest.registered_items[pick:get_name()].on_use then + local pos_under, pos_above = {x = pos.x - vel.x, y = pos.y - vel.y, z = pos.z - vel.z}, {x = pos.x - 2*vel.x, y = pos.y - 2*vel.y, z = pos.z - 2*vel.z} + local pointed_thing = {type="node", under=pos_under, above=pos_above} + inv:set_stack(pick_inv, 1, minetest.registered_items[pick:get_name()].on_use(pick, digger, pointed_thing) or pick) + else + minetest.node_dig(front, node, digger) + end + + for i = 1, 100 do + local dropped_item = inv:get_stack("main", i) + if not dropped_item:is_empty() then + local item1 = pipeworks.tube_item({x=pos.x, y=pos.y, z=pos.z}, dropped_item) + item1:get_luaentity().start_pos = {x=pos.x, y=pos.y, z=pos.z} + item1:setvelocity(vel) + item1:setacceleration({x=0, y=0, z=0}) + inv:set_stack("main", i, ItemStack("")) + end + end +end + +local node_breaker_on = function(pos, node) if node.name == "pipeworks:nodebreaker_off" then - hacky_swap_node(pos,"pipeworks:nodebreaker_on") - break_node (pos,node.param2) + swap_node(pos, "pipeworks:nodebreaker_on") + break_node(pos, node.param2) nodeupdate(pos) end end -node_breaker_off = function(pos, node) +local node_breaker_off = function(pos, node) if node.name == "pipeworks:nodebreaker_on" then - hacky_swap_node(pos,"pipeworks:nodebreaker_off") + swap_node(pos, "pipeworks:nodebreaker_off") nodeupdate(pos) end end @@ -41,60 +202,191 @@ minetest.register_node("pipeworks:nodebreaker_off", { "pipeworks_nodebreaker_back.png","pipeworks_nodebreaker_front_off.png"}, is_ground_content = true, paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2,tubedevice=1}, - mesecons= {effector={action_on=node_breaker_on, action_off=node_breaker_off}}, + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2,tubedevice=1, tubedevice_receiver=1}, + mesecons= {effector={rules=pipeworks.rules_all,action_on=node_breaker_on, action_off=node_breaker_off}}, sounds = default.node_sound_stone_defaults(), + tube = {connect_sides = {left = 1, right = 1, back = 1, top = 1, bottom = 1}, + input_inventory = "pick", + insert_object = function(pos, node, stack, direction) + local vel = minetest.facedir_to_dir(node.param2) + if math.abs(vel.x) == math.abs(direction.x) and math.abs(vel.y) == math.abs(direction.y) and math.abs(vel.z) == math.abs(direction.z) then + return stack + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:add_item("pick", stack) + end, + can_insert = function(pos, node, stack, direction) + local vel = minetest.facedir_to_dir(node.param2) + if math.abs(vel.x) == math.abs(direction.x) and math.abs(vel.y) == math.abs(direction.y) and math.abs(vel.z) == math.abs(direction.z) then + return false + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:room_for_item("pick", stack) + end, + can_remove = function(pos, node, stack, dir) + return stack:get_count() + end}, on_construct = function(pos) - local meta = minetest.env:get_meta(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("pick", 1) + inv:set_size("ghost_pick", 1) + inv:set_size("main", 100) + --inv:set_stack("pick", 1, ItemStack("default:pick_mese")) + meta:set_string("formspec", + "invsize[8,6;]".. + "label[0,0;Node breaker]".. + "list[current_name;pick;3.5,0;1,1;]".. + "list[current_player;main;0,2;8,4;]") end, - + after_place_node = function (pos, placer) + pipeworks.scan_for_tube_objects(pos, placer) + local placer_pos = placer:getpos() + + --correct for the player's height + if placer:is_player() then placer_pos.y = placer_pos.y + 1.5 end + + --correct for 6d facedir + if placer_pos then + local dir = { + x = pos.x - placer_pos.x, + y = pos.y - placer_pos.y, + z = pos.z - placer_pos.z + } + local node = minetest.get_node(pos) + node.param2 = dir_to_facedir(dir, true) + minetest.set_node(pos, node) + minetest.log("action", "real (6d) facedir: " .. node.param2) + end + + minetest.get_meta(pos):set_string("owner", placer:get_player_name()) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local stack = oldmetadata.inventory.pick[1] + if not stack:is_empty() then + minetest.add_item(pos, stack) + end + pipeworks.scan_for_tube_objects(pos, oldnode, oldmetadata, digger) + end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + if player:get_player_name() ~= meta:get_string("owner") and meta:get_string("owner") ~= "" then + return 0 + end + return count + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if player:get_player_name() ~= meta:get_string("owner") and meta:get_string("owner") ~= "" then + return 0 + end + return stack:get_count() + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if player:get_player_name() ~= meta:get_string("owner") and meta:get_string("owner") ~= "" then + return 0 + end + return stack:get_count() + end }) minetest.register_node("pipeworks:nodebreaker_on", { description = "Node Breaker", tile_images = {"pipeworks_nodebreaker_top_on.png","pipeworks_nodebreaker_bottom_on.png","pipeworks_nodebreaker_side2_on.png","pipeworks_nodebreaker_side1_on.png", "pipeworks_nodebreaker_back.png","pipeworks_nodebreaker_front_on.png"}, - mesecons= {effector={action_on=node_breaker_on, action_off=node_breaker_off}}, + mesecons= {effector={rules=pipeworks.rules_all,action_on=node_breaker_on, action_off=node_breaker_off}}, is_ground_content = true, paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2,tubedevice=1,not_in_creative_inventory=1}, + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2,tubedevice=1,not_in_creative_inventory=1, tubedevice_receiver=1}, sounds = default.node_sound_stone_defaults(), -}) - -function break_node (pos,n_param) - local pos1={} - local pos2={} - pos1.x=pos.x - pos1.y=pos.y - pos1.z=pos.z - pos2.x=pos.x - pos2.y=pos.y - pos2.z=pos.z - - --param2 3=x+ 1=x- 2=z+ 0=z- - local x_velocity=0 - local z_velocity=0 - - if n_param==3 then pos2.x=pos2.x+1 pos1.x=pos1.x-1 x_velocity=-1 end - if n_param==2 then pos2.z=pos2.z+1 pos1.z=pos1.z-1 z_velocity=-1 end - if n_param==1 then pos2.x=pos2.x-1 pos1.x=pos1.x+1 x_velocity=1 end - if n_param==0 then pos2.z=pos2.z-1 pos1.x=pos1.z+1 z_velocity=1 end - - local node=minetest.env:get_node(pos2) - if node.name == "air" then return nil end - if node.name == "default:lava_source" then return nil end - if node.name == "default:lava_flowing" then return nil end - if node.name == "default:water_source" then minetest.env:remove_node(pos2) return nil end - if node.name == "default:water_flowing" then minetest.env:remove_node(pos2) return nil end - if node.name == "ignore" then minetest.env:remove_node(pos2) return nil end - local drops = minetest.get_node_drops(node.name, "default:pick_mese") - local _, dropped_item - for _, dropped_item in ipairs(drops) do - local item1=tube_item({x=pos.x,y=pos.y,z=pos.z},dropped_item) - item1:get_luaentity().start_pos = {x=pos.x,y=pos.y,z=pos.z} - item1:setvelocity({x=x_velocity, y=0, z=z_velocity}) - item1:setacceleration({x=0, y=0, z=0}) + drop = "pipeworks:nodebreaker_off", + tube = {connect_sides = {left = 1, right = 1, back = 1, top = 1, bottom = 1}, + input_inventory = "pick", + insert_object = function(pos, node, stack, direction) + local vel = minetest.facedir_to_dir(node.param2) + if math.abs(vel.x) == math.abs(direction.x) and math.abs(vel.y) == math.abs(direction.y) and math.abs(vel.z) == math.abs(direction.z) then + return stack + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:add_item("pick", stack) + end, + can_insert = function(pos, node, stack, direction) + local vel = minetest.facedir_to_dir(node.param2) + if math.abs(vel.x) == math.abs(direction.x) and math.abs(vel.y) == math.abs(direction.y) and math.abs(vel.z) == math.abs(direction.z) then + return false + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:room_for_item("pick", stack) + end, + can_remove = function(pos, node, stack, dir) + return stack:get_count() + end}, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("pick", 1) + inv:set_size("ghost_pick", 1) + inv:set_size("main", 100) + meta:set_string("formspec", + "invsize[8,6;]".. + "label[0,0;Node breaker]".. + "list[current_name;pick;3.5,0;1,1;]".. + "list[current_player;main;0,2;8,4;]") + --inv:set_stack("pick", 1, ItemStack("default:pick_mese")) + end, + after_place_node = function (pos, placer) + pipeworks.scan_for_tube_objects(pos, placer) + local placer_pos = placer:getpos() + + --correct for the player's height + if placer:is_player() then placer_pos.y = placer_pos.y + 1.5 end + + --correct for 6d facedir + if placer_pos then + local dir = { + x = pos.x - placer_pos.x, + y = pos.y - placer_pos.y, + z = pos.z - placer_pos.z + } + local node = minetest.get_node(pos) + node.param2 = dir_to_facedir(dir, true) + minetest.set_node(pos, node) + minetest.log("action", "real (6d) facedir: " .. node.param2) end - minetest.env:remove_node(pos2) -end - + + minetest.get_meta(pos):set_string("owner", placer:get_player_name()) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local stack = oldmetadata.inventory.pick[1] + if not stack:is_empty() then + minetest.add_item(pos, stack) + end + pipeworks.scan_for_tube_objects(pos, oldnode, oldmetadata, digger) + end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + if player:get_player_name() ~= meta:get_string("owner") and meta:get_string("owner") ~= "" then + return 0 + end + return count + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if player:get_player_name() ~= meta:get_string("owner") and meta:get_string("owner") ~= "" then + return 0 + end + return stack:get_count() + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if player:get_player_name() ~= meta:get_string("owner") and meta:get_string("owner") ~= "" then + return 0 + end + return stack:get_count() + end +}) diff --git a/mods/pipeworks/oldpipes.lua b/mods/pipeworks/oldpipes.lua deleted file mode 100644 index 90c8a27..0000000 --- a/mods/pipeworks/oldpipes.lua +++ /dev/null @@ -1,360 +0,0 @@ --- 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_segment", - "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 - - if node ~= 2 then - pgroups = {snappy=3, pipe=1, not_in_creative_inventory=1} - else - pgroups = {snappy=3, pipe=1} - end - - 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 = pgroups, - 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, not_in_creative_inventory=1}, - sounds = default.node_sound_wood_defaults(), - walkable = true, - stack_max = 99, - drop = "pipeworks:pipe" - }) -end - diff --git a/mods/pipeworks/pipes.lua b/mods/pipeworks/pipes.lua new file mode 100644 index 0000000..ad79a3e --- /dev/null +++ b/mods/pipeworks/pipes.lua @@ -0,0 +1,226 @@ +-- This file supplies the steel pipes + +local REGISTER_COMPATIBILITY = true + +local pipes_empty_nodenames = {} +local pipes_full_nodenames = {} + +local vti = {4, 3, 2, 1, 6, 5} +local cconnects = {{}, {1}, {1, 2}, {1, 3}, {1, 3, 5}, {1, 2, 3}, {1, 2, 3, 5}, {1, 2, 3, 4}, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5, 6}} +for index, connects in ipairs(cconnects) do + local outboxes = {} + local outsel = {} + local outimgs = {} + + for i = 1, 6 do + outimgs[vti[i]] = "pipeworks_plain.png" + end + + local jx = 0 + local jy = 0 + local jz = 0 + for _, v in ipairs(connects) do + if v == 1 or v == 2 then + jx = jx + 1 + elseif v == 3 or v == 4 then + jy = jy + 1 + else + jz = jz + 1 + end + pipeworks.add_node_box(outboxes, pipeworks.pipe_boxes[v]) + table.insert(outsel, pipeworks.pipe_selectboxes[v]) + outimgs[vti[v]] = "pipeworks_pipe_end.png" + end + + if #connects == 1 then + local v = connects[1] + v = v-1 + 2*(v%2) -- Opposite side + outimgs[vti[v]] = "^pipeworks_plain.png" + end + + if #connects >= 2 then + pipeworks.add_node_box(outboxes, pipeworks.pipe_bendsphere) + end + + if jx == 2 and jy ~= 2 and jz ~= 2 then + outimgs[5] = pipeworks.liquid_texture.."^pipeworks_windowed_XXXXX.png" + outimgs[6] = outimgs[5] + end + + local pgroups = {snappy = 3, pipe = 1, not_in_creative_inventory = 1} + local pipedesc = "Pipe segement".." "..dump(connects).."... You hacker, you." + local image = nil + + if #connects == 0 then + pgroups = {snappy = 3, tube = 1} + pipedesc = "Pipe segment" + image = "pipeworks_pipe_inv.png" + end + + --table.insert(pipeworks.tubenodes, name.."_"..tname) + + minetest.register_node("pipeworks:pipe_"..index.."_empty", { + description = pipedesc, + drawtype = "nodebox", + tiles = pipeworks.fix_image_names(outimgs, "_empty"), + sunlight_propagates = true, + inventory_image = image, + wield_image = image, + paramtype = "light", + paramtype2 = "facedir", + selection_box = { + type = "fixed", + fixed = outsel + }, + node_box = { + type = "fixed", + fixed = outboxes + }, + groups = pgroups, + sounds = default.node_sound_wood_defaults(), + walkable = true, + drop = "pipeworks:pipe_1_empty", + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end + }) + + local pgroups = {snappy = 3, pipe = 1, not_in_creative_inventory = 1} + + minetest.register_node("pipeworks:pipe_"..index.."_loaded", { + description = pipedesc, + drawtype = "nodebox", + tiles = pipeworks.fix_image_names(outimgs, "_loaded"), + sunlight_propagates = true, + paramtype = "light", + paramtype2 = "facedir", + selection_box = { + type = "fixed", + fixed = outsel + }, + node_box = { + type = "fixed", + fixed = outboxes + }, + groups = pgroups, + sounds = default.node_sound_wood_defaults(), + walkable = true, + drop = "pipeworks:pipe_1_empty", + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end + }) + + table.insert(pipes_empty_nodenames, "pipeworks:pipe_"..index.."_empty") + table.insert(pipes_full_nodenames, "pipeworks:pipe_"..index.."_loaded") +end + + + +if REGISTER_COMPATIBILITY then + local cempty = "pipeworks:pipe_compatibility_empty" + local cloaded = "pipeworks:pipe_compatibility_loaded" + minetest.register_node(cempty, { + drawtype = "airlike", + sunlight_propagates = true, + paramtype = "light", + inventory_image = "pipeworks_pipe_inv.png", + wield_image = "pipeworks_pipe_inv.png", + description = "Pipe Segment (legacy)", + groups = {not_in_creative_inventory = 1, pipe_to_update = 1}, + drop = "pipeworks:pipe_1_empty", + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + }) + minetest.register_node(cloaded, { + drawtype = "airlike", + sunlight_propagates = true, + paramtype = "light", + inventory_image = "pipeworks_pipe_inv.png", + groups = {not_in_creative_inventory = 1, pipe_to_update = 1}, + drop = "pipeworks:pipe_1_empty", + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + }) + 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 + local pname = xm..xp..ym..yp..zm..zp + minetest.register_alias("pipeworks:pipe_"..pname.."_empty", cempty) + minetest.register_alias("pipeworks:pipe_"..pname.."_loaded", cloaded) + end + end + end + end + end + end + minetest.register_abm({ + nodenames = {"group:pipe_to_update"}, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local minp = {x = pos.x-1, y = pos.y-1, z = pos.z-1} + local maxp = {x = pos.x+1, y = pos.y+1, z = pos.z+1} + if table.getn(minetest.find_nodes_in_area(minp, maxp, "ignore")) == 0 then + pipeworks.scan_for_pipe_objects(pos) + end + end + }) +end + +table.insert(pipes_empty_nodenames,"pipeworks:valve_on_empty") +table.insert(pipes_empty_nodenames,"pipeworks:valve_off_empty") +table.insert(pipes_empty_nodenames,"pipeworks:entry_panel_empty") +table.insert(pipes_empty_nodenames,"pipeworks:flow_sensor_empty") + +table.insert(pipes_full_nodenames,"pipeworks:valve_on_loaded") +table.insert(pipes_full_nodenames,"pipeworks:entry_panel_loaded") +table.insert(pipes_full_nodenames,"pipeworks:flow_sensor_loaded") + +minetest.register_abm({ + nodenames = pipes_empty_nodenames, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + pipeworks.check_for_inflows(pos,node) + end +}) + +minetest.register_abm({ + nodenames = pipes_full_nodenames, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + pipeworks.check_sources(pos,node) + end +}) + +minetest.register_abm({ + nodenames = {"pipeworks:spigot","pipeworks:spigot_pouring"}, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + pipeworks.spigot_check(pos,node) + end +}) + +minetest.register_abm({ + nodenames = {"pipeworks:fountainhead","pipeworks:fountainhead_pouring"}, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + pipeworks.fountainhead_check(pos,node) + end +}) + diff --git a/mods/pipeworks/teleport_tube.lua b/mods/pipeworks/teleport_tube.lua index b636431..f57f55a 100644 --- a/mods/pipeworks/teleport_tube.lua +++ b/mods/pipeworks/teleport_tube.lua @@ -1,7 +1,7 @@ -filename=minetest.get_worldpath() .. "/teleport_tubes" +local filename=minetest.get_worldpath() .. "/teleport_tubes" -function read_file() +local function read_file() local f = io.open(filename, "r") if f==nil then return {} end local t = f:read("*all") @@ -10,26 +10,38 @@ function read_file() return minetest.deserialize(t) end -function write_file(tbl) +local function write_file(tbl) local f = io.open(filename, "w") f:write(minetest.serialize(tbl)) f:close() end -function add_tube_in_file(pos,channel) - tbl=read_file() +local function update_pos_in_file(pos) + local tbl=read_file() + for _,val in ipairs(tbl) do + if val.x==pos.x and val.y==pos.y and val.z==pos.z then + local meta = minetest.get_meta(val) + val.channel = meta:get_string("channel") + val.cr = meta:get_int("can_receive") + end + end + write_file(tbl) +end + +local function add_tube_in_file(pos,channel, cr) + local tbl=read_file() for _,val in ipairs(tbl) do if val.x==pos.x and val.y==pos.y and val.z==pos.z then return end end - table.insert(tbl,{x=pos.x,y=pos.y,z=pos.z,channel=channel}) + table.insert(tbl,{x=pos.x,y=pos.y,z=pos.z,channel=channel,cr=cr}) write_file(tbl) end -function remove_tube_in_file(pos) - tbl=read_file() - newtbl={} +local function remove_tube_in_file(pos) + local tbl=read_file() + local newtbl={} for _,val in ipairs(tbl) do if val.x~=pos.x or val.y~=pos.y or val.z~=pos.z then table.insert(newtbl,val) @@ -38,53 +50,113 @@ function remove_tube_in_file(pos) write_file(newtbl) end -function get_tubes_in_file(pos,channel) - tbl=read_file() - newtbl={} +local function get_tubes_in_file(pos,channel) + local tbl=read_file() + local newtbl={} + local changed=false for _,val in ipairs(tbl) do - if val.channel==channel and (val.x~=pos.x or val.y~=pos.y or val.z~=pos.z) then + local node = minetest.get_node(val) + local meta = minetest.get_meta(val) + -- That shouldn't be needed anymore since the mvps callback, but we leave it nevertheless + if node.name~="ignore" and (val.channel~=meta:get_string("channel") or val.cr~=meta:get_int("can_receive")) then + val.channel=meta:get_string("channel") + val.cr=meta:get_int("can_receive") + changed=true + end + if val.cr==1 and val.channel==channel and (val.x~=pos.x or val.y~=pos.y or val.z~=pos.z) then table.insert(newtbl,val) end end + if changed then write_file(tbl) end return newtbl end -teleport_noctr_textures={"pipeworks_teleport_tube_noctr.png","pipeworks_teleport_tube_noctr.png","pipeworks_teleport_tube_noctr.png", +local teleport_noctr_textures={"pipeworks_teleport_tube_noctr.png","pipeworks_teleport_tube_noctr.png","pipeworks_teleport_tube_noctr.png", "pipeworks_teleport_tube_noctr.png","pipeworks_teleport_tube_noctr.png","pipeworks_teleport_tube_noctr.png"} -teleport_plain_textures={"pipeworks_teleport_tube_plain.png","pipeworks_teleport_tube_plain.png","pipeworks_teleport_tube_plain.png", +local teleport_plain_textures={"pipeworks_teleport_tube_plain.png","pipeworks_teleport_tube_plain.png","pipeworks_teleport_tube_plain.png", "pipeworks_teleport_tube_plain.png","pipeworks_teleport_tube_plain.png","pipeworks_teleport_tube_plain.png"} -teleport_end_textures={"pipeworks_teleport_tube_end.png","pipeworks_teleport_tube_end.png","pipeworks_teleport_tube_end.png", +local teleport_end_textures={"pipeworks_teleport_tube_end.png","pipeworks_teleport_tube_end.png","pipeworks_teleport_tube_end.png", "pipeworks_teleport_tube_end.png","pipeworks_teleport_tube_end.png","pipeworks_teleport_tube_end.png"} -teleport_short_texture="pipeworks_teleport_tube_short.png" -teleport_inv_texture="pipeworks_teleport_tube_inv.png" +local teleport_short_texture="pipeworks_teleport_tube_short.png" +local teleport_inv_texture="pipeworks_teleport_tube_inv.png" -register_tube("pipeworks:teleport_tube","Teleporter pneumatic tube segment",teleport_plain_textures, - teleport_noctr_textures,teleport_end_textures,teleport_short_texture,teleport_inv_texture, - {tube={can_go=function(pos,node,velocity,stack) - velocity.x=0 - velocity.y=0 - velocity.z=0 - local meta = minetest.env:get_meta(pos) - channel=meta:get_string("channel") - goto=get_tubes_in_file(pos,channel) - if goto[1]==nil then return {} end - pos.x=goto[1].x - pos.y=goto[1].y - pos.z=goto[1].z - return meseadjlist - end}, - on_construct = function(pos) - local meta = minetest.env:get_meta(pos) - meta:set_string("channel","0") - meta:set_string("formspec","size[9,1;]field[0,0.5;9,1;channel;Channel:;${channel}]") - add_tube_in_file(pos,"0") - end, - on_receive_fields = function(pos,formname,fields,sender) - local meta = minetest.env:get_meta(pos) - meta:set_string("channel",fields.channel) - remove_tube_in_file(pos) - add_tube_in_file(pos,fields.channel) - end, - after_dig_node = function(pos) - remove_tube_in_file(pos) - end}) +pipeworks.register_tube("pipeworks:teleport_tube","Teleporter pneumatic tube segment",teleport_plain_textures, + teleport_noctr_textures,teleport_end_textures,teleport_short_texture,teleport_inv_texture, { + tube = { + can_go = function(pos,node,velocity,stack) + velocity.x = 0 + velocity.y = 0 + velocity.z = 0 + local meta = minetest.get_meta(pos) + local channel = meta:get_string("channel") + local target = get_tubes_in_file(pos,channel) + if target[1] == nil then return {} end + local d = math.random(1,#target) + pos.x = target[d].x + pos.y = target[d].y + pos.z = target[d].z + return pipeworks.meseadjlist + end + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("channel","") + meta:set_int("can_receive",1) + meta:set_string("formspec","size[9,1;]".. + "field[0,0.5;7,1;channel;Channel:;${channel}]".. + "button[8,0;1,1;bt;On]") + add_tube_in_file(pos,"") + end, + on_receive_fields = function(pos,formname,fields,sender) + local meta = minetest.get_meta(pos) + + --check for private channels + if fields.channel ~= nil then + local name, mode = fields.channel:match("^([^:;]+)([:;])") + if name and mode and name ~= sender:get_player_name() then + + --channels starting with '[name]:' can only be used by the named player + if mode == ":" then + minetest.chat_send_player(sender:get_player_name(), "Sorry, channel '"..fields.channel.."' is reserved for exclusive use by "..name) + return + + --channels starting with '[name];' can be used by other players, but cannot be received from + elseif mode == ";" and (meta:get_int("can_receive") ~= 0) == (fields["bt"] == nil) then + minetest.chat_send_player(sender:get_player_name(), "Sorry, receiving from channel '"..fields.channel.."' is reserved for "..name) + return + end + end + end + + if fields.channel==nil then fields.channel=meta:get_string("channel") end + meta:set_string("channel",fields.channel) + remove_tube_in_file(pos) + local cr = meta:get_int("can_receive") + if fields["bt"] then + cr=1-cr + meta:set_int("can_receive",cr) + if cr==1 then + meta:set_string("formspec","size[9,1;]".. + "field[0,0.5;7,1;channel;Channel:;${channel}]".. + "button[8,0;1,1;bt;On]") + else + meta:set_string("formspec","size[9,1;]".. + "field[0,0.5;7,1;channel;Channel:;${channel}]".. + "button[8,0;1,1;bt;Off]") + end + end + add_tube_in_file(pos,fields.channel, cr) + end, + on_destruct = function(pos) + remove_tube_in_file(pos) + end}) + +if minetest.get_modpath("mesecons_mvps") ~= nil then + mesecon:register_on_mvps_move(function(moved_nodes) + for _, n in ipairs(moved_nodes) do + if string.find(n.node.name, "pipeworks:teleport_tube") ~= nil then + update_pos_in_file(n.pos) + end + end + end) +end diff --git a/mods/pipeworks/textures/default_chest_side.png b/mods/pipeworks/textures/default_chest_side.png deleted file mode 100644 index 70b8336f1b175c8c4812a88dcddc7bba943611f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 691 zcmV;k0!;mhP)>O}>GN#5!9TsU-gN z`tkV3k8*KfqM=s|kDNVn{wDlqbK~y#>-&0IW&MJ^A08a>%KDk>Hy(O0GiwDdUb+l> zxc^||&5LJ~Xg!a4a8F-8=Gas@V0d6>*-EApBD>509!tK Z>>r>7T0V3hTiyTw002ovPDHLkV1jZUINtyO diff --git a/mods/pipeworks/textures/default_furnace_side.png b/mods/pipeworks/textures/default_furnace_side.png deleted file mode 100644 index 9521b6964aa9c519d835554281d479f2ac5551c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 688 zcmV;h0#E&kP)a%SEv0HhAfmQy zw>H;4fBDhvc7YjMnF+O1ZUd2ur;M20%n2IvtPEdk+ApwaxP5pM(%nsy4P~lgT_uyngxIT1!Ob)LEOaT)p15ajDlE4u`qTg%C#v`@uKf`%br` zjlrXnlDR0#Qc0;1MYi<#$y4~x&f7OXe;+ASQYwE^7^AVOs_ArUj7c$i@11jS4(D7o zo28VLQUDNR#Hy;KltjeLQc6U9USMYD-24gv2q91@MMOe~7-L=6-q+`amF0`_&IS`J zC6&TX$6{HQDWw>rQVJ1oZLGcDdB@B|R8`ezGTYt%Ym5$|wbp8_@!suqW3&)bNMW=d z9QJqr4E7HWwK1qvp64Ni5P~trdtcWz_6K7CFj+=K*DhbkvTQsa3Mnh+dc9szmQ0jo zS<^ISQ4kUOreWsV`;<~&$}7v4HrH3@1GF)rX_y(cj%}M_0su@Y2_cARabXb^x@plL zjAEjW?fAwsa|l6e4FK~zoYi%vO;Hx7lL-Jkdbs`d`yMk_v)O!9Xd10G5uHsYXv{w* WCUnF4s(8@=0000R1 ziw6%Lyl~;d(W6ICpFaKW-Mj18uW#MD_3G8DU%q?+x|dzZSrX(I{2veah)0fr zRj{BMXh^ZAi(`ny<>UTt@&T_Oy2?1oZ~w@g7%!QkoY=d#Wzp$Py!X90x( literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/homedecor_plastic_base_inv.png b/mods/pipeworks/textures/homedecor_plastic_base_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..1a01709c8e7495359d742a09633befc300e155a2 GIT binary patch literal 569 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU&(T0G|-o zj~_qIn>VkerRCnedyS2ar%s((ym)bQbMx`z#}_VKIC0{{Lx&Dcn>KC1f(4HrJ^J?T z+n+ywZrr#rfByWtckgy~cCJ~o=E;*MpFVwh`0(NH-@h+kzWnv;*ApjBT)TE{!h{LE zy}j$!t=qF_&+gs3U%Ytn^5x4*moDwww{OXkC3EJ?dGO%DqD6~NpFTZx>eT-J{vSVn z^z`&hnlx$Y(xnXz4X<9kx^Usb(W6Hgrm(diBAB z2VcK_-PF`{<;s=z_V!)7b{#u*th>AW`t|Euw{D$1d-l6`@7AteJ7vn0FJHb~y?Pbs zJAhy0)Q?>3_?GNBa~^_8zdQ_$KX?y*%Ii9M`-p;uDPBX0H0@^0c3m<=x@_ zU;7NC)_>>p*!pPiJrTA=e)r!>>=He3;d(Z++oK6nlXq;G!<=v~vs5l`i;2Tj`^Oe; zX^SRlYahJBpizA=PqW|R`RTWE8yDCu582hQWp>Lv8)19%AH8eW1Kr8s>FVdQ&MBb@ E0Hpw6^#A|> literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/homedecor_plastic_sheeting.png b/mods/pipeworks/textures/homedecor_plastic_sheeting.png new file mode 100644 index 0000000000000000000000000000000000000000..1386b1902cbc80f021b248a8fc0b63c907e50544 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF zCr+HWdi5%hcVywm2SAFsB*-uL|9^(-r+9&C8EiaV978y+Cr7Zd@OT{I(p9+lVry4o zYsLkwwqqA2gz|7ZJ8zW;YiX-8TqDF=niO$WYSGaRSqp`I47(T^VlOM1Oq(Na2sDSm M)78&qol`;+0E|R5(f|Me literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/pipeworks_accelerator_tube_end.png b/mods/pipeworks/textures/pipeworks_accelerator_tube_end.png index 38e1848c6e2b1199c6a0aac72a3db883f274b375..a3dd09afbbc6ac1c04d7474baa5ce44a859db718 100644 GIT binary patch delta 1263 zcmVr1$ zFI7#{KRvSi<{JuYpWhihH%mc%!^z4ZfV25Ep2cjyPzM1RD97_|Hc+jC06?J0mC2BR z2m+`Dc`Vx51Eqri_)GCv+$TdS&tX{rJgu7H=g^~?2Y&%rl}@X}VyU<|^sP^Yj$Qmzs&t3)CQYbJGcLHzw#e-1xH zhV?=wyXncv1!7EC8dtDBuN>93qFM>}WXv;_d}2nA2-gxtB~b0vPR?){trE-T}> zR=grT{(4bT>6uj5qM6SC-P*6=LO{Ez1DVe%>62yjJv4)lLbe`4yTqVh$Hw^wi|Bb%mQv<3AY83v5&ll?}0>ZfG_5-vu~)Y7ec*WW7N6w#Eq4Zy4> z#+LnxQgDCc1Epo&z4!rec@|p(jRPhFNPpKS?p`#GINkS`MO}+&ga0K}RbfhAn+lZ; zMxd+Ya4N3!hH3ZKbVW1kO6py$4A)j49e=hp zd8{osM$%R|qN|mtW6p#_|B+NTto*hQ)CJpZ3Q2`&Be!Hdqq$nxhs}vBu6(jAAr1l% zS?5z#QU|KDAwE^53nTsEh+{VZl!pb8?aLKMwZpg{IIWxYtnB<~bl8kk^VX*hbjZR0 zY~_&MN65sF&L`{+W$SRkPwU&4qA+k$y7eM4w7>E*j|cEkPv Z@IO^#;yTp+t%m>r002ovPDHLkV1gqgng{>@ literal 2836 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 delta 1286 zcmV+h1^N2X1&<1l8Gi-<0063Kaozv`00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-sh6cPjo^?G&z000D>NklUmMNqsDy!21?QdqWoVM!rakd#tF#eeNqn-GgBZDqSQW>V9n zq08D$Hy<bD-tisUt)yw}4Bx4&QofvW zG%Qz25&&!;t$&P{1AZ(1&}ER-$gRUAa)MN?iGS(XEb`?PJ$QVGuoT5~Y!+>` zfqJWkc=#fSRA{8)`poA{7rzf*`L?UnjfJMX6Lp@@*By4^~e-n#OMk?LAXy~Fr-uYSpdcEDzFfj)To8`lrHesGi8frxQ@a#rlP&JX|q zr1$5BHeQ&@&bm#^w6==iW^sXrrTs`K@06DE<$vWaF*G0R9Uf0Ntli(RIQK2ES6!nw zFMrJJYV=rW3fE^oV^-tepZ(f6r&9arU#06F7a}isudLmvtdd=><~1&QYO{8HLQi;l zjj4ICqcd;9BW%9c%h!H?w|;PwoTfp8wztA|a&}ba-NS6~Aj}#G_G|0554KxLlO1KP z=YM%k(f!&6jcU&ilm)W#BE5d`2D6K-xpK3Xv2VZlX~(s;+UQz$T)z(hmxZGFb?Z3Y>%5yBw+QrFP;Z?W#mHWD z&9TeNm6FEwt-~d1s%IV7TWa05jDBzSD=~X}Gi}{WUiYeNWLMMk1X1{bX1<*2`F}}@ z9sSK(;pR=Rpbl83^Ux3L9)DJQzHbcx27k_IXwvv!p_b*Y8a#o1=Xz$?jke7?Av^;v z#a|ov<{{H`*KEAq$V^BFJZu~dBvu(YL2a$smFq<^zV9?>M`<(6sn5LLX#ylP1Bf)^ z;Tf1?EwFXCMC|G3$GK9H^bZyC<$o02c=bDPezQAFp`tr$kUByb2B?~1Xnb@O!|915y9LcOkgcE8-0tzGp*y_N} z!PXT-0QYx# z_r=B*u3!g-1aMFvm$w}R3DzV4h1umj9|VP#BmlI$SEU!M(UJgaE4oQFXdpESpnQwE z$*~uN=0J-ACjBfwKb9w6mm~m?VLw}ThVU3k09xha<$vbXuoVfwKSa*@xCWXA64I;x zEg@8vNRJk@`CeQfNGr-RVW1awndX=B5Q{z!ix{m)9d4K z&xw^&`p*Hr9Ib{Z>|O^LDrA^@Kj}VB{U>AGG=GBupc(IIo&)S$vh;3U^Zkno8^;Nr zBivo9@5xw>O#Pmu@;^d6w|8ryAs}?&@-~ie^>P4)k9naZ3|@BMV6S%yA8&b@M1ABY z0Kep6?5vUwVE@F->1b|0<~3DPo+LsFd>@wp)O1(;}%OImL%LAXJ!7PNaJ^HY~BGxSLS zHf~&cTGzzxtc066p$TYL9GCzUCC!O!k$;UisybiyiMMq%zALwS{l)A-;@h z0Fb&>m};62r2aZOg&Pq8e4Fe>UOb)>Mf>4E6n)Dbx_~7*u}+6>)zM_4k(fx=%XZh# zs}-Zw0){RVeUVWg`}CFW|=FX7L&gIHx6pR0~Ub) X!p6N0RXhS200000NkvXXu0mjfQjjP5 delta 2180 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 diff --git a/mods/pipeworks/textures/pipeworks_accelerator_tube_short.png b/mods/pipeworks/textures/pipeworks_accelerator_tube_short.png index 4e37b66485e52e2553247e927a121336f6442012..4f389d901d10667b86bf4f3d05a2baec44106cbc 100644 GIT binary patch delta 677 zcmaFFwTX3tWIZzj1H;_yjcG*@iTduWkz23g*O5=%#OSWC_xb$r6<>%Ya zJYIAA^^u#e4xWCz`ttJ~Cm*f2_HxhB`wPxJS-D>_&~K5G<(B0XwVwQZ zMl{rPYOQiTW5&Onv-|IvsIOGm>l;y0uU##>d@sYAySbOn?y7Wb`X>=IL9LGI(dYN7 zKUO!nG5D49FN!p`Gh8^$aMJH(A2+W`74K4K__rxjZwBjvbjjpe$+o92q&})lZ+QIf z;+9C64;(k57#q&Ueq4LcWllWPT?K~6WtD$VFZ8?QqOop9<^Fmrd)1Vj>_jE}9oYgUPKd1K^*WRACY~7}9 z@gEKtJys0k)p+3NUg+NQ%~y8fn)f%1U3;>8kGmKfu5SIz@Hdl1>1=j_J%f_GNmSUp z3AK}A{Pr~JYV=8dVU>8-D#yUl07U-y>j8Gi-<0063Kaozv`00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-sh6cPk5-FVKQ000E%n91Y;wl z1T-<@%(z`sT~+t%u;_6UGh=u6OfL}JXV<0MbV$A>$>i&SbKj65(hkw;2Avp>?KqQeQ(6}Q+60i_c zBw=+$lEBgY?^s`kV~daN6UTgT=a;f+(AyFqCV%Gh z&ex#S#Rb?MTtn;PiDN1=-Y96Z;(eR&omYOWet&=GS8{p|%ecI>4F_~hw|{YA7fh->T$o>6fPtNyc?_0jv{68X8LnTTsKMN+$S??ZW5B7gU> zVN_h=aQ?}%K~mZ=g|6_aM zm?1v4D5a^)7#CX_cgWuOIa)ts?tkxNbb*NAMMnt5u$Uqw?zjI~7FrJ*CtK+UhzM4f%)0%PR@9s% zkv<$_^`a9rET*)6MjsoDDk#m6#vLuZagszw#gtAN>iz&9+eLRsSBNAWb5lZc%jU{M zR}6}sW#?z%AjRArQJ4Wc)zy=^cbNMbS{W1?At92sT6JbJnM@{=$z(E_OeT}bWHOmd c=6`{I0c*lan5U4OL;wH)07*qoM6N<$f}R?YMF0Q* diff --git a/mods/pipeworks/textures/pipeworks_autocrafter.png b/mods/pipeworks/textures/pipeworks_autocrafter.png index ae5f8d9c232253078f570a8091965e2ba5793e70..6c7c84d8967d49a653fb5d2979f59d7538dae0f6 100644 GIT binary patch delta 147 zcmZ3^xR`N*L_G^L0|Ud`yN`l^6id3JuOkD)#(wTUiL5}rP=HT}tAT+*TuhXrqGD)p zpo6V-a$*9Xi5y6iji-xa2*>s0f<`8`>lYd>1YElyz!vVf*da00QCOvIW8j93t2S~r wHw#H@U=U?*ZCe%OywP!kp>}}b8A*nznNp3tA0JQQ0UE^M>FVdQ&MBb@0Ds^vt^fc4 delta 151 zcmZ3?xSVl21s-(?i$V^Yl% zc^?lHk}PqJC~?lu%}vcKVQ?-=O)N=GQ7F$W$xv|j^bH7aE%_nw}2Fnr;B3< e$Mxg{1zsS}fPwM&s@6Uri^0>?&t;ucLK6Vcw-Vq0 delta 132 zcmYe9#yCNuj)RGTfnmbL3^O3bS>O>_%)r1c48n{Iv*t(u1=&kHeO=k_G71Q@>*Rc~ z0m?H-mbgZgIOpf)rskC}I2WZRmZYXAlxLP?D7bt2281{Ai31f0c)B=-Xq-<@kYHV$ cAaa0#fmwioF=JxxVW1p?r>mdKI;Vst00lfD0RR91 diff --git a/mods/pipeworks/textures/pipeworks_blue.png b/mods/pipeworks/textures/pipeworks_blue.png index aa346d453783027036b2469e26198d3abd487292..c063ae1ea908ac8f29634b188f079884156b155b 100644 GIT binary patch delta 82 zcmZ3$m@+}ahmo0qfkD+aR|!b5q&xaLGB9lH=l+w(3gj~f_=LDxq`mrA<+l~cjfnmbL3^O3bS>O>_%)r1c48n{Iv*t(u1=&kHeO=k_G71QDaQmfA zy$%$TEOCt}an8@pP0cG|a4t$sEJ;mKD9gTe~DWM4f$Y>@P diff --git a/mods/pipeworks/textures/pipeworks_conductor_tube_end.png b/mods/pipeworks/textures/pipeworks_conductor_tube_end.png new file mode 100644 index 0000000000000000000000000000000000000000..a0d6915ccbc5573ea5b66f7b8c4e5140655cdff5 GIT binary patch literal 2805 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 literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/pipeworks_conductor_tube_noctr.png b/mods/pipeworks/textures/pipeworks_conductor_tube_noctr.png new file mode 100644 index 0000000000000000000000000000000000000000..cc03245e6b799d45b77e8ec8f1a1150178535ad8 GIT binary patch literal 2133 zcmV-b2&(sqP)-+;P&;~)!RZ#>%7hSsn z@+SmA7G4Gpke3rD@jLDV?LLO$$dN3I9L{_0?P4t1ib#s0Mc8vT1c!HK?tF9Zch33l zpIXox*<@|4GyDP5bhsDUptU9lg8BiFrYWD)O zBuSF`0U)KMC^dWWSGU{Ub*#~7umynU`Dm@{2|${bH1+`C*s)`~SYj*eg&|~FJW|AX z;s8jJgxQ%Ua*X_KX=zDZym-;Hra(xmo_T=ly7YSS_V=&8`f6Y4T%*w-?tv84GZQq% zpe#uo?>%;l^d7dgwKbYe5TeQ|YX^W*3Zpf>-UG(}=9_QKAinsiz542_;=lg`AtmeU z>-7UbYmHJ4b8|a+p`RT+dQ^P=`RBX9`PDBW%Zhr2LDzMO$)hVNYfN!3|i|dBUOr4t3?z=SeC`+<|dBg5Cj3@{rBH8rPg?! zOSc=*@GRma!?9hY)EEP{ZINXftxH_jzJHSh&+|yq97{>EEXA^Hv^IdIEK6Q{?e7QT zyB~b;mgz+)o@?C)T;0E)OO_?rwuO+AvM6wz24L9i^l)7ZCBd?6vMi-6B|+el7bQhr zpeze(b@lBBu{*Dn*dznbfsIYDB$c!+;Q0kGK&J~+t?HZ~R$+Dqgal(Cios}DUVi7m z+_cr6=AZw1gV`BS3ckAq&p!uA0rY-;g^ed!B9WM_8)k%h_ zQOx)KeU0BUv%Gxy^1k2bIOiOc?bl-gzW(~_;pcq%>8ECrZg|kP=K~Gkfq}j|Y(K6a z;#rnG)@3k^y!$CpVc!@yqJ8$+XSE8ISFT(+`1xMCbg5P#42o28ziVg9Ha9nG^)?4Z zHtD+VcvaK{OVn}K`Y?;4s6PNNzx=Yee*OBsQEd+De3-B;EiH+0BF@mwm2m)goEhNx z^XJF9?~NNbOy62y+z>WNxq6t*%*-6vG7x9aVgNSoL9+=z+=hjPhsh4QJ!rQej;nIA z+pC%v90%_F2xSS+{H&6(7mmQad$6?p4^Ex@(}57hg$wVRn>YVJUH}G^4c$()Z&(y? zuLDO8gKbqhq7v1-ngKK#5Ju3t-(#`90k(p6yPB_cG@ zB7z`5YmJnWEX%OYoH;X*cy{jGIpa43|M~Zuk3e>Rg}YMv9TW4H2zeO9VF z?C@c*ZMU8+GLGY*jo@Bq{P5ZBLYk%Z>=KKjh%_m-+4o@^^?`~K0>9C>k?M&DAP555 z?FRR^4tCf}FTFIdSz<@LpN2S2>e(cfrYUipP?qD@5@}u)G5(_v$>RdRwrz}2m`C95 zjl1ADHl0qVegMRAj4>%{z#SGB7ezm1>FU+1+s9nDDq?EcA<}3xuq=CMgG4_yxqN8N z7*hcdkJ4&3rcJE%qRJ?3?ha}2T3%irxziv$(h@w&b=K zUVtd-J(_^|xB&1xkA^QvQ@D8X;=bzlt!1#)O<&6fi8M_yTG4C{S7Z7S;nsM^g(NNO zNrJxbV@#F9zw*i}V$gf0+q;DXVv??}K9bv17-?FlAcn zvYv^M@B6fx7GZZQrVm!12W?hxZ264o53sB@W^?+WlhmH$hAdeLaHzn|9s%sgQ9j_j~D09ckqmTQ6$y| literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/pipeworks_conductor_tube_on_end.png b/mods/pipeworks/textures/pipeworks_conductor_tube_on_end.png new file mode 100644 index 0000000000000000000000000000000000000000..a70d988bb127e80ca9b3b18719d96b68b2d803b1 GIT binary patch literal 2778 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 literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/pipeworks_conductor_tube_on_noctr.png b/mods/pipeworks/textures/pipeworks_conductor_tube_on_noctr.png new file mode 100644 index 0000000000000000000000000000000000000000..30edb603dc9f9e3d1a24063c4cabc8f8320264ed GIT binary patch literal 2113 zcmV-H2)_4;P)I45P>YJ)_zVme%=#x!N zP0{@ae#vnUfVWd z7`E>t2M`e)$H^W5VHjf9=Q%ui*1FBu*ciKc^X7Zo;QaaX1OQS3Qc46tkUao6=ZF)+ zjvejW)oQi(>TbVvy(vY=WylI;#awW_emHpj%o1berx5%ylb1OyK|iWu7tfFKC4 zbJ&8$y1#dHbd*g`Pt))hfK(!zJis(fc=c%Q^Tmr7yP|WsTn?2oVCcvu6C@(&8bhVB zdE185d)tIDh;D;MY|)!=P!J2!a^5@2=M|*4iVsqPvzs*`&fz6v4I> ze)iM#x%LdFdpF?K6*NuDCK2L7!)Kp% z*8a$mBkbI{a~u3Xu>cGdjBN4%A_BwaRJiRb>cDqw>lGlS#Pd?;_Z&QUaKlWadP<8k z2|$u0s0YBWe$hLNvn+xTqOVR+J9g|C*|rTS&7q9>XVtI)YFkj#av{ zh!{2g+* zK>C@Y_PW>GneY3}0ocEPKbxJM?Hbj5KL1ew7#$sDy+oY0FIRd2;A1ktsi~=+o_piQ z4QiST^cuqYDOb0%!NI|;+Xju)aejf3A2OPm-I!i3E;71to6+;qdOBHJX5_l*^@Hyj zeRnUtp1GNp3k#qh7XPtjtD{uafA<8$!|%VLI4a}u zei+l-Bk zwcQ})SAeEl**qo(0MC~set)RDdqze^SVL|*Z~#c+;KKyWj|G5bSs32Q;d#LH^mJEL zwy_Nw^UmY}i7*V|dmKYU?bVoOj+lwq2MU&{848SqnX{k4=9yv`p;F{RuABuqrB2t z>~E&^|N2XS5p7_HnE^o4H24AG(@#3*4ezfaAdE#ew?GgCh{6b-*Es`hsw?DJHve%_ r*L4gQE!_U@Lqru|wbDO55CHxU8}Vy_1yz@c00000NkvXXu0mjfByk0l literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/pipeworks_conductor_tube_on_plain.png b/mods/pipeworks/textures/pipeworks_conductor_tube_on_plain.png new file mode 100644 index 0000000000000000000000000000000000000000..1aaa15bc7ebb821e2679eca4652ba4ac4807dac0 GIT binary patch literal 2657 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 P00000NkvXXu0mjf3!DrG literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/pipeworks_conductor_tube_plain.png b/mods/pipeworks/textures/pipeworks_conductor_tube_plain.png new file mode 100644 index 0000000000000000000000000000000000000000..b432dc4294acc9820188a2582cdbce609ce7af2e GIT binary patch literal 2596 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 Zk3Uy;8_j-`C%XUu002ovPDHLkV1oVDTXFyZ literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/pipeworks_crossing_tube_noctr.png b/mods/pipeworks/textures/pipeworks_crossing_tube_noctr.png new file mode 100644 index 0000000000000000000000000000000000000000..f4a75c94e04e41809327f145d3fcdb0ac15e6029 GIT binary patch literal 1236 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 literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/pipeworks_deployer_back.png b/mods/pipeworks/textures/pipeworks_deployer_back.png index 12e5a31b7cf26d07406ce69f362e03bb702a140f..2bac175f923672a3a706c7cba95d6d871098938f 100644 GIT binary patch delta 497 zcmV^BH-9%zPfsu~FeN1=6%`dP zFE11n6huTsIyyQ-LqjeuE*KaX78Vu|5D-B@K`}8gKR-W8N=i{tQ9wXIG&D3VEiE`W zI5ILaOG`^BDJeTUJ4Z)HJv}`+IXOl~Mk^~TK0ZD+Ha18|NJ2tF0002ERPs6i007@f zL_t&-(;diFLVv_C6ac`7JL}$V-QCl8!u{_A%X|))dY083HfC+KRTobn$FfVTC^jl8 zM~fA}?@Kwi_#ujPSQMlOaGhnvY;Dc0GAMGPydpUfzTWU!P0M``=x#y6bryK3*C!6| zVdO$xy`MjMmaJq4n%OM-yv5hMKMVxS`cVe?El#JZqiPtKmgn#PczY$HD1gZRa?XQ~ zG)u)xgEeq;asBzQNe^PzDC$6o_HEY~=NIwg zVS$8Dp%rau>PP&z3q*u;&vxV)&z$dwr>Cd9-EMKtF-;Rq(-1UW;c~fTV+<)J`o6~)!_CbNQp(xFq9}NHcwn>HFijJe%Y|v0 z5RZ?KIi*C5k(@Ja+p<_Jcz=J#T02j?ySrl;2Bef2V>lj<7-LXc>)FPx>sYVX#28tx z*K;?mt3MN!Ng{GHIYEkX#Kb72S}W+#j>jN|wNQ{VSoU0qRC6)7ch z&RA<{nueS+Ip-PgUmJxG)OGz+(^@kO1LyOZ=YZWh=|b%cx8o%hAi>oKn)!(x*xs($ddP zO-RsxJl5FPtf{O+LOr8I7}M0!uB@ljheAh2LZhgo)rUgR$$!bDsiaa-OmT2&udlD! zjYiJU&Mhn{$a6KTtg1CMFilKIcXe-YZ)sUqQfq2sTUu0NU|WBEchAq$eSCG(g+aHx zw{2@>*NsNe(a)-=si>x^)z{c4C?#E7S6o|FIyp6Race$3IYL1_J3BUSZfIRxRxT|m zOG-v!VOwcvVt-UqPB1VmZ*FH_URgpxJYHQ_MnyqEKs;(`V?RDRIyyBxJU3`(VN+5~ zP)|xXHZoIEOk-hOTUu3YYh_?xTDxH>=A&2Ll}pTdIhs2Z$a6E8IupuyH@;^r&3ih+ zX)nTSFWZqxz-cW_Oh;p4T-=gMVPINtZfHb9K7)dLV1Hj(IXEO@5%5C@4Ir&Y(|5LV{6vSOjIyhmLEfV%cu4d0GGf002ovPDHLkV1jj+WXAvi delta 823 zcmV-71IYZd2EzuB8Gi-<001BJ|6u?C00v@9M??Uu0BrzE?Uf0G00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-pr77YwCbr2qD0000TX;fHrLvL+uWo~o;00000Lvm$d zbY)~9cWHEJAV*0}P-HG;2LJ#9r%6OXR5;63l1q;pRS<>0u79q+-EDhpXJXH5MJ5nN z><|ki5D3Um;!h%hK!6Y#jZhv4C7wrS?6kY@?Y<8d9wJejlB!Ba-#M!6hwnd2B7&%r ztB{ER5M#u9PwYK?AHhd_i~xv$sG=(9#jpRMM#%(XOoSma^a1Z9F(m|$Ji8YKQX<0p zxqkZe6UtGE8GqLlWkIGw@)6$;4A$WqN8dX7)?%$EdXI>pMlmCU4z0sAme61C4tkIG zffN$}WRT^8F^U>RM`5^Z{|ioc*hN)PPiyuI-2wjb=YO;0`;HiuJio_I;5tV+DsjnC zW{R4M;0MCCL+TnIJt~U+{>yKOB=#0lws%`P-%)GL|0;mw18oS5%@`jBGIkkcPrv&* zRb|Qk!+mDcJ(}&7*RNNUr6Hw6+qTs8PH?$gU^~mz^$qLw8fzU|RTUx`DJ2rHH<>U$ zo6&Y1A%6tAuESc#X0yQnuf4kmor?p{Oy2-~*SJS2Rt-<@A~u0)JIi@$ENX(Y7t;=NB|h!{N~(e(>aZ z&dJF!)9C~`IX#o0}WdIY;03%w{tR-F?@1 zJTPWF9+OgHv)OQWx2CL0jt&n9AyAejU1u@I@Gr8iU&dirKQsUU002ovPDHLkV1f_T BY$*T$ diff --git a/mods/pipeworks/textures/pipeworks_deployer_front_off.png b/mods/pipeworks/textures/pipeworks_deployer_front_off.png index 95931124ca998fd6e5d4c1879aee2f7acd54ed04..323cdaaa73ea01a3871c2e96bdbc85d1ff55758d 100644 GIT binary patch delta 672 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 diff --git a/mods/pipeworks/textures/pipeworks_deployer_side.png b/mods/pipeworks/textures/pipeworks_deployer_side.png index 73af8f83b906f4c7ce5964badf9e2f8ab8e7ad13..f3ede41534e2f25376fdb0164c183d957587491a 100644 GIT binary patch delta 829 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 W3uElvL?Af;0000=&a14dH8e0yOh{Q* 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 IM6N<$f*9C_^#A|> diff --git a/mods/pipeworks/textures/pipeworks_detector_tube_end.png b/mods/pipeworks/textures/pipeworks_detector_tube_end.png index e5d7be6f245cc526d3b8c332f00ef9c055eaa78e..ef0d5feb222b949963950010479401c4a3af9863 100644 GIT binary patch literal 1393 zcmbu9`#Tc~9L7h=Wse%&ofHaPP#%>_)V3zZ%xEr^in)|at8^@vSfn!NED`eLPRur! z&DdP#GUhfmHipeGmr$b92}R=QZ#eJsyzl3EfBb%bcnK(^ow}Nq8UO%Lhugzkw+Q}i zm2F#@&5HfJ1*JO>CkOyQPXey{Y~SkbCOibkG=g-W{6c!fB zSheoaly(9jTz z#S)9fot>Qn0|PxhJ$-$BOeV9etV}2r3Iu}E($e1EUMiJJqtU9Wswyffs;jFR3`Ti* zIh{_gtgPHRMWjAey9MZ1)5%b9FPLXbOf^v zn5vlys_{6&<|aAW)FJ_Xm}|MiCB3_(-c207OtP!7lz>}?XU!UVeN=JhY5F39T=mzu z7eqOAQVs*yO1tf{Snknb!@2g8IK zXCa>YLGv)3R5EvHzTbQn3S#M(B0%_C9jD)3J(h%2%9pX4LV`~~`;3VeHN?!cJ+C60 z2VUkOv>+VpHPpo9)QsfGBE}q|`&D9K|8zw2EIA|(iVaMCPm9goaM%?CDmnK$)Xe4u z0tkRAyiztuTRNkgp!GL!hXvr|;iLL3#OZuJ%@leYe07yCAMF{5jOo z=?p1xH__cIh+^8|;L@|JM`z}33g!Ut1pB9aIn0IsIB+$`E#_jkbHv2{*TrI!l0_;e zx5$6>CoA9B^Am7xdtNkqw^d1(})a%*m8esutl6 z*K&W@ilD*R2>tM1Mobj?MfgKq%ONu}*4^t_4fitCIhLn>QP$0Q-`FzaMJn5#S_!hs zHD+~hi_uhuru z>Itue3^_^xIeg`ym=of-ITcwpCrwB{q~RQM*;FJtzTYNP;LG2hih$c#o#dVqo+5&t zy{QfuIGz$<>hn+DWa~R$u)?YXS^`cxQjBeE9*#lTtJQ`D`U$@X5yl8#Lq)dW9v#sp zB>>{@+@J*5ncu@7as%la*Az;?`}(@JFwa-QU2c!rQzn2cUm*T zD4s8{N=B?SlOe1rYHd~MN`Tde1qP$AQ7%tP9p_eBAhrY7v9pTJ3q|t}Ixn#5cz)zj zsWk`7UlI2*_Tol>dL_me@Ojt@>kR%qh84sd;-bfp)s>&Y?MZD}>3$x1LvcMv`gA@( gRCQ?h{LeV~ej};qpuGaAb!!v=a9bp-9O@nSAH7=YP5=M^ literal 2577 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 UG2W!{(EtDd07*qoM6N<$f*s6ZJ^%m! diff --git a/mods/pipeworks/textures/pipeworks_detector_tube_noctr.png b/mods/pipeworks/textures/pipeworks_detector_tube_noctr.png index a654bba94f10928588216af7ecb530142932ff84..c415d770da80ce822becefab17d76b3e726a5fbb 100644 GIT binary patch delta 1160 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 KMNUMnLSTZ5?x))T diff --git a/mods/pipeworks/textures/pipeworks_detector_tube_plain.png b/mods/pipeworks/textures/pipeworks_detector_tube_plain.png index 46003aa1e7970ebe6aa23850cec6a6b91d9e0ee1..d99cddc45777b65fecccfdfa323aca88c6fc5009 100644 GIT binary patch literal 1586 zcmchX`#;lr0LH&!S;>o~o9G;&NI6lg5RK-RGPk*q!MrYzW&`0xz_*Y|9`bm+ z$;n9|449st&dbZ2n3w>36R;F2lcWOiUD+ZQECm8_yiEEmH#ZlEBFD$a^Yily3JQSe z+WYtKWkRp9v9YG6COVxC_(&l7Qzl6POF=+{=W@CA_4Pn>1BesYY<62)TVY{gOG`^* zW1~!xCX+mFXlUr{>|`()Kt!mmtsNK`7#SIgs9^heM;$N=r+JhK6K|nEw8L*`iZ%adA~uRb^#mSy|b;ckh7UWJN^hDCOnl z>oo=()$v+K5Z=w%9sD1HOo^oG_4&*k(bgW`t)AZ#oo)~~vUJkL#vyjg`Vcy0!RX#KIL#S8V9)PO~oj@|qCoRd)4F~bYJ2gTm{)-&x5tn_o8_2CZIlo6bAUfMubHgRAmHU5Bd%VP<1(T& zw`$+-IF3?GNH~?;oRcfvgNgEh;mlFOjK(RQZ9iL1>~}jDrqX zWN7D0%*vPWdwc`u(BX&Ep0-gw7rl_`F|E9-p8jfLvVr5nD=!>^#dS~RV$PqDo?aw9 zu$H=6!Zl&j^B={d@=35I1NyIQ7K-GjZ$iOKR(%cPiyme6igv%Wy9ECkz8bwY>qF|D zQ2CG~X}ay0)mJa^JAlrlzilSR-jPiXtl{T%l~p(zF19(@uKv~9P|tkT@UGYo_#X!G zwSjh#PR6l!O;oIgTeZX^Pf5I5(?oI>RF$R}Z+5{#OD%lPr$MXc<{?_MMXrt%ix^R( z=$r8xN-!pChsRCMHhjGC?gigw@H|FcO3;`|nrUj_?%{9II86MRcmSh!%sqO}YVkFA zqE}z<9kLMT{AexJik4z{FZg%o_N~S?xYhCE;18%-GvbW$kjyDyf)uthpFGuGJ^4va zJum7Jf~AN^`gHm}I*J@LsSn?9SAoN#LK)*UNYfUJ+zxqgRotZuXQO$M(rNy5tge#eF6bY)935ta_;ERX2OFk&6yg2Z(h$3Hkf-P0+SyqQJ^S@tFq}KY!dvl=g0ordH eJ!w;VaGAXLjo8YKI&pFRwjf7aXEepeKk;9^5qlQ^ literal 2583 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 O1B0ilpUXO@geCx!=8@|F delta 1239 zcmV;|1StFX1>gyg8Gi-<0063Kaozv`010qNS#tmY3ljhU3ljkVnw%H_000McNliru z+z1#G6fc+RwO{}M1b<0HK~#9!?U>JQ(@GS^zxnU6la{I!HoO5(0AhiJXw{-VYd0V$ zf(1*q2v)4=s%nX2JLBmf)PDswxmd;GBcC7D5PE zYoh={h-j#_7L&;Y4<9~6mSqq^AcTPVe2%g#F`v&Ngn)A{K5y8B_dbf?y@wD2ec$8q z@-lvR&Vh3tZEo8Z)9Ez6pu6C!7Bo$RM~@ywqwn9pAAdLQy@%F18bAmEV+;oe2dL{B z)>`cE?}Kv=#u&=7#DfP9V2r`;?kIS)~Koq_wL;TV+?)YLkNK^%g}Wl z>beF1NGZV>gHj4tS63i}fOC$bC{R@uthJcUW}6Ejgn$qNj~_oK|Hc@8`}S=(K0dx> z+qZAu!hglZ#mehfhQQ#~ck%xH`!Lq%Z3*C&zNB_BR~xFsm16nUO+E})Q;&!0b6y3(^}&&b)? zS=iL*zol*4+sTb{%;)pX1<3O}9)ou=olZv?eSdUxL_UB1ycI7vK0YR|U%$R_FRk@@ zFJje#p%__}^cIW7Xv3?j+Bl*9YUi)aW-|~%HWz>~cI)QL^1|uq>F8tf#fulWu9-|G zf1M0}7i22}7-LWr#f{%yy?Qk|iGBL?X|457pFSn;-o4v6G^W!jj4_)Fpp;sgu%wiu z41XH4{;mZ1=FOY6#Bt7Trw+)nY-yHlnr4&$Po6v>A3uIv%lN~?!$11&I&M7_aI5N< zwL@UpIX^b*Z|mqgIXPJ?{1{`~5n$-Ve&_k~=j8nSd{nIdscap~I>$2Se61pmuJhLZ z^uVzjdinC@RvM}-%T}&wnr5vNg|8z(*MD{R^5shydhem%Cxqbp_wQkd&Edqjyu6I9 ztWpY6$~fQ{TImo1IOmv7r?DOwh8T;*0$G+pDHTQb-h)yaTjsA{zlLEz;+%`uaL!?j z0U;!|&Kn6}jKRglMJ$N&JO?2JWm!Tgg&#kD#OVxU3{pyTU5EL6j)Q{(G);rLu7Bg8 zqw6~C@9)DHgR(45o86~@%91=?978y+>-O&EJYc}X8p?A1 zk!cW%jf2ajU4n84HeQ=_wVEXZF0oCto!ltDB3sW)XjO()oI*x(C)78&qol`;+ E0BPh$qyPW_ literal 12686 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 diff --git a/mods/pipeworks/textures/pipeworks_filter_output.png b/mods/pipeworks/textures/pipeworks_filter_output.png index 4b29690444aca590ba222733733a48e722d5168a..e0ae6220c9e85c33733dfadb2a9f716dca076f36 100644 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF!oKm3LY@vV0I{tJTmVH zEAx*Mod(ahU0<7>Cu%JZ{;q!T?)%_1H@}K_Yj@Nh)%4o2cy+H@_A004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000Uv zX+uL$Nkc;*P;zf(X>4Tx07%E3mUmQC*A|D*y?1({%`gH|hTglt0MdJtUPWP;8DJ;_ z4l^{dA)*2iMMRn+NKnLp(NH8-M6nPQRImpm2q-ZaMN}+rM%Ih2ti1Q~^84egZ|$@9 zx%=$B&srA%lBX}1mj+7#kjfMAgFKw+5s^`J>;QlP9$S?PR%=$HTzo3l9?ED;xoI3-JvF1F8#m>QQXW*8-A zz9>Nv%ZWK*kqtikEV84R*{M9Xh{ZXlvs2k(?iKO2Od&_ah_8qXGr62B5#JKAMv5?% zE8;ie*i;TP0{|3BY!`4?i6S-;F^L}%f`(o2L0Dz>ZZynda zx(`h}FNp#{x{a}MR#uh~m%}m=7xWMPPlvyuufAs_KJJh5&|Nw4Oks+EF0LCZEhSCJ zr)Q)ySsc3IpNIG#2mW;)20@&74xhslMTCi_jLS<9wVTK03b<)JI+ypKn)naH{-njZ z7KzgM5l~}{fYfy=Kz{89C<+lE(fh?+|D$id_%I-TdEqLPi*x_)H~nY9rQ#)noA5c# zB`Ac>67n+__r%Wu$9dISw03U@r;Pdb`_%=KWKZEBGfDjQH zqKX(I48#TTN1~8;gpaI8ijWGV0cl0Lkv`-mGK$O~Z&4T&1w}_0qHIx~s8AFOwFb2w zRf4KU9Y%GadQmq~W2jlwM>H9&h}K8jpuNx$=mc~Yx)5D~ZbG-CFQRXwC(y4k7z_=g zjj_UbVj?j~n6;P^%sxyT<{V}aGme?VVzKgAeXJeUAIroFu!Yzv>{0Al>=1SW`vynE zso>0T?zku%50{Utz#YMz!42UiaSM1Uye8fT?~iBWbMU43MtnE^I(`DbK#(SA6YK~f zge1ZyLM5SA?cA^NYNxAX$R>L=^W`U z=_Q#=)*?HSqsRjC4stX30{Id7jRZx)NWx2kEwMqOMxsMvNaDF9UQ$!iNpiJhu4IMe z3CZh{Gg5ddEh!f%rqp_=8mW^~BT{qH6lqgwf9X`|66qt-SEQ$8urgXQZZd3{0-1v{ z7i7jM2t}RZLSa!hQyM83DHBu-Rh#NXO`;Z4zoQONXJut%m&u07X3N&do|YY@Av7(T z7cGTWN;^&)roCIDw8Uu%XUX;@txJZM%*!p6bCl!A70I>9-IjYNPnUO-PnO>$-zoo4 z0i~d)5U7x)uwUV#!pu_YQro4hrA14RFTJM-E9xl*DXvvKsMxPKr=+app_HyvrF21Q zMwzDUsGOu+u6#y$T7{xwufkO+S2?TllrBqmqNmU+>Amz>RYg@#RiSFV>VWEknzmY~ zTE1GF+Cz1MIzv5Pys-#cBCZ~; zMXm#GGH#)6)ozd6)!Y-@Tijj2>R4y()XvmDLKXQ&yjjk&I!+oQOrohQ}U>eb4k~HZbSnyy9x( zW?3$*y{uH6t~>7#3G*6dj`%lF|oWk4CLGP(p*(a%)B zP)E2$IF@OjS(EuDD=h0owsbZxyFW)SXM4_Mu6ypcYf)=iYkTrk^ETy;t#evezaCm2 zx4vhC`i6oH6B|7?9^ORQl)UMue3SgL{8yX9H+L5(6>KaR-{P^QrBI@fUpTVWc5B@> z)Hd$6f$iqotG0hEVi#R4HYu(seqX{Wx%!RiH@;dd*9H0$NjB!N_E9`?+$Pe+^P4d?`Y6!s5po@n0fF?V_0L~w~TL_n-rRgn?4-k z9U46xbhx+Ks=4`y;*ru8xJB49eKh*$jqhB)>uNP@t#6~X6(0k~gvXwKAN&3Aai8No zCm1JMf6)A)ww=;m)B$zmbj)@pc8+#Mb`75NKH1Z4+ui=7(T|5tsh+AiEql834Bs>djZ*&hXA3QVUFm(Q=>&;8Iyl!2)z2f%ZaOm)z zk?4`pJM24CcT?`ZxR-fv;r_-4=m$j)r5;v1Qhe0#v+mDrqn4wm$6Uwy9|u3aKh7F| z_DjYu?mT-%DP~zdZD6*{hzpfVoGnQ(rI47rl{xbNDUeZQr}_casZQ@3HSIKj?nw{^;}Z z!Kc(upZ)~{nDhK^CfpAI000SaNLh0L01m_e01m_fl`9S#00010bVXQnL}hbha%pgM zX>V=-O=WapY#?rBbRctOVQp+>b8{eKVPk7&a&L8RWFRddbY*ySb#i4OaA9N6Ib#owcWpHe1V_|eesbW?9;ba!ELWdK2BZ(?O2 zP-t&-Z*ypGa3DidG9XuJZe(wFbG$W4-v9sr2XskIMF-ph2?#3)*jP^e0000LbVXQn zL3MO!Z*l-ZY-M<6X>Vk2a&LCRsm5AqJ^%m!8+1ijbVF}&d2(rIXmkKZX>Vk2a&LAZ zL2PAsWqHD>*r{WdJfTF)}(ZGCD9hATT&OG&4Fd zIQMM@m;eALw@E}nRCr#soA+6P9O@4f7um%Uu}PKp#MQB=1y>NB#Y*=xjJJGN(2 z5gM}M3ExZsKPE$?7es9^SqRe{Reaf zLM-=w&-eSjr#$C5&l~iwfBvJ*q2W;*9v!pd{2a^9%e9LauUKYUvTZD{Sb8AShQ_CC zc4p2ZBO|P&xX4=D?pbV1j8*U0VQb4vcK!MdTU}nZyu57NR#s}i`Q2GNa`=!XC;4q@ zY0)0GKe2(K5i88ewEYJTSi^t)Gt0}*wLSGa?aAXOHa0%#?3WZ|TOc>jE?l@`fwUA` zUtPA0EbNa?+VtFR+hPbwpC#N*VsSy#$jiF zVPU}@VPjx;#ENpVY~TL<_MiXDf3w2E0;}7(-Ms0kDGlFVylkV~fNyidHqGq(rEAvL zKWP5sB%7aKwy)1$wEmX^+(3klk4@OQOINJ##Y>x=9JhtVCHv~z3pPGEW${swHaRnE zpMQ1EZZ+Sv<)vkN($QsKd~?A@`CMgXg-uS)*l#~O%k_qAX>pMSTCr~~T*Cgid7b?r zJ9qJ_Js%u0eTl)iTmDERu&zPENMCxLB*-wbN>M)L247JYNZxoR((M(Xm!oTx{`i zadza$A=|rWm-CiXuDQInVN=u7mYtQu-(zh@^)@TQetdj_WwU#^g+=BI4YQ2&^jG$G znuiVXC(3>bzt6A;ydWhh#bV=PuwRE4)LKG(oW;vNHlm`Vt*E$^>&M$0M-JP*-E|g+ z{S?_>-*5|%ot15I@v*jjTcvrw_x7oVMcnk{$s=~;jqg}WLagQH=UZ54u%#s?SZ&=7 zOH59&ciui@hYlUI_uqS;8%eXZl_jgGs(rybb4%ijC$Tb7=a$M<_IGCa)6 zamUbLuWhia+sX=T$F?%d2xMDoN+LHMZ}s(cW*cj^xVV7*qxQxt`+4~V79JL2ss4D| zf&C=xzkTLyJ9PMB!V*mYjzH4cLTsydLk41%tT3J~M z_JeJGa})bT&VFW24x5o=32e|#7SFS}v2H84!o`%Cu-nOIG4!m*Px;i@S zdG}MB86P7*o#*;<9Dn;{3d2XQX2vd*p&f*&iOVS-fCw zZr(b(yUh2jv&XLAyhF^kS$RpJSx}I*-FxI*y|Svxrsfvxb7Jb^mFu<-caGurzy0(J zi@~j;`M#yO#s2Y=vlbQ}VPAgrwI%u!>}um3i;a!3|MVaJovp8%-MHOiwz+N~`w4|BH*UL-{Ez?s-#Yu(xxUX6WaV6cYIdF+aSjg;!3$&Y z0FTcy*`<`!R4X9kmlWi=hfBfjR#(=nyQ`awUBH_YtgddSy>a*r;wRqH)6%(DudQtc z5x=-qN|NRAd98SKbQErzY|YKBE?Fj#%#>43ojPfiMJ4XRl}8pxf+hmh0*$^PL(hb)%Qr>A1y6KtzwiCpZbaJ^hAMs{YpMMXthViNXS zu;1TrNlDn}J*Q5cu!`amw@AtSPG0Q&{yT3r1p7QBsz}?pW4k5BM&jC`wtr8Z<>qFy zFe#Q06JZ{9=8ymRkJ&k&4Gj)h6028VyUhmrx-FHY6+>C7-BwE3%CKoF!5(%iIB1ib z3A1D+DLkX1tk{BBuvtQ)zJ7-VveGS{oem*S#6)ACvXsPq1cij!K|Y^D*-B1HHb1}f zvV(v8lb;Z3UK_@KVmwK(w#o+ky2uHccwCg#U_Ubx`*_)&-Lk(y=?-`HwSZ;h0nd7n z&0v2wB{(Z9%{-ID)gn8wNrs%CU$B_eOcx_BDTCu8fj|BDw~W6V0*AK4K0&Ev)XXZG-(?5|o1iyngglB(_G03V?v z`+i$zqZWzxsfh`ThzNJ~$Fbj!{S+1=E#1$xJkI_UU%vb89mLm7%1Z>LB;KBO_t`a) zMI^DdvcATJJ@(1jFJ0M-iNX`uiAz^+5ZBGNbNe<63k$c)*BTv23J(uApRHT-omOkT z_t1(8bImAykDhf=#**#%z^LUA0@rTbGOyQbd)b8zg7gxfkEVPnw4Px9I`*SuVzIx$ zVtMRS>UKOgAH!~XwGmgYS>v5%tEG&FlY1_apJE8RP)aDN*lrVgt@qoppF_3Sv`0@n zch-+P?Z-=E=-RbqPl?Xhz9eTeHlpEX&Buv?5|}2XU8745#yVl`{d2 zB;reTK0i0tP8~mr`^Q=WF3u*nI-5+`sJ18bzC^#Dn2UFd^Wf1VyLY$M*-~5zjb(CU zT3mTl5Z<%7x@K8{ESHxG3-evvC;1aCogLpKd?u+N!X&Em1yq1Hj~`*NqPOhx_le0F z!Y0+_8ReeD#4U^x#^OAB^w`?&wpc27MbD6*pJ(15|KPm_p{Vb^ecE;rgC!*;7Rzpg zQCgDyF%Ek6^mN(#Z=bU1(NXGim{nDlSQZPke{Y>d#>81?$1_U-tf;n!vLivbVH&l* z6lk46Qd(JEwJefkHZiwM2@MJMxoT2YTnM;IrUcH|nRm_rO{=XKd$J!&8I#KvQ<-{u zyY0O*r)+9;#KI%Oth&6E_{BbXDl#_SI-WfN98ue4pRmJ8EEN=6QjkMV$aEz&3p;_# zWLpMvgm{(nqIkAKasu!(m>art{kkQOO!aoCyehUKL}?`PR-ggVCf8Tu6&}n-`Lo6U$WnH z^{U;xa>ZJknt;el&c41Lwm*Ai|GrfNirzl+T}z-s$-X`-`??P=i>}<@@Cn~fV}Bf6 z;{(vi{uGPc(b?+vWq*RI##r)|y)GQRAa*m7CmFS8uKD zPpzHUy!+rO^`6?>cHfnqAhP_x$hfspw?i?sTgZy*G=V9+)cGiOYi54V+8(r9D4r7* zRc*fUX*)}=pxlv6c*K(ZWnaLhYPOgl2(p`eJ`T5DTb#Fwo!Ec$gxv7lS{^)hG2e2x zjhLnkl5z(}C+yz+N8DGK?FKk`i0zwAE#~7Pg(fEfL3hD5;rzWOtcv?tbiIZPyJWw4 z=4nRah$q#>Z51U}Q(fgQraGR$PLB-_TTXVigN}Nrn7C-NYlKCC71r2=dn`sGpN*$q zICA17rShk&?7EA;1b-4Y5#j!>y0033;>0mPOOyjl+T&ReT^!d=!DY1p)&InPd~zDd zaRdyJ?UJAmPl?68Kw1<@Z;b?d56^V>N}L}(dD4FLqo26yQ(9I5O3k;7j7-bP%^@$O z*d8GI0bsH^N#&(=dCvCol7@INw;GBP+SzbQhhq5ni8nxAyDc^{)bjHRFt%#rEQXpG z0iASKPc_!ZqR54{V?Y0s4``g?0YFVIz9R4n;RanZiktfB2S0VW<@W7c7R62_B`I-w zSv=Kg;vM@@vd_O0Cyv^_z4c^%>;uHs!2V+_#+Lm^mt!JipK2m(5KAJK{WzMW;g>J% z=l|kQ?A>?Y<$hvq3iz$(ONo!R3KsZYTO0O+SvWkvgB!2o>dUyBpdoe1wV19qpxtZ* z>Q2)3f@NJ3vq%grvTG}3Yr)Gk%Gd@qTsffo*<**fRpMpKMH&?g|KVoeOS~GrS(Jx1s6oJ^Jny z3n5O&X%;@G|9(avuVfe!9&I1}{l_-M?yIz{a)ZsS4{VeKrRVBSCs>Isr zlKtxA-vNR9-OVgOm|VSn%VtS_YC*?_$L#WrCRfh9zFeCM8-fv3L6P zTdp@y-HxKykEOon!5S%scGuO}-u-(V;u4Ta%L-Tr$uf;TLA84u?P?*+kDqu?2X933 z`E}Bqu)q3yfs;5s7s*4Ymk(z#*RY?3{Uq$?li_7QiiE5C|~8xyo(jR#=eh;I?v75D8k9N%=;=OwUX&@K(bNyLWJZJ>&#E z`|f&fDuOy4Wk>11{gj;c`)%%G)m0VTjJmW63-txL?kq3A&>oP8$}7qsC~7Pcmky7P zp&Tt)X=x$XilRma(dcB__U+q=)d-lPB}-*NwJ=(s>8UB~?}lzGv>o+Z_O+n0p8#NK zzkeU>QEpXLJ|s>XF@ZcjW%+0j2 z(o(9Ak9@KQZb@Vz$N>wuX)tlx)7xvaVB_EX?ML?H!6R;R(cxtwvRO*m91X@Y@7*N6 zx}QFC^>mq7Dy3yzqR!3|^9zJb*9)jB9!MBsUT)6A&rQ!bQetpuz~*LVT+GhS!4XiR z6wf}{@9DK^u>Y?={LtDTKB5FKIT|esRI2ytYneWOlbi2`N0^0AP#!9+ta8-b+#EeW z_Iq9of&pZI)A10b2JT~;u62_z9-`lvvvsba_s{UX7bx6thq~HDo$c=HwFz!YSX$&r zNofhI=dr)~#V_I3I&BbMu9v1lz4^kzGVsy|w7pAzf6lsD!1ntOtdsV&2~tA~lt5>> zKudk;+AVwhw9|q~j)M@e7r^dQ({rx0E%KnU*VEHyJ$*DlvQICe2CB5Q*fut?|G$6f za?-%iu=P3nH(Bgu(4y=&+vne$cb|Xs;2|VOH#vfwHn-@yNZG$|wb6kvAMDEzIp`dm z=Zw3*SPOdpozt7mut00et5%R7un@YgM!raD$J}1jahcCC_fwE5@omUK5!sL zeQbZY4qwOX^ohfE8=xlWyR)_$`{HIM-}a;n z+!7DLQ{bAk%Ov4Y66_DY|DG$&fBNVD)AcGf+pEl5x4p7Kph65yDvg7ZkH`_RH|cPK z(P7kb+*l2hPvr)KF=XRX;x#SBZ-kU1Ak>Y8@ILkL_a8ld9nbErS(2T`y~J4=50~of zdmJthpP~Cya`V#@e23(`L$o))OLWZ;94Ea^Sw*Eieb#|@66v7Y$G8tOivOCL9z&$d-L{P8lP^58D=1PG#5~%3BX8?2L z8<@lsE-F7FQeNjPiV`dCK+v{~`NQFZ;1C)#l~mc^;sX<1Z&F-TXw{VO1ip_?NTf3j zW78&Fm@CKCkVCxx@`E2YJY{s0lb!;huwikrkP8}gU_d~oq@n^^31X75RuKe65Kvjz zKN9e>o#v^WT=5v%T69+dpksy7(+<=8x?c6QmGB86&VFr0DYYH@Fg{6yr$Ep0EE6gq zbp)vP%)4jI&qj7rnYM#r{D7kXxFeo^A%vVKvc)qBGzb0z`uzwLpPFN)>HY2(^4xaG09^I$x^w!u3La73^-Hu!MWt zaQ8if?P+N5HTndlqD5-`FgZ;LUYoYGv;Yp62d7NC=jfyCd-HR$nGIgCF6!tK!;1-G zKfupY8=dW!I zMQxw(N1jq-+xI&Vou^4J< zg29*R%-56*0|AB_jGdV=}fc*g2X}gbukMB2WYM_3CA!B-{8$mOKbS%l|Fz; zsUsSlK7cy!r(AgG*)@yn?|%ue7D^czwVUwz?az8_a%>oYv1}I+NW6G4%&zzuVnAZh zi@&ay7^B9UjSN*==wq`q+UsYCa{1a-yLk1MoBy|i`oux14X&i4oL~t1 zyU#v%IcrS>s`LSgw1#Xd{-tY7QIeGbXT3$;h zwl$v*BM+Q7al+NjAAIloZa%NDDJd$lQgA|dPbb*B-j0%B(hwi~>K{ISZA)-sVpF4em?AObFFZN&Q6LwUUI{RXL_aKh)1+4?%!d;&tfk!#|1P`-$ z=>zJ>Z2{>6CUE87&*`KOhy*$+MqczoPmPUQ$K!Td%`p~bOCRu{t;MlFX|$!m%>7EM z(FZVO5OE&@VwBA7b-ttzP;Z|KM-d|X(kEbFRzqX9rcI*LCy>)cQL*~q8rAAcpCF+` zs`LrmG$HLp!q#x^@->8t$pbY2LIo0KeG`Aq>`41j8I*D z_~a=oJ>%->=U-p25p;%{0u8_Hw|fjUU)L)O82%YK>XEZQ>+GMUzaJYz>;OO;VJh^^ z`75qNoS2y+XARpGdWRK~eMM!ZrDo^bpZ?i@cL^|@#Ocum6X4oiOwmXLu|6UWvd9ZX zB*9&1@uU|DWM)B-2HDiiJY^)+Ek+@=_bq09;^5U^dmvCJm;%4f*QD$d-^xQpuk6QC z=ar*0m7ahgQ9hHlFjZ_8GXQ3=WXUNpw*r z58Ka5dig#VtY3_T_4v`l_7s6bDD$;<-aKk^Fhd83v!KvO%L9)`kwc^%@L^P#AcP@A zSrHO8NC;)Va z;jKcBf^+YFq8J@Pg>@O&)d)=pD*U-@Y#U zm#y`VT3s{*n%!aJ(UT7J0b}-v;Ycmsc;?J$*eC3R1J?M;&OwHw5v$WDtZnHNa0RvV zqiBqMPM-kw$1_B&Ph&smmHl<5%f2U1o;h8eM$gri=mWUit>$}fG9-OK<&HXQlRf}( z!JYe>&xg@lLyHp@L3qf(@PxItKBVCYbu_i6v^UTl>Uz@RO|lTu{e@G%>p@?WQ_}LD zbKa5!Y!;h)rST>^6>3#5JhFciK0-RfmE{GitgW-VNL$)F`>YxJ(kDnPE!nPwRRbhw z-H&#^o(|7PLc9rIp;5l(7LyR9EpP$RP-)?e;DRS+?9;PfL7+nIDQp+SmJ-hrJXA5> zs=?*NrKi&R`cs(Cv-)|gauRVQMP@v0rTXbuYOUP$!2=e94${s4fx;(F9e2G&1rwXR zeA>@I4*%yfEA-oU4ji;&M~=AmS_xMptGOlFM+@ximpXky1Y#^_U-|%&YaZ}cTAyHN zAF&h<6U_oS`}ZF@O_1XJ#HmyE!yo=$4k4RSvAH4i*;^oSkhOB|y;!80A?Ujg%kz#km2u_|gX) zKlTQ*Ka{E1&!sn6ho&2&(-UXu2C+%;?!6ktJADB6^|KFt?(_qLFJJKe2lmc;@0g$8 zj}L=eSfKC!vmdxQLStj2#X{jF!XtQVDvBF4CzFt9du5rM&3B*u?;?Xa%O|XYLX*3ef~S34MU4;WjZpPga+XXB?Dw z_M6Mh)jOO%AT%=8KK#31gZ@y5z!ocMH8Y`y@C^7ljSKm6_ zkfz3(DSpB1PCP+8h-`Ft9M0~RD_33~UR<7Z$_sp632Oq9_S3H~SqBMgfn*#S6>ER{ z(LVsj*nQkzyq+{nV>E8^KDoR23kfouK7ob)#ov60PVvDj`)*5tY*2VrWb-+BwTi*a!tL)^!aFY*iWiS0}71Q}NNmaZ@sxY+Iza+ApYUvZW_6n+%6p~*0Zs7!a-E*%ecPv5N%O)Y9evPa+jyfdT5pYd85kge2}i zNSt0EW+z|i1JshCb?2^&@nZA=lE?n#D}BIAW)pqP0;Kho(9!7w zfVSc@B(RWuB~a-d)YxfMzCcTV@k%2T;cl0BCA>aQ@1t`AesYqxqN2P(C{2@-Y_h24 z|C;)0L>^0QJ)s+vx>Gnm041JGjaLFwPpuj|&nga4tEJ6LrZfi7{YY@7Hadg2SG5?2 zSCkg<08vlNPwYoDf`~K>WT&l4?|fU z>3szdlyG!dM5C$@+&xKro14$?w%VHQ zz+R8z_FSSOUos3Ge8oe93-@v;Rt;0I(@Xe~`}4QRovwu&={VUT1%k zWX5$MbJLOSg?c%Yz~7=NsnP%^W8cqW%YIF54PM8gE2j?#v2@NDl#wf*A@PxpF%r7m zqdA{&w}+CV{&|5B3?<(6J@38A7B!t}A_l zj`EGt>q{Rf6zlW>OFBcexMiQ$H2FeaEq#FUk@DHH6tO79Je+dT5J&g8f_-lwGo#@G zlN^x-Qdn;?0>5^%32A#f54d72xa;RmAAlR-b`nW8JAJ?)HDADD+HTyr@ALr?(g)CZ zG;)@pgN{!%dls$E=V1Q{2ngx)hCzv6!XG?`bCfEaO$A3>aeTdo8Mp*G!rS(UA&0Kj zj8Ibcr6|{_6X_GwT@Enc9|kk%0M_-UHh1tc0&uiQPHChUko`?Au3V%uPr6U#ETL5K z2QOJ@9q03iUl+a>Zx(|q$D^W9&2;B#`2D^;I~}jC7*mTYjj*fp+)NosQu+YJs-R{R z^ES=z#UJSJlG>|uCE_(Y1nJ`%V`Eb;eJ{mclOw&S3 zBe=ch5Bh+oBoBmyz}Xn$TKWLN%ql)yLdYphiFORX{JH z`MeaN>h{hctxx3PIyu)TjbQ?SDuBpQ3m!~t?gYqWkjSJ@2&AJv$2FCNF(^HAq#MTB98+VC`t(%sX+vt%ZTN6*dNJk^Rd4)ql6dd^Z}7CFyiWl_ACBnem9!_sXOIW~aYNVu^uJ3gWMcjaT?rAqy2OcvAh^7%KC!t6m zpsp;81<`zdW_AHMsy=JeVf@nsJK|s2K0ApE1oeb5S zQiO%n9$_4y+K_#*QItl_By}ytyTqA+f)d9IgfWwJ`T#1H?2DsV!u|-_L@k)AoVZWv z19UD@`pD z+!ttzhlWO-7+H^gl^9kMQWy!zef-BeTcp|8(fLZ9&5 z0U70*##?t?Y1HY^egKkmhQGJJ3J{Y%K(XFWlI!h7pYZJ^SKsAX+9>fG;tN&!)KdTY zA3t#iz6F59D1Z7n_E~^blDtPpTojMu_0srX$5o{oPa-BIHh^Jp@smO|(CAzTkQGzv z6*B4d9bjTamQMXu-LC-tN&{SsekXyrmzYWULFa(#aQQ=TaPE*;7oVULW})Fx4s+<{ zImnHaEx|QS(k#)f*d}FC_ETTkuPiTfL)#?IGNdzx8{q&(5hYc5K}Y7KRSP_lKyxnjMAaQhh6e>_NjEI!VKa+ozIT zQaRQxPZ4>cbA9gI4UeL^Kq;rhk}35%rKuqT&%s;P|q^QW`Vaf6OtU9ktsXr}+N?l|4t_r-8s{00000NkvXX Hu0mjfl$6|n diff --git a/mods/pipeworks/textures/pipeworks_filter_side.png b/mods/pipeworks/textures/pipeworks_filter_side.png index 00fa44da3de93fc189663959e981cb711d993ba0..6645948d19688b2b5dedf737b5631f74ff09ad8c 100644 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF*gY5d<~hS|Q!udAQj_;_sbMrGT3kFuMS{ynRcF)#{WA}W3!Xdi>8tDnm{ Hr-UW|KTJzp literal 13194 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 diff --git a/mods/pipeworks/textures/pipeworks_fountainhead_top.png b/mods/pipeworks/textures/pipeworks_fountainhead_top.png new file mode 100644 index 0000000000000000000000000000000000000000..503d051732caac58f90808860e4dd570a710d70a GIT binary patch literal 1814 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 literal 6739 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 literal 7121 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 diff --git a/mods/pipeworks/textures/pipeworks_mese_filter_input.png b/mods/pipeworks/textures/pipeworks_mese_filter_input.png new file mode 100644 index 0000000000000000000000000000000000000000..d0353a7d6244f3d975bdc15810eacd7180fc5061 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFbKKg|Rz^`#(ZSX_E+*>E?c+W`Wl5ecjv*Y^b$fSn9x&ix4P`n1 z$TWz>#=+&%E=(VN+86g{c^G#`ReP9ml}n>FVdQ&MBb@ E0A)!>hyVZp literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/pipeworks_mese_filter_output.png b/mods/pipeworks/textures/pipeworks_mese_filter_output.png new file mode 100644 index 0000000000000000000000000000000000000000..35db0fefc7570f9f5ddaabf103840830010a2fac GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF*gY5d<~hS|Q!udAQj_;_sbMrGT3kFuMS{ynRcF)#{WA}W3!Xdi>8tDnm{ Hr-UW|_F7EA literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/pipeworks_mese_filter_top.png b/mods/pipeworks/textures/pipeworks_mese_filter_top.png new file mode 100644 index 0000000000000000000000000000000000000000..7b8e2b1d2d083bc886c84743cf8b531a90dd58a1 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFJ!Z~g0>bgTl>toXr(@r;DyC9Qsc^apieft-Sgw(jrGZZ_xR$j2K zmQoUTN>KAY5x?@yg~@%NRKBm7&i(yEr+8_7e=$>)$ioa+{2OG#g^sMuHMF%=hd^{$eQTbx9Qrv>DjvQ=F#fh zzvk4j=hwFD-NNM2tM1~<=-9dK;KuCU!`{c4?BB)T$(-fVtn1yt>f62G%AeuPqVMC( z;?1Mr%AM`u$l=SN;?AYx?Z08`Gn*#H0l0d!JMQvg8b*k%9#00Cl4M??UK1szBL z000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*q^5f}x{s{{=I00W;%L_t(o!WoGW2haNnl0#aI_&m{Bzf8Z?$O40KnT}vpj>?Ucl6SC~(sJc@sumBlnXbP#| z0Gb7G_J5~4Edqfp3&3MN-FJ&1IKu+K#f0-LD3DkHE!o?oUoNHgbw1;zCsJo0@r!hz8Dm1h+J0gu}{KbKyC;{g?(hi*>Weh56CrPU{ zDo>~}dn>=ct?WZBuDuLR(VUtPLL^lgO8F+k(APrz4gq~3LSI@N{+z;4*S3zshFiEa zPlk1BIF0i7j~IE;3U5-DO-7%j{zU7>MizNwbF55mm7Gs69<~5Dva*;@BEY7RqI@S5N?AD@wA!pay$tNd86RzF*CsS}|HKE^ zXNw+g^=jipiF&)~u*Aqq04-&9w<2VN9UF|}OMA;#$I?;sk(>jmk9!rS+xqM!z+#w( zI$KeS$W9ZbRmocM9EEo?J<14dN01>a#;BfJoZ-c0Lob39|JkN#M6hqN3AGdfT~k~R z_83kg4DWI%YGs<1vW|iSevr!z=8?4Y4l@1W$vYjH3)_*nB7oOmwA;1DlLOa9Z17#~03#zgh)}*Y z)aDc^>qoBETULJGGwT8j8(KHK+DKs6Jz9)~J+H}9d6SZ5jX6()YDj~mXqna7+mxzG z&Fj(-HUNQmPE`AP#Zmp(?lZe}zwVWz9@6o8q?Y=WI>M#m0YHT zauSD?7q6M{yblgUI~R?m3J}wYZL@IRjV6UdW+0`_cGh=_mkU^?CH$TF)uy0N>&MCS z2*qHZb`erBO<47blM2@GOz@v|D&QuQyMH$>YQPTw{{y@-YDxi_CU^h<002ovPDHLk FV1i@SHv0eo literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/pipeworks_mese_sand_tube_inv.png b/mods/pipeworks/textures/pipeworks_mese_sand_tube_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..8829422d46b2c9e0039e1d091971f1f1e4ce3c67 GIT binary patch literal 699 zcmV;s0!00ZP)P)t-sVE_Q- z(yZpxvFFvZ=hwFA*th7|x#`)u>Ds*N+r8@Czw6z=>)pca-oxzQ#qHq6?cvDo;>+*j z%4}v90004WQchCjo&Q+enDEK$+in%DdH9lbm+=aJURij3CPH!# zAWwG695QA=RU9^2xbwLpaE26!j^P+9{sbr zv_7;gr9?Q^Yvv$r8%qG16MmP9>}T&pYWkeg%cAZ#P)njBBnQC3uYD&ZRhhjn5x)zh6`y}9Y_(Kk9JAd*$6rw>oPFggHE z`%K4Y<{ZDPC4+ISG(6H2bW@_zP7iAQ`V@t41uX^bD%)D_kNB&ek`id1KfPh|lM-Nm ztz{rzL$lY)gPX$!Te|fFER*th4^v){;?>Ds*K*S723 z!sOAb=G3w5-ox$S#_r)pWK$C>Kez2VHF;L4ri&7L;#2d9Y_EG010qNS#tmY z3ljhU3ljkVnw%H_000McNliru-3JX301vNabxHsL0@z7JK~z}7l~>o6qc99*cS`z@ zPz*Q*S4sc>hf4@#afTH60gMj5s9uRASzLLuj|Cne;VefX797B_01ERt+-VY&*s=f& zR>OTg34+xu0Gv!HM!^<|1<;beZq%fKwk!bp8UfCuAaeyT3RsT2`f@oXq2-wXIvaPV zt05sr7JxPN{Bf6bvS9(Fg^!-kTi|J+LEQW|_%JX50K)_@IHB?Sz)K|EXX0@d$bh_J z(oKEK!k?iU9j_L0*NrDf6}&OLFv{$J^=lnP=*BXk{QN)mIs$OY>7uGKwS*r ziD!a^Iu_K1$%$~siNQYNgB2KS$+>3J=3tR1M`~Me{*IN2G!;f;-Z;uNI0HrhqH7Ye zjl&eJ%~8`@uZbL@UI;o#tx-}7)-?S|htd!_Og^&X(bpc@?EkafIlHZ5DP(JK@@Zs#gKUMIms_L*!a*!+O zj5P*})h0EzX9=^!;n3)wbtD|{i)^Yfb=tW#B<{~NEiE{k=6hJ002ovPDHLk FV1hPT+_eAz literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/pipeworks_mese_sand_tube_plain.png b/mods/pipeworks/textures/pipeworks_mese_sand_tube_plain.png new file mode 100644 index 0000000000000000000000000000000000000000..ff0a10702572459fb413816fd8c92eb9a19cfbcc GIT binary patch literal 2464 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 Z@IO^#;yTp+t%m>r002ovPDHLkV1kq=q5l8? literal 2532 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 delta 2061 zcmV+o2=e#q2#*ku8Gi-<0063Kaozv`00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-sh5D^#+?nCz7000M^Nklh-H?lfA zE2}E2YpVJ+w1Nv)f-4vP0YRr{TnvJ^5n<3#H_|9AC^8RbBY&v)Xh#|p7b47J>~>tp zC~n-laigeXJKa`ybyiho<*PFD-g8{s$gEB?B41U}RdFF8$%wd|IB_1|`OXPKMytO4 zO$Aw)=n9^z|8k){es|#py3Kb10F^60p)BO&tP~)=3g{u&tS!8U@4Xj(sLM*s>=a<4 zXCZzMY%eFC|9?&KmXW!N+*8`@cnxrE<@Z-;(4Ot)IErcfI6^Q$)5s<%OHvX z?IoUnzWoQ>DScw<9v}fnz)Bb1JGVRUBEj&tVXRfod0^!o=&YH{KpMeeJ|9QiHgM`3!<84VdWKLc%|H@N3*HzX%gu1Na5F!w-!q}~uu79EZN8DY0et#^Gvfaoh4hTh%gLm7D@1flzSe-{G zEYb`${fz5+^Uhc`D1I-eF(7_>1ak~55rL?9tUab?fxUa5QL-08-i}idadDWl*8$j1)B}1wg521*NzGw?LoDR%GKK^LS@&tZ>YGvBV|$n>g!;;4&Q$SGUd4X?11e> zKzqZ79MmQ1>i{v>tV6XAl@^FguuIFIgn#e92bB(t-GYg(1g1s~L8ctut~4ON2Igge z&w(g{st21jh_6AV0n6op`-uS^Z~(VY#!L$z2A3{F+)hZXzA=250bXFc4%hp4EYlvM z;>Th)GGlx~_^%tXi~iqg?f*(oYMp3ONjVN4y{ePWPdmngptR?fu37y7PHQa!l7Cve zx6`x0`SmZLS^XaJvdWuZ$HC4UbKT?p1oUacnK_@}uBv0(N(r85Nw(0uTqbm3*R z_I`S53YZrvuU>ow&FT-+6;N9LA{sld&9!M-t^ZWq;F+%tA82-~Elx&)le)S|F(S+E z&0KXuqP#y&j{}ROw}VHopP4i`%YV__eKY<1qB*{~dn-2z0HBS>-%rK?t=%6jB$4kw zI2BWG?!LJoMVFk}c=4_apOUlp7P?Jba#_viE1ySu|L1dWXzVkm^8CviU!5EH49L|J zeT}6HUpX}hya-Lcvh^*r_I{D9fJIZ-v1cC4M z0o;EePZmeo19365ym%GfJpjOQ8C-}tgFuBVJW7?%od_S$uD`7+9YER`kT>FXz|qyv zJ&M_5?;gPxJ`iLw75MJo0#`sw5LXQx2QVaWh|93P_dY~wfE*4<0+0pTe+~l*ac76P z3^wakeAg%82^--qwt zgSh)p=|ZIuKT84X_ha@b8q)N}UV`_JLHqY#QgJ(Ay8$-qF>O?gd;4}se}za|g^9LC zJV>Pj;w7m1xC_MbeFW7$qT)wUlA8-Xc*ovCxB2_PNWqWv8`akX(|-dG=H;Vt8|^`* z3pOjEL*3s7kpbHch}#P^yY@j8L8J*=x%#tACNTH!zofyf%F~8KCd8Oh?2=t%C1Y*HW`38dPY>GPU17z8WfV+XT_WxO&H-KSAi zgV>isf5*X?3l0wO;1DVx{ zU!9y?7oaGh!GD-hnw0VsK1GR}!3}IKtHEmE>U4T7&t@$#PKNId8qf^0b%w*z#hD>& zNp7N{-$;xBP|5VuS(~K-MB3pYW*~HutblnrC^ADlkev(oT0G5FnAr-F_5c+!ZM|n$ r4i`aD`BIX;b9bfPW0tQzQ7MvO?rUas zYnB?7Qd_8Qre$V5T#qVo!cw+uzxYtxrIhr-QkGKE zt%N9p5?;Cz>X+^nDTFn!bXc;Td?@Zv95h2aITBt5w37$%GNpSrpq(t~?p3c1yh>=G z-lkHi)SkqXPOIT|Eh;Qp-TYqx!DNcXX8?fm4D|IP#XYKTd|CS=L7%wdgrC|DSqK&N zO>L-DV~^dINB$mCfP;zqb=SIo0T1C^s#y7iM(97fo&c+iTwD=&>j;2(a$d&Mpmq8o zOssr1e%F|FCn5-j?fZ1_g8)otLw#6wkFKphqN0&t(_qOpzL2YHKyRk-`NPK+g{4Sa z0Tb-brBXp;e#638iv0QRWeit|Ok>WCPR9^pzIlj=*t+|t#{x!P`DWq* zkeo-p^? z%(M-<|DJg@$A}X|2@MX$E}eVF8G)tnv?LV;j%E4Ag?;V;*qcLH)&rNx4YfhcNbRIZ zDoLm3;ak6Z!@6Q!cB$N;@3_;f3T(?ZG(e^*U{Yq-PrD386Bd2M&m zTeJN2KY=5i&8NV^hv0$!W*Ats;d5llZiU%cgjSyBvZt0J@T;?a+}-@YrcX54&pa7M zQ!ck)<%tQCoX`YTn!G|Wx;3-)xdOYCEFj?&bP7Deu$_UtG(F8!`NOh*4C%ooXcHJZ zYwkt~qPcOMfwf*x8A}|@>9VJPODZt+k3Y1b2iE#oO`O>f;2%6Z$p+Ane=uu~#+?1ZE$ki;2#MBydsa;(M zRpvPIBHoZ3WfvPAzeaTQ8Yu5+X#rnS(6R@etV;oQ;+42QL0xPIVjc;1G_6VP96V5l z>_`ABFly6bvueUKaU+ZE^-x)5@#9D`IK;i(^uA#`=Ut3wT)R3?Xuk+v9kSfvT)#8^ zc}DOeYSv{2L0ZRBo3`CLkAH4M%sCQ}+1P`OOASdg`DUg-Om9rwmki6APb^*(?D3z? z=hNNIjc@RXG5OP*7E delta 2008 zcmV;}2PgRO2-^>k8Gi-<0063Kaozv`00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-sh5D^(CEaMJJ000MQNklh-RqlAo z?x*RQWReMySg>Z1UH(ACOoWgkAy^o2wbhCc-_P5__`A_L+ee*lQxcZ;CWJ8k?Y$G$_Q0o4#HIdlQ`E+OiC2tYGI}^X zDYJUYO`geT8U#GY1IQnH*R{qUQcS-c$B`Or^e~@6P^AImKRegtuhxHuJLQ+%^R(n* zLEZo$4j|F}WH;}WU!LuGvjUX{vK|?_fPiQTpvhm+3wnbz_`k9Hu!{q^vjAFxYM8`; ztBvG#466Q$#SBrzoFew4!)pdr|-4v-j?>d16>yL2@L#3EE$nYu!DM93^d zqFsnIr~0~4j8UNgJ&|Fq%8Uv(p|CCv^ip2)&KRF5q*zgVVjBGn2f@hgs&=Q;4|Ybx zkU>gRX*gYA z%5kmn$DwLa>|su0z#?{!3UPMG&H}u{PrjyX)??CA?3bao+OO-o{{s=h_|HIW4S)wC zlSFPJL0mRlEiBTKp^b%Cs4kQjhT!cjXV6PXT z7;39Y;iDQtwS%>%Z!JX1K6>z)iaqRa5cv?PgUxz8=W<+qwqd-BPz{qsCUuF_G{3KyO~MRlUoQoWa5^z`3x_4oSd zXJ`0Z5Un0P>JM+~Sq7)EuUSWP?=76yAfBBh9an!fItv8r-$HZmP2^>iD&IqM?|+Ti z7)rD|Aq~!2e5COB$2oejV0yKxJqZAwaTi`e^I+@T0GO33moNSVt%G+)15nzyj{3u! zvrWQQ&kcZ}^4(-X)5nhDcqVvSnjQ{%Z;myqbFl*LjJ(!5cz0|Zm^r;Qc7OJnNrTgj z*1@fj*X9BMfHn`dasz;>YIEkH8X+DGrJd$%ilUA@2SO7~bbR_#E-9hky%05Pmw1j)bSl70zd_Y-c@ z6K{yi@Fe^MVrxl#OdNn`R7|Qv<`T$kAnN=lR)lj!SZdV;LxnduQ30FU$rXAN3MPMcgDseF6@^az&mhL6Iv@cPsRjuU9tGXo&Q=I9}y zl3J^?w>hj+j;KhD_ql<}EjJdxrUK(X8OzawqZqw{7X5q*Gr9n=`7i9S-CMTKq=u z1+d+1*k~`0L}&$o2OHg+n)vk1=j5@K+nnj{a}jJdF|HVBjel_ivGw?*SPpprn^pH? z2eXO*uMb4`0iaTNelIqtv|Rl!)%*bw~ qUY0JvUI}8)pb2U_?)zsKt3L(sg}h|st-TQd0000pPnV0L9-V(#5T4qomahjXtziHnzDuG(n0YE@5a|B`TEG-B9d}YFx_Pin3PR zi^OBLnWa?6gI1$cjJd2dB5nzJb0fMI%fGPm<#*2cbiSNCZ3tD00TBQI)c&5mrG!c( z-U|-^KbNR~3_~jOV;@g{!k(;8E*_IWbE0LET>NUA>$fW%mI-nd(rytiSh|@l6Bdbh z*JQ$C=|+}9%HG-jQNC3v7naBb`OpeQzV%SL0ZKRNJED4pq)WPyu_J2Sg<2Jo&RwWw zR}8Ws{*7I6yJY=4xv)$j`2|`D*%2}1+co0V+Yp~BUX2s;BPHu;;?)?*TB3554OOt} zsB?IDsPqBs_B%>gC;Jge%I5zH@CXErBLD#5=rW6Og3v8?C!2Ga`4qTUMg|@Ufij_?uSbC&AXpdVKmzNZDVg@gju^>pFW{W zaH|aE2;(Gl#Nz4N9$i-Hy94m=pQwsKWo#CWI2*><5*PJ!Co<`#jDCC;sI4+ zw=|4B!#^?6(bOSf-4A-y;Z=Tavx$=_oO8{5RzM!W=Ygq~;efSlT58KpVk{QXRz!!e zynT(XI$&Ibn~9iv4Tw~t)*ZUv!1~g){?Un-Q)&B2xH@aSFqK;+dY`|I13dOuqIAr| z(|&qaB8hLItFrSY4qTt;fxm$c2K?(I^)tXbfb9(Q7tpaLIS2FT?k@-s)klwDln(PWJ-0B9 zq9h^v&m@>sQogGE?Hd1B^PMPWyJ{L4G^|q>Fz;6I7(dXN#G9*_3G;ZU;OXhQDV~)f z>=d%JA$G6^5T1OWOm$XY3|76)W(OLiAV<|6=f5|eEa<}zb`}Efd&c3KrZ4UMiZfi9 zh14Du2b#IF0dAxgpKnVbKz7fvU;aCzN@DhGG!rlX8XLvSxG4EQE48l|fuQ zI-8G3EE`QOciaiPvdaDyIKXm4KESw+>4`J1tLjTMhcIgNF=I`W=JaA~^c2R#A3Y1t m@b>f=`to?dNWh&ybm?>oz55@K07qQ_ delta 2052 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 diff --git a/mods/pipeworks/textures/pipeworks_mese_tube_noctr_5.png b/mods/pipeworks/textures/pipeworks_mese_tube_noctr_5.png index 1d6a4b9e00574b88cffb2e003b6f723ef8110a20..2cc44d4815cfa4560e6c85bc834f40f6eea6249c 100644 GIT binary patch delta 1126 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 delta 2053 zcmV+g2>SQ%2#64n8Gi-<0063Kaozv`00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-sh5D^+J=Nq(_000M-NklA6O75>h-Z^oTG zk3Dvbn>K9<5{s@`RBT{D0*k6i6+$8*SRyK@*tK<9DxfWCiGNg(Kw^=wVo{J<+Jr<@ zqIJ7s!Hxy2s?y4BoVbo-kLM@jnR)jd7Wd5?Pv*^U=5=^?WzGA$_uO;7^PTTp6A~Jw zjh`yu!DJ5OvE4t8^^Ug>K8wDg@b4*!d2&()kYEd{b&y#Y`yICNvHL@Vq^6mi z0XTC6Vz(hU5`TOBa_(yb-$CXeh-RQ#OP>L3a}CV1Fti@OIL-|=0Oz1;K|G&A58zpV zvQTZtUVps$4*u#tI=}#V5E&5r=`(=XEw>2jz0)RhU*C7Al%d*$N(w`Oy+a7<9{`Zv z3$*0{2B-qs0DH^nGl1G%c-b#PY^mox$IGwdZwo)}`hWdO{?tAUs6k~neFgw|Vf;&f zuna!yo|Gx<3zG-anFayR@c_#7z3W8z%^26Og*Z}#4L(aJ2&$A}G7pV4`QxQO;cEVj zd!A+-7NpGp#6Bdr9_{AU{F%|7H}g;_Bk7S~2ndK~02=&>7U*@-;QxlYM+?N#&}U}U>f~D2EoAXsy2qy z4>o$>NWH^|DKY?q%^cV}G}PUX-(JO){K-2kaDNZjETxkN00LDD8{D`HB;AW>bvmiA zl$|ax(Jiy!jMpf!yQ*bX~A7YD+#HbB(`Ycpx&PeQoI0p%~ zz+MZW7;1N-!bi0U)jAd)xHu6hd-ujODt5cQL6m_=32YX_Ip@Rbvj*ec3)N<{$fz!n zQV7h8fHt5~1+fn=dQ zzwT{-qh}w(>bcjDmQgx&4s(B58I7R?n*-9|sKrMNkN-SJ3k!xsC|o0^hmBkb;ogXt*#Ah}hzw5$NiuLAr&)Hk?t2lc0QM~u7 zw?|)of*sqwi2v>9MwsAE;9<%K6N*Ab)cZLH$3WB9sBh15vJRIH|fu1_aD=6Wj56D)msK@I!^D7|u5v$@H8F^@ZZKC)5Tv!QPTnSX#=9 z?uB}u7ZC}uTX)FZ43%26<02IhD143qZNSTY1-`6|xAU0`sF(j9Dt|sfN54^|1R~%4 z&iM!zRGWbAfp|XZPy-&=a|UFyplus#S23hI8LBlOw0fYHb=JsmDpOHz2$D5 zvPVT~yf1VpIH~afHh)VnnfpRHx^v`$AE8RG4BQR#3&yyMDiIe$%NkX^_tI0nBq@?D9yT z-(T($8K~MskIE*P1srSa*WUJHJm5|)VX_ZF?QHryz`1aB`PK_y8*8w^ z%`_6Bc>o@4us$^LX}izf=T>fWqPx#IuvtdGVxZb548)eglVU040c;BHpB+pAK3?cR z_YOnF@cb4ws8n73FFWZofY>dF-HNENZN}&FS-glUo$FlXDy0-=0e;GcXZ>q~Q(lk%2w`tI3WHSg0LS14t080-VsDe?^|s2Cx->|+p((5{ zE2!w%9-4wcVN+NPaV`>Bhnatz7dS;Xmna`dFa(NDnH}=9cbstAQgf4Ry?aT90DH3# jdl#CZ*22Dja#;O8UqW=r;F8lF00000NkvXXu0mjfzaq+@ diff --git a/mods/pipeworks/textures/pipeworks_mese_tube_plain_1.png b/mods/pipeworks/textures/pipeworks_mese_tube_plain_1.png index 95a2c8a5f72f8a13959de13d210c600b9d77678d..517f5a4d9688f2f0ad7b9f4f83471535e28d9695 100644 GIT binary patch delta 1306 zcmV+#1?Bpn6QT-`8Gi!+005o0f$RVP00d`2O+f$vv5yPW1#(S@-g^^67!@;$8FWjPmGx@8e?g>yGp4i1O)$^y`oG z?3MTNu=nz~^z4`Q?V9rFd-d+3_3ohd@1^qSfA;XH_wlaw?|-NC>yhu{Uia~`^zE7U z@T>3SWcBWz@#l8&=XmhsXYl21@a1pskt3{0RR900001Xf2()^ z001;}QchF<|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0 z|NsC0|Nj6>SAQa9000B=Nkl5{525QV+>&gzbWvM(VadyhKr|86%BP-4ye zNLNjCD9=~jC!Gcs-# z*ccPvZ3_E-LEP^w#JnAqV+u$qzilMx-N2!e!gC&I@faxiFi?o+Hpb|&hwJ_{GQWYM zS?dBq=6_d$)R{ZdGUYiFb>RZA{B0h5XeA}%JYO}jmcUpHtZ6hCd_lBUV6IWnj4~!z zpajG@r?Jpn>A?JuZx&SM9JU~341z7ik}?h;)J|$bK~OE#hH?p#P$C2n+Voe9k^@l; zI4s`M(+OoAE|a>;a1~YOs=$Q;^oi3Q>N5Bj9*@c#-#iDz(COznE!;#8kp{XFpEXgoU$v@6(r24 zcfG!kB{+mBpPZRKIL&Pk`BM{(P5lJ0eSc^&(9vN2Ju+%axW-Nji3OY-zL%U zO!(a!sYbo5z5}|I-*Y0_R=upc14`I>0a$EHI8A`4@w_{$p@hrbiInGlk2v}XfT^E} zWK~+>VQ}zrNx<`IU4<4egIuv96}}iJP>kS&j9r$^aN~K za+tYTUlQf_!U2FT)`gwroS3JHO?3&Z^f;`E1kXk)rjxX`hiOCn&H|*9fqOd-!0(lZ z=x){oCeF%lpa^(0(vU(%i042lE=~&O?(FyK`%$_h&G#@#NL)axe*ydl3KOpCmyuw} QHvj+t07*qoM6N<$f+*ppfB*mh literal 2464 zcmV;R319Y!P)Dk-7D1Zm$pTwu`|8$~v{9*YU=rsQf09ZJAnWiyMo>l-% zT!Tmlq!uTBhwk3A|B!fE)0|!a*gp-Ucc8rEso(!L_}IvIkXi;&86xfC1wco)z+8dR zTj`7AU~~XDfQSb1d;v3nD*%-s5~Y6sTO}h&%59Fxd;#jS&H80n!C~YsCwI==<24Tn*7+s3-2Pv1t@`N)A}|A1E5+mi zfPsjHjyE0xNe>cQT}&!$8rB!c`8?bB&43y-dZ(Zm@F;eVO0GLhF9T@j-OmZDB}ZC< zLm8@f4|RR_zaSzg{}ha_1Monk667XQw%=0;CccxnIgr?nkuG%fKG(R(1Sf;|^74w70=%nP*w;(3TfP~{KV z1&{~!*THJZ1%NF{a*G#fC!)y$o(D)5Vmi)QGR_xh!Ni*`aBYA*=;%E=#?2LA5QhnQ zA`pnm(9z9=ldxJj4C+DiZ=$<56UL_elg^6jB%YknO^DtFsjB1mB|u`3T7>9bh-ugz zBX&Dx&}qH}<_b#T#{pu9X(u)9m7Y4Z%(w~@Z-Lbk*tff6bknv`4iW9Y4P%;^nfr{} zn7}QL!D=bt3#^u)yEj2<(Yev9N2pGmD%Hib;FZH?fbf~*t9JdD2o^s7@GRiq26Vgu z9dDqr{K73L`Xw}Lm$L&9E}cVT>(%k1s&~^TmLZ11r7u(C-fJ=( z0|J0N*WR+9%IZtWg7RB-!Eh#c)S4ayz1N4PRifk|nMY$iy)Xcf_kJLKSp?1nbe2=3 zKh4^YGjYJnPV4hSer&K)RF8dopnh2`WS4*iFiJC1`xYf#7(Kc(Rad_@w40>h(BxX6 zvii+|nt$+#4*mfXZ^Fbix3h0ZK0G-`jjdOu*DZ|MPi>{+VbnP^@4b

879)yKXn&&|{80 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 diff --git a/mods/pipeworks/textures/pipeworks_mese_tube_plain_3.png b/mods/pipeworks/textures/pipeworks_mese_tube_plain_3.png index f315ea28a5f5d3070cbe0c5b2d92e7bcc9a213b8..c7af0cf3de54733543be4df60c8a2d1e0cc79cf8 100644 GIT binary patch delta 1312 zcmb7E{Xf$Q0RC>ayp{KoqN|h9D&-=JRiim?i?x=Ul3HQhqRZ<{vk^(jOLQZt6`gr$ zp+c$bBa!uD-bTr#c^SiA*^--``xEZ@<$3w(d474`n6nM?t>`)c0F*VQ&8`rHCjejZ%DBA`Dh5o+zf%B*K%* znH(q+o`B~<|+%3ga%7Wznf`p}*qN}72RI)0y zoX$~6E9Yklq+_9KdBgl%iAq)@9S>WO+>whCLvC7SGd%9<*|}!eot^v8!K0af2=b^L`tAT zHCkPpQb6B16o5{!P6PluGA#iDF>}e(1f&EzuMQ@2`-_+ynJw*2TxHU&c%rMNWE+7XCa01AC%MAL{WGzmaF> z*y(~3y0tHhJAkRl&(BX4v8kWrMwEeG13_GZE7&oM1n}9+ zISGI!TFgZ-Mj(g}!0RNBz)KP&$j{fiCwbLd7|Q+8J#7|fQ~U^Iin8~rk#a+>?P$YY zP~v_%Llo3(0~#3j*mbLPH#nD>Wf`ok#BC2zUn`05!Ptc~sm8(%6A&%x1GMaE(K+Mm z=Ea4T8u#wTo`Z&r-eS7SJG>464$33j?Io zPqw?AIkdrRNO{u>I1jlEC9KWCUTqsRYeK-`KUX`pch>1$+dx|$ zB=+A7&n@?=?b7|`2Zt`@9b;9Lm|f*k2OJ8H7;v4lq2}a&R4MX)){w^E9w#`Y5i&- zhvHqyU~|%hD;9#>5aqMQzCDg*;c5?!OH!pQXdFfgCR2*HZgpf?4YUHwAjrNSh0=Gw R(N>NG@bwBnb39L{{|iDQshI!( literal 2501 zcmV;$2|D(PP)*+>QpExU%?d<_0P!alm6|SEQBtx9 zO&UOLLlCGXm0C!VV1*D=fgpiY(PY_0m!L|h6dFR)%w)zh;~CrI@w|8MVR5gY$MJji zvlENFw@Suup5Hz9obPMdVW9vN+41oE~GC2Mpx`2D1N6^ zW?$cDh^axuhnN(W0DB7vTK@!K;uolE0|L+hWC!fcr!N4aH{fMI45K$=?YE=U>V%%eJM4)t4t22vkd~CMIxQ?^DiVLD~X9T!0B~hPzo`xiH-Ct0{=7VcgdkOTd6A z2hiZJXoFri4gR+)AGSDYGY2n!rLxP=ur4R$e2dn8W z5+i0kwjI`%&qo9?4>66gmcsamkeY-EmSIdi(bvT>Mu7k{F~(jsHY!|)KwBJWx4ij2 z3Xrl9S=1cZM(<$|4D7DTPD1}+DF#PcT|rDy02r($!QMimyC)ZZh}z0eZ;QYLSe4Vs z0{{aN4IM1r0g`Tqv^t$s*wm~qknk$ao$OJAMz5t51MbG|QPy>b@nrz5{r79aYQ~Y4 zd`E`r^^UIJc@IPcl{pBbs{lL@sSvq|lqF2Lr zB+7%md9bCK9+bBakZlktm|)q87@C05Re0G$U{!|En;7pe^6DTw$` zxsTWdkO$5zfYpo(09%se7BA8aMUw?Q50D**X*p-fIA5Rv6D+yFH39OV{rBxX?p*-} zaUmp61OibG+P@ZZ5?19-P#YU>3iP`nV^f&}&WdVPTKmw533(@Nk zQ?olp>~_qcRlf@6BC>@~0mKl~3~SoUKG?C$xC9d{gVhX#4}ozDM%Qf{i z6O+f>#^l}N7_4SGe1T_S{P#d=FN|J;^5%9?ogh-Gi)p~Ce*SY^AMO3qD_H-+6L(x& zrQbgR9V|izizv=MHqua|x%s*nQwLEFpFa8V$b0_!>@RWTnMd9KK6>XMIEn{9b?FC@ zP7hHY%#%Hz)hjPc(oWJ=gz>U_c#?GW{Ga0kP(AuxOkFyA=k0}yAkIflh7yY#*|NY# zD)yF#Pk#$K49rJnj_H6339mitqbncB4| z*@4l6JJZ9bzu6~~dO`HzGmng}1vbC*lb)Kt{qnc}0TV321QoZl7ZSC;!t8OXEuWKi zw=iZavXu^Vedc>dapn2nMrZoeAD$ac?D{wQBePfT>J9>(ygt>ed&Yh!Z>|gEuKwuq zhDA~}RF9s(^yL?aU;coJ zt@8F+tzcTak#gwHBH}}3?(ZP}(_bE%_}IY7-Sq=Dj-835z#S^QXvbsO`+Gft#I33T z;(U)^IEqbvpCYb?@&@t17I z5hKtGVEMa~^f?$^3As(%ydf@uHkVF|(bZ5N6Bj^G&PmCK0K{AbsaXWAw>v70JP_qO zfin#|$bbR!BsjAle)Df2B7i19lyeJk8P}fsQ#SMZu^y0U^MTv1M&+f1 zy}JdYt3&Jk;iea3x{O`}#6)WKq{rS^O+$HeT@FraGJsVXDzgv9^d6JTPk$AS)n6n? zqdgY<5*(|&=K>(61|6(KmOxV1$plNb3#oGYO5kpcw22EKHFakL*8f)q7_;d{R6&d- zb{vh$&w75owf^gFmq~(jo)2K2bhXPvef@5^OQhV`Z6kdpV06VXv-t6Lq5SQETta0J zLv%5H8PHa9gDmaH(pY;n^bhpTbw`g=M}(#Tc+kNIiHT1qeYO+H?R&fpHb9&Qt9kT0 zF&+hkoif^VC&g0816WPF^8(W-l)ux3?p=Y3;Q4KA5Yw>oIp%=nz1;?N1x8mwDr_Zp zgaKMUfyU}9u{=ObbF4&YtW>yjXaao?OT~}m1AF4sY^JaaP}ZIGZw_vGF@F)l-h5aF zspJ8c!40;;W1#(S@-g^^67!@;$8FWjPK)O^5}i@>yGp4i1O)$^y`oG z?3MTNu=nz~^z4`Q?V9!OqVni__3ohZ=zsR_rS|Zt_wlaw?|-NC>yhu{Uia~`^zE7U z@T>3SWcBWz@#l8&=XmhsXYl21@a1psi_@$00027Z8}i^ z001;}QchF<|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0 z|NsC0|Nj6>SAQa9000B=Nkl5{525QV+>&gzbWvM(Vad#f|=|86%BP-4ye zNLNjCD9=~jC!Gcs-# z*cubxZ3_E-LEP^wB)lD!V+u$qzilMx-N2!e!gC&I@faxCFi?o+HYVt?hwJ_{GQWYM zS?dBq=6_d$)VVv-a^*P_b>RZA{B0h5XeA}%JXA?JuZx>W%95x_j0)j2Yk}?h;)J|$bK~OE#mU0P_P$C2n+Voe9k^@l; zI4s`M(+TArF5|k(aTQhPs=$Q;^oi3Q>N5Bj9*>c#-vgDz(COznE!;#8kp24 zce}lhB{+mBpNyG4IL&Pk*;5mZP5lJ0eSc^&(9vN2J#uPFxFt>su?3tQzRE;!C~YFMoL%U zT=?A^sYbo5z5}|I-*Y0_RK2Xa14`I<0a#*7I8A`4@w_{$p@i$*iIiu4k2v}XfT^E} zWK~+>VQ}zzjluJ2U4<4kS&j9r`^aN~J ze3-ddUt{I>!U2G;)`gwroS3JHO?3^d^f;`s1kXk)rjxX`hiOav&H|*9fqOd-!0(lZ z=x){oCeF%lpa^(0(vU(r_wGF`?)95-{hs~o z#3JvlM&mor@1A$gcfRjCcL)=@wpY#w;6eF^Fum~fSohf3ehcl!y8wW>Lzih1&&iVt zfC;M*X@k`K*!R$#8}EQ1Y8r{(*t_ z5L1Up05KUX0rvJIY<~d2ByUjHhXkMrNC)gKXDy3Y6d1;g)xm(Uzfxf1p?621bfxQsBi-UZE>L6@|J!upk{J0 zS=1WZMjv1h4DDN$PD=k^B>_j;JweP+02r)hz~25;tIPXdL8JQfPefn}tSZ^$0f2#s zh7RxC1Cs7Uv^twq*wn2rkn$>3p6^qGMsH*k1MbJ$qnzswlgj|w`0o?KYQd3~!mbR} zo4dNc^B)iqlz$jT*8q4RQW0_!DckQU2NT|o+#E<~*GLCCxCQq2M}Q_0fVl*b_MZEB zfP@zKxa^c9N7+DJ1aTQUxCx>>h%CcM{y#dqF_tgS~?gy&gRyQ332N zgDuVUta&LrAW|^lsueLb1*2>5a!0_b0;9JtHS+SNsA%3^A>!roG%FyOtT3VZv3gS^)d@Eg9XgZIp`$?!E_O8km|n;a*I^ zZH~ceA>s?H7N9#fKx*E((Mx-%P8ciI#Wdlqf8}`3NAqv}5}RLr=ALV-{KsdY!#mL7 z9h4SNjy2S1ZNDSNG(eQc7f*jKcFkXY^jjQzxjT4y^xi>m91ni>>MOBM4^aWkGcoG# zvZNDKDpG{WvU_xrbp68H$pNSxe;%_}&)s`_;Sz`ov6G>+;zo?c1|pTX=J7M%#=Eb+ zJ{m&_SBJF0QN>3rj}M%#ztLYF%P&xK{WmGHAcUCq&{o>Tg7j`xYghnAqX%0jUc&63 zFZ4M=kPz%u5>3kii&G0LXLgE&2NLnJ1$SrMK(~gPGu7Yq}rw&J9efNXbDGM`K;R&{WWYgFvURPqpaoaS+N|>H)dyKY4S^z8v4#c>Jl$ z@Z_;>uW{-A95vRjq{@OWbL{eky(KpoQwD+bdi*YG$4_DI&5NUNf5^mEc?YakFzvla zIdW$a384Ikb`k%jZ;VWQY~bYn`T<)f&c;&UT`GLXj>mEj^?L-VTU8Ong+9M<9Gm>u z%TMF_g?HiuFzx|_VaHsE@;&^Zv~+4DQDkQV?LMZ-{*f`upr5NyWBrO)!Qt5rNe3bt z{?uoogIhfS)b#*}@*p+qfRF)V5cyW}iUx5W!QJ;DqLC|p9^uaW@C%OuH0|2jhNG`0 z((WQU`aN;ko(T|xcJn%j3dl`A7Rg?b047|u(%renB5jyp#bz8anCB37K5&vg52LFQ zx9OTU#AVR-${8`b7U^T+A_&SkDTN4tm`fnFh_L;>b8visJP;Lj1816ckO2ec8L)p4 zLF;cIB7mkqly@6&8P}crQ!er#l()|rFGXvFxEEjznT@DwS(TjP%)`q)0v&t^9o&S< zJq$5z=TQ`$LsWCmn~Rt!`vdDOkpDG(^~_PfTW?)(GFKMds`0DF}^ zBE+~>Cy@gq51a^ngT{5A+M3*HZTGHjJ)~toKKoUQFmR zdIJy>tJTvUdt)^R@(O-7?yCC&e7p4G=YJKrIJVTp*?YGwlmlTDCf@lw}!X8g#QR(Z#gQ1O!5HB;D%e_N&j7Hg4-~r z;oPaLwLvPRrm&^Olc=v=NbnTQNK>T;M+|WxGFeltkI4e-=oTi*2PRkoHS5f#Jndat yJQ;hBuHBwNIa~mHC3oa)Ofn@cH}{_$R{swtnR!hfzxs{<0000Y{D{ diff --git a/mods/pipeworks/textures/pipeworks_mese_tube_plain_5.png b/mods/pipeworks/textures/pipeworks_mese_tube_plain_5.png index 885300bd31606d9fdab78282d14dc592754b3345..f78178784c2564c9746b93882c27af70697b1947 100644 GIT binary patch delta 1306 zcmb7^{Xf$Q0LQQ0 zuN{iyp^fVGx}zb*rE3T?HulWWaQ=mR|MGslfBXFO={Ds+i!A7R0030H$eQ025H}K?i z9qENQ`9}OfI59$?J5KhyVn09@?yC6CZ2X9KaV4+Zpk;lfEUyxsoI~N`lhGbk>qfW( zpor*B0NRUxQ4WMa(LiGl^tv$|qy}SPq2UK3tsf&8ub9Chg^ZFdnH>OKS@Ui+QX7Q% zxV6d)2fo@`WCKDoNTZ!w3(h%>(m<{FS&cuE%7ZbvvUMY?h+i2w5nz~ItmkD#3@RL_ z#QgggShwxYCv(&BIOw-b{1>?+suNjy9(vq?7l)b?@*fuWBwIx*&Fxp5iMiqfcC$@4 zr0WM+t0qs4*@q&F^CNO^WZS9 z|6sn0T}TxKH^uaI^xo4`qFY(79aUGup*04VyCAf@+F?w&?&mLZTWdY2a|LlwJGby!$ z6A%c~VUg>B$0@$IO4^K!zkD$VglA4`^Gt%!ZeyT7Po3&c>(Fgh#~J6g<&aEuJFf?IYNe01vb zZyjBQwpgY^W%+$~tRN1)5@>qMZw=CTjUMeX_&#j?u*;AyC%@|n+|^q zrn7SbdQtjsTPBi54ZNP*wR}CYd;Ek^l#P$zT~!PurnSWR=tfFS6nU3B`GHnn*v>e) zEVQik?rM0Y*IqiFY%?0%)zGeY;!_$ZB*GW#$EZqaab_WQ)sRtJ$-WSD z>T7tSBJEbUno41r5eri<49V#hwGV|2hOnwnwwVBhg7maqI|NUn3;>J!HIUfQjC(Ib z&Yc%&dq52C2&+O=ey^JCmtxeQ!8SBO2E2Daz4N^F2KA_}AN=@ER=V5we0k}O+4vEN zU4L&vl>rSiROIQMEB0{U5}-4(d9CD|fBQ~>*4ZbQ;!#fr>9&}dk|br;f$n3QF9P^@ L5sq;^!?OPao93lI literal 2497 zcmV;y2|o6TP)F4Wa8L>qQpkxGoMJ25aD4=5__}W$L!9`&dzjKT|TO&cgNE` zFMEW$zwDjbo~m2-o_o%zTEd8)wfPeQcu@Xsd|~xhL%riqGv7g@`W66Sa`!7Vih1&= z0$`#=h%`WIYUp?9=2iO-iAFWe(FK70y)b$i%G;Uv`Gw%qJ>NlU21I#?)Uy`=9bNA(X%m5w-CJvF$x5ru@UyFkx}6)1lr<2tL0TM zb*Y(LLKf9~w$Zy71S7kv((Kbem`}lxMq3aw6aWUR39z@Luh9qBFXLkIky|1#23E7# z>lM@cNkp;(DHx3BCMtz zX$dxEs9xFB_04~Sh@kvEFuDxD1Cff6n@HJyPdS+AdhF&vB0EN!(BTJQe@6^xA|aT^ zA=23LJ`a${0v{KhlH@oWhzlStLWkEtln0UTtThiNng^*8hn9O8yKH?VyHun`q~>}Ocg|VeD>%k6UV&y!(U+kvyZ#~-GBQaIE)8hI{*Ddr-vv2 z^F+sI)x}q&KS8BpMVKzT2Pa8a&io-g0Odp9M(O;i+ix#C4&os3WT;=F^7(R+F2fR$EmjT^FFd5f|y3nR@%aX{@tp2uK)~2 z4^|I9gVJkfIvgQL1omcAP1D|js_Z&b&|^V^QRV%op2X$TucilJ^^xN!zIt@9sOpvE ziKU34!t`TQx%rZG$AADJ&$YMo=kq7N8ZW4S%P#271h-n#ouGHBYg)xh4w8B_*3t_d z0D1FeY0DyTUqEL$Me=j`^!ZdA@Y2)zWS1}N>=czFKkcYrR+H%^0HC=2C?%PxZHtm7 zjPBi;9z5}A*KX1={^VoBYk{>d{kWs%Z+*gzzrjTFFwvsh*`M^)`U*2&r^>=|)@ z))QOlAkXK%dkB|b_-%5gmwx~JaAG%nzdJH}vu)i$p!=^+HRIl~3(DKx269(kyf9>6 zPVQ_x{HaUtzWHuzKtJ@Z-06qQDn~q8XZiN{k=n$K_^$C>e5-U zg2S^5lBT_v<9z}o|7ioDmIpwT2dR<+LI#LIu*CuBUktoqK$Xp2loTC z&9${-9>c#bK;`C6CehS+7%E5$ZdNdmc1e&OtfI7yK{|28ZhC!%{XE(Pam+?1MlZ(Pre)p`7eQ&2{>eDT-8i+uIzR%wzzoStx%ejOn~47ewDcjb7{{jka0v z>*HGOT^9f`73k<@>SgJETqhIF+b*PLvsVIl;z*mg08*vfJ7E2PWq>hj?uaV6*bC+u zYWQBq&)3yU?Jko<*}NaXJmG4W2m1Q0a+gTCW4G1pm4MNUj+vz&Zx<3W;8rf7a{C~9 zJbM|?Qggj5?ZndHAI1KGZeDZrICDg(1i*uiKIohHY^KjfUvm2{Z-X@u2VgaaZa2nj zUCO}dHFr}igFJxMq`NOLi2|N$L-)2oCGh+fHi)TN`J8gW^6qYfdJ#r1##Go!?gRrA zKR}IMNaX=y>LVpWBc;NdmnP8lvQ+w!d}ME&nzame0m`|%{`KB1FXb;n*qe*XAd@`6 zGPvGWIH{?`VJ5r|W2(-b%32$wpl=FWFvn1p<0+nk8R%5$?h!*A#3pM$^H0hG>*xj} zZB4)u6KTxFcW00000 LNkvXXu0mjfY-X;R diff --git a/mods/pipeworks/textures/pipeworks_mese_tube_plain_6.png b/mods/pipeworks/textures/pipeworks_mese_tube_plain_6.png index 3d13ef967b063d845b1d36ca506d37ca4d8ea475..efd85a51f46171c7ff21422a2cca6194e589bc7e 100644 GIT binary patch delta 1312 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 N002ovPDHLkV1lz}regpA diff --git a/mods/pipeworks/textures/pipeworks_mese_tube_short.png b/mods/pipeworks/textures/pipeworks_mese_tube_short.png index 1851dcff0b985ec634b6f0bf291678fed3fefce4..fae64c43450fa60ae92c485fa14a65cedd4a833b 100644 GIT binary patch delta 677 zcmdnVxrudxWIZzj1H;_yjc@&#(J_d^!02=#|Nno`V%=j6x%!+R*2s_ zHMisFVWa7<{@t|^W4NaGR{eQgeEHk+|CW|7U48d-NdBDFF?BzuZ@pZ5d)lsbo3_P& zIAHWxF^pH^!8w;g_nvRQvJ=<5zhUg!ljVE-h=Jki*3S%oGg*`lXD8S*D9Q6gh0U8# xJ1NF*Pou6zpX3=*zW^k47;-xE0?tchWp(ah5w2ocJvESPn z4*Tq;tsC354+!>mi5>5IJ3Bk`pPhw7B9TZW5{X12kw_#Gi9{liNc?}0Sp&L{zH(69 zdLVVO{2HM=LbL@ws@_sZB*Q&`p948yAUUCUh-TY}HVLB#h&IXU@8RJL$=cv0V7Lts zU9bK&a2v$`dw)QrhI@fX1NR{!wQ6i1(8>ml^ZE!VvGN4XciG&#cjX#&wu{!{VgSvy z2<0In4Xk_wfcp^q9FZpYIToHpV`L4;QQg3;hvs|aYagN6Rve3A#Q~u>Bos#=YjJVf z#NBZ(u=1pu+YrfsviiNC9Q`?YCOV}tG1)>F&G&FGW`8a(pEbb4DYfP&h&CsV0Ie2Y zR=YR?slzBoYdLx2L##Z;t&cR`kH$%k6$fbjCT=~l+6^?@!K{Oo$A~ns@C41a;`iE( z=R2Rl4 zm(IgmzE~90R+k0Vo1$IKNu^pY1+wkA%8BN?3x7tzJ$ZKe!%Cu{y?-=(p`ucYt%(Xn7FI4TN{2ELZqeYF}ymm*HjilGk@8xPDz(NPj zwqFXlZx!z?G##?!U zX1hzM&1E0?1?Qa~9UoPTRz#zyU37o(@qdMcTMx~4C`W%(uPza7#U8%8;E0zi@v~?X z&G#lPZfu9Q@$eMM-kP+)5!xYGu*7W)ESk4Acc(5-fN z7>y67(RisNx{ih87%kPgU$bpYa;!YStzTW0HNe-R*!l$?;^oRXDm2>y8AqOhDQ+h* zdTRT)4N={~!jq^~qTq(Rue9q-Bq9vvM!PE8OG4>vb9K0ZA*HZ>Cx5*8H|7Zw&pMMOP4JP!{K5)ly)5D)+W01plh4h{}8 zn7(%a008?*L_t&-(;dh~cEd0f0Ki{nW@ZR8b8IJZ9Dg)3N|o+^g7$Tm0}DbZq140? zrHk)=AE@Kxt=34A2G;%4*T*~HaNZtV*<-bF_ptnYtpYP?PP(IkQp+~F;oCC>ci0J} zku4iHvf8s>2+V3zxrdQ2RQQfMZ$&Um)s0fgJ5T2-d=Od@Xu6>L-p`*44-smD=HL3> zf1K)WM0PODifn<`^xRo8BXIW8gv7915H&xYJjz@)+YSXB81=Gve6YK-cQOv0M~Ew; zQREJ{VzG5r2`vIhnNEiRw+U-2Y<9kk09}uR$+o1XRz-PZKOX@`E<)H$Fs{qQNpMB)O69=z1Xp@27Y>UmCU)FIGPE>O`8#x|KW=v)v@~Z#GPailOo>`WK`@4IzwT63;*#OvG z?O0L0RvS*e{(MbD3{P}7+DZz@U_7|G+OgTZW4qn5*=)#64u@x+o}S(iNM`rJ>h*|j z)y$+;A7d7F03!S?`vaM+@Hz@`kMaE*5r}B0D(*fE_SZLvVC&;$c>!b$OdlTi;N@k( ztPs(twNh(G710aI@$qr$fU`=t`eBt#)|R1<^4N&*2P)@6oPtvH82|tP07*qoM6N<$ Ef(#!FQ~&?~ diff --git a/mods/pipeworks/textures/pipeworks_nodebreaker_bottom_off.png b/mods/pipeworks/textures/pipeworks_nodebreaker_bottom_off.png index 0f456eb7c362949aae01022e1d932fb6858be1ab..133be48d591c2076f97b9bd1a463738dd9c5eaf8 100644 GIT binary patch delta 643 zcmV-}0(||f1d#=h8Gi!+001a04^sdD00d`2O+f$vv5yPeM@CCaNjy9| zI5;;$LqZo97k?QT7!C~$3JMBBLP0-2K5uVrS65X^N=Q#nPCY$5MMXqJL_;<?h_57D5_ z9naG!4LJu5AsS+0wQMhn1Ox5MM!t{kpFeDm1QDpsR?|ZE+0DZ{BGC?1>($C$ogVeB zAKxhB7;mZuGZ%hv&CXFXIB#hNa8A-d{`Y?q3uK;~b<% zdZ{X}F2>_~%4l$sfWfF-t_WGp%uG)u^`+y@tsIPNrevlwv)%5z dw366Z{|6i+OcyvRwUht=002ovPDHLkV1l_N)rtTB delta 542 zcmV+(0^$9U1*`;+8Gi-<001BJ|6u?C00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-pr77`LHOeFZ20000TX;fHrLvL+uWo~o;00000Lvm$d zbY)~9cWHEJAV*0}P-HG;2LJ#8kV!;AR5;63lgn}xF$_h|Rew8^*$kgTc0d*I>A*)N zgi2cv7Jf{!=xW<)UF#mHb-UflBmfG~d;^#S5>-XjIISuwlbrje`O%ERyJRy1AZP3z z9Ty?d%#2+@6zdUFhQL~A1(%hXuwqEt zVrFjJZGE)8Nq^XJU=k0lVP*qh1T}4L;1X?SZ4OJ!%xLcgfQTS7_kMR_KV}@WZDz({ zh8@QMn~5?v?A3|3JlFL2E7a1Sn*VaM#i%=r543okE!InQ(O>b>J0RDb0pT<<2Y_SjSlq+?~wcE#i94k gd7kv%sTV5#1KN&58DeyI4*&oF07*qoM6N<$f><)^K>z>% diff --git a/mods/pipeworks/textures/pipeworks_nodebreaker_bottom_on.png b/mods/pipeworks/textures/pipeworks_nodebreaker_bottom_on.png index 6c4811abc42386cb79d020c016cfe7485f566e92..b21c261b45c013168a611532b3dcb5252194eaee 100644 GIT binary patch delta 646 zcmZ3=GKF=5WIZzj1A~Sxe=v|@Nq6*hWMJ6X&;2Knm4SiLCBP@d)!yFL$H&{j!9G4d zE;csC(a}C3Anwq$~yScf!dV700J3CoenA_M`OG-$Hh=}m< z^44>4apmXdIypJo+uH>P2Zo1-dU<&S2M5{O+PJtlTU%TC`T3fenM#O@3kwSaZT9!~ z_4W1f_xE#kbrBL0;^pPFv$GWw6%_@VCoC+$&o3wd0>VH!K|y{X-~)lZ-h$hKA^h9Z z#W6(UGVj@=lbQoW7%p1BtA97E@cWM4LP82|8y5KgueZ`1%xBZnOuUi2`R$-db>^XV?FV~oiQtoZl@ zDs%kq7(5cWa=!C%<+-DGFCS5@<5>GWEo_?b%#dd{4GznOxD~CRe)pb0(0Bd%{BPF< zvRIujC(YjN^kZysN%xlv_tT-+jY8RXqqG*`}P`)-wW ds{H={7}dXd3o^ATyaNUVgQu&X%Q~loCIBZ_+R*?2 delta 535 zcmV+y0_gpe1*HU#8Gi-<001BJ|6u?C00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-pr77`N6icDr%A{pEhY^Y!OzInh2oe)9JA#=h^1Swv9nHg4NC2(O&y$>X8C|9HpU z5K&r05aC1mlfb><9$YTH9Mx^CV>Yr7Nz}}652|tj&wt6QH8xdAW)TrUk(szVnwi}e zx@3_~vc|S*1-tubBFoMO&x{dCL{L?jIqr^`4+ma@XXBfQK8FKvkFo!U2t*{Rin|Yc zr_w<%OE}L5(8oE#nZ0>DPFmZDNX!hgt}3F(H8UHwb=ImPGw8oVuFSI!X2yA*m>E^Y Ze~KAEClET+ZO| z$W$^f5-GX(^q|9*o~?d04{cxOznJ&sxo=vi^wkXe9hc_|oY~%Urm1S}zOJU#?VJ_G ztM8gkn||iju{`aXns()qHx{q=ieA3EalNx`qX7Th;vDlcZ!h~jRsG3yaMM47ZRX$4 zdF8!}?^a=K+RW3xDf+r>ddL)6p?U?iNRzs{?io539%9K}HEoOT@r%xxUcALd_s^V5 db5>;j;+I?Q;wvjZR}koX22WQ%mvv4FO#ltZ!z=&* delta 639 zcmV-_0)YMB1dRod8Gi-<001BJ|6u?C00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-pr77`W>WFalW0000TX;fHrLvL+uWo~o;00000Lvm$d zbY)~9cWHEJAV*0}P-HG;2LJ#8@kvBMR5;63lTS|+K@i1%Re#m96JSa3Q$RSdE3kPpc+E;)&>jUIb(0t1#159=dmcLub0H`qjMGuS(X}*F!}B2teu=Kt(`=h#;aw zBZ6?p>p4liRI~5|tf~Nb%{^wzj}RfLDg%QEJYq;9f{GCCga{IWh!Co{JMyf6ND1a# z=tVp$vfM{yBY%L1ppP42Z*Q0B%PB-KnNC0i5#jZlL)47f!HoU=-6Br}0dz8*AR^2T zW|$c%8EVGr>Ix?(bIv}Tva+&@ijY!5)!3Qr5WwcvCW)$dG-}AX6i8;Qt&JIv$23ht z*L9c~W=huu?p|Snni+?OuP{rDMh!o2esMfMrfo;GZGStg)3Xz<7dO>|V0(Lu`hJfN zLhkQ|J@@mHa5ai!YZ}w<#MXpo2CJv>wCI~2l~D*cd8Rfp3K3r%fg*p zZ9)XCY@{}pir}>?(-Q1e@sf6She}yh3BW5me==CfBcKk(FtX(}$xwzX=OG@IzPp16 Z{{f7k64_ao-=Y8j002ovPDHLkV1m*^8U3U z$;liW8y*}S8yg!H6&0*M3&)6>%;ARrzc z9TyiD7Znu>3JScuyt%o#)z#G<92^r96ATLrAs`?e92^l55e^Lv4Gj$y6ciE?5)lv( z7#9~76%`N<4}TOC6cZ8>7Zw&26B7>)4-gO#5)ly(4h{|u4(Bi0djJ3c1W8GT+(2O*m;ET(s=V z;PHu{?`p5WX0V7KX~A0H%ylOY^;6XGZ&~BdDpc!Sd|qm)js61WS}=xfOi! nr@eF4oF1-DWlpuGEOyF&er7$Zrq!NT00000NkvXXu0mjfQS0@* delta 645 zcmV;00($+k1d|1j8Gi-<001BJ|6u?C00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-pr77`c_6s%!j0000TX;fHrLvL+uWo~o;00000Lvm$d zbY)~9cWHEJAV*0}P-HG;2LJ#8_en%SR5;6Bld(?RKoEw%e}8t*Smunx(;RsKD$U=jZ4Ayu1W=u5WHYLK45OuCNgJadE+PI_<9~ zA;7+zoFIws(Ge0^{+R+uK`a^EqwXViHZ$P}eoz&dzY)^U)D8#t0G{8yi$r zMP1j#5ZKzw+BdV(6{oWpb@9%lHvqRgq zY;JC{ySvMu*^CeS`@|Sm(+MGzF_!L{8MFDEoymlM4-bsTV-|}AcXxM8CKG;NU-S6* zh?%XMczk?}yYunjpdVv_B&Eb+u^^>H&KWCH0{C=zhy!0wPto@FwucaUS%m|DU`AC{ z3|Cw(mwr4yKa*0T>$*Ofgn60yAW4NX6}U7|I6NHG{b?M^J-rPMKQZWS&Y@n0u&Y59d+IM fdO7#&T$=bFlGY9yH#;2M00000NkvXXu0mjfMK%?n diff --git a/mods/pipeworks/textures/pipeworks_nodebreaker_side1_off.png b/mods/pipeworks/textures/pipeworks_nodebreaker_side1_off.png index 857face15df8166fde8c2444521f3e037b546860..ec0a00f04fa768cfb13e868a31af8185c570d38b 100644 GIT binary patch delta 584 zcmV-O0=NC>1l9zQ8Gi!+001a04^sdD00d`2O+f$vv5yP4Kt3-oE;>3oMn*(6H8n0SEm2WWMn*+DJ2^*3MLs?}A|WAB zQBNTsA5TwB7#J886%`j16&o5F78VvB92_1V9vK-K3knJg3x5j@3=B_CPBb(#LP9}1 zJ32f(IyyQz5fKqhO-xEkNH;e&A|N13OG+FZ95^^PIXO5(LqbkYO-DyY9vvM^OG!>n zOb!hVARiwJ3JO0zK0rV}Jv}@`L_;$(GDSs0K0ZA~MMOM2I~*Gu85kH76B7&z3pO@2 z5)u*(4Gk9;7k@Q1G$9}$9UL4G5D*X#4;K~|5)ly;6ciB<5EK&=6%-U07Z(!}5)Tg# z4h{|$6%`K-4*vnw%>V!Z@JU2LR2b70&QoFpQ4|2t8{2lqHd`}oyZdqf3rXg;eon!q z;#U=a6vc#a`unqn(~Du(wuhWj%3bSw4b?M2lI~){<9|FSOUr`h(Yd_2EpVD*9C6nL z;h<8vLWal60_U76aM<2E4rjB$7b?x1a35;>5cKYY)u)b1+|s(>utCrZ9)neAl*P5! zgjRv{Fx113x5P;|;t1+uCqapa5KB3aZft0rsGTy)7%QSBCDe!QcsgHXB}6HqKm>6|L=chxx-c^Yh+Wsw z_gw>UL|8^xcYibkxLE~Oy>!s`J$>H;HTmh=6Dg%Sr`ZDJ?sbd?czykrs4AqCxVqX9 zW90LvFLYf8fVopj!OiM@A)}6_szebb1SO@8$FGm17(t|}(Sod$npg^`f;+q2d!}hZ zw%e`85a{}z6ywq&?h8;Ug`6`vXWX6r-JWqA8OM?6?thpWd77XxKFcT~NMqd0C}vd! zw@b|N_~0oeHk&v6`2LKvs zAt63KJW)|kAs-(`MnxDH7#0>5IyyKT8X6uR9v&PV85tQ13V#X>3=9hk3p6w{LP9}2 zJUSvEAUZlZ5fKqHGcrX*LmV6&H#aslH8e|0N;o(-LqkG5JUd56MjjmOG!>n zOixcuARiwN4Gjtk3O_$SPft!gJv=}_KRY`*L_|YMN=QXTL>wC%PEJi37#I^16ATLr zO-)QbK0P)zHGd%>ARQbW7Zw&57Z(&16b%gx5)u*+5D*X#4;2&?5)ly*5D*v_7Zei{ z6A}^+4-Xa<6%P&$4h{~Nznn(^008t!L_t&-(-n?Ya>GCr1Yek$IWaS%43fpnS}ooG z9I=0=y1EChYpp`9HC)GpF#h{DhqIeb)3Q46oO2fFKYw#5oD0k4qe)ntWn`x7P&vL3 z>-Q2)Q;Z`P1RxwN7Poh*N0S_9jB_|L_D?PcgT^;Xv~25z;@%;YAMEL;j1pXpnh?^4 zUACX?siP)&zN$bqN3!F{&ew+y>ncTn{0dG8V-alukF2;ro>4(TtOA#q9P+ zV$ZHk9$=RYjEgDPhnnisGg}QoOhA*WF;Pm!+QB geepF7hY=6{0op!5z2Y7L6aWAK07*qoM6N<$f`IzI!vFvP delta 596 zcmV-a0;~Pt1mXmc8Gi-<001BJ|6u?C00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-pr77`B$_)I{<0000TX;fHrLvL+uWo~o;00000Lvm$d zbY)~9cWHEJAV*0}P-HG;2LJ#8#z{m$R5;5`lRh@ct>;S5k?9rqfzF6rkE?L4NGs87VqYM|8cx3@nCAR@3U-0pc(WjN{M% z91&1eLI}hVI)9@Tz|BAeQ9Uyl$B}Uy0eb&0zg~zb;bxt-yVo`@0HdmqQsU-jBF0Dv zk>{V!q?9msN-4NmeRnYgX{|&NB?KjNNeNv?iQ_J&gqo-{G8eDwv;B?TG=j~=dH52^YQTy ztuCy#t%ia9{%fzkwj^!DdhsoQRx4{CVF&?L;pwoi$?gAYE)4+{sZ5}X*mQ4-8{mj2 zqFSfYTuldHjlPJ0J8EW>VjPc0=6PnGXO72(oKNg_+n%r%;No%t#AR9f6?QkEQcfum iLREg9eZNQ-*8UHL?KS2-`WP+%00004Kt3-oE;>3oMn*&~E-f`RHBnJeA|WA1M@2q9JW)|kMn*+D zJ2@dAA5TwB6%`d16%`g178n>985tQK9v&VX92*)M3knJg3x5j@3=BIvIzmE0JUlv2 zPfj#6GfhoQN=ir~ARszAIS~;NOG`=|92__}H#avnPEJi89UVtUMngkFIXO5^PE1Qn zNgy8|4h;2K9UL4G4-XI!5Em8}6ciK^5fKp(5EK&=6%-U07Z(!}5)Tg# z78Ml^4h|0v4g}CNi~s-t^GQTOR2b70&P9TQKokJcKkn{6ad!nG1cF;b(|Z4d%w$`e zS1|wi6_T+i9tG=4u)cu#x8+G8gzVUMw{v+4mNjEp7Jo?=-D;Y0RsqkGF{Nor@y$v- zKWe~Q$c*BgyC%6Rmk$&OB+Irrd2jdo;qhMe5W1Tt&57|b^{?wb>=&V--{ag2r~ac~ z_uJfok-kcuQ0tAAIS&TVHD6cI~N;@TrGMw-njVFWQ z0))sMN<_JvJU`v_T1y2aOA+V9e0v%9s;$*x7ydtA-DEOYs%miqo`@Z~-6AwxY)V?e Z{sTf`Ka5PmeboQ}002ovPDHLkV1kWJxkdm0 delta 592 zcmV-W0v39$iOTr{%h5#ghWqx`2iD{ZBr637Olu{VS zkqCf0-u{ws_qq+p9dG*~grxuoX+mdx?*L|o%&^woTOtwyu0LPV>SAV$cITE9LLkOSOo@~d&riQOJNrQ2_iVR2Hk%D8 zCCuItN9!0uAjC*&1-h=|;pYSA=X?5o*OFBWTwPybX7yWjPbm>Y_`i;k`|m$UsUrkK zGITuNdDnGxUB~0EM807n8_ z%V*68YdP2FcgNesDI1Xpc$~#l50&=Wui2bQ%`s0ZLOU&Vj|fGTk&^bMW?dVjRat etRva-oc{q}we}OF%CkKH0000CIyyQ=MnqClQ7<7Dh%z7#J8C85tfP9v&PV8yXr53V#X>3=9hk3qnFcJUluy zG&3R~ARHVVIyyN;MMDu05i>I~JUlx!H8e|0N;o(-9vvM+Lqaz778Vo~6b%gx5)u*+4-XI!5ET>@5)ly*5D*v_7Zei{ z6A}^+4-Xa<6%P&$4h{~LQULb=008z$L_t&-(-n^8c7s3|1;4txYudQG3y_fD4!f+q z|8tc7y=TtMh1u_q;FN}oQL|ob)~{if(|j(3cxhW!uYY}W1)4Uc2!)*LkFq>JFM{v$ zh>#>9(nEE5aa;i*I3j7xobCPXYIQJ&%!qa|{wQ}kXD9o{5%i)OiSg!hV&0YDa4!#) zb(+RodtyGBC9})|7_EaOaKFFojcspmS_3PLI8PYHj*Bm)^&+cKF^y8jJkOAn(*kf# z!w{t|i%pH;px@Oq0tJLH#~qKK)s`{`P7{wYynSB{Rijna|A*}7tD_G3%5s@+fG?te i>~`K;S8o*Lh4lwzjzGN@Xen<10000x9Fa3at=DUpgh|K@0Z0G{c>MfG@10sJy>}!biQYS< z6fywrczh+{?(;F=-tjn3DJ=jXq>8qijRTk&GQ;9_cb|bIo}Rt{PT*o@lv24~FJzg` z!)9Hkb}XLU#(WW|9xM2&N-8FURWo{R47ww<$AeLTO$v$x_|o;XuZ#xFH(9)H?Id5?oMv4 z@%HBpBs>TrBy2;G8;=~n9XX#*e0-cJrQE164CIcbL{4duv`3YP!=BbErBq6}Qfnm# z_p?EyrPo_f0sF(A`S5oZEb5_UR+2>M>;w=VPRlc zSXORsZE0y|K|w%KQBPc4Sw==gV`E`aQBW=}EiW%FIyyQvHGef!R8luLHXa-tY;0;( zRa9hTV;~+VGK0Z7h92^)J7*$nMIXO5P85tZK8x|H85fKp$3=9hk z3kwPgX=!LsP)=@cY*SNFG&D0#PEAfuOgua~J3Bf{OG-yaMl&-qOG`;bMMFbFLNzrs zI5;;vJUbT`7k?QT7!C~$3JMBuZ*4z6K0-o4S65X^N=QXTL{CpnJv}@`L_;<iy;9`u0g>I4*%%%o@7UU+L~1-`qcsYfvo@3?s3#)=l2_WwZVc zs`YB6E_)95y4R0ylyMAdv(>baeRcQrfe04?XkRw+ef041X?r9P3^asjh>6v*J)edV zP!G|d%^lCvC=EFW$5)*|a1!MZGgkm6BxDRb{x{>iJ^2B_n26?tU@qLr-!HhFM<4>s cLNyN8Is8CNDxsdB><3;OtJ4fkH>?3-;qSrT4}9O ziUUSw(z^jhYmL?#5ry89ecy2(eP&K(C)^!(r?pQ29LIsXQ){qo8<)#x+?{=YaKHZ{ zvy+)*c0h!b0Dq?i5R&uqvT?m$*|rM+_xtF}6q$*nVPVJ_XV@r6P-_qo)EY>ll$a#U zOeVmx01Fx1N7n)d!`+DZ2;%M|#E62~0CBeugOd+4$K5EUOu%6|-rjyw+%b2Q$+z!c z$3qk%%JiLQct3yq;^-YD%pJSkZYrhVW~2nuo4eC$#eYj7HTK_+gX1{py(7TQh!uta zWs;e!>Y3wSLNoc5&6-)?jFjko$Q0n2m<_L*Z<5~gnP9Ob+l+R6V!Z07*qoM6N<$g1L$8X8-^I diff --git a/mods/pipeworks/textures/pipeworks_nodebreaker_top_on.png b/mods/pipeworks/textures/pipeworks_nodebreaker_top_on.png index 4b0a66161c1a9141627f4155e45ccb7d292064a7..8fca4713db94b94ea5a1eec8380ba4c394a9531b 100644 GIT binary patch delta 645 zcmV;00($+f1d|1j8Gi!+001a04^sdD00d`2O+f$vv5yPd zV_{KIP*G7&NJvLIIypf>Kvh*#WMpGTMno?!E;ThZIyyQoE`Kc>8X7k@HezC6M@K~+ z92^%G791NJTU%LGRZ~7bJQo)iNJvH&78W@cMMFbFLPkbKGcz(ZH8eOlH#|H$ z85kH86ci2(4Sxy>3U6<1S65Y2Q&B%ZK0-o4N=ismQ&LV&O+7t4L_|Y7J32NtH5eBc z6B82*3ky$AO-)TqPft!oMMM%35)BOvK0ZAb6%`c}6ciH^5DyO!5D*a%5E2m)6A}^+ z4-XFx4h{|uW&|aN0002`Nkl6rM`UTf+K}FQYWnp7A zncUaK$!!5T#`q|!F+1t)^~2gkZh~FRs+!6y4>u3a?qB5=)XTc6rq;HG>2pS~+n>-F zk65;}w|+9r-MzfqUlR1*x~0)5lh5U!b%RhJrXPyqdCtwllj0(uVwgHk6b9(AtGHei z#t^wq zvy+)*c0h!b0DngW5R&uqvU5J4+4mCwm&=&T6q$*n5nI0!}^59CxFXG6_fIC}pfFA^;uA5rv2{ zbLT^OtFy6*cz^#xDFrv<*YBT5ApI|^_fBh#>-Ea*)_>?d`S|;R05`*4UthHdo)w&J z+i-UzalhZ`z0>=2A`PdrQc^lD1$ZWAb`bR5(FB>BIFr&DS9#*z_ zYzl|gPLB%VVcEyNSF|;MM99nou!s(u^L=NcLt{E@)ngX9|tuQ~QiR1tP0000q->H@&DM)ICe~szzsc*fPjWe&CBut6i9%Opr@dwq5ugyj;}LwilbPE zy~8H^NS3y>*RM-#`Lgt_H6w!%LI@#*5JCtcgb+fAzlR#?!k3qq&N+wg`xs;R`1l}6 z5+;)g0A1HHola@n7T@<#O5u4P)>^u*BMd{Fb13!iBVJrw4DzhrPz5l?kfv$>Vo8z^ z$1y<=pp+ttBD$`__kEhCL2C`r7sOhNF@~ZjaLx^ufMBp_DMglL?ChbaM+qYT`!XXndSOF%J3C=l^Bw2rB@B3SqWl7g{AqJP+UZ$2SCxF+@?sY&QGyoU^kt zwQhL+_Zr5SjfdtRm4MgRSMofkC<*}X?(Q}k<%frd>iYWH0aR5*UDs<@l0QBHv)SxZ z#DCQaKZ@fRfcbn*k|g6yz-lA2dhyfKQ}yuhuu%$*j*b*SUDqh31}(r~37F64bY1sp z75JSLtXjYr!|v|x_zIBcIlk|+v$NCx_tld4tCb`O0`fc`Zwr)V+5bK{Ir*(EUE8)8 zW5&4*uJ-Vr=W%s)<@WaW&{|`RVYyrqMG?+9!Z4(&Dy+4XWl0>zXsxNL3g;YkUH9J# zMpXcS?d@%zo}T(|13?fFMG$+T^TK;&~oQDHe-Gp9ZZpP16k80zwEOgb+dqA%qY@2qFF^{{U3ITox;z R-0J`U002ovPDHLkV1mj9kgfm# literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/pipeworks_one_way_tube_output.png b/mods/pipeworks/textures/pipeworks_one_way_tube_output.png new file mode 100644 index 0000000000000000000000000000000000000000..7dc5910a3e2bedecdee09bad59aa7811dc6fee6b GIT binary patch literal 839 zcmV-N1GxN&P)q->H@&DM)ICe~szzsc*fPjWe&CBut6i9%Opr@dwq5ugyj;}LwilbPE zy~8H^NS3y>*RM-#`Lgt_H6w!%LI@#*5JCtcgb+fAzlR#?!k3qq&N+wg`xs;R`1l}6 z5+;)g0A1HHola@n7T@<#O5u4P)>^u*BMd{Fb13!iBVJrw4DzhrPz5l?kfv$>Vo8z^ z$1y<=pp+ttBD$`__kEhCL2C`r7sOhNF@~ZjaLx^ufMBp_DMglL?ChbaM+qYT`!XXndSOF%J3C=l^Bw2rB@B3SqWl7g{AqJP+UZ$2SCxF+@?sY&QGyoU^kt zwQhL+_Zr5SjfdtRm4MgRSMofkC<*}X?(Q}k<%frd>iYWH0aR5*UDs<@l0QBHv)SxZ z#DCQaKZ@fRfcbn*k|g6yz-lA2dhyfKQ}yuhuu%$*j*b*SUDqh31}(r~37F64bY1sp z75JSLtXjYr!|v|x_zIBcIlk|+v$NCx_tld4tCb`O0`fc`Zwr)V+5bK{Ir*(EUE8)8 zW5&4*uJ-Vr=W%s)<@WaW&{|`RVYyrqMG?+9!Z4(&Dy+4XWl0>zXsxNL3g;YkUH9J# zMpXcS?d@%zo}T(|13?fFMG$+T^TK;&~oQDHe-Gp9ZZpP16k80zwEOgb+dqA%qY@2qFF^{{U3ITox;z R-0J`U002ovPDHLkV1i^PkTn1R literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/pipeworks_one_way_tube_side.png b/mods/pipeworks/textures/pipeworks_one_way_tube_side.png new file mode 100644 index 0000000000000000000000000000000000000000..044e4f4453257346591fa7b3f5dd8637373bf5b9 GIT binary patch literal 1665 zcmV-{27dX8P)1L)XElze^oA*=k&mk6|7))7f*l~5`qwW7WWTDf@BvYW`RINLSlukgkS|i zO}f+Vv0Sctizk=5lWvpFTi*J1F5Bf(XZ8Us7K_DVu~;k?i^XEGSS%Kc#q#fgJbwIG zbIzfZ0;LpLmLUv7WLXBSH8wUjAcR0!mSBv5QVK!{JkLW}mT(*gRaGGf0yIqn$8k{C zH5|u5S(X?K2AEE#pp>F%8UO(29G>T)sw(qc$8k^;1zgufQ4~0T{yg$Lhm;bI<3K3| ztu?gP;GCQNT-SwC${c7mn<0*4^K8>J&{~5r1|bBZC_kzK=9b!5Bjv#{ht;s*ofJlu{ssplKRJQG}*x%)UVofKqA%Q%afV9mj#= zH~@f+jST>R>$(_?M#!=Z=gyr2r4&+1XstmA0U-pGQUE}fWyrD&)9DnG$pjZKUNmyG zhR|A@_s8QgwAM(H1YsD0eEIT4S5;-S2>@kTB8nnNDN$7wE?l^Pq9~xX#^K>1;y4Cl z3{pxk#&C3Wgd|BoDMe8fV2t7W_wNuw;Of<@AcVm8eF!0t=ebdc@B65#3WN|8MS(C3 z;W!S25cu)q2R1i1@$K6;5JGVI@?|tl140N~*EN>aTBFzNp)5;CDIuja$^ih+^U&+{ z@bl+S5JJEhLtWQUNC|O&y-BY*y zU%!5x92^|zr3yG}7%;{bTuf^X&+|-<=(7C$`m0y3{uiHfrLzmI&*lJCRe>$Lu{1lL zf}1yQl6eKpW;0{GJkL+>mUCIWX&O_OSJCVB&Lr>F))t|w;_9r~wWTNuc%BE}_c8AG z^?&~U8~^O@qs#K``rW&CN!y1cNrKJI&CYM#zI~fKfBsybIS0IW@#4hGU9Q)x=x>gLe*}bblVT>&Z+j_!ri?_Mq_y4D(w<1A$KuIjNY4-JPy0638Yx(>98Rh7+1w=56* zsquOF@}=(5xDaBg3or8o&iRS;qA1J{+5gMV&JOwb@uOa;fEzb%tlj=~^$YF4_-PuM zHVl^~FCoNI<7{tluPyJgxN;7(P)GyioiKHgO0CX zzoM!tT)A?^$fLD3-W3FaDV0)6(>Mh|fOgPRRTUUx@H`JkM@OcT3rfI+!Gs6}sCGtE+nx@9mqtVEW*Rm`Fr4+8~n#qt5!W^(HOL(4#G)*xc zkKy}1q?E=`?PzQ|okA&Pyuo6zSS%Kc#bU8oEEbE!VzF2({}%oWtJ<6xNzErd00000 LNkvXXu0mjfGPDf@ literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/pipeworks_one_way_tube_top.png b/mods/pipeworks/textures/pipeworks_one_way_tube_top.png new file mode 100644 index 0000000000000000000000000000000000000000..bb54e45f25da7bd06905aa1647a6db0a76a3c64d GIT binary patch literal 1704 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 Uz9;g9B>(^b07*qoM6N<$f&lr8GXMYp diff --git a/mods/pipeworks/textures/pipeworks_pipe_end_empty.png b/mods/pipeworks/textures/pipeworks_pipe_end_empty.png index d09697bad03fdb930a7936ce8780569ed7a36e45..0e647bed5b30bc40091e85ccc401afdb5503cb57 100644 GIT binary patch delta 358 zcmV-s0h#{G0`>xs8Gi!+001a04^sdD00d`2O+f$vv5yP3Tgi;5N&78@HID=RAi005Pim6es0rlqEzpP!zco{Nf#m6Vj(+S-eYi;9YhgM)*Q zkB|KP{HCU*xVX6g|NqI!$@}~Jii?Yfhlh)cij|a=+S=OL*?-yd^Yg#Iznz_(>+9>T zuCC(Z;=sVbhK7c(udj@ZjL68y(b3VKo}QJJmAALIrlzKEk3ekz005CmL_t&-(^byb z5`r)k1kkm2r6{0SFp&_-CIA0-hFlSSJhL;qi};wy{9Y$2(&L880_^J9zD#Ei)`!79 z;V-{ZgWg-~%U?|x^!d_yFN_9z6Q-%Z5+~gvad|nN7bMoYRZy-kSj@u4SXYQ#e;SnR z8rtpc=;H@?-|n$<@Sm>VS;BfU z{!if|c^P}guNdRDZK`T!_f=KRR8>{I_i&}tIc}_=5fL(1;D5I?0Eh_Ww|}%j#4$5G zPNJr^Ya#P610tpw5_i;B-}m!8mvjhWT~}sqn&yYj9Zm@X)OCH;PW2S)H*a<+ z!P`G@-45+GuQYUy)q4-S_N~|B5{m7}v7INHh#-U&5k-XdZT>|Ad;p;8mSuA#X4(J% N002ovPDHLkV1j9kg604K diff --git a/mods/pipeworks/textures/pipeworks_pipe_end_loaded.png b/mods/pipeworks/textures/pipeworks_pipe_end_loaded.png index 49514846af4ddae9038f67c818ada35c9bdbf4e2..0a5bece8f525401b284a645a0f58872520dae3e2 100644 GIT binary patch literal 427 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU!KmfKQ0) z+<9}`+dGyoTh`UxHD$__>C>k#Te@uO)G6)l?bD`Cn>Tk}cURZcDN}CVy4BqcWOhxM zFk#M|IWuO=`19w_vSmwm?AY=D|NoOGPyYV>y9=nI8>o2dty{Nl-n{ww^XL8h_s^X> z_x0=7>(;G%^ytxn0|$C~dfM9B)~{cG@#4i3Cr-?pH*f0HsoS@2U$$%+&_&9gw|@dD z{gNQRV4$%i0EVcg7T<=I6Wz|2O_UXWAp495?;L i|Gzaybp&Qu{ANh*Qd)I>Zf^?EWelFKelF{r5}E)Hz~{yQ delta 331 zcmV-R0kr}kPrKqbnXBE002ovPDHLkV1oFZjuZd@ diff --git a/mods/pipeworks/textures/pipeworks_pipe_inv.png b/mods/pipeworks/textures/pipeworks_pipe_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..567b77137e933faf4cf20d31139ba42430f5d007 GIT binary patch literal 1610 zcmV-Q2DSN#P)czOIieMVj)~cIURVx*vgGspD7jaRPxLu;+kS~D{+IOEgG!}BBoe_ejMg=VVX$l0 z_r;17aPHiQ9viz&D%DL#hfOpZ#q&JM@hDWyaR!Ja)oT-GAwqKyd%c6bc1Gp)gu& zCMPFx90$j7s8*|-IrA6&@yCB%mLe8?2x_gdZJT1TfN2^8gF%#1%+1YVnkJP>g^rF6 z%H=Wufj|JQ=QHPn4^C?-CC@!~K(y@{0Pz0%f70pn7}2OrJRV1Dg>A>l=kH-z7WI0a zKp+4>u~@{mZJIrU5CSPBhG8%~d{DHd0DyPj{e!-D?;fF02-~(%N)ZZ$@H~%dwTfj~ zRI62@(I}4NP_NgC#bRi!@5`naUN|J$QouJkb?SH8^E^Dy!?tbm`FtyQ+qMxxkk9Ao z?d?Tt-71@|s{qZRLq8R5Edb!eiQj0Y6iO+g(I~ZA4cB$)>gr-@D$mA^n<$maOikt4 zv}qHrtB_KlwMHogz`=t*5p64=$+2T^Y0py_hDj=w;`Z%Z^!E=iJ3Gs&Rb7NaVJ0Rf zNG6j+qmfo8*~}mz1kXOZ|AB~*|BHtnKKzpKJdNWxoH%iu{{DXM+?k-!XrMKWkB_r? z^JWagAf3(-4u_G_AQTE=Sr)-ykaOooblYY?lcPs}sYgd|QYg&u|IRLWcBLR3$KDe2#x2>fA;NrT(qTtCQm)JU+>(x3n>i-2L~A) zy-6(ANl#A?xm=c^p@%7zO5}1m1_lNYLbO`yX8H6ykG*^Mh_(~}@aCJp(uQH+d5VF7 z^%#ahCX->ymMvtnS-QKsiO1t)vsql%rN6%)*L7Png;EO7^LXsB9|(X?KmEJbTCsEI z(uS@Fdg2~C_Lepb11TkzWwBwy2EP3AIz2tBiN#_}PfxRc{d$yAq|<5EtXYF)S*-@D z`E8nJYv2k50))dM9(w3|V%ZC5^7h*&wP~8TuFK%yAmwtId_K?Cty{@tGNe)|5{U%4 zT#jnB%EpZw5JI*p#Qabu2m}ILzI++ibxEbVdFGkLSC0Q%7k2XGDQy@Mts#*}(AU?; zwQJYt>sw1C5~WxyvTofvgb>`ibqgsay}iAJ!(o(CxUS2^ix*K!(P%WN*X!)wy_+YV z_>pJ}0rTDCZ?%*LhGC$TVrXcHyLazWDwWu_Z5v}_W2{=0q^m1VFc@TF;toOx=H}+O zdi5%xTW146Fc{*MS6*%(0Zra{=l8mq+P%HK*tX4$8#n0d>%+1v3WWl(Sd3sWh?J5` zmoDKr4xZ}xAGv9O(z ztr2_Kw8Beac=(`@Qev7WrfCuig~(+7MKBnoSS;RG1?Ge2zQ(C-s=$Ba^yxoq&(ow* z-3TE_r_)SMPJUyb;4Pd3nj=RJixnjR;G>Vu>Soh3Iy%}KnHR!ea`4}3C-^`&wok literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/pipeworks_plain.png b/mods/pipeworks/textures/pipeworks_plain.png index 736e5a02022370d8acdc04e13e9da75ebd0b0447..48af08f5dffc23826b4fcf0d22da914481ce9d06 100644 GIT binary patch delta 314 zcmV-A0mc530?GoA8Gi!+001a04^sdD00d`2O+f$vv5yP3Tgi;AYDrj?YG+1lEbm6VE#i;Ihkii(Q-{QRb-rMS4b|NsAsii)0{p2^9{`}_Nf zi;I<%m5Ymt+S=Ol^Yhu+*}uQP>+9>TuCC(Z;+>tHz`($so`0UNudmV3(a6ZijEszi zhK9Gdx2C41m6etLv#BTm004bSL_t&-(^byd62c%5MA25`l9M-CpUFp z>$)z>5)rl5{2LLqMnpuk)^OF^+IQ+fn;C{X@KghEcZ`1z*?Mp>?u;L;mQ4&e~^mv*Z@Zw}oCwaO21s-(lls60%q% zEl~y(O7(Pc46!(UchW{d2SpBN`EPFy{}cUf(6ImOkM@l0C{K>g4`z32cm2L|*29%0 zAe2Fg$#`;@f^c|<(j`IbiHuXe8HG%pbMk%5IoC3MqigKOlRGT(GHyGGrr1T6Nnex7 g-?ZzO2mb@+;#p4V39q!xfi^ODy85}Sb4q9e0HzE-=>Px# diff --git a/mods/pipeworks/textures/pipeworks_pump_bottom.png b/mods/pipeworks/textures/pipeworks_pump_bottom.png index 5237f0e102e88bcf76dcd6f7a778c394e73cd194..615965bab2481b57598fb0b1ead8bd7690a746e9 100644 GIT binary patch literal 4498 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 literal 6739 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 F{0|M-03iSX diff --git a/mods/pipeworks/textures/pipeworks_pump_on.png b/mods/pipeworks/textures/pipeworks_pump_on.png index 0e2ed7c37094879310dd8417f3a0d4a0c6f307d8..5cdca6b82abccb1261ce7b3048f943251d458858 100644 GIT binary patch literal 3867 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 XLJ13s`DAnWu?Lvn0hw0ac8&fo1*jn; literal 5848 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 i_>-R@!T`i^%)bBvO9|fJg*XWS0000D^ diff --git a/mods/pipeworks/textures/pipeworks_pump_sides.png b/mods/pipeworks/textures/pipeworks_pump_sides.png index d479e533b57dd8d888940b54675e34941e158265..11b6c64db428807f4caf3472ca23e43bdb607214 100644 GIT binary patch literal 3742 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 IEf@0t02s!rlmGw# diff --git a/mods/pipeworks/textures/pipeworks_pump_top.png b/mods/pipeworks/textures/pipeworks_pump_top.png index 11b5c3fa3e0d124f351328909967bc8c033a5a97..0271e8f38ab56b74dc383d1f88736ac2c7f7aeea 100644 GIT binary patch literal 4504 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 literal 7531 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 f?OAY8#VJFSW}GOE>xwz}q7E diff --git a/mods/pipeworks/textures/pipeworks_red.png b/mods/pipeworks/textures/pipeworks_red.png index 1275e5df68d1844cd621cf488b5c39e499654503..05ccc05d31c532180a46ef689740ca0920db9421 100644 GIT binary patch delta 82 zcmZ3$m@+}ahmo0qfkD+aR|!b5q&xaLGB9lH=l+w(3gj~f_=LDVwG&iU6OjXQc|2Vl fLpZJ{Cn)d&c?JxO$5*xX0a*;5u6{1-oD!M<#F-Ld delta 143 zcmYdUz&Jsoo`Z>jfnmbL3^O3bS>O>_%)r1c48n{Iv*t(u1=&kHeO=k_G71Q@Ta@X& z-~$RtmbgZgIOpf)rskC}I2WZRmZYXAlxLP?D7bt2281{Ai31f$dAc};Xq->3$x=Vz nz?G1sAlQ>7an+#2gn{AVOU97<2Y3`gRx)_H`njxgN@xNAs1+sM diff --git a/mods/pipeworks/textures/pipeworks_sand_tube_end.png b/mods/pipeworks/textures/pipeworks_sand_tube_end.png index a7816a43fefb9bd595c0f4e2678689713cf4bcaa..3c4db022e79b5f3a66f59a0c7d3e024543d85656 100644 GIT binary patch delta 1192 zcmV;Z1Xufk6tM}A8Gi!+005o0f$RVP00d`2O+f$vv5yPDs*M*}CxN(dyj4=G3w0 z*S723!sOAb?&8bn*tzZC#_Zn1-p85j-^Jg_oaNH2>)pWW+kd^_%AeuPqVMC(;?1Mr z%AM`u$l=SN;?AYx&!_+Z0Flw&&j0`bDs)m#Q~&?}|NsC0|NsC0|NsC0|NsC0|NsC0 z|NsC0|NsC0|NsC0|NsC0|Nj6osPJ3>00XE=L_t(o!R~F07et8iy%j00kmWun?7owEen7?7J&OADAbh~1#Fg`nEu>G-||cVT`arX z!w_F03&1+Dem#$a>{tMYt4ZGPIq)>lP(S@Q`_MB10DpZ1n4QoWedHyQ4w-mb1=1t0 zm~$J9?;qnHSP3{NFi!>vmhx*z`Bl{kRht%UPl zQ*FlP`=Y$IkyO`Bvx@-3TCeGau;1i?ikx^%$uj%tnn_1eeS*+GeK4+l6LiZG;W1WU z=Qfe?n%1QeP5s)W@>7wLQdS-ZB{%WAysU-jjE}ZR5Nfmk!3Phr%+6^7#r7^YP86up z0Dr{Gvf?#>5@LMn;K#vC1IGD-=^!XMbt@ z@GgeDlDh7VKO1lS-Ms(nz3Hn^@_AN*{C||nS?BQjxj#4?Si(uX?OUfiB18gNY9fG6 z2iB2r#1FCujfX&5Y6qG6aOA8C%!TblTmir-(8}&w?Z|@d0yenrU;zUoSqMW<8^YT-fu5EP1F?vaImH)1Vwus>)ktcXlSFs((W9 zrZj{NfG3_4<-S^RR6mXT%xT@NXXT)Wu)GWJz1@?-HB5j5 zHOG|~?_=Y59~_8gX}Pfr5Yvfm9h=01CL4>)L`sM4vF{|W7O)tTcK*)%YLn2X{o~?z zgrZmNeO5t8rU|P#aaO@-o(b-=N+AW@VzSTg#;6AT0`Nap6lq|ofzEXR0000(O$=gu;P=j4yh?eY4*)u9Ar5xHMWv)E zP@6f@=I7t~fL88(X1)3h7!%McEN2;vJ6le~tlax-EIG$zwb0xz8~|982pJlFi;VPo zgj8!SDWSyR)uu|w0bIfw4I=IsfAwE~w)up4m?zG@{RtVPK#U{YTP+^|)@TT?)}!Nf z)aqLfpWprcA#fNIFe)l12XI+M9PGiUpzBSu0TI(r?iw&I3Im|9m5mButp+i-g^dcpgg^5CIVg*@3Zdgxp&U>g32Fr*8rlmC1F=Xm1ORCH z=FhG0YOq$jn-P;vhD!eg!sfbDWIAdk4@Jx|G%*gNBM@;H@?2D4txcOEjkxmy!k=&k ziM1L`_^>+eSQ@k#K9i8tb!O%_HIqui5d`b$m%3i z)O34f+=KK_fO)kk5aW>k1dLVyF{p4COn6{ixV~Og8qjeEO!(klJz@FO*Rw_^=7rS| zl?J%1!di{WiTNZ7h#>q4XL2S4S$7X_bmW>QqoM>fn>ax#YB~Unj*`s_-vJ)AUqFS; zbgwNC5g7Nn#1jK?iLkZqG>ND*T#C`|%3T|_Hl1Sgs;8h;2y0^J>lqb5MQw0damd3O zaIX#>wV+j)JV2Mw*;~B}CVVtz-b^;jxO+ISdJ0izJ9%4aL~&Vn8_eDo0JJujVN`%q zuU>)*b`zIa1pt`y4UAC`UJYSuGijotmUEGa=#VEtL@-9>SC`F4U;Ix@_;3FHTl?_K zU)Z(#*X-KA|6&iW-+iBr2RAGLtS^7={%z~YZM*T{hJEzaFYV*ozwW!IVaDp%Rp2Nd zd|s=&pJx-8JAZ{%|M@2i0MqB*rS87~F!QY+5&+CDT&4tw>vrx_ z2Ko>HvkRAL<=!8U9R*DIJq$ko)(5ol;D+6Ne5>!;n~!hV&BwRw?85uxKotJKmio-a ztGSKTVAZ)dSO;|L_fgALo)pd^YU{~ux54Sx-|720r(b`EG9K7|cE@sAO>DIx{Qyr% zZS)cy4gp|HxM1V+p zdC$Goajw~g%VbQVOGZgaV^rVI@|>uQ2gD#}wtvV)xnb4A0oH=c`mv;}j#{urL+R$& zeZ(-1%DjmqHAAm_=i@^;fA9)+pCJx*prUpU366SgKKjB+e*#7Y$37jNJAZ}xxzcRh z+;Mfjvo*NOsx(sMjU&NvuIY2{l2##vf3hdyx<%DkIp2p!**NX$*qs(}5R=Hx|3-;~ zOed_}zh+&3&?U|?k6_#@JFPwh!0f{Nw7z_OY*dGx*h+uG9d69L@g8N(#~>lJzWlk( zoa4F0CCaSzN`1PAo5mGBg%~2)@m1dx33gyq0O=<)02>c)+L<@rqd`JwcHuJ3EiO^k z8$|6FVBAC8rQ8xAgCp@)w(cPSjyi)gY|JH_?^$2IZnG%J(xCfTJR{WYXLoESm^L2V z*jIuFSp29bMJh+D(AxcLmKaa+H4Qmf1ApRG#O=-A{4*NFB^VQlG11vhRAXvp7#+DI zvDW4?U=8Zi3*cTIot^#2% z#yvD<&co;^F-eVr3U=YureKV6?s44NNz#QFgjYwf_dMxIn1G6!;Ii&GC27H{pr>~} zwK{6K{+J0b)!vDS$pB!&hwvKiL5T5vM~2Bn_NoYgNi{$fvO0;**5h=}M}U}2Pm7du zg)*`8*acHz6LGKuB7#?&N*xsefH`kJs}#ZB3cT7BWOWjva?&B%C6NFyFeYG)M!2^M zQE8ykm~{`GS!UM638Pz+f|InpD%=IEfsR{XT)4NT!e;6eS%6s2+(6vffz@#eUJEK} zyKXdNe=e(u^CYXugX zCcIF#2oPSwm9;#b-)~srpw37v?-EXm8Wli=ySXVas_PVY5@S`2X?eXADL`BT`nWve zrGpkb<%<9vcamA(K7*2Ti%YrgbGLnFb$n>ZqBIe}Wfdkp78?iuOsS<-PAZBzZr3l_LOMW zHxxY^PoWAf8^*bENs}dPEXcdCXdajZ2 z(gUEvX8O~)$cdV~>&(TgeNT0`sKA=IP$5*D6s|OSh9(9vdB0PgEP_hcjy5x|6hEKktrC~=OdI1czP XCO#F1qFSBM00000NkvXXu0mjfCK0z4 diff --git a/mods/pipeworks/textures/pipeworks_sand_tube_inv.png b/mods/pipeworks/textures/pipeworks_sand_tube_inv.png index d3a4b6a65dc2997e88266148cc317a81839b467b..e1c46b9dd49fc1da0d10fc046c813d2152c15ed0 100644 GIT binary patch delta 680 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 A0ssI2 diff --git a/mods/pipeworks/textures/pipeworks_sand_tube_plain.png b/mods/pipeworks/textures/pipeworks_sand_tube_plain.png index 3d3b03ec2f9a06935da11bb9dff14f122cb21b6d..71deeccb2313204c334885412c510eb3d0cca29f 100644 GIT binary patch delta 1167 zcmV;A1aSL-6PO8*8Gi!+005o0f$RVP00d`2O+f$vv5yPOuHMF%-^iNh)wAf>x9Qos@aEC!+Pv!Azvk4j?B2uV z(W~p-!tCG0=hwFG;>+#e#^~6&-p85h+r8h(oa^1d<?Z`6$Oncv*Zid(f zSp?2^>E&*|h>1l|9#wXIu7Gy}1H;3Aiw`Z60MJH)#eWHtGFx6EnUIP5B#;()#bl=L zk%eDNHELchH2QLX@_q#6Jui%+ee4%YEK?7_d<)8w07@{!*d%#yjYCB|K>@nt1d4bj zIOuYq^Gr>ICrz~OH$C_S?;L48ZN>&15;aKU2-@gE0C>D&2o#o~qc_-0ni>Pz!!g{b zr-Iz1v42G88Z@*vYa)$k{Ker!V_vN-rN0Nb<+0rS$1}) zhQna3^{7_1Jt-;eZg}r&Y0+1;m90|t?O-o`ullf*Z5JO5KP;QXB?l^Ra+S@TD6`UE zWZeumA&Kh^TvD8I$ry$0GXYZdsH0nJqnL?b$$!0Hkzk*I%ihopdL(r3qNt`#bBY9+ z!Pg5yo3({m>Zpm^Tr7*9uDPC(beEevfct(ZbwZJW+gN>*Zxez5D?@2%L{q<>Qu%R^ zhE@q2%(hxQ#qaR47NRpg#x_;u<19Bn^x*b;vC9)Ew)db&rGvdP<_#1krF0RUYwfk+deex4seVU-{PKQ-K|p5$E#r z&x(tzZCC$M!!XoVy?2A{yV|0&Q(vi2y>Gp}*vbyV3{u&hvdW&->aVm)_I+ooq5<(K zw0GX)@pDsp7gWLvJZ(mACL%-v(HJ6t$$tdZ5wOJ%a;3pCh?ZVMp+7u%r-O3gconWd z;58WS)}!&{z)gW0{8T!?phyk^l^+d_B?ZYM_*GP&RC%>w_62xSq|WeqBY{e1v`}^% z-jF5AAs5RYOWp~ZODMM6u};jgr@KpE<4jbXE@M=zkn< zMjA=x(qT^xj{t^TdCXT6>igN}0JoUj hD%PDHLkV1m*kW>5eC literal 2433 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 AjsO4v delta 1211 zcmV;s1VsD(1jGrD8Gi-<0063Kaozv`00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-sh6cHgfITk1r000D0Nkl5wIy~|=hsQ7=i#P@n{mLhP+j)GxOwOP%4PDEw?90y zM`u?qW$@q67m>|4z?Tzf+c^_*t0uAEe)_V}`rS9)qhB9>x^@(ptY2Hc8|Hxa(k$Eb z8-F{AB)dXZr?uY@G5SW;sonv)we}wMo0V>CkSP ze|$M=R8bl|$0RuX`RHqr7-qM~U|l7(qkpFlWuCZ#E1UKIv&=dbGbVkchyhgXnYke2A=n9lo5v=fg!p3cf(r+eIkHaDVv# z+IA3whe&|7Jp^AMx(WPjDini9^!cK(AvOz{^D~w00uoV-{#cwdAC_!n9xxYJP7c5- zL-08y1_U<+YYU04y18TJ_RC^V0&u9X;&xbc1?kw_#Gi9{liNF)-8L?V$$BohAx Z{sMhlCx!Ta!m0oO002ovPDHLkV1nDMItTy& diff --git a/mods/pipeworks/textures/pipeworks_sensor_sides_on.png b/mods/pipeworks/textures/pipeworks_sensor_sides_on.png new file mode 100644 index 0000000000000000000000000000000000000000..3551191b7a4e7fed2ca73af7c68ef0537c499d66 GIT binary patch literal 293 zcmV+=0owkFP)TrR422=%jNUWXtkfQ;=NPFwZo~yfI7$k15&j8k7GA`koR`n_G)==Wm{|y+T+J*5 zGc&Uoqg?5H)|;@Sz4x+lJG@AXh^org`)9VOHYDXXi3JPGZ10r{0D!yAy`viv1j+e@ zD?N^*b1vs@lmJPP1Ry7mA%qy?$LCkqRX?xqx~_qFI)K9;!V)E>*mc$WT>)^;Wp1r? z+qQk*@13NSa_{+ko@kP;;QR6L-WO>A2d%SjHre2nCMnnL09c)z>ZUcuD9h~JDAIGJ rWjnfV=Z*#-DgAoyRTVt=F4H1^(=d|9(wba}00000NkvXXu0mjfWIKb> literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/pipeworks_spigot_bottom2.png b/mods/pipeworks/textures/pipeworks_spigot_bottom2.png index 3d4435b018cfb9f876294d124460a185515b05ac..86b96961069d608744c289f31b657d6dc4c4779f 100644 GIT binary patch literal 2444 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 KMNUMnLSTZz(8dD* literal 3389 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 Tal>Np00000NkvXXu0mjfvYMHF diff --git a/mods/pipeworks/textures/pipeworks_spigot_sides.png b/mods/pipeworks/textures/pipeworks_spigot_sides.png index ce7d90a2510cf3f323ca3139a1eb5af24f248c94..f9898e6d1d26d958c31c724cebc23c0ec0871174 100644 GIT binary patch delta 212 zcmV;_04x8}0_6da8Gi%-006c6H|hWY0IW$wK~yNuU64Tz!ypU=82XPR7W+UU+3>s&5q7$m}TMBU*l>4}C&r^0j^35?}uD`iQ`4G907; O0000v(T-=QyQK2{dkgdT-O3$=^lmHqQP zPi98AnY+80S#|E!^dB?JOx}BErkO{C-!ij^=*g3 zR!#ee_hm&ZsrkR>Vtcm7m^h>^Ca%X=gC;0XNEKPe0cx@5q`ymqVS057pSL} UP-Ko6Q~&?~07*qoM6N<$g1h33mH+?% diff --git a/mods/pipeworks/textures/pipeworks_spigot_sides2.png b/mods/pipeworks/textures/pipeworks_spigot_sides2.png index 65332040b9774460140b54a1b11246858be21ac9..e385700602d40c679f4bd6bd5f413393fe3e42a2 100644 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^0t^g{3>+*VRVdmu}mC+AQ?ANpSeDMG4vU*XjsfU`Iz3Qul-l!NA20Z_^)2zwo z9q;wBxgVX>Hc!0KVWl?byqvmFr;pmH9`32fj27P$xxT$s{k6M^+Lg+^$E*(3)#djZ z>D`Rj@Am$&zK-n+NB*h{&2nEBu;XXetv3IC$VYeWthK9wj%M(5^>bP0l+XkKQvF<+ delta 253 zcmVk8d_`Mgq~-G&2|iP&IR}0*An))(#IIL z26>-zV%xTrx?pCosv*wAT07y001;i4nb+BS2S@SGB^9p831tHjx&ENSsZ*2Forut? z!u_X@lqo)z#0>&*S6c&CSil#l_j#*~iDn)YR0>%*?yHyS~1@e0+S}-QCgA(Up~z-rnBO z(9ql4+peyz$jHc>o11`ufWpGU*x1;&x3|W|#^K@N*Vos{$$!bp%F4jNz{|_asi~=> zqobdnpR=>Gw6wI0jEtnDq_(!U#Kgp%ot@Lu)3vp=etv$Flar>VrjU@3o}Qkqt*x)G zuZW0CcXe}9C8gnxp9f}o(Fu&}U$gM*5SijtC&(kvcg0002#NklvMMW4z!7@$i^y$@yA5| i2|dLsBpE3xnfni~o;QQ2kg3N20000CO-}n7` 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 z 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 BsGI-* delta 572 zcmV-C0>k~|1c*0qIFZK~y-)Rg+C_^(qX89|IwTR-Jyk=z6-EF0zvjsxG2Z4gnM3 z4vs*&GmNd5_s7WR=jU+F5kerw$UKJ-@ZPVx7$e?$LI`Zz#(!}fhzQPFOKXi%3IHJl z#u)V88Dn6K!F!L0aNjqzR^Hy;`1$$a{rw#iV`SSl?)#>cLMeq>EBAeqQX=P!s#0sE z*2)-z@9%FuK0es@9d{hZdU1mE-WQvkGrf0OYlIL0sI~I?`pV<+z-`+`jFB-0wN^?g zj4==qM1(QMl7C{YU2FkLDY%ImW8}InT5D?np!ZJi9T8ded7fBnxvuNUz!*dC9q&B= zDJ6RE39?TeLbArv~sr4Lr{)YVi{*K-|kH-U5MOD}St18!Z zp{k^mRyBQH7ddB+*^vj-0zR904&mzU3;J^RX)D`(D} z*}i@I%9Shk?b~eS}Vn@^lLQBzZMgb6)8JzKYKJ#ys8v17;P&Ye4N-n?bYmhITFWAfz5wY9YqCr(_raN(3G zQ}*oHvwr>h<;$0Mc6K&4HqM$gYwzB@-QC?C9UVz33v){5PI1jv*44MbCsLH3x_= zT#PO+@2qZe7HZo4x#WMf=HL028#HIAn|*zM@V?!h@9Xpx@;DbiwL7x9WaHfUxlV0S zlP;!&KX%UY`Ds|OCL_>g^07Csr>E~>pDM06+hDa+$=Mm+55mNLm(SU>^7n!E1g@p0 z(h3j0n454ahEc{$wf7P4N!g8-k2Gx_ZT;=G*zep5jSqrLiau;vpV5}HWF_bN#M!TQ z{F zk6-u@Zc*Z`o}Zuo!L)w*v99&(U-O=49Qnr_H_b|eWl~}s(BBN6u6{1-oD!MK~y-)Rg+70YIAwGjt0mL@^6LYHV$U zcv6uWnR1_>pDV^l&Y4mQd!2J8rDS`h6jDm$oOwJR9LGTjfqxi6V9rVJ9e|uOYb{ij zwHDrcQc5`IxbGVg;r;#H_F^f8-aBIq0Gx9Ggb=u{%bvaWb{7#oK0e&{_xFnDdD@Bh zebakKRZUH64OL~%NzNHnrPc~St(EwAJSe5G)?$o7@13<4&N-ZOthLNa2!RlS*%c9D z&KZDG3bj_|oPXT+&AwC>RW&PfPP1bQy!WUoDJ1}|>q1p&tr?dXBOwG-mE$-7=)M0y zthI8Ur$Jh4(OUb%WUXZ!HUkkM?rC#QN+~>_PaD>I=e}>8bBM^FgtpR{Qew`@+uIu= z!kp70_1@EaH)zf|RMi-~UN7Q4?Kk!9eaE-fvUGCJHh<6{ZkZtji){~xF0zvu6wY#!V9E?SI{7$YLWKhFMk(}?l5 R-v9sr00>D%PDHLkV1n_X?Y#g1 diff --git a/mods/pipeworks/textures/pipeworks_storage_tank_front_2.png b/mods/pipeworks/textures/pipeworks_storage_tank_front_2.png index 20bb918d9e6801604c593ff067b99b46a65e5fba..89a4412f008680684b3833d7a9ad1e8b87ce251f 100644 GIT binary patch literal 727 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstPBi{$^kwh zu4-y(>gsCGpFdYoQF-v-!TIy&H*MPV>C-0-4UI*M7VX-#OH@?!_3PJ~nwpOvKVGwD zO? zFW$X-ck0xs_wL=haN)wkhYxSxzJ1`pfm5eWoj7q~^XAQpii+y$>aDG<<>lr3_U*fV z{rbt1C)cf8w{qpm88c=yG&CGKbZFbQZKqG4zI^%emMvSBELk#P!h|D7jvPLGc=6)J z$BrG_x^?T09XpmSTQ+y@+{u$C&zm=|r>Cc`u5Q+>S+%vb6DLmGvuDqgDO1+3U*Fl; z+1S|F-QC^M(Xnvh!sW}CH#Ifw-Me?ef(0{Y&Rnr##q{aZTUuJ`>+3gc*wEbE+||`J zY0@NMxOJrZfPycvB*-uLKaByyx`up1pk<#tT^vIsE{mRJZaN$w;&9P?Tkh(4vof#T z_;=F%`~I$zIuGV?XSuBPoAj6K*`Igc{(KR*(-hDqrugpo-tNs6@_Y6u$X#B-!~OA3 zMn1QWl<3aGTU_=$dc0v1*UG0)tQHnk&3_oXZWEuQ*5&%+4oiEk%~B}JaN3>ca#MA> z;SB~EwGPX5UNwt1KVG}#0b_r&__HZRKUalH3-rJFrj#1D?m1WRcJoBJ&lcX7I{ix) zUE#lF@WPa3cZtrd`&ax{G4il)J})SC`jmR>E}ORF%dcJev+;PNn)b!7m)f8AZ(qOi w=JCV^p8YGzAO78H`DfnDJ##%LEfo06&%e+)D5NA$ALx4qPgg&ebxsLQ02#HaYybcN delta 567 zcmV-70?7T>1;qrA8Gi-<001BJ|6u?C010qNS#tmY3ljhU3ljkVnw%H_000McNliru z-2nyxI28f^;Tiw{0pv+UK~y-)Rg*z(>>v=>w>Ml$iDg;1u8UF%r4(wdT-U{M9ORr)Rcfu& zTIs#>`T5EF`#amV5%ztbCk_!an{IN>m>I1#VvGRPT6uYS;qiD7mSrKOMDLwiE2R{A z?}!K@LhpS>@qgY=w*aLS!ca{qah@lwwYdSn%rG-VWUlY`JKlTF^L#pR&S7S(>k7be z9GDq7XMkthA>h5A5u9`6oC)LPecu6a&e3}(=lowMy?0t`q?9P7AOfmN*tQK|4)6E- z6f320T^AyPsv;sd=TKEZo+Ym9N^6bV?S`t-TBFuF-G24qf8F#8xUaa^l|_pdJ$Ufo`Sa(WK7H!z>)W+!m#C=d>({T_+uI*M ze!OPQnn#ZwUA=ns=FOYOj~}nBtSm1tpFMl_+O=!1T)A@Q%$fP~=WpM>edWrPH*Vax zc=6)hyLYEfoqF%yy$csEJbd`@_U+pT4jedj>ePu7ClnPGYiert?b~<#`t_41Pj244 zdEL5oGiJ zJGOP})*U-`EL*m0?%cVPCr_R?Z{Ea-6BjOAxM$CvDO0AbU%$Syv$L_Wan`I^wY9Y! z9UaS;FK=pU+PimecX#)K1q)`*oVjAfis{p**Vor?*s!6crKP#KxvQ&d(xgei5M$ha z4HSOyB|(0{|7i*sCeMo30b2Fm)5S4F;IWMM)9ytB{_xCF@i!NwS0-Er!Sc)c$b=ye89S3j3^P6c*0pdwSK~y-)Rg+0_#3&F&Ujh;cJA4$M$EWc%YvJ%A9HA1EAbU{_ z(Y<3xe*Phm@9%GQ&JjW&#>iZU5ZL#9oy8d0_ni;|+qQ8W2Y(`hv)0mkr<4Lf2mw`P zjDf0RjA7q*M1=dkX|3_`@xjl}51*f(m>475wsGG#r4&jjwAQ%qo9nvBIa6z;wMJ_V zRps$`@b&eD_a1i~$Lcsi#u$rD&Y3X=y>~(g0JPS4e}CuseB!okBgTlT(psaGf~q1S zhzP2>q*!YgTYrF33T~pt7)dG7dtU_rV+_U^h{)QX=ZUqJl+ufVF@`Y)`@REkT^C~v za?SuRx1GaUyCfK6$T{O?=i@j4Fvg&&+(F$1y)Mo zzHdZ?S}P)gF@{ zm5!?7z31_G$lu?ex*3azV69z66TmsgbzO)EIpVMGqc4c>er(Utiy+PoLV`+js5SB`PZV`t|F_ zj~}mDv*zm6tB)Q%s;sOmFE77&^XBp6$7j!;y>{)|D_5?ZIdf+F_U$WIuDo&M#=d>~ z?%ut7@#4j)Q>R|IaN*v)dk-HzynXxjfddClojP^m#EH$DH!CVC&YwTOrl#il_3I~3 zo?N$X-HaJC8X6i79Xhma+qToEPhY-#dCQh9OO`A-a^%S2!-pqKm{3<&w|Md5o}Qj# z$Bu2?x^>5n9m|$2n>%;zym|9#Yik!ST)1b?o+(qNtY5#rv$M0Yv2oU{S(7JEo;Y!0 zM@Pr<<;$Czn!3BY_wL=hV8Mc!GiRGk#XEiEk@Hf-qX>S}Ioo-}C^FvPAp z^{N7?_>v&M;QurQ43lTY>j16#=;`7ZB5_&tENfD;g9yXL`0{e!yGgy;2b*^5W#9QP zv6Ov=xk3Mmo1UNJZwkE6(?8#LP*dV*hUBEWOS`Rn`xK6`cJEyM%*F4>Bfpn&A3pe{*k#Hpu84~|gTe~DWM4fCljQe delta 568 zcmV-80>}N%1;zxB8Gi-<001BJ|6u?C010qNS#tmY3ljhU3ljkVnw%H_000McNliru z-2nyxI28f^;Tiw{0p&?VK~y-)Rgz0`JK95i1YuXVGpTJu+;v*<8 zdSGUDLKIn<^-A8~-_<#X_nr^}sblJH2;AWS)=Xz*@_Bo(~7c7<%ul>k2@O zk={EgC4k4Yox@r?BN$^yDd9%vecu5v#-OUCl>VEEs?u5`gh0+25h$hLwrvBLm&b8T zv79s4bs-{@QV@~ZS;P=y#I5T}YmKL;CrT-_)~K~kH-7`|h@z^zzP|GL`6)j?Kk7!e zf2TgO4}7XR>8R?&IWZ2K*4kM#1e|lk7!i>_)@4$vwf@DJQo_%H01_3g>xJN|_JO z^W;2FQZY*G`;K$Y(OP5MHmtSNDlq3Ua*suG&f%P+l)^6qpp<Z3=GDl03?%gblao_+J?&Ev<9uU)(L%9Sf;&Yao4ef!FlEBEc&cjLy5ix)56y?b}+ z)Ty^`-+uV;;k|qJE?l^9;J|^CCr_R@aY9j1asK@I*RNkcb?Q`2P0i-bo7b&d*U-># z=+L2U+qRuPefsj{%UiZ=S+Zowkt0VAA3j`HS2ttEjKzx=_w@8km@whkv141eZr!nC z$K1Jd=gph9Y}vBOlPA~K)=r!_apA&+d-m*^GG)s8_3IlO8)wa$)zQ(>-QC^U*|~iA z@}{Pyy?ggASg>H`%$d`tPp_}9U$J6EOH0d!4I7%9o4dNYCQX_I45-$;)h0kHrX#KlcJnZwp?{(oHO)y^Av&D(Tbu6-9ewtia2VYUet+7(Z9GZMI>FQ&1} zow$kOW*elF{r5}E*s7pC3- delta 563 zcmV-30?hru1;GT68Gi-<001BJ|6u?C010qNS#tmY3ljhU3ljkVnw%H_000McNliru z-2nyxI2i~@tuX)q0pLkQK~y-)Rgz0i_Bs$mj~{UygV+IEU_GpcZGwbY0P}qDqvQ5J zK(_9kC9zX|s;bS$$H(yA6JsQ$#C(o15<*ztQc8pnh%vHl8-K@fV2r^#=jgptYXu<2 z$QT1vWsHHfmJkBQ81DN(aevM&T7X(BeyXOF$T`z{Ul#yW6;;I;v)<41#5qUK`H#R_i>eYr0N}bV zRFzT+z+c+lFJ5q8ohT!WPj1jYNr)d#aavS*TS6k-_)n~ zS>G6AwG(4pf-A&{>6}}&O#$yc*L7ixp_H;Va)!BTETv$rU1D>&M1&Y4s>;6ah{z&5 z&-0I9c0Di8R#X+|+_G0|<+?6fYXE=2{`~w5Rps$`&|0Ilw)VfZM$Vbm+WIl)OwO57 z3deEay)5_i-r4sZ=iEXCRvy#$Tr}@J-g{bW`~$Mpk)bgFUw8lj002ovPDHLkV1m^q B4QBuV diff --git a/mods/pipeworks/textures/pipeworks_storage_tank_front_6.png b/mods/pipeworks/textures/pipeworks_storage_tank_front_6.png index 280bdf6dfbace220f1e674aa08eb311ed443c33c..c21115e9d333226e58efbeb4b4121bc8c338b5d1 100644 GIT binary patch literal 691 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstPBi{+yOoz zt_lhYDk>@u9z1yd{CQtr-=|NX+S}VjMMZb*+V%SN>&K5DuUWI^>eZ`{9zCk8tSm1t zpFMl_&6_umA3uKO%9ZWgx365e^2UuD`}Xa-c=6)hyLYEfoqFNIh1<7p-@AA3;lqaq z4jedn^5m&gr%s$Wp{S_1cJ10TXU@!@KmYpm>zg-kuBoY6w{BfSL&Kp%hqi6ocKY<` z%a<>2*|KHHk|jru965aWa9v&9gb5RRdU}o>JGOP})*U-`EL*m0?%cWa=FOWiW5(je ziziQ>Tw7Z^apJ^<3m5L$vuDbbDeKp-@9gYsY;2r0YgTu6cSlFZ^5x5$nwnom#ta5Yl z@XBWk3UHqgP5@m*28MpCWBT>Yym0lzpojz zY`r&&BfIXYs;j=fzJ|3H=N#U9=C^Z>ec#tV?>+mzz zjxh!z!WaXsHT%A!l%lmpt(CX8H*U8ZA0HoR?>*bL(OM(tOwO5FE3Gv`2&9xKrBG|7 z*2)-z@9%FuKR-E+1ACt5nm9#7WYMIQ5D|LsIOhPUwetG<%H#3CZrg_Uo-qcsR&vga zF;GgOlwyprtbZ6|7A-)|89P@cYc0;)bH=_u*Y!#(0j*w z&vji(EayyX4W$&Nlx1U*gb=X%zSDc><>iG^3cYt~t$&MVRy)x}1g$l|)54tgZ|c+g ztZ$65+HuY;!4=}fG{&sjrhv7U5CTdmQc5epxeu$xloDF&B{r9<){1iu5#cxvYORa# zx~?a|?0R0Ft%wN5m}M{LObCHe3cxei`~5ydgvaASDTPwX+W%4tF-A%$>tT$M7$Yeq z&hx}tYb)u!a~uc8n1u?gJf`otXx3V+wUko$1B_sfxqPTW)Bpeg07*qoM6N<$g6j7P AAOHXW diff --git a/mods/pipeworks/textures/pipeworks_storage_tank_front_7.png b/mods/pipeworks/textures/pipeworks_storage_tank_front_7.png index e3d7522ad7fbe2fc8420885ec5e9544ea2cfb3ad..aa7c6655fc9d7f6b9e2145dd9e9b1ab832656354 100644 GIT binary patch literal 691 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstPBi{+yOoz zuB%tCR#H-W{`~o;PoESO6&Ed9)YsRyYu7GOQPJ10U$?inuUWI^@#Dvj9zD8x^=f5h zWqEn|?Afz#-n@DI`0=%C*Iv1D<;C2Zd zZ`rbC$&w{UjvP6B_;6ia-QvZIXUv#!=+L1F6DIWZ^c*{OY{!lrbLY;TH*en7ty`BZ zTQ+&}udi=uY1y!0LvwTUq)C&yy1IbjW4!!G3y_K|3Gxg6Pb0wK-^$1j zwB((qi(`nyWzjROiH8jY7!K$g8!r>dn!#)6d}fmFo%%_;nC~3a5&gI5$o^T&@7<4` zKljkGq^9Sud%j)#^h`$9(ML<{v&Zoe=T|2m^8HX+>v3Z7r9Gwr+jjG|$_vfrT%D0r zwPE{Jw(T2^{D1u9>ztEfGd|a-R?QCiuzF|a3Dpa0&Q$K0x$#Kk6a_(>3mbnQJ6zTG zGfB_7!R_GVT@MU5c5doYVH1@UnSN9&(X3ndX3N1(p4_jFi!br+OJzBH@Jq4F*(lXD zuTIrg)cu`RF*o6j+q6k>Cs^X_qV5Z?_ct~#pY&=I``howKBT{rWV}}Dp7>2Z>4jbN U+aI^y0)5Wl>FVdQ&MBb@04YhBhyVZp delta 567 zcmV-70?7Td1;qrA8Gi-<001BJ|6u?C010qNS#tmY3ljhU3ljkVnw%H_000McNliru z-2nyxI23mH(To590pv+UK~y-)Rgzmy?K%)dmtTov5X^+}FdC-G2ZAXep}qZf`+RKK zx;I}=6jxW(YW4B)F|D>kKUteFmy}hAB2sr2Hy;Dk|ltOEb-a9cya?aFRX|2&( zW6sIv=O^#)@0{m}y{>CdTp}W}-Q=7R5ylvJ?*VA7@%;SE{eH(f=LjJ%=cKhpDTO&F zN-305%sF=yV}A_JIa+HdrKq)Hmud)sloDeMdhe`9L=X{_Qv2OG$Is7?`u+W#);WjP z8WG_*4gg||hzL1nfJfWbVvIpVczt~Z;P3AbyCz@P1%TF?IVU;i|8+9w+&#n?cNg|N zPXNXkgb=vhZdtE2R))q}B@XDE9mNdx{A6`<+@Vwbs4=wN_F})LQq& zloBZ=axl(Z*M+s#GRELM&%G!M?doIYUW;a}#ac_Pm4EdmjHUc7ks?%k(@`7JbB>2ffFZAtXsG4>eZ`j*RGvEfBvacr#5fiTvJoi(9m$`(4lSHww*qG z`ts$=OO`A-a^y%|UESivi)YN3v1QAa!-o$~m@uKIr{~zQV_UawojZ5#ym|AMEnBu@ z$BxO9C)d{2PMkP#;lhP`_UxH5Wy<>X>z6NI-r3pN*w{F0)~xRC?v9R*rlzLp)2Gjz zIdkvcy(?C%Sg>G0eSLjPOUs508=9M&Crz5v)zt+IpL^X!RX{4TB*-uLKaBu`e=8$D z(31C_E{-7*mqpLGHZ?nlFkG~M_ikMw|0EWtg6V8g@9QTeehcM)Ci(rzsy}yktiC;a z^=9FYtW%Nu_)c)}u8)4fAry1DXp4dY!@3)z4*}Q$iB}4Zf58 delta 567 zcmV-70?7Te1;qrA8Gi-<001BJ|6u?C010qNS#tmY3ljhU3ljkVnw%H_000McNliru z-2nyxI2Z5nfHnXC0pv+UK~y-)Rg%k5Bry;~pFXWtivR;K0(-CqH#rdC0k;|bRocUZ zw7WWWDAZY*`AU6!d`xRC-g`m_tZ(l<&bfUTLclqP_nzZ8xPPt-r4-f}!x)273IN`F z=A4KKb569@IOkAG(R-)0#>>kKUteFmy}hAB2pq>j@10T#r4(9g^xlavl5?ikN^6bQ z8gouQKR~&px;t~;&?I!1ph%m;$dk;VLjED$1XMjiB)?$o7M0Vk&6zrOOT^9gaYv!Efod4@&&bfO?DFIMx#h&N6 zt%VS{-ELc~ltS+vr4+T+9b-j^F=Cx_j4^n6dZO0K7=MG-+IF+ht|%gc*7|P;Yudl9 zuj~uooO9Fh-fzK_(xb#>(-^a{EdgsSF-DY92iOrAWswzhWS#EAswk{ zHf-3?+}u2A(xk4gE?@vy?KJ)lq(Vx9{DS{eA20-eFS-ac|E;HsV~E6M(KA<*njJ(K zE=GS}wyrQ-f$QL0)@fJ&|DS&8`%LE5J{4Me_5JU@e0=!tmC&Lt&Ux}oR?d?jnp(BD zgy=l{xNnKOiOk%&4eFb^T5OKFWnaIN%Fd;)A|{-6aoy~FR}O0We0+byQZL%~Cad#F z^CX$nru&+0YS$f@=X^GZ+IS_*(1V3{SHZoCh|`?mqBohB{9NpOP&jGgTeWGbJ{S9@ z?YObzOj4)jZG-tXvVU)VWRaY}E!k`rU!Q$t#ri3s%#~c{_3gd4Ki8jg<4)Rkqt@%^ z*T1_o_u_$*Z@27{Jbb*`{r&p8bK~EA|28eMK19k&+^bRk7trGjp00i_>zopr0HHmH A8vpLq^=JWG&c<%`z5MyNChY;BJeLagYvhO<~1b?<|<2VkCF?i=3y?06} z0E7@2W1y;xF|gLM?>ojAT5Hr=d3}B5e!uhn{*H|?vTYl!HA*RzQmD1kTI0Gda?Xed zwN`4a0DOIY@$vCN2myZ_$2xI}sOoZ)b4FF^y%R#9_s-kf8$Ulk=KK45_-)&WF*3%W z)=DXbF$TsMjDInVF;*1k9L_n;^8}!^h7TbC5Mv~zMDLx}8uLYe&H%q{dyjJtRpoZO0Z>Z8&y$bi0Ki(y7=xViKb?#*Ru3s9 z07L{o)q3y57oJBUVmO*5D|Ls3zxNap`B4wb#-u_ z=P$L`W$iBJ0PL z5-BBe&Mq9sf%o3id*^n${Wp}^$ILy4=Do*zkBIOGnYN4dt$!xU00000NkvXXu0mjf DBR~RH diff --git a/mods/pipeworks/textures/pipeworks_teleport_tube_end.png b/mods/pipeworks/textures/pipeworks_teleport_tube_end.png index e1157d243bfb995d3115507720e444c66546ebcd..d3df799b9cdd5948d8b870e27f17f831f2ef1bd5 100644 GIT binary patch literal 1737 zcmc(f`#;qA9>>Qu>#~`RtuyJUHrZUdol|S4NyKCaxlU*;W|+acmnO^@_gh7im}Mkn zNyEBKO*3W?B?=XCi;yC8GiJWuxyF9h`76%r@p!$SzrG&t$NTZREVjUs-ATLI6>9d4n!w_@;(q@ zA?jJlc@LoM0IM!QDFCadWfeJ+3tnGeK3SU@f)ag!>Y;>!S3bHYyO9B<5mh}r)l(sW zX+Xh|*A=Q>JOavlvg&*w&6d|PAeujrUIMZbS!EuOW`b3B*{#a}P6A?Y0L9D7v*ZmW zveFa)(^b8#QYKBosZe$_0$Gu=y+OuGlh+g|n#uq~0rFaTJrl@pNdKTi^Z>Bx3BTWfw=)%>}YTAY(u&K|q=d#Akr~7Esgy`JVuaRdzNj z?p4X}6ahuEf?Ey5XMv&tDA)js2J)LyMm&Jd$s1Wf#*$u70P;!&|2CW(0bhzz@M@Go zHk?UP3hIE^A4rHm5(J<~AP$fgoReOo07)2>9s(r40|^;OLg33Wa85X!AGdM;thfQe z29hp#xp{;ClMuD|%NxI-nT2z-$NP0NeK#e%voTzxiulK)@0GaBz&u>q9uqT{Wv5)i zd=8B-h1^?-oIaX)XD&u%XetR`ym3w)Lp4Zv`Qx>%>?gi^|DAht7O6Wua`^j)w3VMk zvwCW$EQ66Gt}p@oN7JGy8%rQHJm453+ED3OkI%-*Ax0}*M>#q*mFNfJSOj;$y4`!I zvkV_VECwLA5L*?nR^ z&D$x+$=RZoQmWlqejy#R1C5^D=SLGvl8`BZqb64BLfOF^Ye#0(cD+-k?e!!~-xlBX zBzVqE)15b`R3%O9AuUCj3CxA4;nyR1B+m<0OL_rSuQl@6s4;I^7L(q0wm;6vCzm(3 z3cJ)^Gz;2`hx~k;HAZ%P``2e-N7J~81EL@0dg_O5 z=*lq@YjO0a`HL~_)KPK_YQa8Y)F^_Up%^F0fLnAE8(WSp9!vZ}p|5 z(*7Q5T>3ae<;TrRk`F2u`u2O*ec1PH=LdJnp*Krbcrw!b>btzHg7%p#i^Btb|1Foog6p-Wo3{)%1)eK6Hq`mXFEC#Hw?LP>Vrfn((mAG7`1gY0JNQyt1dQG;L1( zmO(x4)SXN}%I8cj`b%NX)2RpUE$gMRN!eM)2Gq`foCs+BaF$tXbexfPyt1HvU+H%>Utxk88WpKu6Ye~TyGd^kiAj$vY z_=haW*mvG_lf}eNwsXXDrqL`idNQE%u1%lu^lAR{ORT{PR-_DmaT;T{E1SJ zYwvfw5A5!4`OWb%e1b-v8eD8Mw7F)3G5u>S1f@0B*i5+iiIv!_FF$ltOs%ONwWHKi z4?o`hs;d9a%hRqH(^re{{2k5E`vXgScB=*s9eALvFA7HLbJfFlo=JPv1=({5VOwZZr{s2Wf{dZ#&5jd=yW7A1O#y>Z5;qm|g literal 3348 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 elOc diff --git a/mods/pipeworks/textures/pipeworks_teleport_tube_inv.png b/mods/pipeworks/textures/pipeworks_teleport_tube_inv.png index 2b4d323358d03fbdfd29c5f44275a8bb1fd068de..653afbbf35fb2a069c4485def712716ccac16c59 100644 GIT binary patch delta 891 zcmZ3^)y_UavYwfNfno0U#y3EUCEd~2k%3`jKlh(RRv>>}fKQ0)uXBg~|J?omYwQ0n z_5XkF{Qqi^#t|Nl1m|F{01d)NNlwetJY{vR9X{r@)o$M$9azfJwQ2dH5F&z;Nvf1mqf z%cB3^7yj6`{zzW9kp07zMt1o;L3Cj!)CRl{I@;6E1w1CyPn zi(^Q{;kVPTPg`uj)0Y1F&6i0tJ!h&+W@@=$eeL)D8&Xdi<~pT(D>`hsjaB{MhSo2q zcQ)1US*O?VUr^xh$;fxNnAfX6@b1xn9oNwBA)%V{i{V+Q_=jnXcfK<$+4Gb8o^E~R z>y1t4=LQ-!WHLXqPLBNkepbVFiCXpv4|3x91M0tCc^DfQsd!+qm_okJ?pJY7)kO}h z>2)^DD|Na#r+2aZ=8d)K?KjU&-^k|h>+KN%yAP(5I!{(UIM^#B$l?%HZyUBi{m`lZ zul^V_?7OzsGUw9;;rkP~PAvTzZprd`@89{1Q|c$h{$6)(K@U%b2Y0=t{=9p4ljI)W zzI*uRa>n>cwoj{PUaK@v$$sRtY3{4NV&-dlv{t1xEPl8^KTLw3Gj!^F*CXbZa~6xw z?_lV;$G`rpv^ahm18 z+PC7$>UY-(Pup-nM^#p05}$yXR#vqvqeA?E?Hbo4QEjOQ7n?S&xS7W= z^W^c}hflm?SQ2zrKKYA&-;Zx53SLuXC6rc4{+yB~qw(t1n}1hDOWw>~9?>EX#$pCHRE9)6_Lu)0EC0-nQIM-fcCm L{an^LB{Ts58_)gA delta 1311 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 H{^WlF%0pLr literal 2633 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 diff --git a/mods/pipeworks/textures/pipeworks_teleport_tube_short.png b/mods/pipeworks/textures/pipeworks_teleport_tube_short.png index 1cc7233189c3b141f80a11f90786d0b593e7a506..e0a15b9bbd2b9ea510a14294b76193c86f76429e 100644 GIT binary patch literal 990 zcmcJN|5MX-9LL`-G5I`P=L9Jhz`8 z@9P!lg%I*hOo&Z!lKby^Fr2q_pyDql+=RSj9zr^)_j=X~2)S(EzfTZHe&4iap0JCv zfNUkZ!7jjSfa)T(3hew> zU_T1BBV;+&ibUy9n{NSIR$Sg|XAAtXNP~owq7^jzw#8{r- z;P^8cnXlw-oq9N|3~o*Pg}>+V@ar%BJ(kz!GgnZ&0Z{v1<|V0$Cmz0i$rCN8SuIoQU2dU@Pkm6%gOZI??wNnt}iVO$wcV2n!$`vr&qZ-)ZC3$}BYVu?t z5{IsKMBu;WFBtFS1&w@&`Sh-EUMo(L&kJ>nqQ+2j?vd!2<(!qd`_(KD)6~uAdgo?KJ6)Pnl6q@+sEUN7gFlEatuYZjmIdK618V`e@Y- vwmja?u=m2f_#j5^V1L`X|9`^D-PX4VYbTS~Yn%;d=}=-EKep$i%rpN06h=!K delta 1622 zcmV-c2C4bp2iy#h8Gi-<0063Kaozv`00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-sh6A&;CIbh5b000H)Nkl)+j9{u^aq~?eHOWN*k3ZAAb-kAox%fia>&fm?&}L zSL`@R+mMzzq-{iT96s?7sI8QsLPPU#{Ji(h?Cy0ue7I4i;NWX>FA{?JecRF5GiUyL z&Y7J7gTY`h7z_r3!C){L30D&yn7hL^OxUt{9?zjNtf9 zi25CE{2;Pt1!ALx>~;|ko+G_`60z}I)_&t8>PQ8m zK8f6aZ4rBIyp|NQJAr6Qq6RAPTBb<<=xw~sAomv|8YfXl$`M~ts6K($auGFfD_+Y~ z0Wx5wLw`r3cVmC9m}s;ZyE-B|<6>9M5S}W+S>qFp&S6)_2#%e{T|YIN%{n_(`Cmfu6<3y)RuvfbT$A8b`)<%S{l;M1#jPO^JIG-O!?z@8j z=#y4nHIm--gx0~3{%@_}^iRHV!`Q-8&ucy1kTdR_CEzt*CVVxsppD%9EnSG9{~f&6 zi5rgFRhLOWQ%2qb1jjy%vu5Ee5-sti1>H7VxGtXPv~+5|py4SW|51^@0PcemL?d<% zk$)0P3%c|NmQHRjSQe;5rSry|d(s5I{80V^q<=hyT{E|E1~hE9QcrGM(t>19qF`Ad z>MzY3i(X6M*8U}b=Q_Dvhc6$=xwsppVb1b8`tyQifu8BO&X*2f(CJ-I%D!fOc%kpVk&cw$grUlu$6W80!m|F9sw zwR}d)&hO;!EA{=yv<`=LzFV2>ep)YH^vClKJbLZ8)-zl4F9E-!h|HhoZzo=RY-x?E zu4wUHy{~iuaUNNeIPuRUk^6Et+T3S>qm{&OAD{n4JLS^0KJRf$r@pzU;Jt^xYk&Rg zo>a1^`NESKysysXFM!x^fz0py`9W@7w)Fjas5I}A^dEc5T1@#lYc*=HJbwY?ewX;C z=Fex9eB08=9ZRZJQ9oIj-`}>G+&$n-0=AYKEK&7I9sgv8%pV=%9~)!# z^%WG~_9wzqr8xH_iB7);F)Q`+%)l9jrt&rjb1^UaLoN%)`BZg5bsFxV2|dhi^vIT|)JjA)1R&{Ti|9 z9Kj2p#(iK0xi^Kkg=;r8R|tkbj$3Rc5@E_60{ZGYsEfc6d3-^Ju z$nFIGwsO?LTM&&R>%T2P9rO{+A?lD*&{Lvj6}9 diff --git a/mods/pipeworks/textures/pipeworks_testobject.png b/mods/pipeworks/textures/pipeworks_testobject.png index 38f85b79d6d524ee97131c85289e972a9e4e25f8..2c675618a006008f78158fd99b22e2725dc7cb4b 100644 GIT binary patch literal 4083 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 literal 4781 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 Mr>mdKI;Vst08zg=-2eap literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/pipeworks_tube_connection_stony.png b/mods/pipeworks/textures/pipeworks_tube_connection_stony.png new file mode 100644 index 0000000000000000000000000000000000000000..1e72d81cfa549913957e8f5c3bd91ca3eae6998d GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr_~T6C_wgnB8)kq{H=p z{{MYmo{cfCt}T3hym3KMk%57MkpWBFaYLchS64iR{~H?^EO;P!dD*|?%cgP8e(+pB z-r&f-1i{0Z4BFhgTe~DWM4f#%4+X literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/pipeworks_tube_connection_wooden.png b/mods/pipeworks/textures/pipeworks_tube_connection_wooden.png new file mode 100644 index 0000000000000000000000000000000000000000..c20cd7d553a59319f78f010930f8902d11e92b0f GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr_~T6C_wgnB8)kE^|Bm zH#RgdsQLMGdgIiY6CWO*|DWg0nI4{>!Pk>kq#sN>@W1}QVKa-aQNJr55M)957)Q- eU+mcz#=xMcBj+0yzfl3`3_)V3zZ%xEr^in)|at8^@vSfn!NED`eLPRur! z&DdP#GUhfmHipeGmr$b92}R=QZ#eJsyzl3EfBb%bcnK(^ow}Nq8UO%Lhugzkw+Q}i zm2F#@&5HfJ1*JO>CkOyQPXey{Y~SkbCOibkG=g-W{6c!fB zSheoaly(9jTz z#S)9fot>Qn0|PxhJ$-$BOeV9etV}2r3Iu}E($e1EUMiJJqtU9Wswyffs;jFR3`Ti* zIh{_gtgPHRMWjAey9MZ1)5%b9FPLXbOf^v zn5vlys_{6&<|aAW)FJ_Xm}|MiCB3_(-c207OtP!7lz>}?XU!UVeN=JhY5F39T=mzu z7eqOAQVs*yO1tf{Snknb!@2g8IK zXCa>YLGv)3R5EvHzTbQn3S#M(B0%_C9jD)3J(h%2%9pX4LV`~~`;3VeHN?!cJ+C60 z2VUkOv>+VpHPpo9)QsfGBE}q|`&D9K|8zw2EIA|(iVaMCPm9goaM%?CDmnK$)Xe4u z0tkRAyiztuTRNkgp!GL!hXvr|;iLL3#OZuJ%@leYe07yCAMF{5jOo z=?p1xH__cIh+^8|;L@|JM`z}33g!Ut1pB9aIn0IsIB+$`E#_jkbHv2{*TrI!l0_;e zx5$6>CoA9B^Am7xdtNkqw^d1(})a%*m8esutl6 z*K&W@ilD*R2>tM1Mobj?MfgKq%ONu}*4^t_4fitCIhLn>QP$0Q-`FzaMJn5#S_!hs zHD+~hi_uhuru z>Itue3^_^xIeg`ym=of-ITcwpCrwB{q~RQM*;FJtzTYNP;LG2hih$c#o#dVqo+5&t zy{QfuIGz$<>hn+DWa~R$u)?YXS^`cxQjBeE9*#lTtJQ`D`U$@X5yl8#Lq)dW9v#sp zB>>{@+@J*5ncu@7as%la*Az;?`}(@JFwa-QU2c!rQzn2cUm*T zD4s8{N=B?SlOe1rYHd~MN`Tde1qP$AQ7%tP9p_eBAhrY7v9pTJ3q|t}Ixn#5cz)zj zsWk`7UlI2*_Tol>dL_me@Ojt@>kR%qh84sd;-bfp)s>&Y?MZD}>3$x1LvcMv`gA@( gRCQ?h{LeV~ej};qpuGaAb!!v=a9bp-9O@nSAH7=YP5=M^ literal 2577 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 KMNUMnLSTZ5?x))T diff --git a/mods/pipeworks/textures/pipeworks_tube_plain.png b/mods/pipeworks/textures/pipeworks_tube_plain.png index b2caab083766a8bb74ee72d649d522179a752f66..a5022d84e30c9031e3cc027006722f7716101fe2 100644 GIT binary patch literal 1362 zcmbu9`!^E`0LLd&n!GYjkE83I3gIqRcgi$`(yAeDh#QKeOL7%4=OR}fk838EFdH-T zn6cTs&4$Ki8?$Mf*9kT6a!cvDyMM#|p7Z^F&iBXfFW(%buctQX2nYZGXnS2kTvyTc zKWnP1vYd`yRsk3VzXAsUD0x~tVH&F5i@c0-ud1r5sHm8oon2U1sIIP_nVG@ia0CLO zrlv+FlPMI6si~=+o*s!r(%ISB-Q7JfFwoW2Ra;xz(b3V@*T>~@rBdne@UT!QWHOly z27^Q*_4oJp_V%(^EDnc5BoZekCMG8*>+0&nV)5YM;F~vZ*le~)BpMnTYHx4n@pyDP zeROn`&*zVfj0gmR@$vDov9X4R1{#ezkXKTU%S3nwr|$+Ne}&V`C$QLTPDf zQH_A`Ymq9rKDzFEWB30F(EpTz007iCyby5IO%^5~Cw>kJ{7zC2$qEAqTmp@c zL-a;;9n@V}`YVP0GuUO&@MuEXT@&;=>|}J&JC98@(KV(WP?p1~T$x zr3uw$Xlys-w}!N?YVq6Dg;!f?DbA1?CW_*0PBUjv|S`Y0jB$C zo|)ijJx>1kp?R=9;0_F3m>tvSmgAmz97bbv!lSLe6k8h}Je>Eggq`tle-g;t!-55R zP=Z95X5lTKC%1ZhIIRKq8_}R2`;*mob+O*;>yWVWR?(oN?&cp~s!gQZfkvI!Ja-7+ zYYVLLaUk(y_WTDF_}Mk*Bn-sCdbd=%xBSsL6i7pAwP?w z!qR+PC3DQY(gkV=Qn7cfdkdJYCi!F;Q>DzXL!BmF6qRiOxwGwdy6M1D+p@)Qc?aIE zSnl>jJeauG%y>y)$wQ?+gB-{pptZlfYl^f#JV4G$P2S3s-zLR5`)q&qLrU%fCPg|x z=J52!YRD2bPU>|$%XlN@E0#>h#dImPh#jn;g2$|OyY?}IF;9gzq*?b2IKjpFRJd|h zxfoM!;9_g64_&ICw~lhoC30oj@HH#Lkfp;{rS3wv6*Dhp7j8ncN{7ia^|CkH`cku zt|}0d^*!vRe_Y4C`-pTJ!LC?i`iOq|I^JiZ-zmWglp32P&Rm!x`*Rw7_3Wu8xO)y` z#BGAinJlgkYq*tX?iYEcaL_Thb~E^{hpSKUd+!J%^}3Ky27O*u>55F9k_T4qxT9}tLiKjk5La5vSJr$BR7V2va`#0vy4}wB E7e4RPr~m)} literal 2444 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 O1B0ilpUXO@geCx!=8@|F delta 1239 zcmV;|1StFX1>gyg8Gi-<0063Kaozv`010qNS#tmY3ljhU3ljkVnw%H_000McNliru z+z1#G6fc+RwO{}M1b<0HK~#9!?U>JQ(@GS^zxnU6la{I!HoO5(0AhiJXw{-VYd0V$ zf(1*q2v)4=s%nX2JLBmf)PDswxmd;GBcC7D5PE zYoh={h-j#_7L&;Y4<9~6mSqq^AcTPVe2%g#F`v&Ngn)A{K5y8B_dbf?y@wD2ec$8q z@-lvR&Vh3tZEo8Z)9Ez6pu6C!7Bo$RM~@ywqwn9pAAdLQy@%F18bAmEV+;oe2dL{B z)>`cE?}Kv=#u&=7#DfP9V2r`;?kIS)~Koq_wL;TV+?)YLkNK^%g}Wl z>beF1NGZV>gHj4tS63i}fOC$bC{R@uthJcUW}6Ejgn$qNj~_oK|Hc@8`}S=(K0dx> z+qZAu!hglZ#mehfhQQ#~ck%xH`!Lq%Z3*C&zNB_BR~xFsm16nUO+E})Q;&!0b6y3(^}&&b)? zS=iL*zol*4+sTb{%;)pX1<3O}9)ou=olZv?eSdUxL_UB1ycI7vK0YR|U%$R_FRk@@ zFJje#p%__}^cIW7Xv3?j+Bl*9YUi)aW-|~%HWz>~cI)QL^1|uq>F8tf#fulWu9-|G zf1M0}7i22}7-LWr#f{%yy?Qk|iGBL?X|457pFSn;-o4v6G^W!jj4_)Fpp;sgu%wiu z41XH4{;mZ1=FOY6#Bt7Trw+)nY-yHlnr4&$Po6v>A3uIv%lN~?!$11&I&M7_aI5N< zwL@UpIX^b*Z|mqgIXPJ?{1{`~5n$-Ve&_k~=j8nSd{nIdscap~I>$2Se61pmuJhLZ z^uVzjdinC@RvM}-%T}&wnr5vNg|8z(*MD{R^5shydhem%Cxqbp_wQkd&Edqjyu6I9 ztWpY6$~fQ{TImo1IOmv7r?DOwh8T;*0$G+pDHTQb-h)yaTjsA{zlLEz;+%`uaL!?j z0U;!|&Kn6}jKRglMJ$N&JO?2JWm!Tgg&#kD#OVxU3{pyTU5EL6j)Q{(G);rLu7Bg8 zqw6~C@9)DHgR(4?0s$jrdNFxj5R7D%zAJNh~@Fl_AS{*%ZGFVdQ&MBb@0N0`w#{d8T delta 90 zcmXTOogfj)!N$PAu=3-)Iv~Ya;1OBOz`!jG!i)^F=12eq*-JcqUD@w&Nbs8}Y`wkZ mC{T#U)5S4_<9c$!0vRCBg@KXnK=>jci^0>?&t;ucLK6VRs}=wN diff --git a/mods/pipeworks/textures/pipeworks_valvebody_bottom.png b/mods/pipeworks/textures/pipeworks_valvebody_bottom.png index 05f20e37dbc285a7895eb25efc037342830fb796..43d30d58af4fb2d50fc74eed9a5e3d9336aadb55 100644 GIT binary patch literal 2914 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 M07*qoM6N<$g7gf;$^ZZW literal 5321 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 diff --git a/mods/pipeworks/textures/pipeworks_valvebody_ends.png b/mods/pipeworks/textures/pipeworks_valvebody_ends.png index 2bc3ecbd730ff4697034cc5084489b1a6361cdd6..69a615f8d5d69eee1d938513934715b895019590 100644 GIT binary patch literal 3562 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 literal 6138 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 diff --git a/mods/pipeworks/textures/pipeworks_valvebody_top_on.png b/mods/pipeworks/textures/pipeworks_valvebody_top_on.png index e36eb94a2e31443c0b0bf6b89f8ef86baa483341..320c7e48b1d5e4ed8c54b2fc647cbd1769731142 100644 GIT binary patch literal 3539 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 diff --git a/mods/pipeworks/textures/pipeworks_windowed_empty.png b/mods/pipeworks/textures/pipeworks_windowed_empty.png index 0d5a3dd69ad3b16feaee6c8d76d1c09e376df8fb..3b64478865430fa10593f02ef07ca16dcd8f7af7 100644 GIT binary patch delta 372 zcmV-)0gL|b0)zvQ8Gi!+001a04^sdD00d`2O+f$vv5yP3Tgi;74|NCgE2l$4a9prA7|GmVXoEG#UUnVE-&hn1C-nwpxXrKX>spNNQvo}HeH zii(w#l-b(ai;Ihjii-UF{HCU*xVX6g|NqI!$@}~Jii?YumVcIui;9($mD<|c+1c6i z^Yg#Iznz_(>+9>TuCC(Z;)aHXz`($ajEt|ZuhG%b$jHc^o}QJJmAALIrlzJ8J9F>= z005IoL_t&-(^bw{5`r)g1kiThcLfC`E*QiRAmsjcGs&pn=c}&i9)!mv&2B{`0@Dxqx(iJ4ShN2ko0Zat8Xx_B*FA?lpOufd2dW40x*3a`*-qQzx$l SCL{;|0000^k zWD)drW`S7+Rb8Fn9gYbx%`$rrQv*qmMDg*?D_p69N~r4V1bf&y2j?8xwuOkGG6kv7 zaRZXe8q9Id8BNpR^n1ePd;tKEgiD9z4rI}eN*k6 zGeiU=QP(xfvRB+-RYkGas-L2OnZe9C>k#Te@uO)G6)l?bD`Cn>Tk}cURZcDN}CVy4BqcWOhxM zFk#M|IWuO=`19w_vSmwm?AY=D|NoOGPyYV>y9=nI8>o2dty{Nl-n{ww^XL8h_s^X> z_x0=7>(;G%^ytxn0|$C~dfM9B)~{cG@#4i3Cr-?pH*f0HsoS@2U$$%+&_&9gw|@dD z{gNQRV4$%i0EVcg7T<=I6Wz|2O_UXWAp495?;L i|Gzaybp&Qu{ANh*Qd)I>Zf^?EWelFKelF{r5}E)Hz~{yQ delta 331 zcmV-R0kr}kPrKqbnXBE002ovPDHLkV1l>Bj>7-| diff --git a/mods/pipeworks/textures/pipeworks_yellow.png b/mods/pipeworks/textures/pipeworks_yellow.png index e6672bde70e084009a751df1642de05d4da43b17..44ea445ab34af3f4cb3715985464e8182f22eda6 100644 GIT binary patch delta 82 zcmZ3$m@+}ahmo0qfkD+aR|!b5q&xaLGB9lH=l+w(3gj~f_=LFre=V@{zHteV%j4i_@% delta 143 zcmYdUz&Jsoo`Z>jfnmbL3^O3bS>O>_%)r1c48n{Iv*t(u1=&kHeO=k_G71QDh;GST zu>~k3S>hT|;+&tGo0?a`;9QiNSdyBeP@Y+mq2TW68xY>eCk|93<>}%WqH#X?&;O`~ nMv((Y9F!!k8mvluk-@-V&&njVxoL$9$VvuJS3j3^P6