summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNovatux <nathanael.courant@laposte.net>2013-08-29 09:34:40 +0200
committerShadowNinja <noreply@gmail.com>2013-10-04 10:48:39 -0400
commitf4ac2b8c1ef97a8adf29501f5599fb8adb4df00c (patch)
tree347b1c81de0e0601fdbd6f6022840f0f6804a7d2
parent90208930e533379acbc1636e09f85d5f9b6493ca (diff)
Make power distribution more efficient.
Conflicts: technic/machines/register/cables.lua
-rw-r--r--technic/machines/register/cables.lua4
-rw-r--r--technic/machines/switching_station.lua44
-rw-r--r--technic/register.lua2
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] = {}