From 0a6392b2b9c00574c4d1fd1f2d11107976702d00 Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Sun, 17 Nov 2019 00:08:10 +0100 Subject: [PATCH] items bauxite, gibbsite, aluminum, red mud, powders, lye added nodes silo and furnace heater added chemical doser/reactor activated netID location (networks) moved to pumps expoxy recipe changed files/folders restructured --- basic_machines/grinder.lua | 1 - basis/networks.lua | 23 +- basis/recipe_lib.lua | 14 +- chemistry/recipes.lua | 21 -- chemistry/ta4_doser.lua | 149 ++++++++--- chemistry/ta4_reactor.lua | 18 ++ chemistry/ta4_stand.lua | 40 +-- furnace/cooking.lua | 78 ++++-- furnace/furnace_top.lua | 58 +++-- furnace/heater.lua | 144 +++++++++++ init.lua | 47 ++-- items/aluminium.lua | 62 +++++ {nodes => items}/baborium.lua | 2 +- items/barrel.lua | 84 ++++++ {nodes => items}/basalt.lua | 0 {nodes => items}/bauxit.lua | 14 +- items/epoxy.lua | 45 ++++ items/lye.lua | 43 ++++ {oil => items}/oil.lua | 16 +- {oil => items}/petroleum.lua | 40 +-- items/powder.lua | 36 +++ {nodes => items}/silicon.lua | 0 {nodes => items}/steelmat.lua | 0 {nodes => items}/usmium.lua | 6 + liquids/barrel.lua | 50 ---- liquids/liquid.lua | 97 +++---- liquids/liquid.lua.orig | 286 +++++++++++++++++++++ liquids/pump.lua | 1 + liquids/silo.lua | 215 ++++++++++++++++ liquids/tank.lua | 12 +- locale/techage.de.tr | 6 +- {nodes => logic}/doorblock.lua | 0 {nodes => logic}/gateblock.lua | 0 oil/reboiler.lua | 2 +- sounds/techage_reactor.ogg | Bin 0 -> 15384 bytes textures/techage_aluminum_inv.png | Bin 0 -> 1332 bytes textures/techage_appl_heater.png | Bin 0 -> 180 bytes textures/techage_appl_heater_on.png | Bin 0 -> 218 bytes textures/techage_appl_silo.png | Bin 0 -> 211 bytes textures/techage_barrel_bitumen_inv.png | Bin 343 -> 0 bytes textures/techage_barrel_fueloil_inv.png | Bin 385 -> 0 bytes textures/techage_barrel_gasoline_inv.png | Bin 386 -> 0 bytes textures/techage_barrel_inv.png | Bin 386 -> 343 bytes textures/techage_barrel_naphtha_inv.png | Bin 385 -> 0 bytes textures/techage_barrel_oil_inv.png | Bin 385 -> 0 bytes textures/techage_barrel_water_inv.png | Bin 419 -> 0 bytes textures/techage_biomass.png | Bin 656 -> 0 bytes textures/techage_canister_bitumen_inv.png | Bin 406 -> 0 bytes textures/techage_canister_filling.png | Bin 0 -> 201 bytes textures/techage_canister_frame.png | Bin 0 -> 281 bytes textures/techage_canister_fueloil_inv.png | Bin 414 -> 0 bytes textures/techage_canister_gasoline_inv.png | Bin 285 -> 0 bytes textures/techage_canister_inv.png | Bin 285 -> 0 bytes textures/techage_canister_naphtha_inv.png | Bin 412 -> 0 bytes textures/techage_canister_water_inv.png | Bin 410 -> 0 bytes textures/techage_epoxy.png | Bin 300 -> 0 bytes textures/techage_fueloil_inv.png | Bin 351 -> 0 bytes textures/techage_gasoline_inv.png | Bin 351 -> 0 bytes textures/techage_liquid1_inv.png | Bin 0 -> 228 bytes textures/techage_liquid2_inv.png | Bin 0 -> 308 bytes textures/techage_liquid_inv.png | Bin 351 -> 0 bytes textures/techage_naphtha_inv.png | Bin 351 -> 0 bytes textures/techage_oil_inv.png | Bin 310 -> 0 bytes textures/techage_powder_inv.png | Bin 0 -> 1680 bytes textures/techage_symbol_liquid.png | Bin 0 -> 248 bytes textures/techage_symbol_powder.png | Bin 0 -> 265 bytes textures/techage_tes_core_elem.png | Bin 379 -> 0 bytes textures/techage_tes_core_elem_top.png | Bin 298 -> 0 bytes textures/techage_water_inv.png | Bin 351 -> 0 bytes {nodes => wind_turbine}/pillar.lua | 0 wind_turbine/rotor.lua | 19 +- 71 files changed, 1305 insertions(+), 324 deletions(-) delete mode 100644 chemistry/recipes.lua create mode 100644 furnace/heater.lua create mode 100644 items/aluminium.lua rename {nodes => items}/baborium.lua (97%) create mode 100644 items/barrel.lua rename {nodes => items}/basalt.lua (100%) rename {nodes => items}/bauxit.lua (71%) create mode 100644 items/epoxy.lua create mode 100644 items/lye.lua rename {oil => items}/oil.lua (78%) rename {oil => items}/petroleum.lua (73%) create mode 100644 items/powder.lua rename {nodes => items}/silicon.lua (100%) rename {nodes => items}/steelmat.lua (100%) rename {nodes => items}/usmium.lua (53%) delete mode 100644 liquids/barrel.lua create mode 100644 liquids/liquid.lua.orig create mode 100644 liquids/silo.lua rename {nodes => logic}/doorblock.lua (100%) rename {nodes => logic}/gateblock.lua (100%) create mode 100644 sounds/techage_reactor.ogg create mode 100644 textures/techage_aluminum_inv.png create mode 100644 textures/techage_appl_heater.png create mode 100644 textures/techage_appl_heater_on.png create mode 100644 textures/techage_appl_silo.png delete mode 100644 textures/techage_barrel_bitumen_inv.png delete mode 100644 textures/techage_barrel_fueloil_inv.png delete mode 100644 textures/techage_barrel_gasoline_inv.png delete mode 100644 textures/techage_barrel_naphtha_inv.png delete mode 100644 textures/techage_barrel_oil_inv.png delete mode 100644 textures/techage_barrel_water_inv.png delete mode 100644 textures/techage_biomass.png delete mode 100644 textures/techage_canister_bitumen_inv.png create mode 100644 textures/techage_canister_filling.png create mode 100644 textures/techage_canister_frame.png delete mode 100644 textures/techage_canister_fueloil_inv.png delete mode 100644 textures/techage_canister_gasoline_inv.png delete mode 100644 textures/techage_canister_inv.png delete mode 100644 textures/techage_canister_naphtha_inv.png delete mode 100644 textures/techage_canister_water_inv.png delete mode 100644 textures/techage_epoxy.png delete mode 100644 textures/techage_fueloil_inv.png delete mode 100644 textures/techage_gasoline_inv.png create mode 100644 textures/techage_liquid1_inv.png create mode 100644 textures/techage_liquid2_inv.png delete mode 100644 textures/techage_liquid_inv.png delete mode 100644 textures/techage_naphtha_inv.png delete mode 100644 textures/techage_oil_inv.png create mode 100644 textures/techage_powder_inv.png create mode 100644 textures/techage_symbol_liquid.png create mode 100644 textures/techage_symbol_powder.png delete mode 100644 textures/techage_tes_core_elem.png delete mode 100644 textures/techage_tes_core_elem_top.png delete mode 100644 textures/techage_water_inv.png rename {nodes => wind_turbine}/pillar.lua (100%) diff --git a/basic_machines/grinder.lua b/basic_machines/grinder.lua index 4e8461b..8e68021 100644 --- a/basic_machines/grinder.lua +++ b/basic_machines/grinder.lua @@ -293,5 +293,4 @@ techage.add_grinder_recipe({input="default:pine_tree", output="default:pine_need techage.add_grinder_recipe({input="default:acacia_tree", output="default:acacia_leaves 8"}) techage.add_grinder_recipe({input="default:aspen_tree", output="default:aspen_leaves 8"}) -techage.add_grinder_recipe({input="techage:bauxite_cobble", output="techage:bauxite_gravel"}) diff --git a/basis/networks.lua b/basis/networks.lua index 711cf29..6080997 100644 --- a/basis/networks.lua +++ b/basis/networks.lua @@ -157,18 +157,17 @@ end -- do the walk through the tubelib2 network -- indir is the direction which should not be covered by the walk --- (coming from there or is a different network) -local function connection_walk(pos, indir, node, tlib2, lvl, clbk) +-- (coming from there) +-- if outdirs is given, only this dirs are used +local function connection_walk(pos, outdirs, indir, node, tlib2, clbk) if clbk then clbk(pos, indir, node) end --techage.mark_position("singleplayer", pos, "walk", "", 1) - if lvl == 1 or net_def2(node.name, tlib2.tube_type).ntype == "junc" then - for _,outdir in pairs(get_node_connections(pos, tlib2.tube_type)) do - if outdir ~= Flip[indir] then - local pos2, indir2 = tlib2:get_connected_node_pos(pos, outdir) - local node = techage.get_node_lvm(pos2) - if pos2 and not pos_already_reached(pos2) and valid_indir(indir2, node, tlib2.tube_type) then - connection_walk(pos2, indir2, node, tlib2, lvl + 1, clbk) - end + if outdirs or net_def2(node.name, tlib2.tube_type).ntype == "junc" then + for _,outdir in pairs(outdirs or get_node_connections(pos, tlib2.tube_type)) do + local pos2, indir2 = tlib2:get_connected_node_pos(pos, outdir) + local node = techage.get_node_lvm(pos2) + if pos2 and not pos_already_reached(pos2) and valid_indir(indir2, node, tlib2.tube_type) then + connection_walk(pos2, nil, indir2, node, tlib2, clbk) end end end @@ -183,7 +182,7 @@ local function collect_network_nodes(pos, outdir, tlib2) local node = techage.get_node_lvm(pos) local net_name = tlib2.tube_type -- outdir corresponds to the indir coming from - connection_walk(pos, outdir, node, tlib2, 1, function(pos, indir, node) + connection_walk(pos, outdir and {outdir}, nil, node, tlib2, function(pos, indir, node) local ntype = net_def2(node.name, net_name).ntype if ntype then if not netw[ntype] then netw[ntype] = {} end @@ -246,7 +245,7 @@ function techage.networks.connection_walk(pos, outdir, tlib2, clbk) NumNodes = 0 pos_already_reached(pos) -- don't consider the start pos local node = techage.get_node_lvm(pos) - connection_walk(pos, outdir, node, tlib2, 1, clbk) + connection_walk(pos, {outdir}, Flip[outdir], node, tlib2, clbk) return NumNodes end diff --git a/basis/recipe_lib.lua b/basis/recipe_lib.lua index 7435dad..85af1b9 100644 --- a/basis/recipe_lib.lua +++ b/basis/recipe_lib.lua @@ -22,6 +22,18 @@ local range = techage.range techage.recipes = {} +local RECIPE = { + output = {name = "", num = 0}, + waste = {name = "", num = 0}, + input = { + {name = "", num =0}, + {name = "", num =0}, + {name = "", num =0}, + {name = "", num =0}, + }, + } + + -- Formspec local function input_string(recipe) local tbl = {} @@ -88,7 +100,7 @@ function techage.recipes.formspec(x, y, rtype, mem) local recipe_list = RecipeList[rtype] or {} mem.recipe_idx = range(mem.recipe_idx or 1, 1, #recipe_list) local idx = mem.recipe_idx - local recipe = recipes[recipe_list[idx]] + local recipe = recipes[recipe_list[idx]] or RECIPE local output = recipe.output.name.." "..recipe.output.num local waste = recipe.waste.name.." "..recipe.waste.num return "container["..x..","..y.."]".. diff --git a/chemistry/recipes.lua b/chemistry/recipes.lua deleted file mode 100644 index f5ca85c..0000000 --- a/chemistry/recipes.lua +++ /dev/null @@ -1,21 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - GPL v3 - See LICENSE.txt for more information - - TA4 Doser - -]]-- - -recipes.add("ta4_doser", { - output = "techage:ta4_epoxy 3", - input = { - "techage:oil_source 2", - "basic_materials:oil_extract 1", - } -}) \ No newline at end of file diff --git a/chemistry/ta4_doser.lua b/chemistry/ta4_doser.lua index 5bacd8f..b9e219b 100644 --- a/chemistry/ta4_doser.lua +++ b/chemistry/ta4_doser.lua @@ -12,10 +12,12 @@ ]]-- -local S = techage.S +local S2P = minetest.string_to_pos +local P2S = minetest.pos_to_string local M = minetest.get_meta -local N = function(pos) return minetest.get_node(pos).name end -local Pipe = techage.BiogasPipe +local S = techage.S +local Pipe = techage.LiquidPipe +local networks = techage.networks local liquid = techage.liquid local recipes = techage.recipes @@ -23,7 +25,27 @@ local Liquids = {} -- {hash(pos) = {name = outdir},...} local STANDBY_TICKS = 4 local COUNTDOWN_TICKS = 4 -local CYCLE_TIME = 4 +local CYCLE_TIME = 10 + +-- to mark the pump source and destinstion node +local DebugCache = {} + +local function set_starter_name(pos, clicker) + local key = minetest.hash_node_position(pos) + DebugCache[key] = {starter = clicker:get_player_name(), count = 10} +end + +local function get_starter_name(pos) + local key = minetest.hash_node_position(pos) + local def = DebugCache[key] + if def then + def.count = (def.count or 0) - 1 + if def.count > 0 then + return def.starter + end + DebugCache[key] = nil + end +end local function formspec(self, pos, mem) return "size[8,7]".. @@ -85,6 +107,7 @@ end local function start_node(pos, mem, state) reactor_cmnd(pos, "start") + del_liquids(pos) mem.running = true end @@ -105,34 +128,44 @@ local State = techage.NodeStates:new({ stop_node = stop_node, }) -local function reset_dosing(mem) - -- alle 4 ports checken und inputs vorladen -end - local function dosing(pos, mem, elapsed) -- trigger reactor (power) if not reactor_cmnd(pos, "power") then - if not mem.techage_countdown or mem.techage_countdown < 2 then + if not mem.techage_countdown or mem.techage_countdown < 3 then + reactor_cmnd(pos, "stop") State:nopower(pos, mem, S("reactor has no power")) end State:idle(pos, mem) return end + -- check from time to time + mem.check_cnt = (mem.check_cnt or 0) + 1 + if mem.check_cnt >= 4 then + mem.check_cnt = 0 + local res = reactor_cmnd(pos, "check") + if not res then + State:fault(pos, mem, S("reactor defect")) + reactor_cmnd(pos, "stop") + return + end + end -- available liquids local liquids = get_liquids(pos) local recipe = recipes.get(mem, "ta4_doser") if not liquids or not recipe then return end -- inputs + local starter = get_starter_name(pos) for _,item in pairs(recipe.input) do if item.name ~= "" then - print("dosing", item.name, dump(liquids)) local outdir = liquids[item.name] if not outdir then - State:fault(pos, mem, S("input missing")) + State:standby(pos, mem) + reactor_cmnd(pos, "stop") return end - if liquid.take(pos, outdir, item.name, item.num) < item.num then - State:fault(pos, mem, S("input missing")) + if liquid.take(pos, outdir, item.name, item.num, starter) < item.num then + State:standby(pos, mem) + reactor_cmnd(pos, "stop") return end end @@ -142,16 +175,18 @@ local function dosing(pos, mem, elapsed) leftover = reactor_cmnd(pos, "output", { name = recipe.output.name, amount = recipe.output.num}) - if not leftover or leftover > 0 then - State:fault(pos, mem, S("output blocked")) + if not leftover or (tonumber(leftover) or 1) > 0 then + State:blocked(pos, mem) + reactor_cmnd(pos, "stop") return end if recipe.waste.name ~= "" then leftover = reactor_cmnd(pos, "waste", { name = recipe.waste.name, amount = recipe.waste.num}) - if not leftover or leftover > 0 then - State:fault(pos, mem, S("output blocked")) + if not leftover or (tonumber(leftover) or 1) > 0 then + State:blocked(pos, mem) + reactor_cmnd(pos, "stop") return end end @@ -178,10 +213,18 @@ local function on_receive_fields(pos, formname, fields, player) if not mem.running then recipes.on_receive_fields(pos, formname, fields, player) end + set_starter_name(pos, player) State:state_button_event(pos, mem, fields) M(pos):set_string("formspec", formspec(State, pos, mem)) end +local nworks = { + pipe = { + sides = techage.networks.AllSides, -- Pipe connection sides + ntype = "pump", + }, +} + minetest.register_node("techage:ta4_doser", { description = S("TA4 Doser"), @@ -189,12 +232,33 @@ minetest.register_node("techage:ta4_doser", { -- up, down, right, left, back, front "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_hole_pipe.png", "techage_filling_ta4.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_pump.png^techage_appl_hole_pipe.png", + "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_pump_up.png", }, + after_place_node = function(pos, placer) + local meta = M(pos) + local mem = tubelib2.init_mem(pos) + local number = techage.add_node(pos, "techage:ta4_doser") + meta:set_string("node_number", number) + meta:set_string("owner", placer:get_player_name()) + meta:set_string("formspec", formspec(State, pos, mem)) + meta:set_string("infotext", S("TA4 Doser").." "..number) + State:node_init(pos, mem, number) + Pipe:after_place_node(pos) + end, + tubelib2_on_update2 = function(pos, dir, tlib2, node) + liquid.update_network(pos, dir) + del_liquids(pos) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + techage.remove_node(pos) + Pipe:after_dig_node(pos) + tubelib2.del_mem(pos) + end, on_receive_fields = on_receive_fields, on_rightclick = on_rightclick, on_timer = node_timer, + networks = nworks, paramtype2 = "facedir", on_rotate = screwdriver.disallow, @@ -210,7 +274,7 @@ minetest.register_node("techage:ta4_doser_on", { "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_hole_pipe.png", "techage_filling_ta4.png^techage_frame_ta4.png", { - image = "techage_filling8_ta4.png^techage_frame8_ta4.png^techage_appl_pump8.png", + image = "techage_filling8_ta4.png^techage_frame8_ta4.png^techage_appl_pump_up8.png", backface_culling = false, animation = { type = "vertical_frames", @@ -221,38 +285,40 @@ minetest.register_node("techage:ta4_doser_on", { }, }, + tubelib2_on_update2 = function(pos, dir, tlib2, node) + liquid.update_network(pos) + del_liquids(pos) + end, on_receive_fields = on_receive_fields, on_rightclick = on_rightclick, on_timer = node_timer, + networks = nworks, paramtype2 = "facedir", on_rotate = screwdriver.disallow, - groups = {cracky=2}, + diggable = false, + groups = {not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_metal_defaults(), }) --- for mechanical pipe connections -techage.power.register_node({"techage:ta4_doser", "techage:ta4_doser_on"}, { - conn_sides = {"F", "B", "R", "L", "U"}, - power_network = Pipe, - after_place_node = function(pos, placer) - local meta = M(pos) - local mem = tubelib2.init_mem(pos) - local number = techage.add_node(pos, "techage:ta4_doser") - meta:set_string("node_number", number) - meta:set_string("owner", placer:get_player_name()) - local node = minetest.get_node(pos) - local indir = techage.side_to_indir("R", node.param2) - meta:set_int("indir", indir) -- from liquid point of view - meta:set_string("formspec", formspec(State, pos, mem)) - meta:set_string("infotext", S("TA4 Tank").." "..number) +techage.register_node({"techage:ta4_doser", "techage:ta4_doser_on"}, { + on_recv_message = function(pos, src, topic, payload) + local resp = State:on_receive_message(pos, topic, payload) + if resp then + return resp + else + return "unsupported" + end end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos) + on_node_load = function(pos) + State:on_node_load(pos) end, }) +Pipe:add_secondary_node_names({"techage:ta4_doser", "techage:ta4_doser_on"}) + + if minetest.global_exists("unified_inventory") then unified_inventory.register_craft_type("ta4_doser", { description = S("TA4 Doser"), @@ -261,3 +327,12 @@ if minetest.global_exists("unified_inventory") then height = 2, }) end + +minetest.register_craft({ + output = "techage:ta4_doser", + recipe = { + {"", "techage:ta3_pipeS", ""}, + {"techage:ta3_pipeS", "techage:t4_pump", "techage:ta3_pipeS"}, + {"", "techage:ta4_wlanchip", ""}, + }, +}) diff --git a/chemistry/ta4_reactor.lua b/chemistry/ta4_reactor.lua index 6a12927..7902836 100644 --- a/chemistry/ta4_reactor.lua +++ b/chemistry/ta4_reactor.lua @@ -133,3 +133,21 @@ minetest.register_node("techage:ta4_reactor", { }) Pipe:add_secondary_node_names({"techage:ta4_reactor_fillerpipe"}) + +minetest.register_craft({ + output = 'techage:ta4_reactor', + recipe = { + {'default:steel_ingot', 'techage:ta3_pipeS', 'default:steel_ingot'}, + {'techage:iron_ingot', '', 'techage:iron_ingot'}, + {'default:steel_ingot', 'techage:ta3_pipeS', 'default:steel_ingot'}, + } +}) + +minetest.register_craft({ + output = 'techage:ta4_reactor_fillerpipe', + recipe = { + {'', '', ''}, + {'', 'techage:ta3_pipeS', ''}, + {'default:steel_ingot', 'basic_materials:motor', 'default:steel_ingot'}, + } +}) diff --git a/chemistry/ta4_stand.lua b/chemistry/ta4_stand.lua index 740ad04..4de8b9b 100644 --- a/chemistry/ta4_stand.lua +++ b/chemistry/ta4_stand.lua @@ -85,21 +85,12 @@ minetest.register_node("techage:ta4_reactor_stand", { on_timer = function(pos, elapsed) local mem = tubelib2.get_mem(pos) power.consumer_alive(pos, mem) + minetest.sound_play("techage_reactor", { + pos = pos, + gain = 0.5, + max_hear_distance = 10}) return mem.running end, - on_rightclick = function(pos, node, clicker) - local mem = tubelib2.get_mem(pos) - if not mem.running and power.power_available(pos, mem, PWR_NEEDED) then - mem.running = true - power.consumer_start(pos, mem, CYCLE_TIME, PWR_NEEDED) - M(pos):set_string("infotext", "...") - else - mem.running = false - power.consumer_stop(pos, mem) - minetest.get_node_timer(pos):stop() - M(pos):set_string("infotext", S("off")) - end - end, after_dig_node = function(pos, oldnode) techage.power.after_dig_node(pos, oldnode) Pipe:after_dig_node(pos) @@ -132,10 +123,11 @@ techage.power.enrich_node({"techage:ta4_reactor_stand"}, { -- controlled by the fillerpipe techage.register_node({"techage:ta4_reactor_stand"}, { on_transfer = function(pos, in_dir, topic, payload) - print(topic, payload) + --print(topic, dump(payload)) local mem = tubelib2.get_mem(pos) if topic == "power" then - return mem.has_power + --print("power", mem.has_power) + return mem.has_power or power.power_available(pos, mem, 0) elseif topic == "output" then local outdir = M(pos):get_int("outdir") return liquid.put(pos, outdir, payload.name, payload.amount, payload.player_name) @@ -199,3 +191,21 @@ Pipe:add_secondary_node_names({ "techage:ta4_reactor_base", "techage:ta4_reactor_stand", }) + +minetest.register_craft({ + output = 'techage:ta4_reactor_stand', + recipe = { + {'', 'dye:blue', ''}, + {'basic_materials:steel_bar', 'techage:ta3_pipeS', 'basic_materials:steel_bar'}, + {'basic_materials:steel_bar', '', 'basic_materials:steel_bar'}, + } +}) + +minetest.register_craft({ + output = 'techage:ta4_reactor_base', + recipe = { + {'basic_materials:concrete_block', '', ''}, + {'techage:ta3_pipeS', '', ''}, + {'', '', ''}, + } +}) diff --git a/furnace/cooking.lua b/furnace/cooking.lua index be2838f..1235e29 100644 --- a/furnace/cooking.lua +++ b/furnace/cooking.lua @@ -19,8 +19,8 @@ local S = techage.S local range = techage.range -local Recipes = {} -- registered recipes -local Ingredients = {} +local Recipes = {} -- registered recipes {output = {recipe, ...},} +local Ingredients = {} -- {{input = output}, local KeyList = {} -- index to Recipes key translation techage.furnace = {} @@ -72,22 +72,60 @@ function techage.furnace.get_ingredients(pos) return tbl end +local function remove_item_from_list(list, item) + for _,stack in ipairs(list) do + if stack:get_name() == item then + stack:set_count(stack:get_count() - 1) + return true + end + end + return false +end + -- move recipe src items to output inventory local function process(inv, recipe, output) - -- check if all ingredients are available + -- check dst inv + local stack = ItemStack(output) + stack:set_count(recipe.number) + if not inv:room_for_item("dst", stack) then + return techage.BLOCKED + end + -- remove items + local list = inv:get_list("src") for _,item in ipairs(recipe.input) do - if not inv:contains_item("src", item) then + if not remove_item_from_list(list, item) then + return techage.STANDBY + end + end + -- store changes on scr + inv:set_list("src", list) + -- add output to dst + inv:add_item("dst", stack) + return techage.RUNNING +end + +function techage.furnace.check_if_worth_to_wakeup(pos, mem) + local inv = M(pos):get_inventory() + if not mem.output or not mem.num_recipe then + return false + end + local recipe = Recipes[mem.output] and Recipes[mem.output][mem.num_recipe] + if not recipe then + return false + end + -- check dst inv + local stack = ItemStack(mem.output) + stack:set_count(recipe.number) + if not inv:room_for_item("dst", stack) then + return false + end + -- check src inv + local list = inv:get_list("src") + for _,item in ipairs(recipe.input) do + if not remove_item_from_list(list, item) then return false end end - -- remove items - for _,item in ipairs(recipe.input) do - inv:remove_item("src", item) - end - -- add to dst - local stack = ItemStack(output) - stack:set_count(recipe.number) - inv:add_item("dst", stack) return true end @@ -98,23 +136,16 @@ function techage.furnace.smelting(pos, mem, elapsed) if not mem.output or not mem.num_recipe then return techage.FAULT, "recipe error" end - local recipe = Recipes[mem.output][mem.num_recipe] + local recipe = Recipes[mem.output] and Recipes[mem.output][mem.num_recipe] if not recipe then return techage.FAULT, "recipe error" end - -- check dst inv - local item = ItemStack(mem.output) - if not inv:room_for_item("dst", item) then - return techage.BLOCKED - end elapsed = elapsed + (mem.leftover or 0) while elapsed >= recipe.time do - if process(inv, recipe, mem.output) == false then - mem.leftover = 0 - return techage.STANDBY - else - state = techage.RUNNING + state = process(inv, recipe, mem.output) + if state ~= techage.RUNNING then + return state end elapsed = elapsed - recipe.time end @@ -143,6 +174,7 @@ end function techage.furnace.reset_cooking(mem) mem.leftover = 0 + mem.item_percent = 0 end diff --git a/furnace/furnace_top.lua b/furnace/furnace_top.lua index 856e18e..b7be461 100644 --- a/furnace/furnace_top.lua +++ b/furnace/furnace_top.lua @@ -29,14 +29,21 @@ local get_output = techage.furnace.get_output local num_recipes = techage.furnace.get_num_recipes local reset_cooking = techage.furnace.reset_cooking local get_ingredients = techage.furnace.get_ingredients +local check_if_worth_to_wakeup = techage.furnace.check_if_worth_to_wakeup local range = techage.range -local function formspec(self, pos, mem) + +local function update_recipe_menu(pos, mem) local ingr = get_ingredients(pos) - local num = num_recipes(ingr) - mem.recipe_idx = range(mem.recipe_idx or 1, 0, num) - local idx = mem.recipe_idx - local output = get_output(mem, ingr, idx) + mem.rp_num = num_recipes(ingr) + mem.rp_idx = range(mem.rp_idx or 1, 0, mem.rp_num) + mem.rp_outp = get_output(mem, ingr, mem.rp_idx) +end + +local function formspec(self, pos, mem) + local idx = mem.rp_idx or 1 + local num = mem.rp_num or 1 + local outp = mem.rp_outp or "" return "size[8,7.2]".. default.gui_bg.. default.gui_bg_img.. @@ -50,7 +57,7 @@ local function formspec(self, pos, mem) "list[context;dst;3,0;2,2;]".. "label[6,0;"..S("Outp")..": "..idx.."/"..num.."]".. - "item_image_button[6.5,0.5;1,1;"..(output or "")..";b1;]".. + "item_image_button[6.5,0.5;1,1;"..outp..";b1;]".. "button[6,1.5;1,1;priv;<<]".. "button[7,1.5;1,1;next;>>]".. @@ -75,23 +82,26 @@ local function firebox_cmnd(pos, cmnd) cmnd, -- topic nil, -- payload nil, -- network - {"techage:furnace_firebox", "techage:furnace_firebox_on"}) + {"techage:furnace_firebox", "techage:furnace_firebox_on", + "techage:furnace_heater", "techage:furnace_heater_on"}) end local function cooking(pos, crd, mem, elapsed) - if firebox_cmnd(pos, "running") then - local state, err = smelting(pos, mem, elapsed) - if state == techage.RUNNING then - crd.State:keep_running(pos, mem, COUNTDOWN_TICKS) - elseif state == techage.BLOCKED then - crd.State:blocked(pos, mem) - elseif state == techage.FAULT then - crd.State:fault(pos, mem, err) - elseif state == techage.STANDBY then + if mem.techage_state == techage.RUNNING or check_if_worth_to_wakeup(pos, mem) then + if firebox_cmnd(pos, "fuel") then + local state, err = smelting(pos, mem, elapsed) + if state == techage.RUNNING then + crd.State:keep_running(pos, mem, COUNTDOWN_TICKS) + elseif state == techage.BLOCKED then + crd.State:blocked(pos, mem) + elseif state == techage.FAULT then + crd.State:fault(pos, mem, err) + elseif state == techage.STANDBY then + crd.State:idle(pos, mem) + end + else crd.State:idle(pos, mem) end - else - crd.State:idle(pos, mem) end end @@ -100,7 +110,7 @@ local function keep_running(pos, elapsed) local crd = CRD(pos) cooking(pos, crd, mem, elapsed) mem.toggle = not mem.toggle - if mem.toggle then + if mem.toggle then -- progress bar/arrow M(pos):set_string("formspec", formspec(crd.State, pos, mem)) end return crd.State:is_active(mem) @@ -112,7 +122,6 @@ local function allow_metadata_inventory_put(pos, listname, index, stack, player) end if listname == "src" then local mem = tubelib2.get_mem(pos) - CRD(pos).State:start_if_standby(pos) return stack:get_count() elseif listname == "dst" then return 0 @@ -144,15 +153,17 @@ local function on_receive_fields(pos, formname, fields, player) return end local mem = tubelib2.get_mem(pos) - mem.recipe_idx = mem.recipe_idx or 1 + mem.rp_idx = mem.rp_idx or 1 if fields.next == ">>" then local ingr = get_ingredients(pos) - mem.recipe_idx = math.min(mem.recipe_idx + 1, num_recipes(ingr)) + mem.rp_idx = math.min(mem.rp_idx + 1, num_recipes(ingr)) + update_recipe_menu(pos, mem) M(pos):set_string("formspec", formspec(CRD(pos).State, pos, mem)) reset_cooking(mem) elseif fields.priv == "<<" then local ingr = get_ingredients(pos) - mem.recipe_idx = range(mem.recipe_idx - 1, 1, num_recipes(ingr)) + mem.rp_idx = range(mem.rp_idx - 1, 1, num_recipes(ingr)) + update_recipe_menu(pos, mem) M(pos):set_string("formspec", formspec(CRD(pos).State, pos, mem)) reset_cooking(mem) end @@ -216,7 +227,6 @@ local tubing = { local meta = minetest.get_meta(pos) if meta:get_int("push_dir") == in_dir or in_dir == 5 then local inv = M(pos):get_inventory() - CRD(pos).State:start_if_standby(pos) return techage.put_items(inv, "src", stack) end end, diff --git a/furnace/heater.lua b/furnace/heater.lua new file mode 100644 index 0000000..61534fd --- /dev/null +++ b/furnace/heater.lua @@ -0,0 +1,144 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019 Joachim Stolberg + + GPL v3 + See LICENSE.txt for more information + + TA4 Industrial Furnace Heater + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local S = techage.S + +local firebox = techage.firebox +local fuel = techage.fuel +local Pipe = techage.LiquidPipe +local liquid = techage.liquid + +local CYCLE_TIME = 2 +local PWR_NEEDED = 8 + +local Power = techage.ElectricCable +local power = techage.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 + +local function on_power(pos, mem) + if mem.running then + swap_node(pos, "techage:furnace_heater_on") + minetest.get_node_timer(pos):start(CYCLE_TIME) + end + mem.has_power = true +end + +local function on_nopower(pos, mem) + swap_node(pos, "techage:furnace_heater") + mem.has_power = false +end + +local function node_timer(pos, elapsed) + local mem = tubelib2.get_mem(pos) + power.consumer_alive(pos, mem) + return mem.running +end + +minetest.register_node("techage:furnace_heater", { + description = S("TA4 Furnace Heater"), + tiles = { + -- up, down, right, left, back, front + "techage_concrete.png^techage_appl_open.png^techage_frame_ta3.png", + "techage_concrete.png^techage_frame_ta3.png", + "techage_concrete.png^techage_frame_ta3.png", + "techage_concrete.png^techage_frame_ta3.png^techage_appl_hole_electric.png", + "techage_concrete.png^techage_frame_ta3.png", + "techage_concrete.png^techage_appl_heater.png^techage_frame_ta3.png", + }, + on_timer = node_timer, + 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:furnace_heater_on", { + tiles = { + -- up, down, right, left, back, front + "techage_concrete.png^techage_appl_open.png^techage_frame_ta3.png", + "techage_concrete.png^techage_frame_ta3.png", + "techage_concrete.png^techage_frame_ta3.png", + "techage_concrete.png^techage_frame_ta3.png^techage_appl_hole_electric.png", + "techage_concrete.png^techage_frame_ta3.png", + "techage_concrete.png^techage_appl_heater_on.png^techage_frame_ta3.png", + }, + + light_source = 8, + on_timer = node_timer, + paramtype2 = "facedir", + groups = {not_in_creative_inventory = 1}, + diggable = false, + on_rotate = screwdriver.disallow, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +techage.power.register_node({"techage:furnace_heater", "techage:furnace_heater_on"}, { + power_network = Power, + conn_sides = {"F", "B", "U", "D", "L"}, + on_power = on_power, + on_nopower = on_nopower, + after_place_node = function(pos, placer) + local mem = tubelib2.init_mem(pos) + end, +}) + +minetest.register_craft({ + output = "techage:furnace_heater", + recipe = { + {'techage:basalt_stone', 'default:steel_ingot', 'techage:basalt_stone'}, + {'default:steel_ingot', 'basic_materials:heating_element', 'default:steel_ingot'}, + {'techage:basalt_stone', 'techage:basalt_stone', 'techage:basalt_stone'}, + }, +}) + +techage.register_node({"techage:furnace_heater", "techage:furnace_heater_on"}, { + -- called from furnace_top + on_transfer = function(pos, in_dir, topic, payload) + local mem = tubelib2.get_mem(pos) + if topic == "fuel" then + return mem.has_power or power.power_available(pos, mem, 0) + elseif topic == "running" then + return mem.running and (mem.has_power or power.power_available(pos, mem, 0)) + elseif topic == "start" and not mem.running then + if power.power_available(pos, mem, 0) then + mem.running = true + mem.has_power = false + power.consumer_start(pos, mem, CYCLE_TIME, PWR_NEEDED) + return true + end + elseif topic == "stop" and mem.running then + mem.running = false + swap_node(pos, "techage:furnace_heater") + power.consumer_stop(pos, mem) + minetest.get_node_timer(pos):stop() + return true + end + end +}) + +Pipe:add_secondary_node_names({"techage:furnace_heater", "techage:furnace_heater_on"}) + diff --git a/init.lua b/init.lua index 7eba324..6e34ff2 100644 --- a/init.lua +++ b/init.lua @@ -58,11 +58,6 @@ else dofile(MP.."/doc/items.lua") dofile(MP.."/doc/guide.lua") -- construction guides - -- Nodes1 - dofile(MP.."/nodes/baborium.lua") - dofile(MP.."/nodes/usmium.lua") - dofile(MP.."/nodes/bauxit.lua") - -- Power networks dofile(MP.."/power/schedule.lua") --dofile(MP.."/power/distribute.lua") @@ -121,8 +116,8 @@ else -- Liquids dofile(MP.."/liquids/liquid_pipe.lua") dofile(MP.."/liquids/liquid.lua") - dofile(MP.."/liquids/barrel.lua") dofile(MP.."/liquids/tank.lua") + dofile(MP.."/liquids/silo.lua") dofile(MP.."/liquids/pump.lua") dofile(MP.."/liquids/fuel_lib.lua") @@ -141,6 +136,7 @@ else dofile(MP.."/furnace/cooking.lua") dofile(MP.."/furnace/furnace_top.lua") dofile(MP.."/furnace/booster.lua") + dofile(MP.."/furnace/heater.lua") dofile(MP.."/furnace/recipes.lua") -- Tools @@ -159,25 +155,15 @@ else dofile(MP.."/lamps/industriallamp3.lua") -- Oil - dofile(MP.."/oil/oil.lua") dofile(MP.."/oil/explore.lua") dofile(MP.."/oil/tower.lua") dofile(MP.."/oil/drillbox.lua") dofile(MP.."/oil/pumpjack.lua") dofile(MP.."/oil/generator.lua") - dofile(MP.."/oil/petroleum.lua") dofile(MP.."/oil/distiller.lua") dofile(MP.."/oil/reboiler.lua") dofile(MP.."/oil/gasflare.lua") - -- Nodes2 - if techage.basalt_stone_enabled then - dofile(MP.."/nodes/basalt.lua") - end - dofile(MP.."/nodes/gateblock.lua") - dofile(MP.."/nodes/doorblock.lua") - dofile(MP.."/nodes/steelmat.lua") - -- Logic dofile(MP.."/logic/lib.lua") dofile(MP.."/logic/terminal.lua") @@ -192,6 +178,8 @@ else dofile(MP.."/logic/node_detector.lua") dofile(MP.."/logic/player_detector.lua") dofile(MP.."/logic/cart_detector.lua") + dofile(MP.."/logic/gateblock.lua") + dofile(MP.."/logic/doorblock.lua") -- Test dofile(MP.."/recipe_checker.lua") @@ -201,14 +189,13 @@ else --dofile(MP.."/.test/switch.lua") -- Solar - dofile(MP.."/nodes/silicon.lua") dofile(MP.."/solar/minicell.lua") dofile(MP.."/solar/solarcell.lua") dofile(MP.."/solar/inverter.lua") -- Wind dofile(MP.."/wind_turbine/rotor.lua") - dofile(MP.."/nodes/pillar.lua") + dofile(MP.."/wind_turbine/pillar.lua") dofile(MP.."/wind_turbine/signallamp.lua") -- TA4 Energy Storage @@ -219,12 +206,30 @@ else dofile(MP.."/energy_storage/nodes.lua") -- Chemistry - --dofile(MP.."/chemistry/ta4_reactor.lua") - --dofile(MP.."/chemistry/ta4_stand.lua") - --dofile(MP.."/chemistry/ta4_doser.lua") + dofile(MP.."/chemistry/ta4_reactor.lua") + dofile(MP.."/chemistry/ta4_stand.lua") + dofile(MP.."/chemistry/ta4_doser.lua") -- Hydrogen dofile(MP.."/hydrogen/hydrogen.lua") dofile(MP.."/hydrogen/electrolyzer.lua") dofile(MP.."/hydrogen/fuelcell.lua") + + -- Items + dofile(MP.."/items/barrel.lua") + dofile(MP.."/items/baborium.lua") + dofile(MP.."/items/usmium.lua") + dofile(MP.."/items/lye.lua") + dofile(MP.."/items/oil.lua") + dofile(MP.."/items/petroleum.lua") + dofile(MP.."/items/bauxit.lua") + dofile(MP.."/items/silicon.lua") + dofile(MP.."/items/steelmat.lua") + dofile(MP.."/items/powder.lua") + dofile(MP.."/items/epoxy.lua") + dofile(MP.."/items/aluminium.lua") + + if techage.basalt_stone_enabled then + dofile(MP.."/items/basalt.lua") + end end \ No newline at end of file diff --git a/items/aluminium.lua b/items/aluminium.lua new file mode 100644 index 0000000..fb049ce --- /dev/null +++ b/items/aluminium.lua @@ -0,0 +1,62 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019 Joachim Stolberg + + GPL v3 + See LICENSE.txt for more information + + Aluminium + +]]-- + +local S = techage.S + +minetest.register_craftitem("techage:gibbsite_powder", { + description = S("Gibbsite Powder"), + inventory_image = "techage_powder_inv.png^[colorize:#C6DCDB:120", +}) + +minetest.register_craftitem("techage:aluminum", { + description = S("Aluminum"), + inventory_image = "techage_aluminum_inv.png", +}) + +minetest.register_craftitem("techage:redmud", { + description = S("Red Mud"), + inventory_image = "techage_liquid2_inv.png^[colorize:#F80E13:120^techage_liquid1_inv.png", +}) + +minetest.register_craftitem("techage:barrel_redmud", { + description = S("Red Mud Barrel"), + inventory_image = "techage_barrel_inv.png^[colorize:#F80E13:120^techage_symbol_liquid.png", + stack_max = 1, +}) + +minetest.register_craftitem("techage:canister_redmud", { + description = S("Red Mud Canister"), + inventory_image = "techage_canister_filling.png^[colorize:#F80E13:120^techage_canister_frame.png^techage_symbol_liquid.png", + stack_max = 1, +}) + +techage.register_liquid("techage:barrel_redmud", "techage:ta3_barrel_empty", 10, "techage:epoxy") +techage.register_liquid("techage:canister_redmud", "techage:ta3_canister_empty", 1, "techage:epoxy") + +techage.recipes.add("ta4_doser", { + output = "techage:gibbsite_powder 1", + waste = "techage:redmud 1", + input = { + "techage:bauxite_powder 1", + "techage:lye 1", + } +}) + +techage.furnace.register_recipe({ + output = "techage:aluminum", + recipe = {"techage:gibbsite_powder", "techage:gibbsite_powder", + "techage:gibbsite_powder", "techage:gibbsite_powder"}, + time = 16, + +}) diff --git a/nodes/baborium.lua b/items/baborium.lua similarity index 97% rename from nodes/baborium.lua rename to items/baborium.lua index f23b799..a541052 100644 --- a/nodes/baborium.lua +++ b/items/baborium.lua @@ -8,7 +8,7 @@ GPL v3 See LICENSE.txt for more information - Gravel Sieve basis functions + Baborium ]]-- diff --git a/items/barrel.lua b/items/barrel.lua new file mode 100644 index 0000000..053dd7b --- /dev/null +++ b/items/barrel.lua @@ -0,0 +1,84 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019 Joachim Stolberg + + GPL v3 + See LICENSE.txt for more information + + Barrel/Liquid/Canister/Water + +]]-- + +local S = techage.S + +minetest.register_craftitem("techage:water", { + description = S("Water"), + inventory_image = "techage_liquid2_inv.png^[colorize:#0b6eca:120^techage_liquid1_inv.png", + groups = {not_in_creative_inventory=1}, + +}) + +minetest.register_craftitem("techage:river_water", { + description = S("Water"), + inventory_image = "techage_liquid2_inv.png^[colorize:#189dc3:120^techage_liquid1_inv.png", + groups = {not_in_creative_inventory=1}, + +}) + +minetest.register_craftitem("techage:barrel_water", { + description = S("Water Barrel"), + inventory_image = "techage_barrel_inv.png^[colorize:#0b6eca:120^techage_symbol_liquid.png", + stack_max = 1, +}) + +minetest.register_craftitem("techage:barrel_river_water", { + description = S("River Water Barrel"), + inventory_image = "techage_barrel_inv.png^[colorize:#189dc3:120^techage_symbol_liquid.png", + stack_max = 1, +}) + +minetest.register_craftitem("techage:liquid", { + description = S("empty"), + inventory_image = "techage_liquid2_inv.png^[colorize:#BFBFBF:180^techage_liquid1_inv.png", + groups = {not_in_creative_inventory=1}, +}) + +minetest.register_craftitem("techage:ta3_barrel_empty", { + description = S("TA Empty Barrel"), + inventory_image = "techage_barrel_inv.png^[colorize:#BFBFBF:180", +}) + +minetest.register_craftitem("techage:ta3_canister_empty", { + description = S("TA3 Canister"), + inventory_image = "techage_canister_filling.png^[colorize:#BFBFBF:180^techage_canister_frame.png", +}) + + +minetest.register_craft({ + output = 'techage:ta3_barrel_empty 6', + recipe = { + {'techage:iron_ingot', 'techage:iron_ingot', 'techage:iron_ingot'}, + {'techage:iron_ingot', '', 'techage:iron_ingot'}, + {'techage:iron_ingot', 'techage:iron_ingot', 'techage:iron_ingot'}, + } +}) + +minetest.register_craft({ + output = 'techage:ta3_canister_empty 6', + recipe = { + {'basic_materials:plastic_sheet', 'basic_materials:plastic_sheet', 'basic_materials:plastic_sheet'}, + {'basic_materials:plastic_sheet', '', 'basic_materials:plastic_sheet'}, + {'basic_materials:plastic_sheet', 'basic_materials:plastic_sheet', 'basic_materials:plastic_sheet'}, + } +}) + +techage.register_liquid("bucket:bucket_water", "bucket:bucket_empty", 1, "techage:water") +techage.register_liquid("bucket:bucket_river_water", "bucket:bucket_empty", 1, "techage:river_water") + +techage.register_liquid("techage:barrel_water", "techage:ta3_barrel_empty", 10, "techage:water") +techage.register_liquid("techage:barrel_river_water", "techage:ta3_barrel_empty", 10, "techage:river_water") + +techage.register_liquid("bucket:bucket_lava", "bucket:bucket_empty", 1, "default:lava_source") diff --git a/nodes/basalt.lua b/items/basalt.lua similarity index 100% rename from nodes/basalt.lua rename to items/basalt.lua diff --git a/nodes/bauxit.lua b/items/bauxit.lua similarity index 71% rename from nodes/bauxit.lua rename to items/bauxit.lua index a06feb6..bd25a93 100644 --- a/nodes/bauxit.lua +++ b/items/bauxit.lua @@ -16,7 +16,7 @@ local S = techage.S minetest.register_node("techage:bauxite_stone", { description = S("Bauxite Stone"), - tiles = {"default_desert_stone.png^techage_bauxit_overlay.png^[colorize:#800000:80"}, + tiles = {"default_desert_stone.png^techage_bauxit_overlay.png^[colorize:#FB2A00:120"}, groups = {cracky = 3, stone = 1}, drop = 'techage:bauxite_cobble', sounds = default.node_sound_stone_defaults(), @@ -24,7 +24,7 @@ minetest.register_node("techage:bauxite_stone", { minetest.register_node("techage:bauxite_cobble", { description = S("Bauxite Cobblestone"), - tiles = {"default_desert_cobble.png^[colorize:#800000:80"}, + tiles = {"default_desert_cobble.png^[colorize:#FB2A00:80"}, is_ground_content = false, groups = {cracky = 3, stone = 2}, sounds = default.node_sound_stone_defaults(), @@ -32,12 +32,18 @@ minetest.register_node("techage:bauxite_cobble", { minetest.register_node("techage:bauxite_gravel", { description = S("Bauxite Gravel"), - tiles = {"default_gravel.png^[colorize:#9b1f06:180"}, + tiles = {"default_gravel.png^[colorize:#FB2A00:180"}, is_ground_content = false, groups = {crumbly = 2, falling_node = 1}, sounds = default.node_sound_gravel_defaults(), }) +minetest.register_craftitem("techage:bauxite_powder", { + description = S("Bauxite Powder"), + inventory_image = "techage_powder_inv.png^[colorize:#FB2A00:120", +}) + + minetest.register_ore({ ore_type = "blob", ore = "techage:bauxite_stone", @@ -57,3 +63,5 @@ minetest.register_ore({ }, }) +techage.add_grinder_recipe({input="techage:bauxite_cobble", output="techage:bauxite_gravel"}) +techage.add_grinder_recipe({input="techage:bauxite_gravel", output="techage:bauxite_powder"}) diff --git a/items/epoxy.lua b/items/epoxy.lua new file mode 100644 index 0000000..dda8c44 --- /dev/null +++ b/items/epoxy.lua @@ -0,0 +1,45 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019 Joachim Stolberg + + GPL v3 + See LICENSE.txt for more information + + Epoxy + +]]-- + +local S = techage.S + +minetest.register_craftitem("techage:epoxy", { + description = S("Epoxide Resin"), + inventory_image = "techage_liquid2_inv.png^[colorize:#ca2446:120^techage_liquid1_inv.png", +}) + +minetest.register_craftitem("techage:barrel_epoxy", { + description = S("Epoxide Resin Barrel"), + inventory_image = "techage_barrel_inv.png^[colorize:#ca2446:120^techage_symbol_liquid.png", + stack_max = 1, +}) + +minetest.register_craftitem("techage:canister_epoxy", { + description = S("Epoxide Resin Canister"), + inventory_image = "techage_canister_filling.png^[colorize:#ca2446:120^techage_canister_frame.png^techage_symbol_liquid.png", + stack_max = 1, +}) + +techage.recipes.add("ta4_doser", { + output = "techage:epoxy 1", + input = { + "techage:naphtha 1", + "techage:needle_powder 1", + } +}) + +techage.register_liquid("techage:barrel_epoxy", "techage:ta3_barrel_empty", 10, "techage:epoxy") +techage.register_liquid("techage:canister_epoxy", "techage:ta3_canister_empty", 1, "techage:epoxy") + +minetest.register_alias("techage:ta4_epoxy", "techage:canister_epoxy") \ No newline at end of file diff --git a/items/lye.lua b/items/lye.lua new file mode 100644 index 0000000..1047e34 --- /dev/null +++ b/items/lye.lua @@ -0,0 +1,43 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019 Joachim Stolberg + + GPL v3 + See LICENSE.txt for more information + + Lye + +]]-- + +local S = techage.S + +minetest.register_craftitem("techage:lye", { + description = S("Lye"), + inventory_image = "techage_liquid2_inv.png^[colorize:#7fd44c:120^techage_liquid1_inv.png", +}) + +minetest.register_craftitem("techage:barrel_lye", { + description = S("Lye Barrel"), + inventory_image = "techage_barrel_inv.png^[colorize:#7fd44c:120^techage_symbol_liquid.png", + stack_max = 1, +}) + +minetest.register_craftitem("techage:canister_lye", { + description = S("Lye Canister"), + inventory_image = "techage_canister_filling.png^[colorize:#7fd44c:120^techage_canister_frame.png^techage_symbol_liquid.png", + stack_max = 1, +}) + +techage.recipes.add("ta4_doser", { + output = "techage:lye 1", + input = { + "techage:water 1", + "techage:usmium_powder 1", + } +}) + +techage.register_liquid("techage:barrel_lye", "techage:ta3_barrel_empty", 10, "techage:lye") +techage.register_liquid("techage:canister_lye", "techage:ta3_canister_empty", 1, "techage:lye") diff --git a/oil/oil.lua b/items/oil.lua similarity index 78% rename from oil/oil.lua rename to items/oil.lua index e4b9b24..61828d8 100644 --- a/oil/oil.lua +++ b/items/oil.lua @@ -22,7 +22,7 @@ minetest.register_node("techage:oil_source", { drawtype = "liquid", paramtype = "light", - inventory_image = "techage_oil_inv.png", + inventory_image = "techage_liquid2_inv.png^[colorize:#000000^techage_liquid1_inv.png", tiles = { { name = "techage_oil_animated.png", @@ -119,5 +119,19 @@ bucket.register_liquid( "techage_bucket_oil.png", "Oil Bucket") +minetest.register_craftitem("techage:ta3_barrel_oil", { + description = S("TA3 Oil Barrel"), + inventory_image = "techage_barrel_inv.png^[colorize:#000000:120^techage_symbol_liquid.png", + stack_max = 1, +}) + +minetest.register_craftitem("techage:ta3_canister_oil", { + description = S("TA3 Oil Canister"), + inventory_image = "techage_canister_filling.png^[colorize:#000000^techage_canister_frame.png^techage_symbol_liquid.png", + stack_max = 1, +}) + techage.register_liquid("techage:bucket_oil", "bucket:bucket_empty", 1, "techage:oil_source") techage.register_liquid("techage:oil_source", "", 1, "techage:oil_source") +techage.register_liquid("techage:ta3_barrel_oil", "techage:ta3_barrel_empty", 10, "techage:oil_source") +techage.register_liquid("techage:ta3_canister_oil", "techage:ta3_canister_empty", 1, "techage:oil_source") diff --git a/oil/petroleum.lua b/items/petroleum.lua similarity index 73% rename from oil/petroleum.lua rename to items/petroleum.lua index 6e8acca..5c532c9 100644 --- a/oil/petroleum.lua +++ b/items/petroleum.lua @@ -17,26 +17,22 @@ local S = techage.S minetest.register_craftitem("techage:bitumen", { description = S("TA3 Bitumen"), - inventory_image = "techage_bitumen_inv.png", - groups = {not_in_creative_inventory=1}, + inventory_image = "techage_liquid2_inv.png^[colorize:#000000", }) minetest.register_craftitem("techage:fueloil", { description = S("TA3 Fuel Oil"), - inventory_image = "techage_fueloil_inv.png", - groups = {not_in_creative_inventory=1}, + inventory_image = "techage_liquid2_inv.png^[colorize:#4b3f11^techage_liquid1_inv.png", }) minetest.register_craftitem("techage:naphtha", { description = S("TA3 Naphtha"), - inventory_image = "techage_naphtha_inv.png", - groups = {not_in_creative_inventory=1}, + inventory_image = "techage_liquid2_inv.png^[colorize:#897937^techage_liquid1_inv.png", }) minetest.register_craftitem("techage:gasoline", { description = S("TA3 Gasoline"), - inventory_image = "techage_gasoline_inv.png", - groups = {not_in_creative_inventory=1}, + inventory_image = "techage_liquid2_inv.png^[colorize:#bfaf6e^techage_liquid1_inv.png", }) minetest.register_craftitem("techage:gas", { @@ -46,64 +42,52 @@ minetest.register_craftitem("techage:gas", { }) -minetest.register_craftitem("techage:ta3_barrel_oil", { - description = S("TA3 Oil Barrel"), - inventory_image = "techage_barrel_oil_inv.png", - stack_max = 1, -}) - minetest.register_craftitem("techage:ta3_barrel_bitumen", { description = S("TA3 Bitumen Barrel"), - inventory_image = "techage_barrel_bitumen_inv.png", + inventory_image = "techage_barrel_inv.png^[colorize:#000000:120", stack_max = 1, }) minetest.register_craftitem("techage:ta3_barrel_fueloil", { description = S("TA3 Fuel Oil Barrel"), - inventory_image = "techage_barrel_fueloil_inv.png", + inventory_image = "techage_barrel_inv.png^[colorize:#4b3f11:120^techage_symbol_liquid.png", stack_max = 1, }) minetest.register_craftitem("techage:ta3_barrel_naphtha", { description = S("TA3 Naphtha Barrel"), - inventory_image = "techage_barrel_naphtha_inv.png", + inventory_image = "techage_barrel_inv.png^[colorize:#897937:120^techage_symbol_liquid.png", stack_max = 1, }) minetest.register_craftitem("techage:ta3_barrel_gasoline", { description = S("TA3 Gasoline Barrel"), - inventory_image = "techage_barrel_gasoline_inv.png", + inventory_image = "techage_barrel_inv.png^[colorize:#bfaf6e:120^techage_symbol_liquid.png", stack_max = 1, }) -minetest.register_craftitem("techage:ta3_canister_oil", { - description = S("TA3 Oil Canister"), - inventory_image = "techage_canister_bitumen_inv.png", - stack_max = 1, -}) - minetest.register_craftitem("techage:ta3_canister_bitumen", { description = S("TA3 Bitumen Canister"), - inventory_image = "techage_canister_bitumen_inv.png", + inventory_image = "techage_canister_filling.png^[colorize:#000000^techage_canister_frame.png", stack_max = 1, }) minetest.register_craftitem("techage:ta3_canister_fueloil", { description = S("TA3 Fuel Oil Canister"), - inventory_image = "techage_canister_fueloil_inv.png", + inventory_image = "techage_canister_filling.png^[colorize:#4b3f11^techage_canister_frame.png^techage_symbol_liquid.png", stack_max = 1, }) minetest.register_craftitem("techage:ta3_canister_naphtha", { description = S("TA3 Naphtha Canister"), - inventory_image = "techage_canister_naphtha_inv.png", + inventory_image = "techage_canister_filling.png^[colorize:#897937^techage_canister_frame.png^techage_symbol_liquid.png", stack_max = 1, }) minetest.register_craftitem("techage:ta3_canister_gasoline", { description = S("TA3 Gasoline Canister"), - inventory_image = "techage_canister_gasoline_inv.png", + inventory_image = "techage_canister_filling.png^[colorize:#bfaf6e^techage_canister_frame.png^techage_symbol_liquid.png", stack_max = 1, }) diff --git a/items/powder.lua b/items/powder.lua new file mode 100644 index 0000000..2e81c9f --- /dev/null +++ b/items/powder.lua @@ -0,0 +1,36 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019 Joachim Stolberg + + GPL v3 + See LICENSE.txt for more information + + Powder + +]]-- + +local S = techage.S + +minetest.register_craftitem("techage:leave_powder", { + description = S("Leave Powder"), + inventory_image = "techage_powder_inv.png^[colorize:#71a157:120", +}) + +minetest.register_craftitem("techage:needle_powder", { + description = S("Needle Powder"), + inventory_image = "techage_powder_inv.png^[colorize:#1c800f:120", +}) + +techage.add_grinder_recipe({input="default:acacia_bush_leaves", output="techage:leave_powder"}) +techage.add_grinder_recipe({input="default:acacia_leaves", output="techage:leave_powder"}) +techage.add_grinder_recipe({input="default:aspen_leaves", output="techage:leave_powder"}) +techage.add_grinder_recipe({input="default:blueberry_bush_leaves", output="techage:leave_powder"}) +techage.add_grinder_recipe({input="default:bush_leaves", output="techage:leave_powder"}) +techage.add_grinder_recipe({input="default:jungleleaves", output="techage:leave_powder"}) +techage.add_grinder_recipe({input="default:leaves", output="techage:leave_powder"}) + +techage.add_grinder_recipe({input="default:pine_needles", output="techage:needle_powder"}) + diff --git a/nodes/silicon.lua b/items/silicon.lua similarity index 100% rename from nodes/silicon.lua rename to items/silicon.lua diff --git a/nodes/steelmat.lua b/items/steelmat.lua similarity index 100% rename from nodes/steelmat.lua rename to items/steelmat.lua diff --git a/nodes/usmium.lua b/items/usmium.lua similarity index 53% rename from nodes/usmium.lua rename to items/usmium.lua index 505cda7..888c4df 100644 --- a/nodes/usmium.lua +++ b/items/usmium.lua @@ -19,3 +19,9 @@ minetest.register_craftitem("techage:usmium_nuggets", { inventory_image = "techage_usmium_nuggets.png", }) +minetest.register_craftitem("techage:usmium_powder", { + description = S("Usmium Powder"), + inventory_image = "techage_powder_inv.png^[colorize:#46728E:120", +}) + +techage.add_grinder_recipe({input="techage:usmium_nuggets", output="techage:usmium_powder"}) diff --git a/liquids/barrel.lua b/liquids/barrel.lua deleted file mode 100644 index e431137..0000000 --- a/liquids/barrel.lua +++ /dev/null @@ -1,50 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - GPL v3 - See LICENSE.txt for more information - - Helper functions for liquid transportation (peer, put, take) - -]]-- - -local S = techage.S - -minetest.register_craftitem("techage:ta3_barrel_empty", { - description = S("TA Empty Barrel"), - inventory_image = "techage_barrel_inv.png", -}) - -minetest.register_craft({ - output = 'techage:ta3_barrel_empty 6', - recipe = { - {'techage:iron_ingot', 'techage:iron_ingot', 'techage:iron_ingot'}, - {'techage:iron_ingot', '', 'techage:iron_ingot'}, - {'techage:iron_ingot', 'techage:iron_ingot', 'techage:iron_ingot'}, - } -}) - -minetest.register_craftitem("techage:liquid", { - description = S("empty"), - inventory_image = "techage_liquid_inv.png", - groups = {not_in_creative_inventory=1}, - -}) - -minetest.register_craftitem("techage:ta3_canister_empty", { - description = S("TA3 Canister"), - inventory_image = "techage_canister_inv.png", -}) - -minetest.register_craft({ - output = 'techage:ta3_canister_empty 6', - recipe = { - {'basic_materials:plastic_sheet', 'basic_materials:plastic_sheet', 'basic_materials:plastic_sheet'}, - {'basic_materials:plastic_sheet', '', 'basic_materials:plastic_sheet'}, - {'basic_materials:plastic_sheet', 'basic_materials:plastic_sheet', 'basic_materials:plastic_sheet'}, - } -}) diff --git a/liquids/liquid.lua b/liquids/liquid.lua index 429b169..fac6e0f 100644 --- a/liquids/liquid.lua +++ b/liquids/liquid.lua @@ -12,6 +12,7 @@ ]]-- +local P2S = minetest.pos_to_string local M = minetest.get_meta local N = function(pos) return minetest.get_node(pos).name end local LQD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}).liquid end @@ -30,13 +31,13 @@ local ContainerDef = {} -- Networks -- --- determine network ID (largest hash number) +-- determine network ID (largest hash number of all pumps) local function determine_netID(pos, outdir) local netID = 0 networks.connection_walk(pos, outdir, Pipe, function(pos, indir, node) local ntype = net_def(pos, "pipe").ntype - if ntype and ntype ~= "pump" then - local new = minetest.hash_node_position(pos) + if ntype and ntype == "pump" then + local new = minetest.hash_node_position(pos) * 8 + outdir if netID <= new then netID = new end @@ -45,52 +46,59 @@ local function determine_netID(pos, outdir) return netID end --- store network ID on each node +-- store network ID on each pump like node local function store_netID(pos, outdir, netID) networks.connection_walk(pos, outdir, Pipe, function(pos, indir, node) local ntype = net_def(pos, "pipe").ntype - if ntype and ntype ~= "pump" then + if ntype and ntype == "pump" then local mem = tubelib2.get_mem(pos) + local outdir = networks.Flip[indir] mem.pipe = mem.pipe or {} - mem.pipe.netID = netID + mem.pipe.netIDs = mem.pipe.netIDs or {} + mem.pipe.netIDs[outdir] = netID end end) end --- delete network and ID on each node +-- delete network and ID on each pump like node local function delete_netID(pos, outdir) local netID = 0 networks.connection_walk(pos, outdir, Pipe, function(pos, indir, node) local ntype = net_def(pos, "pipe").ntype - if ntype and ntype ~= "pump" then + if ntype and ntype == "pump" then local mem = tubelib2.get_mem(pos) - if mem.pipe and mem.pipe.netID then - netID = mem.pipe.netID - mem.pipe.netID = nil + local outdir = networks.Flip[indir] + if mem.pipe and mem.pipe.netIDs and mem.pipe.netIDs[outdir] then + netID = mem.pipe.netIDs[outdir] + mem.pipe.netIDs[outdir] = nil end end end) networks.delete_network(netID, Pipe) end - -local function get_network_table(pos, outdir, ntype) - -- jump to the next node because pumps have two network - -- interfaces and therefore can't have a netID - local pos2 = Pipe:get_connected_node_pos(pos, outdir) - local mem = tubelib2.get_mem(pos2) - if not mem.pipe or not mem.pipe.netID then +local function get_netID(pos, outdir) + local mem = tubelib2.get_mem(pos) + if not mem.pipe or not mem.pipe.netIDs or not mem.pipe.netIDs[outdir] then local netID = determine_netID(pos, outdir) store_netID(pos, outdir, netID) - mem.pipe = mem.pipe or {} - mem.pipe.netID = netID end - local netw = networks.get_network(mem.pipe.netID, Pipe) - if not netw then - netw = networks.collect_network_nodes(pos, outdir, Pipe) - networks.set_network(mem.pipe.netID, Pipe, netw) + return mem.pipe.netIDs[outdir] +end + +local function get_network_table(pos, outdir, ntype) + local netID = get_netID(pos, outdir) + if netID then + local netw = networks.get_network(netID, Pipe) + if not netw then + netw = networks.collect_network_nodes(pos, outdir, Pipe) + networks.set_network(netID, Pipe, netw) + end + local s = minetest.pos_to_string(minetest.get_position_from_hash(netID)) + --print("netw", string.format("%012X", netID), s, dump(netw)) + return netw[ntype] or {} end - return netw[ntype] or {} + return {} end @@ -230,44 +238,9 @@ function techage.liquid.get_full_container(empty_container, inv_item) end -- To be called from each node via 'tubelib2_on_update2' --- 'output' is optional and only needed for nodes with two --- different networks. +-- 'output' is optional and only needed for nodes with dedicated +-- pipe sides (e.g. pumps). function techage.liquid.update_network(pos, outdir) networks.node_connections(pos, Pipe) delete_netID(pos, outdir) end - -minetest.register_craftitem("techage:water", { - description = S("Water"), - inventory_image = "techage_water_inv.png", - groups = {not_in_creative_inventory=1}, - -}) - -minetest.register_craftitem("techage:river_water", { - description = S("Water"), - inventory_image = "techage_water_inv.png", - groups = {not_in_creative_inventory=1}, - -}) - -minetest.register_craftitem("techage:barrel_water", { - description = S("Water Barrel"), - inventory_image = "techage_barrel_water_inv.png", - stack_max = 1, -}) - -minetest.register_craftitem("techage:barrel_river_water", { - description = S("River Water Barrel"), - inventory_image = "techage_barrel_water_inv.png", - stack_max = 1, -}) - -techage.register_liquid("bucket:bucket_water", "bucket:bucket_empty", 1, "techage:water") -techage.register_liquid("bucket:bucket_river_water", "bucket:bucket_empty", 1, "techage:river_water") - -techage.register_liquid("techage:barrel_water", "techage:ta3_barrel_empty", 10, "techage:water") -techage.register_liquid("techage:barrel_river_water", "techage:ta3_barrel_empty", 10, "techage:river_water") - -techage.register_liquid("bucket:bucket_lava", "bucket:bucket_empty", 1, "default:lava_source") - diff --git a/liquids/liquid.lua.orig b/liquids/liquid.lua.orig new file mode 100644 index 0000000..d337e6d --- /dev/null +++ b/liquids/liquid.lua.orig @@ -0,0 +1,286 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019 Joachim Stolberg + + GPL v3 + See LICENSE.txt for more information + + Liquid transportation API via Pipe(s) (peer, put, take) + +]]-- + +local P2S = minetest.pos_to_string +local M = minetest.get_meta +local N = function(pos) return minetest.get_node(pos).name end +local LQD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}).liquid end +local Pipe = techage.LiquidPipe +local S = techage.S + +local net_def = techage.networks.net_def +local networks = techage.networks + +techage.liquid = {} + +local LiquidDef = {} +local ContainerDef = {} + +-- +-- Networks +-- + +-- determine network ID (largest hash number) +local function determine_netID(pos, outdir) + local netID = 0 + networks.connection_walk(pos, outdir, Pipe, function(pos, indir, node) + local ntype = net_def(pos, "pipe").ntype + if ntype and ntype ~= "pump" then + local new = minetest.hash_node_position(pos) + if netID <= new then + netID = new + end + end + end) + return netID +end + +-- store network ID on each node +local function store_netID(pos, outdir, netID) + networks.connection_walk(pos, outdir, Pipe, function(pos, indir, node) + local ntype = net_def(pos, "pipe").ntype + if ntype and ntype ~= "pump" then + local mem = tubelib2.get_mem(pos) + mem.pipe = mem.pipe or {} + mem.pipe.netID = netID + end + end) +end + +-- delete network and ID on each node +local function delete_netID(pos, outdir) + local netID = 0 + networks.connection_walk(pos, outdir, Pipe, function(pos, indir, node) + local ntype = net_def(pos, "pipe").ntype + if ntype and ntype ~= "pump" then + local mem = tubelib2.get_mem(pos) + if mem.pipe and mem.pipe.netID then + netID = mem.pipe.netID + mem.pipe.netID = nil + end + end + end) + networks.delete_network(netID, Pipe) +end + +local function get_netID(pos, outdir) + -- jump to the next node because pumps have two network + -- interfaces and therefore can't have a netID + local pos2 = Pipe:get_connected_node_pos(pos, outdir) + if not vector.equals(pos2, pos) then + local mem = tubelib2.get_mem(pos2) + if not mem.pipe or not mem.pipe.netID then + -- determine the ID + local netID = determine_netID(pos2, outdir) + store_netID(pos2, outdir, netID) + mem.pipe = mem.pipe or {} + mem.pipe.netID = netID + end + return mem.pipe.netID + end +end + +local function get_network_table(pos, outdir, ntype) + local netID = get_netID(pos, outdir) + if netID then + local netw = networks.get_network(netID, Pipe) + if not netw then + netw = networks.collect_network_nodes(pos, outdir, Pipe) + networks.set_network(netID, Pipe, netw) + end + local s = minetest.pos_to_string(minetest.get_position_from_hash(netID)) + --print("netw", string.format("%012X", netID), s, dump(netw)) + return netw[ntype] or {} + end + return {} +end + + +-- +-- Client remote functions +-- + +-- Determine and return liquid 'name' from the +-- remote inventory. +function techage.liquid.peek(pos, outdir) + for _,item in ipairs(get_network_table(pos, outdir, "tank")) do + local liquid = LQD(item.pos) + if liquid and liquid.peek then + return liquid.peek(item.pos, item.indir) + end + end +end + +-- Add given amount of liquid to the remote inventory. +-- return leftover amount +function techage.liquid.put(pos, outdir, name, amount, player_name) + for _,item in ipairs(get_network_table(pos, outdir, "tank")) do + local liquid = LQD(item.pos) + if liquid and liquid.put and liquid.peek then + -- wrong items? + local peek = liquid.peek(item.pos, item.indir) + if peek and peek ~= name then return amount or 0 end + if player_name then + local num = techage.get_node_number(pos) or "000" + techage.mark_position(player_name, item.pos, "("..num..") put", "", 1) + end + amount = liquid.put(item.pos, item.indir, name, amount) + if not amount or amount == 0 then break end + end + end + return amount or 0 +end + +-- Take given amount of liquid for the remote inventory. +-- return taken amount and item name +function techage.liquid.take(pos, outdir, name, amount, player_name) + local taken = 0 + local item_name = nil + for _,item in ipairs(get_network_table(pos, outdir, "tank")) do + local liquid = LQD(item.pos) + if liquid and liquid.take then + if player_name then + local num = techage.get_node_number(pos) + techage.mark_position(player_name, item.pos, "("..num..") take", "", 1) + end + local val, name = liquid.take(item.pos, item.indir, name, amount - taken) + if val and name then + taken = taken + val + item_name = name + if amount - taken == 0 then break end + end + end + end + return taken, item_name +end + +-- +-- Server local functions +-- + +function techage.liquid.srv_peek(pos, indir) + local mem = tubelib2.get_mem(pos) + mem.liquid = mem.liquid or {} + return mem.liquid.name +end + +function techage.liquid.srv_put(pos, indir, name, amount) + local mem = tubelib2.get_mem(pos) + mem.liquid = mem.liquid or {} + amount = amount or 0 + if not mem.liquid.name then + mem.liquid.name = name + mem.liquid.amount = amount + return 0 + elseif mem.liquid.name == name then + mem.liquid.amount = mem.liquid.amount or 0 + local capa = LQD(pos).capa + if mem.liquid.amount + amount <= capa then + mem.liquid.amount = mem.liquid.amount + amount + return 0 + else + local rest = mem.liquid.amount + amount - capa + mem.liquid.amount = capa + return rest + end + end + return amount +end + +function techage.liquid.srv_take(pos, indir, name, amount) + local mem = tubelib2.get_mem(pos) + mem.liquid = mem.liquid or {} + amount = amount or 0 + if not name or mem.liquid.name == name then + name = mem.liquid.name + mem.liquid.amount = mem.liquid.amount or 0 + if mem.liquid.amount > amount then + mem.liquid.amount = mem.liquid.amount - amount + return amount, name + else + local rest = mem.liquid.amount + local name = mem.liquid.name + mem.liquid.amount = 0 + mem.liquid.name = nil + return rest, name + end + end + return 0 +end + +-- +-- Further API functions +-- + +-- like: register_liquid("techage:ta3_barrel_oil", "techage:ta3_barrel_empty", 10, "techage:oil") +function techage.register_liquid(full_container, empty_container, container_size, inv_item) + LiquidDef[full_container] = {container = empty_container, size = container_size, inv_item = inv_item} + ContainerDef[empty_container] = ContainerDef[empty_container] or {} + ContainerDef[empty_container][inv_item] = full_container +end + +function techage.liquid.get_liquid_def(full_container) + return LiquidDef[full_container] +end + +function techage.liquid.is_container_empty(container_name) + return ContainerDef[container_name] +end + +function techage.liquid.get_full_container(empty_container, inv_item) + return ContainerDef[empty_container] and ContainerDef[empty_container][inv_item] +end + +-- To be called from each node via 'tubelib2_on_update2' +-- 'output' is optional and only needed for nodes with dedicated +-- pipe sides (e.g. pumps). +function techage.liquid.update_network(pos, outdir) + networks.node_connections(pos, Pipe) + delete_netID(pos, outdir) +end + +minetest.register_craftitem("techage:water", { + description = S("Water"), + inventory_image = "techage_water_inv.png", + groups = {not_in_creative_inventory=1}, + +}) + +minetest.register_craftitem("techage:river_water", { + description = S("Water"), + inventory_image = "techage_water_inv.png", + groups = {not_in_creative_inventory=1}, + +}) + +minetest.register_craftitem("techage:barrel_water", { + description = S("Water Barrel"), + inventory_image = "techage_barrel_water_inv.png", + stack_max = 1, +}) + +minetest.register_craftitem("techage:barrel_river_water", { + description = S("River Water Barrel"), + inventory_image = "techage_barrel_water_inv.png", + stack_max = 1, +}) + +techage.register_liquid("bucket:bucket_water", "bucket:bucket_empty", 1, "techage:water") +techage.register_liquid("bucket:bucket_river_water", "bucket:bucket_empty", 1, "techage:river_water") + +techage.register_liquid("techage:barrel_water", "techage:ta3_barrel_empty", 10, "techage:water") +techage.register_liquid("techage:barrel_river_water", "techage:ta3_barrel_empty", 10, "techage:river_water") + +techage.register_liquid("bucket:bucket_lava", "bucket:bucket_empty", 1, "default:lava_source") + diff --git a/liquids/pump.lua b/liquids/pump.lua index 911048a..7fb4337 100644 --- a/liquids/pump.lua +++ b/liquids/pump.lua @@ -128,6 +128,7 @@ end local function after_dig_node(pos, oldnode, oldmetadata, digger) Pipe:after_dig_node(pos) + tubelib2.del_mem(pos) end local ta3_tiles_pas = { diff --git a/liquids/silo.lua b/liquids/silo.lua new file mode 100644 index 0000000..f4e9c10 --- /dev/null +++ b/liquids/silo.lua @@ -0,0 +1,215 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019 Joachim Stolberg + + GPL v3 + See LICENSE.txt for more information + + TA3/TA4 Powder Silo + +]]-- + +local S2P = minetest.string_to_pos +local P2S = minetest.pos_to_string +local M = minetest.get_meta +local S = techage.S +local LQD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}).liquid end +local Pipe = techage.LiquidPipe +local liquid = techage.liquid + +local INV_SIZE = 8 + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + local mem = tubelib2.get_mem(pos) + mem.item_name = nil + local inv = minetest.get_meta(pos):get_inventory() + if inv:is_empty(listname) then + return stack:get_count() + end + if inv:contains_item(listname, ItemStack(stack:get_name())) then + return stack:get_count() + end + return 0 +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + local mem = tubelib2.get_mem(pos) + mem.item_name = nil + return stack:get_count() +end + +local function can_dig(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local inv = minetest.get_meta(pos):get_inventory() + return inv:is_empty("main") +end + +local function get_item_name(mem, inv) + for idx = 1, INV_SIZE do + local stack = inv:get_stack("main", idx) + if stack:get_count() > 0 then + mem.item_name = stack:get_name() + return mem.item_name + end + end +end + +local function formspec() + return "size[8,6]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;main;0,0;8,2;]".. + "list[current_player;main;0,2.3;8,4;]".. + "listring[context;main]".. + "listring[current_player;main]" +end + + +minetest.register_node("techage:ta3_silo", { + description = S("TA3 Silo"), + 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.png^techage_appl_silo.png", + "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_silo.png", + "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_silo.png", + "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_silo.png", + }, + on_construct = function(pos) + local inv = M(pos):get_inventory() + inv:set_size('main', INV_SIZE) + end, + after_place_node = function(pos, placer) + local meta = M(pos) + local mem = tubelib2.init_mem(pos) + mem.liquid = {} + local number = techage.add_node(pos, "techage:ta3_silo") + meta:set_string("node_number", number) + meta:set_string("owner", placer:get_player_name()) + meta:set_string("formspec", formspec(mem)) + meta:set_string("infotext", S("TA3 Silo").." "..number) + Pipe:after_place_node(pos) + end, + tubelib2_on_update2 = function(pos, outdir, tlib2, node) + liquid.update_network(pos, outdir) + end, + on_timer = function(pos, elapsed) + local mem = tubelib2.get_mem(pos) + if mem.countdown then + mem.countdown = mem.countdown - 1 + M(pos):set_string("formspec", formspec(mem)) + return mem.countdown > 0 + end + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + Pipe:after_dig_node(pos) + techage.remove_node(pos) + end, + liquid = { + capa = 0, + peek = function(pos, indir) + local mem = tubelib2.get_mem(pos) + local inv = M(pos):get_inventory() + if not inv:is_empty("main") then + return mem.item_name or get_item_name(mem, inv) + end + end, + put = function(pos, indir, name, amount) + local inv = M(pos):get_inventory() + local stack = ItemStack(name.." "..amount) + if inv:room_for_item("main", stack) then + inv:add_item("main", stack) + return 0 + end + return amount + end, + take = function(pos, indir, name, amount) + local inv = M(pos):get_inventory() + local stack = ItemStack(name.." "..amount) + if inv:contains_item("main", stack) then + inv:room_for_item("main", stack) + return amount, name + end + return 0 + end, + }, + networks = { + pipe = { + sides = techage.networks.AllSides, -- Pipe connection sides + ntype = "tank", + }, + }, + can_dig = can_dig, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + paramtype2 = "facedir", + on_rotate = screwdriver.disallow, + groups = {cracky=2}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + + +techage.register_node({"techage:ta3_silo", "techage:ta4_silo"}, { + on_pull_item = function(pos, in_dir, num) + local inv = M(pos):get_inventory() + if not inv:is_empty("main") then + return techage.get_items(inv, "main", num) + end + end, + on_push_item = function(pos, in_dir, stack) + local inv = M(pos):get_inventory() + if inv:room_for_item("main", stack) then + inv:add_item("main", stack) + return true + end + return false + end, + on_unpull_item = function(pos, in_dir, stack) + local meta = M(pos) + local inv = meta:get_inventory() + return techage.put_items(inv, "main", stack) + end, + on_recv_message = function(pos, src, topic, payload) + if topic == "state" then + local meta = M(pos) + local inv = meta:get_inventory() + return techage.get_inv_state(inv, "main") + else + return "unsupported" + end + end, +}) + +Pipe:add_secondary_node_names({"techage:ta3_silo", "techage:ta4_silo"}) + +minetest.register_craft({ + output = "techage:ta3_silo", + recipe = { + {"", "", ""}, + {"techage:tubeS", "techage:chest_ta3", "techage:ta3_pipeS"}, + {"", "", ""}, + }, +}) + +minetest.register_craft({ + output = "techage:ta4_silo", + recipe = { + {"default:tin_ingot", "dye:blue", "default:steel_ingot"}, + {"", "techage:ta3_silo", ""}, + {"", "", ""}, + }, +}) diff --git a/liquids/tank.lua b/liquids/tank.lua index 5188f33..b079cd0 100644 --- a/liquids/tank.lua +++ b/liquids/tank.lua @@ -180,8 +180,8 @@ minetest.register_node("techage:ta3_tank", { meta:set_string("infotext", S("TA3 Tank").." "..number) Pipe:after_place_node(pos) end, - tubelib2_on_update2 = function(pos, dir, tlib2, node) - liquid.update_network(pos) + tubelib2_on_update2 = function(pos, outdir, tlib2, node) + liquid.update_network(pos, outdir) end, on_timer = function(pos, elapsed) local mem = tubelib2.get_mem(pos) @@ -267,8 +267,8 @@ minetest.register_node("techage:oiltank", { meta:set_string("infotext", S("Oil Tank").." "..number) Pipe:after_place_node(pos) end, - tubelib2_on_update2 = function(pos, dir, tlib2, node) - liquid.update_network(pos) + tubelib2_on_update2 = function(pos, outdir, tlib2, node) + liquid.update_network(pos, outdir) end, on_timer = function(pos, elapsed) local mem = tubelib2.get_mem(pos) @@ -344,8 +344,8 @@ minetest.register_node("techage:ta4_tank", { meta:set_string("infotext", S("TA4 Tank").." "..number) Pipe:after_place_node(pos) end, - tubelib2_on_update2 = function(pos, dir, tlib2, node) - liquid.update_network(pos) + tubelib2_on_update2 = function(pos, outdir, tlib2, node) + liquid.update_network(pos, outdir) end, on_timer = function(pos, elapsed) local mem = tubelib2.get_mem(pos) diff --git a/locale/techage.de.tr b/locale/techage.de.tr index b379c64..539b646 100644 --- a/locale/techage.de.tr +++ b/locale/techage.de.tr @@ -56,7 +56,7 @@ Meridium Axe=Meridium Axt Meridium Pickaxe=Meridium Pickel Meridium Shovel=Meridium Schaufel Meridium Sword=Meridium Schwert -More water expected (2 m deep)!= +More water expected (2 m deep)!=Mehr Wasser erwartet (2 m tief) Network Data=Netzwerkdaten No plan available=Kein Plan verfügar No wind at this altitude!=Kein Wind auf dieser Höhe @@ -207,14 +207,14 @@ TA4 Heat Exchanger 1=TA4 Wärmetauscher 1 TA4 Heat Exchanger 2=TA4 Wärmetauscher 2 TA4 Heat Exchanger 3=TA4 Wärmetauscher 3 TA4 Hydrogen=TA4 Wasserstoff -TA4 Low Power Box==TA4 Niederspannungsverteilerbox +TA4 Low Power Box=TA4 Niederspannungsverteilerbox TA4 Low Power Cable=TA4 Niederspannungskabel TA4 Pillar=TA4 Säule TA4 Pipe Inlet=TA4 Rohrzulauf TA4 Protected Chest=TA4 Gesicherte Kiste TA4 Pump=TA4 Pumpe TA4 Reactor=Reaktor -TA4 Reactor Base= +TA4 Reactor Base=TA4 Reaktor Basis TA4 Reactor Filler Pipe=TA4 Reaktor Einfüllstutzen TA4 Rotor Blade=TA4 Rotorblatt TA4 Silicon Wafer=TA4 Silizium-Wafer diff --git a/nodes/doorblock.lua b/logic/doorblock.lua similarity index 100% rename from nodes/doorblock.lua rename to logic/doorblock.lua diff --git a/nodes/gateblock.lua b/logic/gateblock.lua similarity index 100% rename from nodes/gateblock.lua rename to logic/gateblock.lua diff --git a/oil/reboiler.lua b/oil/reboiler.lua index c7e74b7..2bdadc0 100644 --- a/oil/reboiler.lua +++ b/oil/reboiler.lua @@ -92,7 +92,7 @@ local function node_timer(pos, elapsed) if mem.liquid.amount >= 5 and mem.liquid.name == "techage:oil_source" then mem.liquid.amount = mem.liquid.amount - 5 local leftover = pump_cmnd(pos, "put") - if leftover > 0 then + if (tonumber(leftover) or 1) > 0 then swap_node(pos, false) return false end diff --git a/sounds/techage_reactor.ogg b/sounds/techage_reactor.ogg new file mode 100644 index 0000000000000000000000000000000000000000..38d5538f7761452ec72dc99783fc9ccfd73f3352 GIT binary patch literal 15384 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 literal 0 HcmV?d00001 diff --git a/textures/techage_aluminum_inv.png b/textures/techage_aluminum_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..7dc3a7b7a0262c7341e93fb78308323daa60f548 GIT binary patch literal 1332 zcmV-41Px#9cffpbVF}#ZDnqB0000007G(RVRU6=Aa`kWXdp*P zO;BVmWd{HN010qNS#tmY3ljhU3ljkVnw%H_000|MOjJdssjZ5Sm2h==mYbt^e~1DC z0$E*OYHxHeG&RFTyG{TA1bInBK~zY`eU;C5qc#x72c$%MM1bonU^}@AgO@!*z|TF} z*~rdux4Y}@QCPV2-1nUR+Z_Q;?6j|wJaYJc=9e_10Kme693aQ9MQ`BBIOq7iv3eEq znBJ_#V8r5`T>~ksUtRe%Al?9rU)lvg46xwu>|VTX7F0qyGRF2sjk_2+J$= zZofxh#>pEXFSO1OIDG{Ki031~A1|~4pmGCU3qE-HXuE%B03YNQ`U<(ov00sa>YdWTw zLzp)D{evQ=ToeiAYpgD*t+H{(mbNzM^#l*9SYU>9EmVewS!Vf4FzfMkv%K5F!xDM5 zCK^;)(<~*Lr~$yScbdY%A71T%K^8ZZGGoti%O8!ErSLq!Y9UGF3bb^-M& zH#vqKm0vkLIVM2$5$9cD`E{zwtYo9J&S6Qh2){TYfL#!V7Zx|<*y-J69b{n_{;1n1 zl?kWD!E1y(>kdTGx+-S7xjR1!Z7HuFi(+h+c+er3;wJCHGMrSOGi;RkHC>JNKQ_ZV z37V#7~#zHu8E!z3reATn?Ar$(J}U+}NumUIN#dSjt`(NI;lRPk&8ZJDh~` zhaIW0kGj*HUWX8i_!7mz!JT{QF~}^ZTFOC3fiOl1>}@T~6M_+# zYtN$mFdy6Q#GRi|diu#SJL}&WB=S0#B`uqTK{$@RKjriGx0O8)$|Jr3#B>o9!7Q2w zQHFKu@RQu$W~+RXm+fMB#}2lCV^1QcV|DK)-f648HA*)$(`#a$02niO8Qjkm)4$kZ z8=u-Qlkbf^w?FD*|DSiP>RDv#OtrC!_+;DuyiFfi7GREbcUrXykB{izGR+}!chMcw zSVSNS%G}U;vjb? zhIQv;UIICs1s;*b3=G`DAk4@xYmNj^kSD+=#MLLWu(!9z!QOu9(k0cBj6g*Uj3q&S z!3+-1ZlnP@DxNNmArhC96BY<;Xk&6@m~il)Jck~GWX|e_1g1?_5`ul07#Qwu((QHn S&YcKU&*16m=d#Wzp$Pz}(=F5h literal 0 HcmV?d00001 diff --git a/textures/techage_appl_heater_on.png b/textures/techage_appl_heater_on.png new file mode 100644 index 0000000000000000000000000000000000000000..6549d4cc9fa46c051c68216d9e67eb1e2fa4fd69 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs1s;*b3=G`DAk4@xYmNj^P$NS%G}U;vjb? zhIQv;UIICs1s;*b3=G`DAk4@xYmNj^kSD+=#MLLW(8I%H!Tk9*Wo5JFr!j$amIV0) zGdMiEkp|>Ad%8G=NL)@%P~dH0Vw^E?Yt~h-EQ447|Nr;4QvUb<|N4ZsAOHV{AK!lvI6;x#X;^) z4C~IxyaaM&GeaUuobz*YQ}arITm}Z`qSVBa)D(sC%#sWRcTeAd6une-pg3oNM`SSr z1Gg{;GcwGYBLNiT3GfMV^~o#*GGk(5)~{dRVRCg5ki%FK+&i|IfAuMTzC@asS0j6Yf$4XYCCScM~a0}t)z;q{?G)|)i29oo+0aKDZDvr|QehRJNBMOMs<*jPGr a*cc4jMO@Awi@gnWDTAl0pUXO@geCw8?`jGF diff --git a/textures/techage_barrel_fueloil_inv.png b/textures/techage_barrel_fueloil_inv.png deleted file mode 100644 index ca1fcda9ac176f3d3e9b9ea3f1745f77935e7538..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 385 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|emUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIC?nIRD+&iT2ysd*(pE(3#eQEFmIYKlU6W=V#EyQgnJie4%^P@J>CBeIx* zfm;}a85w5HkpK$v2l#}z`eYW)Xp0K4- z>=M=;*u~mmqkE6HhwZ@u2?pMtcZ~c#)<;*eKl}g3{`VhdugmXTr>B3}9Xh@L&Wm#2 XoVmFt_dMSN^bmumtDnm{r-UW|{$i3w diff --git a/textures/techage_barrel_gasoline_inv.png b/textures/techage_barrel_gasoline_inv.png deleted file mode 100644 index 38d43a8c6b7844300484ac321ab79350a099fc3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|emUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIC?nIRD+&iT2ysd*(pE(3#eQEFmIYKlU6W=V#EyQgnJie4%^P@J>CBeIx* zfm;}a85w5HkpK$v2l#}z`eYWqx-0wbedGG|>n~os=%u2(4=BZ0666=m;PC858jy3$ z)5S5w}!rt9z|^J89u2?P5vhKz&~{)&WKntrwh|DXTA`CL9=R+;`To5lCn?y7m>wx4bP0l+XkKt@n-L diff --git a/textures/techage_barrel_inv.png b/textures/techage_barrel_inv.png index cf2a4abda809759f78896d46537ed3051632d92e..46b492f4ee01407b145b35a0f399b080e8169709 100644 GIT binary patch delta 237 zcmVvV2co_0So9O1b%=8v=L^!01I%zZTYtVEWorH=8jhl5P?;zATC|C3N8QzvtU^Q zp%DJcD7Ziv?FIM{0vo^rb_jtz5bq-dpx%E46NrX;A1d%4?)_^Z{^~*R{m}p#2;VXw nd<)H{aPKz2voeHFWHA5$Y=(V5$*3Z~00000NkvXXu0mjftuZUmUPiwClg+W<8%7k2~l zZ{wD|z$EKVKt%QdQw7#7K;&uhZeTP32gU$sU~~_7VA?58Juv_0|JmmsP?~lxx;&%b ft-5^VM!y5U`hw_BTOybM0000NS%G}U;vjb? zhIQv;UIIC?nIRD+&iT2ysd*(pE(3#eQEFmIYKlU6W=V#EyQgnJie4%^P@J>CBeIx* zfm;}a85w5HkpK$v2l#}z`eYVf+FG!GhSmD@>n~osm~eA#8BmI`B*-tA!Qt7BG$7}w zr;B5V$MLsQFY+ET;Bi@8#&nt0=@Mhc9>=GD)0I3rZhX8rUo1fN-TF_jPoA_a;Al*23Z!I4P^hW9R<%NsAa) zeet#1C!0|EmQg8Mo&UnqCk~DdVTH*K$9oxs%Rf4NE0kWq_Uuuf!@t}+o5W|N-sS8# zVVAJ(z%JGf8{K=nJ!}sSNHFmBykq3|u|B$z{n`IN_P_rydtH9#Iz9c%?$GJ|cV3kH Y=FH7Kx##&FpobVdUHx3vIVCg!0O9SFKmY&$ diff --git a/textures/techage_barrel_oil_inv.png b/textures/techage_barrel_oil_inv.png deleted file mode 100644 index 985ae05a66fd5c594de57aaf4de29cb01d4b0d31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 385 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|emUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIC?nIRD+&iT2ysd*(pE(3#eQEFmIYKlU6W=V#EyQgnJie4%^P@J>CBeIx* zfm;}a85w5HkpK$v2l#}z`eYWy#KZu3>({Tpc=2NUT+;_Y4r57>UoeBivm0qZ&QVVn z#}JR>Z>L`5J!HV+vbc=tGON=i#*96VPyePXd34GDR*}cf{q2($F|PXJ zYqw7}q4X`IQnWh%g{My(938?6lO2xtG6%y@2i6qdbRyxpy{+&q%$?*>S=y zVcmgUtQ|JG_jr5Q9vqNh;O%+G$nRr)bS3+<|9|X%|6%sJ{LXcH`j_3I)BEqdDEG~o Wn|pH4^F2ThF?hQAxvXNS%G}U;vjb? zhIQv;UIIC?nIRD+&iT2ysd*(pE(3#eQEFmIYKlU6W=V#EyQgnJie4%^P@J>CBeIx* zfm;}a85w5HkpKz`1^9%x`eYVX%s$SQaB}_n^#KJ97cX9vx%sOfD9cz9|q^satts6_UqlzkRvcm9WcGF|dl z_|YBnRv)WdN_`(LiGGZ`-{xiHZQXQf>T?H!mfxH%UB}K{5LbvWJ;G#>zelMmEakED zU;c~VnNB>i-#J%Qp>#DPgCslefu~O#wlo}gvyCxtJ1fWT#cWO6q8V-)q?R)t%743T z@d1a|jtw1sjLvM=Y#Uz8d=z`Q;6RQ9V+8Nv>?`LUt@7_80Y22HjrIGK$Px#9cffpbVF}#ZDnqB0000007G(RVRU6=Aa`kWXdp*P zO;BVmWd{HN010qNS#tmY3ljhU3ljkVnw%H_000S4OjJcxJS{grBWGYKCGf>-0005! zNkl^Ik8qYGQ(!q1ogHnC(s!3P{U;pPfQ{V)`8rWSg(9*${`?zAnjEu@~`%%cmJM*uNB7)Wgs84{fYvtO5 qAqqLL4wt6?Sorj{NX=0*i1ZKfuq?l@Cduyr0000)^mS!_%*`RD&C-6&<^WJgHZvrm#5q4VH#M&W$Yo$~E=o-- zNlj5G&n(GMaQE~LNYP7W2a5mlba4!+xb^n7BVUt&Kx<;wo`zj-#MU=-UR0h`q0Z46 zfaIj-UOs=Ms3r*t^R)A$CZ3zKMdb;|# JtaD0e0szCqj3fX6 diff --git a/textures/techage_canister_filling.png b/textures/techage_canister_filling.png new file mode 100644 index 0000000000000000000000000000000000000000..f4645750e2e48681b3aa9479b87ab0a675ce3b5d GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRv7|ftIx;Y9?C1WI$O_~$76-XI zF|0c$^AgCB%?ybsan8@pP0cF-av2z$i&7IyQd1PlGfOfQ+&z5*QuI>Uf#RG69+AZi z4BWyX%*Zfnjs#GUEx;$l)hDyCv#V2a!>Mqf2xCc*UoeBivm0qZj+m#5V~EE2bt(VWM?5Pmz}U1m~L08j;kr>mdKI;Vst0LF_n&;S4c literal 0 HcmV?d00001 diff --git a/textures/techage_canister_frame.png b/textures/techage_canister_frame.png new file mode 100644 index 0000000000000000000000000000000000000000..e18e2045defbe1c87915d0877bd785af037c39a0 GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|emUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIC?nIRD+&iT2ysd*(pE(3#eQEFmIYKlU6W=V#EyQgnJie4%^P@J>CBeIx* zfm;}a85w5HkpKz`1^9%x`eYU!Id=HPix-_;o#tj{L4kpZAt3=kS;mqezhDN3XE)M- zoG4Eh#}JR>$q5oU4S@nYEF342Lmx6Rv50aUV)SDb;EUvPa%@myJ)w8x6~9TPk1-2- zBU5sT!zQLI3nBUPkb^6l0$H6S8J9k77P3-^YZ#Zo3#0y(?B8F%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6_|fq{|9)5S5Q;?~>S2YH(eM2;0^#W>i0>(Wk0Dq%iuSjZ;q zDRYe1L~T>k8il?E<$ABOe`mb?zgu~aynHK*CYO`PIm21jyJODlpDbJb^p*;*f@}

-f!P#qVSE)Ctdhj!y4%ew)0Ftx;*Us{%_^~>v(y2%bx|4o=h^|tEhkC S&in8+AW2VGKbLh*2~7aJeveB4 diff --git a/textures/techage_canister_gasoline_inv.png b/textures/techage_canister_gasoline_inv.png deleted file mode 100644 index 5cef9c5232a5693be2eb99e60d4e21127e416509..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|emUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIC?nIRD+&iT2ysd*(pE(3#eQEFmIYKlU6W=V#EyQgnJie4%^P@J>CBeIx* zfm;}a85w5HkpK#c2Ka=y`eYU!Id=HfUD<0luPj(N-`vbBC@@fN_D7&f2F8*gzhDN3 zXE)M-oM=xM#}JR>$q5oU4S@nYEF342Lj}2*SVTDvG5WCz@I`W6a%fOuJ)w8x6~9TP zk1-2-Ba?WE!zQLIiy%(P9xaJbgH;INS%G}U;vjb? zhIQv;UIIC?nIRD+&iT2ysd*(pE(3#eQEFmIYKlU6W=V#EyQgnJie4%^P@J>CBeIx* zfm;}a85w5HkpK#c2Ka=y`eYU!Id-^W%HnG`uPj(N-`vbBC@_%k(PMw00>+XczhDN3 zXE)M-oM=xM#}JR>$q5oU4S@nYEF342Lj}2*SVTDvG5WCz@I`W6a%fOuJ)w8x6~9TP zk1-2-Ba?WE!zQLIiy%(P9xaJbgH;I)^mS!_%*`RD#WL?KZzE7hHZvrm#5q4VH#M&W$Yo$~E=o-- zNlj5G&n(GMaQE~LNYP7WXJBAt@N{tuskrs_wl!aqgGg)Qu@_8NilTCK4GnkcT~Ba) zG|xmW=+-H*DXbA0{)_Kb8s7W=h2#5Ug9!?*jvN~S!)=VG#_t} z@HUSLy&CQuJL?$FPa%n?Mc-=wPb+3lx@vLcLZGz4mk#NKwST!8zVZsJzwmdrL+y&i z@_YJkFEV!MI#{dJalPS6^JZWGINW;P@a@_qhO4|9;;Os>cN^;FU5}l@JWuDl3D`II zi3is!s;%GrUaQM1QN^70Su?xg6`RdFSzeH?P5qba-#XV{_@b$3zd|MI6We_;y~{e* Q74aZRPgg&ebxsLQ0Feud-~a#s diff --git a/textures/techage_canister_water_inv.png b/textures/techage_canister_water_inv.png deleted file mode 100644 index 2c03e0c2bc1b38ba17a4896d9b08239e2031a878..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 410 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE)^mS!_%*`RDu9>$-e%@4M+v#wb%h!!23NLH#=zuie_ups|nfk!V$o=!?F&zYhN1 zq2tHaVYtJe<)f59b-^{Dn>woH4Pw}(0!o-)mHIMwscLOnehCZ3CJr1z=P`* z)mCqQuhixB*vokOYLn@L7i@R(`K3VGQs#TUzt#S4!OLK$x&TkFliUfr45ZBC56%Kf Ndb;|#taD0e0s#IFiDdu) diff --git a/textures/techage_epoxy.png b/textures/techage_epoxy.png deleted file mode 100644 index d4db6e8e17cfbcb5c033d5a1992e7908b3635167..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$Dv*Tez_1||=4Gqa$;zy%BE zA31jT+RZCBZ{M)7wln~$VJr#q3ubV5b|VeQ;VkfoEM{Qf76xHPhFNnYfP(BLp1!W^ zk2&PItxZZ}tzQ6zWHUn|N}Tg^b5rw5fLsO!=c3falGGH1^30M91$R&1fE2w{cA$8n zr;B5V#`)v~1)-KEhB?QVENRhX2x1jaFf(%#O$g%Ub-j34%FCnSC@WV%Hm3*+a}Cqe zR)r3g0F4L^mJ?bmrvq6Vv{(W|MZ~xk&2YRCwLw*b>FEomM-GZ6qD`$CX$v?P+-#DQ j%gGFIs8LAfSiry#`qlo-^>y)&L9X(2^>bP0l+XkK`5#ws diff --git a/textures/techage_fueloil_inv.png b/textures/techage_fueloil_inv.png deleted file mode 100644 index 06e7ebdfa06e7620380c8fcaee9037e3743f210d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0L3?#3!&-4XSEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaM&GeaUuobz*YQ}arITm}Z`qSVBa)D(sC%#sWRcTeAd6une-pg3oNM`SSr z1Gg{;GcwGYBLNZ&@CkAC$t(=8<^TWxzwsRF2%sQiNswPKgTu2MX+X|OPZ!4!i_>#2 zpB6lnLVvXjZ;}3Bai`+&87|JYhwnu>L>xGj8W?+~ z=_$+*{2}3J&@9nX*xHgH@W|2Zf?Q6u_-5y(2~yuCShYFu1+=_yu5p7$g+{uNZE(=%jG9;ti#&=zqRu1YnS~{ jdqLW|FXKD&-AHa*m#$xii@bIL9nIkB>gTe~DWM4fbT4zL diff --git a/textures/techage_gasoline_inv.png b/textures/techage_gasoline_inv.png deleted file mode 100644 index 478ef209b7fc537f0d716bd562e82073362fc6f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0L3?#3!&-4XSEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaM&GeaUuobz*YQ}arITm}Z`qSVBa)D(sC%#sWRcTeAd6une-pg3oNM`SSr z1Gg{;GcwGYBLNZ&@CkAC$t-+zSN8w^|52R54M0K0k|4ie28U-i(tw@jRv7|ftIx;Y9?C1WI$O_~$76-XI zF|0c$^AgCB%?ybsan8@pP0cF-av2z$i&7IyQd1PlGfOfQ+&z5*QuI>Uf#RG69+AZi z4BWyX%*Zfnjs#GUEx;$l)hDy?|NsB99<}oWMHowh{DK)Ap4~_Tatu9P978nDCnrd- zYB(^MA7*F{Y?vL$nEdBJ!k>c)e-5Ah(SI`Iz{wTuhHnyiDy7)P8Sa`3PA>4j<^t5r N;OXk;vd$@?2>|lyL!STu literal 0 HcmV?d00001 diff --git a/textures/techage_liquid2_inv.png b/textures/techage_liquid2_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..374f0b2adbcd37aaa19593b513e48f002073996b GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRv7|ftIx;Y9?C1WI$O_~$76-XI zF|0c$^AgCB%?ybsan8@pP0cF-av2z$i&7IyQd1PlGfOfQ+&z5*QuI>Uf#RG69+AZi z4BWyX%*Zfnjs#GUEx;$l)hDyCv#V2a!>Mqf2xCc*UoeBivm0qZPNS!bV~EE2r588y zHW=`*I0(3&>N%hx+1oQMP(o3a^^xPI`$q&XOn9}czP|0@XWzCp9Bqp_j_mp7G4+NB zcjMl}9nB4CLX0Qm1T|V(&blzII?j~S(z5X2!kMz`3Oc`^xb%qA^;J#M)MfPovN0|N tCvwwwAL85N?s4b1*_<7p{}$@MXF1Kd|F=Sodo$2644$rjF6*2UngF_QYeWD5 literal 0 HcmV?d00001 diff --git a/textures/techage_liquid_inv.png b/textures/techage_liquid_inv.png deleted file mode 100644 index e7334585016c4fe5edae0fed3441aa890409558a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0L3?#3!&-4XSEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaM&GeaUuobz*YQ}arITm}Z`qSVBa)D(sC%#sWRcTeAd6une-pg3oNM`SSr z1Gg{;GcwGYBLNZ&@CkAC$t_K0*@TcF39Cni*I&rnjrOUf>oOXUqH(X=Q@W^D@|<}oEWnY zr|c6@oDp3Rmd4}XaHpvxPIbTD!&>W-;Lz9b?N$LxX5c4(9sN@u6{1-oD!M!lvI6;x#X;^) z4C~IxyaaM&GeaUuobz*YQ}arITm}Z`qSVBa)D(sC%#sWRcTeAd6une-pg3oNM`SSr z1Gg{;GcwGYBLNZ&@CkAC$t>JI!|MP4|Eu?ORRIMVOM?7@862M7NCR?Kdb&7zQH)WFy? zO;2Hl;13B$gJy}A!q%1qfk%#J7vyrP#Wy=QO_2IF!K%%HFQDaxbDhJdm8LcfPK?=y zQ}zic&WJ7uOXKlxxYJY;r@CM7VXb_T{52~tMV5`MM#?^{UoJm+V;$D^|E-m8U%Tvw j+6&UweHq`G??!Ulx^(?AT;#P2=x7E{S3j3^P6!lvI6;x#X;^) z4C~IxyaaMM1AIbUeKHGy%>V!Y+Z~8M2U1ZIEak-aeD6M(}IT;cvu2{J8-^oS1oX`+`;mFvQQC6=&yF+Ez%z>?o=E;!^PS5 z@VzL9hy#aG17puLJ%t&9KO`Itnk8BaTU!zY9yyv_kjtqS-|XBpLF(HCt2PI|fR-1| zbq=3an%XcpF=ii5*(ablBf20gjmN*?PE$#o>VCb4wem&s*Q~r0SvIm7Df_T~x%}jf vby(Z~w^qJ=?Xn+gFGySWWqfD88_8|!()G)5k=HJuqZvG1{an^LB{Ts5DvoG< diff --git a/textures/techage_powder_inv.png b/textures/techage_powder_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..35a85705562afdeb69a171b2dd1aba1a1643cb13 GIT binary patch literal 1680 zcmV;B25WFU8GbZ8()Nlj2>E@cM*00sC-L_t(&-tE}Qj$Kz3#_`{2 zZr@es5{@w@$O?!^Fv%G43_Jq73U2@sAd#|=m@xLV$yi$#pT2O4OK^uMnV6 zNyG}3wfj~|RqG&x=oJ8j?ytj4p(oc<3o0GC+Pe;#uN@$4|K@S2tEV>c$dT0C|MuPX z(S_^b!T@)s)z(I=v6kDYoEqwC%MC2ut1gy|7X+Aor$Ng~tZyn#MfAsaDl0PsL7`O0jPz83j=67%943pp+WuMqM&WQA)guc3w6aF92|-dg4$=B~e(~H!{;UvhhS; zqf+ZwIrH$PThvPegf#RRpT8rq)Kj@wY$6z;ud8is*BiRl9=?=0r!TdA@6LKEQQG!I z*RB%}a7|ywT<$eXgrTvUOia{j zOFIf1m4%K}Ea-^6`P?^D^y$L;z)f>qkz7aN$d;a|wz0LKuxlCqeXySo|N~$f`n0|g0oD8b^hcb;)s#cg-S$p7`Ep2;dT537=P+Q4l zMjG2@VmEBtHgZ!-s@68q7~r;*RPETp4V}*i_~UY!G-8Qk56zVtsmj=6k=e6+hy+1j zV{EByC{mp_phjEQ(n6^%@<4E=khqC$13d&k`QB#$-VX1(>3xS1$38^M+FD|x))$MM zh-|EFTPOvYsjkvMUnHO_@xDraZd4AJ+S{jkLSZ=7}$f1@UD|10#*LU|n=LnL=ZI3P7 zkToOw&6b5@hp2S53~Xt%5zFj2weP81rR%npQ!TMbr7zW27>ktV3b~$#IJ2_QeXcn_ z8{WVDr+@!{Mck{;l0>aAG}I_`&l9iX%s1s`#+I&$WS*)GL@JF`s?v3)7HRw#4BxzU zx{80aNNVf4zp5tLOI%2P8Q>paCDuD14bJCR1~z)wXr9e)&Y%415!lvI6;x#X;^) z4C~IxyaaM&GeaUuobz*YQ}arITm}Z`qSVBa)D(sC%#sWRcTeAd6une-pg3oNM`SSr z1Gg{;GcwGYBLNZ&@CkAC$t?W;|38p-?zV6)kYX$e@(X5gcy=QV$Z_&?aSX9Iotz-S zy0{^maTY^5)2xOxwpk5XEVB+=(lBXUnYf~6*~&!T72Dd{7Tr26DK*Ps5ks4##5RL9 fQKnJ{O_&*MQ~0EBZqG{vn#SPi>gTe~DWM4f_}fP4 literal 0 HcmV?d00001 diff --git a/textures/techage_symbol_powder.png b/textures/techage_symbol_powder.png new file mode 100644 index 0000000000000000000000000000000000000000..63d94f8819f8c9dfebd91dd0b3cb63f329d5b966 GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0L3?#3!&-4XSEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaM&GeaUuobz*YQ}arITm}Z`qSVBa)D(sC%#sWRcTeAd6une-pg3oNM`SSr z1Gg{;GcwGYBLNZ&@CkAC$t?W;|38p-?zV6)kYX$e@(X5gcy=QV$O-mzaSX9Iotz-S zy0{^maTY^5)2xOxwpk5XEVB+=(lBXUnYf~6*~&!T6-)~kuJ~5e+P3J{YDuZCtoN5L wT+j$Hc6JW*VVwmOP};!7A?3Dsh8qLJlw*Qdq^oq8fW|X;y85}Sb4q9e09e3IEdT%j literal 0 HcmV?d00001 diff --git a/textures/techage_tes_core_elem.png b/textures/techage_tes_core_elem.png deleted file mode 100644 index b92a25ae2e15582a7384d456dded756473e2ffbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 379 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$DvR|ZCgy^9>LZ7_Je+vMSH zn_GLlUZ3>(ay>L%(QzSA4P%nGy9+}HtE>l*!&%@FS_G7Y zo-U3d8s|$VCh{Ft;BedNb&>nbI~L#d1~vzREDt{U#e5{?q|UMf^Y`uXU)Z~A#oii5 z!NklSy1#7MpB0`hB6HV6GL%tgue1-#m-8)~AMVqY*e{hLH(#sw>|wig zACAQo@OvFP-X*A%(w+WM;*8rxwrGhdFS7d`KWZFIn7O!Wnh=L^q``@%n9I#t)i z|J=#kx%+aU3Hyl^=jPTj&dGnY;P1S|z$?ckWscjLoQ}LSbH1hg&jWi-d}6hmS9_L^ RL&+WFNl#Zlmvv4FO#p6qi-7LZ7_Je+vMSH zn_GLlUZ3>(ay>L%(QzSA4P%nGy9+}HtE>l*!&%@FSnf3sMWHUn|N}Tg^b5rw5fLsO!=c3falGGH1^30M91$R&1fE2w{cA$8^ zr;B5V#`$Cc7iOMC3pErbIBt<)ZD4T_QZSpr#x;eFi>s?``gG@v2@ML&%?ch2KFusF z5)u-QObN4m7dnna~B0HFcj!;l4UDOS;)xDyxHQ+OA|qd?P7-$zi{(U$vDuV h(X+y(Kj+I61_rm1+U6@w-3vf&@^tlcS?83{1OT*PQ>Op` diff --git a/textures/techage_water_inv.png b/textures/techage_water_inv.png deleted file mode 100644 index 0946393613155aa5ea1cd0d7aa9850001feb6574..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0L3?#3!&-4XSEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaM&GeaUuobz*YQ}arITm}Z`qSVBa)D(sC%#sWRcTeAd6une-pg3oNM`SSr z1Gg{;GcwGYBLNZ&@CkAC$t>hbIQjqoe_owcnLt6tk|4ie28U-i(tw