coil
2019-08-26 d119a6748264a4f9825eebdd4ddeb2421cc4784a
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.
1 files modified
33 ■■■■ changed files
technic/machines/switching_station.lua 33 ●●●● patch | view | raw | blame | history
technic/machines/switching_station.lua
@@ -119,13 +119,13 @@
-- 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 @@
    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
@@ -279,21 +293,6 @@
            minetest.forceload_free_block(pos)
            minetest.forceload_free_block(pos1)
            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)
@@ -467,7 +466,6 @@
    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 @@
    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