From d119a6748264a4f9825eebdd4ddeb2421cc4784a Mon Sep 17 00:00:00 2001 From: coil <51716565+coil0@users.noreply.github.com> Date: Mon, 26 Aug 2019 17:45:11 +0000 Subject: [PATCH] Refactor switching station ABMs (#508) When the function is defined inside the ABM, a new closure is allocated every time the ABM runs. Since the action function is already way too long, it's better for readability and performance to split it out. --- technic/machines/switching_station.lua | 33 ++++++++++++-------------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/technic/machines/switching_station.lua b/technic/machines/switching_station.lua index d645847..7f3a0b9 100644 --- a/technic/machines/switching_station.lua +++ b/technic/machines/switching_station.lua @@ -119,13 +119,13 @@ end -- Generic function to add found connected nodes to the right classification array local check_node_subp = function(PR_nodes, RE_nodes, BA_nodes, SP_nodes, all_nodes, pos, machines, tier, sw_pos, from_below, network_id, queue) technic.get_or_load_node(pos) - local meta = minetest.get_meta(pos) local name = minetest.get_node(pos).name if technic.is_tier_cable(name, tier) then add_cable_node(all_nodes, pos,network_id, queue) elseif machines[name] then --dprint(name.." is a "..machines[name]) + local meta = minetest.get_meta(pos) meta:set_string(tier.."_network",minetest.pos_to_string(sw_pos)) if machines[name] == technic.producer then add_network_node(PR_nodes, pos, network_id) @@ -227,6 +227,20 @@ minetest.register_chatcommand("powerctrl", { end }) +-- Run all the nodes +local function run_nodes(list, run_stage) + for _, pos in ipairs(list) do + technic.get_or_load_node(pos) + local node = minetest.get_node_or_nil(pos) + if node and node.name then + local nodedef = minetest.registered_nodes[node.name] + if nodedef and nodedef.technic_run then + nodedef.technic_run(pos, node, run_stage) + end + end + end +end + minetest.register_abm({ nodenames = {"technic:switching_station"}, label = "Switching Station", -- allows the mtt profiler to profile this abm individually @@ -281,21 +295,6 @@ minetest.register_abm({ return end - -- Run all the nodes - local function run_nodes(list, run_stage) - for _, pos2 in ipairs(list) do - technic.get_or_load_node(pos2) - local node2 = minetest.get_node(pos2) - local nodedef - if node2 and node2.name then - nodedef = minetest.registered_nodes[node2.name] - end - if nodedef and nodedef.technic_run then - nodedef.technic_run(pos2, node2, run_stage) - end - end - end - run_nodes(PR_nodes, technic.producer) run_nodes(RE_nodes, technic.receiver) run_nodes(BA_nodes, technic.battery) @@ -467,7 +466,6 @@ minetest.register_abm({ interval = 1, chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) - local meta = minetest.get_meta(pos) for tier, machines in pairs(technic.machines) do if machines[node.name] and switching_station_timeout_count(pos, tier) then local nodedef = minetest.registered_nodes[node.name] @@ -493,7 +491,6 @@ minetest.register_abm({ interval = 1, chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) - local meta = minetest.get_meta(pos) local pos1 = {x=pos.x,y=pos.y-1,z=pos.z} local tier = technic.get_cable_tier(minetest.get_node(pos1).name) if not tier then return end