mirror of
				https://github.com/minetest-mods/mesecons.git
				synced 2025-11-04 04:55:26 +01:00 
			
		
		
		
	Fix #189, clean code and update documentation
This commit is contained in:
		@@ -1,50 +1,50 @@
 | 
			
		||||
-- Internal.lua - The core of mesecons
 | 
			
		||||
--
 | 
			
		||||
-- For more practical developer resources see mesecons.tk
 | 
			
		||||
-- For more practical developer resources see http://mesecons.net/developers.php
 | 
			
		||||
--
 | 
			
		||||
-- Function overview
 | 
			
		||||
-- mesecon.get_effector(nodename)     --> Returns the mesecons.effector -specifictation in the nodedef by the nodename
 | 
			
		||||
-- mesecon.get_receptor(nodename)     --> Returns the mesecons.receptor -specifictation in the nodedef by the nodename
 | 
			
		||||
-- mesecon.get_conductor(nodename)    --> Returns the mesecons.conductor-specifictation in the nodedef by the nodename
 | 
			
		||||
-- mesecon.get_any_inputrules (node)  --> Returns the rules of a node if it is a conductor or an effector
 | 
			
		||||
-- mesecon.get_any_outputrules (node) --> Returns the rules of a node if it is a conductor or a receptor
 | 
			
		||||
-- mesecon.get_effector(nodename)	--> Returns the mesecons.effector -specifictation in the nodedef by the nodename
 | 
			
		||||
-- mesecon.get_receptor(nodename)	--> Returns the mesecons.receptor -specifictation in the nodedef by the nodename
 | 
			
		||||
-- mesecon.get_conductor(nodename)	--> Returns the mesecons.conductor-specifictation in the nodedef by the nodename
 | 
			
		||||
-- mesecon.get_any_inputrules (node)	--> Returns the rules of a node if it is a conductor or an effector
 | 
			
		||||
-- mesecon.get_any_outputrules (node)	--> Returns the rules of a node if it is a conductor or a receptor
 | 
			
		||||
 | 
			
		||||
-- RECEPTORS
 | 
			
		||||
-- mesecon.is_receptor(nodename)     --> Returns true if nodename is a receptor
 | 
			
		||||
-- mesecon.is_receptor_on(nodename)  --> Returns true if nodename is an receptor with state = mesecon.state.on
 | 
			
		||||
-- mesecon.is_receptor_off(nodename) --> Returns true if nodename is an receptor with state = mesecon.state.off
 | 
			
		||||
-- mesecon.receptor_get_rules(node)  --> Returns the rules of the receptor (mesecon.rules.default if none specified)
 | 
			
		||||
-- mesecon.is_receptor(nodename)	--> Returns true if nodename is a receptor
 | 
			
		||||
-- mesecon.is_receptor_on(nodename	--> Returns true if nodename is an receptor with state = mesecon.state.on
 | 
			
		||||
-- mesecon.is_receptor_off(nodename)	--> Returns true if nodename is an receptor with state = mesecon.state.off
 | 
			
		||||
-- mesecon.receptor_get_rules(node)	--> Returns the rules of the receptor (mesecon.rules.default if none specified)
 | 
			
		||||
 | 
			
		||||
-- EFFECTORS
 | 
			
		||||
-- mesecon.is_effector(nodename)     --> Returns true if nodename is an effector
 | 
			
		||||
-- mesecon.is_effector_on(nodename)  --> Returns true if nodename is an effector with nodedef.mesecons.effector.action_off
 | 
			
		||||
-- mesecon.is_effector_off(nodename) --> Returns true if nodename is an effector with nodedef.mesecons.effector.action_on
 | 
			
		||||
-- mesecon.effector_get_rules(node)  --> Returns the input rules of the effector (mesecon.rules.default if none specified)
 | 
			
		||||
-- mesecon.is_effector(nodename)	--> Returns true if nodename is an effector
 | 
			
		||||
-- mesecon.is_effector_on(nodename)	--> Returns true if nodename is an effector with nodedef.mesecons.effector.action_off
 | 
			
		||||
-- mesecon.is_effector_off(nodename)	--> Returns true if nodename is an effector with nodedef.mesecons.effector.action_on
 | 
			
		||||
-- mesecon.effector_get_rules(node)	--> Returns the input rules of the effector (mesecon.rules.default if none specified)
 | 
			
		||||
 | 
			
		||||
-- SIGNALS
 | 
			
		||||
-- mesecon.activate(pos, node, depth)		--> Activates   the effector node at the specific pos (calls nodedef.mesecons.effector.action_on), higher depths are executed later
 | 
			
		||||
-- mesecon.deactivate(pos, node, depth)		--> Deactivates the effector node at the specific pos (calls nodedef.mesecons.effector.action_off), higher depths are executed later
 | 
			
		||||
-- mesecon.activate(pos, node, depth)				--> Activates   the effector node at the specific pos (calls nodedef.mesecons.effector.action_on), higher depths are executed later
 | 
			
		||||
-- mesecon.deactivate(pos, node, depth)				--> Deactivates the effector node at the specific pos (calls nodedef.mesecons.effector.action_off), higher depths are executed later
 | 
			
		||||
-- mesecon.changesignal(pos, node, rulename, newstate, depth)	--> Changes     the effector node at the specific pos (calls nodedef.mesecons.effector.action_change), higher depths are executed later
 | 
			
		||||
 | 
			
		||||
-- CONDUCTORS
 | 
			
		||||
-- mesecon.is_conductor(nodename)     --> Returns true if nodename is a conductor
 | 
			
		||||
-- mesecon.is_conductor_on(node)  --> Returns true if node is a conductor with state = mesecon.state.on
 | 
			
		||||
-- mesecon.is_conductor_off(node) --> Returns true if node is a conductor with state = mesecon.state.off
 | 
			
		||||
-- mesecon.get_conductor_on(node_off) --> Returns the onstate  nodename of the conductor
 | 
			
		||||
-- mesecon.get_conductor_off(node_on) --> Returns the offstate nodename of the conductor
 | 
			
		||||
-- mesecon.conductor_get_rules(node)  --> Returns the input+output rules of a conductor (mesecon.rules.default if none specified)
 | 
			
		||||
-- mesecon.is_conductor(nodename)	--> Returns true if nodename is a conductor
 | 
			
		||||
-- mesecon.is_conductor_on(node		--> Returns true if node is a conductor with state = mesecon.state.on
 | 
			
		||||
-- mesecon.is_conductor_off(node)	--> Returns true if node is a conductor with state = mesecon.state.off
 | 
			
		||||
-- mesecon.get_conductor_on(node_off)	--> Returns the onstate  nodename of the conductor
 | 
			
		||||
-- mesecon.get_conductor_off(node_on)	--> Returns the offstate nodename of the conductor
 | 
			
		||||
-- mesecon.conductor_get_rules(node)	--> Returns the input+output rules of a conductor (mesecon.rules.default if none specified)
 | 
			
		||||
 | 
			
		||||
-- HIGH-LEVEL Internals
 | 
			
		||||
-- mesecon.is_power_on(pos)             --> Returns true if pos emits power in any way
 | 
			
		||||
-- mesecon.is_power_off(pos)            --> Returns true if pos does not emit power in any way
 | 
			
		||||
-- mesecon.turnon(pos, rulename)        --> Returns true  whatever there is at pos. Calls itself for connected nodes (if pos is a conductor) --> recursive, the rulename is the name of the input rule that caused calling turnon; Uses third parameter recdepth internally to determine how far away the current node is from the initial pos as it uses recursion
 | 
			
		||||
-- mesecon.turnoff(pos, rulename)       --> Turns off whatever there is at pos. Calls itself for connected nodes (if pos is a conductor) --> recursive, the rulename is the name of the input rule that caused calling turnoff; Uses third parameter recdepth internally to determine how far away the current node is from the initial pos as it uses recursion
 | 
			
		||||
-- mesecon.connected_to_receptor(pos, link)   --> Returns true if pos is connected to a receptor directly or via conductors; calls itself if pos is a conductor --> recursive
 | 
			
		||||
-- mesecon.rules_link(output, input, dug_outputrules) --> Returns true if outputposition + outputrules = inputposition and inputposition + inputrules = outputposition (if the two positions connect)
 | 
			
		||||
-- mesecon.rules_link_anydir(outp., inp., d_outpr.)   --> Same as rules mesecon.rules_link but also returns true if output and input are swapped
 | 
			
		||||
-- mesecon.is_powered(pos)              --> Returns true if pos is powered by a receptor or a conductor
 | 
			
		||||
-- mesecon.is_power_on(pos)				--> Returns true if pos emits power in any way
 | 
			
		||||
-- mesecon.is_power_off(pos)				--> Returns true if pos does not emit power in any way
 | 
			
		||||
-- mesecon.turnon(pos, link) 				--> link is the input rule that caused calling turnon, turns on every connected node, iterative
 | 
			
		||||
-- mesecon.turnoff(pos, link)				--> link is the input rule that caused calling turnoff, turns off every connected node, iterative
 | 
			
		||||
-- mesecon.connected_to_receptor(pos, link)		--> Returns true if pos is connected to a receptor directly or via conductors, iterative
 | 
			
		||||
-- mesecon.rules_link(output, input, dug_outputrules)	--> Returns true if outputposition + outputrules = inputposition and inputposition + inputrules = outputposition (if the two positions connect)
 | 
			
		||||
-- mesecon.rules_link_anydir(outp., inp., d_outpr.)	--> Same as rules mesecon.rules_link but also returns true if output and input are swapped
 | 
			
		||||
-- mesecon.is_powered(pos)				--> Returns true if pos is powered by a receptor or a conductor
 | 
			
		||||
 | 
			
		||||
-- RULES ROTATION helpsers
 | 
			
		||||
-- RULES ROTATION helpers
 | 
			
		||||
-- mesecon.rotate_rules_right(rules)
 | 
			
		||||
-- mesecon.rotate_rules_left(rules)
 | 
			
		||||
-- mesecon.rotate_rules_up(rules)
 | 
			
		||||
@@ -82,7 +82,6 @@ function mesecon.get_any_outputrules (node)
 | 
			
		||||
	elseif mesecon.is_receptor(node.name) then
 | 
			
		||||
		return mesecon.receptor_get_rules(node)
 | 
			
		||||
	end
 | 
			
		||||
	return false
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function mesecon.get_any_inputrules (node)
 | 
			
		||||
@@ -91,7 +90,11 @@ function mesecon.get_any_inputrules (node)
 | 
			
		||||
	elseif mesecon.is_effector(node.name) then
 | 
			
		||||
		return mesecon.effector_get_rules(node)
 | 
			
		||||
	end
 | 
			
		||||
	return false
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function mesecon.get_any_rules (node)
 | 
			
		||||
	return mesecon.mergetable(mesecon.get_any_inputrules(node) or {},
 | 
			
		||||
		mesecon.get_any_outputrules(node) or {})
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Receptors
 | 
			
		||||
@@ -200,8 +203,8 @@ end
 | 
			
		||||
 | 
			
		||||
-- Deactivation
 | 
			
		||||
mesecon.queue:add_function("deactivate", function (pos, rulename)
 | 
			
		||||
	node = minetest.get_node(pos)
 | 
			
		||||
	effector = mesecon.get_effector(node.name)
 | 
			
		||||
	local node = minetest.get_node(pos)
 | 
			
		||||
	local effector = mesecon.get_effector(node.name)
 | 
			
		||||
 | 
			
		||||
	if effector and effector.action_off then
 | 
			
		||||
		effector.action_off(pos, node, rulename)
 | 
			
		||||
@@ -360,9 +363,7 @@ function mesecon.turnon(pos, link)
 | 
			
		||||
		-- area not loaded, postpone action
 | 
			
		||||
		if not node then
 | 
			
		||||
			mesecon.queue:add_action(f.pos, "turnon", {link}, nil, true)
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		if mesecon.is_conductor_off(node, f.link) then
 | 
			
		||||
		elseif mesecon.is_conductor_off(node, f.link) then
 | 
			
		||||
			local rules = mesecon.conductor_get_rules(node)
 | 
			
		||||
 | 
			
		||||
			minetest.swap_node(f.pos, {name = mesecon.get_conductor_on(node, f.link),
 | 
			
		||||
@@ -408,9 +409,7 @@ function mesecon.turnoff(pos, link)
 | 
			
		||||
		-- area not loaded, postpone action
 | 
			
		||||
		if not node then
 | 
			
		||||
			mesecon.queue:add_action(f.pos, "turnoff", {link}, nil, true)
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		if mesecon.is_conductor_on(node, f.link) then
 | 
			
		||||
		elseif mesecon.is_conductor_on(node, f.link) then
 | 
			
		||||
			local rules = mesecon.conductor_get_rules(node)
 | 
			
		||||
 | 
			
		||||
			minetest.swap_node(f.pos, {name = mesecon.get_conductor_off(node, f.link),
 | 
			
		||||
@@ -476,6 +475,7 @@ function mesecon.find_receptor_on(pos, link)
 | 
			
		||||
		local f = frontiers[depth]
 | 
			
		||||
		local node = minetest.get_node_or_nil(f.pos)
 | 
			
		||||
 | 
			
		||||
		if not node then return false end
 | 
			
		||||
		if mesecon.is_receptor_on(node.name) then return true end
 | 
			
		||||
		if mesecon.is_conductor_on(node, f.link) then
 | 
			
		||||
			local rules = mesecon.conductor_get_rules(node)
 | 
			
		||||
 
 | 
			
		||||
@@ -18,8 +18,7 @@ local wire_getconnect = function (from_pos, self_pos)
 | 
			
		||||
		if (minetest.registered_nodes[node.name].mesecon_wire) then
 | 
			
		||||
			rules = mesecon.rules.default
 | 
			
		||||
		else
 | 
			
		||||
			rules = mesecon.get_any_inputrules(node) or {}
 | 
			
		||||
			rules = mesecon.mergetable(mesecon.get_any_outputrules(node) or {}, rules)
 | 
			
		||||
			rules = mesecon.get_any_rules(node)
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		for _, r in ipairs(mesecon.flattenrules(rules)) do
 | 
			
		||||
@@ -79,8 +78,7 @@ local update_on_place_dig = function (pos, node)
 | 
			
		||||
	and minetest.registered_nodes[node.name].mesecon_wire then
 | 
			
		||||
		rules = mesecon.rules.default
 | 
			
		||||
	else
 | 
			
		||||
		rules = mesecon.get_any_inputrules(node) or {}
 | 
			
		||||
		rules = mesecon.mergetable(mesecon.get_any_outputrules(node) or {}, rules)
 | 
			
		||||
		rules = mesecon.get_any_rules(node)
 | 
			
		||||
	end
 | 
			
		||||
	if (not rules) then return end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user