From 718a5beda197cd0a775fd41aedfb5b1bbd5d1d8b Mon Sep 17 00:00:00 2001 From: ZettaScript Date: Thu, 20 Oct 2022 17:56:10 +0200 Subject: [PATCH] Supply converter: demany only the needed power (#577) Supply converter demands only the needed power to satisfy the demand on the output network. It can still be too much if the output network has other power sources, because supply is not taken in account. This surplus of energy can be used to charge batteries. --- technic/machines/supply_converter.lua | 41 ++++++++++++++++++++------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/technic/machines/supply_converter.lua b/technic/machines/supply_converter.lua index 24601c6..826c94f 100644 --- a/technic/machines/supply_converter.lua +++ b/technic/machines/supply_converter.lua @@ -120,7 +120,7 @@ local run = function(pos, node, run_stage) return end - local remain = 0.9 + local efficiency = 0.9 -- Machine information local machine_name = S("Supply Converter") local meta = minetest.get_meta(pos) @@ -133,7 +133,6 @@ local run = function(pos, node, run_stage) enabled = enabled == "1" end enabled = enabled and (meta:get_int("mesecon_mode") == 0 or meta:get_int("mesecon_effect") ~= 0) - local demand = enabled and meta:get_int("power") or 0 local pos_up = {x=pos.x, y=pos.y+1, z=pos.z} local pos_down = {x=pos.x, y=pos.y-1, z=pos.z} @@ -144,14 +143,36 @@ local run = function(pos, node, run_stage) local to = technic.get_cable_tier(name_down) if from and to then - local input = meta:get_int(from.."_EU_input") - meta:set_int(from.."_EU_demand", demand) - meta:set_int(from.."_EU_supply", 0) - meta:set_int(to.."_EU_demand", 0) - meta:set_int(to.."_EU_supply", input * remain) - meta:set_string("infotext", S("@1 (@2 @3 -> @4 @5)", machine_name, - technic.EU_string(input), from, - technic.EU_string(input * remain), to)) + -- Get the "to" network switching station for EU demand calculation + local network_hash = technic.cables[minetest.hash_node_position(pos_down)] + local network = network_hash and minetest.get_position_from_hash(network_hash) + local sw_pos = network and {x=network.x,y=network.y+1,z=network.z} + local timeout = 0 + for tier in pairs(technic.machines) do + -- Supply converter must be connected to a network + timeout = math.max(meta:get_int(tier.."_EU_timeout"), timeout) + end + if timeout > 0 and sw_pos and minetest.get_node(sw_pos).name == "technic:switching_station" then + local sw_meta = minetest.get_meta(sw_pos) + local demand = 0 + if enabled then + -- Reverse evaluate the required machine and round to a nice number + demand = 100 * math.ceil((sw_meta:get_int("demand") / efficiency) / 100) + -- Do not draw more than the limit + demand = math.min(demand, meta:get_int("power")) + end + + local input = meta:get_int(from.."_EU_input") -- actual input + meta:set_int(from.."_EU_demand", demand) -- desired input + meta:set_int(from.."_EU_supply", 0) + meta:set_int(to.."_EU_demand", 0) + meta:set_int(to.."_EU_supply", input * efficiency) + meta:set_string("infotext", S("@1 (@2 @3 -> @4 @5)", machine_name, + technic.EU_string(input), from, + technic.EU_string(input * efficiency), to)) + else + meta:set_string("infotext",S("%s Has No Network"):format(machine_name)) + end else meta:set_string("infotext", S("%s Has Bad Cabling"):format(machine_name)) if to then