diff options
| author | Jeija <norrepli@gmail.com> | 2012-09-05 23:52:09 +0200 | 
|---|---|---|
| committer | Jeija <norrepli@gmail.com> | 2012-09-05 23:52:09 +0200 | 
| commit | 7e7e1de725c9df620e70d15a34e7da1bb811b355 (patch) | |
| tree | e568ac167f60b7fff0847cefe4e4523ae7c2698c | |
| parent | 69c6f1a44002976265d1108c1b5c1ab32e6d31eb (diff) | |
Code cleanup
| -rw-r--r-- | mesecons/init.lua | 151 | ||||
| -rw-r--r-- | mesecons/internal.lua | 240 | 
2 files changed, 113 insertions, 278 deletions
| diff --git a/mesecons/init.lua b/mesecons/init.lua index 1d1be6d..467ebf1 100644 --- a/mesecons/init.lua +++ b/mesecons/init.lua @@ -11,71 +11,7 @@  --  -- See the documentation on the forum for additional information, especially about crafting  -- ---Quick Developer documentation for the mesecon API ---================================================= --- ---RECEPTORS --- ---A receptor is a node that emits power, e.g. a solar panel, a switch or a power plant. ---Usually you create two blocks per receptor that have to be switched when switching the on/off state:  ---	# An off-state node (e.g. mesecons:mesecon_switch_off" ---	# An on-state node (e.g. mesecons:mesecon_switch_on" ---The on-state and off-state nodes should be registered in the mesecon api,  ---so that the Mesecon circuit can be recalculated. This can be done using --- ---mesecon:add_receptor_node(nodename) -- for on-state node ---mesecon:add_receptor_node_off(nodename) -- for off-state node ---example: mesecon:add_receptor_node("mesecons:mesecon_switch_on") --- ---Turning receptors on and off ---Usually the receptor has to turn on and off. For this, you have to ---	# Remove the node and replace it with the node in the other state (e.g. replace on by off) ---	# Send the event to the mesecon circuit by using the api functions ---		mesecon:receptor_on (pos, rules) } These functions take the position of your receptor ---		mesecon:receptor_off(pos, rules) } as their parameter. --- ---You can specify the rules using the rules parameter. If you don't want special rules, just leave it out ---e.g. if you want to use the "pressureplate" rules, you use this command: ---mesecon:receptor_on (pos, mesecon:get_rules("pressureplate")) ---The rules can be manipulated by several rotate functions: ---rules=mesecon:rotate_rules_right/left/up/down(rules) --- --- --- ---EFFECTORS --- ---A receptor is a node that uses power and transfers the signal to a mechanical, optical whatever ---event. e.g. the meselamp, the movestone or the removestone. --- ---There are two callback functions for receptors. ---	# function mesecon:register_on_signal_on (action) ---	# function mesecon:register_on_signal_off(action) --- ---These functions will be called for each block next to a mesecon conductor. --- ---Example: The removestone ---The removestone only uses one callback: The mesecon:register_on_signal_on function --- ---mesecon:register_on_signal_on(function(pos, node) -- As the action prameter you have to use a function ---	if node.name=="mesecons:removestone" then -- Check if it really is removestone. If you wouldn't use this, every node next to mesecons would be removed ---		minetest.env:remove_node(pos) -- The action: The removestone is removed ---	end -- end of if ---end) -- end of the function, )=end of the parameters of mesecon:register_on_signal_on --- ---CONDUCTORS: (new feature!! yay) ---You can specify your custom conductors using ---# mesecon:register_conductor(onstate, offstate) ---	onstate=the conductor's nodename when it is turned on ---	offstate=the conductor's nodename when it is turned off --- ---As you can see, conductors need an offstate and an onstate node, just like receptors ---mesecons:mesecon_on / mesecons:mesecon_off are the default conductors ---Other conductors connect to other conductors. It's always "the same energy" ---! As there is no special drawtype, conductors don't connect to others visually, ---but it works in fact. --- ---The function # mesecon:register_conductor(onstate, offstate) is the only thing you need to do, ---the mod does everything else for you (turn the conductor on and off...) +-- For developer documentation see the Developers' section on mesecons.tk   -- PUBLIC VARIABLES @@ -97,50 +33,25 @@ dofile(minetest.get_modpath("mesecons").."/internal.lua");  -- API API API API API API API API API API API API API API API API API API -function mesecon:add_receptor_node(nodename, rules, get_rules) --rules table is optional; if rules depend on param2 pass (nodename, nil, function get_rules) -	local i=1 -	repeat -		if mesecon.receptors[i]==nil then break end -		i=i+1 -	until false +function mesecon:add_receptor_node(name, rules, get_rules) --rules table is optional; if rules depend on param2 pass (nodename, nil, function get_rules)  	if get_rules==nil and rules==nil then  		rules=mesecon:get_rules("default")  	end -	mesecon.receptors[i]={} -	mesecon.receptors[i].name = 		nodename -	mesecon.receptors[i].rules = 		rules -	mesecon.receptors[i].get_rules = 	get_rules +	table.insert(mesecon.receptors, {name = name, rules = rules, get_rules = get_rules})  end -function mesecon:add_receptor_node_off(nodename, rules, get_rules) -	local i=1 -	repeat -		if mesecon.receptors_off[i]==nil then break end -		i=i+1 -	until false +function mesecon:add_receptor_node_off(name, rules, get_rules)  	if get_rules==nil and rules==nil then  		rules=mesecon:get_rules("default")  	end -	mesecon.receptors_off[i]={} -	mesecon.receptors_off[i].name = 		nodename -	mesecon.receptors_off[i].rules = 		rules -	mesecon.receptors_off[i].get_rules = 		get_rules +	table.insert(mesecon.receptors_off, {name = name, rules = rules, get_rules = get_rules})  end  function mesecon:register_effector(onstate, offstate, input_rules, get_input_rules) -	local i=1 -	repeat -		if mesecon.effectors[i]==nil then break end -		i=i+1 -	until false  	if get_input_rules==nil and input_rules==nil then  		rules=mesecon:get_rules("default")  	end -	mesecon.effectors[i]={} -	mesecon.effectors[i].onstate = 		onstate -	mesecon.effectors[i].offstate = 	offstate -	mesecon.effectors[i].input_rules = 	input_rules -	mesecon.effectors[i].get_input_rules = 	get_input_rules +	table.insert(mesecon.effectors, {onstate = onstate, offstate = offstate, input_rules = input_rules, get_input_rules = get_input_rules})  end  function mesecon:receptor_on(pos, rules) @@ -148,12 +59,11 @@ function mesecon:receptor_on(pos, rules)  		rules = mesecon:get_rules("default")  	end -	local i = 1 -	while rules[i]~=nil do +	for i, rule in ipairs(rules) do  		local np = {} -		np.x = pos.x + rules[i].x -		np.y = pos.y + rules[i].y -		np.z = pos.z + rules[i].z +		np.x = pos.x + rule.x +		np.y = pos.y + rule.y +		np.z = pos.z + rule.z  		if mesecon:rules_link(pos, np, rules) then  			mesecon:turnon(np, pos)  		end @@ -167,12 +77,12 @@ function mesecon:receptor_off(pos, rules)  	end  	local connected = false -	local i = 1 -	while rules[i]~=nil do + +	for i, rule in ipairs(rules) do  		local np = {} -		np.x = pos.x + rules[i].x -		np.y = pos.y + rules[i].y -		np.z = pos.z + rules[i].z +		np.x = pos.x + rule.x +		np.y = pos.y + rule.y +		np.z = pos.z + rule.z  		if mesecon:rules_link(pos, np, rules) and mesecon:connected_to_pw_src(np) == false then  			mesecon:turnoff(np, pos)  		end @@ -181,45 +91,22 @@ function mesecon:receptor_off(pos, rules)  end  function mesecon:register_on_signal_on(action) -	local i	= 1	 -	repeat -		i=i+1 -		if mesecon.actions_on[i]==nil then break end -	until false -	mesecon.actions_on[i]=action +	table.insert(mesecon.actions_on, action)  end  function mesecon:register_on_signal_off(action) -	local i	= 1	 -	repeat -		i=i+1 -		if mesecon.actions_off[i]==nil then break end -	until false -	mesecon.actions_off[i]=action +	table.insert(mesecon.actions_off, action)  end  function mesecon:register_on_signal_change(action) -	local i	= 1	 -	repeat -		i=i+1 -		if mesecon.actions_change[i]==nil then break end -	until false -	mesecon.actions_change[i]=action +	table.insert(mesecon.actions_change, action)  end  function mesecon:register_conductor (onstate, offstate, rules, get_rules) -	local i = 1 -	while mesecon.conductors[i]~=nil do -		i = i + 1 -	end  	if rules == nil then  		rules = mesecon:get_rules("default")  	end -	mesecon.conductors[i]={} -	mesecon.conductors[i].onstate = onstate -	mesecon.conductors[i].offstate = offstate -	mesecon.conductors[i].rules = rules -	mesecon.conductors[i].get_rules = get_rules +	table.insert(mesecon.conductors, {onstate = onstate, offstate = offstate, rules = rules, get_rules = get_rules})  end  mesecon:add_rules("default",  diff --git a/mesecons/internal.lua b/mesecons/internal.lua index 08750a8..4270a22 100644 --- a/mesecons/internal.lua +++ b/mesecons/internal.lua @@ -3,8 +3,8 @@  --Receptors  function mesecon:is_receptor_node(nodename)  	local i = 1 -	while mesecon.receptors[i] ~= nil do -		if mesecon.receptors[i].name == nodename then +	for i, receptor in ipairs(mesecon.receptors) do +		if receptor.name == nodename then  			return true  		end  		i = i + 1 @@ -14,8 +14,8 @@ end  function mesecon:is_receptor_node_off(nodename, pos, ownpos)  	local i = 1 -	while mesecon.receptors_off[i] ~= nil do -		if mesecon.receptors_off[i].name == nodename then +	for i, receptor in ipairs(mesecon.receptors_off) do +		if receptor.name == nodename then  			return true  		end  		i = i + 1 @@ -24,55 +24,47 @@ function mesecon:is_receptor_node_off(nodename, pos, ownpos)  end  function mesecon:receptor_get_rules(node) -	local i = 1 -	while(mesecon.receptors[i] ~= nil) do -		if mesecon.receptors[i].name == node.name then -			if mesecon.receptors[i].get_rules ~= nil then -				return mesecon.receptors[i].get_rules(node.param2) +	for i, receptor in ipairs(mesecon.receptors) do +		if receptor.name == node.name then +			if receptor.get_rules ~= nil then +				return receptor.get_rules(node.param2)  			elseif mesecon.receptors[i].rules ~=nil then -				return mesecon.receptors[i].rules +				return receptor.rules  			else  				return mesecon:get_rules("default")  			end  		end -		i = i + 1  	end -	local i = 1 -	while(mesecon.receptors_off[i] ~= nil) do -		if mesecon.receptors_off[i].name == node.name then -			if mesecon.receptors_off[i].get_rules ~= nil then -				return mesecon.receptors_off[i].get_rules(node.param2) +	for i, receptor in ipairs(mesecon.receptors_off) do +		if receptor.name == node.name then +			if receptor.get_rules ~= nil then +				return receptor.get_rules(node.param2)  			elseif mesecon.receptors_off[i].rules ~=nil then -				return mesecon.receptors_off[i].rules +				return receptor.rules  			else  				return mesecon:get_rules("default")  			end  		end -		i = i + 1  	end  	return nil  end  -- Effectors  function mesecon:is_effector_on(nodename) -	local i = 1 -	while mesecon.effectors[i] ~= nil do -		if mesecon.effectors[i].onstate == nodename then +	for i, effector in ipairs(mesecon.effectors) do +		if effector.onstate == nodename then  			return true  		end -		i = i + 1  	end  	return false  end  function mesecon:is_effector_off(nodename) -	local i = 1 -	while mesecon.effectors[i] ~= nil do -		if mesecon.effectors[i].offstate == nodename then +	for i, effector in ipairs(mesecon.effectors) do +		if effector.offstate == nodename then  			return true  		end -		i = i + 1  	end  	return false  end @@ -82,19 +74,17 @@ function mesecon:is_effector(nodename)  end  function mesecon:effector_get_input_rules(node) -	local i = 1 -	while(mesecon.effectors[i] ~= nil) do -		if mesecon.effectors[i].onstate  == node.name  -		or mesecon.effectors[i].offstate == node.name then -			if mesecon.effectors[i].get_input_rules ~= nil then -				return mesecon.effectors[i].get_input_rules(node.param2) +	for i, effector in ipairs(mesecon.effectors) do +		if effector.onstate  == node.name  +		or effector.offstate == node.name then +			if effector.get_input_rules ~= nil then +				return effector.get_input_rules(node.param2)  			elseif mesecon.effectors[i].input_rules ~=nil then -				return mesecon.effectors[i].input_rules +				return effector.input_rules  			else  				return mesecon:get_rules("default")  			end  		end -		i = i + 1  	end  end @@ -102,101 +92,75 @@ end  function mesecon:activate(pos)  	local node = minetest.env:get_node(pos)	 -	local i = 1 -	repeat -		i=i+1 -		if mesecon.actions_on[i]~=nil then mesecon.actions_on[i](pos, node)  -		else break			 -		end -	until false +	for i, action in ipairs(mesecon.actions_on) do +		action(pos, node)  +	end  end  function mesecon:deactivate(pos)  	local node = minetest.env:get_node(pos)	  	local i = 1 -	repeat -		i=i+1 -		if mesecon.actions_off[i]~=nil then mesecon.actions_off[i](pos, node)  -		else break			 -		end -	until false +	for i, action in ipairs(mesecon.actions_off) do +		action(pos, node)  +	end  end  function mesecon:changesignal(pos)  	local node = minetest.env:get_node(pos)	  	local i = 1 -	repeat -		i=i+1 -		if mesecon.actions_change[i]~=nil then mesecon.actions_change[i](pos, node)  -		else break			 -		end -	until false +	for i, action in ipairs(mesecon.actions_change) do +		action(pos, node)  +	end  end  --Rules  function mesecon:add_rules(name, rules) -	local i = 1 -	while mesecon.rules[i]~=nil do -		i=i+1 -	end -	mesecon.rules[i]={} -	mesecon.rules[i].name=name -	mesecon.rules[i].rules=rules +	table.insert(mesecon.rules, {name = name, rules = rules})  end  function mesecon:get_rules(name) -	local i = 1 -	while mesecon.rules[i]~=nil do -		if mesecon.rules[i].name==name then -			return mesecon.rules[i].rules +	for i, rule in ipairs(mesecon.rules) do +		if rule.name==name then +			return rule.rules  		end -		i=i+1  	end  end  --Conductor system stuff  function mesecon:get_conductor_on(offstate) -	local i = 1 -	while mesecon.conductors[i]~=nil do -		if mesecon.conductors[i].offstate == offstate then -			return mesecon.conductors[i].onstate +	for i, conductor in ipairs(mesecon.conductors) do +		if conductor.offstate == offstate then +			return conductor.onstate  		end -		i=i+1  	end  	return false  end  function mesecon:get_conductor_off(onstate) -	local i = 1 -	while mesecon.conductors[i]~=nil do -		if mesecon.conductors[i].onstate == onstate then -			return mesecon.conductors[i].offstate +	for i, conductor in ipairs(mesecon.conductors) do +		if conductor.onstate == onstate then +			return conductor.offstate  		end -		i=i+1  	end  	return false  end  function mesecon:is_conductor_on(name) -	local i = 1 -	while mesecon.conductors[i]~=nil do -		if mesecon.conductors[i].onstate == name then +	for i, conductor in ipairs(mesecon.conductors) do +		if conductor.onstate == name then  			return true  		end -		i=i+1  	end  	return false  end  function mesecon:is_conductor_off(name) -	local i = 1 -	while mesecon.conductors[i]~=nil do -		if mesecon.conductors[i].offstate == name then +	for i, conductor in ipairs(mesecon.conductors) do +		if conductor.offstate == name then  			return true  		end -		i=i+1  	end  	return false  end @@ -206,17 +170,15 @@ function mesecon:is_conductor(name)  end  function mesecon:conductor_get_rules(node) -	local i = 1 -	while mesecon.conductors[i] ~= nil do -		if mesecon.conductors[i].onstate  == node.name  -		or mesecon.conductors[i].offstate == node.name then -			if mesecon.conductors[i].get_rules ~= nil then -				return mesecon.conductors[i].get_rules(node.param2) +	for i, conductor in ipairs(mesecon.conductors) do +		if conductor.onstate  == node.name  +		or conductor.offstate == node.name then +			if conductor.get_rules ~= nil then +				return conductor.get_rules(node.param2)  			else -				return mesecon.conductors[i].rules +				return conductor.rules  			end  		end -		i = i + 1  	end  end @@ -245,16 +207,15 @@ function mesecon:turnon(pos)  		local rules = mesecon:conductor_get_rules(node)  		minetest.env:add_node(pos, {name=mesecon:get_conductor_on(node.name), param2 = node.param2}) -		while rules[i]~=nil do +		for i, rule in ipairs(rules) do  			local np = {} -			np.x = pos.x + rules[i].x -			np.y = pos.y + rules[i].y -			np.z = pos.z + rules[i].z +			np.x = pos.x + rule.x +			np.y = pos.y + rule.y +			np.z = pos.z + rule.z  			if mesecon:rules_link(pos, np) then  				mesecon:turnon(np)  			end -			i=i+1  		end  	end @@ -274,17 +235,15 @@ function mesecon:turnoff(pos) --receptor rules used because output could have be  		minetest.env:add_node(pos, {name=mesecon:get_conductor_off(node.name), param2 = node.param2}) -		while rules[i]~=nil do +		for i, rule in ipairs(rules) do  			local np = { -			x = pos.x + rules[i].x, -			y = pos.y + rules[i].y, -			z = pos.z + rules[i].z,} +			x = pos.x + rule.x, +			y = pos.y + rule.y, +			z = pos.z + rule.z,}  			if mesecon:rules_link(pos, np) then  				mesecon:turnoff(np)  			end - -			i = i + 1  		end  	end @@ -319,18 +278,17 @@ function mesecon:connected_to_pw_src(pos, checked)  	local rules = mesecon:conductor_get_rules(node)  	local i = 1 -	while rules[i] ~= nil do +	for i, rule in ipairs(rules) do  		local np = {} -		np.x = pos.x + rules[i].x -		np.y = pos.y + rules[i].y -		np.z = pos.z + rules[i].z +		np.x = pos.x + rule.x +		np.y = pos.y + rule.y +		np.z = pos.z + rule.z  		if mesecon:rules_link(pos, np) then  			connected, checked = mesecon:connected_to_pw_src(np, checked)  			if connected then   				return true  			end  		end -		i=i+1  	end  	return false, checked  end @@ -364,21 +322,19 @@ function mesecon:rules_link(output, input, dug_outputrules) --output/input are p  	end -	while outputrules[k] ~= nil do -		if  outputrules[k].x + output.x == input.x -		and outputrules[k].y + output.y == input.y -		and outputrules[k].z + output.z == input.z then -- Check if output sends to input +	for k, outputrule in ipairs(outputrules) do +		if  outputrule.x + output.x == input.x +		and outputrule.y + output.y == input.y +		and outputrule.z + output.z == input.z then -- Check if output sends to input  			l = 1 -			while inputrules[l] ~= nil do -				if  inputrules[l].x + input.x == output.x -				and inputrules[l].y + input.y == output.y -				and inputrules[l].z + input.z == output.z then --Check if input accepts from output +			for k, inputrule in ipairs(inputrules) do +				if  inputrule.x + input.x == output.x +				and inputrule.y + input.y == output.y +				and inputrule.z + input.z == output.z then --Check if input accepts from output  					return true  				end -				l = l + 1  			end  		end -		k = k + 1  	end  	return false  end @@ -405,18 +361,17 @@ function mesecon:is_powered_by_conductor(pos)  		return false  	end -	while rules[j] ~= nil do +	for i, rule in ipairs(rules) do  		local con_pos = { -		x = pos.x + rules[j].x, -		y = pos.y + rules[j].y, -		z = pos.z + rules[j].z} +		x = pos.x + rule.x, +		y = pos.y + rule.y, +		z = pos.z + rule.z}  		con_node = minetest.env:get_node(con_pos)  		if mesecon:is_conductor_on(con_node.name) and mesecon:rules_link(con_pos, pos) then   			return true  		end -		j = j + 1  	end  	return false @@ -440,18 +395,17 @@ function mesecon:is_powered_by_receptor(pos)  		return false  	end -	while rules[j] ~= nil do +	for i, rule in ipairs(rules) do  		local rcpt_pos = { -		x = pos.x + rules[j].x, -		y = pos.y + rules[j].y, -		z = pos.z + rules[j].z} +		x = pos.x + rule.x, +		y = pos.y + rule.y, +		z = pos.z + rule.z}  		rcpt_node = minetest.env:get_node(rcpt_pos)  		if mesecon:is_receptor_node(rcpt_node.name) and mesecon:rules_link(rcpt_pos, pos) then  			return true  		end -		j = j + 1  	end  	return false @@ -477,12 +431,11 @@ end  function mesecon:rotate_rules_right(rules)  	local i=1  	local nr={}; -	while rules[i]~=nil do +	for i, rule in ipairs(rules) do  		nr[i]={} -		nr[i].z=rules[i].x -		nr[i].x=-rules[i].z -		nr[i].y=rules[i].y -		i=i+1 +		nr[i].z=rule.x +		nr[i].x=-rule.z +		nr[i].y=rule.y  	end  	return nr  end @@ -490,12 +443,11 @@ end  function mesecon:rotate_rules_left(rules)  	local i=1  	local nr={}; -	while rules[i]~=nil do +	for i, rule in ipairs(rules) do  		nr[i]={}  		nr[i].z=-rules[i].x  		nr[i].x=rules[i].z  		nr[i].y=rules[i].y -		i=i+1  	end  	return nr  end @@ -503,12 +455,11 @@ end  function mesecon:rotate_rules_down(rules)  	local i=1  	local nr={}; -	while rules[i]~=nil do +	for i, rule in ipairs(rules) do  		nr[i]={} -		nr[i].y=rules[i].x -		nr[i].x=-rules[i].y -		nr[i].z=rules[i].z -		i=i+1 +		nr[i].y=rule.x +		nr[i].x=-rule.y +		nr[i].z=rule.z  	end  	return nr  end @@ -516,14 +467,11 @@ end  function mesecon:rotate_rules_up(rules)  	local i=1  	local nr={}; -	while rules[i]~=nil do +	for i, rule in ipairs(rules) do  		nr[i]={} -		nr[i].y=-rules[i].x -		nr[i].x=rules[i].y -		nr[i].z=rules[i].z -		i=i+1 +		nr[i].y=-rule.x +		nr[i].x=rule.y +		nr[i].z=rule.z  	end  	return nr  end - ---TODO: is_powered returns the position (see services.lua!!!) | 
