From a3935db1080be07629f40350bd0d4e95aa2886f0 Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Thu, 6 Feb 2020 20:51:30 +0100 Subject: [PATCH] further nodes adapter to new APIs --- basis/networks.lua | 2 +- chemistry/ta4_doser.lua | 2 +- chemistry/ta4_reactor.lua | 6 +- coal_power_station/generator.lua | 3 +- energy_storage/generator.lua | 206 ++++++++++++++++------ energy_storage/heatexchanger.lua | 2 +- energy_storage/heatexchanger1.lua | 274 ++++++++++++++++++++++++++++++ energy_storage/heatexchanger2.lua | 171 +++++++++++++++++++ energy_storage/heatexchanger3.lua | 84 +++++++++ energy_storage/inlet.lua | 32 ++-- energy_storage/turbine.lua | 117 ++++++------- init.lua | 27 +-- liquids/filler.lua | 1 - oil/drillbox.lua | 1 - power/distribution.lua | 8 +- power/formspecs.lua | 8 +- power/node_api.lua | 33 +++- power/power_terminal.lua | 4 +- solar/inverter.lua | 187 ++++++++++++-------- solar/minicell.lua | 74 ++++---- solar/solarcell.lua | 83 ++++++--- wind_turbine/pillar.lua | 4 +- wind_turbine/rotor.lua | 76 +++++---- 23 files changed, 1080 insertions(+), 325 deletions(-) create mode 100644 energy_storage/heatexchanger1.lua create mode 100644 energy_storage/heatexchanger2.lua create mode 100644 energy_storage/heatexchanger3.lua diff --git a/basis/networks.lua b/basis/networks.lua index e2203e2..3071377 100644 --- a/basis/networks.lua +++ b/basis/networks.lua @@ -201,7 +201,7 @@ end -- 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) + --techage.mark_position("singleplayer", pos, "walk", "", 1) --print("connection_walk", node.name, outdirs or is_junction(pos, node.name, tlib2.tube_type)) if outdirs or is_junction(pos, node.name, tlib2.tube_type) then for _,outdir in pairs(outdirs or get_node_connections(pos, tlib2.tube_type)) do diff --git a/chemistry/ta4_doser.lua b/chemistry/ta4_doser.lua index 17099a7..cd3dd43 100644 --- a/chemistry/ta4_doser.lua +++ b/chemistry/ta4_doser.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019 Joachim Stolberg + Copyright (C) 2019-2020 Joachim Stolberg GPL v3 See LICENSE.txt for more information diff --git a/chemistry/ta4_reactor.lua b/chemistry/ta4_reactor.lua index edfee2e..6ca930e 100644 --- a/chemistry/ta4_reactor.lua +++ b/chemistry/ta4_reactor.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019 Joachim Stolberg + Copyright (C) 2019-2020 Joachim Stolberg GPL v3 See LICENSE.txt for more information @@ -14,8 +14,6 @@ local S = techage.S local M = minetest.get_meta -local Cable = techage.ElectricCable -local power = techage.power local Pipe = techage.LiquidPipe local networks = techage.networks local liquid = techage.liquid @@ -67,7 +65,7 @@ minetest.register_node("techage:ta4_reactor_fillerpipe", { networks = { pipe2 = { - sides = {U=1}, -- Pipe connection sides + sides = {U = 1}, -- Pipe connection sides ntype = "tank", }, }, diff --git a/coal_power_station/generator.lua b/coal_power_station/generator.lua index c786907..8611829 100644 --- a/coal_power_station/generator.lua +++ b/coal_power_station/generator.lua @@ -95,7 +95,7 @@ local function on_receive_fields(pos, formname, fields, player) if minetest.is_protected(pos, player:get_player_name()) then return end - local nvm,_ = techage.get_nvm(pos, true) + local nvm = techage.get_nvm(pos) State:state_button_event(pos, nvm, fields) end @@ -207,6 +207,7 @@ minetest.register_node("techage:generator_on", { Cable:add_secondary_node_names({"techage:generator", "techage:generator_on"}) +-- controlled by the turbine techage.register_node({"techage:generator", "techage:generator_on"}, { on_transfer = function(pos, in_dir, topic, payload) local nvm = techage.get_nvm(pos) diff --git a/energy_storage/generator.lua b/energy_storage/generator.lua index 89ca78a..7dbe984 100644 --- a/energy_storage/generator.lua +++ b/energy_storage/generator.lua @@ -3,12 +3,12 @@ TechAge ======= - Copyright (C) 2019 Joachim Stolberg + Copyright (C) 2019-2020 Joachim Stolberg GPL v3 See LICENSE.txt for more information - TA4 Dummy Generator for the TES + TA4 TES Generator ]]-- @@ -16,31 +16,121 @@ local M = minetest.get_meta local S = techage.S +local STANDBY_TICKS = 4 +local COUNTDOWN_TICKS = 4 local CYCLE_TIME = 2 +local PWR_CAPA = 60 local Cable = techage.ElectricCable local power = techage.power +local networks = techage.networks -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) +local function formspec(self, pos, nvm) + return "size[4,4]".. + "box[0,-0.1;3.8,0.5;#c6e8ff]".. + "label[1,-0.1;"..minetest.colorize( "#000000", S("Generator")).."]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + power.formspec_label_bar(0, 0.8, S("power"), PWR_CAPA, nvm.provided).. + "image_button[2.8,2;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. + "tooltip[2.8,2;1,1;"..self:get_state_tooltip(nvm).."]" end --- to detect the missing turbine +local function transfer_turbine(pos, topic, payload) + return techage.transfer(pos, "L", topic, payload, nil, + {"techage:ta4_turbine", "techage:ta4_turbine_on"}) +end + +local function can_start(pos, nvm, state) + return (nvm.heatexchanger_trigger or 0) > 0 -- by means of heatexchanger +end + +local function start_node(pos, nvm, state) + local outdir = M(pos):get_int("outdir") + power.generator_start(pos, Cable, CYCLE_TIME, outdir) + transfer_turbine(pos, "start") + nvm.running = true +end + +local function stop_node(pos, nvm, state) + local outdir = M(pos):get_int("outdir") + power.generator_stop(pos, Cable, outdir) + nvm.provided = 0 + transfer_turbine(pos, "stop") + nvm.running = false +end + +local State = techage.NodeStates:new({ + node_name_passive = "techage:ta4_generator", + node_name_active = "techage:ta4_generator_on", + cycle_time = CYCLE_TIME, + standby_ticks = STANDBY_TICKS, + formspec_func = formspec, + infotext_name = S("TA4 Generator"), + can_start = can_start, + start_node = start_node, + stop_node = stop_node, +}) + local function node_timer(pos, elapsed) local nvm = techage.get_nvm(pos) - nvm.remote_trigger = (nvm.remote_trigger or 0) - 1 - if nvm.remote_trigger <= 0 then - swap_node(pos, "techage:ta4_generator") - nvm.running = false + nvm.heatexchanger_trigger = (nvm.heatexchanger_trigger or 0) - 1 + if nvm.heatexchanger_trigger <= 0 then + State:nopower(pos, nvm) + stop_node(pos, nvm, State) + transfer_turbine(pos, "stop") + else + local outdir = M(pos):get_int("outdir") + nvm.provided = power.generator_alive(pos, Cable, CYCLE_TIME, outdir) + State:keep_running(pos, nvm, COUNTDOWN_TICKS) end - return true + if techage.is_activeformspec(pos) then + M(pos):set_string("formspec", formspec(State, pos, nvm)) + end + return State:is_active(nvm) end +local function on_receive_fields(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + local nvm,_ = techage.get_nvm(pos, true) + State:state_button_event(pos, nvm, fields) +end + +local function on_rightclick(pos, node, clicker) + local nvm = techage.get_nvm(pos) + techage.set_activeformspec(pos, clicker) + M(pos):set_string("formspec", formspec(State, pos, nvm)) +end + +local function after_place_node(pos) + local nvm = techage.get_nvm(pos) + local number = techage.add_node(pos, "techage:ta4_generator") + State:node_init(pos, nvm, number) + M(pos):set_int("outdir", networks.side_to_outdir(pos, "R")) + M(pos):set_string("formspec", formspec(State, pos, nvm)) + Cable:after_place_node(pos) +end + +local function after_dig_node(pos, oldnode) + Cable:after_dig_node(pos) + techage.del_mem(pos) +end + +local function tubelib2_on_update2(pos, outdir, tlib2, node) + power.update_network(pos, outdir, tlib2) +end + +local net_def = { + ele1 = { + sides = {R = 1}, + ntype = "gen2", + nominal = PWR_CAPA, + }, +} + minetest.register_node("techage:ta4_generator", { description = S("TA4 Generator"), tiles = { @@ -52,7 +142,15 @@ minetest.register_node("techage:ta4_generator", { "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_generator.png", "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_generator.png^[transformFX]", }, + + on_receive_fields = on_receive_fields, + on_rightclick = on_rightclick, on_timer = node_timer, + after_place_node = after_place_node, + after_dig_node = after_dig_node, + tubelib2_on_update2 = tubelib2_on_update2, + networks = net_def, + paramtype2 = "facedir", groups = {cracky=2, crumbly=2, choppy=2}, on_rotate = screwdriver.disallow, @@ -90,11 +188,14 @@ minetest.register_node("techage:ta4_generator_on", { }, }, - on_rightclick = function(pos) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, - + on_receive_fields = on_receive_fields, + on_rightclick = on_rightclick, on_timer = node_timer, + after_place_node = after_place_node, + after_dig_node = after_dig_node, + tubelib2_on_update2 = tubelib2_on_update2, + networks = net_def, + drop = "", paramtype2 = "facedir", groups = {not_in_creative_inventory=1}, @@ -104,6 +205,36 @@ minetest.register_node("techage:ta4_generator_on", { sounds = default.node_sound_wood_defaults(), }) +Cable:add_secondary_node_names({"techage:ta4_generator", "techage:ta4_generator_on"}) + +-- controlled by the turbine +techage.register_node({"techage:ta4_generator", "techage:ta4_generator_on"}, { + on_transfer = function(pos, in_dir, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == "trigger" then + print("trigger", nvm.provided) + nvm.heatexchanger_trigger = 3 + if nvm.running then + return nvm.provided or 0.1 + else + return 0 + end + end + end, + on_recv_message = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == "load" then + return techage.power.percent(PWR_CAPA, nvm.provided) + else + return State:on_receive_message(pos, topic, payload) + end + end, + on_node_load = function(pos) + M(pos):set_int("outdir", networks.side_to_outdir(pos, "R")) + State:on_node_load(pos) + end, +}) + minetest.register_craft({ output = "techage:ta4_generator", recipe = { @@ -113,41 +244,4 @@ minetest.register_craft({ }, }) --- need a dummy power connection -techage.power.register_node({"techage:ta4_generator", "techage:ta4_generator_on"}, { - conn_sides = {"R"}, - power_network = Cable, - after_place_node = function(pos, placer) - local nvm = techage.get_nvm(pos) - nvm.running = false - nvm.remote_trigger = 0 - end, - -}) - --- controlled by the turbine -techage.register_node({"techage:ta4_generator", "techage:ta4_generator_on"}, { - on_transfer = function(pos, in_dir, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "power" then - nvm.remote_trigger = 2 - return techage.power.power_network_available(pos) - elseif topic == "start" then - nvm.remote_trigger = 2 - swap_node(pos, "techage:ta4_generator_on") - nvm.running = true - minetest.get_node_timer(pos):start(CYCLE_TIME) - return true - elseif topic == "stop" then - swap_node(pos, "techage:ta4_generator") - nvm.running = false - nvm.remote_trigger = 0 - minetest.get_node_timer(pos):stop() - return true - elseif topic == "trigger" then - nvm.remote_trigger = 2 - return true - end - end, -}) diff --git a/energy_storage/heatexchanger.lua b/energy_storage/heatexchanger.lua index 65cf00e..c21f0ec 100644 --- a/energy_storage/heatexchanger.lua +++ b/energy_storage/heatexchanger.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019 Joachim Stolberg + Copyright (C) 2019-2020 Joachim Stolberg GPL v3 See LICENSE.txt for more information diff --git a/energy_storage/heatexchanger1.lua b/energy_storage/heatexchanger1.lua new file mode 100644 index 0000000..cde6fee --- /dev/null +++ b/energy_storage/heatexchanger1.lua @@ -0,0 +1,274 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2020 Joachim Stolberg + + GPL v3 + See LICENSE.txt for more information + + TA4 Heat Exchanger1 (bottom part) + +]]-- + +-- for lazy programmers +local S2P = minetest.string_to_pos +local P2S = minetest.pos_to_string +local M = minetest.get_meta +local S = techage.S + +local CYCLE_TIME = 2 +local PWR_PERF = 60 +local GRVL_CAPA = 700 +local PWR_CAPA = { + [3] = GRVL_CAPA * 3 * 3 * 3, -- 18900 Cyc = 630 min = 31.5 Tage bei einem ku, oder 31,5 * 24 kuh = 756 kuh = 12,6 h bei 60 ku + [5] = GRVL_CAPA * 5 * 5 * 5, -- ~2.5 days + [7] = GRVL_CAPA * 7 * 7 * 7, -- ~6 days +} + +local Cable = techage.ElectricCable +local Pipe = techage.LiquidPipe +local power = techage.power +local in_range = techage.in_range + +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 glowing(pos, nvm, should_glow) + if nvm.win_pos then + if should_glow then + swap_node(nvm.win_pos, "techage:glow_gravel") + else + swap_node(nvm.win_pos, "default:gravel") + end + end +end + +local function turbine_cmnd(pos, topic, payload) + return techage.transfer(pos, "R", topic, payload, Pipe, + {"techage:ta4_turbine", "techage:ta4_turbine_on"}) +end + +local function inlet_cmnd(pos, topic, payload) + return techage.transfer(pos, "L", topic, payload, Pipe, + {"techage:ta4_pipe_inlet"}) +end + +local function play_sound(pos) + local mem = techage.get_mem(pos) + if not mem.handle or mem.handle == -1 then + mem.handle = minetest.sound_play("techage_booster", { + pos = pos, + gain = 0.2, + max_hear_distance = 10, + loop = true}) + if mem.handle == -1 then + minetest.after(1, play_sound, pos) + end + end + local nvm = techage.get_nvm(pos) + nvm.charging = true +end + +local function stop_sound(pos) + local mem = techage.get_mem(pos) + if mem.handle then + minetest.sound_stop(mem.handle) + mem.handle = nil + end + local nvm = techage.get_nvm(pos) + nvm.charging = false +end + +local function on_power(pos) + play_sound(pos) +end + +local function on_nopower(pos) + nvm.needed = 0 + stop_sound(pos) +end + +local function start_node(pos, nvm) + nvm.running = true + nvm.needed = 0 + nvm.win_pos = inlet_cmnd(pos, "window") + power.consumer_start(pos, Cable, CYCLE_TIME) + minetest.get_node_timer(pos):start(CYCLE_TIME) + return true +end + +local function stop_node(pos, nvm) + nvm.running = false + nvm.needed = 0 + power.consumer_stop(pos, Cable) + minetest.get_node_timer(pos):stop() + stop_sound(pos) + return true +end + +local function after_place_node(pos, placer, itemstack) + local nvm = techage.get_nvm(pos) + nvm.capa = 0 + M(pos):set_string("owner", placer:get_player_name()) + Cable:after_place_node(pos) + Pipe:after_place_node(pos) +end + +local function can_dig(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local nvm = techage.get_nvm(pos) + return not nvm.running +end + +local function after_dig_node(pos, oldnode, oldmetadata, digger) + Cable:after_dig_node(pos) + Pipe:after_dig_node(pos) + techage.del_mem(pos) +end + +local function tubelib2_on_update2(pos, outdir, tlib2, node) + power.update_network(pos, outdir, tlib2) +end + +local function can_start(pos, nvm) + -- the heat exchanger shall be able to start even without + -- having power. Therefore, no "if power.power_available(pos, Cable) then" + local diameter = inlet_cmnd(pos, "diameter") + if diameter then + nvm.capa_max = PWR_CAPA[tonumber(diameter)] or 0 + if nvm.capa_max ~= 0 then + local owner = M(pos):get_string("owner") or "" + return inlet_cmnd(pos, "volume", owner) + else + return S("wrong storage diameter")..": "..diameter + end + else + return S("inlet/pipe error") + end + return S("did you check the plan?") +end + +local function node_timer(pos, elapsed) + local nvm = techage.get_nvm(pos) + nvm.capa = nvm.capa or 0 + local taken = 0 + local given = 0 + + if nvm.capa < (nvm.capa_max * 0.9) then + taken = power.consumer_alive(pos, Cable, CYCLE_TIME) + end + if nvm.capa > 0 then + given = turbine_cmnd(pos, "trigger") or 0 + end + + if taken > 0 and not nvm.charging then + play_sound(pos) + elseif taken == 0 and nvm.charging then + stop_sound(pos) + end + + nvm.needed = taken - given + nvm.capa = in_range(nvm.capa + nvm.needed, 0, nvm.capa_max) + glowing(pos, nvm, nvm.capa > nvm.capa_max * 0.8) + print("node_timer TES "..P2S(pos), nvm.needed, nvm.capa, nvm.capa_max) + return true +end + +local net_def = { + ele1 = { + sides = {F = 1, B = 1}, + ntype = "con2", + nominal = PWR_PERF, + }, + pipe2 = { + sides = {L = 1, R = 1}, + ntype = "con1", + }, +} + +minetest.register_node("techage:heatexchanger1", { + description = S("TA4 Heat Exchanger 1"), + tiles = { + -- up, down, right, left, back, front + "techage_hole_ta4.png^techage_appl_arrow_white.png", + "techage_filling_ta4.png^techage_frame_ta4.png", + "techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_pipe.png", + "techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_pipe.png", + "techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_electric.png", + "techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_electric.png", + }, + + on_timer = node_timer, + after_place_node = after_place_node, + can_dig = can_dig, + after_dig_node = after_dig_node, + --tubelib2_on_update2 = tubelib2_on_update2, + networks = net_def, + + paramtype2 = "facedir", + groups = {crumbly = 2, cracky = 2, snappy = 2}, + on_rotate = screwdriver.disallow, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +Pipe:add_secondary_node_names({"techage:heatexchanger1"}) +Cable:add_secondary_node_names({"techage:heatexchanger1"}) + +-- command interface +techage.register_node({"techage:heatexchanger1"}, { + on_transfer = function(pos, indir, topic, payload) + print("on_transfer") + local nvm = techage.get_nvm(pos) + -- used by heatexchanger2 + if topic == "state" then + return nvm.capa_max, nvm.capa, PWR_PERF, math.max(nvm.needed, 0) + elseif topic == "integrity" then + return inlet_cmnd(pos, "volume", payload) + elseif topic == "state" then + return inlet_cmnd(pos, "volume", payload) + elseif topic == "can_start" then + return can_start(pos, nvm) + elseif topic == "start" then + return start_node(pos, nvm) + elseif topic == "stop" then + return stop_node(pos, nvm) + end + end, + on_recv_message = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == "load" then + return techage.power.percent(nvm.capa_max, nvm.capa) + elseif topic == "size" then + return (nvm.capa_max or 0) / GRVL_CAPA + else + return "unsupported" + end + end, + on_node_load = function(pos, node) + local nvm = techage.get_nvm(pos) + if nvm.running and nvm.charging then + play_sound(pos) + end + end, +}) + +minetest.register_craft({ + output = "techage:heatexchanger1", + recipe = { + {"default:tin_ingot", "techage:electric_cableS", "default:steel_ingot"}, + {"techage:ta4_pipeS", "basic_materials:gear_steel", "techage:ta4_pipeS"}, + {"", "techage:baborium_ingot", ""}, + }, +}) + diff --git a/energy_storage/heatexchanger2.lua b/energy_storage/heatexchanger2.lua new file mode 100644 index 0000000..a310ea3 --- /dev/null +++ b/energy_storage/heatexchanger2.lua @@ -0,0 +1,171 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2020 Joachim Stolberg + + GPL v3 + See LICENSE.txt for more information + + TA4 Heat Exchanger2 (middle part) + +]]-- + +-- for lazy programmers +local S2P = minetest.string_to_pos +local P2S = minetest.pos_to_string +local M = minetest.get_meta +local S = techage.S + +local power = techage.power + +local CYCLE_TIME = 2 + +local function he1_cmnd(pos, topic, payload) + return techage.transfer({x = pos.x, y = pos.y - 1, z = pos.z}, + nil, topic, payload, nil, + {"techage:heatexchanger1"}) +end + +local function formspec(self, pos, nvm) + local capa_max, capa, needed_max, needed = he1_cmnd(pos, "state") + local arrow = "image[2.5,1.5;1,1;techage_form_arrow_bg.png^[transformR90]" + if needed > 0 then + arrow = "image[2.5,1.5;1,1;techage_form_arrow_fg.png^[transformR90]" + end + return "size[6,4]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "box[0,-0.1;5.8,0.5;#c6e8ff]".. + "label[2,-0.1;"..minetest.colorize( "#000000", S("Heat Exchanger")).."]".. + power.formspec_label_bar(0, 0.8, S("Thermal"), capa_max, capa, "").. + power.formspec_label_bar(3.5, 0.8, S("Input"), needed_max, needed).. + arrow.. + "image_button[2.5,3;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. + "tooltip[2.5,3;1,1;"..self:get_state_tooltip(nvm).."]" +end + +local function can_start(pos, nvm, state) + print("can_start", he1_cmnd(pos, "can_start")) + return he1_cmnd(pos, "can_start") or S("did you check the plan?") +end + +local function start_node(pos, nvm, state) + he1_cmnd(pos, "start") +end + +local function stop_node(pos, nvm, state) + he1_cmnd(pos, "stop") +end + +local function check_TES_integrity(pos, nvm) + nvm.ticks = (nvm.ticks or 0) + 1 + if (nvm.ticks % 100) == 0 then -- not to often + return he1_cmnd(pos, "integrity", "singleplayer") + end + return true +end + +local State = techage.NodeStates:new({ + node_name_passive = "techage:heatexchanger2", + cycle_time = CYCLE_TIME, + infotext_name = S("TA4 Heat Exchanger"), + standby_ticks = 0, + can_start = can_start, + start_node = start_node, + stop_node = stop_node, + formspec_func = formspec, +}) + +local function node_timer(pos, elapsed) + print("node_timer") + local nvm = techage.get_nvm(pos) + local res = check_TES_integrity(pos, nvm) + if res ~= true then + State:fault(pos, nvm, res) + he1_cmnd(pos, "stop") + end + if techage.is_activeformspec(pos) then + M(pos):set_string("formspec", formspec(State, pos, nvm)) + return true + end + return false +end + +local function can_dig(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local nvm = techage.get_nvm(pos) + return not nvm.running +end + +local function on_rightclick(pos, node, clicker) + techage.set_activeformspec(pos, clicker) + local nvm = techage.get_nvm(pos) + M(pos):set_string("formspec", formspec(State, pos, nvm)) + minetest.get_node_timer(pos):start(CYCLE_TIME) +end + +local function after_place_node(pos, placer) + if techage.orientate_node(pos, "techage:heatexchanger1") then + return true + end + local nvm = techage.get_nvm(pos) + local own_num = techage.add_node(pos, "techage:heatexchanger2") + State:node_init(pos, nvm, own_num) + M(pos):set_string("formspec", formspec(State, pos, nvm)) + M(pos):set_string("infotext", S("TA4 Heat Exchanger").." "..own_num) +end + +local function on_receive_fields(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + + local nvm = techage.get_nvm(pos) + State:state_button_event(pos, nvm, fields) + M(pos):set_string("formspec", formspec(State, pos, nvm)) +end + +-- Middle node with the formspec from the bottom node +minetest.register_node("techage:heatexchanger2", { + description = S("TA4 Heat Exchanger 2"), + tiles = { + -- up, down, right, left, back, front + "techage_hole_ta4.png", + "techage_hole_ta4.png", + "techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_tes_turb.png", + "techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_tes_core.png", + "techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_ribsB.png", + "techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_ribsB.png", + }, + + selection_box = { + type = "fixed", + fixed = {-1/2, -1.5/2, -1/2, 1/2, 1/2, 1/2}, + }, + + on_receive_fields = on_receive_fields, + on_rightclick = on_rightclick, + on_timer = node_timer, + after_place_node = after_place_node, + can_dig = can_dig, + + paramtype2 = "facedir", + groups = {crumbly = 2, cracky = 2, snappy = 2}, + on_rotate = screwdriver.disallow, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_craft({ + output = "techage:heatexchanger2", + recipe = { + {"default:tin_ingot", "", "default:steel_ingot"}, + {"", "techage:ta4_wlanchip", ""}, + {"", "techage:baborium_ingot", ""}, + }, +}) diff --git a/energy_storage/heatexchanger3.lua b/energy_storage/heatexchanger3.lua new file mode 100644 index 0000000..af126b6 --- /dev/null +++ b/energy_storage/heatexchanger3.lua @@ -0,0 +1,84 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2020 Joachim Stolberg + + GPL v3 + See LICENSE.txt for more information + + TA4 Heat Exchanger3 (top part) + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local S = techage.S + +local Pipe = techage.LiquidPipe + +local function orientate_node(pos, name) + local node = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) + if node.name == name then + local param2 = node.param2 + node = minetest.get_node(pos) + node.param2 = param2 + minetest.swap_node(pos, node) + else + minetest.remove_node(pos) + return true + end +end + +local function after_place_node(pos) + if orientate_node(pos, "techage:heatexchanger2") then + return true + end + Pipe:after_place_node(pos) +end + +local function after_dig_node(pos, oldnode) + Pipe:after_dig_node(pos) +end + +minetest.register_node("techage:heatexchanger3", { + description = S("TA4 Heat Exchanger 3"), + tiles = { + -- up, down, right, left, back, front + "techage_filling_ta4.png^techage_frame_ta4_top.png", + "techage_hole_ta4.png", + "techage_filling_ta4.png^techage_frameT_ta4.png^techage_appl_hole_pipe.png", + "techage_filling_ta4.png^techage_frameT_ta4.png^techage_appl_hole_pipe.png", + "techage_filling_ta4.png^techage_frameT_ta4.png^techage_appl_ribsT.png", + "techage_filling_ta4.png^techage_frameT_ta4.png^techage_appl_ribsT.png", + }, + + after_place_node = after_place_node, + after_dig_node = after_dig_node, + + paramtype2 = "facedir", + groups = {crumbly = 2, cracky = 2, snappy = 2}, + on_rotate = screwdriver.disallow, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +Pipe:add_secondary_node_names({"techage:heatexchanger3"}) + +techage.register_node({"techage:heatexchanger3"}, { + on_transfer = function(pos, in_dir, topic, payload) + return true + end +}) + +minetest.register_craft({ + output = "techage:heatexchanger3", + recipe = { + {"default:tin_ingot", "dye:blue", "default:steel_ingot"}, + {"techage:ta4_pipeS", "basic_materials:gear_steel", "techage:ta4_pipeS"}, + {"", "techage:baborium_ingot", ""}, + }, +}) + +techage.orientate_node = orientate_node diff --git a/energy_storage/inlet.lua b/energy_storage/inlet.lua index c7ddcd4..88a06d7 100644 --- a/energy_storage/inlet.lua +++ b/energy_storage/inlet.lua @@ -21,6 +21,14 @@ local S = techage.S local Pipe = techage.LiquidPipe +local function after_place_node(pos, placer, itemstack) + Pipe:after_place_node(pos) +end + +local function after_dig_node(pos, oldnode, oldmetadata, digger) + Pipe:after_dig_node(pos) +end + minetest.register_node("techage:ta4_pipe_inlet", { description = S("TA4 Pipe Inlet"), tiles = { @@ -33,6 +41,9 @@ minetest.register_node("techage:ta4_pipe_inlet", { "basic_materials_concrete_block.png^techage_tes_inlet.png", }, + after_place_node = after_place_node, + after_dig_node = after_dig_node, + paramtype2 = "facedir", -- important! on_rotate = screwdriver.disallow, -- important! groups = {crumbly = 2, cracky = 2, snappy = 2}, @@ -40,11 +51,7 @@ minetest.register_node("techage:ta4_pipe_inlet", { sounds = default.node_sound_metal_defaults(), }) --- for mechanical pipe connections -techage.power.register_node({"techage:ta4_pipe_inlet"}, { - conn_sides = {"F", "B"}, - power_network = Pipe, -}) +Pipe:add_secondary_node_names({"techage:ta4_pipe_inlet"}) local Numbers = { shell = { @@ -63,6 +70,7 @@ local function chat(owner, text) if owner ~= nil then minetest.chat_send_player(owner, string.char(0x1b).."(c@#ff0000)".."[Techage] Error: "..text.."!") end + return text end local function get_radius(pos, in_dir) @@ -91,18 +99,14 @@ local function check_volume(pos, in_dir, owner) "basic_materials:concrete_block", "default:obsidian_glass", "techage:glow_gravel"}) if node_tbl["default:obsidian_glass"] > 1 then - chat(owner, "one window maximum") - return false + return chat(owner, "one window maximum") elseif node_tbl["default:obsidian_glass"] + node_tbl["basic_materials:concrete_block"] ~= Numbers.shell[radius] then - chat(owner, "wrong number of shell nodes") - return false + return chat(owner, "wrong number of shell nodes") elseif node_tbl["default:gravel"] + node_tbl["techage:glow_gravel"] ~= Numbers.filling[radius] then - chat(owner, "wrong number of gravel nodes") - return false + return chat(owner, "wrong number of gravel nodes") end else - chat(owner, "wrong diameter (should be 5, 7, or 9)") - return false + return chat(owner, "wrong diameter (should be 5, 7, or 9)") end return true end @@ -131,6 +135,8 @@ techage.register_node({"techage:ta4_pipe_inlet"}, { on_transfer = function(pos, in_dir, topic, payload) if topic == "diameter" then return get_radius(pos, in_dir) * 2 - 1 + elseif topic == "integrity" then + return check_volume(pos, in_dir, payload) elseif topic == "volume" then return check_volume(pos, in_dir, payload) elseif topic == "window" then diff --git a/energy_storage/turbine.lua b/energy_storage/turbine.lua index 2974f82..fae2e80 100644 --- a/energy_storage/turbine.lua +++ b/energy_storage/turbine.lua @@ -3,12 +3,12 @@ TechAge ======= - Copyright (C) 2019 Joachim Stolberg + Copyright (C) 2019-2020 Joachim Stolberg GPL v3 See LICENSE.txt for more information - TA4 Gas Turbine + TA4 TES Gas Turbine ]]-- @@ -16,10 +16,18 @@ local M = minetest.get_meta local S = techage.S -local CYCLE_TIME = 2 - local Pipe = techage.LiquidPipe +local function transfer_heatexchanger3(pos, topic, payload) + return techage.transfer(pos, 6, topic, payload, Pipe, + {"techage:heatexchanger3"}) +end + +local function transfer_generator(pos, topic, payload) + return techage.transfer(pos, "R", topic, payload, nil, + {"techage:ta4_generator", "techage:ta4_generator_on"}) +end + local function swap_node(pos, name) local node = techage.get_node_lvm(pos) if node.name == name then @@ -34,7 +42,7 @@ local function play_sound(pos) if not mem.handle or mem.handle == -1 then mem.handle = minetest.sound_play("techage_turbine", { pos = pos, - gain = 0.5, + gain = 0.4, max_hear_distance = 10, loop = true}) if mem.handle == -1 then @@ -51,29 +59,20 @@ local function stop_sound(pos) end end -local function generator_cmnd(pos, cmnd) - return techage.transfer( - pos, - "R", -- outdir - cmnd, -- topic - nil, -- payload - nil, -- network - {"techage:ta4_generator", "techage:ta4_generator_on"}) +local function after_place_node(pos) + Pipe:after_place_node(pos) end --- to detect the missing "steam pressure" -local function node_timer(pos, elapsed) - local nvm = techage.get_nvm(pos) - nvm.remote_trigger = (nvm.remote_trigger or 0) - 1 - if nvm.remote_trigger <= 0 then - swap_node(pos, "techage:ta4_turbine") - stop_sound(pos) - nvm.running = false - end - play_sound(pos) - return true +local function after_dig_node(pos, oldnode) + stop_sound(pos) + Pipe:after_dig_node(pos) + techage.del_mem(pos) end +local function tubelib2_on_update2(pos, outdir, tlib2, node) + swap_node(pos, "techage:ta4_turbine") + stop_sound(pos) +end minetest.register_node("techage:ta4_turbine", { description = S("TA4 Turbine"), @@ -86,7 +85,11 @@ minetest.register_node("techage:ta4_turbine", { "techage_filling_ta4.png^techage_appl_turbine.png^techage_frame_ta4.png", "techage_filling_ta4.png^techage_appl_turbine.png^techage_frame_ta4.png", }, - on_timer = node_timer, + + after_place_node = after_place_node, + after_dig_node = after_dig_node, + tubelib2_on_update2 = tubelib2_on_update2, + paramtype2 = "facedir", groups = {cracky=2, crumbly=2, choppy=2}, on_rotate = screwdriver.disallow, @@ -123,12 +126,8 @@ minetest.register_node("techage:ta4_turbine_on", { }, }, - on_rightclick = function(pos) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, + tubelib2_on_update2 = tubelib2_on_update2, - on_timer = node_timer, - drop = "", paramtype2 = "facedir", groups = {not_in_creative_inventory=1}, diggable = false, @@ -137,43 +136,45 @@ minetest.register_node("techage:ta4_turbine_on", { sounds = default.node_sound_wood_defaults(), }) --- for mechanical pipe connections -techage.power.register_node({"techage:ta4_turbine", "techage:ta4_turbine_on"}, { - conn_sides = {"L", "U"}, - power_network = Pipe, - after_place_node = function(pos, placer) - local nvm = techage.get_nvm(pos) - nvm.running = false - nvm.remote_trigger = 0 - end, -}) +Pipe:add_secondary_node_names({"techage:ta4_turbine", "techage:ta4_turbine_on"}) --- for logical communication techage.register_node({"techage:ta4_turbine", "techage:ta4_turbine_on"}, { on_transfer = function(pos, in_dir, topic, payload) local nvm = techage.get_nvm(pos) - if topic == "power" then - nvm.remote_trigger = 2 - return generator_cmnd(pos, topic) - elseif topic == "start" then - nvm.remote_trigger = 2 + if topic == "trigger" then -- used by heatexchanger1 + if not transfer_heatexchanger3(pos, topic, payload) then + return 0 + end + local power = transfer_generator(pos, topic, payload) + if not power or power <= 0 and nvm.running then + swap_node(pos, "techage:ta4_turbine") + stop_sound(pos) + nvm.running = false + return 0 + elseif power and power > 0 and not nvm.running then + swap_node(pos, "techage:ta4_turbine_on") + play_sound(pos) + nvm.running = true + end + return power + elseif topic == "start" then -- used by generator swap_node(pos, "techage:ta4_turbine_on") - nvm.running = true - minetest.get_node_timer(pos):start(CYCLE_TIME) play_sound(pos) - return generator_cmnd(pos, topic) - elseif topic == "stop" then + nvm.running = true + return true + elseif topic == "stop" then -- used by generator swap_node(pos, "techage:ta4_turbine") - nvm.running = false - nvm.remote_trigger = 0 - minetest.get_node_timer(pos):stop() stop_sound(pos) - return generator_cmnd(pos, topic) - elseif topic == "trigger" then - nvm.remote_trigger = 2 - return generator_cmnd(pos, topic) + nvm.running = false + return true end - end + end, + on_node_load = function(pos, node) + --print("on_node_load", node.name) + if node.name == "techage:ta4_turbine_on" then + play_sound(pos) + end + end, }) minetest.register_craft({ diff --git a/init.lua b/init.lua index 8b68d60..d934fdd 100644 --- a/init.lua +++ b/init.lua @@ -90,7 +90,6 @@ else -- Liquids I dofile(MP.."/liquids/liquid_pipe.lua") dofile(MP.."/liquids/node_api.lua") - --dofile(MP.."/liquids/liquid_lib.lua") -- Basic Machines dofile(MP.."/basic_machines/consumer.lua") -- consumer base model @@ -182,24 +181,26 @@ else --dofile(MP.."/.test/accu.lua") -- Solar --- dofile(MP.."/solar/minicell.lua") --- dofile(MP.."/solar/solarcell.lua") --- dofile(MP.."/solar/inverter.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.."/wind_turbine/pillar.lua") --- dofile(MP.."/wind_turbine/signallamp.lua") + dofile(MP.."/wind_turbine/rotor.lua") + dofile(MP.."/wind_turbine/pillar.lua") + dofile(MP.."/wind_turbine/signallamp.lua") -- -- TA4 Energy Storage --- dofile(MP.."/energy_storage/heatexchanger.lua") --- dofile(MP.."/energy_storage/generator.lua") --- dofile(MP.."/energy_storage/turbine.lua") --- dofile(MP.."/energy_storage/inlet.lua") --- dofile(MP.."/energy_storage/nodes.lua") + dofile(MP.."/energy_storage/heatexchanger3.lua") + dofile(MP.."/energy_storage/heatexchanger2.lua") + dofile(MP.."/energy_storage/heatexchanger1.lua") + dofile(MP.."/energy_storage/generator.lua") + dofile(MP.."/energy_storage/turbine.lua") + dofile(MP.."/energy_storage/inlet.lua") + dofile(MP.."/energy_storage/nodes.lua") -- -- Chemistry --- dofile(MP.."/chemistry/ta4_reactor.lua") + dofile(MP.."/chemistry/ta4_reactor.lua") -- dofile(MP.."/chemistry/ta4_stand.lua") -- dofile(MP.."/chemistry/ta4_doser.lua") diff --git a/liquids/filler.lua b/liquids/filler.lua index cde0e87..27d427f 100644 --- a/liquids/filler.lua +++ b/liquids/filler.lua @@ -70,7 +70,6 @@ local function on_rightclick(pos, node, clicker) end local function node_timer(pos, elapsed) - print("node_timer") local inv = M(pos):get_inventory() if not inv:is_empty("src") then local taken = techage.get_items(inv, "src", 1) diff --git a/oil/drillbox.lua b/oil/drillbox.lua index 5966e5b..69691c1 100644 --- a/oil/drillbox.lua +++ b/oil/drillbox.lua @@ -122,7 +122,6 @@ local function on_node_state_change(pos, old_state, new_state) end local function drilling(pos, crd, nvm, inv) - print("drilling") M(pos):set_string("formspec", formspec(CRD(pos).State, pos, nvm)) nvm.drill_pos = nvm.drill_pos or {x=pos.x, y=pos.y-1, z=pos.z} local owner = M(pos):get_string("owner") diff --git a/power/distribution.lua b/power/distribution.lua index ada3416..d777980 100644 --- a/power/distribution.lua +++ b/power/distribution.lua @@ -56,7 +56,7 @@ local function get_generator_sum(tbl, tlib_type) if def and def["gstate"] ~= STOPPED then def["galive"] = (def["galive"] or 1) - 1 if def["galive"] > 0 then - sum = sum + v.nominal + sum = sum + (def.curr_power or v.nominal) end end end @@ -82,7 +82,11 @@ local function set_given(pos, given, tlib_type) local nvm = techage.get_nvm(pos) local def = nvm[tlib_type] -- power related network data if (def and def["galive"] or 0) > 0 then - def["given"] = given + if def.curr_power and def.curr_power < given then + def["given"] = def.curr_power + else + def["given"] = given + end return given end return 0 diff --git a/power/formspecs.lua b/power/formspecs.lua index edc29bb..2270747 100644 --- a/power/formspecs.lua +++ b/power/formspecs.lua @@ -48,9 +48,11 @@ function techage.power.formspec_power_bar(max_power, current_power) return "techage_form_level_bg.png^[lowpart:"..percent..":techage_form_level_fg.png" end -function techage.power.formspec_label_bar(x, y, label, max_power, current_power) +function techage.power.formspec_label_bar(x, y, label, max_power, current_power, unit) local percent, ypos current_power = current_power or 0 + max_power = max_power or 1 + unit = unit or "ku" if current_power == 0 then percent = 0 ypos = 2.8 @@ -64,11 +66,11 @@ function techage.power.formspec_label_bar(x, y, label, max_power, current_power) return "container["..x..","..y.."]".. "box[0,0;2.3,3.3;#395c74]".. "label[0.2,0;"..label.."]".. - "label[0.7,0.4;"..max_power.." ku]".. + "label[0.7,0.4;"..max_power.." "..unit.."]".. "image[0,0.5;1,3;".. "techage_form_level_bg.png^[lowpart:"..percent.. ":techage_form_level_fg.png]".. - "label[0.7,"..ypos..";"..current_power.." ku]".. + "label[0.7,"..ypos..";"..current_power.." "..unit.."]".. "container_end[]" end diff --git a/power/node_api.lua b/power/node_api.lua index 85a8eb5..009b9fe 100644 --- a/power/node_api.lua +++ b/power/node_api.lua @@ -98,6 +98,31 @@ function techage.power.update_network(pos, outdir, Cable) delete_netID(pos, outdir, Cable) -- network walk to delete all IDs end +-- +-- Read the current power value from all connected devices (used for solar cells) +-- Only used by the solar inverter to collect the power of all solar cells. +-- Only one inverter per network is allowed. Therefore, we have to check, +-- if additional inverters are in the network. +-- Function returns in addition the number of found inverters. +function techage.power.get_power(pos, outdir, Cable, inverter) + local sum = 0 + local num_inverter = 0 + networks.connection_walk(pos, outdir, Cable, function(pos, indir, node) + techage.mark_position("singleplayer", pos, "get_power", "", 2)----------------------------------------- + local def = net_def(pos, Cable.tube_type) + if def and def.on_getpower then + sum = sum + def.on_getpower(pos) + else + local node = techage.get_node_lvm(pos) + if node.name == inverter then + num_inverter = num_inverter + 1 + end + end + end) + return sum, num_inverter +end + + -- -- Consumer related functions @@ -154,13 +179,15 @@ end -- -- Generator related functions -- -function techage.power.generator_start(pos, Cable, cycle_time, outdir) +-- curr_power is optional, only needed for generators with variable output power +function techage.power.generator_start(pos, Cable, cycle_time, outdir, curr_power) local nvm = techage.get_nvm(pos) local tlib_type = Cable.tube_type nvm[tlib_type] = nvm[tlib_type] or {} nvm[tlib_type]["galive"] = (cycle_time / 2) + 2 nvm[tlib_type]["gstate"] = RUNNING nvm[tlib_type]["given"] = 0 + nvm[tlib_type]["curr_power"] = curr_power trigger_network(pos, outdir, Cable) end @@ -173,12 +200,14 @@ function techage.power.generator_stop(pos, Cable, outdir) nvm[tlib_type]["given"] = 0 end -function techage.power.generator_alive(pos, Cable, cycle_time, outdir) +-- curr_power is optional, only needed for generators with variable output power +function techage.power.generator_alive(pos, Cable, cycle_time, outdir, curr_power) local nvm = techage.get_nvm(pos) local def = nvm[Cable.tube_type] -- power related network data if def then trigger_network(pos, outdir, Cable) def["galive"] = (cycle_time / 2) + 2 + def["curr_power"] = curr_power return def["given"] or 0 end return 0 diff --git a/power/power_terminal.lua b/power/power_terminal.lua index 2059302..d077281 100644 --- a/power/power_terminal.lua +++ b/power/power_terminal.lua @@ -38,10 +38,10 @@ local function generator_data(gen_tbl) tbl.pow_all = tbl.pow_all + (gen.nominal or 0) if nvm.ele1 and nvm.ele1.gstate and nvm.ele1.gstate ~= STOPPED then tbl.num_on = tbl.num_on + 1 - tbl.pow_on = tbl.pow_on + (gen.nominal or 0) + tbl.pow_on = tbl.pow_on + (nvm.ele1.curr_power or gen.nominal or 0) if (nvm.ele1.galive or 0) > 0 then tbl.num_act = tbl.num_act + 1 - tbl.pow_act = tbl.pow_act + (gen.nominal or 0) + tbl.pow_act = tbl.pow_act + (nvm.ele1.curr_power or gen.nominal or 0) if (nvm.ele1.given or 0) > 0 then tbl.num_used = tbl.num_used + 1 tbl.pow_used = tbl.pow_used + (nvm.ele1.given or 0) diff --git a/solar/inverter.lua b/solar/inverter.lua index a4a01c0..5f3e60d 100644 --- a/solar/inverter.lua +++ b/solar/inverter.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019 Joachim Stolberg + Copyright (C) 2019-2020 Joachim Stolberg GPL v3 See LICENSE.txt for more information @@ -18,18 +18,18 @@ local S = techage.S local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end local S2P = minetest.string_to_pos -local Power = techage.ElectricCable +local Cable = techage.ElectricCable local Solar = techage.TA4_Cable local power = techage.power +local networks = techage.networks local CYCLE_TIME = 2 local PWR_PERF = 100 local function determine_power(pos, nvm) -- determine DC node position - local dir = M(pos):get_int("left_dir") - local pos1 = techage.get_pos(pos, dir) - local max_power, num_inverter = power.get_power(pos1, "techage:ta4_solar_inverterDC") + local outdir = M(pos):get_int("leftdir") + local max_power, num_inverter = power.get_power(pos, outdir, Solar, "techage:ta4_solar_inverter") if num_inverter == 1 then nvm.max_power = math.min(PWR_PERF, max_power) else @@ -43,13 +43,11 @@ local function determine_power_from_time_to_time(pos, nvm) if time < 6.00/24.00 or time > 18.00/24.00 then nvm.ticks = 0 nvm.max_power = 0 - power.generator_update(pos, nvm, nvm.max_power) return end nvm.ticks = nvm.ticks or 0 if (nvm.ticks % 10) == 0 then -- calculate max_power not to often determine_power(pos, nvm) - power.generator_update(pos, nvm, nvm.max_power) else nvm.max_power = nvm.max_power or 0 end @@ -57,23 +55,23 @@ local function determine_power_from_time_to_time(pos, nvm) end local function formspec(self, pos, nvm) - determine_power(pos, nvm) local max_power = nvm.max_power or 0 local delivered = nvm.delivered or 0 - local bar_in = techage.power.formspec_power_bar(max_power, max_power) - local bar_out = techage.power.formspec_power_bar(max_power, delivered) - return "size[5,3]".. + local arrow = "image[2.5,1.5;1,1;techage_form_arrow_bg.png^[transformR270]" + if nvm.running then + arrow = "image[2.5,1.5;1,1;techage_form_arrow_fg.png^[transformR270]" + end + return "size[6,4]".. default.gui_bg.. default.gui_bg_img.. default.gui_slots.. - "label[0.2,0;DC]".. - "image[0,0.5;1,2;"..bar_in.."]".. - "label[0,2.5;"..max_power.." ku]".. - "button[1.1,1;1.8,1;update;"..S("Update").."]".. - "image_button[3,1;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. - "label[4.2,0;AC]".. - "image[4,0.5;1,2;"..bar_out.."]".. - "label[4,2.5;"..delivered.." ku]" + "box[0,-0.1;5.8,0.5;#c6e8ff]".. + "label[2.5,-0.1;"..minetest.colorize( "#000000", S("Inverter")).."]".. + power.formspec_label_bar(0, 0.8, S("Power DC"), PWR_PERF, max_power).. + power.formspec_label_bar(3.5, 0.8, S("Power AC"), PWR_PERF, delivered).. + arrow.. + "image_button[2.5,3;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. + "tooltip[2.5,3;1,1;"..self:get_state_tooltip(nvm).."]" end local function can_start(pos, nvm, state) @@ -87,13 +85,15 @@ local function start_node(pos, nvm, state) nvm.running = true nvm.delivered = 0 nvm.ticks = 0 - power.generator_start(pos, nvm, nvm.max_power) + local outdir = M(pos):get_int("outdir") + power.generator_start(pos, Cable, CYCLE_TIME, outdir, nvm.max_power) end local function stop_node(pos, nvm, state) nvm.running = false nvm.delivered = 0 - power.generator_stop(pos, nvm) + local outdir = M(pos):get_int("outdir") + power.generator_stop(pos, Cable, outdir) end local State = techage.NodeStates:new({ @@ -109,15 +109,17 @@ local State = techage.NodeStates:new({ local function node_timer(pos, elapsed) local nvm = techage.get_nvm(pos) - if nvm.running then - determine_power(pos, nvm) - if nvm.max_power > 0 then - nvm.delivered = power.generator_alive(pos, nvm) - else - nvm.delivered = 0 - end + determine_power_from_time_to_time(pos, nvm) + --if nvm.max_power > 0 then + local outdir = M(pos):get_int("outdir") + nvm.delivered = power.generator_alive(pos, Cable, CYCLE_TIME, outdir, nvm.max_power) + --else + --nvm.delivered = 0 + --end + if techage.is_activeformspec(pos) then + M(pos):set_string("formspec", formspec(State, pos, nvm)) end - return nvm.running + return true end local function on_receive_fields(pos, formname, fields, player) @@ -132,19 +134,25 @@ local function on_receive_fields(pos, formname, fields, player) end end -local function on_rightclick(pos) +local function on_rightclick(pos, node, clicker) local nvm = techage.get_nvm(pos) + determine_power(pos, nvm) + techage.set_activeformspec(pos, clicker) M(pos):set_string("formspec", formspec(State, pos, nvm)) end +local function tubelib2_on_update2(pos, outdir, tlib2, node) + power.update_network(pos, outdir, tlib2) +end + minetest.register_node("techage:ta4_solar_inverter", { - description = S("TA4 Solar Inverter AC"), + description = S("TA4 Solar Inverter"), tiles = { -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png", + "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_arrow.png", "techage_filling_ta4.png^techage_frame_ta4.png", "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_electric.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_open.png", + "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_ta4_cable.png", "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_inverter.png", "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_inverter.png", }, @@ -153,46 +161,75 @@ minetest.register_node("techage:ta4_solar_inverter", { on_rotate = screwdriver.disallow, is_ground_content = false, + after_place_node = function(pos) + local nvm = techage.get_nvm(pos) + M(pos):set_int("outdir", networks.side_to_outdir(pos, "R")) + M(pos):set_int("leftdir", networks.side_to_outdir(pos, "L")) + Cable:after_place_node(pos) + Solar:after_place_node(pos) + local number = techage.add_node(pos, "techage:ta4_solar_inverter") + State:node_init(pos, nvm, number) + M(pos):set_string("formspec", formspec(State, pos, nvm)) + end, + + after_dig_node = function(pos, oldnode) + Cable:after_dig_node(pos) + Solar:after_dig_node(pos) + techage.del_mem(pos) + end, + + tubelib2_on_update2 = tubelib2_on_update2, on_receive_fields = on_receive_fields, on_rightclick = on_rightclick, on_timer = node_timer, + networks = { + ele1 = { + sides = {R = 1}, + ntype = "gen1", + nominal = PWR_PERF, + }, + ele2 = { + sides = {L = 1}, + ntype = "con1", + }, + } }) -minetest.register_node("techage:ta4_solar_inverterDC", { - description = S("TA4 Solar Inverter DC"), - 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_open.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_ta4_cable.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_inverterDC.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_inverterDC.png", - }, - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, -}) +--minetest.register_node("techage:ta4_solar_inverterDC", { +-- description = S("TA4 Solar Inverter DC"), +-- 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_open.png", +-- "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_ta4_cable.png", +-- "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_inverterDC.png", +-- "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_inverterDC.png", +-- }, + +-- after_place_node = function(pos) +-- Solar:after_place_node(pos) +-- end, + +-- after_dig_node = function(pos, oldnode) +-- Solar:after_dig_node(pos) +-- end, + +-- tubelib2_on_update2 = tubelib2_on_update2, +-- paramtype2 = "facedir", +-- groups = {cracky=2, crumbly=2, choppy=2}, +-- on_rotate = screwdriver.disallow, +-- is_ground_content = false, +-- networks = { +-- ele2 = { +-- sides = {L = 1}, +-- ntype = "con1", +-- }, +-- } +--}) -techage.power.register_node({"techage:ta4_solar_inverter"}, { - conn_sides = {"R"}, - power_network = Power, - after_place_node = function(pos, placer) - -- DC block direction - M(pos):set_int("left_dir", techage.power.side_to_outdir(pos, "L")) - local number = techage.add_node(pos, "techage:ta4_solar_inverter") - local nvm = techage.get_nvm(pos) - State:node_init(pos, nvm, number) - M(pos):set_string("formspec", formspec(State, pos, nvm)) - - end, -}) - -techage.power.register_node({"techage:ta4_solar_inverterDC"}, { - conn_sides = {"L"}, - power_network = Solar, -}) +Cable:add_secondary_node_names({"techage:ta4_solar_inverter"}) +Solar:add_secondary_node_names({"techage:ta4_solar_inverter"}) techage.register_node({"techage:ta4_solar_inverter"}, { on_recv_message = function(pos, src, topic, payload) @@ -212,11 +249,11 @@ minetest.register_craft({ }, }) -minetest.register_craft({ - output = "techage:ta4_solar_inverterDC", - recipe = { - {'default:steel_ingot', 'dye:green', 'default:steel_ingot'}, - {'techage:ta4_power_cableS', '', ''}, - {'default:steel_ingot', "techage:baborium_ingot", 'default:steel_ingot'}, - }, -}) +--minetest.register_craft({ +-- output = "techage:ta4_solar_inverterDC", +-- recipe = { +-- {'default:steel_ingot', 'dye:green', 'default:steel_ingot'}, +-- {'techage:ta4_power_cableS', '', ''}, +-- {'default:steel_ingot', "techage:baborium_ingot", 'default:steel_ingot'}, +-- }, +--}) diff --git a/solar/minicell.lua b/solar/minicell.lua index 4aa3dae..9f1b46c 100644 --- a/solar/minicell.lua +++ b/solar/minicell.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019 Joachim Stolberg + Copyright (C) 2019-2020 Joachim Stolberg GPL v3 See LICENSE.txt for more information @@ -38,7 +38,7 @@ local function node_timer(pos, elapsed) if light >= (minetest.LIGHT_MAX - 1) then if nvm.providing then - power.generator_stop(pos, nvm) + power.generator_stop(pos, Cable, 5) nvm.providing = false nvm.provided = 0 end @@ -46,13 +46,14 @@ local function node_timer(pos, elapsed) else if nvm.capa > 0 then if not nvm.providing then - power.generator_start(pos, nvm, PWR_PERF) + power.generator_start(pos, Cable, CYCLE_TIME, 5) nvm.providing = true + else + nvm.provided = power.generator_alive(pos, Cable, CYCLE_TIME, 5) + nvm.capa = nvm.capa - nvm.provided end - nvm.provided = power.generator_alive(pos, nvm) - nvm.capa = nvm.capa - nvm.provided else - power.generator_stop(pos, nvm) + power.generator_stop(pos, Cable, 5) nvm.providing = false nvm.provided = 0 nvm.capa = 0 @@ -61,6 +62,36 @@ local function node_timer(pos, elapsed) return true end +local function after_place_node(pos) + local meta = M(pos) + local number = techage.add_node(pos, "techage:ta4_solar_minicell") + meta:set_string("node_number", number) + meta:set_string("infotext", S("TA4 Streetlamp Solar Cell").." "..number) + local nvm = techage.get_nvm(pos) + nvm.capa = 0 + nvm.providing = false + minetest.get_node_timer(pos):start(CYCLE_TIME) + Cable:after_place_node(pos) +end + +local function after_dig_node(pos, oldnode) + Cable:after_dig_node(pos) + techage.remove_node(pos) + techage.del_mem(pos) +end + +local function tubelib2_on_update2(pos, outdir, tlib2, node) + power.update_network(pos, outdir, tlib2) +end + +local net_def = { + ele1 = { + sides = {D = 1}, + ntype = "gen1", + nominal = PWR_CAPA, + }, +} + minetest.register_node("techage:ta4_solar_minicell", { description = S("TA4 Streetlamp Solar Cell"), tiles = { @@ -80,28 +111,14 @@ minetest.register_node("techage:ta4_solar_minicell", { paramtype2 = "facedir", groups = {cracky=2, crumbly=2, choppy=2}, is_ground_content = false, + + after_place_node = after_place_node, + after_dig_node = after_dig_node, on_timer = node_timer, + tubelib2_on_update2 = tubelib2_on_update2, }) -techage.power.register_node({"techage:ta4_solar_minicell"}, { - power_network = Cable, - conn_sides = {"D"}, - after_place_node = function(pos) - local meta = minetest.get_meta(pos) - local number = techage.add_node(pos, "techage:ta4_solar_minicell") - meta:set_string("node_number", number) - meta:set_string("infotext", S("TA4 Streetlamp Solar Cell").." "..number) - local nvm = techage.get_nvm(pos) - nvm.capa = 0 - nvm.providing = false - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, - - after_dig_node = function(pos) - techage.remove_node(pos) - techage.del_mem(pos) - end, -}) +Cable:add_secondary_node_names({"techage:ta4_solar_minicell"}) techage.register_node({"techage:ta4_solar_minicell"}, { on_recv_message = function(pos, src, topic, payload) @@ -119,12 +136,7 @@ techage.register_node({"techage:ta4_solar_minicell"}, { end end, on_node_load = function(pos) - local meta = M(pos) - local number = meta:get_string("number") or "" - if number ~= "" then - meta:set_string("node_number", number) - meta:set_string("number", nil) - end + minetest.get_node_timer(pos):start(CYCLE_TIME) end, }) diff --git a/solar/solarcell.lua b/solar/solarcell.lua index 820ad95..22cd018 100644 --- a/solar/solarcell.lua +++ b/solar/solarcell.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019 Joachim Stolberg + Copyright (C) 2019-2020 Joachim Stolberg GPL v3 See LICENSE.txt for more information @@ -32,8 +32,7 @@ end -- return the required param2 for solar modules local function get_param2(pos, side) - local node = techage.get_node_lvm(pos) - local dir = power.side_to_dir(node.param2, side) + local dir = techage.networks.side_to_outdir(pos, side) return (dir + 1) % 4 end @@ -62,7 +61,7 @@ local function is_solar_module(base_pos, pos, side) end -- provide the available power, which is temperature dependent -local function on_getpower1(pos, mem) +local function on_getpower1(pos) local pos1 = {x = pos.x, y = pos.y, z = pos.z} if is_solar_module(pos, pos1, "L") and is_solar_module(pos, pos1, "R") then return PWR_PERF * M(pos):get_int("temperature") / 100.0 @@ -70,7 +69,7 @@ local function on_getpower1(pos, mem) return 0 end -local function on_getpower2(pos, mem) +local function on_getpower2(pos) local pos1 = {x = pos.x, y = pos.y+1, z = pos.z} if is_solar_module(pos, pos1, "L") and is_solar_module(pos, pos1, "R") then return PWR_PERF * M(pos):get_int("temperature") / 100.0 @@ -78,6 +77,36 @@ local function on_getpower2(pos, mem) return 0 end +local function after_place_node(pos) + M(pos):set_int("temperature", temperature(pos)) + M(pos):set_int("left_param2", get_param2(pos, "L")) + M(pos):set_int("right_param2", get_param2(pos, "R")) + Cable:after_place_node(pos) +end + +local function after_dig_node(pos, oldnode) + Cable:after_dig_node(pos) +end + +local function tubelib2_on_update2(pos, outdir, tlib2, node) + power.update_network(pos, outdir, tlib2) +end + +local net_def1 = { + ele2 = { + sides = {F=1, B=1}, + ntype = "junc", + on_getpower = on_getpower1, + }, +} + +local net_def2 = { + ele2 = { + sides = {F=1, B=1}, + ntype = "junc", + on_getpower = on_getpower2, + }, +} minetest.register_node("techage:ta4_solar_module", { description = S("TA4 Solar Module"), @@ -130,6 +159,17 @@ minetest.register_node("techage:ta4_solar_carrier", { {-3/8, 5/16, -1/2, 3/8, 7/16, 1/2}, }, }, + after_place_node = function(pos) + M(pos):set_int("temperature", temperature(pos)) + M(pos):set_int("left_param2", get_param2(pos, "L")) + M(pos):set_int("right_param2", get_param2(pos, "R")) + end, + + after_place_node = after_place_node, + after_dig_node = after_dig_node, + tubelib2_on_update2 = tubelib2_on_update2, + networks = net_def1, + paramtype = "light", paramtype2 = "facedir", on_rotate = screwdriver.disallow, @@ -156,6 +196,18 @@ minetest.register_node("techage:ta4_solar_carrierB", { {-1/8, -6/16, -1/2, 1/8, 8/16, 1/2}, }, }, + after_place_node = function(pos) + M(pos):set_int("temperature", temperature(pos)) + M(pos):set_int("left_param2", get_param2(pos, "L")) + M(pos):set_int("right_param2", get_param2(pos, "R")) + Cable:after_place_node(pos) + end, + + after_place_node = after_place_node, + after_dig_node = after_dig_node, + tubelib2_on_update2 = tubelib2_on_update2, + networks = net_def2, + paramtype = "light", paramtype2 = "facedir", on_rotate = screwdriver.disallow, @@ -189,27 +241,8 @@ minetest.register_node("techage:ta4_solar_carrierT", { is_ground_content = false, }) -techage.power.register_node({"techage:ta4_solar_carrier"}, { - power_network = Cable, - on_getpower = on_getpower1, - conn_sides ={"F", "B"}, - after_place_node = function(pos) - M(pos):set_int("temperature", temperature(pos)) - M(pos):set_int("left_param2", get_param2(pos, "L")) - M(pos):set_int("right_param2", get_param2(pos, "R")) - end, -}) +Cable:add_secondary_node_names({"techage:ta4_solar_carrier", "techage:ta4_solar_carrierB"}) -techage.power.register_node({"techage:ta4_solar_carrierB"}, { - power_network = Cable, - on_getpower = on_getpower2, - conn_sides ={"F", "B"}, - after_place_node = function(pos) - M(pos):set_int("temperature", temperature(pos)) - M(pos):set_int("left_param2", get_param2(pos, "L")) - M(pos):set_int("right_param2", get_param2(pos, "R")) - end, -}) minetest.register_craft({ output = "techage:ta4_solar_module", diff --git a/wind_turbine/pillar.lua b/wind_turbine/pillar.lua index 72cca96..7656bde 100644 --- a/wind_turbine/pillar.lua +++ b/wind_turbine/pillar.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019 Joachim Stolberg + Copyright (C) 2019-2020 Joachim Stolberg GPL v3 See LICENSE.txt for more information @@ -31,8 +31,6 @@ minetest.register_node("techage:pillar", { sounds = default.node_sound_stone_defaults(), }) - - minetest.register_craft({ type = "shapeless", output = "techage:pillar", diff --git a/wind_turbine/rotor.lua b/wind_turbine/rotor.lua index bb75469..6e5f783 100644 --- a/wind_turbine/rotor.lua +++ b/wind_turbine/rotor.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019 DS-Minetest, Joachim Stolberg + Copyright (C) 2019-2020 DS-Minetest, Joachim Stolberg GPL v3 See LICENSE.txt for more information @@ -119,7 +119,7 @@ local function start_rotor(pos, nvm) nvm.providing = true nvm.delivered = 0 - power.generator_start(pos, nvm, PWR_PERF) + power.generator_start(pos, Cable, CYCLE_TIME, 5) local hash = minetest.hash_node_position(pos) if Rotors[hash] then Rotors[hash]:set_animation_frame_speed(50) @@ -129,7 +129,7 @@ end local function stop_rotor(pos, nvm) nvm.providing = false nvm.delivered = 0 - power.generator_stop(pos, nvm) + power.generator_stop(pos, Cable, 5) local hash = minetest.hash_node_position(pos) if Rotors[hash] then Rotors[hash]:set_animation_frame_speed(0) @@ -153,12 +153,39 @@ local function node_timer(pos, elapsed) stop_rotor(pos, nvm) end end - if nvm.providing then - nvm.delivered = power.generator_alive(pos, nvm) - end + nvm.delivered = power.generator_alive(pos, Cable, CYCLE_TIME, 5, (nvm.providing and PWR_PERF) or 0) return true end +local function after_place_node(pos, placer) + local meta = M(pos) + local nvm = techage.get_nvm(pos) + local own_num = techage.add_node(pos, "techage:ta4_wind_turbine") + meta:set_string("node_number", own_num) + meta:set_string("owner", placer:get_player_name()) + meta:set_string("infotext", S("TA4 Wind Turbine").." "..own_num) + nvm.providing = false + nvm.running = true + add_rotor(pos, nvm, placer:get_player_name()) + minetest.get_node_timer(pos):start(CYCLE_TIME) + Cable:after_place_node(pos) +end + +local function after_dig_node(pos, oldnode) + local hash = minetest.hash_node_position(pos) + if Rotors[hash] and Rotors[hash]:get_luaentity() then + Rotors[hash]:remove() + end + Rotors[hash] = nil + Cable:after_dig_node(pos) + techage.remove_node(pos) + techage.del_mem(pos) +end + +local function tubelib2_on_update2(pos, outdir, tlib2, node) + power.update_network(pos, outdir, tlib2) +end + minetest.register_node("techage:ta4_wind_turbine", { description = S("TA4 Wind Turbine"), inventory_image = "techage_wind_turbine_inv.png", @@ -172,6 +199,16 @@ minetest.register_node("techage:ta4_wind_turbine", { "techage_rotor.png^techage_appl_open.png", }, + networks = { + ele1 = { + sides = {D = 1}, + ntype = "gen1", + nominal = PWR_PERF, + }, + }, + after_place_node = after_place_node, + after_dig_node = after_dig_node, + tubelib2_on_update2 = tubelib2_on_update2, on_timer = node_timer, paramtype2 = "facedir", groups = {cracky=2, crumbly=2, choppy=2}, @@ -207,32 +244,7 @@ minetest.register_entity("techage:rotor_ent", {initial_properties = { static_save = false, }}) -techage.power.register_node({"techage:ta4_wind_turbine"}, { - power_network = Cable, - conn_sides = {"D"}, - after_place_node = function(pos, placer) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - local own_num = techage.add_node(pos, "techage:ta4_wind_turbine") - meta:set_string("node_number", own_num) - meta:set_string("owner", placer:get_player_name()) - meta:set_string("infotext", S("TA4 Wind Turbine").." "..own_num) - nvm.providing = false - nvm.running = true - add_rotor(pos, nvm, placer:get_player_name()) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, - - after_dig_node = function(pos) - local hash = minetest.hash_node_position(pos) - if Rotors[hash] and Rotors[hash]:get_luaentity() then - Rotors[hash]:remove() - end - Rotors[hash] = nil - techage.remove_node(pos) - techage.del_mem(pos) - end, -}) +Cable:add_secondary_node_names({"techage:ta4_wind_turbine"}) techage.register_node({"techage:ta4_wind_turbine"}, { on_recv_message = function(pos, src, topic, payload)