From c33bc5d11cc2989cf792d6ed93a3eed1e286ca45 Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Sun, 3 Nov 2019 21:21:03 +0100 Subject: [PATCH] Oil as liquid, barrels, tanks, and pumps added --- chemistry/ta4_doser.lua | 8 +- coal_power_station/firebox.lua | 22 +++- doc/items.lua | 5 + doc/manual_DE.lua | 85 ++++++++++++-- doc/plans.lua | 35 ++++-- furnace/cooking.lua | 4 +- furnace/firebox.lua | 110 +++++++++++------- furnace/furnace_top.lua | 11 +- init.lua | 4 +- liquids/liquid.lua | 16 +++ liquids/liquid_pipe.lua | 6 +- liquids/oil_lib.lua | 22 ++-- liquids/pump.lua | 18 ++- liquids/tank.lua | 166 ++++++++++++++++------------ locale/techage.de.tr | 27 ++++- locale/template.txt | 25 ++++- manuals/manual_ta3_DE.md | 62 +++++++++-- manuals/manual_ta4_DE.md | 20 ++++ manuals/toc_DE.md | 13 ++- oil/generator.lua | 100 +++++++++++------ textures/techage_oil_boiler_inv.png | Bin 0 -> 1606 bytes 21 files changed, 553 insertions(+), 206 deletions(-) create mode 100644 textures/techage_oil_boiler_inv.png diff --git a/chemistry/ta4_doser.lua b/chemistry/ta4_doser.lua index 1b01b55..90a753b 100644 --- a/chemistry/ta4_doser.lua +++ b/chemistry/ta4_doser.lua @@ -148,22 +148,22 @@ local function dosing(pos, mem, elapsed) print("dosing", item.name, dump(liquids)) local outdir = liquids[item.name] if not outdir then - State:fault(pos, mem, S("input liquid missing")) + State:fault(pos, mem, S("input missing")) return end if liquid.take(pos, outdir, item.name, item.num) < item.num then - State:fault(pos, mem, S("input liquid gone out")) + State:fault(pos, mem, S("input missing")) return end end end -- output if not reactor_cmnd(pos, "output", recipe.output.name) then - State:fault(pos, mem, S("output liquid blocked")) + State:fault(pos, mem, S("output blocked")) return end if not reactor_cmnd(pos, "waste", recipe.waste.name) then - State:fault(pos, mem, S("output liquid blocked")) + State:fault(pos, mem, S("output blocked")) return end State:keep_running(pos, mem, COUNTDOWN_TICKS) diff --git a/coal_power_station/firebox.lua b/coal_power_station/firebox.lua index 3ee5338..b61888c 100644 --- a/coal_power_station/firebox.lua +++ b/coal_power_station/firebox.lua @@ -203,7 +203,6 @@ local function on_timer2(pos, elapsed) mem.liquid = mem.liquid or {} mem.liquid.amount = mem.liquid.amount or 0 if mem.burn_cycles <= 0 then - local taken = firebox.get_fuel(pos) if mem.liquid.amount > 0 then mem.liquid.amount = mem.liquid.amount - 1 mem.burn_cycles = oilburner.Oilburntime / CYCLE_TIME * BURN_CYCLE_FACTOR @@ -220,7 +219,6 @@ local function on_timer2(pos, elapsed) end local function start_firebox2(pos, mem) - print("start_firebox2", mem.running, mem.liquid and mem.liquid.amount) if not mem.running and mem.liquid.amount > 0 then mem.running = true on_timer2(pos, 0) @@ -230,8 +228,8 @@ local function start_firebox2(pos, mem) end minetest.register_node("techage:oilfirebox", { - description = S("TA3 Power Station Oil Firebox"), - inventory_image = "techage_coal_boiler_inv.png", + description = S("TA3 Power Station Oil Burner"), + inventory_image = "techage_oil_boiler_inv.png", tiles = {"techage_coal_boiler_mesh_top.png"}, drawtype = "mesh", mesh = "techage_boiler_large.obj", @@ -336,6 +334,22 @@ techage.register_node({"techage:coalfirebox"}, { end, }) +techage.register_node({"techage:oilfirebox"}, { + on_recv_message = function(pos, src, topic, payload) + local mem = tubelib2.get_mem(pos) + if topic == "state" then + if mem.running then + return "running" + else + return "stopped" + end + elseif topic == "fuel" then + return mem.liquid and mem.liquid.amount and mem.liquid.amount + else + return "unsupported" + end + end, +}) minetest.register_craft({ output = "techage:coalfirebox", diff --git a/doc/items.lua b/doc/items.lua index ed22846..ea4068f 100644 --- a/doc/items.lua +++ b/doc/items.lua @@ -44,6 +44,7 @@ techage.Items = { --------------------- techage_ta3 = "techage_ta3.png", ta3_firebox = "techage:coalfirebox", + ta3_oilbox = "techage:oilfirebox", ta3_boiler = "techage:coalboiler_top", ta3_turbine = "techage:turbine", ta3_generator = "techage:generator", @@ -78,6 +79,8 @@ techage.Items = { ta3_pumpjack = "techage:ta3_pumpjack_pas", ta3_drillbit = "techage:oil_drillbit", ta3_end_wrench = "techage:end_wrench", + ta3_tank = "techage:ta3_tank", + ta3_pump = "techage:t3_pump", ---------------------------- ta3_button = "techage:ta3_button_off", ta3_cartdetector = "techage:ta3_cartdetector_off", @@ -114,5 +117,7 @@ techage.Items = { ta4_hydrogen = "techage_hydrogen_inv.png", ta4_electrolyzer = "techage:ta4_electrolyzer", ta4_fuelcell = "techage:ta4_fuelcell", + ta4_tank = "techage:ta4_tank", + ta4_pump = "techage:t4_pump", --ta4_ "", } diff --git a/doc/manual_DE.lua b/doc/manual_DE.lua index 9faf577..0137930 100644 --- a/doc/manual_DE.lua +++ b/doc/manual_DE.lua @@ -37,8 +37,9 @@ techage.manual_DE.aTitel = { "3,TA2 Gesicherte Kiste / Protected Chest", "3,Techage Forceload Block", "1,TA3: Ölzeitalter", - "2,Kohlekraftwerk", + "2,Kohlekraftwerk / Ölkraftwerk", "3,TA3 Kraftwerks-Feuerbox / Power Station Firebox", + "3,TA3 Kraftwerks-Ölbrenner / TA3 Power Station Oil Burner", "3,TA3 Boiler unten/oben", "3,TA3 Turbine", "3,TA3 Generator", @@ -57,7 +58,7 @@ techage.manual_DE.aTitel = { "3,TA3 Akku Block / Akku Box", "3,TA3 Strom Terminal / Power Terminal", "2,TA3 Industrieofen", - "3,TA3 Ofen-Feuerkiste / Furnace Firebox", + "3,TA3 Ofen-Ölbrenner / Furnace Oil Burner", "3,TA3 Ofenoberteil / Furnace Top", "3,TA3 Gebläse / Booster", "2,Öl-Anlagen", @@ -88,6 +89,9 @@ techage.manual_DE.aTitel = { "3,TA3 Kiessieb / Gravel Sieve", "3,TA3 Mühle / Grinder", "3,TA3 Flüssigkeitensammler / Liquid Sampler", + "2,Flüssigkeiten", + "3,TA3 Tank / TA3 Tank", + "3,TA3 Pumpe / TA3 Pump", "2,Werkzeuge", "3,Techage Info Tool", "3,TechAge Programmer", @@ -113,6 +117,9 @@ techage.manual_DE.aTitel = { "2,Wasserstoff", "3,Elektrolyseur", "3,Brennstoffzelle", + "2,Weitere TA4 Blöcke", + "3,TA4 Tank / TA4 Tank", + "3,TA4 Pumpe / TA4 Pump", } techage.manual_DE.aText = { @@ -281,6 +288,7 @@ techage.manual_DE.aText = { "\n".. "\n", "Ein Schieber ist in der Lage\\, Items aus Kisten oder Maschinen zu ziehen und in andere Kisten oder Maschinen zu schieben. Oder anders gesagt: Zwischen zwei Blöcken mit Inventar muss ein und genau ein Schieber sein. Mehrere Schieber in Reihe sind nicht möglich.\n".. + "In die Gegenrichtung ist ein Schieber für Items aber durchlässig\\, so dass eine Kiste über eine Röhre gefüllt und ebenso gelehrt werden kann. \n".. "\n".. "Ein Schieber geht in den Zustand \"standby\"\\, wenn der keine Items zum Schieben hat. Ist der Ausgang blockiert oder das Inventory des Empfängers voll\\, so geht der Schieber in den Zustand \"blocked\". Aus beiden Zuständen kommt der Schieber nach einigen Sekunden selbsttätig wieder raus\\, sofern sich die Situation geändert hat.\n".. "\n".. @@ -389,10 +397,13 @@ techage.manual_DE.aText = { "Das Kohlekraftwerk besteht aus mehreren Blöcken und muss wie im Plan rechts abgebildet\\, zusammen gebaut werden. Dazu werden die Blöcke TA3 Kraftwerks-Feuerbox\\, TA3 Boiler oben\\, TA3 Boiler unten\\, TA3 Turbine\\, TA3 Generator und TA3 Kühler benötigt.\n".. "\n".. "Der Boiler muss mit Wasser gefüllt werden. Dazu bis zu 10 Eimer Wasser in den Boiler füllen.\n".. - "Die Feuerbox muss mit Kohle\\, Holzkohle oder Erdöl gefüllt werden.\n".. + "Die Feuerbox muss mit Kohle oder Holzkohle gefüllt werden.\n".. "Wenn das Wasser heiß ist\\, kann das Ventil am Boiler geöffnet und anschließend die Generator gestartet werden.\n".. "\n".. - "Das Kraftwerk liefert eine Leistung von 80 ku und kann mit Kohle\\, Holzkohle oder Erdöl betrieben werden.\n".. + "Das Kraftwerk kann alternativ auch mit einem Ölbrenner ausgestattet und dann mit Öl betrieben werden.\n".. + "Das Öl kann über eine Pumpe und Ölleitung nachgefüllt werden.\n".. + "\n".. + "Das Kraftwerk liefert eine Leistung von 80 ku.\n".. "\n".. "\n".. "\n", @@ -401,6 +412,11 @@ techage.manual_DE.aText = { "\n".. "\n".. "\n", + "Teil des Kraftwerks. \n".. + "Der Ölbrenner kann nur mit Öl gefüllt werden. Die Brenndauer ist abhängig von der Leistung\\, die vom Kraftwerk angefordert wird. Unter Volllast brennt Öl 20 s. Unter Teillast entsprechend länger (50% Last = doppelte Zeit).\n".. + "\n".. + "\n".. + "\n", "Teil des Kraftwerk. Muss mit Wasser gefüllt werden. Wem kein Wasser mehr vorhanden ist oder die Temperatur zu weit absinkt\\, schaltet sich der Boiler ab.\n".. "\n".. "\n".. @@ -499,13 +515,13 @@ techage.manual_DE.aText = { "Der TA3 Industrieofen dient als Ergänzung zu normalen Ofen (furnace). Damit können alle Waren mit \"Koch\" Rezepte\\, auch im Industrieofen hergestellt werden. Es gibt aber auch spezielle Rezepte\\, die nur im Industrieofen hergestellt werden können.\n".. "Der Industrieofen hat sein eigenes Menü zur Rezeptauswahl. Abhängig von den Waren im Industrieofen Inventar links kann rechts das Ausgangsprodukt gewählt werden.\n".. "\n".. - "Der Industrieofen benötigt Strom (für das Gebläse) sowie Kohle\\, Holzkohle oder Erdöl für die Befeuerung. Der Industrieofens und muss wie im Plan rechts abgebildet\\, zusammen gebaut werden.\n".. + "Der Industrieofen benötigt Strom (für das Gebläse) sowie Öl für den Brenner. Der Industrieofens und muss wie im Plan rechts abgebildet\\, zusammen gebaut werden.\n".. "\n".. - "Die Brennzeit für Kohle und Erdöl beträgt 80 s und für Holzkohle 240 s.\n".. + "Die Brennzeit für Öl beträgt 80 s.\n".. "\n".. "\n".. "\n", - "Ist Teil des TA3 Industrieofen. Muss mit Kohle\\, Holzkohle oder Erdöl befeuert werden.\n".. + "Ist Teil des TA3 Industrieofen. Muss mit Öl befeuert werden.\n".. "\n".. "\n".. "\n", @@ -547,7 +563,7 @@ techage.manual_DE.aText = { "\n".. "\n".. "\n", - "An die Stelle der Ölbohrkiste muss nun die Ölpumpe platziert werden. Auch die Ölpumpe benötigt Strom (16 ku) und liefert alle 8 s ein Erdöl-Item\\, das in einer Kiste gesammelt werden muss. Dazu muss die Ölpumpe über eine Röhre mit der Kiste verbunden werden.\n".. + "An die Stelle der Ölbohrkiste muss nun die Ölpumpe platziert werden. Auch die Ölpumpe benötigt Strom (16 ku) und liefert alle 8 s ein Einheit Erdöl. Das Erdöl muss in einem Tank gesammelt werden. Dazu muss die Ölpumpe über eine Leitung (gelbe Röhre) mit dem Tank verbunden werden.\n".. "Ist alles Öl abgepumpt\\, kann auch die Ölpumpe wieder entfernt werden.\n".. "\n".. "\n".. @@ -743,6 +759,32 @@ techage.manual_DE.aText = { "\n".. "\n".. "\n", + "Flüssigkeiten wie Wasser oder Öl können nur die spezielle Leitungen gepumpt und in Tanks gespeichert werden. Wie auch bei Wasser gibt es aber Behälter (Eimer\\, Kanister\\, Fässer)\\, in denen die Flüssig gelagert und transportiert werden kann.\n".. + "\n".. + "\n".. + "\n", + "In einem Tank können Flüssigkeiten gespeichert werden. Ein Tank kann über eine Pumpe gefüllt bzw. geleert werden. Dazu muss die Pumpe über einer Leitung (gelbe Röhre) mit dem Tank verbunden sein.\n".. + "Ein Tank kann aber auch über Eimer/Fässer gefüllt bzw. geleert werden:\n".. + "\n".. + " - werden leere Fässer mit einem Schieber oder von Hand in den Tank gegeben\\, werden diese gefüllt und können ausgangsseitig wieder entnommen werden\n".. + " - werden volle Fässer mit einem Schieber oder von Hand in den Tank gegeben\\, werden diese geleert und können ausgangsseitig wieder entnommen werden\n".. + "\n".. + "Dabei ist zu beachten\\, dass Fässer nur komplett gefüllt oder entleert werden können. Sind bspw. weniger als 10 Einheiten im Tank\\, muss dieser Rest mit Eimern entnommen oder leergepumpt werden.\n".. + "\n".. + "In einen TA3 Tank passen 500 Einheiten oder 50 Fässer einer Flüssigkeit.\n".. + "\n".. + "\n".. + "\n", + "Mit der Pumpe können Flüssigkeiten von Tanks oder Behältern zu anderen Tanks oder Behältern gepumpt werden. Bei der Pumpe muss die Pumprichtung (Pfeil) beachtet werden. Über die gelben Leitungen und Verbindungsstücke ist es auch möglich\\, mehrere Tanks auf jeder Seite der Pumpe anzuordnen. Allerdings müssen die Tanks den selben Inhalt haben.\n".. + "\n".. + " - zum Füllen\\, oder volle Fässer zul Leeren\n".. + " - in einen Eimer oder einen Kanister passt eine Einheit einer Flüssigkeit\\, bspw. Wasser\n".. + " - in ein Fass passen 10 Einheiten Flüssigkeit\\, bspw. Öl\n".. + "\n".. + "Die TA3 Pumpe pumpt 4 Einheiten Flüssigkeit alle zwei Sekunden.\n".. + "\n".. + "\n".. + "\n", "", "Das Techage Info Tool (Schraubenschlüssel) hat verschiedene Funktionen. Er zeigt die Uhrzeit\\, die Position\\, die Temperatur und das Biome an\\, wenn auf einen unbekannten Block geklickt wird.\n".. "Wird auf einen TechAge Block mit Kommandoschnittstelle geklickt\\, werden alle verfügbaren Daten abgerufen (siehe auch \"Logik-/Schalt-Blöcke\").\n".. @@ -908,6 +950,19 @@ techage.manual_DE.aText = { "\n".. "\n".. "\n", + "", + "Siehe TA3 Tank.\n".. + "\n".. + "In einen TA4 Tank passen 1000 Einheiten oder 100 Fässer einer Flüssigkeit.\n".. + "\n".. + "\n".. + "\n", + "Siehe TA3 Pumpe.\n".. + "\n".. + "Die TA4 Pumpe pumpt 8 Einheiten Flüssigkeit alle zwei Sekunden.\n".. + "\n".. + "\n".. + "\n", } techage.manual_DE.aItemName = { @@ -949,6 +1004,7 @@ techage.manual_DE.aItemName = { "techage_ta3", "", "ta3_firebox", + "ta3_oilbox", "ta3_boiler", "ta3_turbine", "ta3_generator", @@ -999,6 +1055,9 @@ techage.manual_DE.aItemName = { "ta3_grinder", "ta3_liquidsampler", "", + "ta3_tank", + "ta3_pump", + "", "ta3_end_wrench", "ta3_programmer", "ta3_trowel", @@ -1023,6 +1082,9 @@ techage.manual_DE.aItemName = { "ta4_hydrogen", "ta4_electrolyzer", "ta4_fuelcell", + "", + "ta4_tank", + "ta4_pump", } techage.manual_DE.aPlanTable = { @@ -1081,6 +1143,7 @@ techage.manual_DE.aPlanTable = { "", "", "", + "", "ta3_furnace", "", "", @@ -1113,6 +1176,9 @@ techage.manual_DE.aPlanTable = { "", "", "", + "ta3_tank", + "", + "", "", "", "", @@ -1138,5 +1204,8 @@ techage.manual_DE.aPlanTable = { "", "", "", + "", + "", + "", } diff --git a/doc/plans.lua b/doc/plans.lua index 3ead873..962bc4d 100644 --- a/doc/plans.lua +++ b/doc/plans.lua @@ -116,7 +116,9 @@ techage.ConstructionPlans["itemtransport"] = { local RINSR = {"techage_filling_ta2.png^techage_appl_rinser.png^techage_frame_ta2.png", "techage:ta2_rinser_pas"} local GLASS = {"default_glass.png", "default:glass"} local WATER = {"default_water.png^default_glass.png", "default:water_source"} -local TK000 = {"techage_tube_knee.png", "techage:tubeS"} +local TK000 = {"techage_tube_knee.png", "techage:tubeS"} -- like 'r' +local TK090 = {"techage_tube_knee.png^[transformR90", "techage:tubeS"} -- '7' +local TK180 = {"techage_tube_knee.png^[transformR180", "techage:tubeS"} local TK270 = {"techage_tube_knee.png^[transformR270", "techage:tubeS"} techage.ConstructionPlans["gravelrinser"] = { @@ -150,7 +152,8 @@ techage.ConstructionPlans["coalpowerstation"] = { -- local Cable = {"techage_electric_cable_inv.png", "techage:electric_cableS"} local Tubes = {"techage_tube_tube.png", "techage:tubeS"} -local Pushr = {"techage_appl_pusher.png^techage_frame_ta3.png", "techage:ta3_pusher_pas"} +local PushR = {"techage_appl_pusher.png^techage_frame_ta3.png", "techage:ta3_pusher_pas"} +local PushL = {"techage_appl_pusher.png^techage_frame_ta3.png^[transformFX", "techage:ta3_pusher_pas"} local Boost = {"techage_filling_ta3.png^techage_appl_compressor.png^[transformFX^techage_frame_ta3.png", "techage:ta3_booster"} local Fibox = {"techage_concrete.png^techage_appl_firehole.png^techage_frame_ta3.png", "techage:furnace_firebox"} local Furnc = {"techage_concrete.png^techage_appl_furnace.png^techage_frame_ta3.png", "techage:ta3_furnace_pas"} @@ -158,11 +161,31 @@ local Furnc = {"techage_concrete.png^techage_appl_furnace.png^techage_frame_ta3. techage.ConstructionPlans["ta3_furnace"] = { {false, false, false, false, false, false, false, false}, {false, false, false, false, false, false, false, false}, - {false, Tubes, Pushr, Tubes, Furnc, Tubes, Pushr, Tubes}, + {false, Tubes, PushR, Tubes, Furnc, Tubes, PushR, Tubes}, {false, false, Cable, Boost, Fibox, false, false, false}, } +-- +-- TA3 Tank Pump Pusher +-- +local Pump = {"techage_filling_ta3.png^techage_appl_pump.png^techage_frame_ta3.png", "techage:t3_pump"} +local Tank = {"techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_tank.png", "techage:ta3_tank"} +local PIPEH = {"techage_gaspipe.png", "techage:ta4_pipeS"} +local PIPEV = {"techage_gaspipe.png^[transformR90", "techage:ta4_pipeS"} +local PN000 = {"techage_gaspipe_knee.png", "techage:ta4_pipeS"} +local PN090 = {"techage_gaspipe_knee.png^[transformR90", "techage:ta4_pipeS"} +local PN180 = {"techage_gaspipe_knee.png^[transformR180", "techage:ta4_pipeS"} +local PN270 = {"techage_gaspipe_knee.png^[transformR270", "techage:ta4_pipeS"} + +techage.ConstructionPlans["ta3_tank"] = { + {false, false, false, false, false, false, false, false, false}, + {false, false, false, false, false, false, false, false, false}, + {false, Tubes, PushR, Tubes, Tank, PIPEH, Pump, PIPEH, Tank}, + {false, PushL, Tubes, Tubes, TK180, false, false, false, false}, +} + + -- -- Wind Turbine -- @@ -187,12 +210,6 @@ techage.ConstructionPlans["ta4_windturbine"] = { -- Thermal Storage System -- local CONCR = {"basic_materials_concrete_block.png", "basic_materials:concrete_block"} -local PIPEH = {"techage_gaspipe.png", "techage:ta4_pipeS"} -local PIPEV = {"techage_gaspipe.png^[transformR90", "techage:ta4_pipeS"} -local PN000 = {"techage_gaspipe_knee.png", "techage:ta4_pipeS"} -local PN090 = {"techage_gaspipe_knee.png^[transformR90", "techage:ta4_pipeS"} -local PN180 = {"techage_gaspipe_knee.png^[transformR180", "techage:ta4_pipeS"} -local PN270 = {"techage_gaspipe_knee.png^[transformR270", "techage:ta4_pipeS"} local HEXR1 = {"techage_filling_ta4.png^techage_frameT_ta4.png^techage_appl_ribsT.png", "techage:heatexchanger3"} local HEXR2 = {"techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_ribsB.png", "techage:heatexchanger2"} local HEXR3 = {"techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_electric.png", "techage:heatexchanger1"} diff --git a/furnace/cooking.lua b/furnace/cooking.lua index 24f526a..be2838f 100644 --- a/furnace/cooking.lua +++ b/furnace/cooking.lua @@ -96,11 +96,11 @@ function techage.furnace.smelting(pos, mem, elapsed) local state = techage.RUNNING if inv and not inv:is_empty("src") then if not mem.output or not mem.num_recipe then - return techage.FAULT + return techage.FAULT, "recipe error" end local recipe = Recipes[mem.output][mem.num_recipe] if not recipe then - return techage.FAULT + return techage.FAULT, "recipe error" end -- check dst inv local item = ItemStack(mem.output) diff --git a/furnace/firebox.lua b/furnace/firebox.lua index ec34d82..2d60544 100644 --- a/furnace/firebox.lua +++ b/furnace/firebox.lua @@ -17,28 +17,34 @@ local M = minetest.get_meta local S = techage.S local firebox = techage.firebox +local oilburner = techage.oilburner +local Pipe = techage.LiquidPipe +local liquid = techage.liquid local CYCLE_TIME = 2 local function has_fuel(pos, mem) - return mem.burn_cycles > 0 or firebox.has_fuel(pos) + return mem.burn_cycles > 0 or (mem.liquid and mem.liquid.amount and mem.liquid.amount > 0) end local function stop_firebox(pos, mem) mem.running = false firebox.swap_node(pos, "techage:furnace_firebox") minetest.get_node_timer(pos):stop() - M(pos):set_string("formspec", firebox.formspec(mem)) + M(pos):set_string("formspec", oilburner.formspec(mem)) end local function node_timer(pos, elapsed) local mem = tubelib2.get_mem(pos) + mem.liquid = mem.liquid or {} + mem.liquid.amount = mem.liquid.amount or 0 if mem.running then + oilburner.formspec_update(pos, mem) mem.burn_cycles = (mem.burn_cycles or 0) - 1 if mem.burn_cycles <= 0 then - local taken = firebox.get_fuel(pos) - if taken then - mem.burn_cycles = (firebox.Burntime[taken:get_name()] or 1) / CYCLE_TIME + if mem.liquid.amount > 0 then + mem.liquid.amount = mem.liquid.amount - 1 + mem.burn_cycles = (oilburner.Oilburntime or 1) / CYCLE_TIME mem.burn_cycles_total = mem.burn_cycles else stop_firebox(pos, mem) @@ -55,7 +61,7 @@ local function start_firebox(pos, mem) node_timer(pos, 0) firebox.swap_node(pos, "techage:furnace_firebox_on") minetest.get_node_timer(pos):start(CYCLE_TIME) - M(pos):set_string("formspec", firebox.formspec(mem)) + M(pos):set_string("formspec", oilburner.formspec(mem)) end end @@ -70,7 +76,7 @@ local function booster_cmnd(pos, cmnd) end minetest.register_node("techage:furnace_firebox", { - description = S("TA3 Furnace Firebox"), + description = S("TA3 Furnace Oil Burner"), tiles = { -- up, down, right, left, back, front "techage_concrete.png^techage_appl_open.png^techage_frame_ta3.png", @@ -87,25 +93,43 @@ minetest.register_node("techage:furnace_firebox", { sounds = default.node_sound_stone_defaults(), on_timer = node_timer, - can_dig = firebox.can_dig, - allow_metadata_inventory_put = firebox.allow_metadata_inventory_put, - allow_metadata_inventory_take = firebox.allow_metadata_inventory_take, - on_receive_fields = firebox.on_receive_fields, - on_rightclick = firebox.on_rightclick, + can_dig = oilburner.can_dig, + allow_metadata_inventory_put = oilburner.allow_metadata_inventory_put, + allow_metadata_inventory_take = oilburner.allow_metadata_inventory_take, + on_receive_fields = oilburner.on_receive_fields, + on_rightclick = oilburner.on_rightclick, on_construct = function(pos) local mem = tubelib2.init_mem(pos) + techage.add_node(pos, "techage:furnace_firebox") mem.running = false mem.burn_cycles = 0 + mem.liquid = {} + mem.liquid.amount = 0 local meta = M(pos) - meta:set_string("formspec", firebox.formspec(mem)) + meta:set_string("formspec", oilburner.formspec(mem)) local inv = meta:get_inventory() inv:set_size('fuel', 1) end, + + on_metadata_inventory_put = function(pos, listname, index, stack, player) + local mem = tubelib2.get_mem(pos) + mem.liquid = mem.liquid or {} + mem.liquid.amount = mem.liquid.amount or 0 + oilburner.on_metadata_inventory_put(pos, listname, index, stack, player) + end, + + liquid = { + capa = oilburner.CAPACITY, + peek = liquid.srv_peek, + put = liquid.srv_put, + take = liquid.srv_take, + }, + networks = oilburner.networks, }) minetest.register_node("techage:furnace_firebox_on", { - description = S("TA3 Furnace Firebox"), + description = S("TA3 Furnace Oil Burner"), tiles = { -- up, down, right, left, back, front "techage_concrete.png^techage_frame_ta3.png", @@ -134,11 +158,33 @@ minetest.register_node("techage:furnace_firebox_on", { drop = "techage:furnace_firebox", on_timer = node_timer, - can_dig = firebox.can_dig, - allow_metadata_inventory_put = firebox.allow_metadata_inventory_put, - allow_metadata_inventory_take = firebox.allow_metadata_inventory_take, - on_receive_fields = firebox.on_receive_fields, - on_rightclick = firebox.on_rightclick, + can_dig = oilburner.can_dig, + allow_metadata_inventory_put = oilburner.allow_metadata_inventory_put, + allow_metadata_inventory_take = oilburner.allow_metadata_inventory_take, + on_receive_fields = oilburner.on_receive_fields, + on_rightclick = oilburner.on_rightclick, + + on_metadata_inventory_put = function(pos, listname, index, stack, player) + local mem = tubelib2.get_mem(pos) + mem.liquid = mem.liquid or {} + mem.liquid.amount = mem.liquid.amount or 0 + start_firebox(pos, mem) + oilburner.on_metadata_inventory_put(pos, listname, index, stack, player) + end, + + liquid = { + capa = oilburner.CAPACITY, + peek = liquid.srv_peek, + put = function(pos, indir, name, amount) + liquid.srv_put(pos, indir, name, amount) + local mem = tubelib2.get_mem(pos) + mem.liquid = mem.liquid or {} + mem.liquid.amount = mem.liquid.amount or 0 + start_firebox(pos, mem) + end, + take = liquid.srv_take, + }, + networks = oilburner.networks, }) minetest.register_craft({ @@ -151,25 +197,6 @@ minetest.register_craft({ }) techage.register_node({"techage:furnace_firebox", "techage:furnace_firebox_on"}, { - on_pull_item = function(pos, in_dir, num) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return techage.get_items(inv, "fuel", num) - end, - on_push_item = function(pos, in_dir, stack) - if firebox.Burntime[stack:get_name()] then - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local mem = tubelib2.get_mem(pos) - return techage.put_items(inv, "fuel", stack) - end - return false - end, - on_unpull_item = function(pos, in_dir, stack) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return techage.put_items(inv, "fuel", stack) - end, on_recv_message = function(pos, src, topic, payload) local mem = tubelib2.get_mem(pos) if topic == "state" then @@ -179,9 +206,7 @@ techage.register_node({"techage:furnace_firebox", "techage:furnace_firebox_on"}, return "stopped" end elseif topic == "fuel" then - local inv = M(pos):get_inventory() - local stack = inv:get_stack("fuel", 1) - return stack:get_count() + return mem.liquid and mem.liquid.amount and mem.liquid.amount else return "unsupported" end @@ -201,6 +226,9 @@ techage.register_node({"techage:furnace_firebox", "techage:furnace_firebox_on"}, end }) +Pipe:add_secondary_node_names({"techage:furnace_firebox", "techage:furnace_firebox_on"}) + + minetest.register_lbm({ label = "[techage] Furnace firebox", name = "techage:furnace", diff --git a/furnace/furnace_top.lua b/furnace/furnace_top.lua index c535f79..fe554ce 100644 --- a/furnace/furnace_top.lua +++ b/furnace/furnace_top.lua @@ -45,6 +45,8 @@ local function formspec(self, pos, mem) "image[2,0.5;1,1;techage_form_arrow_bg.png^[lowpart:".. (mem.item_percent or 0)..":techage_form_arrow_fg.png^[transformR270]".. "image_button[2,2;1,1;".. self:get_state_button_image(mem) ..";state_button;]".. + "tooltip[2,2;1,1;"..self:get_state_tooltip(mem).."]".. + "list[context;dst;3,0;2,2;]".. "label[6,0;"..S("Outp")..": "..idx.."/"..num.."]".. @@ -78,13 +80,13 @@ end local function cooking(pos, crd, mem, elapsed) if firebox_cmnd(pos, "fuel") then - local state = smelting(pos, mem, elapsed) + 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) + crd.State:fault(pos, mem, err) elseif state == techage.STANDBY then crd.State:idle(pos, mem) end @@ -167,7 +169,10 @@ end local function can_start(pos, mem, state) if D.dbg2 then D.dbg("can_start", state, firebox_cmnd(pos, "fuel")) end - return firebox_cmnd(pos, "fuel") + if not firebox_cmnd(pos, "fuel") then + return S("no fuel or no power") + end + return true end local function on_node_state_change(pos, old_state, new_state) diff --git a/init.lua b/init.lua index fccfb82..9597825 100644 --- a/init.lua +++ b/init.lua @@ -214,8 +214,8 @@ else dofile(MP.."/energy_storage/nodes.lua") -- Chemistry - dofile(MP.."/chemistry/ta4_reactor.lua") - dofile(MP.."/chemistry/ta4_doser.lua") + --dofile(MP.."/chemistry/ta4_reactor.lua") + --dofile(MP.."/chemistry/ta4_doser.lua") -- Hydrogen dofile(MP.."/hydrogen/hydrogen.lua") diff --git a/liquids/liquid.lua b/liquids/liquid.lua index 38dffcd..1852953 100644 --- a/liquids/liquid.lua +++ b/liquids/liquid.lua @@ -243,7 +243,23 @@ minetest.register_craftitem("techage:river_water", { }) +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_pipe.lua b/liquids/liquid_pipe.lua index 050c3ef..d8cc143 100644 --- a/liquids/liquid_pipe.lua +++ b/liquids/liquid_pipe.lua @@ -181,9 +181,9 @@ minetest.register_craft({ minetest.register_craft({ output = "techage:ta3_pipeS 6", recipe = { - {'', '', "default:steel_ingot"}, - {'dye:yellow', 'techage:meridium_ingot', ''}, - {"default:steel_ingot", '', ''}, + {'', '', "techage:iron_ingot"}, + {'dye:yellow', 'default:steel_ingot', ''}, + {"techage:iron_ingot", '', ''}, }, }) diff --git a/liquids/oil_lib.lua b/liquids/oil_lib.lua index 726a342..915e2ae 100644 --- a/liquids/oil_lib.lua +++ b/liquids/oil_lib.lua @@ -54,14 +54,6 @@ local function formspec_oil(x, y, mem) if mem.running then fuel_percent = ((mem.burn_cycles or 1) * 100) / (mem.burn_cycles_total or 1) end --- return "container["..x..","..y.."]".. --- "background[0,0;2,2.05;techage_form_grey.png]".. --- "image[0,0;1,1;techage_form_input_arrow.png]".. --- "image[1,0;1,1;default_furnace_fire_bg.png^[lowpart:".. --- fuel_percent..":default_furnace_fire_fg.png]".. --- techage.item_image(1, 1, itemname).. --- "list[context;fuel;0,1;1,1;]".. --- "container_end[]" return "container["..x..","..y.."]".. "background[0,0;3,1.05;techage_form_grey.png]".. "list[context;fuel;0,0;1,1;]".. @@ -71,6 +63,9 @@ local function formspec_oil(x, y, mem) "container_end[]" end +techage.oilburner.formspec_oil = formspec_oil + + function techage.oilburner.formspec(mem) local update = ((mem.countdown or 0) > 0 and mem.countdown) or S("Update") return "size[8,5]".. @@ -123,6 +118,17 @@ local function move_item(pos, stack) M(pos):set_string("formspec", techage.oilburner.formspec(mem)) end +function techage.oilburner.move_item(pos, stack, formspec) + local mem = tubelib2.get_mem(pos) + local inv = M(pos):get_inventory() + if liquid.is_container_empty(stack:get_name()) then + fill_container(pos, inv, mem) + else + empty_container(pos, inv, mem) + end + M(pos):set_string("formspec", formspec(pos, mem)) +end + function techage.oilburner.allow_metadata_inventory_put(pos, listname, index, stack, player) if minetest.is_protected(pos, player:get_player_name()) then return 0 diff --git a/liquids/pump.lua b/liquids/pump.lua index 215ea57..70c3470 100644 --- a/liquids/pump.lua +++ b/liquids/pump.lua @@ -293,4 +293,20 @@ Pipe:add_secondary_node_names({ "techage:t4_pump", "techage:t4_pump_on", }) - \ No newline at end of file +minetest.register_craft({ + output = "techage:t3_pump 2", + recipe = { + {"group:wood", "techage:iron_ingot", "group:wood"}, + {"techage:ta3_pipeS", "techage:usmium_nuggets", "techage:ta3_pipeS"}, + {"group:wood", "techage:iron_ingot", "group:wood"}, + }, +}) + +minetest.register_craft({ + output = "techage:t4_pump", + recipe = { + {"default:tin_ingot", "dye:blue", "default:steel_ingot"}, + {"", "techage:t3_pump", ""}, + {"", "", ""}, + }, +}) diff --git a/liquids/tank.lua b/liquids/tank.lua index f4919cf..a1eff95 100644 --- a/liquids/tank.lua +++ b/liquids/tank.lua @@ -20,7 +20,7 @@ local LQD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm local Pipe = techage.LiquidPipe local liquid = techage.liquid -local CAPACITY = 1000 +local CAPACITY = 500 local function formspec_tank(x, y, mem) @@ -224,78 +224,80 @@ minetest.register_node("techage:ta3_tank", { sounds = default.node_sound_metal_defaults(), }) -Pipe:add_secondary_node_names({"techage:ta3_tank"}) - ---minetest.register_node("techage:ta4_tank", { --- description = S("TA4 Tank"), --- tiles = { --- -- up, down, right, left, back, front --- "techage_filling_ta4.png^techage_frame_ta4_top.png", --- "techage_filling_ta4.png^techage_frame_ta4.png", --- "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_pipe.png", --- "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_tube.png", --- "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_tank.png", --- "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_tank.png", --- }, - --- on_construct = function(pos) --- local meta = minetest.get_meta(pos) --- local inv = meta:get_inventory() --- inv:set_size('src', 1) --- inv:set_size('dst', 1) --- end, - --- liquid = { --- peek = function(pos, indir) --- if indir == M(pos):get_int("indir") then --- return liquid.srv_peek(pos, "main") --- end --- end, --- put = function(pos, indir, name, amount) --- if indir == M(pos):get_int("indir") then --- return liquid.srv_put(pos, "main", name, amount) --- end --- end, --- take = function(pos, indir, name, amount) --- if indir == M(pos):get_int("indir") then --- return liquid.srv_take(pos, "main", name, amount) --- end --- end, - --- }, --- on_rightclick = on_rightclick, --- 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(), ---}) - ----- for mechanical pipe connections ---techage.power.register_node({"techage:ta4_tank"}, { --- conn_sides = {"R"}, --- power_network = Pipe, --- after_place_node = function(pos, placer) --- local meta = M(pos) --- local mem = tubelib2.init_mem(pos) --- mem.liquid = mem.liquid or {} --- local number = techage.add_node(pos, "techage:ta4_tank") --- 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(mem)) --- meta:set_string("infotext", S("TA4 Tank").." "..number) --- end, --- after_dig_node = function(pos, oldnode, oldmetadata, digger) --- techage.remove_node(pos) --- end, ---}) +minetest.register_node("techage:ta4_tank", { + description = S("TA4 Tank"), + tiles = { + -- up, down, right, left, back, front + "techage_filling_ta4.png^techage_frame_ta4_top.png", + "techage_filling_ta4.png^techage_frame_ta4.png", + "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_tank.png", + "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_tank.png", + "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_tank.png", + "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_tank.png", + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size('src', 1) + inv:set_size('dst', 1) + 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:ta4_tank") + 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("TA4 Tank").." "..number) + Pipe:after_place_node(pos) + end, + tubelib2_on_update2 = function(pos, dir, tlib2, node) + liquid.update_network(pos) + end, + on_timer = function(pos, elapsed) + local mem = tubelib2.get_mem(pos) + mem.countdown = mem.countdown - 1 + M(pos):set_string("formspec", formspec(mem)) + return mem.countdown > 0 + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + Pipe:after_dig_node(pos) + techage.remove_node(pos) + end, + liquid = { + capa = CAPACITY * 2, + peek = liquid.srv_peek, + put = function(pos, indir, name, amount) + local leftover = liquid.srv_put(pos, indir, name, amount) + local inv = M(pos):get_inventory() + if not inv:is_empty("src") and inv:is_empty("dst") then + fill_container(pos, inv) + end + return leftover + end, + take = liquid.srv_take, + }, + networks = { + pipe = { + sides = techage.networks.AllSides, -- Pipe connection sides + ntype = "tank", + }, + }, + on_rightclick = on_rightclick, + on_receive_fields = on_receive_fields, + can_dig = can_dig, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + allow_metadata_inventory_move = allow_metadata_inventory_move, + on_metadata_inventory_put = on_metadata_inventory_put, + paramtype2 = "facedir", + on_rotate = screwdriver.disallow, + groups = {cracky=2}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) techage.register_node({"techage:ta3_tank", "techage:ta4_tank"}, { on_pull_item = function(pos, in_dir, num) @@ -336,3 +338,23 @@ techage.register_node({"techage:ta3_tank", "techage:ta4_tank"}, { end end, }) + +Pipe:add_secondary_node_names({"techage:ta3_tank", "techage:ta4_tank"}) + +minetest.register_craft({ + output = "techage:ta3_tank 2", + recipe = { + {"techage:iron_ingot", "techage:ta3_barrel_empty", "group:wood"}, + {"techage:tubeS", "techage:ta3_barrel_empty", "techage:ta3_pipeS"}, + {"group:wood", "techage:ta3_barrel_empty", "techage:iron_ingot"}, + }, +}) + +minetest.register_craft({ + output = "techage:ta4_tank", + recipe = { + {"default:tin_ingot", "dye:blue", "default:steel_ingot"}, + {"", "techage:ta3_tank", ""}, + {"", "", ""}, + }, +}) diff --git a/locale/techage.de.tr b/locale/techage.de.tr index 0b2243f..cdf29b7 100644 --- a/locale/techage.de.tr +++ b/locale/techage.de.tr @@ -74,8 +74,10 @@ Power=Energie Primary available=Primär verfügbar Primary needed=Primär benötigt Pusher=Schieber +Recipe=Rezepte Remove derrick=Entferne Ölturm Rinsing=Waschen +River Water Barrel=Flusswasserfass Save=Speichern Secondary available=Sekundär verfügbar Secondary needed=Sekundär benötigt @@ -91,10 +93,14 @@ TA Ceiling Lamp=TA Deckenlampe TA Construction Board=TA Konstruktionsplan TA Electric Cable=TA Stromkabel TA Electric Junction Box=TA Verteilerdose +TA Empty Barrel=TA leeres Fass TA Industrial Lamp 1=TA Industrielampe 1 TA Industrial Lamp 2=TA Industrielampe 2 TA Industrial Lamp 3=TA Industrielampe 3 +TA Junction Pipe=TA Leitungskupplung TA Lamp=TA Lampe +TA Oil=TA Öl +TA Pipe=TA Leitung (Flüssigkeiten) TA Power Line=TA Stromleitung TA Power Pole=TA Strommast TA Power Pole Top (for up to 6 connections)=TA Strommastkopf (für bis zu 6 Verbindungen) @@ -142,20 +148,24 @@ TA3 Detector=TA3 Detektor TA3 Drill Bit=TA3 Bohrgestänge TA3 Ele Fab=TA3 E-Fabrik TA3 Funnel=TA3 Trichter -TA3 Furnace Firebox=TA3 Ofen-Feuerkiste +TA3 Furnace Oil Burner=TA3 Ofen-Ölbrenner TA3 Generator=TA3 Generator TA3 Gravel Sieve=TA3 Kiessieb TA3 Logic Block=TA3 Logikblock TA3 Melting=TA3 Schmelzen TA3 Node Detector=TA3 Block Detektor +TA3 Oil Barrel=TA3 Ölfass TA3 Oil Explorer=TA3 Ölexplorer TA3 Oil Storage=TA3 Öl Speicher TA3 Player Detector=TA3 Spieler Detektor TA3 Power Station Firebox=TA3 Kraftwerks-Feuerbox +TA3 Power Station Oil Burner=TA3 Kraftwerks-Ölbrenner TA3 Power Terminal=TA3 Strom Terminal TA3 Protected Chest=TA3 Gesicherte Kiste +TA3 Pump=TA3 Pumpe TA3 Repeater=TA3 Wiederholer TA3 Sequencer=TA3 Sequenzer +TA3 Tank=TA3 Tank TA3 Terminal=TA3 Terminal TA3 Timer=TA3 Timer TA3 Tiny Power Generator=TA3 Kleiner Stromgenerator @@ -163,6 +173,7 @@ TA3 Turbine=TA3 Turbine TA3 Vacuum Tube=TA3 Vakuumröhre TA4 Carbon Fiber=TA4 Kohlefaser TA4 Derrick=TA4 Bohrturm +TA4 Doser=TA4 Dosierer TA4 Electrolyzer=TA4 Elektrolyseur TA4 Energy Storage=TA4 Energiespeicher TA4 Epoxide Resin=TA4 Epoxidharz @@ -178,10 +189,11 @@ TA4 Junction Pipe=TA4 Verbindungsrohr TA4 Low Power Box==TA4 Niederspannungsverteilerbox TA4 Low Power Cable=TA4 Niederspannungskabel TA4 Pillar=TA4 Säule -TA4 Pipe=TA4 Röhre TA4 Pipe Inlet=TA4 Rohrzulauf TA4 Protected Chest=TA4 Gesicherte Kiste +TA4 Pump=TA4 Pumpe TA4 Reactor=Reaktor +TA4 Reactor Filler Pipe=TA4 Reaktor Einfüllstutzen TA4 Rotor Blade=TA4 Rotorblatt TA4 Silicon Wafer=TA4 Silizium-Wafer TA4 Solar Carrier Module=TA4 Solar Trägermodul @@ -192,6 +204,7 @@ TA4 Solar Inverter AC=TA4 Solar Wechselrichter AC TA4 Solar Inverter DC=TA4 Solar Wechselrichter DC TA4 Solar Module=TA4 Solarmodul TA4 Streetlamp Solar Cell=TA4 Straßenlampen-Solarzelle +TA4 Tank=TA4 Tank TA4 Turbine=TA4 Turbine TA4 WLAN Chip=TA4 WLAN Chip TA4 Wind Turbine=TA4 Windkraftanlage @@ -214,6 +227,8 @@ Time=Zeit Update=Update Usmium Nuggets=Usmium Nuggets WLAN Chip=WLAN Chip +Water=Wasser +Water Barrel=Wasserfass Wrong place for wind turbines!=Falscher Ort für Windkraftanlagen [TA4 Wind Turbine]=[TA4 Windkraftanlage] [TA] Area is protected!=[TA] Bereich ist geschützt @@ -233,8 +248,14 @@ added=hinzugefügt wird added or removed=hinzugefügt oder entfernt wird commands like: help=Kommandos wie: help connected with=verbunden mit +empty=leer +input missing=Zufuhr fehlt light=Licht +no fuel or no power=kein Strom oder Brennstoff +output blocked=Ausgang blockiert power=Strom +reactor defect=Reaktor defekt +reactor has no power=Reaktor hat keinen Strom removed=entfernt stopped=gestoppt -##### not used anymore ##### \ No newline at end of file +##### not used anymore ##### diff --git a/locale/template.txt b/locale/template.txt index 9aa9631..7af38af 100644 --- a/locale/template.txt +++ b/locale/template.txt @@ -72,8 +72,10 @@ Power= Primary available= Primary needed= Pusher= +Recipe= Remove derrick= Rinsing= +River Water Barrel= Save= Secondary available= Secondary needed= @@ -89,10 +91,14 @@ TA Ceiling Lamp= TA Construction Board= TA Electric Cable= TA Electric Junction Box= +TA Empty Barrel= TA Industrial Lamp 1= TA Industrial Lamp 2= TA Industrial Lamp 3= +TA Junction Pipe= TA Lamp= +TA Oil= +TA Pipe= TA Power Line= TA Power Pole= TA Power Pole Top (for up to 6 connections)= @@ -140,20 +146,24 @@ TA3 Detector= TA3 Drill Bit= TA3 Ele Fab= TA3 Funnel= -TA3 Furnace Firebox= +TA3 Furnace Oil Burner= TA3 Generator= TA3 Gravel Sieve= TA3 Logic Block= TA3 Melting= TA3 Node Detector= +TA3 Oil Barrel= TA3 Oil Explorer= TA3 Oil Storage= TA3 Player Detector= TA3 Power Station Firebox= +TA3 Power Station Oil Burner= TA3 Power Terminal= TA3 Protected Chest= +TA3 Pump= TA3 Repeater= TA3 Sequencer= +TA3 Tank= TA3 Terminal= TA3 Timer= TA3 Tiny Power Generator= @@ -161,6 +171,7 @@ TA3 Turbine= TA3 Vacuum Tube= TA4 Carbon Fiber= TA4 Derrick= +TA4 Doser= TA4 Electrolyzer= TA4 Energy Storage= TA4 Epoxide Resin= @@ -176,10 +187,11 @@ TA4 Junction Pipe= TA4 Low Power Box= TA4 Low Power Cable= TA4 Pillar= -TA4 Pipe= TA4 Pipe Inlet= TA4 Protected Chest= +TA4 Pump= TA4 Reactor= +TA4 Reactor Filler Pipe= TA4 Rotor Blade= TA4 Silicon Wafer= TA4 Solar Carrier Module= @@ -190,6 +202,7 @@ TA4 Solar Inverter AC= TA4 Solar Inverter DC= TA4 Solar Module= TA4 Streetlamp Solar Cell= +TA4 Tank= TA4 Turbine= TA4 WLAN Chip= TA4 Wind Turbine= @@ -212,6 +225,8 @@ Time= Update= Usmium Nuggets= WLAN Chip= +Water= +Water Barrel= Wrong place for wind turbines!= [TA4 Wind Turbine]= [TA] Area is protected!= @@ -231,7 +246,13 @@ added= added or removed= commands like: help= connected with= +empty= +input missing= light= +no fuel or no power= +output blocked= power= +reactor defect= +reactor has no power= removed= stopped= \ No newline at end of file diff --git a/manuals/manual_ta3_DE.md b/manuals/manual_ta3_DE.md index 2bfb3c1..650f7f0 100644 --- a/manuals/manual_ta3_DE.md +++ b/manuals/manual_ta3_DE.md @@ -9,15 +9,18 @@ Das Industrielle Zeitalter ist auf seinem Höhepunkt. [techage_ta3|image] -## Kohlekraftwerk +## Kohlekraftwerk / Ölkraftwerk Das Kohlekraftwerk besteht aus mehreren Blöcken und muss wie im Plan rechts abgebildet, zusammen gebaut werden. Dazu werden die Blöcke TA3 Kraftwerks-Feuerbox, TA3 Boiler oben, TA3 Boiler unten, TA3 Turbine, TA3 Generator und TA3 Kühler benötigt. Der Boiler muss mit Wasser gefüllt werden. Dazu bis zu 10 Eimer Wasser in den Boiler füllen. -Die Feuerbox muss mit Kohle, Holzkohle oder Erdöl gefüllt werden. +Die Feuerbox muss mit Kohle oder Holzkohle gefüllt werden. Wenn das Wasser heiß ist, kann das Ventil am Boiler geöffnet und anschließend die Generator gestartet werden. -Das Kraftwerk liefert eine Leistung von 80 ku und kann mit Kohle, Holzkohle oder Erdöl betrieben werden. +Das Kraftwerk kann alternativ auch mit einem Ölbrenner ausgestattet und dann mit Öl betrieben werden. +Das Öl kann über eine Pumpe und Ölleitung nachgefüllt werden. + +Das Kraftwerk liefert eine Leistung von 80 ku. [coalpowerstation|plan] @@ -30,6 +33,14 @@ Die Feuerbox muss mit Kohle, Holzkohle oder Erdöl gefüllt werden. Die Brenndau [ta3_firebox|image] +### TA3 Kraftwerks-Ölbrenner / TA3 Power Station Oil Burner + +Teil des Kraftwerks. +Der Ölbrenner kann nur mit Öl gefüllt werden. Die Brenndauer ist abhängig von der Leistung, die vom Kraftwerk angefordert wird. Unter Volllast brennt Öl 20 s. Unter Teillast entsprechend länger (50% Last = doppelte Zeit). + +[ta3_oilbox|image] + + ### TA3 Boiler unten/oben Teil des Kraftwerk. Muss mit Wasser gefüllt werden. Wem kein Wasser mehr vorhanden ist oder die Temperatur zu weit absinkt, schaltet sich der Boiler ab. @@ -179,16 +190,16 @@ Die Daten des Terminals werden beim Öffnen des Menüs und dann nur durch Anklic Der TA3 Industrieofen dient als Ergänzung zu normalen Ofen (furnace). Damit können alle Waren mit "Koch" Rezepte, auch im Industrieofen hergestellt werden. Es gibt aber auch spezielle Rezepte, die nur im Industrieofen hergestellt werden können. Der Industrieofen hat sein eigenes Menü zur Rezeptauswahl. Abhängig von den Waren im Industrieofen Inventar links kann rechts das Ausgangsprodukt gewählt werden. -Der Industrieofen benötigt Strom (für das Gebläse) sowie Kohle, Holzkohle oder Erdöl für die Befeuerung. Der Industrieofens und muss wie im Plan rechts abgebildet, zusammen gebaut werden. +Der Industrieofen benötigt Strom (für das Gebläse) sowie Öl für den Brenner. Der Industrieofens und muss wie im Plan rechts abgebildet, zusammen gebaut werden. -Die Brennzeit für Kohle und Erdöl beträgt 80 s und für Holzkohle 240 s. +Die Brennzeit für Öl beträgt 80 s. [ta3_furnace|plan] -### TA3 Ofen-Feuerkiste / Furnace Firebox +### TA3 Ofen-Ölbrenner / Furnace Oil Burner -Ist Teil des TA3 Industrieofen. Muss mit Kohle, Holzkohle oder Erdöl befeuert werden. +Ist Teil des TA3 Industrieofen. Muss mit Öl befeuert werden. [ta3_furnacefirebox|image] @@ -248,7 +259,7 @@ Wurde das Ölfeld erreicht, kann der Bohrturm abgebaut und die Kiste entfernt we ### TA3 Ölpumpe / Oil Pumpjack -An die Stelle der Ölbohrkiste muss nun die Ölpumpe platziert werden. Auch die Ölpumpe benötigt Strom (16 ku) und liefert alle 8 s ein Erdöl-Item, das in einer Kiste gesammelt werden muss. Dazu muss die Ölpumpe über eine Röhre mit der Kiste verbunden werden. +An die Stelle der Ölbohrkiste muss nun die Ölpumpe platziert werden. Auch die Ölpumpe benötigt Strom (16 ku) und liefert alle 8 s ein Einheit Erdöl. Das Erdöl muss in einem Tank gesammelt werden. Dazu muss die Ölpumpe über eine Leitung (gelbe Röhre) mit dem Tank verbunden werden. Ist alles Öl abgepumpt, kann auch die Ölpumpe wieder entfernt werden. [ta3_pumpjack|image] @@ -515,6 +526,41 @@ Die Verarbeitungsleistung ist 2 Items alle 8 s. Der Block benötigt 5 ku Strom. [ta3_liquidsampler|image] +## Flüssigkeiten + +Flüssigkeiten wie Wasser oder Öl können nur die spezielle Leitungen gepumpt und in Tanks gespeichert werden. Wie auch bei Wasser gibt es aber Behälter (Eimer, Kanister, Fässer), in denen die Flüssig gelagert und transportiert werden kann. + + +[ta3_tank|plan] + + +### TA3 Tank / TA3 Tank + +In einem Tank können Flüssigkeiten gespeichert werden. Ein Tank kann über eine Pumpe gefüllt bzw. geleert werden. Dazu muss die Pumpe über einer Leitung (gelbe Röhre) mit dem Tank verbunden sein. +Ein Tank kann aber auch über Eimer/Fässer gefüllt bzw. geleert werden: +- werden leere Fässer mit einem Schieber oder von Hand in den Tank gegeben, werden diese gefüllt und können ausgangsseitig wieder entnommen werden +- werden volle Fässer mit einem Schieber oder von Hand in den Tank gegeben, werden diese geleert und können ausgangsseitig wieder entnommen werden + +Dabei ist zu beachten, dass Fässer nur komplett gefüllt oder entleert werden können. Sind bspw. weniger als 10 Einheiten im Tank, muss dieser Rest mit Eimern entnommen oder leergepumpt werden. + +In einen TA3 Tank passen 500 Einheiten oder 50 Fässer einer Flüssigkeit. + +[ta3_tank|image] + + +### TA3 Pumpe / TA3 Pump + +Mit der Pumpe können Flüssigkeiten von Tanks oder Behältern zu anderen Tanks oder Behältern gepumpt werden. Bei der Pumpe muss die Pumprichtung (Pfeil) beachtet werden. Über die gelben Leitungen und Verbindungsstücke ist es auch möglich, mehrere Tanks auf jeder Seite der Pumpe anzuordnen. Allerdings müssen die Tanks den selben Inhalt haben. + +- zum Füllen, oder volle Fässer zul Leeren +- in einen Eimer oder einen Kanister passt eine Einheit einer Flüssigkeit, bspw. Wasser +- in ein Fass passen 10 Einheiten Flüssigkeit, bspw. Öl + +Die TA3 Pumpe pumpt 4 Einheiten Flüssigkeit alle zwei Sekunden. + + +[ta3_pump|image] + ## Werkzeuge diff --git a/manuals/manual_ta4_DE.md b/manuals/manual_ta4_DE.md index 8acb4b0..2e3a6a7 100644 --- a/manuals/manual_ta4_DE.md +++ b/manuals/manual_ta4_DE.md @@ -210,6 +210,26 @@ Die Brennstoffzelle kann bis zu 40 ku an Strom abgeben und benötigt dazu alle 6 [ta4_fuelcell|image] +## Weitere TA4 Blöcke + + +### TA4 Tank / TA4 Tank + +Siehe TA3 Tank. + +In einen TA4 Tank passen 1000 Einheiten oder 100 Fässer einer Flüssigkeit. + +[ta4_tank|image] + + +### TA4 Pumpe / TA4 Pump + +Siehe TA3 Pumpe. + +Die TA4 Pumpe pumpt 8 Einheiten Flüssigkeit alle zwei Sekunden. + +[ta4_pump|image] + diff --git a/manuals/toc_DE.md b/manuals/toc_DE.md index 5ac4ba8..44c0f09 100644 --- a/manuals/toc_DE.md +++ b/manuals/toc_DE.md @@ -36,8 +36,9 @@ - [TA2 Gesicherte Kiste / Protected Chest](./manual_ta2_DE.md#ta2-gesicherte-kiste--protected-chest) - [Techage Forceload Block](./manual_ta2_DE.md#techage-forceload-block) - [TA3: Ölzeitalter](./manual_ta3_DE.md#ta3:-Ölzeitalter) - - [Kohlekraftwerk](./manual_ta3_DE.md#kohlekraftwerk) + - [Kohlekraftwerk / Ölkraftwerk](./manual_ta3_DE.md#kohlekraftwerk--Ölkraftwerk) - [TA3 Kraftwerks-Feuerbox / Power Station Firebox](./manual_ta3_DE.md#ta3-kraftwerks-feuerbox--power-station-firebox) + - [TA3 Kraftwerks-Ölbrenner / TA3 Power Station Oil Burner](./manual_ta3_DE.md#ta3-kraftwerks-Ölbrenner--ta3-power-station-oil-burner) - [TA3 Boiler unten/oben](./manual_ta3_DE.md#ta3-boiler-untenoben) - [TA3 Turbine](./manual_ta3_DE.md#ta3-turbine) - [TA3 Generator](./manual_ta3_DE.md#ta3-generator) @@ -56,7 +57,7 @@ - [TA3 Akku Block / Akku Box](./manual_ta3_DE.md#ta3-akku-block---akku-box) - [TA3 Strom Terminal / Power Terminal](./manual_ta3_DE.md#ta3-strom-terminal--power-terminal) - [TA3 Industrieofen](./manual_ta3_DE.md#ta3-industrieofen) - - [TA3 Ofen-Feuerkiste / Furnace Firebox](./manual_ta3_DE.md#ta3-ofen-feuerkiste--furnace-firebox) + - [TA3 Ofen-Ölbrenner / Furnace Oil Burner](./manual_ta3_DE.md#ta3-ofen-Ölbrenner--furnace-oil-burner) - [TA3 Ofenoberteil / Furnace Top](./manual_ta3_DE.md#ta3-ofenoberteil--furnace-top) - [TA3 Gebläse / Booster](./manual_ta3_DE.md#ta3-gebläse--booster) - [Öl-Anlagen](./manual_ta3_DE.md#Öl-anlagen) @@ -87,6 +88,9 @@ - [TA3 Kiessieb / Gravel Sieve](./manual_ta3_DE.md#ta3-kiessieb--gravel-sieve) - [TA3 Mühle / Grinder](./manual_ta3_DE.md#ta3-mühle--grinder) - [TA3 Flüssigkeitensammler / Liquid Sampler](./manual_ta3_DE.md#ta3-flüssigkeitensammler--liquid-sampler) + - [Flüssigkeiten](./manual_ta3_DE.md#flüssigkeiten) + - [TA3 Tank / TA3 Tank](./manual_ta3_DE.md#ta3-tank--ta3-tank) + - [TA3 Pumpe / TA3 Pump](./manual_ta3_DE.md#ta3-pumpe--ta3-pump) - [Werkzeuge](./manual_ta3_DE.md#werkzeuge) - [Techage Info Tool](./manual_ta3_DE.md#techage-info-tool) - [TechAge Programmer](./manual_ta3_DE.md#techage-programmer) @@ -111,4 +115,7 @@ - [TA4 Röhre / Pipe](./manual_ta4_DE.md#ta4-röhre--pipe) - [Wasserstoff](./manual_ta4_DE.md#wasserstoff) - [Elektrolyseur](./manual_ta4_DE.md#elektrolyseur) - - [Brennstoffzelle](./manual_ta4_DE.md#brennstoffzelle) \ No newline at end of file + - [Brennstoffzelle](./manual_ta4_DE.md#brennstoffzelle) + - [Weitere TA4 Blöcke](./manual_ta4_DE.md#weitere-ta4-blöcke) + - [TA4 Tank / TA4 Tank](./manual_ta4_DE.md#ta4-tank--ta4-tank) + - [TA4 Pumpe / TA4 Pump](./manual_ta4_DE.md#ta4-pumpe--ta4-pump) \ No newline at end of file diff --git a/oil/generator.lua b/oil/generator.lua index 0d10d0e..ae16552 100644 --- a/oil/generator.lua +++ b/oil/generator.lua @@ -19,6 +19,9 @@ local S = techage.S local Power = techage.ElectricCable local firebox = techage.firebox local power = techage.power +local oilburner = techage.oilburner +local Pipe = techage.LiquidPipe +local liquid = techage.liquid local CYCLE_TIME = 2 local PWR_CAPA = 12 @@ -26,31 +29,30 @@ local BURN_CYCLE_FACTOR = 2.5 local function formspec(self, pos, mem) local fuel_percent = 0 - if mem.generating then + if mem.running then fuel_percent = ((mem.burn_cycles or 1) * 100) / (mem.burn_cycles_total or 1) end - return "size[8,7]".. + return "size[8,6]".. default.gui_bg.. default.gui_bg_img.. default.gui_slots.. - "list[current_name;fuel;0.5,1;1,1;]".. - "image[1.5,1;1,1;default_furnace_fire_bg.png^[lowpart:".. - fuel_percent..":default_furnace_fire_fg.png]".. - "button[3,1;1.8,1;update;"..S("Update").."]".. - "image_button[5.5,1;1,1;".. self:get_state_button_image(mem) ..";state_button;]".. - "image[6.5,0.5;1,2;"..power.formspec_power_bar(PWR_CAPA, mem.provided).."]".. - "list[current_player;main;0,3;8,4;]".. + oilburner.formspec_oil(1, 0, mem).. + "button[1.6,1;1.8,1;update;"..S("Update").."]".. + "image_button[5.5,0.5;1,1;".. self:get_state_button_image(mem) ..";state_button;]".. + "image[6.5,0;1,2;"..power.formspec_power_bar(PWR_CAPA, mem.provided).."]".. + "list[current_player;main;0,2.3;8,4;]".. default.get_hotbar_bg(0, 3) end local function can_start(pos, mem, state) - if mem.burn_cycles > 0 then return true end - local inv = M(pos):get_inventory() - return not inv:is_empty("fuel") + if mem.burn_cycles > 0 or (mem.liquid and mem.liquid.amount and mem.liquid.amount > 0) then + return true + end + return false end local function start_node(pos, mem, state) - mem.generating = true + mem.running = true power.generator_start(pos, mem, PWR_CAPA) minetest.sound_play("techage_generator", { pos = pos, @@ -59,7 +61,7 @@ local function start_node(pos, mem, state) end local function stop_node(pos, mem, state) - mem.generating = false + mem.running = false mem.provided = 0 power.generator_stop(pos, mem) end @@ -79,12 +81,13 @@ local State = techage.NodeStates:new({ local function burning(pos, mem) local ratio = math.max((mem.provided or PWR_CAPA) / PWR_CAPA, 0.02) + mem.liquid = mem.liquid or {} + mem.liquid.amount = mem.liquid.amount or 0 mem.burn_cycles = (mem.burn_cycles or 0) - ratio if mem.burn_cycles <= 0 then - local taken = firebox.get_fuel(pos) - if taken then - mem.burn_cycles = (firebox.Burntime[taken:get_name()] or 1) / CYCLE_TIME * BURN_CYCLE_FACTOR - + if mem.liquid.amount > 0 then + mem.liquid.amount = mem.liquid.amount - 1 + mem.burn_cycles = (oilburner.Oilburntime or 1) / CYCLE_TIME * BURN_CYCLE_FACTOR mem.burn_cycles_total = mem.burn_cycles return true else @@ -98,7 +101,7 @@ end local function node_timer(pos, elapsed) local mem = tubelib2.get_mem(pos) - if mem.generating and burning(pos, mem) then + if mem.running and burning(pos, mem) then mem.provided = power.generator_alive(pos, mem) minetest.sound_play("techage_generator", { pos = pos, @@ -118,19 +121,29 @@ local function on_receive_fields(pos, formname, fields, player) local mem = tubelib2.get_mem(pos) State:state_button_event(pos, mem, fields) - if fields.update then - M(pos):set_string("formspec", formspec(State, pos, mem)) - end + M(pos):set_string("formspec", formspec(State, pos, mem)) end -local function allow_metadata_inventory(pos, listname, index, stack, player) +local function allow_metadata_inventory_put(pos, listname, index, stack, player) if minetest.is_protected(pos, player:get_player_name()) then return 0 end - if stack:get_name() == "techage:oil_source" then - return stack:get_count() + return 1 +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 - return 0 + return stack:get_count() +end + +local function formspec_clbk(pos, mem) + return formspec(State, pos, mem) +end + +local function on_metadata_inventory_put(pos, listname, index, stack, player) + minetest.after(0.5, oilburner.move_item, pos, stack, formspec_clbk) end local function on_rightclick(pos) @@ -157,7 +170,7 @@ minetest.register_node("techage:tiny_generator", { on_construct = function(pos) local mem = tubelib2.init_mem(pos) local number = techage.add_node(pos, "techage:tiny_generator") - mem.generating = false + mem.running = false mem.burn_cycles = 0 State:node_init(pos, mem, number) local meta = M(pos) @@ -166,12 +179,21 @@ minetest.register_node("techage:tiny_generator", { inv:set_size('fuel', 1) end, - allow_metadata_inventory_put = allow_metadata_inventory, - allow_metadata_inventory_take = allow_metadata_inventory, + liquid = { + capa = oilburner.CAPACITY, + peek = liquid.srv_peek, + put = liquid.srv_put, + take = liquid.srv_take, + }, + networks = oilburner.networks, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + on_metadata_inventory_put = on_metadata_inventory_put, on_receive_fields = on_receive_fields, on_rightclick = on_rightclick, on_timer = node_timer, - can_dig = techage.firebox.can_dig, + can_dig = oilburner.can_dig, }) minetest.register_node("techage:tiny_generator_on", { @@ -203,6 +225,15 @@ minetest.register_node("techage:tiny_generator_on", { }, }, }, + + liquid = { + capa = oilburner.CAPACITY, + peek = liquid.srv_peek, + put = liquid.srv_put, + take = liquid.srv_take, + }, + networks = oilburner.networks, + paramtype = "light", paramtype2 = "facedir", groups = {not_in_creative_inventory=1}, @@ -211,14 +242,17 @@ minetest.register_node("techage:tiny_generator_on", { on_rotate = screwdriver.disallow, is_ground_content = false, - allow_metadata_inventory_put = allow_metadata_inventory, - allow_metadata_inventory_take = allow_metadata_inventory, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + on_metadata_inventory_put = on_metadata_inventory_put, on_receive_fields = on_receive_fields, on_rightclick = on_rightclick, on_timer = node_timer, - can_dig = techage.firebox.can_dig, + can_dig = oilburner.can_dig, }) +Pipe:add_secondary_node_names({"techage:tiny_generator", "techage:tiny_generator_on"}) + techage.power.register_node({"techage:tiny_generator", "techage:tiny_generator_on"}, { conn_sides = {"R"}, power_network = Power, diff --git a/textures/techage_oil_boiler_inv.png b/textures/techage_oil_boiler_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..9146f843a240245406b6f139a03f063203dbde30 GIT binary patch literal 1606 zcmV-M2D$l(P)!(WM*IYtilY&Qdd`1w*-EB`_GQ!@pw2KhO!^3sw|2M9}dUk9|j+q zqU`&s>HDU_t1Qc^Da(Q%tG4M-S$mE5lIdlDGB-{q)4nN4*UF7)gxQMRRxK+5{p|+BjoWRrB5_anXP;-7Gw@M-U$1WIHkzu zKP(^slw#}vKwaW#K|#Gp*^&jQQvlwmQSu~!at9y{Ll1}|&dai57^JRMQT2Uav=kz| z+HUJ%C89x=m6SZc-o*Pd!J;itP+1%DEkM_|3~$gajhH1?6jBosq8HSI6#yt&=e7WE z(;#IcVa8OAI6%3{S8_o)(ID)|&bb|ft{xzf-ZhCk0{T8hw`o9sOFJgzl+|Vf;Jxnx z;-@Z5LnUTYN>wb&Exbr2Zu{W1cFrr~zM{3M1OB{FnBWmE25v{tU6wZa4)3~dssmCP z<1qXkKzSd6Gj19tLeOT6X`1SK!RT<+bzRL>!2!U9+8I;(F90O3Ia7DTEqt0J-?ZES zx?ofQpi(B(bqF949wdNH4Gc_lx7-Xy(gd*J$|zHJ9>E+Up*D90IkqccdCnj_IZV1NmyuS4@pajaAN>dlfU!+{{v^OuV`i zAOZkfeG{OJhb7KG0GJ45+zxzUR<7!M{DQu7sSsWSP|9N`o6*V5n+#MG82$lZ!F>R* z0}PbV0q3$ifE&js%%ve<5BfAL8-NguQE?p6fKC9k$sQS;=FuhsY?h#rYXh)QyVJ=> z4yD|~PB0ov0AYeyNe6cEs3rP@>R1S447S4qKyFX-yet$V-Aafj07&Rk6VVE59sx2l z&ew4yi!lUgo8<{0Wu^xX|CxtI97l*5e#QE4WN&Y02Tn}_xHaE z0Tz}P?g69|A>QHwSQ``H;<#MT>-$G*ZV(I4fh_>}r=g8PJ+h62xWp9{K0iN1$jta> z3Kr?L#!I6Ln-kH@%e=1ZUmu_A`+B_**aKJ%4O-)k0=59TI?d3qt{>|edj@RA z7=c3vxHwRV*+UR9$1U`DDisx zt%9kU5F-%IuK`j4EQB>BoGGk((tWFI?heUm9X02cUR!$ZnGwQ@@8zqz(Pxh>zrIXrbuK{uug&`AZIY3gl zO&m1UlYq^?`?;R$v{FQ~;pB?xr2}1*?PTru&kOjb{*{c4Z&gy9EYy@oa@h}09C@k~ zStNicDtODL@pC-3g*d>4ih82dfd>&$iI)HNnMq5^CSpWb407*qoM6N<$ Ef)v@s3IG5A literal 0 HcmV?d00001