From 14bc0b19cb3692f0e65cf18bb0dfad17fb3415fe Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Sat, 5 Oct 2019 19:19:18 +0200 Subject: [PATCH] bugfixes for solar inverter and energy storage power distribution changed solar inverter in two nodes divided manuals revised --- .test/akku.lua | 20 +++--- .test/sink.lua | 11 ++-- .test/source.lua | 9 ++- basic_machines/source.lua | 48 +++++--------- basis/consumer.lua | 27 +++++++- coal_power_station/akkubox.lua | 35 ++++------ coal_power_station/boiler_top.lua | 19 +++--- coal_power_station/cooler.lua | 9 +-- coal_power_station/generator.lua | 19 ++---- coal_power_station/power_terminal.lua | 91 +++++++++++++++++++------- coal_power_station/turbine.lua | 20 ++---- doc/manual_DE.lua | 16 ++--- doc/plans.lua | 23 ++++++- energy_storage/generator.lua | 13 ++-- energy_storage/heatexchanger.lua | 49 +++++++++----- energy_storage/inlet.lua | 4 +- energy_storage/turbine.lua | 11 ++-- furnace/booster.lua | 18 ++--- lamps/lib.lua | 8 +-- locale/techage.de.tr | 11 +++- locale/template.txt | 11 +++- manuals/api.md | 91 ++++++++++++-------------- manuals/manual_DE.md | 5 +- manuals/manual_ta3_DE.md | 4 +- manuals/manual_ta4_DE.md | 13 ++-- power/junction.lua | 5 +- power/power.lua | 62 +++++++++++++----- power/power2.lua | 65 +++++++----------- power/power_line.lua | 26 ++++---- solar/inverter.lua | 82 +++++++++++++---------- solar/minicell.lua | 33 +++++----- solar/solarcell.lua | 27 ++++---- steam_engine/boiler.lua | 19 +++--- steam_engine/cylinder.lua | 15 ++--- steam_engine/flywheel.lua | 15 ++--- steam_engine/gearbox.lua | 24 ++----- textures/techage_appl_ta4_cable.png | Bin 184 -> 248 bytes wind_turbine/rotor.lua | 53 +++++++-------- 38 files changed, 532 insertions(+), 479 deletions(-) diff --git a/.test/akku.lua b/.test/akku.lua index 80893d3..9537fc8 100644 --- a/.test/akku.lua +++ b/.test/akku.lua @@ -54,17 +54,6 @@ local function on_receive_fields(pos, formname, fields, player) end end -local function after_place_node(pos, placer) - -- secondary 'after_place_node', called by power. Don't use tubelib2.init_mem(pos)!!! - local mem = tubelib2.get_mem(pos) - mem.running = true - mem.capa = 0 - minetest.get_node_timer(pos):start(CYCLE_TIME) - power.secondary_start(pos, mem, PWR_PERF, PWR_PERF) - M(pos):set_string("formspec", formspec(pos, mem)) -end - - minetest.register_node("techage:akku", { description = "Akku", tiles = { @@ -79,11 +68,18 @@ minetest.register_node("techage:akku", { paramtype2 = "facedir", groups = {cracky=2, crumbly=2, choppy=2}, is_ground_content = false, - after_place_node = after_place_node, on_receive_fields = on_receive_fields, on_timer = node_timer, }) techage.power.register_node({"techage:akku"}, { power_network = Cable, + after_place_node = function(pos, placer) + local mem = tubelib2.init_mem(pos) + mem.running = true + mem.capa = 0 + minetest.get_node_timer(pos):start(CYCLE_TIME) + power.secondary_start(pos, mem, PWR_PERF, PWR_PERF) + M(pos):set_string("formspec", formspec(pos, mem)) + end, }) diff --git a/.test/sink.lua b/.test/sink.lua index 2f6c0d3..295ae00 100644 --- a/.test/sink.lua +++ b/.test/sink.lua @@ -60,12 +60,6 @@ minetest.register_node("techage:sink", { description = "Sink", tiles = {'techage_electric_button.png'}, - after_place_node = function(pos) - -- secondary 'after_place_node', called by power. Don't use tubelib2.init_mem(pos)!!! - local mem = tubelib2.get_mem(pos) - M(pos):set_string("infotext", "off") - end, - on_timer = node_timer, on_rightclick = on_rightclick, @@ -99,4 +93,9 @@ techage.power.register_node({"techage:sink", "techage:sink_on"}, { power_network = Cable, on_power = on_power, on_nopower = on_nopower, + after_place_node = function(pos) + local mem = tubelib2.init_mem(pos) + M(pos):set_string("infotext", "off") + end, + }) diff --git a/.test/source.lua b/.test/source.lua index aef2cd5..8f8c01a 100644 --- a/.test/source.lua +++ b/.test/source.lua @@ -45,11 +45,6 @@ minetest.register_node("techage:source", { 'techage_electric_button.png^techage_appl_electronic_fab.png', 'techage_electric_button.png^techage_appl_electronic_fab.png', }, - after_place_node = function(pos) - -- secondary 'after_place_node', called by power. Don't use tubelib2.init_mem(pos)!!! - local mem = tubelib2.get_mem(pos) - M(pos):set_string("infotext", "off") - end, paramtype2 = "facedir", groups = {cracky=2, crumbly=2, choppy=2}, @@ -60,4 +55,8 @@ minetest.register_node("techage:source", { techage.power.register_node({"techage:source"}, { power_network = Cable, + after_place_node = function(pos) + local mem = tubelib2.init_mem(pos) + M(pos):set_string("infotext", "off") + end, }) diff --git a/basic_machines/source.lua b/basic_machines/source.lua index eaeed2f..8c5095e 100644 --- a/basic_machines/source.lua +++ b/basic_machines/source.lua @@ -123,16 +123,6 @@ minetest.register_node("techage:t2_source", { groups = {cracky=2, crumbly=2, choppy=2}, on_rotate = screwdriver.disallow, is_ground_content = false, - - on_construct = tubelib2.init_mem, - after_place_node = function(pos, placer) - -- secondary 'after_place_node', called by power. Don't use tubelib2.init_mem(pos)!!! - local mem = tubelib2.get_mem(pos) - State2:node_init(pos, mem, "") - mem.state_num = 2 - on_rightclick(pos) - end, - on_receive_fields = on_receive_fields, on_rightclick = on_rightclick, on_timer = node_timer, @@ -153,16 +143,6 @@ minetest.register_node("techage:t3_source", { groups = {cracky=2, crumbly=2, choppy=2}, on_rotate = screwdriver.disallow, is_ground_content = false, - - on_construct = tubelib2.init_mem, - after_place_node = function(pos, placer) - -- secondary 'after_place_node', called by power. Don't use tubelib2.init_mem(pos)!!! - local mem = tubelib2.get_mem(pos) - State3:node_init(pos, mem, "") - mem.state_num = 3 - on_rightclick(pos) - end, - on_receive_fields = on_receive_fields, on_rightclick = on_rightclick, on_timer = node_timer, @@ -183,16 +163,6 @@ minetest.register_node("techage:t4_source", { groups = {cracky=2, crumbly=2, choppy=2}, on_rotate = screwdriver.disallow, is_ground_content = false, - - on_construct = tubelib2.init_mem, - after_place_node = function(pos, placer) - -- secondary 'after_place_node', called by power. Don't use tubelib2.init_mem(pos)!!! - local mem = tubelib2.get_mem(pos) - State4:node_init(pos, mem, "") - mem.state_num = 4 - on_rightclick(pos) - end, - on_receive_fields = on_receive_fields, on_rightclick = on_rightclick, on_timer = node_timer, @@ -201,14 +171,32 @@ minetest.register_node("techage:t4_source", { techage.power.register_node({"techage:t2_source"}, { conn_sides = {"R"}, power_network = TA2_Power, + after_place_node = function(pos, placer) + local mem = tubelib2.init_mem(pos) + State2:node_init(pos, mem, "") + mem.state_num = 2 + on_rightclick(pos) + end, }) techage.power.register_node({"techage:t3_source"}, { conn_sides = {"R"}, power_network = TA3_Power, + after_place_node = function(pos, placer) + local mem = tubelib2.init_mem(pos) + State3:node_init(pos, mem, "") + mem.state_num = 3 + on_rightclick(pos) + end, }) techage.power.register_node({"techage:t4_source"}, { conn_sides = {"R"}, power_network = TA4_Power, + after_place_node = function(pos, placer) + local mem = tubelib2.init_mem(pos) + State4:node_init(pos, mem, "") + mem.state_num = 4 + on_rightclick(pos) + end, }) diff --git a/basis/consumer.lua b/basis/consumer.lua index 78aacca..a44b7bd 100644 --- a/basis/consumer.lua +++ b/basis/consumer.lua @@ -161,8 +161,7 @@ function techage.register_consumer(base_name, inv_name, tiles, tNode, validState node_box = tNode.node_box, selection_box = tNode.selection_box, - on_construct = tubelib2.init_mem, - + -- will be overwritten in case, power is used after_place_node = function(pos, placer, itemstack, pointed_thing) local meta = M(pos) local mem = tubelib2.init_mem(pos) @@ -178,7 +177,7 @@ function techage.register_consumer(base_name, inv_name, tiles, tNode, validState end CRD(pos).State:node_init(pos, mem, number) end, - + -- will be overwritten in case, power is used after_dig_node = function(pos, oldnode, oldmetadata, digger) if tNode.after_dig_node then tNode.after_dig_node(pos, oldnode, oldmetadata, digger) @@ -240,6 +239,28 @@ function techage.register_consumer(base_name, inv_name, tiles, tNode, validState power_network = power_network, on_power = on_power, on_nopower = on_nopower, + after_place_node = function(pos, placer, itemstack, pointed_thing) + local meta = M(pos) + local mem = tubelib2.init_mem(pos) + local node = minetest.get_node(pos) + meta:set_int("push_dir", techage.side_to_indir("L", node.param2)) + meta:set_int("pull_dir", techage.side_to_indir("R", node.param2)) + local number = "-" + if stage > 2 then + number = techage.add_node(pos, name_pas) + end + if tNode.after_place_node then + tNode.after_place_node(pos, placer, itemstack, pointed_thing) + end + CRD(pos).State:node_init(pos, mem, number) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + if tNode.after_dig_node then + tNode.after_dig_node(pos, oldnode, oldmetadata, digger) + end + techage.remove_node(pos) + tubelib2.del_mem(pos) + end, }) end techage.register_node({name_pas, name_act}, tNode.tubing) diff --git a/coal_power_station/akkubox.lua b/coal_power_station/akkubox.lua index 1c77d95..64aef00 100644 --- a/coal_power_station/akkubox.lua +++ b/coal_power_station/akkubox.lua @@ -126,30 +126,9 @@ minetest.register_node("techage:ta3_akku", { "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_source.png", "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_source.png", }, - - on_construct = tubelib2.init_mem, - - after_place_node = function(pos, placer, itemstack) - local meta = M(pos) - -- secondary 'after_place_node', called by power. Don't use tubelib2.init_mem(pos)!!! - local mem = tubelib2.get_mem(pos) - local own_num = techage.add_node(pos, "techage:ta3_akku") - meta:set_string("owner", placer:get_player_name()) - meta:set_string("infotext", S("TA3 Akku Box").." "..own_num) - State:node_init(pos, mem, own_num) - mem.capa = get_capa(itemstack) - on_rightclick(pos) - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - local mem = tubelib2.get_mem(pos) - set_capa(pos, oldnode, digger, mem.capa) - end, - on_receive_fields = on_receive_fields, on_rightclick = on_rightclick, on_timer = node_timer, - drop = "", -- don't remove, item will be added via 'set_capa' paramtype2 = "facedir", groups = {cracky=2, crumbly=2, choppy=2}, @@ -161,6 +140,20 @@ minetest.register_node("techage:ta3_akku", { techage.power.register_node({"techage:ta3_akku"}, { conn_sides = {"R"}, power_network = Power, + after_place_node = function(pos, placer, itemstack) + local meta = M(pos) + local mem = tubelib2.init_mem(pos) + local own_num = techage.add_node(pos, "techage:ta3_akku") + meta:set_string("owner", placer:get_player_name()) + meta:set_string("infotext", S("TA3 Akku Box").." "..own_num) + State:node_init(pos, mem, own_num) + mem.capa = get_capa(itemstack) + on_rightclick(pos) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local mem = tubelib2.get_mem(pos) + set_capa(pos, oldnode, digger, mem.capa) + end, }) -- for logical communication diff --git a/coal_power_station/boiler_top.lua b/coal_power_station/boiler_top.lua index e8e6c36..405fc0f 100644 --- a/coal_power_station/boiler_top.lua +++ b/coal_power_station/boiler_top.lua @@ -238,22 +238,11 @@ minetest.register_node("techage:coalboiler_top", { on_rightclick = on_rightclick, on_construct = function(pos) - tubelib2.init_mem(pos) local inv = M(pos):get_inventory() inv:set_size('water', 1) inv:set_size('input', 1) end, - after_place_node = function(pos, placer) - -- secondary 'after_place_node', called by power. Don't use tubelib2.init_mem(pos)!!! - local mem = tubelib2.get_mem(pos) - State:node_init(pos, mem, "") - local node = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) - if node.name == "techage:coalboiler_base" then - on_rightclick(pos) - end - end, - on_metadata_inventory_put = function(pos) minetest.after(0.5, move_to_water, pos) end, @@ -268,6 +257,14 @@ minetest.register_node("techage:coalboiler_top", { techage.power.register_node({"techage:coalboiler_top"}, { conn_sides = {"F"}, power_network = Pipe, + after_place_node = function(pos, placer) + local mem = tubelib2.init_mem(pos) + State:node_init(pos, mem, "") + local node = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) + if node.name == "techage:coalboiler_base" then + on_rightclick(pos) + end + end, }) techage.register_node({"techage:coalboiler_top"}, { diff --git a/coal_power_station/cooler.lua b/coal_power_station/cooler.lua index f1d4fd5..862dbc0 100644 --- a/coal_power_station/cooler.lua +++ b/coal_power_station/cooler.lua @@ -32,11 +32,6 @@ local function swap_node(pos, name) minetest.swap_node(pos, node) end --- called with any pipe change -local function after_tube_update(node, pos, out_dir, peer_pos, peer_in_dir) - swap_node(pos, "techage:cooler") -end - minetest.register_node("techage:cooler", { description = S("TA3 Cooler"), tiles = { @@ -88,7 +83,6 @@ minetest.register_node("techage:cooler_on", { "techage_filling_ta3.png^techage_frame_ta3.png^techage_cooler.png", }, - after_tube_update = after_tube_update, paramtype2 = "facedir", groups = {not_in_creative_inventory=1}, diggable = false, @@ -101,6 +95,9 @@ minetest.register_node("techage:cooler_on", { techage.power.register_node({"techage:cooler", "techage:cooler_on"}, { conn_sides = {"L", "R"}, power_network = Pipe, + after_tube_update = function(node, pos, out_dir, peer_pos, peer_in_dir) + swap_node(pos, "techage:cooler") + end, }) -- for logical communication diff --git a/coal_power_station/generator.lua b/coal_power_station/generator.lua index 13e0a8e..4547b7e 100644 --- a/coal_power_station/generator.lua +++ b/coal_power_station/generator.lua @@ -111,21 +111,9 @@ minetest.register_node("techage:generator", { "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_generator.png", "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_generator.png^[transformFX]", }, - - on_construct = tubelib2.init_mem, - - after_place_node = function(pos, placer) - -- secondary 'after_place_node', called by power. Don't use tubelib2.init_mem(pos)!!! - local mem = tubelib2.get_mem(pos) - local number = techage.add_node(pos, "techage:generator") - State:node_init(pos, mem, number) - on_rightclick(pos) - end, - on_receive_fields = on_receive_fields, on_rightclick = on_rightclick, on_timer = node_timer, - paramtype2 = "facedir", groups = {cracky=2, crumbly=2, choppy=2}, on_rotate = screwdriver.disallow, @@ -166,7 +154,6 @@ minetest.register_node("techage:generator_on", { on_receive_fields = on_receive_fields, on_rightclick = on_rightclick, on_timer = node_timer, - drop = "", paramtype2 = "facedir", groups = {not_in_creative_inventory=1}, @@ -188,6 +175,12 @@ minetest.register_craft({ techage.power.register_node({"techage:generator", "techage:generator_on"}, { conn_sides = {"R"}, power_network = Cable, + after_place_node = function(pos, placer) + local mem = tubelib2.init_mem(pos) + local number = techage.add_node(pos, "techage:generator") + State:node_init(pos, mem, number) + on_rightclick(pos) + end, }) -- for logical communication diff --git a/coal_power_station/power_terminal.lua b/coal_power_station/power_terminal.lua index d989f42..51aa07b 100644 --- a/coal_power_station/power_terminal.lua +++ b/coal_power_station/power_terminal.lua @@ -28,35 +28,80 @@ local Param2ToDir = { [5] = 3, } +local function collect_network_data(pos, mem) + local data = { + fuel = {}, + wind = {}, + solar = {}, + akku = {}, + stor = {}, + } + local add = function(kind, attr, val) + data[kind][attr] = (data[kind][attr] or 0) + (val or 0) + end + local max = function(kind, attr, val) + data[kind][attr] = math.max((data[kind][attr] or 0), (val or 0)) + end + + local nnodes = techage.power.limited_connection_walk(pos, + function(pos, node, mem, num_hops, num_nodes) + if node.name == "techage:generator" or node.name == "techage:generator_on" then + add("fuel", "num", 1) + add("fuel", "nomi", mem.pwr_available) + add("fuel", "curr", mem.provided) + elseif node.name == "techage:ta3_akku" then + add("akku", "num", 1) + add("akku", "nomi", mem.pwr_available2) + add("akku", "curr", mem.delivered) + elseif node.name == "techage:heatexchanger1" then + add("stor", "num", 1) + add("stor", "nomi", mem.pwr_available2) + add("stor", "curr", mem.delivered) + elseif node.name == "techage:tiny_generator" or node.name == "techage:tiny_generator_on" then + add("fuel", "num", 1) + add("fuel", "nomi", mem.pwr_available) + add("fuel", "curr", mem.provided) + elseif node.name == "techage:ta4_solar_inverter" then + add("solar", "num", 1) + add("solar", "nomi", mem.pwr_available) + add("solar", "curr", mem.delivered) + elseif node.name == "techage:ta4_wind_turbine" then + add("wind", "num", 1) + add("wind", "nomi", mem.pwr_available) + add("wind", "curr", mem.delivered) + end + end + ) + return data, nnodes +end + local function formspec(pos) local jpos = minetest.deserialize(M(pos):get_string("junction_pos")) - local power = techage.power.power_accounting(jpos, tubelib2.get_mem(jpos)) - if power and power.prim_available then - local alarm = "" - if power.num_nodes > (techage.MAX_NUM_NODES - 50) then - alarm = " (max. "..(techage.MAX_NUM_NODES).." !!!)" - end - return "size[5,4]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "label[1.5,0.0;"..S("Network Data").."]".. - "label[0,0.8;"..S("Generators").." : "..power.prim_available.." ku]".. - "label[0,1.4;"..S("Akkus").." : "..power.sec_available.." ku]".. - "label[0,2.0;"..S("Machines").." : "..power.prim_needed.." ku]".. - "label[0,2.6;"..S("Number nodes").." : "..power.num_nodes..alarm.."]".. - "button[1.5,3.3;2,1;update;"..S("Update").."]" + local data, nnodes = collect_network_data(jpos, tubelib2.get_mem(jpos)) + local get = function(kind) + return (data[kind].num or 0).." / "..(data[kind].curr or 0).." ku / "..(data[kind].nomi or 0).. " ku" end - return "size[5,4]".. + local get = function(kind) + return (data[kind].num or 0).." / "..(data[kind].curr or 0).." ku / "..(data[kind].nomi or 0).. " ku" + end + + local alarm = "" + if nnodes > (techage.MAX_NUM_NODES - 50) then + alarm = " (max. "..(techage.MAX_NUM_NODES).." !!!)" + end + return "size[10,6.5]".. default.gui_bg.. default.gui_bg_img.. default.gui_slots.. - "label[1.5,0.0;"..S("Network Data").."]".. - "label[0,0.8;"..S("Generators").." : 0 ku]".. - "label[0,1.4;"..S("Akkus").." : 0 ku]".. - "label[0,2.0;"..S("Machines").." : 0 ku]".. - "label[0,2.6;"..S("Number nodes").." : 0]".. - "button[1.5,3.3;2,1;update;"..S("Update").."]" + "label[2,0.0;"..S("Network Data").."]".. + "label[3,0.7;"..S("(number / current / max.)").."]".. + "label[0,1.4;"..S("Power Fuel")..":]".. "label[4,1.4;"..get("fuel").."]".. + "label[0,2.1;"..S("Power Solar")..":]".. "label[4,2.1;"..get("solar").."]".. + "label[0,2.8;"..S("Power Wind")..":]".. "label[4,2.8;"..get("wind").."]".. + "label[0,3.5;"..S("Power Storage")..":]".."label[4,3.5;"..get("stor").."]".. + "label[0,4.2;"..S("Power Akkus")..":]".. "label[4,4.2;"..get("akku").."]".. + "label[0,4.9;"..S("Number nodes").." : "..nnodes..alarm.."]".. + "button[2.5,5.8;2,1;update;"..S("Update").."]" end local function update_formspec(pos) diff --git a/coal_power_station/turbine.lua b/coal_power_station/turbine.lua index ac7ec7a..dd76591 100644 --- a/coal_power_station/turbine.lua +++ b/coal_power_station/turbine.lua @@ -56,15 +56,6 @@ local function stop_sound(pos) end end --- called with any pipe change -local function after_tube_update(node, pos, out_dir, peer_pos, peer_in_dir) - local mem = tubelib2.get_mem(pos) - transfer_cooler(pos, "stop", nil) - swap_node(pos, "techage:turbine") - mem.running = false - stop_sound(pos) -end - minetest.register_node("techage:turbine", { description = S("TA3 Turbine"), tiles = { @@ -76,8 +67,6 @@ minetest.register_node("techage:turbine", { "techage_filling_ta3.png^techage_appl_turbine.png^techage_frame_ta3.png", "techage_filling_ta3.png^techage_appl_turbine.png^techage_frame_ta3.png", }, - on_construct = tubelib2.init_mem, - paramtype2 = "facedir", groups = {cracky=2, crumbly=2, choppy=2}, on_rotate = screwdriver.disallow, @@ -113,8 +102,6 @@ minetest.register_node("techage:turbine_on", { }, }, }, - after_tube_update = after_tube_update, - paramtype2 = "facedir", groups = {not_in_creative_inventory=1}, diggable = false, @@ -127,6 +114,13 @@ minetest.register_node("techage:turbine_on", { techage.power.register_node({"techage:turbine", "techage:turbine_on"}, { conn_sides = {"L", "U"}, power_network = Pipe, + after_tube_update = function(node, pos, out_dir, peer_pos, peer_in_dir) + local mem = tubelib2.get_mem(pos) + transfer_cooler(pos, "stop", nil) + swap_node(pos, "techage:turbine") + mem.running = false + stop_sound(pos) + end }) -- for logical communication diff --git a/doc/manual_DE.lua b/doc/manual_DE.lua index 0f50c45..4a16ed1 100644 --- a/doc/manual_DE.lua +++ b/doc/manual_DE.lua @@ -485,9 +485,7 @@ techage.manual_DE.aText = { "\n", "Das Strom-Terminal muss von eine Verteilerdose platziert werden. Es zeigt Daten aus dem Stromnetz an wie:\n".. "\n".. - " - Leistung alle Generatoren\n".. - " - Leistung alles Akkus (Sekundärquellen)\n".. - " - Leistungsaufnahme aller Maschinen\n".. + " - Anzahl und Leistung der verschiedenen Generatoren und Akkus (aktuell/maximal)\n".. " - Anzahl der Netzwerk-Blöcke (max. 1000)\nDie Daten des Terminals werden beim Öffnen des Menüs und dann nur durch Anklicken des \"Update\" Buttons aktualisiert.\n".. "\n".. "\n".. @@ -801,16 +799,16 @@ techage.manual_DE.aText = { "Für den Stromtransport stehen die Überlandleitungen zur Verfügung.\n".. "Es kann aber auch Wasserstoff produziert werden\\, welcher sich transportieren und am Ziel wieder zu Strom umwandeln lässt (geplant).\n".. "\n".. - "Die kleinste Einheit bei einer Solaranlage sind zwei Solarmodule und ein Trägermodul. Das Trägermodul muss zuerst gesetzt werden\\, die zwei Solarmodule dann links und rechts daneben.\n".. + "Die kleinste Einheit bei einer Solaranlage sind zwei Solarmodule und ein Trägermodul. Das Trägermodul muss zuerst gesetzt werden\\, die zwei Solarmodule dann links und rechts daneben (nicht darüber!).\n".. "\n".. - "Solarmodule liefern Gleichspannung\\, welcher nicht direkt in das Stromnetz eingespeist werden kann. Daher müssen zuerst die Solareinheiten über das rote Kabel mit dem Wechselrichter verbunden werden. Dieser hat zwei Anschlussseiten\\, eine für das rote Kabel zu den Solarmodulen und eine für das graue Stromkabel ins Stromnetz.\n".. + "Solarmodule liefern Gleichspannung\\, welcher nicht direkt in das Stromnetz eingespeist werden kann. Daher müssen zuerst die Solareinheiten über das rote Kabel mit dem Wechselrichter verbunden werden. Dieser besteht aus zwei Blöcken\\, einen für das rote Kabel zu den Solarmodulen (DC) und einen für das graue Stromkabel ins Stromnetz (AC).\n".. "\n".. "Der Kartenbereich\\, wo die Solaranlage steht\\, muss komplett geladen sein. Es empfiehlt sich daher\\, zuerst einen Forceload Block zu setzen\\, und dann innerhalb dieses Bereiches die Module zu platzieren.\n".. "\n".. "\n".. "\n", "Das Solarmodul muss an das Trägermodul gesetzt werden. Es sind immer zwei Solarmodule notwendig.\n".. - "Im Paar leisten die Solarmodule bis 4 ku\\, je nach Temperatur.\n".. + "Im Paar leisten die Solarmodule bis 3 ku\\, je nach Temperatur.\n".. "Bei den Solarmodul muss darauf geachtet werden\\, dass diese das volle Tageslicht haben und nicht durch Blöcke oder Bäume beschattet sind.\n".. "\n".. "\n".. @@ -821,7 +819,7 @@ techage.manual_DE.aText = { "\n".. "\n", "Der Wechselrichter wandelt den Solarstrom (DC) in Wechselstrom (AC) um\\, so dass dieser in das Stromnetz eingespeist werden kann.\n".. - "Ein Wechselrichter kann maximal 120 ku an Strom einspeisen\\, was 30 Solarmodulen oder auch mehr entspricht.\n".. + "Ein Wechselrichter\\, bestehend aus zwei Blöcken kann maximal 100 ku an Strom einspeisen\\, was 33 Solarmodulen oder auch mehr entspricht.\n".. "\n".. "\n".. "\n", @@ -978,7 +976,7 @@ techage.manual_DE.aItemName = { "ta4_nacelle", "ta4_blinklamp", "ta4_pillar", - "techage_ta4_solar", + "", "ta4_solarmodule", "ta4_solarcarrier", "ta4_solar_inverter", @@ -1090,7 +1088,7 @@ techage.manual_DE.aPlanTable = { "", "", "", - "", + "ta4_solarplant", "", "", "", diff --git a/doc/plans.lua b/doc/plans.lua index 3b850ff..3ead873 100644 --- a/doc/plans.lua +++ b/doc/plans.lua @@ -20,7 +20,7 @@ local IMG_2 = {"", "techage_ta2.png"} local IMG_3 = {"", "techage_ta3.png"} local IMG_4 = {"", "techage_ta4.png"} local IMG41 = {"", "techage_ta4_tes.png"} - +local IMG42 = {"", "techage_ta4_solar.png"} -- -- TA1: Coal Pile @@ -213,3 +213,24 @@ techage.ConstructionPlans["ta4_storagesystem"] = { {false, false, false, PN090, PIPEH, PIPEH, PN180, false, false, false, false}, } +-- +-- Solar Plant +-- + +local SOLAR = {"techage_solar_module_top.png", "techage:ta4_solar_module"} +local RCBLE = {"techage_ta4_cable_inv.png", "techage:ta4_power_cableS"} +local CARRI = {"techage:ta4_solar_carrier", "techage:ta4_solar_carrier"} +local INVDC = {"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_inverterDC.png", "techage:ta4_solar_inverterDC"} +local INVAC = {"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_inverter.png", "techage:ta4_solar_inverter"} + +techage.ConstructionPlans["ta4_solarplant"] = { + {false, false, false, false, false, false, false, false, false, IMG42, false}, + {false, false, false, false, false, false, false, false, false, false, false}, + {false, false, false, false, false, false, false, false, false, false, false}, + {false, SOLAR, SOLAR, SOLAR}, + {false, CARRI, CARRI, CARRI, RCBLE, RCBLE, INVDC, INVAC, Cable}, + {false, SOLAR, SOLAR, SOLAR}, +} + + + diff --git a/energy_storage/generator.lua b/energy_storage/generator.lua index 33e550c..e863794 100644 --- a/energy_storage/generator.lua +++ b/energy_storage/generator.lua @@ -52,13 +52,6 @@ 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]", }, - - after_place_node = function(pos, placer) - local mem = tubelib2.init_mem(pos) - mem.running = false - mem.remote_trigger = 0 - end, - on_timer = node_timer, paramtype2 = "facedir", groups = {cracky=2, crumbly=2, choppy=2}, @@ -124,6 +117,12 @@ minetest.register_craft({ techage.power.register_node({"techage:ta4_generator", "techage:ta4_generator_on"}, { conn_sides = {"R"}, power_network = Cable, + after_place_node = function(pos, placer) + local mem = tubelib2.init_mem(pos) + mem.running = false + mem.remote_trigger = 0 + end, + }) -- controlled by the turbine diff --git a/energy_storage/heatexchanger.lua b/energy_storage/heatexchanger.lua index 6c596ba..825dc49 100644 --- a/energy_storage/heatexchanger.lua +++ b/energy_storage/heatexchanger.lua @@ -136,14 +136,33 @@ local function formspec(self, pos, mem) "label[4.2,2.5;Flow]" end +local function error_info(pos, err) + local own_num = M(pos):get_string("node_number") + local pos1 = {x = pos.x, y = pos.y + 1, z = pos.z} + M(pos1):set_string("infotext", S("TA4 Heat Exchanger").." "..own_num.." : "..err) +end + local function can_start(pos, mem, state) if turbine_cmnd(pos, "power") then - local radius = inlet_cmnd(pos, "radius") - if radius then - mem.capa_max = PWR_CAPA[tonumber(radius)] or 0 + local diameter = inlet_cmnd(pos, "diameter") + if diameter then + mem.capa_max = PWR_CAPA[tonumber(diameter)] or 0 + print(diameter, mem.capa_max) local owner = M(pos):get_string("owner") or "" - return inlet_cmnd(pos, "volume", owner) + if inlet_cmnd(pos, "volume", owner) then + error_info(pos, "") + return true + else + error_info(pos, "storage volume error") + return false + end + else + error_info(pos, "inlet/pipe error") + return false end + else + error_info(pos, "power network error") + return false end return false end @@ -154,6 +173,7 @@ local function start_node(pos, mem, state) mem.was_charging = true play_sound(pos) mem.win_pos = inlet_cmnd(pos, "window") + turbine_cmnd(pos, "start") power.secondary_start(pos, mem, PWR_PERF, PWR_PERF) end @@ -294,19 +314,6 @@ minetest.register_node("techage:heatexchanger1", { "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_construct = tubelib2.init_mem, - - after_place_node = function(pos, placer) - -- secondary 'after_place_node', called by power. Don't use tubelib2.init_mem(pos)!!! - local mem = tubelib2.get_mem(pos) - local meta = M(pos) - local own_num = techage.add_node(pos, "techage:heatexchanger1") - meta:set_string("owner", placer:get_player_name()) - State:node_init(pos, mem, own_num) - mem.capa = 0 - end, - on_timer = node_timer, paramtype2 = "facedir", groups = {crumbly = 2, cracky = 2, snappy = 2}, @@ -318,6 +325,14 @@ minetest.register_node("techage:heatexchanger1", { techage.power.register_node({"techage:heatexchanger1"}, { conn_sides = {"F", "B"}, power_network = Cable, + after_place_node = function(pos, placer) + local mem = tubelib2.init_mem(pos) + local meta = M(pos) + local own_num = techage.add_node(pos, "techage:heatexchanger1") + meta:set_string("owner", placer:get_player_name()) + State:node_init(pos, mem, own_num) + mem.capa = 0 + end, }) Pipe:add_secondary_node_names({"techage:heatexchanger1", "techage:heatexchanger3"}) diff --git a/energy_storage/inlet.lua b/energy_storage/inlet.lua index 5759798..b0d04c1 100644 --- a/energy_storage/inlet.lua +++ b/energy_storage/inlet.lua @@ -128,8 +128,8 @@ end -- for logical communication techage.register_node({"techage:ta4_pipe_inlet"}, { on_transfer = function(pos, in_dir, topic, payload) - if topic == "radius" then - return get_radius(pos, in_dir) + if topic == "diameter" then + return get_radius(pos, in_dir) * 2 - 1 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 63fad43..a746c72 100644 --- a/energy_storage/turbine.lua +++ b/energy_storage/turbine.lua @@ -82,12 +82,6 @@ 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", }, - after_place_node = function(pos, placer) - local mem = tubelib2.init_mem(pos) - mem.running = false - mem.remote_trigger = 0 - end, - on_timer = node_timer, paramtype2 = "facedir", groups = {cracky=2, crumbly=2, choppy=2}, @@ -143,6 +137,11 @@ minetest.register_node("techage:ta4_turbine_on", { 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 mem = tubelib2.init_mem(pos) + mem.running = false + mem.remote_trigger = 0 + end, }) -- for logical communication diff --git a/furnace/booster.lua b/furnace/booster.lua index 3163690..bfca6d7 100644 --- a/furnace/booster.lua +++ b/furnace/booster.lua @@ -77,18 +77,7 @@ minetest.register_node("techage:ta3_booster", { "techage_filling_ta3.png^techage_appl_compressor.png^techage_frame_ta3.png", "techage_filling_ta3.png^techage_appl_compressor.png^[transformFX^techage_frame_ta3.png", }, - - on_construct = tubelib2.init_mem, - after_place_node = function(pos, placer) - -- secondary 'after_place_node', called by power. Don't use tubelib2.init_mem(pos)!!! - local mem = tubelib2.get_mem(pos) - local node = minetest.get_node(pos) - local indir = techage.side_to_indir("R", node.param2) - M(pos):set_int("indir", indir) - infotext(pos, "stopped") - end, on_timer = node_timer, - paramtype2 = "facedir", groups = {cracky=2, crumbly=2, choppy=2}, on_rotate = screwdriver.disallow, @@ -140,6 +129,13 @@ techage.power.register_node({"techage:ta3_booster", "techage:ta3_booster_on"}, { conn_sides = {"F", "B", "U", "D", "L"}, on_power = on_power, on_nopower = on_nopower, + after_place_node = function(pos, placer) + local mem = tubelib2.init_mem(pos) + local node = minetest.get_node(pos) + local indir = techage.side_to_indir("R", node.param2) + M(pos):set_int("indir", indir) + infotext(pos, "stopped") + end, }) -- for intra machine communication diff --git a/lamps/lib.lua b/lamps/lib.lua index ec60f0b..d8964ee 100644 --- a/lamps/lib.lua +++ b/lamps/lib.lua @@ -57,16 +57,16 @@ local function lamp_on_rightclick(pos, node, clicker) end local mem = tubelib2.get_mem(pos) + minetest.get_node_timer(pos):start(CYCLE_TIME) + if not mem.turned_on and power.power_available(pos, mem, PWR_NEEDED) then mem.turned_on = true - swap_node(pos, "on") power.consumer_start(pos, mem, CYCLE_TIME, PWR_NEEDED) - minetest.get_node_timer(pos):start(CYCLE_TIME) + swap_node(pos, "on") else mem.turned_on = false - swap_node(pos, "off") power.consumer_stop(pos, mem) - minetest.get_node_timer(pos):stop() + swap_node(pos, "off") end end diff --git a/locale/techage.de.tr b/locale/techage.de.tr index a932c24..80fd706 100644 --- a/locale/techage.de.tr +++ b/locale/techage.de.tr @@ -1,7 +1,7 @@ # textdomain: techage #### TA3 Terminal ####@n@nSend commands to your machines@nand output text messages from your@nmachines to the Terminal.@n@nCommand syntax:@n cmd @n@nexample: cmd 181 on@n is the number of the node to which the command is sent@n'on' is the command to turn machines/nodes on@nFurther commands can be retrieved by clicking on@nmachines/nodes with the Techage Info Tool.@n@nLocal commands:@n- clear @= clear screen@n- help @= this message@n- pub @= switch to public use@n- priv @= switch to private use@nTo program a user button with a command:@n set @ne.g. 'set 1 ON cmd 123 on'@n= -Akkus=Akkus +(number / current / max.)=(Anzahl / aktuell / max.) Allow to dig/place Techage power lines nearby power poles=Erlaubt TODO Ash=Asche Autocrafter=Autocrafter @@ -36,7 +36,6 @@ Flint and Iron=Flint and Iron Flowing Oil=Fließendes Öl Force order of filter items=Erzwinge Reihenfolge Furnace Top=Ofenoberteil -Generators=Generatoren Gravel Rinser=Kiesspüler Gravel Sieve=Kiessieb Grinder=Mühle @@ -44,7 +43,6 @@ Grinding=Mahlen Heat=Hitze Insert destination node number(s)=Gebe Zielnummer(n) ein Liquid Sampler=Flüssigkeitensammler -Machines=Maschinen Melting Guide=Schmelzführer Melting Pot active (heat@==Schmelztiegel aktiv (Hitze@= Melting Pot inactive (heat@==Schmelztiegel inaktiv (Hitze@= @@ -69,6 +67,11 @@ Plan=Plan Position=Position Position temperature=Positionstemperatur Power=Energie +Power Akkus=Strom Akkus +Power Fuel=Strom Kohle/Öl +Power Solar=Strom Solar +Power Storage=Strom Speicher +Power Wind=Strom Wind Pusher=Schieber Remove derrick=Entferne Ölturm Rinsing=Waschen @@ -174,6 +177,8 @@ TA4 Solar Carrier Module=TA4 Solar Trägermodul TA4 Solar Carrier Module B=TA4 Solar Trägermodul U TA4 Solar Carrier Module T=TA4 Solar Trägermodul O TA4 Solar Inverter=TA4 Solar Wechselrichter +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 Turbine=TA4 Turbine diff --git a/locale/template.txt b/locale/template.txt index 419c867..cb45459 100644 --- a/locale/template.txt +++ b/locale/template.txt @@ -1,5 +1,5 @@ #### TA3 Terminal ####@n@nSend commands to your machines@nand output text messages from your@nmachines to the Terminal.@n@nCommand syntax:@n cmd @n@nexample: cmd 181 on@n is the number of the node to which the command is sent@n'on' is the command to turn machines/nodes on@nFurther commands can be retrieved by clicking on@nmachines/nodes with the Techage Info Tool.@n@nLocal commands:@n- clear @= clear screen@n- help @= this message@n- pub @= switch to public use@n- priv @= switch to private use@nTo program a user button with a command:@n set @ne.g. 'set 1 ON cmd 123 on'@n= -Akkus= +(number / current / max.)= Allow to dig/place Techage power lines nearby power poles= Ash= Autocrafter= @@ -34,7 +34,6 @@ Flint and Iron= Flowing Oil= Force order of filter items= Furnace Top= -Generators= Gravel Rinser= Gravel Sieve= Grinder= @@ -42,7 +41,6 @@ Grinding= Heat= Insert destination node number(s)= Liquid Sampler= -Machines= Melting Guide= Melting Pot active (heat@== Melting Pot inactive (heat@== @@ -67,6 +65,11 @@ Plan= Position= Position temperature= Power= +Power Akkus= +Power Fuel= +Power Solar= +Power Storage= +Power Wind= Pusher= Remove derrick= Rinsing= @@ -172,6 +175,8 @@ TA4 Solar Carrier Module= TA4 Solar Carrier Module B= TA4 Solar Carrier Module T= TA4 Solar Inverter= +TA4 Solar Inverter AC= +TA4 Solar Inverter DC= TA4 Solar Module= TA4 Streetlamp Solar Cell= TA4 Turbine= diff --git a/manuals/api.md b/manuals/api.md index c9cc75f..89eb92b 100644 --- a/manuals/api.md +++ b/manuals/api.md @@ -144,41 +144,49 @@ end) Wird 1) aufgerufen, wird 2) **nicht** mehr gerufen! +### API Funktionen + +```lua +tubelib2.get_pos(pos, dir) +``` + + + +## Techage `command` + ### Dir vs. Side `tubelib2` arbeitet nur mit dirs (siehe oben). Oft ist aber die Arbeitsweise mit `sides` einfacher. -Techage defiiert `sides` , die wie folgt definiert sind `{B=1, R=2, F=3, L=4, D=5, U=6}`: +Techage definiert `sides` , die wie folgt definiert sind `{B=1, R=2, F=3, L=4, D=5, U=6}`: - sides: dirs: - U - | B - | / 6 - +--|-----+ | 1 - / o /| | / - +--------+ | |/ - L <----| |o----> R 4 <-------+-------> 2 - | o | | /| - | / | + / | - | / |/ 3 | - +-/------+ 5 - / | - F | - D +``` +sides: dirs: + U + | B + | / 6 + +--|-----+ | 1 + / o /| | / + +--------+ | |/ +L <----| |o----> R 4 <-------+-------> 2 + | o | | /| + | / | + / | + | / |/ 3 | + +-/------+ 5 + / | + F | + D +``` `techage/command.lua` definiert hier: - ```lua techage.side_to_outdir(side, param2) -- "B/R/F/L/D/U", node.param2 ``` -Weitere API Funktionen von `command.lua` - -## Techage `command` In Ergänzung zu `tubelib2` sind in `command` Funktionen für den Austausch von Items von Inventar zu Inventar (Tubing) und Kommandos für Datenaustausch definiert. -Zusätzlich etabliert `command` das Knoten-Nummern-System für die Addressierung bei Kommandos. +Zusätzlich etabliert `command` das Knoten-Nummern-System für die Adressierung bei Kommandos. Dazu muss jeder Knoten bei `command` an- und abgemeldet werden: @@ -200,7 +208,7 @@ techage.register_node(names, { }) ``` -#### Client API +### Client API Bspw. der Pusher als Client nutzt: @@ -210,7 +218,7 @@ techage.push_items(pos, out_dir, stack) techage.unpull_items(pos, out_dir, stack) ``` -#### Server API +### Server API Für den Server (chest mit Inventar) existieren dazu folgende Funktionen: @@ -220,7 +228,7 @@ techage.put_items(inv, listname, stack) techage.get_inv_state(inv, listname) ``` -#### Hopper API +### Hopper API Es gibt bspw. mit dem Hopper aber auch einen Block, der nicht über Tubes sondern nur mit direkten Nachbarn Items austauschen soll. Dazu dient dieser Satz an Funktionen: @@ -230,7 +238,7 @@ techage.neighbour_push_items(pos, out_dir, stack) techage.neighbour_unpull_items(pos, out_dir, stack) ``` -#### Nummern bezogene Kommando API +### Nummern bezogene Kommando API Kommunikation ohne Tubes, Addressierung nur über Knoten-Nummern @@ -241,7 +249,7 @@ techage.send_multi(src, numbers, topic, payload) --> to many nodes techage.send_single(src, number, topic, payload) --> to one node with response ``` -#### Positions bezogene Kommando API +### Positions bezogene Kommando API Kommunikation mit Tubes oder mit direkten Nachbar-Knoten über pos/dir. Im Falle von Tubes muss bei `network` die Tube Instanz angegeben werden. @@ -257,7 +265,7 @@ techage.transfer(pos, outdir, topic, payload, network, nodenames) -- opt: nodenames is a table of valid callee node names ``` -#### Sonstige API +### Sonstige API ```lua techage.side_to_indir(side, param2) --> indir @@ -281,16 +289,20 @@ techage.power.register_node(names, { on_nopower = func(pos, mem), -- für Verbraucher (ausschalten) on_getpower = func(pos, mem), -- für Solarzellen (Strom einsammeln) power_network = Tube, -- tubelib2 Instanz + after_place_node = func(pos, placer, itemstack, pointed_thing), + after_dig_node = func(pos, oldnode, oldmetadata, digger) + after_tube_update = func(node, pos, out_dir, peer_pos, peer_in_dir) }) ``` -Durch die Registrierung des Nodes werden auch die folgenden Funktionen überschrieben bzw. erhalten einen Wrapper (Code nur symbolhaft): +Durch die Registrierung des Nodes die obigen "after"-Funktionen einen Wrapper (Code nur symbolhaft): ```lua -- after_place_node decorator after_place_node = function(pos, placer, itemstack, pointed_thing) + local res = .after_place_node(pos, placer, itemstack, pointed_thing) :after_place_node(pos) - return .after_place_node(pos, placer, itemstack, pointed_thing) + return res end, -- after_dig_node decorator after_dig_node = function(pos, oldnode, oldmetadata, digger) @@ -304,8 +316,6 @@ end, -- --> after_tube_update (power) after_tube_update = function(node, pos, out_dir, peer_pos, peer_in_dir) mem.connections = ... -- aktualisieren/löschen - -- To be called delayed, so that all network connections have been established - minetest.after(0.2, network_changed, pos, mem) return .after_tube_update(node, pos, out_dir, peer_pos, peer_in_dir) end, @@ -353,7 +363,6 @@ techage.power.power_accounting(pos, mem) --> {network data...} (used by terminal techage.power.get_power(start_pos) --> sum (used by solar cells) techage.power.power_network_available(start_pos) --> bool (used by TES generator) techage.power.mark_nodes(name, start_pos) -- used by debugging tool -techage.power.add_connection(pos, out_dir, network, add) -- (Inverter feature) ``` ## Klasse `NodeStates` @@ -471,23 +480,7 @@ Ein einfaches Beispiele dafür wäre: `pusher.lua` #### Problem: Verbindungen zu zwei Netzwerken -Es ist nicht möglich, einen Knoten in zwei unterschiedlichen Netzwerken (bspw. Strom, Dampf) über `techage.power.register_node()` anzumelden. `power` würde zweimal übereinander die gleichen Knoten-internen Variablen wie `mem.connections` im Knoten anlegen und nutzen. Das geht und muss schief gehen. Aktuell ist es zusätzlich so, dass sich Lua in einer Endlosschleife aufhängt. Also insgesamt keine gute Idee. - -Ein Lösungsansatz wäre, den Datensatz in mem, node und meta eine Indirektion tiefer unter dem Netzwerknamen abzuspeichern. Dies hat aber Auswirkungen auf die Performance. - -Der **Inverter** hat mit Power und Solar zwei Netzwerkanschlüsse. Da dies aber aktuell (03.10.2019) nicht geht, ist nur Power normal registiert, Solar wird nur "krückenhaft" angesteuert. Damit taucht der Inverter aber nicht im Solar-Netzwerk auf. Dies ermöglicht es, mehrere Inverter in ein Solar-Netzwerk zu hängen und jeder liefert die volle Leistung. - -Weiteres Problem: Die Funktion `matching_nodes()` (power2.lua) prüft, ob beide Knoten beim `after_tube_update` den gleichen Netzwerktyp haben. Der Inverter liefert hier "power", müsste aber "solar" liefern. Dadurch wird der Verbindungsaufbau von der Junctionbox abgelehnt. - -#### Lösung - -Leider eine Speziallösung für den Inverter: - -- power2 hat eine Funktion `techage.power.add_connection()` um vom Inverter aus beim nächsten angeschlossenen Knoten den Inverter in der connection Liste einzutragen. -- Der Inverter gibt jetzt bei `techage.power.get_power()` seinen eigenen Namen an. `techage.power.get_power()` liefert die Anzahl der gefundenen Inverter zurück. Sind es mehr als einer, gibt es eine Fehlermeldung. -- Der Inverter hat auch noch eine `after_tube_update` bekommen, um auch von hier die `techage.power.add_connection()`aufrufen zu können. - -So scheint es aber zu gehen. +Es ist nicht möglich, einen Knoten in zwei unterschiedlichen Netzwerken (bspw. Strom, Dampf) über `techage.power.register_node()` anzumelden. `power` würde zweimal übereinander die gleichen Knoten-internen Variablen wie `mem.connections` im Knoten anlegen und nutzen. Das geht und muss schief gehen. Aktuell gibt es dafür keine Lösung. ### ToDo diff --git a/manuals/manual_DE.md b/manuals/manual_DE.md index dd2998d..d01eb0b 100644 --- a/manuals/manual_DE.md +++ b/manuals/manual_DE.md @@ -34,6 +34,9 @@ Ab TA3 laufen die Maschinen mit Strom und besitzen eine Kommunikationsschnittste Mit TA4 kommen weitere Stromquellen dazu, aber auch höhere logistische Herausforderungen (Stromtrassen, Item Transport). - +## History + +- 28.09.2019: Um Solaranlage erweitert +- 05.10.2019: Daten zur Solaranlage und Beschreibung zum Wechselrichter und zum Power-Terminal geändert diff --git a/manuals/manual_ta3_DE.md b/manuals/manual_ta3_DE.md index 9edfafe..2bfb3c1 100644 --- a/manuals/manual_ta3_DE.md +++ b/manuals/manual_ta3_DE.md @@ -167,9 +167,7 @@ Bei Volllast kann ein Akku 400 s lang Strom aufnehmen und wenn er voll ist, auch ### TA3 Strom Terminal / Power Terminal Das Strom-Terminal muss von eine Verteilerdose platziert werden. Es zeigt Daten aus dem Stromnetz an wie: -- Leistung alle Generatoren -- Leistung alles Akkus (Sekundärquellen) -- Leistungsaufnahme aller Maschinen +- Anzahl und Leistung der verschiedenen Generatoren und Akkus (aktuell/maximal) - Anzahl der Netzwerk-Blöcke (max. 1000) Die Daten des Terminals werden beim Öffnen des Menüs und dann nur durch Anklicken des "Update" Buttons aktualisiert. diff --git a/manuals/manual_ta4_DE.md b/manuals/manual_ta4_DE.md index 99b3c24..75aab4f 100644 --- a/manuals/manual_ta4_DE.md +++ b/manuals/manual_ta4_DE.md @@ -63,19 +63,21 @@ Es empfiehlt sich daher, nach heißen Steppen und Wüsten für die Solaranlage A Für den Stromtransport stehen die Überlandleitungen zur Verfügung. Es kann aber auch Wasserstoff produziert werden, welcher sich transportieren und am Ziel wieder zu Strom umwandeln lässt (geplant). -Die kleinste Einheit bei einer Solaranlage sind zwei Solarmodule und ein Trägermodul. Das Trägermodul muss zuerst gesetzt werden, die zwei Solarmodule dann links und rechts daneben. +Die kleinste Einheit bei einer Solaranlage sind zwei Solarmodule und ein Trägermodul. Das Trägermodul muss zuerst gesetzt werden, die zwei Solarmodule dann links und rechts daneben (nicht darüber!). -Solarmodule liefern Gleichspannung, welcher nicht direkt in das Stromnetz eingespeist werden kann. Daher müssen zuerst die Solareinheiten über das rote Kabel mit dem Wechselrichter verbunden werden. Dieser hat zwei Anschlussseiten, eine für das rote Kabel zu den Solarmodulen und eine für das graue Stromkabel ins Stromnetz. +Der Plan rechts zeigt 3 Einheiten mit je zwei Solarmodulen und einem Trägermodul, über rote Kabel mit dem Wechselrichter verbunden. + +Solarmodule liefern Gleichspannung, welcher nicht direkt in das Stromnetz eingespeist werden kann. Daher müssen zuerst die Solareinheiten über das rote Kabel mit dem Wechselrichter verbunden werden. Dieser besteht aus zwei Blöcken, einen für das rote Kabel zu den Solarmodulen (DC) und einen für das graue Stromkabel ins Stromnetz (AC). Der Kartenbereich, wo die Solaranlage steht, muss komplett geladen sein. Es empfiehlt sich daher, zuerst einen Forceload Block zu setzen, und dann innerhalb dieses Bereiches die Module zu platzieren. -[techage_ta4_solar|image] +[ta4_solarplant|plan] ### TA4 Solarmodul / Solar Module Das Solarmodul muss an das Trägermodul gesetzt werden. Es sind immer zwei Solarmodule notwendig. -Im Paar leisten die Solarmodule bis 4 ku, je nach Temperatur. +Im Paar leisten die Solarmodule bis 3 ku, je nach Temperatur. Bei den Solarmodul muss darauf geachtet werden, dass diese das volle Tageslicht haben und nicht durch Blöcke oder Bäume beschattet sind. [ta4_solarmodule|image] @@ -92,7 +94,8 @@ Die Trägermodule können direkt aneinander gesetzt und so zu einer Modulreihe v ### TA4 Solar Wechselrichter / Solar Inverter Der Wechselrichter wandelt den Solarstrom (DC) in Wechselstrom (AC) um, so dass dieser in das Stromnetz eingespeist werden kann. -Ein Wechselrichter kann maximal 120 ku an Strom einspeisen, was 30 Solarmodulen oder auch mehr entspricht. +Ein Wechselrichter, bestehend aus zwei Blöcken kann maximal 100 ku an Strom einspeisen, was 33 Solarmodulen oder auch mehr entspricht. +Der DC Block muss links neben den AC-Block gesetzt werden. [ta4_solar_inverter|image] diff --git a/power/junction.lua b/power/junction.lua index 3c1b1c4..125c25d 100644 --- a/power/junction.lua +++ b/power/junction.lua @@ -70,7 +70,10 @@ function techage.register_junction(name, size, boxes, network, node, index) ndef.drop = name..(index or "0") minetest.register_node(name..idx, ndef) -- Register in addition for power distribution - techage.power.register_node({name..idx}, {power_network = network}) + techage.power.register_node({name..idx}, { + power_network = network, + after_tube_update = ndef.after_tube_update, + }) end end diff --git a/power/power.lua b/power/power.lua index 0adeea5..6c09971 100644 --- a/power/power.lua +++ b/power/power.lua @@ -17,6 +17,7 @@ local S = function(pos) if pos then return minetest.pos_to_string(pos) end end local P = minetest.string_to_pos local M = minetest.get_meta +local N = function(pos) return minetest.get_node(pos).name end local D = techage.Debug -- Techage Related Data @@ -194,7 +195,7 @@ minetest.register_lbm({ -------------------------------------------------- Migrate -local function conection_color(t) +local function connection_color(t) local count = 0 for _ in pairs(t) do count = count + 1 end if count == 0 then return count, "#FF0000" end @@ -245,23 +246,25 @@ local function connection_walk(pos, clbk) end end --- walk limited by number of nodes and hops -local function connection_walk2(pos, max_hops, max_nodes, clbk) +-- Comfort walk with abort condition and additional info +-- num_hops is for internal use only +-- clbk(pos, node, mem, num_hops, num_nodes) +local function limited_connection_walk(pos, clbk, num_hops) + num_hops = num_hops or 1 local mem = tubelib2.get_mem(pos) mem.interrupted_dirs = mem.interrupted_dirs or {} if clbk then - clbk(pos, mem, max_hops) + local node = techage.get_node_lvm(pos) + if clbk(pos, node, mem, num_hops, NumNodes) then return true end end - max_hops = max_hops - 1 - if max_hops < 0 then return end + num_hops = num_hops + 1 for out_dir,item in pairs(mem.connections or {}) do if item.pos and not pos_already_reached(item.pos) and not mem.interrupted_dirs[out_dir] then - max_nodes = max_nodes - 1 - if max_nodes < 0 then return end - connection_walk2(item.pos, max_hops, max_nodes, clbk) + limited_connection_walk(item.pos, clbk, num_hops) end end + return false end -- if no power available @@ -537,7 +540,7 @@ function techage.power.power_available(pos, mem, needed) return false end --- Power terminal function +-- Debug info, used by junction boxes function techage.power.power_accounting(pos, mem) if mem.pwr_master_pos and (mem.pwr_power_provided_cnt or 0) > 0 then mem.pwr_power_provided_cnt = (mem.pwr_power_provided_cnt or 0) - 1 @@ -628,11 +631,10 @@ function techage.power.power_network_available(start_pos) Route = {} NumNodes = 0 pos_already_reached(start_pos) - local sum = 0 - connection_walk2(start_pos, 2, 3, function(pos, mem) - sum = sum + 1 + limited_connection_walk(start_pos, function(pos, node, mem, _, num_nodes) + return num_nodes > 2 end) - return sum > 1 + return NumNodes > 2 end function techage.power.mark_nodes(name, start_pos) @@ -640,8 +642,36 @@ function techage.power.mark_nodes(name, start_pos) NumNodes = 0 pos_already_reached(start_pos) techage.unmark_position(name) - connection_walk2(start_pos, 3, 100, function(pos, mem, max_hops) - local num, color = conection_color(mem.connections or {}) + limited_connection_walk(start_pos, function(pos, node, mem, num_hops, num_nodes) + local num, color = connection_color(mem.connections or {}) techage.mark_position(name, pos, S(pos).." : "..num, color) + return num_hops >= 3 or num_nodes >= 100 end) end + +-- Network walk with callback for each node: +-- +-- limited_connection_walk(pos, clbk) --> num_hops, num_nodes +-- +-- called function: clbk(pos, node, mem, num_hops, num_nodes) +-- walk will be arborted if function returns true +function techage.power.limited_connection_walk(pos, clbk) + Route = {} + NumNodes = 0 + pos_already_reached(pos) + limited_connection_walk(pos, clbk) + return NumNodes +end + +--local function test() +-- print("test") +-- local cnt = 0 +-- tubelib2.walk_over_all(function(pos, mem) +-- local node = techage.get_node_lvm(pos) +-- print(S(pos), node.name) +-- cnt = cnt + 1 +-- end) +-- print("cnt = "..cnt) +--end + +--minetest.after(1, test) diff --git a/power/power2.lua b/power/power2.lua index e674f3a..7d1582c 100644 --- a/power/power2.lua +++ b/power/power2.lua @@ -15,6 +15,7 @@ local S = function(pos) if pos then return minetest.pos_to_string(pos) end end local P = minetest.string_to_pos local M = minetest.get_meta +local N = function(pos) return minetest.get_node(pos).name end -- Techage Related Data local PWR = function(pos) return (minetest.registered_nodes[minetest.get_node(pos).name] or {}).power end local PWRN = function(node) return (minetest.registered_nodes[node.name] or {}).power end @@ -92,6 +93,17 @@ function techage.power.after_rotate_node(pos, cable) cable:after_place_node(pos) end +local function add_connection(mem, pos, out_dir, peer_pos, peer_in_dir, power) + mem.connections = mem.connections or {} + if not peer_pos or not valid_indir(peer_pos, peer_in_dir) + or not valid_outdir(pos, out_dir) + or not matching_nodes(pos, peer_pos) then + mem.connections[out_dir] = nil -- del connection + else + mem.connections[out_dir] = {pos = peer_pos, in_dir = peer_in_dir} + end +end + function techage.power.register_node(names, pwr_def) for _,name in ipairs(names) do local ndef = minetest.registered_nodes[name] @@ -103,18 +115,20 @@ function techage.power.register_node(names, pwr_def) on_nopower = pwr_def.on_nopower, on_getpower = pwr_def.on_getpower, power_network = pwr_def.power_network, - after_place_node = ndef.after_place_node, - after_dig_node = ndef.after_dig_node, - after_tube_update = ndef.after_tube_update, + after_place_node = pwr_def.after_place_node, + after_dig_node = pwr_def.after_dig_node, + after_tube_update = pwr_def.after_tube_update, }, -- after_place_node decorator after_place_node = function(pos, placer, itemstack, pointed_thing) + local res local pwr = PWR(pos) set_conn_dirs(pos, pwr.conn_sides) - pwr.power_network:after_place_node(pos) if pwr.after_place_node then - return pwr.after_place_node(pos, placer, itemstack, pointed_thing) + res = pwr.after_place_node(pos, placer, itemstack, pointed_thing) end + pwr.power_network:after_place_node(pos) + return res end, -- after_dig_node decorator after_dig_node = function(pos, oldnode, oldmetadata, digger) @@ -129,16 +143,7 @@ function techage.power.register_node(names, pwr_def) after_tube_update = function(node, pos, out_dir, peer_pos, peer_in_dir) local pwr = PWR(pos) local mem = tubelib2.get_mem(pos) - mem.connections = mem.connections or {} - if not peer_pos or not valid_indir(peer_pos, peer_in_dir) - or not valid_outdir(pos, out_dir) - or not matching_nodes(pos, peer_pos) then - mem.connections[out_dir] = nil -- del connection - else - mem.connections[out_dir] = {pos = peer_pos, in_dir = peer_in_dir} - end - -- To be called delayed, so that all network connections have been established - minetest.after(0.2, network_changed, pos, mem) + add_connection(mem, pos, out_dir, peer_pos, peer_in_dir, pwr) if pwr.after_tube_update then return pwr.after_tube_update(node, pos, out_dir, peer_pos, peer_in_dir) end @@ -153,38 +158,12 @@ end -- For all kind of nodes, used as cable filler/grout function techage.power.after_tube_update(node, pos, out_dir, peer_pos, peer_in_dir, power) local mem = tubelib2.get_mem(pos) - mem.connections = mem.connections or {} - if not peer_pos or not valid_indir(peer_pos, peer_in_dir) - or not valid_outdir(pos, out_dir) - or not matching_nodes(pos, peer_pos) then - mem.connections[out_dir] = nil -- del connection - else - mem.connections[out_dir] = {pos = peer_pos, in_dir = peer_in_dir} - end - -- To be called delayed, so that all network connections have been established - minetest.after(0.2, network_changed, pos, mem) + add_connection(mem, pos, out_dir, peer_pos, peer_in_dir, power) if power.after_tube_update then return power.after_tube_update(node, pos, out_dir, peer_pos, peer_in_dir) end end --- Used for "Ad hoc" networking (nodes with support for two different network types) -function techage.power.add_connection(pos, out_dir, network, add) - local peer_pos, peer_in_dir = network:get_connected_node_pos(pos, out_dir) - if peer_pos then - local in_dir = tubelib2.Turn180Deg[out_dir] - local peer_out_dir = tubelib2.Turn180Deg[peer_in_dir] - local mem = tubelib2.get_mem(peer_pos) - mem.connections = mem.connections or {} - if add then - mem.connections[peer_out_dir] = {pos = pos, in_dir = in_dir} - else - mem.connections[peer_out_dir] = nil -- del connection - end - end -end - - function techage.power.percent(max_val, curr_val) return math.min(math.ceil(((curr_val or 0) * 100.0) / (max_val or 1.0)), 100) end @@ -237,7 +216,7 @@ function techage.power.power_cut(pos, dir, cable, cut) if cut then mem.interrupted_dirs = {true, true, true, true, true, true} for dir,_ in pairs(mem.connections) do - mem.interrupted_dirs[dir] = false + mem.interrupted_dirs[dir] = false -- open the port techage.power.network_changed(npos, mem) mem.interrupted_dirs[dir] = true end diff --git a/power/power_line.lua b/power/power_line.lua index c1dc080..248c7b0 100644 --- a/power/power_line.lua +++ b/power/power_line.lua @@ -184,16 +184,6 @@ minetest.register_node("techage:power_pole", { { -2/32, -4/32, 12/32, 2/32, 4/32, 16/32}, }, }, - after_place_node = function(pos, placer, itemstack, pointed_thing) - M(pos):set_string("owner", placer:get_player_name()) - if techage.is_protected(pos, placer:get_player_name()) then - minetest.remove_node(pos) - return true - end - local node = minetest.get_node(pos) - node.name = "techage:power_pole_conn" - minetest.swap_node(pos, node) - end, on_rotate = screwdriver.disallow, -- important! paramtype = "light", @@ -331,7 +321,21 @@ minetest.register_node("techage:power_pole3", { sounds = default.node_sound_defaults(), }) -techage.power.register_node({"techage:power_pole", "techage:power_pole_conn"}, { +techage.power.register_node({"techage:power_pole"}, { + power_network = Cable, + after_place_node = function(pos, placer, itemstack, pointed_thing) + M(pos):set_string("owner", placer:get_player_name()) + if techage.is_protected(pos, placer:get_player_name()) then + minetest.remove_node(pos) + return true + end + local node = minetest.get_node(pos) + node.name = "techage:power_pole_conn" + minetest.swap_node(pos, node) + end, +}) + +techage.power.register_node({"techage:power_pole_conn"}, { power_network = Cable, }) diff --git a/solar/inverter.lua b/solar/inverter.lua index 0c28838..ce77ceb 100644 --- a/solar/inverter.lua +++ b/solar/inverter.lua @@ -23,15 +23,13 @@ local Solar = techage.TA4_Cable local power = techage.power local CYCLE_TIME = 2 -local PWR_PERF = 120 +local PWR_PERF = 100 local function determine_power(pos, mem) - -- We have to use get_connected_node_pos, because the inverter has already - -- a AC power connection. An additional DC power connection is not possibe, - -- so we have to start the connection_walk on the next node. + -- determine DC node position local dir = M(pos):get_int("left_dir") - local pos1 = Solar:get_connected_node_pos(pos, dir) - local max_power, num_inverter = power.get_power(pos1, "techage:ta4_solar_inverter") + local pos1 = tubelib2.get_pos(pos, dir) + local max_power, num_inverter = power.get_power(pos1, "techage:ta4_solar_inverterDC") if num_inverter == 1 then mem.max_power = math.min(PWR_PERF, max_power) else @@ -140,13 +138,13 @@ local function on_rightclick(pos) end minetest.register_node("techage:ta4_solar_inverter", { - description = S("TA4 Solar Inverter"), + description = S("TA4 Solar Inverter AC"), tiles = { -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_arrow.png", + "techage_filling_ta4.png^techage_frame_ta4_top.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_ta4_cable.png", + "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_open.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", }, @@ -155,42 +153,46 @@ minetest.register_node("techage:ta4_solar_inverter", { on_rotate = screwdriver.disallow, is_ground_content = false, - after_place_node = function(pos, placer) - local mem = tubelib2.init_mem(pos) - mem.running = false - mem.delivered = 0 - local number = techage.add_node(pos, "techage:ta4_solar_inverter") - State:node_init(pos, mem, number) - local meta = M(pos) - meta:set_string("formspec", formspec(State, pos, mem)) - -- Solar/low power cable direction - local outdir = techage.power.side_to_outdir(pos, "L") - meta:set_int("left_dir", outdir) - techage.power.add_connection(pos, outdir, Solar, true) - Solar:after_place_node(pos) - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - local outdir = M(pos):get_int("left_dir") - techage.power.add_connection(pos, outdir, Solar, false) - Solar:after_dig_node(pos) - end, - - after_tube_update = function(node, pos, out_dir, peer_pos, peer_in_dir, power) - techage.power.add_connection(pos, out_dir, Solar, true) - end, - on_receive_fields = on_receive_fields, on_rightclick = on_rightclick, on_timer = node_timer, }) +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, +}) + 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 mem = tubelib2.init_mem(pos) + State:node_init(pos, mem, number) + M(pos):set_string("formspec", formspec(State, pos, mem)) + + end, }) -Solar:add_secondary_node_names({"techage:ta4_solar_inverter"}) +techage.power.register_node({"techage:ta4_solar_inverterDC"}, { + conn_sides = {"L"}, + power_network = Solar, +}) techage.register_node({"techage:ta4_solar_inverter"}, { on_recv_message = function(pos, src, topic, payload) @@ -205,8 +207,16 @@ minetest.register_craft({ output = "techage:ta4_solar_inverter", recipe = { {'default:steel_ingot', 'dye:green', 'default:steel_ingot'}, - {'techage:ta4_power_cableS', 'techage:ta4_wlanchip', 'techage:electric_cableS'}, + {'', 'techage:ta4_wlanchip', 'techage:electric_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 339d010..a325d59 100644 --- a/solar/minicell.lua +++ b/solar/minicell.lua @@ -77,24 +77,6 @@ minetest.register_node("techage:ta4_solar_minicell", { {-7/32, -16/32, -7/32, 7/32, -8/32, 7/32}, }, }, - - 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) - -- secondary 'after_place_node', called by power. Don't use tubelib2.init_mem(pos)!!! - local mem = tubelib2.get_mem(pos) - mem.capa = 0 - mem.providing = false - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, - - after_dig_node = function(pos) - techage.remove_node(pos) - tubelib2.del_mem(pos) - end, - paramtype2 = "facedir", groups = {cracky=2, crumbly=2, choppy=2}, is_ground_content = false, @@ -104,6 +86,21 @@ minetest.register_node("techage:ta4_solar_minicell", { 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 mem = tubelib2.init_mem(pos) + mem.capa = 0 + mem.providing = false + minetest.get_node_timer(pos):start(CYCLE_TIME) + end, + + after_dig_node = function(pos) + techage.remove_node(pos) + tubelib2.del_mem(pos) + end, }) techage.register_node({"techage:ta4_solar_minicell"}, { diff --git a/solar/solarcell.lua b/solar/solarcell.lua index dc052da..e6c87b5 100644 --- a/solar/solarcell.lua +++ b/solar/solarcell.lua @@ -17,7 +17,7 @@ local P = minetest.string_to_pos local M = minetest.get_meta local S = techage.S -local PWR_PERF = 4 +local PWR_PERF = 3 local Cable = techage.TA4_Cable local power = techage.power @@ -81,6 +81,7 @@ end minetest.register_node("techage:ta4_solar_module", { description = S("TA4 Solar Module"), + inventory_image = "techage_solar_module_top.png", tiles = { -- up, down, right, left, back, front "techage_solar_module_top.png", @@ -120,13 +121,6 @@ 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, - paramtype = "light", paramtype2 = "facedir", groups = {cracky=2, crumbly=2, choppy=2}, @@ -152,13 +146,6 @@ 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")) - end, - paramtype = "light", paramtype2 = "facedir", groups = {cracky=2, crumbly=2, choppy=2}, @@ -195,12 +182,22 @@ 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, }) 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({ diff --git a/steam_engine/boiler.lua b/steam_engine/boiler.lua index a6be61e..742f3b3 100644 --- a/steam_engine/boiler.lua +++ b/steam_engine/boiler.lua @@ -246,22 +246,11 @@ minetest.register_node("techage:boiler2", { on_rightclick = on_rightclick, on_construct = function(pos) - tubelib2.init_mem(pos) local inv = M(pos):get_inventory() inv:set_size('water', 1) inv:set_size('input', 1) end, - after_place_node = function(pos, placer) - -- secondary 'after_place_node', called by power. Don't use tubelib2.init_mem(pos)!!! - local mem = tubelib2.get_mem(pos) - State:node_init(pos, mem, "") - local node = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) - if node.name == "techage:boiler1" then - on_rightclick(pos) - end - end, - on_metadata_inventory_put = function(pos) minetest.after(0.5, move_to_water, pos) end, @@ -275,6 +264,14 @@ minetest.register_node("techage:boiler2", { techage.power.register_node({"techage:boiler2"}, { conn_sides = {"U"}, power_network = Pipe, + after_place_node = function(pos, placer) + local mem = tubelib2.init_mem(pos) + State:node_init(pos, mem, "") + local node = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) + if node.name == "techage:boiler1" then + on_rightclick(pos) + end + end, }) techage.register_node({"techage:boiler2"}, { diff --git a/steam_engine/cylinder.lua b/steam_engine/cylinder.lua index 300d3b2..8d10ef1 100644 --- a/steam_engine/cylinder.lua +++ b/steam_engine/cylinder.lua @@ -28,14 +28,6 @@ local function swap_node(pos, name) minetest.swap_node(pos, node) end --- called with any pipe change -local function after_tube_update(node, pos, out_dir, peer_pos, peer_in_dir) - -- secondary 'after_place_node', called by power. Don't use tubelib2.init_mem(pos)!!! - local mem = tubelib2.get_mem(pos) - mem.running = false - swap_node(pos, "techage:cylinder") -end - minetest.register_node("techage:cylinder", { description = S("TA2 Cylinder"), tiles = { @@ -48,7 +40,6 @@ minetest.register_node("techage:cylinder", { "techage_filling_ta2.png^techage_cylinder.png^techage_frame_ta2.png", }, - on_construct = tubelib2.init_mem, paramtype2 = "facedir", groups = {cracky=2, crumbly=2, choppy=2}, on_rotate = screwdriver.disallow, @@ -86,7 +77,6 @@ minetest.register_node("techage:cylinder_on", { }, }, - after_tube_update = after_tube_update, paramtype2 = "facedir", groups = {not_in_creative_inventory=1}, diggable = false, @@ -98,6 +88,11 @@ minetest.register_node("techage:cylinder_on", { techage.power.register_node({"techage:cylinder", "techage:cylinder_on"}, { conn_sides = {"L"}, power_network = Pipe, + after_tube_update = function(node, pos, out_dir, peer_pos, peer_in_dir) + local mem = tubelib2.get_mem(pos) + mem.running = false + swap_node(pos, "techage:cylinder") + end, }) -- used by firebox diff --git a/steam_engine/flywheel.lua b/steam_engine/flywheel.lua index 747be79..b6b342a 100644 --- a/steam_engine/flywheel.lua +++ b/steam_engine/flywheel.lua @@ -128,15 +128,6 @@ minetest.register_node("techage:flywheel", { "techage_filling_ta2.png^techage_frame_ta2.png^techage_flywheel.png^[transformFX]", }, - on_construct = tubelib2.init_mem, - - after_place_node = function(pos, placer) - -- secondary 'after_place_node', called by power. Don't use tubelib2.init_mem(pos)!!! - local mem = tubelib2.get_mem(pos) - State:node_init(pos, mem, "") - on_rightclick(pos) - end, - on_receive_fields = on_receive_fields, on_rightclick = on_rightclick, on_timer = node_timer, @@ -203,6 +194,12 @@ minetest.register_node("techage:flywheel_on", { techage.power.register_node({"techage:flywheel", "techage:flywheel_on"}, { conn_sides = {"R"}, power_network = Axle, + after_place_node = function(pos, placer) + local mem = tubelib2.init_mem(pos) + State:node_init(pos, mem, "") + on_rightclick(pos) + end, + }) techage.register_node({"techage:flywheel", "techage:flywheel_on"}, { diff --git a/steam_engine/gearbox.lua b/steam_engine/gearbox.lua index acf694a..83cc9f7 100644 --- a/steam_engine/gearbox.lua +++ b/steam_engine/gearbox.lua @@ -49,31 +49,17 @@ local function node_timer(pos, elapsed) end -- to be able to restart the node after server crashes -local function on_rightclick(pos, node, clicker) +local function on_rightclick(pos) local mem = tubelib2.get_mem(pos) minetest.get_node_timer(pos):start(CYCLE_TIME) power.consumer_start(pos, mem, CYCLE_TIME, PWR_NEEDED) end -local function after_place_node(pos, placer, itemstack, pointed_thing) - -- secondary 'after_place_node', called by power. Don't use tubelib2.init_mem(pos)!!! - local mem = tubelib2.get_mem(pos) - minetest.get_node_timer(pos):start(CYCLE_TIME) - power.consumer_start(pos, mem, CYCLE_TIME, PWR_NEEDED) -end - -local function after_tube_update(node, pos, out_dir, peer_pos, peer_in_dir) - techage.switch_axles(pos, node.name == "techage:gearbox_on") -end - minetest.register_node("techage:gearbox", { description = S("TA2 Gearbox"), tiles = {"techage_filling_ta2.png^techage_axle_gearbox.png^techage_frame_ta2.png"}, - on_construct = tubelib2.init_mem, - after_place_node = after_place_node, on_rightclick = on_rightclick, - after_tube_update = after_tube_update, on_timer = node_timer, paramtype2 = "facedir", groups = {cracky=2, crumbly=2, choppy=2}, @@ -98,10 +84,8 @@ minetest.register_node("techage:gearbox_on", { }, }, - after_place_node = after_place_node, on_rightclick = on_rightclick, on_timer = node_timer, - after_tube_update = after_tube_update, paramtype2 = "facedir", groups = {not_in_creative_inventory=1}, diggable = false, @@ -115,6 +99,12 @@ techage.power.register_node({"techage:gearbox", "techage:gearbox_on"}, { power_network = Axle, on_power = on_power, on_nopower = on_nopower, + after_place_node = function(pos, placer, itemstack, pointed_thing) + on_rightclick(pos) + end, + after_tube_update = function(node, pos, out_dir, peer_pos, peer_in_dir) + techage.switch_axles(pos, node.name == "techage:gearbox_on") + end, }) minetest.register_craft({ diff --git a/textures/techage_appl_ta4_cable.png b/textures/techage_appl_ta4_cable.png index 2db7e5f6b95b1e22838bd99fbf29c0e1fe0c4c15..05f1251db03bb5aac0a371dac674e4d6805927e3 100644 GIT binary patch delta 212 zcmdnN_=9nRgfs^m0|P^GRn-?D#g^pl?!xdN1Q+aGK6#>@L_K?nr>`sfV=h)sQ+3UT zbYGyVR!)x`(@W3&&wh;2U!qPx)l6m6Lk*~%feZ|*n1%bR7PKV;UBuw&>gTe~ HDWM4fAOK5` delta 168 zcmeytxPx(mL_G^L0|P^2NcwRg#ggvm>&U>cv7h@-A}f&3SRCZ;#IWw1%u67Lv%n*= zn1O*?7=#%aX3dcR3i1c|gt+=-76O?-u#Um#M3pgT;`AsWhq)xkFPOo->g&8#J0Mrt z)5S4F<9u?0#J>j5fB;6bGteN!}{Ay?P+e0u7eEoboFyt I=akR{029(K?EnA( diff --git a/wind_turbine/rotor.lua b/wind_turbine/rotor.lua index 596ed49..0de8d51 100644 --- a/wind_turbine/rotor.lua +++ b/wind_turbine/rotor.lua @@ -113,6 +113,7 @@ local function start_rotor(pos, mem) end mem.providing = true + mem.delivered = 0 power.generator_start(pos, mem, PWR_PERF) local hash = minetest.hash_node_position(pos) if Rotors[hash] then @@ -122,6 +123,7 @@ end local function stop_rotor(pos, mem) mem.providing = false + mem.delivered = 0 power.generator_stop(pos, mem) local hash = minetest.hash_node_position(pos) if Rotors[hash] then @@ -147,7 +149,7 @@ local function node_timer(pos, elapsed) end end if mem.providing then - power.generator_alive(pos, mem) + mem.delivered = power.generator_alive(pos, mem) end return true end @@ -165,34 +167,7 @@ minetest.register_node("techage:ta4_wind_turbine", { "techage_rotor.png^techage_appl_open.png", }, - on_construct = tubelib2.init_mem, - - after_place_node = function(pos, placer) - local meta = M(pos) - -- secondary 'after_place_node', called by power. Don't use tubelib2.init_mem(pos)!!! - local mem = tubelib2.get_mem(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) - mem.providing = false - mem.running = true - add_rotor(pos, mem, placer:get_player_name()) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, - on_timer = node_timer, - - 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) - tubelib2.del_mem(pos) - end, - paramtype2 = "facedir", groups = {cracky=2, crumbly=2, choppy=2}, is_ground_content = false, @@ -230,6 +205,28 @@ minetest.register_entity("techage:rotor_ent", {initial_properties = { 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 mem = tubelib2.init_mem(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) + mem.providing = false + mem.running = true + add_rotor(pos, mem, 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) + tubelib2.del_mem(pos) + end, }) techage.register_node({"techage:ta4_wind_turbine"}, {