From f4ac2b8c1ef97a8adf29501f5599fb8adb4df00c Mon Sep 17 00:00:00 2001
From: Novatux <nathanael.courant@laposte.net>
Date: Fri, 04 Oct 2013 16:48:39 +0200
Subject: [PATCH] Make power distribution more efficient.

---
 technic/register.lua                   |    2 ++
 technic/machines/register/cables.lua   |    4 ++++
 technic/machines/switching_station.lua |   44 +++++++++++++++++++++++++++++++++-----------
 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 @@
 		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 @@
 		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 @@
 	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 @@
 		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.machines    = {}
 technic.power_tools = {}
+technic.networks = {}
+
 
 function technic.register_tier(tier, description)
 	technic.machines[tier]    = {}

--
Gitblit v1.8.0