diff options
| author | Jeija <norrepli@gmail.com> | 2016-08-30 18:24:08 +0200 | 
|---|---|---|
| committer | Jeija <norrepli@gmail.com> | 2016-08-30 18:24:08 +0200 | 
| commit | 89153f6909558d1ba619b30a8c792c5f8493f7bc (patch) | |
| tree | d12c3ef05e2cb53049259f30fe76e7bece8e0543 | |
| parent | 8e6536ca2edd51175733b972fb24014b342681a8 (diff) | |
Further simplification of turnon/turnoff
| -rw-r--r-- | mesecons/actionqueue.lua | 6 | ||||
| -rw-r--r-- | mesecons/internal.lua | 42 | 
2 files changed, 15 insertions, 33 deletions
| diff --git a/mesecons/actionqueue.lua b/mesecons/actionqueue.lua index e300ea7..f3479ce 100644 --- a/mesecons/actionqueue.lua +++ b/mesecons/actionqueue.lua @@ -87,7 +87,11 @@ minetest.register_globalstep(function (dtime)  end)  function mesecon.queue:execute(action) -	mesecon.queue.funcs[action.func](action.pos, unpack(action.params)) +	-- ignore if action queue function name doesn't exist, +	-- (e.g. in case the action queue savegame was written by an old mesecons version) +	if mesecon.queue.funcs[action.func] then +		mesecon.queue.funcs[action.func](action.pos, unpack(action.params)) +	end  end diff --git a/mesecons/internal.lua b/mesecons/internal.lua index 5309e24..c125d3f 100644 --- a/mesecons/internal.lua +++ b/mesecons/internal.lua @@ -375,30 +375,24 @@ function mesecon.turnon(pos, link)  	local frontiers = {{pos = pos, link = link}}  	local depth = 1 -	while frontiers[depth] do -		local f = frontiers[depth] +	while frontiers[1] do +		local f = table.remove(frontiers, 1)  		local node = mesecon.get_node_force(f.pos)  		if not node then  			-- Area does not exist; do nothing  		elseif mesecon.is_conductor_off(node, f.link) then  			local rules = mesecon.conductor_get_rules(node) -			local neighborlinks = {}  			-- call turnon on neighbors  			for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do  				local np = vector.add(f.pos, r) -				neighborlinks[minetest.hash_node_position(np)] = mesecon.rules_link_rule_all(f.pos, r) +				for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do +					table.insert(frontiers, {pos = np, link = l}) +				end  			end  			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 -			end  		elseif mesecon.is_effector(node.name) then  			mesecon.changesignal(f.pos, node, f.link, mesecon.state.on, depth)  			if mesecon.is_effector_off(node.name) then @@ -409,39 +403,28 @@ function mesecon.turnon(pos, link)  	end  end -mesecon.queue:add_function("turnon", function(pos, rulename, recdepth) -	mesecon.turnon(pos, rulename, recdepth) -end) -  function mesecon.turnoff(pos, link)  	local frontiers = {{pos = pos, link = link}}  	local depth = 1 -	while frontiers[depth] do -		local f = frontiers[depth] +	while frontiers[1] do +		local f = table.remove(frontiers, 1)  		local node = mesecon.get_node_force(f.pos) -		-- area not loaded, postpone action  		if not node then  			-- Area does not exist; do nothing  		elseif mesecon.is_conductor_on(node, f.link) then  			local rules = mesecon.conductor_get_rules(node) -			local neighborlinks = {}  			-- call turnoff on neighbors  			for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do  				local np = vector.add(f.pos, r) -				neighborlinks[minetest.hash_node_position(np)] = mesecon.rules_link_rule_all(f.pos, r) +				for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do +					table.insert(frontiers, {pos = np, link = l}) +				end  			end  			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 -			end  		elseif mesecon.is_effector(node.name) then  			mesecon.changesignal(f.pos, node, f.link, mesecon.state.off, depth)  			if mesecon.is_effector_on(node.name) and not mesecon.is_powered(f.pos) then @@ -452,11 +435,6 @@ function mesecon.turnoff(pos, link)  	end  end -mesecon.queue:add_function("turnoff", function(pos, rulename, recdepth) -	mesecon.turnoff(pos, rulename, recdepth) -end) - -  function mesecon.connected_to_receptor(pos, link)  	local node = mesecon.get_node_force(pos)  	if not node then return false end | 
