From 8e6536ca2edd51175733b972fb24014b342681a8 Mon Sep 17 00:00:00 2001 From: Christopher Head Date: Sun, 21 Aug 2016 10:28:10 -0700 Subject: [PATCH] Simplify turnon/turnoff. It is no longer possible for get_node_force to return nil if the target location does, in fact, exist, because a VM will always be able to load it (whereas a forceload might not, due to exhaustion of forceload resources). So it is no longer necessary to handle get_node_force returning nil by deferring processing. --- mesecons/internal.lua | 61 ++++++++++--------------------------------- 1 file changed, 14 insertions(+), 47 deletions(-) diff --git a/mesecons/internal.lua b/mesecons/internal.lua index e11de4f..5309e24 100644 --- a/mesecons/internal.lua +++ b/mesecons/internal.lua @@ -379,42 +379,25 @@ function mesecon.turnon(pos, link) local f = frontiers[depth] local node = mesecon.get_node_force(f.pos) - -- area not loaded, postpone action if not node then - mesecon.queue:add_action(f.pos, "turnon", {f.link}, nil, true) + -- Area does not exist; do nothing elseif mesecon.is_conductor_off(node, f.link) then local rules = mesecon.conductor_get_rules(node) - - -- Success: If false, at least one neighboring node is unloaded, - -- postpone turning on action - local success = true local neighborlinks = {} -- call turnon on neighbors for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do local np = vector.add(f.pos, r) - - -- Neighboring node not loaded, postpone turning on current node - -- since we can't even know if neighboring node has matching rules - if not mesecon.get_node_force(np) then - success = false - break - else - neighborlinks[minetest.hash_node_position(np)] = mesecon.rules_link_rule_all(f.pos, r) - end + neighborlinks[minetest.hash_node_position(np)] = mesecon.rules_link_rule_all(f.pos, r) end - if success then - mesecon.swap_node_force(f.pos, mesecon.get_conductor_on(node, f.link)) + mesecon.swap_node_force(f.pos, mesecon.get_conductor_on(node, f.link)) - for npos, links in pairs(neighborlinks) do - -- links = all links to node, l = each single link - for _, l in ipairs(links) do - table.insert(frontiers, {pos = minetest.get_position_from_hash(npos), link = l}) - end + for npos, links in pairs(neighborlinks) do + -- links = all links to node, l = each single link + for _, l in ipairs(links) do + table.insert(frontiers, {pos = minetest.get_position_from_hash(npos), link = l}) end - else - mesecon.queue:add_action(f.pos, "turnon", {f.link}, nil, true) end elseif mesecon.is_effector(node.name) then mesecon.changesignal(f.pos, node, f.link, mesecon.state.on, depth) @@ -440,40 +423,24 @@ function mesecon.turnoff(pos, link) -- area not loaded, postpone action if not node then - mesecon.queue:add_action(f.pos, "turnoff", {f.link}, nil, true) + -- Area does not exist; do nothing elseif mesecon.is_conductor_on(node, f.link) then local rules = mesecon.conductor_get_rules(node) - - -- Success: If false, at least one neighboring node is unloaded, - -- postpone turning on action - local success = true local neighborlinks = {} -- call turnoff on neighbors for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do local np = vector.add(f.pos, r) - - -- Neighboring node not loaded, postpone turning off current node - -- since we can't even know if neighboring node has matching rules - if not mesecon.get_node_force(np) then - success = false - break - else - neighborlinks[minetest.hash_node_position(np)] = mesecon.rules_link_rule_all(f.pos, r) - end + neighborlinks[minetest.hash_node_position(np)] = mesecon.rules_link_rule_all(f.pos, r) end - if success then - mesecon.swap_node_force(f.pos, mesecon.get_conductor_off(node, f.link)) + mesecon.swap_node_force(f.pos, mesecon.get_conductor_off(node, f.link)) - for npos, links in pairs(neighborlinks) do - -- links = all links to node, l = each single link - for _, l in ipairs(links) do - table.insert(frontiers, {pos = minetest.get_position_from_hash(npos), link = l}) - end + for npos, links in pairs(neighborlinks) do + -- links = all links to node, l = each single link + for _, l in ipairs(links) do + table.insert(frontiers, {pos = minetest.get_position_from_hash(npos), link = l}) end - else - mesecon.queue:add_action(f.pos, "turnoff", {f.link}, nil, true) end elseif mesecon.is_effector(node.name) then mesecon.changesignal(f.pos, node, f.link, mesecon.state.off, depth)