From f4ac2b8c1ef97a8adf29501f5599fb8adb4df00c Mon Sep 17 00:00:00 2001 From: Novatux Date: Thu, 29 Aug 2013 09:34:40 +0200 Subject: [PATCH] Make power distribution more efficient. Conflicts: technic/machines/register/cables.lua --- technic/machines/register/cables.lua | 4 +++ technic/machines/switching_station.lua | 44 +++++++++++++++++++------- technic/register.lua | 2 ++ 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/technic/machines/register/cables.lua b/technic/machines/register/cables.lua index 9fbd0fd..39b3f08 100644 --- a/technic/machines/register/cables.lua +++ b/technic/machines/register/cables.lua @@ -58,6 +58,8 @@ minetest.register_on_placenode(function(pos, node) for machine_name, _ in pairs(machine_list) do if node.name == machine_name then technic.update_cables(pos, tier, true) + technic.networks = {} + return end end end @@ -69,6 +71,8 @@ minetest.register_on_dignode(function(pos, node) for machine_name, _ in pairs(machine_list) do if node.name == machine_name then technic.update_cables(pos, tier, true) + technic.networks = {} + return end end end diff --git a/technic/machines/switching_station.lua b/technic/machines/switching_station.lua index de9b4aa..25310eb 100644 --- a/technic/machines/switching_station.lua +++ b/technic/machines/switching_station.lua @@ -128,6 +128,35 @@ local traverse_network = function(PR_nodes, RE_nodes, BA_nodes, all_nodes, i, ma end end +local touch_nodes = function(list, tier) + for _, pos in ipairs(list) do + local meta = minetest.get_meta(pos) + meta:set_int(tier.."_EU_timeout", 2) -- Touch node + end +end + +local get_network = function(pos1, tier) + local cached = technic.networks[pos1] + if cached and cached.tier == tier then + touch_nodes(cached.PR_nodes, tier) + touch_nodes(cached.BA_nodes, tier) + touch_nodes(cached.RE_nodes, tier) + return cached.PR_nodes, cached.BA_nodes, cached.RE_nodes + end + local i = 1 + local PR_nodes = {} + local BA_nodes = {} + local RE_nodes = {} + local all_nodes = {pos1} + repeat + traverse_network(PR_nodes, RE_nodes, BA_nodes, all_nodes, + i, technic.machines[tier], tier) + i = i + 1 + until all_nodes[i] == nil + technic.networks[pos1] = {tier = tier, PR_nodes = PR_nodes, RE_nodes = RE_nodes, BA_nodes = BA_nodes} + return PR_nodes, BA_nodes, RE_nodes +end + ----------------------------------------------- -- The action code for the switching station -- ----------------------------------------------- @@ -145,24 +174,17 @@ minetest.register_abm({ local RE_EU = 0 -- EUs to RE nodes local tier = "" - local all_nodes = {} - local PR_nodes = {} - local BA_nodes = {} - local RE_nodes = {} + local PR_nodes + local BA_nodes + local RE_nodes -- Which kind of network are we on: pos1 = {x=pos.x, y=pos.y-1, z=pos.z} - all_nodes[1] = pos1 local name = minetest.get_node(pos1).name local tier = technic.get_cable_tier(name) if tier then - local i = 1 - repeat - traverse_network(PR_nodes, RE_nodes, BA_nodes, all_nodes, - i, technic.machines[tier], tier) - i = i + 1 - until all_nodes[i] == nil + PR_nodes, RE_nodes, BA_nodes = get_network(pos1, tier) else --dprint("Not connected to a network") meta:set_string("infotext", "Switching Station - no network") diff --git a/technic/register.lua b/technic/register.lua index 0dc321d..38766d9 100644 --- a/technic/register.lua +++ b/technic/register.lua @@ -7,6 +7,8 @@ technic.battery = "BA" technic.machines = {} technic.power_tools = {} +technic.networks = {} + function technic.register_tier(tier, description) technic.machines[tier] = {}