Only skip conductors with flat rules in turnon/off

This commit is contained in:
Jude Melton-Houghton 2021-07-28 14:22:57 -04:00 committed by sfan5
parent e15c55c066
commit 9323445182
1 changed files with 39 additions and 26 deletions

View File

@ -384,21 +384,27 @@ function mesecon.turnon(pos, link)
if not node then if not node then
-- Area does not exist; do nothing -- Area does not exist; do nothing
pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true
elseif mesecon.is_conductor_off(node, f.link) then elseif mesecon.is_conductor(node.name) then
local rules = mesecon.conductor_get_rules(node) local rules = mesecon.conductor_get_rules(node)
-- Call turnon on neighbors if mesecon.is_conductor_off(node, f.link) then
for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do -- Call turnon on neighbors
local np = vector.add(f.pos, r) for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do
if not pos_can_be_skipped[minetest.hash_node_position(np)] then local np = vector.add(f.pos, r)
for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do if not pos_can_be_skipped[minetest.hash_node_position(np)] then
frontiers:add({pos = np, link = l}) for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do
frontiers:add({pos = np, link = l})
end
end end
end end
mesecon.swap_node_force(f.pos, mesecon.get_conductor_on(node, f.link))
end end
mesecon.swap_node_force(f.pos, mesecon.get_conductor_on(node, f.link)) -- Only conductors with flat rules can be reliably skipped later
pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true if not rules[1] or rules[1].x then
pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true
end
elseif mesecon.is_effector(node.name) then elseif mesecon.is_effector(node.name) then
mesecon.changesignal(f.pos, node, f.link, mesecon.state.on, depth) mesecon.changesignal(f.pos, node, f.link, mesecon.state.on, depth)
if mesecon.is_effector_off(node.name) then if mesecon.is_effector_off(node.name) then
@ -440,30 +446,37 @@ function mesecon.turnoff(pos, link)
if not node then if not node then
-- Area does not exist; do nothing -- Area does not exist; do nothing
pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true
elseif mesecon.is_conductor_on(node, f.link) then elseif mesecon.is_conductor(node.name) then
local rules = mesecon.conductor_get_rules(node) local rules = mesecon.conductor_get_rules(node)
for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do
local np = vector.add(f.pos, r)
if not pos_can_be_skipped[minetest.hash_node_position(np)] then if mesecon.is_conductor_on(node, f.link) then
-- Check if an onstate receptor is connected. If that is the case, for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do
-- abort this turnoff process by returning false. `receptor_off` will local np = vector.add(f.pos, r)
-- discard all the changes that we made in the voxelmanip:
if mesecon.rules_link_rule_all_inverted(f.pos, r)[1] then if not pos_can_be_skipped[minetest.hash_node_position(np)] then
if mesecon.is_receptor_on(mesecon.get_node_force(np).name) then -- Check if an onstate receptor is connected. If that is the case,
return false -- abort this turnoff process by returning false. `receptor_off` will
-- discard all the changes that we made in the voxelmanip:
if mesecon.rules_link_rule_all_inverted(f.pos, r)[1] then
if mesecon.is_receptor_on(mesecon.get_node_force(np).name) then
return false
end
end
-- Call turnoff on neighbors
for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do
frontiers:add({pos = np, link = l})
end end
end end
-- Call turnoff on neighbors
for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do
frontiers:add({pos = np, link = l})
end
end end
mesecon.swap_node_force(f.pos, mesecon.get_conductor_off(node, f.link))
end end
mesecon.swap_node_force(f.pos, mesecon.get_conductor_off(node, f.link)) -- Only conductors with flat rules can be reliably skipped later
pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true if not rules[1] or rules[1].x then
pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true
end
elseif mesecon.is_effector(node.name) then elseif mesecon.is_effector(node.name) then
table.insert(signals, { table.insert(signals, {
pos = f.pos, pos = f.pos,