From e9e55275167daa600419884948c52a6fb1e2f85a Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Mon, 10 Jan 2022 21:39:36 +0100 Subject: [PATCH] Add TA5 heat exchanger for the FR --- basis/liquid_lib.lua | 2 +- fusion_reactor/controller.lua | 164 ++++++++--- fusion_reactor/gas_pipe.lua | 161 +++++++++-- fusion_reactor/generator.lua | 130 +++++++++ fusion_reactor/heatexchanger1.lua | 110 ++++++++ fusion_reactor/heatexchanger2.lua | 339 +++++++++++++++++++++++ fusion_reactor/heatexchanger3.lua | 107 +++++++ fusion_reactor/magnet.lua | 165 +++-------- fusion_reactor/plasma.lua | 73 ----- fusion_reactor/shell.lua | 23 +- fusion_reactor/turbine.lua | 167 +++++++++++ init.lua | 13 +- items/registered_nodes.lua | 26 ++ liquids/liquid_pipe.lua | 8 +- liquids/pump.lua | 12 +- liquids/tank.lua | 4 +- textures/shrink.sh | 2 +- textures/techage_appl_hole_ta5_pipe.png | Bin 120 -> 0 bytes textures/techage_appl_hole_ta5_pipe1.png | Bin 0 -> 134 bytes textures/techage_appl_hole_ta5_pipe2.png | Bin 0 -> 134 bytes textures/techage_appl_plasma.png | Bin 0 -> 135 bytes textures/techage_appl_plasma4.png | Bin 0 -> 706 bytes textures/techage_frame4_ta5.png | Bin 0 -> 185 bytes textures/techage_frame8_ta5.png | Bin 0 -> 204 bytes textures/techage_frameT_ta5.png | Bin 0 -> 157 bytes textures/techage_plasma1.png | Bin 602 -> 0 bytes textures/techage_plasma2.png | Bin 2626 -> 0 bytes textures/techage_reactor_shell.png | Bin 3257 -> 342 bytes textures/techage_steel_tiles.png | Bin 2625 -> 330 bytes textures/techage_steel_tiles_side.png | Bin 2638 -> 133 bytes textures/techage_steel_tiles_top.png | Bin 2634 -> 108 bytes textures/techage_steel_tiles_top2.png | Bin 2747 -> 141 bytes textures/techage_ta5_gaspipe.png | Bin 132 -> 119 bytes textures/techage_ta5_gaspipe_hole2.png | Bin 185 -> 160 bytes textures/techage_ta5_gaspipe_knee.png | Bin 193 -> 163 bytes textures/techage_ta5_gaspipe_knee2.png | Bin 175 -> 151 bytes tools/repairkit.lua | 22 +- 37 files changed, 1216 insertions(+), 312 deletions(-) create mode 100644 fusion_reactor/generator.lua create mode 100644 fusion_reactor/heatexchanger1.lua create mode 100644 fusion_reactor/heatexchanger2.lua create mode 100644 fusion_reactor/heatexchanger3.lua delete mode 100644 fusion_reactor/plasma.lua create mode 100644 fusion_reactor/turbine.lua delete mode 100644 textures/techage_appl_hole_ta5_pipe.png create mode 100644 textures/techage_appl_hole_ta5_pipe1.png create mode 100644 textures/techage_appl_hole_ta5_pipe2.png create mode 100644 textures/techage_appl_plasma.png create mode 100644 textures/techage_appl_plasma4.png create mode 100644 textures/techage_frame4_ta5.png create mode 100644 textures/techage_frame8_ta5.png create mode 100644 textures/techage_frameT_ta5.png delete mode 100644 textures/techage_plasma1.png delete mode 100644 textures/techage_plasma2.png diff --git a/basis/liquid_lib.lua b/basis/liquid_lib.lua index 25acfd3..34a7e37 100644 --- a/basis/liquid_lib.lua +++ b/basis/liquid_lib.lua @@ -190,7 +190,7 @@ local function fill_on_punch(nvm, empty_container, item_count, puncher) end local function legacy_items(full_container, item_count) - if full_container == "techage:hydrogen" then + if full_container == "techage:isobutane" then return {container = "", size = item_count, inv_item = full_container} elseif full_container == "techage:oil_source" then return {container = "", size = item_count, inv_item = full_container} diff --git a/fusion_reactor/controller.lua b/fusion_reactor/controller.lua index 0c8bc69..0c9b0e2 100644 --- a/fusion_reactor/controller.lua +++ b/fusion_reactor/controller.lua @@ -19,55 +19,108 @@ local M = minetest.get_meta local S = techage.S local Cable = techage.ElectricCable -local Pipe = techage.GasPipe local power = networks.power -local liquid = networks.liquid local control = networks.control -minetest.register_node("techage:ta5_fr_controller", { - description = "TA5 Fusion Reactor Controller", +local CYCLE_TIME = 2 +local STANDBY_TICKS = 3 +local COUNTDOWN_TICKS = 3 +local PWR_NEEDED = 4 + +local function concentrate(t) + local yes = 0 + local no = 0 + for _,v in ipairs(t) do + if v then + yes = yes + 1 + else + no = no + 1 + end + end + return yes .. " yes, " .. no .. " no" +end + +local function nucleus(t) + if #t == 4 then + if vector.equals(t[1], t[2]) and vector.equals(t[3], t[4]) then + return "ok" + end + end + return "error" + +end + +local Commands = { + function(pos, outdir) + local resp = control.request(pos, Cable, outdir, "con", "test_plasma") + return "test_plasma: " .. concentrate(resp) + end, + function(pos, outdir) + local resp = control.request(pos, Cable, outdir, "con", "test_shell") + return "test_shell: " .. concentrate(resp) + end, + function(pos, outdir) + local resp = control.request(pos, Cable, outdir, "con", "test_gas") + return "test_gas: " .. concentrate(resp) + end, + function(pos, outdir) + local resp = control.request(pos, Cable, outdir, "con", "test_nucleus") + return "test_nucleus: " .. nucleus(resp) + end, + function(pos, outdir) + local resp = control.send(pos, Cable, outdir, "con", "on") + return "on " .. resp + end, + function(pos, outdir) + local resp = control.send(pos, Cable, outdir, "con", "off") + return "off " .. resp + end, +} + +local function after_place_node(pos, placer, itemstack) + local nvm = techage.get_nvm(pos) + local meta = M(pos) + local own_num = techage.add_node(pos, "techage:ta5_fr_controller_pas") + meta:set_string("node_number", own_num) + meta:set_string("owner", placer:get_player_name()) + meta:set_string("infotext", S("TA5 Fusion Reactor Controller") .. " " .. own_num) + minetest.get_node_timer(pos):start(CYCLE_TIME) + Cable:after_place_node(pos) +end + +local function node_timer(pos) + local nvm = techage.get_nvm(pos) + local outdir = networks.side_to_outdir(pos, "L") + nvm.consumed = power.consume_power(pos, Cable, outdir, 1) + + local mem = techage.get_mem(pos) + mem.idx = ((mem.idx or 0) % #Commands) + 1 + outdir = networks.Flip[outdir] + local res = Commands[mem.idx](pos, outdir) + print(res) + return true +end + +local function after_dig_node(pos, oldnode, oldmetadata) + Cable:after_dig_node(pos) + techage.remove_node(pos, oldnode, oldmetadata) + techage.del_mem(pos) +end + +minetest.register_node("techage:ta5_fr_controller_pas", { + description = S("TA5 Fusion Reactor Controller"), tiles = { -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta5_top.png", + "techage_filling_ta4.png^techage_frame_ta5_top.png^techage_appl_arrow.png", "techage_filling_ta4.png^techage_frame_ta4_bottom.png", "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_hole_electric.png", "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_hole_electric.png", "techage_filling_ta4.png^techage_frame_ta5.png", - "techage_filling_ta4.png^techage_frame_ta5.png", + "techage_filling_ta4.png^techage_appl_plasma.png^techage_frame_ta5.png", }, - after_place_node = function(pos, placer, itemstack) - minetest.get_node_timer(pos):start(2) - Cable:after_place_node(pos) - end, - on_timer = function(pos) - local node = minetest.get_node(pos) or {} - local outdir = networks.side_to_outdir(pos, "R") - local mem = techage.get_mem(pos) - mem.idx = ((mem.idx or 0) + 1) % 4 - local cmnd = ({[0]= "test_plasma", "test_shell", "on", "off"})[mem.idx] - if mem.idx <= 1 then - local resp = control.request( - pos, - Cable, - outdir, - "con", - cmnd) - print(dump(resp)) - else - local resp = control.send( - pos, - Cable, - outdir, - "con", - cmnd) - print(dump(resp)) - end - return true - end, - after_dig_node = function(pos, oldnode) - Cable:after_dig_node(pos) - techage.del_mem(pos) - end, + after_place_node = after_place_node, + on_timer = node_timer, + after_dig_node = after_dig_node, drawtype = "nodebox", paramtype2 = "facedir", groups = {choppy=2, cracky=2, crumbly=2}, @@ -75,4 +128,35 @@ minetest.register_node("techage:ta5_fr_controller", { sounds = default.node_sound_metal_defaults(), }) -power.register_nodes({"techage:ta5_fr_controller"}, Cable, "con", {"L", "R"}) \ No newline at end of file +minetest.register_node("techage:ta5_fr_controller_act", { + description = S("TA5 Fusion Reactor Controller"), + tiles = { + -- up, down, right, left, back, front + "techage_filling_ta4.png^techage_frame_ta5_top.png^techage_appl_arrow.png", + "techage_filling_ta4.png^techage_frame_ta4_bottom.png", + "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_hole_electric.png", + "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_hole_electric.png", + "techage_filling_ta4.png^techage_frame_ta5.png", + { + image = "techage_filling4_ta4.png^techage_appl_plasma4.png^techage_frame4_ta5.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 64, + aspect_h = 64, + length = 0.5, + }, + }, + }, + after_place_node = after_place_node, + on_timer = node_timer, + after_dig_node = after_dig_node, + drawtype = "nodebox", + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +power.register_nodes({"techage:ta5_fr_controller_pas", "techage:ta5_fr_controller_act"}, Cable, "con", {"L", "R"}) + diff --git a/fusion_reactor/gas_pipe.lua b/fusion_reactor/gas_pipe.lua index 2f11245..9f681e0 100644 --- a/fusion_reactor/gas_pipe.lua +++ b/fusion_reactor/gas_pipe.lua @@ -20,7 +20,7 @@ local S = techage.S local MAX_PIPE_LENGHT = 100 -local power = networks.power +local liquid = networks.liquid local Pipe = tubelib2.Tube:new({ dirs_to_check = {1,2,3,4,5,6}, @@ -29,13 +29,19 @@ local Pipe = tubelib2.Tube:new({ force_to_use_tubes = false, tube_type = "pipe3", primary_node_names = { - "techage:ta5_pipeS", "techage:ta5_pipeA", + "techage:ta5_pipe1S", "techage:ta5_pipe1A", + "techage:ta5_pipe2S", "techage:ta5_pipe2A", }, secondary_node_names = {}, after_place_tube = function(pos, param2, tube_type, num_tubes) local name = minetest.get_node(pos).name if not networks.hidden_name(pos) then - minetest.swap_node(pos, {name = "techage:ta5_pipe"..tube_type, param2 = param2 % 32}) + local name = minetest.get_node(pos).name + if name == "techage:ta5_pipe1S" or name == "techage:ta5_pipe1A" then + minetest.swap_node(pos, {name = "techage:ta5_pipe1"..tube_type, param2 = param2 % 32}) + else + minetest.swap_node(pos, {name = "techage:ta5_pipe2"..tube_type, param2 = param2 % 32}) + end end M(pos):set_int("netw_param2", param2) end, @@ -46,18 +52,18 @@ networks.use_metadata(Pipe) -- Use global callback instead of node related functions Pipe:register_on_tube_update2(function(pos, outdir, tlib2, node) - power.update_network(pos, outdir, tlib2, node) + liquid.update_network(pos, outdir, tlib2, node) end) -minetest.register_node("techage:ta5_pipeS", { +minetest.register_node("techage:ta5_pipe1S", { description = S("TA5 Pipe"), tiles = { - "techage_ta5_gaspipe.png^[transformR90", - "techage_ta5_gaspipe.png^[transformR90", - "techage_ta5_gaspipe.png", - "techage_ta5_gaspipe.png", - "techage_ta5_gaspipe_hole2.png", - "techage_ta5_gaspipe_hole2.png", + "techage_ta5_gaspipe.png^[transformR90^[colorize:#000080:160", + "techage_ta5_gaspipe.png^[transformR90^[colorize:#000080:160", + "techage_ta5_gaspipe.png^[colorize:#000080:160", + "techage_ta5_gaspipe.png^[colorize:#000080:160", + "techage_ta5_gaspipe_hole2.png^[colorize:#000080:160", + "techage_ta5_gaspipe_hole2.png^[colorize:#000080:160", }, after_place_node = function(pos, placer, itemstack, pointed_thing) @@ -89,15 +95,15 @@ minetest.register_node("techage:ta5_pipeS", { sounds = default.node_sound_metal_defaults(), }) -minetest.register_node("techage:ta5_pipeA", { +minetest.register_node("techage:ta5_pipe1A", { description = S("TA5 Pipe"), tiles = { - "techage_ta5_gaspipe_knee2.png", - "techage_ta5_gaspipe_hole2.png^[transformR180", - "techage_ta5_gaspipe_knee.png^[transformR270", - "techage_ta5_gaspipe_knee.png", - "techage_ta5_gaspipe_knee2.png", - "techage_ta5_gaspipe_hole2.png", + "techage_ta5_gaspipe_knee2.png^[colorize:#000080:160", + "techage_ta5_gaspipe_hole2.png^[transformR180^[colorize:#000080:160", + "techage_ta5_gaspipe_knee.png^[transformR270^[colorize:#000080:160", + "techage_ta5_gaspipe_knee.png^[colorize:#000080:160", + "techage_ta5_gaspipe_knee2.png^[colorize:#000080:160", + "techage_ta5_gaspipe_hole2.png^[colorize:#000080:160", }, after_dig_node = function(pos, oldnode, oldmetadata, digger) @@ -123,7 +129,84 @@ minetest.register_node("techage:ta5_pipeA", { groups = {crumbly = 2, cracky = 2, snappy = 2, not_in_creative_inventory=1, techage_trowel = 1}, sounds = default.node_sound_metal_defaults(), - drop = "techage:ta5_pipeS", + drop = "techage:ta5_pipe1S", +}) + +minetest.register_node("techage:ta5_pipe2S", { + description = S("TA5 Pipe"), + tiles = { + "techage_ta5_gaspipe.png^[transformR90^[colorize:#008000:160", + "techage_ta5_gaspipe.png^[transformR90^[colorize:#008000:160", + "techage_ta5_gaspipe.png^[colorize:#008000:160", + "techage_ta5_gaspipe.png^[colorize:#008000:160", + "techage_ta5_gaspipe_hole2.png^[colorize:#008000:160", + "techage_ta5_gaspipe_hole2.png^[colorize:#008000:160", + }, + + after_place_node = function(pos, placer, itemstack, pointed_thing) + if not Pipe:after_place_tube(pos, placer, pointed_thing) then + minetest.remove_node(pos) + return true + end + return false + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + Pipe:after_dig_tube(pos, oldnode, oldmetadata) + end, + + paramtype2 = "facedir", -- important! + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-1/16, -1/16, -8/16, 1/16, 1/16, 8/16}, + }, + }, + on_rotate = screwdriver.disallow, -- important! + paramtype = "light", + use_texture_alpha = techage.CLIP, + sunlight_propagates = true, + is_ground_content = false, + groups = {crumbly = 2, cracky = 2, snappy = 2, techage_trowel = 1}, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("techage:ta5_pipe2A", { + description = S("TA5 Pipe"), + tiles = { + "techage_ta5_gaspipe_knee2.png^[colorize:#008000:160", + "techage_ta5_gaspipe_hole2.png^[transformR180^[colorize:#008000:160", + "techage_ta5_gaspipe_knee.png^[transformR270^[colorize:#008000:160", + "techage_ta5_gaspipe_knee.png^[colorize:#008000:160", + "techage_ta5_gaspipe_knee2.png^[colorize:#008000:160", + "techage_ta5_gaspipe_hole2.png^[colorize:#008000:160", + }, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + Pipe:after_dig_tube(pos, oldnode, oldmetadata) + end, + + paramtype2 = "facedir", -- important! + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-1/16, -8/16, -1/16, 1/16, 1/16, 1/16}, + {-2/16, -0.5, -2/16, 2/16, -13/32, 2/16}, + {-1/16, -1/16, -8/16, 1/16, 1/16, -1/16}, + {-2/16, -2/16, -0.5, 2/16, 2/16, -13/32}, + }, + }, + on_rotate = screwdriver.disallow, -- important! + paramtype = "light", + use_texture_alpha = techage.CLIP, + sunlight_propagates = true, + is_ground_content = false, + groups = {crumbly = 2, cracky = 2, snappy = 2, + not_in_creative_inventory=1, techage_trowel = 1}, + sounds = default.node_sound_metal_defaults(), + drop = "techage:ta5_pipe2S", }) local size1 = 1/16 @@ -139,7 +222,7 @@ local Boxes = { { size3, -size2, -size2, 0.5, size2, size2}, -- x+ }, { - {-size1, -size1, -0.5, size1, size1, size1}, -- z- 2d5627 + {-size1, -size1, -0.5, size1, size1, size1}, -- z- {-size2, -size2, -0.5, size2, size2, -size3}, -- z- }, { @@ -156,32 +239,58 @@ local Boxes = { } } -local names = networks.register_junction("techage:ta5_junctionpipe", 1/8, Boxes, Pipe, { +local names1 = networks.register_junction("techage:ta5_junctionpipe1", 1/8, Boxes, Pipe, { description = S("TA5 Junction Pipe"), - tiles = {"techage_ta5_gaspipe_junction.png"}, + tiles = {"techage_ta5_gaspipe_junction.png^[colorize:#000080:160"}, use_texture_alpha = techage.CLIP, is_ground_content = false, groups = {crumbly = 2, cracky = 2, snappy = 2, techage_trowel = 1}, sounds = default.node_sound_metal_defaults(), after_place_node = function(pos, placer, itemstack, pointed_thing) - local name = "techage:ta5_junctionpipe" .. networks.junction_type(pos, Pipe) + local name = "techage:ta5_junctionpipe1" .. networks.junction_type(pos, Pipe) minetest.swap_node(pos, {name = name, param2 = 0}) Pipe:after_place_node(pos) end, tubelib2_on_update2 = function(pos, dir1, tlib2, node) if not networks.hidden_name(pos) then - local name = "techage:ta5_junctionpipe" .. networks.junction_type(pos, Pipe) + local name = "techage:ta5_junctionpipe1" .. networks.junction_type(pos, Pipe) minetest.swap_node(pos, {name = name, param2 = 0}) end - power.update_network(pos, 0, tlib2, node) + liquid.update_network(pos, 0, tlib2, node) end, after_dig_node = function(pos, oldnode, oldmetadata, digger) Pipe:after_dig_node(pos) end, }, 25) -power.register_nodes(names, Pipe, "junc") +local names2 = networks.register_junction("techage:ta5_junctionpipe2", 1/8, Boxes, Pipe, { + description = S("TA5 Junction Pipe"), + tiles = {"techage_ta5_gaspipe_junction.png^[colorize:#008000:160"}, + use_texture_alpha = techage.CLIP, + is_ground_content = false, + groups = {crumbly = 2, cracky = 2, snappy = 2, techage_trowel = 1}, + sounds = default.node_sound_metal_defaults(), + + after_place_node = function(pos, placer, itemstack, pointed_thing) + local name = "techage:ta5_junctionpipe2" .. networks.junction_type(pos, Pipe) + minetest.swap_node(pos, {name = name, param2 = 0}) + Pipe:after_place_node(pos) + end, + tubelib2_on_update2 = function(pos, dir1, tlib2, node) + if not networks.hidden_name(pos) then + local name = "techage:ta5_junctionpipe2" .. networks.junction_type(pos, Pipe) + minetest.swap_node(pos, {name = name, param2 = 0}) + end + liquid.update_network(pos, 0, tlib2, node) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + Pipe:after_dig_node(pos) + end, +}, 25) + +liquid.register_nodes(names1, Pipe, "junc") +liquid.register_nodes(names2, Pipe, "junc") --minetest.register_craft({ -- output = "techage:ta3_junctionpipe25 2", diff --git a/fusion_reactor/generator.lua b/fusion_reactor/generator.lua new file mode 100644 index 0000000..4621661 --- /dev/null +++ b/fusion_reactor/generator.lua @@ -0,0 +1,130 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2021 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + TA4 TES Generator (dummy) + - can be started and stopped + - provides netID of cable network +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local S = techage.S + +local Cable = techage.ElectricCable +local power = networks.power + +local function swap_node(pos, name) + local node = techage.get_node_lvm(pos) + if node.name == name then + return + end + node.name = name + minetest.swap_node(pos, node) +end + +minetest.register_node("techage:ta4_generator", { + description = S("TA4 Generator"), + tiles = { + -- up, down, right, left, back, front + "techage_filling_ta4.png^techage_frame_ta4_top.png", + "techage_filling_ta4.png^techage_frame_ta4.png", + "techage_filling_ta4.png^techage_appl_hole_electric.png^techage_frame_ta4.png", + "techage_filling_ta4.png^techage_appl_open.png^techage_frame_ta4.png", + "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_generator.png", + "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_generator.png^[transformFX]", + }, + + after_place_node = function(pos) + M(pos):set_int("outdir", networks.side_to_outdir(pos, "R")) + Cable:after_place_node(pos) + end, + after_dig_node = function(pos, oldnode) + Cable:after_dig_node(pos) + techage.del_mem(pos) + end, + + paramtype2 = "facedir", + groups = {cracky=2, crumbly=2, choppy=2}, + on_rotate = screwdriver.disallow, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("techage:ta4_generator_on", { + description = S("TA4 Generator"), + tiles = { + -- up, down, right, left, back, front + "techage_filling_ta4.png^techage_frame_ta4_top.png", + "techage_filling_ta4.png^techage_frame_ta4.png", + "techage_filling_ta4.png^techage_appl_hole_electric.png^techage_frame_ta4.png", + "techage_filling_ta4.png^techage_appl_open.png^techage_frame_ta4.png", + { + image = "techage_filling4_ta4.png^techage_appl_generator4.png^techage_frame4_ta4.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 0.3, + }, + }, + { + image = "techage_filling4_ta4.png^techage_appl_generator4.png^[transformFX]^techage_frame4_ta4.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 0.3, + }, + }, + }, + + paramtype2 = "facedir", + drop = "", + groups = {not_in_creative_inventory=1}, + diggable = false, + on_rotate = screwdriver.disallow, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +-- The generator is a dummy, it only has to network connection to check the netID +power.register_nodes({"techage:ta4_generator", "techage:ta4_generator_on"}, Cable, "con", {"R"}) + +-- controlled by the turbine +techage.register_node({"techage:ta4_generator", "techage:ta4_generator_on"}, { + on_transfer = function(pos, in_dir, topic, payload) + if topic == "netID" then + local outdir = M(pos):get_int("outdir") + return networks.determine_netID(pos, Cable, outdir) + elseif topic == "start" then + swap_node(pos, "techage:ta4_generator_on") + elseif topic == "stop" then + swap_node(pos, "techage:ta4_generator") + end + end, + on_recv_message = function(pos, src, topic, payload) + return "unsupported" + end, + on_node_load = function(pos) + -- remove legacy formspec + M(pos):set_string("formspec", "") + end, +}) + +minetest.register_craft({ + output = "techage:ta4_generator", + recipe = { + {"", "dye:blue", ""}, + {"", "techage:generator", ""}, + {"", "techage:ta4_wlanchip", ""}, + }, +}) diff --git a/fusion_reactor/heatexchanger1.lua b/fusion_reactor/heatexchanger1.lua new file mode 100644 index 0000000..c6ca697 --- /dev/null +++ b/fusion_reactor/heatexchanger1.lua @@ -0,0 +1,110 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2022 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + TA5 Heat Exchanger1 (bottom part) + - has a connection to storage and turbine (via pipes) + - acts as a cable junction for Exchanger2 +]]-- + +-- for lazy programmers +local S2P = minetest.string_to_pos +local P2S = minetest.pos_to_string +local M = minetest.get_meta +local S = techage.S + +local Cable = techage.ElectricCable +local Pipe2 = techage.LiquidPipe +local Pipe3 = techage.GasPipe +local power = networks.power +local liquid = networks.liquid +local control = networks.control + +local function turbine_cmnd(pos, topic, payload) + return techage.transfer(pos, "R", topic, payload, Pipe2, + {"techage:ta5_turbine", "techage:ta5_turbine_on"}) +end + +-- Send to the magnets +local function control_cmnd(pos, topic) + local outdir = networks.side_to_outdir(pos, "L") + print("control_cmnd1", outdir, "tank", topic) + return control.request(pos, Pipe3, outdir, "tank", topic) +end + +minetest.register_node("techage:ta5_heatexchanger1", { + description = S("TA5 Heat Exchanger 1"), + tiles = { + -- up, down, right, left, back, front + "techage_hole_ta4.png^techage_appl_arrow_white.png", + "techage_filling_ta4.png^techage_frame_ta4.png", + "techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_pipe.png", + "techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_ta5_pipe2.png", + "techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_electric.png", + "techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_electric.png", + }, + + after_place_node = function(pos, placer, itemstack, pointed_thing) + Cable:after_place_node(pos) + Pipe2:after_place_node(pos) + Pipe3:after_place_node(pos) + end, + tubelib2_on_update2 = function(pos, outdir, tlib2, node) + if tlib2 == Cable then + power.update_network(pos, 0, Cable, node) -- junction!!! + elseif tlib2 == Pipe2 then + power.update_network(pos, outdir, Pipe2, node) + else + power.update_network(pos, outdir, Pipe3, node) + end + end, + can_dig = function(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + pos.y = pos.y + 1 + return minetest.get_node(pos).name ~= "techage:ta5_heatexchanger2" + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + Cable:after_dig_node(pos) + Pipe2:after_dig_node(pos) + Pipe3:after_dig_node(pos) + end, + paramtype2 = "facedir", + groups = {crumbly = 2, cracky = 2, snappy = 2}, + on_rotate = screwdriver.disallow, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +liquid.register_nodes({"techage:ta5_heatexchanger1"}, Pipe2, "tank", {"R"}, {}) +liquid.register_nodes({"techage:ta5_heatexchanger1"}, Pipe3, "tank", {"L"}, {}) +power.register_nodes({"techage:ta5_heatexchanger1"}, Cable, "junc", {"F", "B", "U"}) + +-- command interface +techage.register_node({"techage:ta5_heatexchanger1"}, { + on_transfer = function(pos, indir, topic, payload) + local nvm = techage.get_nvm(pos) + -- used by heatexchanger2 + if topic == "test_gas_blue" then + return control_cmnd(pos, topic) + else + return turbine_cmnd(pos, topic, payload) + end + end, +}) + +--minetest.register_craft({ +-- output = "techage:ta5_heatexchanger1", +-- recipe = { +-- {"default:tin_ingot", "techage:electric_cableS", "default:steel_ingot"}, +-- {"techage:ta4_pipeS", "basic_materials:gear_steel", "techage:ta4_pipeS"}, +-- {"", "techage:baborium_ingot", ""}, +-- }, +--}) diff --git a/fusion_reactor/heatexchanger2.lua b/fusion_reactor/heatexchanger2.lua new file mode 100644 index 0000000..390738b --- /dev/null +++ b/fusion_reactor/heatexchanger2.lua @@ -0,0 +1,339 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2022 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + TA5 Heat Exchanger2 (middle part) + +]]-- + +-- for lazy programmers +local S2P = minetest.string_to_pos +local P2S = minetest.pos_to_string +local M = minetest.get_meta +local S = techage.S + +local Cable = techage.ElectricCable +local power = networks.power +local control = networks.control + +local CYCLE_TIME = 2 +local PWR_NEEDED = 5 +local DOWN = 5 -- dir +local DESCRIPTION = S("TA5 Heat Exchanger") +local EXPECT_BLUE = 56 +local EXPECT_GREEN = 52 + +local function heatexchanger1_cmnd(pos, topic, payload) + return techage.transfer({x = pos.x, y = pos.y - 1, z = pos.z}, + nil, topic, payload, nil, + {"techage:ta5_heatexchanger1"}) +end + +local function heatexchanger3_cmnd(pos, topic, payload) + return techage.transfer({x = pos.x, y = pos.y + 1, z = pos.z}, + nil, topic, payload, nil, + {"techage:ta5_heatexchanger3"}) +end + +local function swap_node(pos, name) + local node = techage.get_node_lvm(pos) + if node.name == name then + return + end + node.name = name + minetest.swap_node(pos, node) +end + +local function play_sound(pos) + local mem = techage.get_mem(pos) + if not mem.handle or mem.handle == -1 then + mem.handle = minetest.sound_play("techage_booster", { + pos = pos, + gain = 0.3, + max_hear_distance = 10, + loop = true}) + if mem.handle == -1 then + minetest.after(1, play_sound, pos) + end + end +end + +local function stop_sound(pos) + local mem = techage.get_mem(pos) + if mem.handle then + minetest.sound_stop(mem.handle) + mem.handle = nil + end +end + +local function concentrate(t) + local cnt = 0 + for _,v in ipairs(t) do + if v then + cnt = cnt + 1 + end + end + return cnt +end + +local CheckCommands = { + function(pos) + if not power.power_available(pos, Cable, DOWN) then + return S("No power") + end + return true + end, + function(pos) + local resp = heatexchanger1_cmnd(pos, "test_gas_blue") + local cnt = concentrate(resp) + if cnt ~= EXPECT_BLUE then + return S("Blue pipe error (@1/@2)", cnt, EXPECT_BLUE) + end + return true + end, + function(pos) + local resp = heatexchanger3_cmnd(pos, "test_gas_green") + local cnt = concentrate(resp) + if cnt ~= EXPECT_GREEN then + return S("Green pipe error (@1/@2)", cnt, EXPECT_GREEN) + end + return true + end, + function(pos) + if not heatexchanger1_cmnd(pos, "turbine") then + return S("Turbine error") + end + return true + end, + function(pos) + if not heatexchanger3_cmnd(pos, "turbine") then + return S("Cooler error") + end + return true + end, +} + +local function can_start(pos, nvm) + for _,item in ipairs(CheckCommands) do + local res = item(pos) + if res ~= true then return res end + end + return true +end + +local function start_node(pos, nvm) + play_sound(pos) + nvm.ticks = 0 + heatexchanger1_cmnd(pos, "start") +end + +local function stop_node(pos, nvm) + stop_sound(pos) + heatexchanger1_cmnd(pos, "stop") +end + +local function formspec(self, pos, nvm) + return "size[4,2]".. + "box[0,-0.1;3.8,0.5;#c6e8ff]" .. + "label[0.2,-0.1;" .. minetest.colorize( "#000000", DESCRIPTION) .. "]" .. + "image_button[1.5,1;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. + "tooltip[1.5,1;1,1;"..self:get_state_tooltip(nvm).."]" +end + +local function check_integrity(pos, nvm) + -- Check every 30 sec + nvm.ticks = ((nvm.ticks or 0) % 15) + 1 + if CheckCommands[nvm.ticks] then + local res = CheckCommands[nvm.ticks](pos) + if res ~= true then return res end + end + return true +end + +local State = techage.NodeStates:new({ + node_name_passive = "techage:ta5_heatexchanger2", + cycle_time = CYCLE_TIME, + infotext_name = DESCRIPTION, + standby_ticks = 0, + can_start = can_start, + start_node = start_node, + stop_node = stop_node, + formspec_func = formspec, +}) + +local function consume_power(pos, nvm) + if techage.needs_power(nvm) then + local taken = power.consume_power(pos, Cable, DOWN, PWR_NEEDED) + if techage.is_running(nvm) then + if taken < PWR_NEEDED then + State:nopower(pos, nvm, "No power") + stop_sound(pos) + heatexchanger1_cmnd(pos, "stop") + else + return true -- keep running + end + end + end +end + +local function node_timer(pos, elapsed) + print("node_timer") + local nvm = techage.get_nvm(pos) + consume_power(pos, nvm) + local res = check_integrity(pos, nvm) + if res ~= true then + State:fault(pos, nvm, res) + stop_sound(pos) + heatexchanger1_cmnd(pos, "stop") + end + return State:is_active(nvm) +end + +local function can_dig(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local nvm = techage.get_nvm(pos) + return not techage.is_running(nvm) +end + +local function on_rightclick(pos, node, clicker) + techage.set_activeformspec(pos, clicker) + local nvm = techage.get_nvm(pos) + M(pos):set_string("formspec", formspec(State, pos, nvm)) +end + +local function after_place_node(pos, placer) + if techage.orientate_node(pos, "techage:ta5_heatexchanger1") then + return true + end + local meta = M(pos) + local nvm = techage.get_nvm(pos) + local own_num = techage.add_node(pos, "techage:ta5_heatexchanger2") + meta:set_string("owner", placer:get_player_name()) + meta:set_string("infotext", DESCRIPTION..": "..own_num) + meta:set_string("formspec", formspec(State, pos, nvm)) + Cable:after_place_node(pos, {DOWN}) + State:node_init(pos, nvm, own_num) +end + +local function after_dig_node(pos, oldnode, oldmetadata, digger) + Cable:after_dig_node(pos) + techage.del_mem(pos) +end + +local function on_receive_fields(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + + local nvm = techage.get_nvm(pos) + State:state_button_event(pos, nvm, fields) + M(pos):set_string("formspec", formspec(State, pos, nvm)) +end + +-- Middle node with the formspec from the bottom node +minetest.register_node("techage:ta5_heatexchanger2", { + description = DESCRIPTION, + tiles = { + -- up, down, right, left, back, front + "techage_hole_ta4.png", + "techage_hole_ta4.png", + "techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_tes_turb.png", + "techage_filling_ta4.png^techage_frameM_ta4.png", + "techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_ribsB.png", + "techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_ribsB.png", + }, + + selection_box = { + type = "fixed", + fixed = {-1/2, -1.5/2, -1/2, 1/2, 1/2, 1/2}, + }, + + on_receive_fields = on_receive_fields, + on_rightclick = on_rightclick, + on_timer = node_timer, + after_place_node = after_place_node, + can_dig = can_dig, + after_dig_node = after_dig_node, + get_storage_data = get_storage_data, + + paramtype2 = "facedir", + groups = {crumbly = 2, cracky = 2, snappy = 2}, + on_rotate = screwdriver.disallow, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +power.register_nodes({"techage:ta5_heatexchanger2"}, Cable, "con", {"D"}) + +techage.register_node({"techage:ta5_heatexchanger2"}, { + on_recv_message = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == "state" then + if techage.is_running(nvm) then + return "running" + else + return "stopped" + end + elseif topic == "delivered" then + local data = power.get_network_data(pos, Cable, DOWN) + return data.consumed - data.provided + elseif topic == "on" then + start_node(pos, techage.get_nvm(pos)) + return true + elseif topic == "off" then + stop_node(pos, techage.get_nvm(pos)) + return true + else + return "unsupported" + end + end, + on_node_load = function(pos, node) + local nvm = techage.get_nvm(pos) + if techage.is_running(nvm) then + play_sound(pos) + else + stop_sound(pos) + end + -- Attempt to restart the system as the heat exchanger goes into error state + -- when parts of the storage block are unloaded. + if nvm.techage_state == techage.FAULT then + start_node(pos, nvm) + end + end, +}) + +control.register_nodes({"techage:ta5_heatexchanger2"}, { + on_receive = function(pos, tlib2, topic, payload) + end, + on_request = function(pos, tlib2, topic) + if topic == "info" then + local nvm = techage.get_nvm(pos) + return { + type = DESCRIPTION, + number = M(pos):get_string("node_number") or "", + running = techage.is_running(nvm) or false, + capa = nvm.capa_max or 1, + load = nvm.capa or 0, + } + end + return false + end, + } +) + +--minetest.register_craft({ +-- output = "techage:ta5_heatexchanger2", +-- recipe = { +-- {"default:tin_ingot", "", "default:steel_ingot"}, +-- {"", "techage:ta4_wlanchip", ""}, +-- {"", "techage:baborium_ingot", ""}, +-- }, +--}) diff --git a/fusion_reactor/heatexchanger3.lua b/fusion_reactor/heatexchanger3.lua new file mode 100644 index 0000000..b0d6ad4 --- /dev/null +++ b/fusion_reactor/heatexchanger3.lua @@ -0,0 +1,107 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2022 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + TA5 Heat Exchanger3 (top part) + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local S = techage.S + +local Pipe2 = techage.LiquidPipe +local Pipe3 = techage.GasPipe +local liquid = networks.liquid +local control = networks.control + +local function orientate_node(pos, name) + local node = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) + if node.name == name then + local param2 = node.param2 + node = minetest.get_node(pos) + node.param2 = param2 + minetest.swap_node(pos, node) + else + minetest.remove_node(pos) + return true + end +end + +local function after_place_node(pos) + if orientate_node(pos, "techage:ta5_heatexchanger2") then + return true + end + Pipe2:after_place_node(pos) + Pipe3:after_place_node(pos) +end + +local function after_dig_node(pos, oldnode) + Pipe2:after_dig_node(pos) + Pipe3:after_dig_node(pos) +end + +local function turbine_cmnd(pos, topic, payload) + return techage.transfer(pos, "R", topic, payload, Pipe2, + {"techage:ta5_turbine", "techage:ta5_turbine_on"}) +end + +-- Send to the magnets +local function control_cmnd(pos, topic) + local outdir = networks.side_to_outdir(pos, "L") + print("control_cmnd3", outdir, "tank", topic) + return control.request(pos, Pipe3, outdir, "tank", topic) +end + +minetest.register_node("techage:ta5_heatexchanger3", { + description = S("TA4 Heat Exchanger 3"), + tiles = { + -- up, down, right, left, back, front + "techage_filling_ta4.png^techage_frame_ta5_top.png", + "techage_hole_ta4.png", + "techage_filling_ta4.png^techage_frameT_ta5.png^techage_appl_hole_pipe.png", + "techage_filling_ta4.png^techage_frameT_ta5.png^techage_appl_hole_ta5_pipe1.png", + "techage_filling_ta4.png^techage_frameT_ta5.png^techage_appl_ribsT.png", + "techage_filling_ta4.png^techage_frameT_ta5.png^techage_appl_ribsT.png", + }, + + after_place_node = after_place_node, + after_dig_node = after_dig_node, + + paramtype2 = "facedir", + groups = {crumbly = 2, cracky = 2, snappy = 2}, + on_rotate = screwdriver.disallow, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +liquid.register_nodes({"techage:ta5_heatexchanger3"}, Pipe2, "tank", {"R"}, {}) +liquid.register_nodes({"techage:ta5_heatexchanger3"}, Pipe3, "tank", {"L"}, {}) + +-- command interface, used by heatexchanger2 +techage.register_node({"techage:ta5_heatexchanger3"}, { + on_transfer = function(pos, indir, topic, payload) + if topic == "turbine" then + return turbine_cmnd(pos, topic, payload) + else + return control_cmnd(pos, topic) + end + end, +}) + +--minetest.register_craft({ +-- output = "techage:ta5_heatexchanger3", +-- recipe = { +-- {"default:tin_ingot", "dye:blue", "default:steel_ingot"}, +-- {"techage:ta4_pipeS", "basic_materials:gear_steel", "techage:ta4_pipeS"}, +-- {"", "techage:baborium_ingot", ""}, +-- }, +--}) + +techage.orientate_node = orientate_node diff --git a/fusion_reactor/magnet.lua b/fusion_reactor/magnet.lua index 38f899b..83c1bb7 100644 --- a/fusion_reactor/magnet.lua +++ b/fusion_reactor/magnet.lua @@ -23,28 +23,17 @@ local Pipe = techage.GasPipe local power = networks.power local liquid = networks.liquid local control = networks.control -local tubelib2_get_pos = tubelib2.get_pos -local tubelib2_side_to_dir = tubelib2.side_to_dir -local CAPACITY = 20 -local SHELLBLOCKS = {"techage:ta5_fr_shell1", "techage:ta5_fr_shell2"} - -local function get_pos(pos, sides, param2) - local pos1 = {x = pos.x, y = pos.y, z = pos.z} - for side in sides:gmatch"." do - pos1 = tubelib2_get_pos(pos1, tubelib2_side_to_dir(side, param2)) - end - return pos1 -end +local SHELLBLOCKS = {"techage:ta5_fr_shell", "techage:ta5_fr_nucleus", "techage:ta5_magnet1", "techage:ta5_magnet2"} minetest.register_node("techage:ta5_magnet1", { description = S("TA5 Fusion Reactor Magnet 1"), tiles = { -- up, down, right, left, back, front - "techage_collider_magnet.png^techage_appl_hole_ta5_pipe.png^techage_steel_tiles_top.png^[transformR180]", - "techage_collider_magnet.png^techage_steel_tiles_top.png", + "techage_collider_magnet.png^techage_appl_hole_ta5_pipe1.png^techage_steel_tiles_top.png^[transformR180]", + "techage_collider_magnet.png^techage_appl_hole_ta5_pipe2.png^techage_steel_tiles_top.png", "techage_collider_magnet.png^techage_steel_tiles_side.png", - "techage_collider_magnet.png^techage_appl_hole_electric.png^techage_steel_tiles_side.png^[transformR180]", + "techage_collider_magnet.png^techage_steel_tiles_side.png^[transformR180]", "techage_collider_magnet.png^techage_appl_hole_electric.png", "techage_steel_tiles.png", }, @@ -75,11 +64,11 @@ minetest.register_node("techage:ta5_magnet2", { description = S("TA5 Fusion Reactor Magnet 2"), tiles = { -- up, down, right, left, back, front - "techage_collider_magnet.png^techage_appl_hole_ta5_pipe.png^techage_steel_tiles_top2.png^[transformR180]", - "techage_collider_magnet.png^techage_appl_hole_ta5_pipe.png^techage_steel_tiles_top2.png^[transformR270]", + "techage_collider_magnet.png^techage_appl_hole_ta5_pipe1.png^techage_steel_tiles_top2.png^[transformR180]", + "techage_collider_magnet.png^techage_appl_hole_ta5_pipe2.png^techage_steel_tiles_top2.png^[transformR270]", "techage_steel_tiles.png", - "techage_collider_magnet.png^techage_appl_hole_electric.png^techage_steel_tiles_side.png^[transformR180]", - "techage_collider_magnet.png^techage_appl_hole_electric.png^techage_steel_tiles_side.png", + "techage_collider_magnet.png^techage_steel_tiles_side.png^[transformR180]", + "techage_collider_magnet.png^techage_steel_tiles_side.png", "techage_steel_tiles.png", }, after_place_node = function(pos, placer, itemstack) @@ -105,142 +94,70 @@ minetest.register_node("techage:ta5_magnet2", { sounds = default.node_sound_metal_defaults(), }) -minetest.register_node("techage:ta5_magnet3", { - description = S("TA5 Fusion Reactor Magnet 3"), - drawtype = "nodebox", - tiles = { - -- up, down, right, left, back, front - "techage_collider_magnet.png^techage_appl_hole_ta5_pipe.png^techage_steel_tiles_top.png^[transformR180]", - "techage_collider_magnet.png^techage_steel_tiles_top.png", - "techage_collider_magnet.png^techage_appl_hole_electric.png^techage_steel_tiles_side.png", - "techage_collider_magnet.png^techage_appl_hole_electric.png^techage_steel_tiles_side.png^[transformR180]", - "techage_magnet_hole.png", - "techage_steel_tiles.png", - }, - node_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, -8/16, 8/16, 8/16, 2/16}, - {-8/16, -8/16, 2/16, -2/16, 8/16, 8/16}, - { 2/16, -8/16, 2/16, 8/16, 8/16, 8/16}, - {-8/16, -8/16, 2/16, 8/16, -2/16, 8/16}, - {-8/16, 2/16, 2/16, 8/16, 8/16, 8/16}, - }, - }, - selection_box = { - type = "fixed", - fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, - }, - after_place_node = function(pos, placer, itemstack) - Pipe:after_place_node(pos) - Cable:after_place_node(pos) - end, - ta_rotate_node = function(pos, node, new_param2) - Pipe:after_dig_node(pos) - Cable:after_dig_node(pos) - minetest.swap_node(pos, {name = node.name, param2 = new_param2}) - Pipe:after_place_node(pos) - Cable:after_place_node(pos) - end, - after_dig_node = function(pos, oldnode) - Pipe:after_dig_node(pos) - Cable:after_dig_node(pos) - techage.del_mem(pos) - end, - drawtype = "nodebox", - paramtype2 = "facedir", - paramtype = "light", - use_texture_alpha = "blend", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -power.register_nodes({"techage:ta5_magnet1", "techage:ta5_magnet2"}, Cable, "con", {"L", "B"}) -power.register_nodes({"techage:ta5_magnet3"}, Cable, "con", {"L", "R"}) -liquid.register_nodes({"techage:ta5_magnet1", "techage:ta5_magnet2", "techage:ta5_magnet3"}, Pipe, "tank", {"U"}, { - capa = CAPACITY, - peek = function(pos, indir) - local nvm = techage.get_nvm(pos) - return liquid.srv_peek(nvm) - end, - put = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - return liquid.srv_put(nvm, name, amount, CAPACITY) - end, - take = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - return liquid.srv_take(nvm, name, amount) - end, - untake = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - liquid.srv_put(nvm, name, amount, CAPACITY) - end, -}) +power.register_nodes({"techage:ta5_magnet1"}, Cable, "con", {"B"}) +liquid.register_nodes({"techage:ta5_magnet1", "techage:ta5_magnet2"}, Pipe, "tank", {"U", "D"}, {}) local function check_plasma(pos, param2) - local pos1 = get_pos(pos, "F", param2) + local pos1 = networks.get_relpos(pos, "F", param2) local node = minetest.get_node(pos1) or {} - techage.mark_position("singleplayer", pos1, "pos1", nil, 2) - return node.name == "techage:plasma1" or node.name == "techage:plasma2" + --techage.mark_position("singleplayer", pos1, "pos1", nil, 2) + return node.name == "air" end local function swap_plasma(pos, name, param2) - local pos1 = get_pos(pos, "F", param2) + local pos1 = networks.get_relpos(pos, "F", param2) minetest.swap_node(pos1, {name = name, param2 = param2}) end -local function check_steel(pos, param2) - local pos1 = get_pos(pos, "D", param2) - local pos2 = get_pos(pos, "BU", param2) +local function check_shell(pos, param2) + local pos1 = networks.get_relpos(pos, "D", param2) + local pos2 = networks.get_relpos(pos, "BU", param2) local _,t = minetest.find_nodes_in_area(pos1, pos2, SHELLBLOCKS) local cnt = 0 for k,v in pairs(t) do cnt = cnt + v end - print("shell", cnt) - return cnt == 5 + return cnt == 6 end -local function on_receive(pos, tlib2, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "on" then - nvm.running = true - elseif topic == "off" then - nvm.running = false +local function check_nucleus(pos, param2) + local pos1 = networks.get_relpos(pos, "B", param2) + local node = minetest.get_node(pos1) or {} + if node.name == "techage:ta5_fr_nucleus" then + return pos1 end end -local function on_receive3(pos, tlib2, topic, payload) +local function on_receive(pos, tlib2, topic, payload) + --print("on_receive", topic) local nvm = techage.get_nvm(pos) if topic == "on" then nvm.running = true - local node = minetest.get_node(pos) or {} - swap_plasma(pos, "techage:plasma2", node.param2) elseif topic == "off" then nvm.running = false - local node = minetest.get_node(pos) or {} - swap_plasma(pos, "techage:plasma1", node.param2) end end local function on_request(pos, tlib2, topic) + --print("on_request", topic) local nvm = techage.get_nvm(pos) - if topic == "state" then - if not nvm.liquid or not nvm.liquid.amount or nvm.liquid.amount < CAPACITY then - return false, "no gas" - elseif nvm.liquid.name ~= "techage:isobutane" then - return false, "wrong gas" - elseif nvm.running then - return false, "stopped" - end - return true, "running" + if topic == "test_power" and tlib2 == Cable then + return true + elseif topic == "test_gas_blue" and tlib2 == Pipe then + nvm.gas_cnt = 1 + return true + elseif topic == "test_gas_green" and tlib2 == Pipe then + nvm.gas_cnt = (nvm.gas_cnt or 0) - 1 + return nvm.gas_cnt == 0 elseif topic == "test_plasma" then local node = minetest.get_node(pos) or {} return check_plasma(pos, node.param2) elseif topic == "test_shell" then local node = minetest.get_node(pos) or {} - return check_steel(pos, node.param2) + return check_shell(pos, node.param2) + elseif topic == "test_nucleus" then + local node = minetest.get_node(pos) or {} + return check_nucleus(pos, node.param2) end return false end @@ -250,9 +167,3 @@ control.register_nodes({"techage:ta5_magnet1", "techage:ta5_magnet2"}, { on_request = on_request, } ) - -control.register_nodes({"techage:ta5_magnet3"}, { - on_receive = on_receive3, - on_request = on_request, - } -) diff --git a/fusion_reactor/plasma.lua b/fusion_reactor/plasma.lua deleted file mode 100644 index 8f0ca57..0000000 --- a/fusion_reactor/plasma.lua +++ /dev/null @@ -1,73 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA5 Fusion Reactor Plasma - -]]-- - --- for lazy programmers -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S - -local MAGNETS = {"techage:ta5_magnet1", "techage:ta5_magnet2", "techage:ta5_magnet3"} - -minetest.register_node("techage:plasma2", { - description = "TA5 Plasma", - tiles = { - "techage_plasma1.png", - "techage_plasma1.png", - "techage_plasma1.png", - "techage_plasma1.png", - { - image = "techage_plasma2.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 64, - aspect_h = 64, - length = 0.5, - }, - }, - "techage_plasma1.png", - }, - node_box = { - type = "fixed", - fixed = { - {-8/16, -4/16, -4/16, 8/16, 4/16, 4/16}, - }, - }, - drawtype = "nodebox", - paramtype2 = "facedir", - paramtype = "light", - light_source = 14, - drop = "", - use_texture_alpha = "blend", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_node("techage:plasma1", { - description = "TA5 Plasma", - tiles = { - "techage_plasma1.png", - }, - drawtype = "nodebox", - paramtype2 = "facedir", - paramtype = "light", - light_source = 0, - drop = "", - use_texture_alpha = "blend", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) diff --git a/fusion_reactor/shell.lua b/fusion_reactor/shell.lua index e10f33d..d4fc26a 100644 --- a/fusion_reactor/shell.lua +++ b/fusion_reactor/shell.lua @@ -18,8 +18,8 @@ local P2S = minetest.pos_to_string local M = minetest.get_meta local S = techage.S -minetest.register_node("techage:ta5_fr_shell1", { - description = "TA5 Fusion Reactor Shell 1", +minetest.register_node("techage:ta5_fr_shell", { + description = "TA5 Fusion Reactor Shell", tiles = { "techage_reactor_shell.png", }, @@ -32,23 +32,10 @@ minetest.register_node("techage:ta5_fr_shell1", { sounds = default.node_sound_metal_defaults(), }) -minetest.register_node("techage:ta5_fr_shell2", { - description = "TA5 Fusion Reactor Shell 2", +minetest.register_node("techage:ta5_fr_nucleus", { + description = "TA5 Fusion Reactor Nucleus", tiles = { - "techage_reactor_shell.png", - }, - node_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, -8/16, -2/16, 8/16, 8/16}, - { 2/16, -8/16, -8/16, 8/16, 8/16, 8/16}, - {-8/16, -8/16, -8/16, 8/16, -2/16, 8/16}, - {-8/16, 2/16, -8/16, 8/16, 8/16, 8/16}, - }, - }, - selection_box = { - type = "fixed", - fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + "techage_reactor_shell.png^techage_collider_detector_core.png", }, drawtype = "nodebox", paramtype2 = "facedir", diff --git a/fusion_reactor/turbine.lua b/fusion_reactor/turbine.lua new file mode 100644 index 0000000..26afdec --- /dev/null +++ b/fusion_reactor/turbine.lua @@ -0,0 +1,167 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2022 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + TA5 Gas Turbine + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local S = techage.S + +local Pipe = techage.LiquidPipe + +local function generator_cmnd(pos, topic, payload) + return techage.transfer(pos, "R", topic, payload, nil, + {"techage:ta5_generator", "techage:ta5_generator_on"}) +end + +local function swap_node(pos, name) + local node = techage.get_node_lvm(pos) + if node.name == name then + return + end + node.name = name + minetest.swap_node(pos, node) +end + +local function play_sound(pos) + local mem = techage.get_mem(pos) + if not mem.handle or mem.handle == -1 then + mem.handle = minetest.sound_play("techage_turbine", { + pos = pos, + gain = 0.4, + max_hear_distance = 10, + loop = true}) + if mem.handle == -1 then + minetest.after(1, play_sound, pos) + end + end +end + +local function stop_sound(pos) + local mem = techage.get_mem(pos) + if mem.handle then + minetest.sound_stop(mem.handle) + mem.handle = nil + end +end + +minetest.register_node("techage:ta5_turbine", { + description = S("TA5 Turbine"), + tiles = { + -- up, down, right, left, back, front + "techage_filling_ta4.png^techage_frame_ta5_top.png^techage_appl_hole_pipe.png", + "techage_filling_ta4.png^techage_frame_ta4_bottom.png", + "techage_filling_ta4.png^techage_appl_open.png^techage_frame_ta5.png", + "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_hole_pipe.png", + "techage_filling_ta4.png^techage_appl_turbine.png^techage_frame_ta5.png", + "techage_filling_ta4.png^techage_appl_turbine.png^techage_frame_ta5.png", + }, + + after_place_node = function(pos) + Pipe:after_place_node(pos) + end, + after_dig_node = function(pos, oldnode) + stop_sound(pos) + Pipe:after_dig_node(pos) + techage.del_mem(pos) + end, + networks = { + pipe2 = {}, + }, + paramtype2 = "facedir", + groups = {cracky=2, crumbly=2, choppy=2}, + on_rotate = screwdriver.disallow, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("techage:ta5_turbine_on", { + tiles = { + -- up, down, right, left, back, front + "techage_filling_ta4.png^techage_frame_ta5_top.png^techage_appl_hole_pipe.png", + "techage_filling_ta4.png^techage_frame_ta4_bottom.png", + "techage_filling_ta4.png^techage_appl_open.png^techage_frame_ta5.png", + "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_hole_pipe.png", + { + image = "techage_filling4_ta4.png^techage_appl_turbine4.png^techage_frame4_ta5.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 0.4, + }, + }, + { + image = "techage_filling4_ta4.png^techage_appl_turbine4.png^techage_frame4_ta5.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 0.4, + }, + }, + }, + + tubelib2_on_update2 = function(pos, outdir, tlib2, node) + swap_node(pos, "techage:ta5_turbine") + stop_sound(pos) + generator_cmnd(pos, "stop") + end, + networks = { + pipe2 = {}, + }, + paramtype2 = "facedir", + groups = {not_in_creative_inventory=1}, + diggable = false, + on_rotate = screwdriver.disallow, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +Pipe:add_secondary_node_names({"techage:ta5_turbine", "techage:ta5_turbine_on"}) +Pipe:set_valid_sides("techage:ta5_turbine", {"L", "U"}) +Pipe:set_valid_sides("techage:ta5_turbine_on", {"L", "U"}) + +techage.register_node({"techage:ta5_turbine", "techage:ta5_turbine_on"}, { + on_transfer = function(pos, in_dir, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == "start" then -- used by heatexchanger1 + swap_node(pos, "techage:ta5_turbine_on") + play_sound(pos) + return generator_cmnd(pos, topic, payload) + elseif topic == "stop" then -- used by heatexchanger1 + swap_node(pos, "techage:ta5_turbine") + stop_sound(pos) + return generator_cmnd(pos, topic, payload) + elseif topic == "turbine" then -- used by heatexchanger1 + return true + else -- used by heatexchanger1 + return generator_cmnd(pos, topic, payload) + end + end, + on_node_load = function(pos, node) + if node.name == "techage:ta5_turbine_on" then + play_sound(pos) + end + end, +}) + +--minetest.register_craft({ +-- output = "techage:ta5_turbine", +-- recipe = { +-- {"", "dye:blue", ""}, +-- {"", "techage:turbine", ""}, +-- {"", "techage:ta4_wlanchip", ""}, +-- }, +--}) diff --git a/init.lua b/init.lua index 4e1141d..e4068b1 100644 --- a/init.lua +++ b/init.lua @@ -172,6 +172,8 @@ dofile(MP.."/ta2_energy_storage/ta2_weight_chest.lua") dofile(MP.."/liquids/liquid_pipe.lua") dofile(MP.."/liquids/valve.lua") dofile(MP.."/liquids/pipe_wall_entry.lua") +dofile(MP.."/fusion_reactor/gas_pipe.lua") + -- Basic Machines dofile(MP.."/basic_machines/consumer.lua") -- consumer base model @@ -387,7 +389,7 @@ dofile(MP.."/items/moreblocks.lua") dofile(MP.."/carts/tank_cart.lua") dofile(MP.."/carts/chest_cart.lua") --- Collider +-- TA4 Collider dofile(MP.."/collider/vacuumtube.lua") dofile(MP.."/collider/magnet.lua") dofile(MP.."/collider/inlets.lua") @@ -395,14 +397,19 @@ dofile(MP.."/collider/cooler.lua") dofile(MP.."/collider/detector.lua") dofile(MP.."/collider/worker.lua") +-- TA5 Teleport dofile(MP.."/teleport/teleport_tube.lua") dofile(MP.."/teleport/teleport_pipe.lua") +-- TA5 Fusion Reactor dofile(MP.."/fusion_reactor/shell.lua") -dofile(MP.."/fusion_reactor/gas_pipe.lua") dofile(MP.."/fusion_reactor/magnet.lua") -dofile(MP.."/fusion_reactor/plasma.lua") dofile(MP.."/fusion_reactor/controller.lua") +dofile(MP.."/fusion_reactor/heatexchanger3.lua") +dofile(MP.."/fusion_reactor/heatexchanger2.lua") +dofile(MP.."/fusion_reactor/heatexchanger1.lua") +--dofile(MP.."/fusion_reactor/generator.lua") +dofile(MP.."/fusion_reactor/turbine.lua") -- Prevent other mods from using IE techage.IE = nil diff --git a/items/registered_nodes.lua b/items/registered_nodes.lua index 36cf710..1fdbe79 100644 --- a/items/registered_nodes.lua +++ b/items/registered_nodes.lua @@ -38,3 +38,29 @@ minetest.register_on_mods_loaded(function() end) minetest.override_item("default:gravel", {groups = {crumbly = 2, gravel = 1, falling_node = 1}}) + +-- Register all known mobs mods for the move/fly controllers +techage.register_mobs_mods("ts_skins_dummies") +techage.register_mobs_mods("mobs") +techage.register_mobs_mods("draconis") +techage.register_mobs_mods("mobkit") +techage.register_mobs_mods("animalia") +techage.register_mobs_mods("mobs_animal") +techage.register_mobs_mods("mobs_monster") +techage.register_mobs_mods("dmobs") +techage.register_mobs_mods("mob_horse") +techage.register_mobs_mods("petz") +techage.register_mobs_mods("mobs_npc") +techage.register_mobs_mods("livingnether") +techage.register_mobs_mods("extra_mobs") +techage.register_mobs_mods("nssm") +techage.register_mobs_mods("goblins") +techage.register_mobs_mods("animalworld") +techage.register_mobs_mods("aliveai") +techage.register_mobs_mods("people") +techage.register_mobs_mods("paleotest") +techage.register_mobs_mods("mobs_balrog") +techage.register_mobs_mods("wildlife") +techage.register_mobs_mods("mobs_skeletons") +techage.register_mobs_mods("mobs_dwarves") +techage.register_mobs_mods("mobf_trader") diff --git a/liquids/liquid_pipe.lua b/liquids/liquid_pipe.lua index 40a366f..2e94efa 100644 --- a/liquids/liquid_pipe.lua +++ b/liquids/liquid_pipe.lua @@ -20,7 +20,7 @@ local S = techage.S local MAX_PIPE_LENGHT = 100 -local power = networks.power +local liquid = networks.liquid local Pipe = tubelib2.Tube:new({ dirs_to_check = {1,2,3,4,5,6}, @@ -47,7 +47,7 @@ local Pipe = tubelib2.Tube:new({ -- Use global callback instead of node related functions Pipe:register_on_tube_update2(function(pos, outdir, tlib2, node) - power.update_network(pos, outdir, tlib2, node) + liquid.update_network(pos, outdir, tlib2, node) end) minetest.register_node("techage:ta3_pipeS", { @@ -172,14 +172,14 @@ local names = networks.register_junction("techage:ta3_junctionpipe", 1/8, Boxes, tubelib2_on_update2 = function(pos, dir1, tlib2, node) local name = "techage:ta3_junctionpipe" .. networks.junction_type(pos, Pipe) minetest.swap_node(pos, {name = name, param2 = 0}) - power.update_network(pos, 0, tlib2, node) + liquid.update_network(pos, 0, tlib2, node) end, after_dig_node = function(pos, oldnode, oldmetadata, digger) Pipe:after_dig_node(pos) end, }, 25) -power.register_nodes(names, Pipe, "junc") +liquid.register_nodes(names, Pipe, "junc") minetest.register_craft({ output = "techage:ta3_junctionpipe25 2", diff --git a/liquids/pump.lua b/liquids/pump.lua index 0a49247..868d81a 100644 --- a/liquids/pump.lua +++ b/liquids/pump.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -66,7 +66,7 @@ local function pumping(pos, nvm, state, capa) state:blocked(pos, nvm) return 0 end - state:keep_running(pos, nvm, COUNTDOWN_TICKS) + state:keep_running(pos, nvm, COUNTDOWN_TICKS) return taken - leftover end state:keep_running(pos, nvm, COUNTDOWN_TICKS) @@ -133,7 +133,7 @@ end local ta3_tiles_pas = { -- up, down, right, left, back, front "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png", - "techage_filling_ta3.png^techage_frame_ta3.png", + "techage_filling_ta3.png^techage_frame_ta3_bottom.png", "techage_filling_ta3.png^techage_appl_hole_pipe.png^techage_frame_ta3.png", "techage_filling_ta3.png^techage_appl_hole_pipe.png^techage_frame_ta3.png", "techage_filling_ta3.png^techage_appl_pump.png^techage_frame_ta3.png^[transformFX", @@ -143,7 +143,7 @@ local ta3_tiles_pas = { local ta4_tiles_pas = { -- up, down, right, left, back, front "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_arrow.png", - "techage_filling_ta4.png^techage_frame_ta4.png", + "techage_filling_ta4.png^techage_frame_ta4_bottom.png", "techage_filling_ta4.png^techage_appl_hole_pipe.png^techage_frame_ta4.png", "techage_filling_ta4.png^techage_appl_hole_pipe.png^techage_frame_ta4.png", "techage_filling_ta4.png^techage_appl_pump.png^techage_frame_ta4.png^[transformFX", @@ -153,7 +153,7 @@ local ta4_tiles_pas = { local ta3_tiles_act = { -- up, down, right, left, back, front "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png", - "techage_filling_ta3.png^techage_frame_ta3.png", + "techage_filling_ta3.png^techage_frame_ta3_bottom.png", "techage_filling_ta3.png^techage_appl_hole_pipe.png^techage_frame_ta3.png", "techage_filling_ta3.png^techage_appl_hole_pipe.png^techage_frame_ta3.png", { @@ -181,7 +181,7 @@ local ta3_tiles_act = { local ta4_tiles_act = { -- up, down, right, left, back, front "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_arrow.png", - "techage_filling_ta4.png^techage_frame_ta4.png", + "techage_filling_ta4.png^techage_frame_ta4_bottom.png", "techage_filling_ta4.png^techage_appl_hole_pipe.png^techage_frame_ta4.png", "techage_filling_ta4.png^techage_appl_hole_pipe.png^techage_frame_ta4.png", { diff --git a/liquids/tank.lua b/liquids/tank.lua index b970c50..9b87f51 100644 --- a/liquids/tank.lua +++ b/liquids/tank.lua @@ -91,7 +91,7 @@ minetest.register_node("techage:ta3_tank", { tiles = { -- up, down, right, left, back, front "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png", + "techage_filling_ta3.png^techage_frame_ta3_bottom.png", "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_tank.png", "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_tank.png", "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_tank.png", @@ -197,7 +197,7 @@ minetest.register_node("techage:ta4_tank", { tiles = { -- up, down, right, left, back, front "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4.png", + "techage_filling_ta4.png^techage_frame_ta4_bottom.png", "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_tank.png", "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_tank.png", "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_tank.png", diff --git a/textures/shrink.sh b/textures/shrink.sh index 36036c5..be401b8 100755 --- a/textures/shrink.sh +++ b/textures/shrink.sh @@ -1,2 +1,2 @@ #!/bin/bash -pngquant --skip-if-larger --quality=80 --strip *.png --ext .png --force \ No newline at end of file +pngquant --skip-if-larger --quality=70-90 --strip *.png --ext .png --force \ No newline at end of file diff --git a/textures/techage_appl_hole_ta5_pipe.png b/textures/techage_appl_hole_ta5_pipe.png deleted file mode 100644 index e9ec6f84b55d873e806aa3a81b8979dede972885..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H$efSN8%RAQMO$zkW6w$YLxB z@(X5gcy=QV$dUDQaSV~ToSd*gzaXK-XiJ!bFVdQ&MBb@01Gc3+yDRo diff --git a/textures/techage_appl_hole_ta5_pipe1.png b/textures/techage_appl_hole_ta5_pipe1.png new file mode 100644 index 0000000000000000000000000000000000000000..fa8de797d322c6ef70696189f347399d97e23c11 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SN8%RAQK3pmc;?dRXm0# zffRE|kY6x^wtrS?>NX%(+0(@_MB{vNg2cZD&wv0%*M^HXA{ass9GN+RVV4+>bGteN Z!}{Ay?P+e0t^<`bc)I$ztaD0e0swD`BFO*% literal 0 HcmV?d00001 diff --git a/textures/techage_appl_hole_ta5_pipe2.png b/textures/techage_appl_hole_ta5_pipe2.png new file mode 100644 index 0000000000000000000000000000000000000000..ab2e41ee52d7e85e0724a0a2613089082490cf27 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SN8%RAQK3pqt^q;_j>G3 zK#I8}$S;^d+dnHcbsLbY?CIhdqH#VsLE>M7XFvd>Ys1AG5e%URj?A3EuuF``xm}%s ZVf}5U_B6Lg*MZ6zJYD@<);T3K0RUXNB8C6} literal 0 HcmV?d00001 diff --git a/textures/techage_appl_plasma.png b/textures/techage_appl_plasma.png new file mode 100644 index 0000000000000000000000000000000000000000..2cea306a5ab94dacb952a688585d2110449f426a GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0L3?#3!&-4XSJOMr-u0Yzozz0YI!Ged^j{+&? zk|4ieZ3cf0Uc-ApuDYj-V~EA+WDZwmp2I#0-HcpeLb?w=$a6`!v%0Ywu%7S;I&9X> Z$T0QC?frmdT6;6Cjlq;1lBNUf{!e_!5Ji3+t&{ z3=whc3zo1>od=YJ0LF?21~*T}f-2S>Cs;2&WWDi1{Nf3|SX~B7bG|f3{`NAFBl{)q zTw>5QWPR|SL0g}{FpNP{kG~|kbJ>=TH9Olk?PJi;ZQp)~%OR!(Xd-7xkY6yve=yMY zmo(RKW?*1q@^oYbR{ORYCCV#($Qwu zK2f*iM8v^+8@M-|U88V4=aVmkX-0(ON{`ba8`b8$FxFf0c-ACQpWT{Ti-PZKZCx_U z^C;Jg375~sUiHoB-S(mB>n*vvi^|r2iR9Qdq0iQQ`9zBu6$?q;40rns#1lS)i7Gk;1!p;^}kd(kGemJ`!H;px& z?dFlozgL$EPZfx8e7r(-U7*T}!t9tYzq dc7_I(pG=pI-ce0oV;K%|ou{jx%Q~loCIE2kDr5iv literal 0 HcmV?d00001 diff --git a/textures/techage_frame4_ta5.png b/textures/techage_frame4_ta5.png new file mode 100644 index 0000000000000000000000000000000000000000..15c168d6f7b65eeca4abea9fbc4f47ae393e156c GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^3P9Yz!VDy5c$8@ZDd_;85LY1WUf=^H@7=pMTSXbj zSmf)|uc)vtH}_Z6BQqeMxg^LhSdqbwX~x$@K(3dki(`n#@#G9|XGTdLO+AeRyuk{4 zWmu;eN=R!P9AKQh(J-JPP=JrcjrE0UgCOsU21OBG0Y!sZc5auCXZ(`zm0$caIi!K@ bB{PFWv&kQsTQ)aisIEF+VPR{UlW|ZX7)YCY?8?3Nb zhINXegtWH70mjK24Fehi1^8IpSYN0%2=cCIP!!=6P&Alj=XUvc#xDt9`Nc1jLlR7C sd$@X*^#?Xy{9>pDl1$E%Si;Y+;7R89qgh$^fEF=$y85}Sb4q9e05T3c-~a#s literal 0 HcmV?d00001 diff --git a/textures/techage_frameT_ta5.png b/textures/techage_frameT_ta5.png new file mode 100644 index 0000000000000000000000000000000000000000..d6af881fb6cd5f11089b56e373591f8b25ff9660 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv(Ey(iS0L?P-~%LQt0>>QcW<%3 zU%#S4&A<68fI`eAL4LuC40cR2zAgfCO*~y3Lp07ObGS0|96Y9RKqOc}hnIDU(T*J& y1_u}?cXJ0c1Pbu6xUt5>hzK${g$OK|eVNgIqD%YKFJ{p|{S2P2elF{r5}E*&e=1D? literal 0 HcmV?d00001 diff --git a/textures/techage_plasma1.png b/textures/techage_plasma1.png deleted file mode 100644 index 52d5561242e704ff392d86b8fa51af2836a1bd84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 602 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFt%noI|q0=J1Z0v<)>xlq%tsQ zOst(~>v1?hq}4xoX_S^ynLy!*fVnyyT^3oQT>*+$xYk)7^x65h=SJMOjj>VHFFY2CB5g(Kx__+1>Z;SWy4p)C?blQ8yWOXvng_7Go>cUB8 z+m+hl1RXePU${l2O*7Q?)ckSnx@~Fj-J_M$>hI6Ly7-wc8;i>$$+Q_}AFV!KS(aOH zPrYx`q%}hGh5KifI6iV;r!BX?P;Zychchc?dY%__?>w3$t(|+uYnhvkr%bTv+)u4* zj%z*FJr}j})U5AM^n0FseX6?dvXqk$cSH+|AlIrJ4w7b%w!B^v;c>b0&~f`0zf_Af zpWI?lK5nCRL1A~@2m2qk(W?y%->JF^IXv%vT*Je>Fm^#;@tpU`$1~?J987=UmH$(_ zG~w6eFHzpzvW$CgA2?d-9sI4~v~0qIlM{SzPHo!K;>1{Czc~LC|R})_y3#8^Y6@em5Q>@XvgsaWG zgtNdSvY3HEPZ@+6E0)@q0R`DhJbhi+pE0rvu`>xxK71G`Bw6AbQR1ARo12?fJTWi6 g@WoL>MikJmdKI;Vst0DZIY@Bjb+ diff --git a/textures/techage_plasma2.png b/textures/techage_plasma2.png deleted file mode 100644 index 1758822e65fda12bba40205e525adb6e16df7824..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2626 zcmV-I3cdA-P)k9qbG+V9WQH{i%NWrNqLMpN@`x7yd*F@5*j6PyVMB?3lJJ5tbmmg3=eFE zx}bK3dR}QDFF;l?Mie3|fp&;rpuUrl$YrO+qkM=787*h3$prxgfS#{|SZk7QeK=if zP;G-SI#OkRuWy64WKvjqYkOm-#hibJ4jm~YER%)b(pJbAwc)Z;nEIFQqk(Zj&nvIoZqrW#|bu&X)COt}NV|JW~pI@u2 zcr{O0prVeiwnTAsUTcL55gV9wgK&$$3^!E(Ek{LofP{3ESxsYyp1D?!sXJ(VM_++_ zwbKU=7Ii8?VR3Q zrRSgLdYyUZisf&6qOp97exP!9nw0& zl8}Fjk&LNi&*iq|exaS6Z<>vEeTbcKe6(qUpnGzbcz23?mZy=Fr&#%Zn3ZvwXI6ZG zhlz{AQntx%sHfthh@Yj7tZ|9pigJBw$F$LkmyvsqbE$l;mu+Keq-dy|rH`71`G#zv zYRIyVy^mUpfs;hNzP`udy_C_|n2ec1+jF%500#<5L_t(|+U=Y7R~yM4z;6ZHBqSjj zOQ?V()UjGr5JDgc5d=smfavuA(~Rjg6dUX_1`MX!6a%j3^89=*cbB{H-(^PTlKUlj zEc_}>xqod2@=NBQ^*1WFHzdT*FkB{4D ztyXJmYsAyyX=(L%5Clg@voCjAW!bXVuP4{0?5n39Pm4?@i-1WMi696n4-cxk7l=<)^Cp>YI(JJ;p%=DLcCa^1N_ZusFP z_~;%Gd57maV+aDqC}o%~#t~``HSbdLPO8=s>e{6$VlgQ}5C{UAWNCW5lw|F!J(Vu8 zhgp&xPo?=J$+9es+M$&6z;+B<@~u?O-<$Lo^hiC)1+E_}f7Q9*Uitq=fWcre7z_r3 zuaU6eKO!Ju+CWF^bUIcC0plE+q=h6~0=AbR2-FNkG5t(`f4}zHH82xk3}$3_MyZ@& z7&(IAVNFeqH|mW>qgNpF{awR84yRB8XO0R%@ZiD3MEgKAy1Dt}$>tTOw$>p(@!JFe zum}Vu1VPi&!^6t<_WJr8fco;I?C@W#8P!rTsDK4Q&`@4hR@P9~07Z+7&p`aGPiw3G zl{ok8Okaf{D0lYt^_7FEuM+UX_UhEs_)YC#PN&)2Y&N@t zYPGa0C~9g{Ng4|!2m){-YZn$4w6zq($N(rcA>|Qra3-Uq!e9ojv@{&nfe&HOj9_DW z!Loc>NYhBkIM8M_0GKv7FTH5Q9@HG+^{2l_D zBv~3J5lB|Y>PkylU2@a|#zB0NWf25StW(W&G8ENG^b^-$3V~p>1j7&uT`{Daw!;q} z)YO2vW}qf|C7DAQo}Zr|9`+6lh`b^Mf#~7H129cYyop9P>z_Q?eCu@Bc|MM)slBnW z2|=Jz4Gvx(eE06%^*3+o+i%>cuWvj0{^*DG_4dl0on8b%Mw0aFki+Raw+r^l8@d}B z_8Ru~Dk}>R1ecR!6hD7nTwJ%cb?5f&y@G=3YA_lCzqLP5;yw}Q4=@-E27|%i`~kj3!h+u;f55UZdjM~d zf~ka0vdL$yX*dWHq6~S!Sjzzx9swpsKEsO<4k84`U{bgdWzaPi4ElUNkpv9=B#niI zlCdDK%V?Y*7I{S?Nh5;5Kl5t#)ITa171(TofbG%DtF`xQw;b|9iOMvJ^8CT0$-6TO z+elR)t0U0S5%_TTFMkHio-C>22?5HjbH(JOLQthQWC1!l9({oEYp+gJD=X<-y&gdj zP$&cmF4tmMUIvCoAMOGs6{dJPfXhV?aKRUgi=XFMEL?-Z0FDFDQKjc{xjE_i`v`(W z0>l@?y@4uoAr=cT8Muk`{5q5z%FMxNx=F7WR3+kZe>|SB>GfHGDnTM{s;gUCM-YT& zPfVi%f!}0OspKk^>cnQV`E8@|CCSsLJ1E2dn0$;Qk-)QvGp6QnIKDCYm;`KT61fN5 zK?H%+AyxBYay8FL)z(%>DT=D4cnq(CXH<99qMXVv_#~KxtdOKr$tlo;!sHZaReT}2 z8%_-)2*_VOZqNhYNn#&=eica*R-UIK2$bjN%3sn28u;RZQgiV#RFCFdgV>?;Xntdl kq`|#1&L3bfnEwiY0|gI{C8t?umH+?%07*qoM6N<$f>3*{uK)l5 diff --git a/textures/techage_reactor_shell.png b/textures/techage_reactor_shell.png index 0467b92a3560799b2aa72e19b715e6ff958f1a27..2e98635d042e033096fdac6ed405536b800af67d 100644 GIT binary patch delta 327 zcmV-N0l5CT8P)=j7=Hu<0001iRAG!wAOB#{=9l`=#UrrUb4r0tYMOU}buFK`ZY zr){OQ9H>Ro86gMg{Gff_ghqP{U^7C+zDn;8+NM}*tWrBnZAL)89*CA-J7p0O7& z0J2OemLveAB|yel080nCh3VNr2BH^;6~e6O)I1VUe2TUJazx$u=e6&#!m;XuUt%0% Z`~xGfIW3u^PtyPZ002ovPDHLkV1jY$l7;{P literal 3257 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 diff --git a/textures/techage_steel_tiles.png b/textures/techage_steel_tiles.png index 270dec7c563406ca36e331b0af557eb71eaeb8bf..21a25cd1163bfbb2ebe7f8d9662f7eaecf57350c 100644 GIT binary patch delta 315 zcmV-B0mS~n6v_gS7=Hu<0001iRAZO4(& z%;NEb`HJAdd7i%`5K@{)V0$j{roNU49n-uElblYd4Nh@Gj(?T{Ow1IJ$&w36Ba=2N zW@&JQAd5BvcS{Jl%<{2@%$5+koMvtKKLQpCsWjO%O}VKLupB;+YC7754D$1voTdp| z!u5hJ;p_4D7=ce8{N_U)j833?V|Sp6gK93a`zYd~puJ^cBx!W2%;v&;Oudsixsca# zU(JU(Del8vs5BSzv1L<0w~ywVad6P>MSZmWr9Kwgg*P93`S@`cn*U#TO7_b(?dt#l N002ovPDHLkV1iMnmFxfj literal 2625 zcmV-H3cmG;P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1b@mg6W4{Ld-&2u2`2jw2Afw>Q}1Z%KA%l1z6` zGBa_#C`(n~q;$vt-xT(sl-bU()<``JHqJ;MFNc(^?v z3?=-g^R~)mFBs<^6Fz*z@i-pZ^@Q5BP&^)7C-ZFAdLJal=^T&wTBxt{qV!hpLmk&b z^D^{Mu5Z4Db^h3Wco?WaNg0k3(MmBLer{(3$-a~XztPW??5g29CJsJSuEhYz!}dOY zkK-Po2arFm!ZZ4}t0(YDuJQDQWw|iI#itJ zzA>jpwA|%xp3tcxU-a0a^X@+EhchOQ_YoY zskOG+tF+W|<5pU2t@S3IdV&UWFTM8Gdl#V~a3okuU@sUMG}6d}M;Udr(T7Z=&&-o& znRT|=rzmMs$b=TH+O(^z7#5Ub<;AP4y4vbXHgavJoj32Y>u$Smxv_S!`qS|SYw==@ zoGG)bH`Xv3YW-Lunw+q42F55yFkX!TBs3XkM~gX=F=w0|olq1^2$GGPpwSoug?UBd z9dF$IVD2T}0=JiVqhB!>jJm(UTmW@H^Y#gAYJF}xV`mi_rbj~cZHE6622juitFiNv zIT0IrSdpRyC4dfCw$?th0t&=ooii%(eReJzk9kW4CLG*$0M9|#cSDm|W9k|rvbf-0 zk0nu7mI22HZA~%~xhYE@Kp3c_XvfB$HY;+N5O| zzEw|ovHwO5F4u1ZjaW85MQkT$l|_I)s*@UW4)$ZcjrrWfEW3xr~ItaLXe z{KlM5r-a{_^E?H^ngf@_jsq!i%$5O%rqYCc8L$m_=fI6H?7uV*Z`yxp9$vI>gfj@m zwvlkeU{4e^gC|Iximla?F<9V_tO$}UOhcvWa5NgS7io_tB-A%Y^|UgBZN9J;Dk^;I z<_$05Yd6Scl37H%I|X@UrBWCwOzcjeYsx^0so_PdbA?cas-uZRG%YCN0(I$UvKS%J`J0w4m5mUqJCuo-n4gRw z;{Zu8eK@!vx3EGx%?gSzBMHg(WN4wbPEBJ*B+wj-RAoJ)~ks7E$Ce9Fue39U`L;nd9Uj7}BdImo)4M!2r86acXg7$ajwgyRgONFZP@u zr0Y~r5da)a(FA2D^tW-R(T1_?pgeC3)1O_r?s)XgzIM9r^ z#$j02lF*7~QIBkGPn)^X4(vY`=wf6@^>m#oBTw^zT7&6COEm8unl32g=DxEvAn>sS z+#|zG89_7{(6wurLN^1+~ZGWY;1qA)n+KzX1 z-(^3X_5J6)Ekti+f8N`IHMehiTTx$X+diP6C}&fy0*X+PVr-HEX4Y^i?|x&>r&Gdj z%=vUmc$#Cn*jyJ42kU9nO){cbI*(HoQ9HRtE ztj8+nEzVlG%9{7&FO1~%!esn(|N+jKj``;aw+86 z03*jdD$pRie(*o|JzJ|VG43Tr5+5`g?%V+o!ax`TeczMYecQH=aFk_12m$9k0N#6YyPwTwm>B>fLNr4~5dr5Mx!s@7 zXYMDZL~(oFC0;n4PLySt)%7})K-;#cD$cpvuEJz8A-8)oqbLeQ1T!PX$S@3~bPY~! z_f=Ir0&)ME`@G6;CC<65t}(`II4+4og?NdNdBsa4w`*P3q?FkFTJxvtQ0Msg_yE9p zM{bwJVv(ArA%>n1!P0e206sqt0OWL8E|+P)-}CQj+m^bnF*BN`A*ajO2gW`y_JOev jjD2A217jcf@B6@CR}_5Mu@Jcw00000NkvXXu0mjf7O2iJ diff --git a/textures/techage_steel_tiles_side.png b/textures/techage_steel_tiles_side.png index adfb27b30662249688647e8411562ac1b04982c2..59fb186ef207a5a433dd79faa67d3c3ba0c7269d 100644 GIT binary patch delta 116 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 diff --git a/textures/techage_steel_tiles_top.png b/textures/techage_steel_tiles_top.png index f8d96c7fa35ff4e9b50d501d4b65d5a636f89be8..95f1cf507b8f27f13b919a598e926ae39229dc35 100644 GIT binary patch delta 90 zcmX>lk~2Xfgo&Affq_qCQaX_04DbnYbuaL_diCm*DN|&EOdkOS8B2ovf*Bm1-ADs+ q1U+3GLnJOIbMQ7hv;{WsGBAAG#KbLh*2~7a0{u{Oc literal 2634 zcmV-Q3bpl#P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1b@mg6W4{I65&5sW~597iB{Z*Q>2-x78*=}dP| zGBa_qfAHZPn39y5Th0eQsinq>i+Y@&w$I^6`@BDVJ;MEmak@WX z3`P9L^S0<^uNapf6K+02|2R(ddcyTu=z4HlFuG^=W{*K)oX_!)u7%n>FLJBpG1PvA zIxfQ<%Jq%q+~I8zzo*B6RDhBRtRnM_As+i&&j_M_IVyg`J{LYmHA*}PKPl!b5&-gH zd$-@?cm(JJ$hRwcM*n{G1U~CE9-pwx7e=`F^g)o%!QT)+IF9#-_~V0RcZPogc`d7J z&2x8}G7!yIMjdoRXD_m>1M;}1WgG=x!FAb3!%+`C2FS5v93969EihPF6jHFDVTHMW zM;Hh(@nmqq%!A_|tKg{d*o-AV!r~HJv{=F1;7KuJnD4QK?YC`zBUE^{08GW#P;|3~d4t5_2rzrbPu=DGBnYq>3C;iIPMlOOZ;_M03n3OU}7u7db7l zq#`AkQfg^MYpkhC&9&58Th+!bLIb7cR$6VXsWK@XDb`ZhD@Ho^*i)CDd+D{et^?^a z(vXoy8FjRw#ug1SVcCjRYo;^Mgi_2jW#(CCoo(tuuC2Jzl9g9kb+x5;)-G0mI^JL{ zT&(eC%I(UXHH=azw??_EKG<%e|LCGFt#R z6=4Sxj9|r;unbFyCcVgTD6n+}c}30NE>^5qpaLBv)q%aQNIp{3Um@6iS$D^{>*CZ# z%iRHP1Jopmo-4SOb0C^G`{u4PnZYq`kp@T`Uux}r2%y+uBX^P8B92VUz*#2<#p+n; zVG8}moKL6FZ_Ig~f?-P}Im*U?jU^<{fWu<0Dtj5Q4R}Y#jSB3)G^aQ1zci;8?JMI9 zLa}Wm91GY}L(Sj`Qm0^RmRa)af*uofzc zzIF447y8-_a+!5xwYHstJoZw_0u^T2PM~WhKuNgbMXO1HTvn7r1V+$^mc%o5Ko>E) z&YkrrJfwlTaDex!J)rRNjuA?Lz6Ps?CJxc`pja~0rJc#*goMrC@N6mKgm~SdOw`5v zWCR%pNXYf!kc`~I3iUM0D8hs!_H3$=A>ng}9+=6EcJn(cMawhqFUQS=C6R@plX z$)(0|@s-d+3U=fX1?hcba_+l9WDFv6oE(rNJxkn@h8-aoV0R`?$r~BoyT^h}#beqp z_7Wka^Hfk(08FlNSOuOuL7`Xdb!BRido|aW2wX*H%sa4BTs8oNC+-0RIx=OL(%jP6 z(Tt>o?pT%_(TYa49obwvZN@@7@c&q#i$NgOW9wAzX}Ay68cYXTqI=(=*@QAKX)AdH z0v}VsJu=Ld5tOv%K7w0T^fox($Vcj9XKtKrOFt<84e4Jg5_;QTX>Ekw_E%aPA?T;p zcD$?mTlVR!??3Nt6m~27^WH|@+`j2;+4fS)_W=b(IlFRYP=tz9XOj&ui_xXL>y0^| zPNCnJ^XU|Nn&Y}yw=Oyk-qX0bWCZne?x!lEc98p!$Z(Y!%;`=0FU{#q`$uzhWr&nZ zftmOI?k~6~8kaS3S=%bzx5e@**)nU#F6Le~fKbYew8s;1X@cs~&MUWAp6M=;4{qM@ zLf^W1_5xw}s^QQZ9p~GILvM7PcJc9P+oaF?=2NeEq1Dh!z2=2hLofB3tJQqhNa^cN z8sn|iywYjtl~(ggr=eF`&Bso2z3e^pQu=i>#lKh$82k_0lrx{nlUxV@00D(*LqkwW zLqi~Na&Km7Y-Iodc$|HaJ4nM&6o&t%N<}ITEhyrUp*mUcg*a*ziclfc3avVr-1H$d zX-HCB90k{cgOA0kgNw7S4z7YA_yBQqa#D1W63KlnXct1vO{C500}=ZoWf3<05Cpiy(2?_bSwbaQMhyg(XMRK*XDfEL}VBv-fu=<(>XBK#} z+wIaY3;?Jqs*0KMR6Vg-Z&)lAUy0?plw@J73bXTt-@q7A-8)oqbLeQ1T!PX$S@3~ zbX}a>?yIVLEX4iS+~-w(D{;+z*qLbKTsoe;MdegWB>pF07*qoM6N<$g0I5wVE_OC diff --git a/textures/techage_steel_tiles_top2.png b/textures/techage_steel_tiles_top2.png index f46b9b1373a1e6ca951192d087de9ea8e341af66..f5e2e7e8e166d4167febeea68e15ba0c8a91d312 100644 GIT binary patch delta 124 zcmdlj+RHdWqLhW1fq|hhB>gy$5)JSPadj{7xqRjFg$oyM-MTep%9N!`mo8bdWXplW zTY(A~OM?7@862M7NCR@zJY5_^G|nd*1c{h99^>KS$!Jhx;w;(d+OVLDp@flnmqpHr b7Iuc~(d>dc*Pr|V>R|A6^>bP0l+XkKgU>CX literal 2747 zcmV;s3PkmZP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bxmLsVS{AU%jghU_&%Ml39nH}8aPl!yrT@QEJ zecM@nBri!3QYb6T|NXndKX_4z6f#RKt&{_=+;Stuk9wT1wm;*M_ve1mHHG^RuY=k=f0S0`(bayr zI+o8lc6;DmZF1He=bZxJXh{XI7&<$OFV=~Vg!yA1SveHl&OP($V>(&DW_B@ z2vu_1*duYTC8k0?3~d4toJtaK(~^R$oEiBexgv*@6K7^FEL;OO){;stTuPDRBBzoh z3ri7^DowPenk&~*rPkW2HfjkP$gMPKwY8>7L19R7mSVkPq*G5lckZQ2uf260NS~1h zk1}M`(S{mXGRTA#6RXxtXABccG4teErp!9q)P-DIY30SMELnB6rFYgYR=-?tuof@Y zXfx&OUMfHYOF@6>K(iB~u4pl{51TNdlMC+c zm>P9v?FjpzWl4LYy_B_e;0w&rc2__|i;Y>RV_;U{!-SZ-;Z|ldZf&nsAfiK0pAl>l zod^j`9mkwAXyww}JGk8ji)K!aKW_OPNahW+@mO5U1Q6pS95Q>HohN)7lX@^BSVi+W z;Ixkz+`=(gr)V#;1AK%Jlu+V}b-CXXdA0~tE8>mD7(i%sWgJ5cTinGBGwA zm8?{8Kn1QyMg*egfT%xtkejj|+%UZBRTV%1$?20wGtv&0{87Nug|Ua&dF?=0;1+`t z+ir_*34gHX+b!V__I%o6;7TkM;xe$1j5uabfx}X%${TRd4U|U54I;P9C2{HBEe~(5 zf4V%pwtjjYBV|2zc4&k-6b&8{kOE>^!kJyD4E&K-LDE@4=>nx#*Kn+Mk;-L<%yX$tb}J~W}hAmQ>VF4K%wpgY-q3$G~WT9#0!j3e__KFH@Z$9 zbkX7Rxfm&4*PQrfZ zP|NJ~JD|MSU3a2&lxT+P1h0D3ETjd|wzStZl&_(Dj}sP;eM;IYgD{FNSaN5mOW6m( zY(UHjdZDN@mjL+13F06+PFhhuq&AjdPNNM(@0pI|!yFV8is714fEg-eYXKQ}Wz%pf@7m8f?)M9OzTFc3V9&Q(!pA*x zc(3gMry$c}aar7oQBWZGk727Kdxt5E8$K%ymCj+lxBlt!@aFo5<$}ydrK_jT85(4$ zplXm{?5eg^+A+by;qo$Z{SnBq*Rr{;cYh>C-un!@GC_5Nr-!dtp6Xlt?bw3TWrO~z zmGE0LpR5S49ZWl)9zL{#@UsiCKZztYqYZFthu(y5EMAMGvi$8rAP zgpKjfT3a|H|NmQCK%CE7Tf#p%(DK3FMt-aO5dQF>{D9!<-lMp z+rmFtE&Kfqw6tAnc`2>yULIyou2 zNQw6)g%&Yhc)XAE?m4`7A0X7rOtU&h0Zq5fbTT1kb1P!#6#;}0!8CegW*M`Rl!9-4 z-BUN!U7Tn6_x)MDYTjZ%KqQ`FhG`S86Hjj12Iqa^C@aY-@j3B`Nf#u3#t9I72Cnp$zfuRLK1r{&wAc~Qw+&oew=`uBxZDBypA6ZQT`5RQ zC=`JAGy0|+5V-}qSG~D4&vE(yWN22Y8{ps&7%o!wn$Nqt+UNFfPjh}hUjK5R;w}`w z00006VoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru<^cy3 z0v`x(C+z?L0kla(K~z}7?bbnV+CUV5;s3oEXo!qRSIwqbTS{+{vvLOz zeF%ZSO(V%N*KFS%LE4$sUsOxbikq`oU`l{nyh0DuJO1lRb3@B^6{DgY&L5E>bjw^?-bI5775O-vfOQ^gYn`K;Hv>4}4S){0Cw!u4p7YL8$-$002ovPDHLkV1j$y B9V-9; diff --git a/textures/techage_ta5_gaspipe.png b/textures/techage_ta5_gaspipe.png index ab99682bf4264187839365de784c48b443d5944f..7f9106da16678c2cf974b27944cd0a70044a83e9 100644 GIT binary patch delta 89 zcmZo+ET5nf%o*Sl;_6=DUm3 r00Azh#DxoaRxe;U$kE!=SgOGA(}e%iv*r+fpgIOmS3j3^P68m1nO50|SGmzlxmnh0{P5V@Z%-FoVOh8)-m}y{C&~ zh{pNk1c@?-0M7u9P=`PdL05;9HzYzGPTYu?uz<^ivBa6Rv4PQ-lUb3`k!{k}0KEko h9byi84h_z%49Yjy{jZz~FasLJ;OXk;vd$@?2>|}WCj9^a delta 157 zcmZ3$xRY^$O1)5kPl&5~fsbp8jaQ$8W3>eX1B0f&idaNTIFQ9y666=m;PC858jus} z>EaloasKW(L%{<994-g*A388PGA1x`f6Q0ayd=Y0t5KeJui)H!y>(2CK0OC^NiK<2 zw=myjIm>R*1&unFKROIN9&;0-ou4UfZ(Z2(psruMF<L)jfp`}q}>D}XjIc)I$z JtaD0e0ss`iH`M?D diff --git a/textures/techage_ta5_gaspipe_knee.png b/textures/techage_ta5_gaspipe_knee.png index b0620924680af1eb10a2c48a6f145daa34db660e..bafe337013bcd671e19b3179b26361eec6447a3e 100644 GIT binary patch delta 147 zcmX@exR`N*L_HHT0|Nt}$fR^2#S`EY;_6=D8z4@_Mf84xkicNswPK zgTu2MX+Tbbr;B5V#`(MFP75|D@UR4IY33EpS;4Tv;rPGoroulHDjwwdot*8f&~pFU zF6)SGyPelKoUL#O37J~S@GbJEla+a!=&!{mZKGe<1!yg5f8tS%v-HnT< d`zpkBvK@cH<#TQ?`%9o@44$rjF6*2UngCOhMT`Id diff --git a/textures/techage_ta5_gaspipe_knee2.png b/textures/techage_ta5_gaspipe_knee2.png index f352736b61b93bb6736e0bfa999a614e72288d4d..d0ea4696be18c3801a6e05446dca63dfe9338edd 100644 GIT binary patch delta 134 zcmZ3_IGu5VL_HHT0|Nt}$fR^2#S`EY;_6=D^Obu{L)9RVnxo&PQ)0Bf&jIk}c49>m` kiKfAa7xeu9Khc$e?;PKiFYK-JfQB%5y85}Sb4q9e0B8Oz82|tP delta 159 zcmbQvxSnx>L_G^L0|P^2NcwRg#UJ1k;_6=DJWiXL?ywx;Jj3(OezIoH2~n}Kpnu;RJMOc}GEbet z*wo&9_C!g*qW+-8o9-U7$aG~cXgV~z@oS~?^F@uTA4{-(kT5UfWxM^zf@w0)Xa-ML KKbLh*2~7a*V>?Fx diff --git a/tools/repairkit.lua b/tools/repairkit.lua index eef67cd..2ebd5b3 100644 --- a/tools/repairkit.lua +++ b/tools/repairkit.lua @@ -19,6 +19,9 @@ local Cable2 = techage.TA4_Cable local Pipe2 = techage.LiquidPipe local menu = techage.menu +local N = techage.get_node_lvm +local CTL = function(pos) return (minetest.registered_nodes[N(pos).name] or {}).control end + local function network_check(start_pos, Cable, player_name) -- local ndef = techage.networks.net_def(start_pos, Cable.tube_type) -- local outdir = nil @@ -61,17 +64,6 @@ local function read_state(itemstack, user, pointed_thing) minetest.chat_send_player(user:get_player_name(), S("Biome")..": "..name..", "..S("Position temperature")..": "..math.floor(data.heat).." ") end - if ndef and ndef.networks then - local player_name = user:get_player_name() - if ndef.networks.ele1 then - network_check(pos, Cable1, player_name) - elseif ndef.networks.ele2 then - network_check(pos, Cable2, player_name) - elseif ndef.networks.pipe2 then - network_check(pos, Pipe2, player_name) - end - end - if number then if ndef and ndef.description then local info = techage.send_single("0", number, "info", nil) @@ -122,6 +114,14 @@ local function read_state(itemstack, user, pointed_thing) itemstack:add_wear(65636/200) return itemstack end + elseif node.name == "techage:ta5_magnet1" or node.name == "techage:ta5_magnet2" then + local ctl = CTL(pos) + local has_gas = ctl.on_request(pos, nil, "test_gas") and S("yes") or S("no") + local has_power = ctl.on_request(pos, nil, "test_power") and S("yes") or S("no") + minetest.chat_send_player(user:get_player_name(), S("Power: @1, Cooling: @2", has_power, has_gas)) + minetest.chat_send_player(user:get_player_name(), S("Position")..": "..minetest.pos_to_string(pos).." ") + itemstack:add_wear(65636/200) + return itemstack elseif ndef and ndef.description then if ndef.techage_info then local info = ndef.techage_info(pos) or ""