鏡像自
https://github.com/minetest-mods/technic.git
已同步 2025-07-03 00:30:36 +02:00
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.
此提交包含在:
@ -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
|
||||
|
新增問題並參考
封鎖使用者