diff options
57 files changed, 1052 insertions, 1183 deletions
| diff --git a/mesecons/actionqueue.lua b/mesecons/actionqueue.lua index a5daf88..fa4079f 100644 --- a/mesecons/actionqueue.lua +++ b/mesecons/actionqueue.lua @@ -12,19 +12,19 @@ function mesecon.queue:add_action(pos, func, params, time, overwritecheck, prior  	-- Create Action Table:  	time = time or 0 -- time <= 0 --> execute, time > 0 --> wait time until execution  	priority = priority or 1 -	local action = {	pos=mesecon:tablecopy(pos), +	local action = {	pos=mesecon.tablecopy(pos),  				func=func, -				params=mesecon:tablecopy(params), +				params=mesecon.tablecopy(params or {}),  				time=time, -				owcheck=(overwritecheck and mesecon:tablecopy(overwritecheck)) or nil, +				owcheck=(overwritecheck and mesecon.tablecopy(overwritecheck)) or nil,  				priority=priority}  	local toremove = nil  	-- Otherwise, add the action to the queue  	if overwritecheck then -- check if old action has to be overwritten / removed:  		for i, ac in ipairs(mesecon.queue.actions) do -			if(mesecon:cmpPos(pos, ac.pos) -			and mesecon:cmpAny(overwritecheck, ac.owcheck)) then +			if(mesecon.cmpPos(pos, ac.pos) +			and mesecon.cmpAny(overwritecheck, ac.owcheck)) then  				toremove = i  				break  			end @@ -44,7 +44,8 @@ end  -- However, even that does not work in some cases, that's why we delay the time the globalsteps  -- start to be execute by 5 seconds  local get_highest_priority = function (actions) -	local highestp = -1, highesti +	local highestp = -1 +	local highesti  	for i, ac in ipairs(actions) do  		if ac.priority > highestp then  			highestp = ac.priority @@ -56,10 +57,13 @@ local get_highest_priority = function (actions)  end  local m_time = 0 +local resumetime = mesecon.setting("resumetime", 4)  minetest.register_globalstep(function (dtime)  	m_time = m_time + dtime -	if (m_time < MESECONS_RESUMETIME) then return end -- don't even try if server has not been running for XY seconds -	local actions = mesecon:tablecopy(mesecon.queue.actions) +	-- don't even try if server has not been running for XY seconds; resumetime = time to wait +	-- after starting the server before processing the ActionQueue, don't set this too low +	if (m_time < resumetime) then return end +	local actions = mesecon.tablecopy(mesecon.queue.actions)  	local actions_now={}  	mesecon.queue.actions = {} diff --git a/mesecons/init.lua b/mesecons/init.lua index 3132955..096e509 100644 --- a/mesecons/init.lua +++ b/mesecons/init.lua @@ -47,15 +47,14 @@ mesecon.queue.funcs={} -- contains all ActionQueue functions  -- Settings  dofile(minetest.get_modpath("mesecons").."/settings.lua") --- Presets (eg default rules) -dofile(minetest.get_modpath("mesecons").."/presets.lua"); - -  -- Utilities like comparing positions,  -- adding positions and rules,  -- mostly things that make the source look cleaner  dofile(minetest.get_modpath("mesecons").."/util.lua"); +-- Presets (eg default rules) +dofile(minetest.get_modpath("mesecons").."/presets.lua"); +  -- The ActionQueue  -- Saves all the actions that have to be execute in the future  dofile(minetest.get_modpath("mesecons").."/actionqueue.lua"); @@ -67,11 +66,6 @@ dofile(minetest.get_modpath("mesecons").."/actionqueue.lua");  -- like calling action_on/off/change  dofile(minetest.get_modpath("mesecons").."/internal.lua"); --- Deprecated stuff --- To be removed in future releases --- Currently there is nothing here -dofile(minetest.get_modpath("mesecons").."/legacy.lua"); -  -- API  -- these are the only functions you need to remember @@ -79,8 +73,8 @@ mesecon.queue:add_function("receptor_on", function (pos, rules)  	rules = rules or mesecon.rules.default  	-- if area (any of the rule targets) is not loaded, keep trying and call this again later -	for _, rule in ipairs(mesecon:flattenrules(rules)) do -		local np = mesecon:addPosRule(pos, rule) +	for _, rule in ipairs(mesecon.flattenrules(rules)) do +		local np = mesecon.addPosRule(pos, rule)  		-- if area is not loaded, keep trying  		if minetest.get_node_or_nil(np) == nil then  			mesecon.queue:add_action(pos, "receptor_on", {rules}, nil, rules) @@ -89,16 +83,16 @@ mesecon.queue:add_function("receptor_on", function (pos, rules)  	end  	-- execute action -	for _, rule in ipairs(mesecon:flattenrules(rules)) do -		local np = mesecon:addPosRule(pos, rule) -		local rulenames = mesecon:rules_link_rule_all(pos, rule) +	for _, rule in ipairs(mesecon.flattenrules(rules)) do +		local np = mesecon.addPosRule(pos, rule) +		local rulenames = mesecon.rules_link_rule_all(pos, rule)  		for _, rulename in ipairs(rulenames) do -			mesecon:turnon(np, rulename) +			mesecon.turnon(np, rulename)  		end  	end  end) -function mesecon:receptor_on(pos, rules) +function mesecon.receptor_on(pos, rules)  	mesecon.queue:add_action(pos, "receptor_on", {rules}, nil, rules)  end @@ -106,34 +100,38 @@ mesecon.queue:add_function("receptor_off", function (pos, rules)  	rules = rules or mesecon.rules.default  	-- if area (any of the rule targets) is not loaded, keep trying and call this again later -	for _, rule in ipairs(mesecon:flattenrules(rules)) do -		local np = mesecon:addPosRule(pos, rule) +	for _, rule in ipairs(mesecon.flattenrules(rules)) do +		local np = mesecon.addPosRule(pos, rule)  		if minetest.get_node_or_nil(np) == nil then  			mesecon.queue:add_action(pos, "receptor_off", {rules}, nil, rules)  			return  		end  	end -	for _, rule in ipairs(mesecon:flattenrules(rules)) do -		local np = mesecon:addPosRule(pos, rule) -		local rulenames = mesecon:rules_link_rule_all(pos, rule) +	for _, rule in ipairs(mesecon.flattenrules(rules)) do +		local np = mesecon.addPosRule(pos, rule) +		local rulenames = mesecon.rules_link_rule_all(pos, rule)  		for _, rulename in ipairs(rulenames) do -			if not mesecon:connected_to_receptor(np, mesecon:invertRule(rule)) then -				mesecon:turnoff(np, rulename) +			if not mesecon.connected_to_receptor(np, mesecon.invertRule(rule)) then +				mesecon.turnoff(np, rulename)  			else -				mesecon:changesignal(np, minetest.get_node(np), rulename, mesecon.state.off, 2) +				mesecon.changesignal(np, minetest.get_node(np), rulename, mesecon.state.off, 2)  			end  		end  	end  end) -function mesecon:receptor_off(pos, rules) +function mesecon.receptor_off(pos, rules)  	mesecon.queue:add_action(pos, "receptor_off", {rules}, nil, rules)  end  print("[OK] Mesecons") +-- Deprecated stuff +-- To be removed in future releases +dofile(minetest.get_modpath("mesecons").."/legacy.lua"); +  --The actual wires  dofile(minetest.get_modpath("mesecons").."/wires.lua"); diff --git a/mesecons/internal.lua b/mesecons/internal.lua index 6ed8f74..1072aa8 100644 --- a/mesecons/internal.lua +++ b/mesecons/internal.lua @@ -3,60 +3,56 @@  -- For more practical developer resources see mesecons.tk  --  -- 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, recdepth)		--> Activates   the effector node at the specific pos (calls nodedef.mesecons.effector.action_on), higher recdepths are executed later --- mesecon:deactivate(pos, node, recdepth)		--> Deactivates the effector node at the specific pos (calls nodedef.mesecons.effector.action_off), " --- mesecon:changesignal(pos, node, rulename, newstate)	--> Changes     the effector node at the specific pos (calls nodedef.mesecons.effector.action_change), " - --- RULES --- mesecon:add_rules(name, rules) | deprecated? --> Saves rules table by name --- mesecon:get_rules(name, rules) | deprecated? --> Loads rules table with name +-- 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)   --> 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, 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  -- RULES ROTATION helpsers --- mesecon:rotate_rules_right(rules) --- mesecon:rotate_rules_left(rules) --- mesecon:rotate_rules_up(rules) --- mesecon:rotate_rules_down(rules) +-- mesecon.rotate_rules_right(rules) +-- mesecon.rotate_rules_left(rules) +-- mesecon.rotate_rules_up(rules) +-- mesecon.rotate_rules_down(rules)  -- These functions return rules that have been rotated in the specific direction  -- General -function mesecon:get_effector(nodename) +function mesecon.get_effector(nodename)  	if  minetest.registered_nodes[nodename]  	and minetest.registered_nodes[nodename].mesecons  	and minetest.registered_nodes[nodename].mesecons.effector then @@ -64,7 +60,7 @@ function mesecon:get_effector(nodename)  	end  end -function mesecon:get_receptor(nodename) +function mesecon.get_receptor(nodename)  	if  minetest.registered_nodes[nodename]  	and minetest.registered_nodes[nodename].mesecons  	and minetest.registered_nodes[nodename].mesecons.receptor then @@ -72,7 +68,7 @@ function mesecon:get_receptor(nodename)  	end  end -function mesecon:get_conductor(nodename) +function mesecon.get_conductor(nodename)  	if  minetest.registered_nodes[nodename]  	and minetest.registered_nodes[nodename].mesecons  	and minetest.registered_nodes[nodename].mesecons.conductor then @@ -80,52 +76,52 @@ function mesecon:get_conductor(nodename)  	end  end -function mesecon:get_any_outputrules (node) -	if mesecon:is_conductor(node.name) then -		return mesecon:conductor_get_rules(node) -	elseif mesecon:is_receptor(node.name) then -		return mesecon:receptor_get_rules(node) +function mesecon.get_any_outputrules (node) +	if mesecon.is_conductor(node.name) then +		return mesecon.conductor_get_rules(node) +	elseif mesecon.is_receptor(node.name) then +		return mesecon.receptor_get_rules(node)  	end  	return false  end -function mesecon:get_any_inputrules (node) -	if mesecon:is_conductor(node.name) then -		return mesecon:conductor_get_rules(node) -	elseif mesecon:is_effector(node.name) then -		return mesecon:effector_get_rules(node) +function mesecon.get_any_inputrules (node) +	if mesecon.is_conductor(node.name) then +		return mesecon.conductor_get_rules(node) +	elseif mesecon.is_effector(node.name) then +		return mesecon.effector_get_rules(node)  	end  	return false  end  -- Receptors  -- Nodes that can power mesecons -function mesecon:is_receptor_on(nodename) -	local receptor = mesecon:get_receptor(nodename) +function mesecon.is_receptor_on(nodename) +	local receptor = mesecon.get_receptor(nodename)  	if receptor and receptor.state == mesecon.state.on then  		return true  	end  	return false  end -function mesecon:is_receptor_off(nodename) -	local receptor = mesecon:get_receptor(nodename) +function mesecon.is_receptor_off(nodename) +	local receptor = mesecon.get_receptor(nodename)  	if receptor and receptor.state == mesecon.state.off then  		return true  	end  	return false  end -function mesecon:is_receptor(nodename) -	local receptor = mesecon:get_receptor(nodename) +function mesecon.is_receptor(nodename) +	local receptor = mesecon.get_receptor(nodename)  	if receptor then  		return true  	end  	return false  end -function mesecon:receptor_get_rules(node) -	local receptor = mesecon:get_receptor(node.name) +function mesecon.receptor_get_rules(node) +	local receptor = mesecon.get_receptor(node.name)  	if receptor then  		local rules = receptor.rules  		if type(rules) == 'function' then @@ -140,32 +136,32 @@ end  -- Effectors  -- Nodes that can be powered by mesecons -function mesecon:is_effector_on(nodename) -	local effector = mesecon:get_effector(nodename) +function mesecon.is_effector_on(nodename) +	local effector = mesecon.get_effector(nodename)  	if effector and effector.action_off then  		return true  	end  	return false  end -function mesecon:is_effector_off(nodename) -	local effector = mesecon:get_effector(nodename) +function mesecon.is_effector_off(nodename) +	local effector = mesecon.get_effector(nodename)  	if effector and effector.action_on then  		return true  	end  	return false  end -function mesecon:is_effector(nodename) -	local effector = mesecon:get_effector(nodename) +function mesecon.is_effector(nodename) +	local effector = mesecon.get_effector(nodename)  	if effector then  		return true  	end  	return false  end -function mesecon:effector_get_rules(node) -	local effector = mesecon:get_effector(node.name) +function mesecon.effector_get_rules(node) +	local effector = mesecon.get_effector(node.name)  	if effector then  		local rules = effector.rules  		if type(rules) == 'function' then @@ -183,159 +179,147 @@ end  -- Activation:  mesecon.queue:add_function("activate", 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_on then  		effector.action_on(pos, node, rulename)  	end  end) -function mesecon:activate(pos, node, rulename, recdepth) +function mesecon.activate(pos, node, rulename, depth)  	if rulename == nil then -		for _,rule in ipairs(mesecon:effector_get_rules(node)) do -			mesecon:activate(pos, node, rule, recdepth + 1) +		for _,rule in ipairs(mesecon.effector_get_rules(node)) do +			mesecon.activate(pos, node, rule, depth + 1)  		end  		return  	end -	mesecon.queue:add_action(pos, "activate", {rulename}, nil, rulename, 1 / recdepth) +	mesecon.queue:add_action(pos, "activate", {rulename}, nil, rulename, 1 / depth)  end  -- Deactivation  mesecon.queue:add_function("deactivate", function (pos, rulename)  	node = minetest.get_node(pos) -	effector = mesecon:get_effector(node.name) +	effector = mesecon.get_effector(node.name)  	if effector and effector.action_off then  		effector.action_off(pos, node, rulename)  	end  end) -function mesecon:deactivate(pos, node, rulename, recdepth) +function mesecon.deactivate(pos, node, rulename, depth)  	if rulename == nil then -		for _,rule in ipairs(mesecon:effector_get_rules(node)) do -			mesecon:deactivate(pos, node, rule, recdepth + 1) +		for _,rule in ipairs(mesecon.effector_get_rules(node)) do +			mesecon.deactivate(pos, node, rule, depth + 1)  		end  		return  	end -	mesecon.queue:add_action(pos, "deactivate", {rulename}, nil, rulename, 1 / recdepth) +	mesecon.queue:add_action(pos, "deactivate", {rulename}, nil, rulename, 1 / depth)  end  -- Change  mesecon.queue:add_function("change", function (pos, rulename, changetype) -	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_change then  		effector.action_change(pos, node, rulename, changetype)  	end  end) -function mesecon:changesignal(pos, node, rulename, newstate, recdepth) +function mesecon.changesignal(pos, node, rulename, newstate, depth)  	if rulename == nil then -		for _,rule in ipairs(mesecon:effector_get_rules(node)) do -			mesecon:changesignal(pos, node, rule, newstate, recdepth + 1) +		for _,rule in ipairs(mesecon.effector_get_rules(node)) do +			mesecon.changesignal(pos, node, rule, newstate, depth + 1)  		end  		return  	end -	mesecon.queue:add_action(pos, "change", {rulename, newstate}, nil, rulename, 1 / recdepth) -end - --- ######### --- # Rules # "Database" for rulenames --- ######### - -function mesecon:add_rules(name, rules) -	mesecon.rules[name] = rules -end - -function mesecon:get_rules(name) -	return mesecon.rules[name] +	mesecon.queue:add_action(pos, "change", {rulename, newstate}, nil, rulename, 1 / depth)  end  -- Conductors -function mesecon:is_conductor_on(node, rulename) -	local conductor = mesecon:get_conductor(node.name) +function mesecon.is_conductor_on(node, rulename) +	local conductor = mesecon.get_conductor(node.name)  	if conductor then  		if conductor.state then  			return conductor.state == mesecon.state.on  		end  		if conductor.states then  			if not rulename then -				return mesecon:getstate(node.name, conductor.states) ~= 1 +				return mesecon.getstate(node.name, conductor.states) ~= 1  			end -			local bit = mesecon:rule2bit(rulename, mesecon:conductor_get_rules(node)) -			local binstate = mesecon:getbinstate(node.name, conductor.states) -			return mesecon:get_bit(binstate, bit) +			local bit = mesecon.rule2bit(rulename, mesecon.conductor_get_rules(node)) +			local binstate = mesecon.getbinstate(node.name, conductor.states) +			return mesecon.get_bit(binstate, bit)  		end  	end  	return false  end -function mesecon:is_conductor_off(node, rulename) -	local conductor = mesecon:get_conductor(node.name) +function mesecon.is_conductor_off(node, rulename) +	local conductor = mesecon.get_conductor(node.name)  	if conductor then  		if conductor.state then  			return conductor.state == mesecon.state.off  		end  		if conductor.states then  			if not rulename then -				return mesecon:getstate(node.name, conductor.states) == 1 +				return mesecon.getstate(node.name, conductor.states) == 1  			end -			local bit = mesecon:rule2bit(rulename, mesecon:conductor_get_rules(node)) -			local binstate = mesecon:getbinstate(node.name, conductor.states) -			return not mesecon:get_bit(binstate, bit) +			local bit = mesecon.rule2bit(rulename, mesecon.conductor_get_rules(node)) +			local binstate = mesecon.getbinstate(node.name, conductor.states) +			return not mesecon.get_bit(binstate, bit)  		end  	end  	return false  end -function mesecon:is_conductor(nodename) -	local conductor = mesecon:get_conductor(nodename) +function mesecon.is_conductor(nodename) +	local conductor = mesecon.get_conductor(nodename)  	if conductor then  		return true  	end  	return false  end -function mesecon:get_conductor_on(node_off, rulename) -	local conductor = mesecon:get_conductor(node_off.name) +function mesecon.get_conductor_on(node_off, rulename) +	local conductor = mesecon.get_conductor(node_off.name)  	if conductor then  		if conductor.onstate then  			return conductor.onstate  		end  		if conductor.states then -			local bit = mesecon:rule2bit(rulename, mesecon:conductor_get_rules(node_off)) -			local binstate = mesecon:getbinstate(node_off.name, conductor.states) -			binstate = mesecon:set_bit(binstate, bit, "1") +			local bit = mesecon.rule2bit(rulename, mesecon.conductor_get_rules(node_off)) +			local binstate = mesecon.getbinstate(node_off.name, conductor.states) +			binstate = mesecon.set_bit(binstate, bit, "1")  			return conductor.states[tonumber(binstate,2)+1]  		end  	end  	return offstate  end -function mesecon:get_conductor_off(node_on, rulename) -	local conductor = mesecon:get_conductor(node_on.name) +function mesecon.get_conductor_off(node_on, rulename) +	local conductor = mesecon.get_conductor(node_on.name)  	if conductor then  		if conductor.offstate then  			return conductor.offstate  		end  		if conductor.states then -			local bit = mesecon:rule2bit(rulename, mesecon:conductor_get_rules(node_on)) -			local binstate = mesecon:getbinstate(node_on.name, conductor.states) -			binstate = mesecon:set_bit(binstate, bit, "0") +			local bit = mesecon.rule2bit(rulename, mesecon.conductor_get_rules(node_on)) +			local binstate = mesecon.getbinstate(node_on.name, conductor.states) +			binstate = mesecon.set_bit(binstate, bit, "0")  			return conductor.states[tonumber(binstate,2)+1]  		end  	end  	return onstate  end -function mesecon:conductor_get_rules(node) -	local conductor = mesecon:get_conductor(node.name) +function mesecon.conductor_get_rules(node) +	local conductor = mesecon.get_conductor(node.name)  	if conductor then  		local rules = conductor.rules  		if type(rules) == 'function' then @@ -349,128 +333,131 @@ end  -- some more general high-level stuff -function mesecon:is_power_on(pos, rulename) +function mesecon.is_power_on(pos, rulename)  	local node = minetest.get_node(pos) -	if mesecon:is_conductor_on(node, rulename) or mesecon:is_receptor_on(node.name) then +	if mesecon.is_conductor_on(node, rulename) or mesecon.is_receptor_on(node.name) then  		return true  	end  	return false  end -function mesecon:is_power_off(pos, rulename) +function mesecon.is_power_off(pos, rulename)  	local node = minetest.get_node(pos) -	if mesecon:is_conductor_off(node, rulename) or mesecon:is_receptor_off(node.name) then +	if mesecon.is_conductor_off(node, rulename) or mesecon.is_receptor_off(node.name) then  		return true  	end  	return false  end -function mesecon:turnon(pos, rulename, recdepth) -	recdepth = recdepth or 2 -	if (recdepth > STACK_SIZE) then return end -	local node = minetest.get_node(pos) +function mesecon.turnon(pos, link) +	local frontiers = {{pos = pos, link = link}} -	if(node.name == "ignore") then -		-- try turning on later again -		mesecon.queue:add_action( -			pos, "turnon", {rulename, recdepth + 1}, nil, true) -	end -	 -	if mesecon:is_conductor_off(node, rulename) then -		local rules = mesecon:conductor_get_rules(node) +	local depth = 1 +	while frontiers[depth] do +		local f = frontiers[depth] +		local node = minetest.get_node_or_nil(f.pos) -		if not rulename then -			for _, rule in ipairs(mesecon:flattenrules(rules)) do -				if mesecon:connected_to_receptor(pos, rule) then -					mesecon:turnon(pos, rule, recdepth + 1) -				end -			end -			return +		-- area not loaded, postpone action +		if not node then +			mesecon.queue:add_action(f.pos, "turnon", {link}, nil, true)  		end -		minetest.swap_node(pos, {name = mesecon:get_conductor_on(node, rulename), param2 = node.param2}) +		if mesecon.is_conductor_off(node, f.link) then +			local rules = mesecon.conductor_get_rules(node) -		for _, rule in ipairs(mesecon:rule2meta(rulename, rules)) do -			local np = mesecon:addPosRule(pos, rule) -			if(minetest.get_node(np).name == "ignore") then -				-- try turning on later again -				mesecon.queue:add_action( -					np, "turnon", {rulename, recdepth + 1}, nil, true) -			else -				local rulenames = mesecon:rules_link_rule_all(pos, rule) +			minetest.swap_node(f.pos, {name = mesecon.get_conductor_on(node, f.link), +				param2 = node.param2}) -				for _, rulename in ipairs(rulenames) do -					mesecon:turnon(np, rulename, recdepth + 1) +			-- call turnon on neighbors: normal rules +			for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do +				local np = mesecon.addPosRule(f.pos, r) + +				-- area not loaded, postpone action +				if not minetest.get_node_or_nil(np) then +					mesecon.queue:add_action(np, "turnon", {rulename}, +						nil, true) +				else +					local links = mesecon.rules_link_rule_all(f.pos, r) +					for _, l in ipairs(links) do +						table.insert(frontiers, {pos = np, link = l}) +					end  				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 +				mesecon.activate(f.pos, node, f.link, depth) +			end  		end -	elseif mesecon:is_effector(node.name) then -		mesecon:changesignal(pos, node, rulename, mesecon.state.on, recdepth) -		if mesecon:is_effector_off(node.name) then -			mesecon:activate(pos, node, rulename, recdepth) -		end +		depth = depth + 1  	end  end  mesecon.queue:add_function("turnon", function (pos, rulename, recdepth) -	mesecon:turnon(pos, rulename, recdepth) +	mesecon.turnon(pos, rulename, recdepth)  end) -function mesecon:turnoff(pos, rulename, recdepth) -	recdepth = recdepth or 2 -	if (recdepth > STACK_SIZE) then return end -	local node = minetest.get_node(pos) +function mesecon.turnoff(pos, link) +	local frontiers = {{pos = pos, link = link}} -	if(node.name == "ignore") then -		-- try turning on later again -		mesecon.queue:add_action( -			pos, "turnoff", {rulename, recdepth + 1}, nil, true) -	end +	local depth = 1 +	while frontiers[depth] do +		local f = frontiers[depth] +		local node = minetest.get_node_or_nil(f.pos) + +		-- 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 +			local rules = mesecon.conductor_get_rules(node) -	if mesecon:is_conductor_on(node, rulename) then -		local rules = mesecon:conductor_get_rules(node) -		minetest.swap_node(pos, {name = mesecon:get_conductor_off(node, rulename), param2 = node.param2}) +			minetest.swap_node(f.pos, {name = mesecon.get_conductor_off(node, f.link), +				param2 = node.param2}) -		for _, rule in ipairs(mesecon:rule2meta(rulename, rules)) do -			local np = mesecon:addPosRule(pos, rule) -			if(minetest.get_node(np).name == "ignore") then -				-- try turning on later again -				mesecon.queue:add_action( -					np, "turnoff", {rulename, recdepth + 1}, nil, true) -			else -				local rulenames = mesecon:rules_link_rule_all(pos, rule) +			-- call turnoff on neighbors: normal rules +			for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do +				local np = mesecon.addPosRule(f.pos, r) -				for _, rulename in ipairs(rulenames) do -					mesecon:turnoff(np, rulename, recdepth + 1) +				-- area not loaded, postpone action +				if not minetest.get_node_or_nil(np) then +					mesecon.queue:add_action(np, "turnoff", {rulename}, +						nil, true) +				else +					local links = mesecon.rules_link_rule_all(f.pos, r) +					for _, l in ipairs(links) do +						table.insert(frontiers, {pos = np, link = l}) +					end  				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 +				mesecon.deactivate(f.pos, node, f.link, depth) +			end  		end -	elseif mesecon:is_effector(node.name) then -		mesecon:changesignal(pos, node, rulename, mesecon.state.off, recdepth) -		if mesecon:is_effector_on(node.name) -		and not mesecon:is_powered(pos) then -			mesecon:deactivate(pos, node, rulename, recdepth + 1) -		end +		depth = depth + 1  	end  end  mesecon.queue:add_function("turnoff", function (pos, rulename, recdepth) -	mesecon:turnoff(pos, rulename, recdepth) +	mesecon.turnoff(pos, rulename, recdepth)  end) -function mesecon:connected_to_receptor(pos, rulename) +function mesecon.connected_to_receptor(pos, link)  	local node = minetest.get_node(pos)  	-- Check if conductors around are connected -	local rules = mesecon:get_any_inputrules(node) +	local rules = mesecon.get_any_inputrules(node)  	if not rules then return false end -	for _, rule in ipairs(mesecon:rule2meta(rulename, rules)) do -		local rulenames = mesecon:rules_link_rule_all_inverted(pos, rule) -		for _, rname in ipairs(rulenames) do -			local np = mesecon:addPosRule(pos, rname) -			if mesecon:find_receptor_on(np, {}, mesecon:invertRule(rname)) then +	for _, rule in ipairs(mesecon.rule2meta(link, rules)) do +		local links = mesecon.rules_link_rule_all_inverted(pos, rule) +		for _, l in ipairs(links) do +			local np = mesecon.addPosRule(pos, l) +			if mesecon.find_receptor_on(np, mesecon.invertRule(l)) then  				return true  			end  		end @@ -479,66 +466,56 @@ function mesecon:connected_to_receptor(pos, rulename)  	return false  end -function mesecon:find_receptor_on(pos, checked, rulename, recdepth) -	recdepth = recdepth or 2 -	if (recdepth > STACK_SIZE) then return true end -- ignore request -	local node = minetest.get_node(pos) +function mesecon.find_receptor_on(pos, link) +	local frontiers = {{pos = pos, link = link}} +	local checked = {} -	if mesecon:is_receptor_on(node.name) then -		-- add current position to checked -		table.insert(checked, {x=pos.x, y=pos.y, z=pos.z}) -		return true -	end +	-- List of positions that have been searched for onstate receptors +	local depth = 1 +	while frontiers[depth] do +		local f = frontiers[depth] +		local node = minetest.get_node_or_nil(f.pos) -	if mesecon:is_conductor(node.name) then -		local rules = mesecon:conductor_get_rules(node) -		local metaindex = mesecon:rule2metaindex(rulename, rules) -		-- find out if node has already been checked (to prevent from endless loop) -		for _, cp in ipairs(checked) do -			if mesecon:cmpPos(cp, pos) and cp.metaindex == metaindex then -				return false, checked -			end -		end -		-- add current position to checked -		table.insert(checked, {x=pos.x, y=pos.y, z=pos.z, metaindex = metaindex}) -		for _, rule in ipairs(mesecon:rule2meta(rulename, rules)) do -			local rulenames = mesecon:rules_link_rule_all_inverted(pos, rule) -			for _, rname in ipairs(rulenames) do -				local np = mesecon:addPosRule(pos, rname) -				if mesecon:find_receptor_on(np, checked, mesecon:invertRule(rname), recdepth + 1) then -					return true +		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) + +			-- call turnoff on neighbors: normal rules +			for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do +				local np = mesecon.addPosRule(f.pos, r) + +				local links = mesecon.rules_link_rule_all_inverted(f.pos, r) +				for _, l in ipairs(links) do +					local checkedstring = np.x..np.y..np.z..l.x..l.y..l.z +					if not checked[checkedstring] then +						table.insert(frontiers, {pos = np, link = l}) +						checked[checkedstring] = true +					end  				end  			end +			  		end -	else -		-- find out if node has already been checked (to prevent from endless loop) -		for _, cp in ipairs(checked) do -			if mesecon:cmpPos(cp, pos) then -				return false, checked -			end -		end -		table.insert(checked, {x=pos.x, y=pos.y, z=pos.z}) +		depth = depth + 1  	end - -	return false  end -function mesecon:rules_link(output, input, dug_outputrules) --output/input are positions (outputrules optional, used if node has been dug), second return value: the name of the affected input rule +function mesecon.rules_link(output, input, dug_outputrules) --output/input are positions (outputrules optional, used if node has been dug), second return value: the name of the affected input rule  	local outputnode = minetest.get_node(output)  	local inputnode = minetest.get_node(input) -	local outputrules = dug_outputrules or mesecon:get_any_outputrules (outputnode) -	local inputrules = mesecon:get_any_inputrules (inputnode) +	local outputrules = dug_outputrules or mesecon.get_any_outputrules (outputnode) +	local inputrules = mesecon.get_any_inputrules (inputnode)  	if not outputrules or not inputrules then  		return  	end -	for _, outputrule in ipairs(mesecon:flattenrules(outputrules)) do +	for _, outputrule in ipairs(mesecon.flattenrules(outputrules)) do  		-- Check if output sends to input -		if mesecon:cmpPos(mesecon:addPosRule(output, outputrule), input) then -			for _, inputrule in ipairs(mesecon:flattenrules(inputrules)) do +		if mesecon.cmpPos(mesecon.addPosRule(output, outputrule), input) then +			for _, inputrule in ipairs(mesecon.flattenrules(inputrules)) do  				-- Check if input accepts from output -				if  mesecon:cmpPos(mesecon:addPosRule(input, inputrule), output) then -					if inputrule.sx == nil or outputrule.sx == nil or mesecon:cmpSpecial(inputrule, outputrule) then +				if  mesecon.cmpPos(mesecon.addPosRule(input, inputrule), output) then +					if inputrule.sx == nil or outputrule.sx == nil +					or mesecon.cmpSpecial(inputrule, outputrule) then  						return true, inputrule  					end  				end @@ -548,82 +525,91 @@ function mesecon:rules_link(output, input, dug_outputrules) --output/input are p  	return false  end -function mesecon:rules_link_rule_all(output, rule) --output/input are positions (outputrules optional, used if node has been dug), second return value: affected input rules -	local input = mesecon:addPosRule(output, rule) +function mesecon.rules_link_rule_all(output, rule) +	local input = mesecon.addPosRule(output, rule)  	local inputnode = minetest.get_node(input) -	local inputrules = mesecon:get_any_inputrules (inputnode) +	local inputrules = mesecon.get_any_inputrules (inputnode)  	if not inputrules then  		return {}  	end  	local rules = {} -	for _, inputrule in ipairs(mesecon:flattenrules(inputrules)) do +	for _, inputrule in ipairs(mesecon.flattenrules(inputrules)) do  		-- Check if input accepts from output -		if  mesecon:cmpPos(mesecon:addPosRule(input, inputrule), output) then -			if inputrule.sx == nil or rule.sx == nil or mesecon:cmpSpecial(inputrule, rule) then -				rules[#rules+1] = inputrule +		if  mesecon.cmpPos(mesecon.addPosRule(input, inputrule), output) then +			if inputrule.sx == nil or rule.sx == nil +			or mesecon.cmpSpecial(inputrule, rule) then +				table.insert(rules, inputrule)  			end  		end  	end  	return rules  end -function mesecon:rules_link_rule_all_inverted(input, rule) -	--local irule = mesecon:invertRule(rule) -	local output = mesecon:addPosRule(input, rule) +function mesecon.rules_link_rule_all_inverted(input, rule) +	--local irule = mesecon.invertRule(rule) +	local output = mesecon.addPosRule(input, rule)  	local outputnode = minetest.get_node(output) -	local outputrules = mesecon:get_any_outputrules (outputnode) +	local outputrules = mesecon.get_any_outputrules (outputnode)  	if not outputrules then  		return {}  	end  	local rules = {} -	for _, outputrule in ipairs(mesecon:flattenrules(outputrules)) do -		if  mesecon:cmpPos(mesecon:addPosRule(output, outputrule), input) then -			if outputrule.sx == nil or rule.sx == nil or mesecon:cmpSpecial(outputrule, rule) then -				rules[#rules+1] = mesecon:invertRule(outputrule) +	for _, outputrule in ipairs(mesecon.flattenrules(outputrules)) do +		if  mesecon.cmpPos(mesecon.addPosRule(output, outputrule), input) then +			if outputrule.sx == nil or rule.sx == nil +			or mesecon.cmpSpecial(outputrule, rule) then +				table.insert(rules, mesecon.invertRule(outputrule))  			end  		end  	end  	return rules  end -function mesecon:rules_link_anydir(pos1, pos2) -	return mesecon:rules_link(pos1, pos2) or mesecon:rules_link(pos2, pos1) +function mesecon.rules_link_anydir(pos1, pos2) +	return mesecon.rules_link(pos1, pos2) or mesecon.rules_link(pos2, pos1)  end -function mesecon:is_powered(pos, rule) +function mesecon.is_powered(pos, rule)  	local node = minetest.get_node(pos) -	local rules = mesecon:get_any_inputrules(node) +	local rules = mesecon.get_any_inputrules(node)  	if not rules then return false end +	-- List of nodes that send out power to pos +	local sourcepos = {} +  	if not rule then -		for _, rule in ipairs(mesecon:flattenrules(rules)) do -			local rulenames = mesecon:rules_link_rule_all_inverted(pos, rule) +		for _, rule in ipairs(mesecon.flattenrules(rules)) do +			local rulenames = mesecon.rules_link_rule_all_inverted(pos, rule)  			for _, rname in ipairs(rulenames) do -				local np = mesecon:addPosRule(pos, rname) +				local np = mesecon.addPosRule(pos, rname)  				local nn = minetest.get_node(np) -				if (mesecon:is_conductor_on (nn, mesecon:invertRule(rname)) or mesecon:is_receptor_on (nn.name)) then -					return true +				if (mesecon.is_conductor_on (nn, mesecon.invertRule(rname)) +				or mesecon.is_receptor_on (nn.name)) then +					table.insert(sourcepos, np)  				end  			end  		end  	else -		local rulenames = mesecon:rules_link_rule_all_inverted(pos, rule) +		local rulenames = mesecon.rules_link_rule_all_inverted(pos, rule)  		for _, rname in ipairs(rulenames) do -			local np = mesecon:addPosRule(pos, rname) +			local np = mesecon.addPosRule(pos, rname)  			local nn = minetest.get_node(np) -			if (mesecon:is_conductor_on (nn, mesecon:invertRule(rname)) or mesecon:is_receptor_on (nn.name)) then -				return true +			if (mesecon.is_conductor_on (nn, mesecon.invertRule(rname)) +			or mesecon.is_receptor_on (nn.name)) then +				sourcepos.insert(np)  			end  		end  	end -	 -	return false + +	-- Return FALSE if not powered, return list of sources if is powered +	if (#sourcepos == 0) then return false +	else return sourcepos end  end  --Rules rotation Functions: -function mesecon:rotate_rules_right(rules) +function mesecon.rotate_rules_right(rules)  	local nr = {}  	for i, rule in ipairs(rules) do  		if rule.sx then @@ -644,7 +630,7 @@ function mesecon:rotate_rules_right(rules)  	return nr  end -function mesecon:rotate_rules_left(rules) +function mesecon.rotate_rules_left(rules)  	local nr = {}  	for i, rule in ipairs(rules) do  		if rule.sx then @@ -665,7 +651,7 @@ function mesecon:rotate_rules_left(rules)  	return nr  end -function mesecon:rotate_rules_down(rules) +function mesecon.rotate_rules_down(rules)  	local nr = {}  	for i, rule in ipairs(rules) do  		if rule.sx then @@ -686,7 +672,7 @@ function mesecon:rotate_rules_down(rules)  	return nr  end -function mesecon:rotate_rules_up(rules) +function mesecon.rotate_rules_up(rules)  	local nr = {}  	for i, rule in ipairs(rules) do  		if rule.sx then diff --git a/mesecons/legacy.lua b/mesecons/legacy.lua index 119fa24..6d8ccca 100644 --- a/mesecons/legacy.lua +++ b/mesecons/legacy.lua @@ -1,32 +1,30 @@ -local rules = {
 -	a = {x = -1, y = 0, z =  0, name="A"},
 -	b = {x =  0, y = 0, z =  1, name="B"},
 -	c = {x =  1, y = 0, z =  0, name="C"},
 -	d = {x =  0, y = 0, z = -1, name="D"},
 -}
 -
 -function mesecon.legacy_update_ports(pos)
 -	local meta = minetest.get_meta(pos)
 -	local ports = {
 -		a = mesecon:is_power_on(mesecon:addPosRule(pos, rules.a),
 -			mesecon:invertRule(rules.a)) and
 -			mesecon:rules_link(mesecon:addPosRule(pos, rules.a), pos),
 -		b = mesecon:is_power_on(mesecon:addPosRule(pos, rules.b),
 -			mesecon:invertRule(rules.b)) and
 -			mesecon:rules_link(mesecon:addPosRule(pos, rules.b), pos),
 -		c = mesecon:is_power_on(mesecon:addPosRule(pos, rules.c),
 -			mesecon:invertRule(rules.c)) and
 -			mesecon:rules_link(mesecon:addPosRule(pos, rules.c), pos),
 -		d = mesecon:is_power_on(mesecon:addPosRule(pos, rules.d),
 -			mesecon:invertRule(rules.d)) and
 -			mesecon:rules_link(mesecon:addPosRule(pos, rules.d), pos),
 -	}
 -	local n =
 -		(ports.a and 1 or 0) +
 -		(ports.b and 2 or 0) +
 -		(ports.c and 4 or 0) +
 -		(ports.d and 8 or 0) + 1
 -	meta:set_int("real_portstates", n)
 -	return ports
 -end
 -
 +-- Ugly hack to prevent breaking compatibility with other mods +-- Just remove the following two functions to delete the hack, to be done when other mods have updated +function mesecon.receptor_on(self, pos, rules) +	if (self.receptor_on) then +		print("[Mesecons] Warning: A mod with mesecon support called mesecon:receptor_on.") +		print("[Mesecons]          If you are the programmer of this mod, please update it ") +		print("[Mesecons]          to use mesecon.receptor_on instead. mesecon:* is deprecated") +		print("[Mesecons]          Otherwise, please make sure you're running the latest version") +		print("[Mesecons]          of that mod and inform the mod creator.") +	else +		rules = pos +		pos = self +	end +	mesecon.queue:add_action(pos, "receptor_on", {rules}, nil, rules) +end + +function mesecon.receptor_off(self, pos, rules) +	if (self.receptor_off) then +		print("[Mesecons] Warning: A mod with mesecon support called mesecon:receptor_off.") +		print("[Mesecons]          If you are the programmer of this mod, please update it ") +		print("[Mesecons]          to use mesecon.receptor_off instead. mesecon:* is deprecated") +		print("[Mesecons]          Otherwise, please make sure you're running the latest version") +		print("[Mesecons]          of that mod and inform the mod creator.") +	else +		rules = pos +		pos = self +	end +	mesecon.queue:add_action(pos, "receptor_off", {rules}, nil, rules) +end + diff --git a/mesecons/presets.lua b/mesecons/presets.lua index 6c8d3ea..ea4bd65 100644 --- a/mesecons/presets.lua +++ b/mesecons/presets.lua @@ -15,6 +15,8 @@ mesecon.rules.default =   {x=0,  y=1,  z=-1},   {x=0,  y=-1, z=-1}} +mesecon.rules.pplate = mesecon.mergetable(mesecon.rules.default, {{x=0, y=-2, z=0}}) +  mesecon.rules.buttonlike =  {{x = 1,  y = 0, z = 0},   {x = 1,  y = 1, z = 0}, @@ -32,11 +34,11 @@ mesecon.rules.flat =  mesecon.rules.buttonlike_get = function(node)  	local rules = mesecon.rules.buttonlike  	if node.param2 == 2 then -		rules=mesecon:rotate_rules_left(rules) +		rules=mesecon.rotate_rules_left(rules)  	elseif node.param2 == 3 then -		rules=mesecon:rotate_rules_right(mesecon:rotate_rules_right(rules)) +		rules=mesecon.rotate_rules_right(mesecon.rotate_rules_right(rules))  	elseif node.param2 == 0 then -		rules=mesecon:rotate_rules_right(rules) +		rules=mesecon.rotate_rules_right(rules)  	end  	return rules  end diff --git a/mesecons/services.lua b/mesecons/services.lua index b0b45e0..36d9b80 100644 --- a/mesecons/services.lua +++ b/mesecons/services.lua @@ -1,44 +1,53 @@  -- Dig and place services  mesecon.on_placenode = function (pos, node) +	mesecon.update_autoconnect(pos, node) +  	-- Receptors: Send on signal when active -	if mesecon:is_receptor_on(node.name) then -		mesecon:receptor_on(pos, mesecon:receptor_get_rules(node)) +	if mesecon.is_receptor_on(node.name) then +		mesecon.receptor_on(pos, mesecon.receptor_get_rules(node))  	end  	-- Conductors: Send turnon signal when powered or replace by respective offstate conductor  	-- if placed conductor is an onstate one -	if mesecon:is_conductor(node.name) then -		if mesecon:is_powered(pos) then +	if mesecon.is_conductor(node.name) then +		local sources = mesecon.is_powered(pos) +		if sources then  			-- also call receptor_on if itself is powered already, so that neighboring  			-- conductors will be activated (when pushing an on-conductor with a piston) -			mesecon:turnon (pos) -			mesecon:receptor_on (pos, mesecon:conductor_get_rules(node)) -		elseif mesecon:is_conductor_off(node.name) then -			minetest.swap_node(pos, {name = mesecon:get_conductor_off(node)}) +			for _, s in ipairs(sources) do +				local rule = {x = pos.x - s.x, y = pos.y - s.y, z = pos.z - s.z} +				mesecon.turnon(pos, rule) +			end +			--mesecon.receptor_on (pos, mesecon.conductor_get_rules(node)) +		elseif mesecon.is_conductor_on(node) then +			minetest.swap_node(pos, {name = mesecon.get_conductor_off(node)})  		end  	end  	-- Effectors: Send changesignal and activate or deactivate -	if mesecon:is_effector(node.name) then -		if mesecon:is_powered(pos) then -			mesecon:changesignal(pos, node, mesecon:effector_get_rules(node), "on", 1) -			mesecon:activate(pos, node, nil, 1) +	if mesecon.is_effector(node.name) then +		if mesecon.is_powered(pos) then +			mesecon.changesignal(pos, node, mesecon.effector_get_rules(node), "on", 1) +			mesecon.activate(pos, node, nil, 1)  		else -			mesecon:changesignal(pos, node, mesecon:effector_get_rules(node), "off", 1) -			mesecon:deactivate(pos, node, nil, 1) +			mesecon.changesignal(pos, node, mesecon.effector_get_rules(node), "off", 1) +			mesecon.deactivate(pos, node, nil, 1)  		end  	end  end  mesecon.on_dignode = function (pos, node) -	if mesecon:is_conductor_on(node) then -		mesecon:receptor_off(pos, mesecon:conductor_get_rules(node)) -	elseif mesecon:is_receptor_on(node.name) then -		mesecon:receptor_off(pos, mesecon:receptor_get_rules(node)) +	if mesecon.is_conductor_on(node) then +		mesecon.receptor_off(pos, mesecon.conductor_get_rules(node)) +	elseif mesecon.is_receptor_on(node.name) then +		mesecon.receptor_off(pos, mesecon.receptor_get_rules(node))  	end +	mesecon.queue:add_action(pos, "update_autoconnect", {node})  end +mesecon.queue:add_function("update_autoconnect", mesecon.update_autoconnect) +  minetest.register_on_placenode(mesecon.on_placenode)  minetest.register_on_dignode(mesecon.on_dignode) @@ -52,7 +61,7 @@ mesecon.do_overheat = function(pos)  	heat = heat + 1  	meta:set_int("heat", heat) -	if heat < OVERHEAT_MAX then +	if heat < mesecon.setting("overheat_max", 20) then  		mesecon.queue:add_action(pos, "cooldown", {}, 1, nil, 0)  	else  		return true diff --git a/mesecons/settings.lua b/mesecons/settings.lua index eb34f17..164cb57 100644 --- a/mesecons/settings.lua +++ b/mesecons/settings.lua @@ -1,14 +1,10 @@  -- SETTINGS
 -BLINKY_PLANT_INTERVAL = 3
 -NEW_STYLE_WIRES  = true  	-- true = new nodebox wires, false = old raillike wires
 -PRESSURE_PLATE_INTERVAL = 0.1
 -OBJECT_DETECTOR_RADIUS = 6
 -PISTON_MAXIMUM_PUSH = 15
 -MOVESTONE_MAXIMUM_PUSH = 100
 -MESECONS_RESUMETIME = 4		-- time to wait when starting the server before
 -				-- processing the ActionQueue, don't set this too low
 -OVERHEAT_MAX = 20		-- maximum heat of any component that directly sends an output
 -				-- signal when the input changes (e.g. luacontroller, gates)
 -				-- Unit: actions per second, checks are every 1 second
 -STACK_SIZE = 3000		-- Recursive functions will abort when this is reached. Therefore,
 -				-- this is also limits the maximum circuit size.
 +function mesecon.setting(setting, default)
 +	if type(default) == "bool" then
 +		return minetest.setting_getbool("mesecon."..setting) or default
 +	elseif type(default) == "string" then
 +		return minetest.setting_get("mesecon."..setting) or default
 +	elseif type(default) == "number" then
 +		return tonumber(minetest.setting_get("mesecon."..setting) or default)
 +	end
 +end
 diff --git a/mesecons/textures/jeija_mesecon_crossing_off.png b/mesecons/textures/jeija_mesecon_crossing_off.pngBinary files differ deleted file mode 100644 index 4e3ca03..0000000 --- a/mesecons/textures/jeija_mesecon_crossing_off.png +++ /dev/null diff --git a/mesecons/textures/jeija_mesecon_crossing_on.png b/mesecons/textures/jeija_mesecon_crossing_on.pngBinary files differ deleted file mode 100644 index 4518fa7..0000000 --- a/mesecons/textures/jeija_mesecon_crossing_on.png +++ /dev/null diff --git a/mesecons/textures/jeija_mesecon_curved_off.png b/mesecons/textures/jeija_mesecon_curved_off.pngBinary files differ deleted file mode 100644 index b34335f..0000000 --- a/mesecons/textures/jeija_mesecon_curved_off.png +++ /dev/null diff --git a/mesecons/textures/jeija_mesecon_curved_on.png b/mesecons/textures/jeija_mesecon_curved_on.pngBinary files differ deleted file mode 100644 index fa882e4..0000000 --- a/mesecons/textures/jeija_mesecon_curved_on.png +++ /dev/null diff --git a/mesecons/textures/jeija_mesecon_inverter_off.png b/mesecons/textures/jeija_mesecon_inverter_off.pngBinary files differ deleted file mode 100644 index bd4de1b..0000000 --- a/mesecons/textures/jeija_mesecon_inverter_off.png +++ /dev/null diff --git a/mesecons/textures/jeija_mesecon_inverter_on.png b/mesecons/textures/jeija_mesecon_inverter_on.pngBinary files differ deleted file mode 100644 index be41599..0000000 --- a/mesecons/textures/jeija_mesecon_inverter_on.png +++ /dev/null diff --git a/mesecons/textures/jeija_mesecon_on.png b/mesecons/textures/jeija_mesecon_on.pngBinary files differ deleted file mode 100644 index d7ebeec..0000000 --- a/mesecons/textures/jeija_mesecon_on.png +++ /dev/null diff --git a/mesecons/textures/jeija_mesecon_plug.png b/mesecons/textures/jeija_mesecon_plug.pngBinary files differ deleted file mode 100644 index 8a4d281..0000000 --- a/mesecons/textures/jeija_mesecon_plug.png +++ /dev/null diff --git a/mesecons/textures/jeija_mesecon_socket_off.png b/mesecons/textures/jeija_mesecon_socket_off.pngBinary files differ deleted file mode 100644 index ad3f601..0000000 --- a/mesecons/textures/jeija_mesecon_socket_off.png +++ /dev/null diff --git a/mesecons/textures/jeija_mesecon_socket_on.png b/mesecons/textures/jeija_mesecon_socket_on.pngBinary files differ deleted file mode 100644 index 6a9c480..0000000 --- a/mesecons/textures/jeija_mesecon_socket_on.png +++ /dev/null diff --git a/mesecons/textures/jeija_mesecon_t_junction_off.png b/mesecons/textures/jeija_mesecon_t_junction_off.pngBinary files differ deleted file mode 100644 index 7131846..0000000 --- a/mesecons/textures/jeija_mesecon_t_junction_off.png +++ /dev/null diff --git a/mesecons/textures/jeija_mesecon_t_junction_on.png b/mesecons/textures/jeija_mesecon_t_junction_on.pngBinary files differ deleted file mode 100644 index a6609ee..0000000 --- a/mesecons/textures/jeija_mesecon_t_junction_on.png +++ /dev/null diff --git a/mesecons/textures/jeija_mesecon_off.png b/mesecons/textures/mesecons_wire_inv.pngBinary files differ index a3930cb..a3930cb 100644 --- a/mesecons/textures/jeija_mesecon_off.png +++ b/mesecons/textures/mesecons_wire_inv.png diff --git a/mesecons/textures/wires_full_off.png b/mesecons/textures/mesecons_wire_off.pngBinary files differ index 58164fa..58164fa 100644 --- a/mesecons/textures/wires_full_off.png +++ b/mesecons/textures/mesecons_wire_off.png diff --git a/mesecons/textures/wires_full_on.png b/mesecons/textures/mesecons_wire_on.pngBinary files differ index 98a86c8..98a86c8 100644 --- a/mesecons/textures/wires_full_on.png +++ b/mesecons/textures/mesecons_wire_on.png diff --git a/mesecons/textures/wires_bump_off.png b/mesecons/textures/wires_bump_off.pngBinary files differ deleted file mode 100644 index 1e0bd74..0000000 --- a/mesecons/textures/wires_bump_off.png +++ /dev/null diff --git a/mesecons/textures/wires_bump_on.png b/mesecons/textures/wires_bump_on.pngBinary files differ deleted file mode 100644 index da9a661..0000000 --- a/mesecons/textures/wires_bump_on.png +++ /dev/null diff --git a/mesecons/textures/wires_inv.png b/mesecons/textures/wires_inv.pngBinary files differ deleted file mode 100644 index 626f8d4..0000000 --- a/mesecons/textures/wires_inv.png +++ /dev/null diff --git a/mesecons/textures/wires_off.png b/mesecons/textures/wires_off.pngBinary files differ deleted file mode 100644 index 757d339..0000000 --- a/mesecons/textures/wires_off.png +++ /dev/null diff --git a/mesecons/textures/wires_on.png b/mesecons/textures/wires_on.pngBinary files differ deleted file mode 100644 index 57bb82d..0000000 --- a/mesecons/textures/wires_on.png +++ /dev/null diff --git a/mesecons/textures/wires_vertical_off.png b/mesecons/textures/wires_vertical_off.pngBinary files differ deleted file mode 100644 index ba8d472..0000000 --- a/mesecons/textures/wires_vertical_off.png +++ /dev/null diff --git a/mesecons/textures/wires_vertical_on.png b/mesecons/textures/wires_vertical_on.pngBinary files differ deleted file mode 100644 index 172fa65..0000000 --- a/mesecons/textures/wires_vertical_on.png +++ /dev/null diff --git a/mesecons/util.lua b/mesecons/util.lua index 91d435a..11cc95a 100644 --- a/mesecons/util.lua +++ b/mesecons/util.lua @@ -1,4 +1,4 @@ -function mesecon:move_node(pos, newpos) +function mesecon.move_node(pos, newpos)  	local node = minetest.get_node(pos)  	local meta = minetest.get_meta(pos):to_table()  	minetest.remove_node(pos) @@ -7,18 +7,18 @@ function mesecon:move_node(pos, newpos)  end  --[[ new functions: -mesecon:flattenrules(allrules) -mesecon:rule2bit(findrule, allrules) -mesecon:rule2meta(findrule, allrules) +mesecon.flattenrules(allrules) +mesecon.rule2bit(findrule, allrules) +mesecon.rule2meta(findrule, allrules)  dec2bin(n) -mesecon:getstate(nodename, states) -mesecon:getbinstate(nodename, states) -mesecon:get_bit(binary, bit) -mesecon:set_bit(binary, bit, value) -mesecon:invertRule(r) +mesecon.getstate(nodename, states) +mesecon.getbinstate(nodename, states) +mesecon.get_bit(binary, bit) +mesecon.set_bit(binary, bit, value) +mesecon.invertRule(r)  --]] -function mesecon:flattenrules(allrules) +function mesecon.flattenrules(allrules)  --[[  	{  		{ @@ -53,7 +53,7 @@ function mesecon:flattenrules(allrules)  --]]  end -function mesecon:rule2bit(findrule, allrules) +function mesecon.rule2bit(findrule, allrules)  	--get the bit of the metarule the rule is in, or bit 1  	if (allrules[1] and  	    allrules[1].x) or @@ -62,14 +62,14 @@ function mesecon:rule2bit(findrule, allrules)  	end  	for m,metarule in ipairs( allrules) do  	for _,    rule in ipairs(metarule ) do -		if mesecon:cmpPos(findrule, rule) and mesecon:cmpSpecial(findrule, rule) then +		if mesecon.cmpPos(findrule, rule) and mesecon.cmpSpecial(findrule, rule) then  			return m  		end  	end  	end  end -function mesecon:rule2metaindex(findrule, allrules) +function mesecon.rule2metaindex(findrule, allrules)  	--get the metarule the rule is in, or allrules  	if allrules[1].x then @@ -77,20 +77,20 @@ function mesecon:rule2metaindex(findrule, allrules)  	end  	if not(findrule) then -		return mesecon:flattenrules(allrules) +		return mesecon.flattenrules(allrules)  	end  	for m, metarule in ipairs( allrules) do  	for _,     rule in ipairs(metarule ) do -		if mesecon:cmpPos(findrule, rule) and mesecon:cmpSpecial(findrule, rule) then +		if mesecon.cmpPos(findrule, rule) and mesecon.cmpSpecial(findrule, rule) then  			return m  		end  	end  	end  end -function mesecon:rule2meta(findrule, allrules) -	local index = mesecon:rule2metaindex(findrule, allrules) +function mesecon.rule2meta(findrule, allrules) +	local index = mesecon.rule2metaindex(findrule, allrules)  	if index == nil then  		if allrules[1].x then  			return allrules @@ -119,7 +119,7 @@ else  	end  end -function mesecon:getstate(nodename, states) +function mesecon.getstate(nodename, states)  	for state, name in ipairs(states) do  		if name == nodename then  			return state @@ -128,23 +128,23 @@ function mesecon:getstate(nodename, states)  	error(nodename.." doesn't mention itself in "..dump(states))  end -function mesecon:getbinstate(nodename, states) -	return dec2bin(mesecon:getstate(nodename, states)-1) +function mesecon.getbinstate(nodename, states) +	return dec2bin(mesecon.getstate(nodename, states)-1)  end -function mesecon:get_bit(binary,bit) +function mesecon.get_bit(binary,bit)  	bit = bit or 1  	local c = binary:len()-(bit-1)  	return binary:sub(c,c) == "1"  end -function mesecon:set_bit(binary,bit,value) +function mesecon.set_bit(binary,bit,value)  	if value == "1" then -		if not mesecon:get_bit(binary,bit) then +		if not mesecon.get_bit(binary,bit) then  			return dec2bin(tonumber(binary,2)+math.pow(2,bit-1))  		end  	elseif value == "0" then -		if mesecon:get_bit(binary,bit) then +		if mesecon.get_bit(binary,bit) then  			return dec2bin(tonumber(binary,2)-math.pow(2,bit-1))  		end  	end @@ -152,29 +152,29 @@ function mesecon:set_bit(binary,bit,value)  end -function mesecon:invertRule(r) +function mesecon.invertRule(r)  	return {x = -r.x, y = -r.y, z = -r.z, sx = r.sx, sy = r.sy, sz = r.sz}  end -function mesecon:addPosRule(p, r) +function mesecon.addPosRule(p, r)  	return {x = p.x + r.x, y = p.y + r.y, z = p.z + r.z}  end -function mesecon:cmpPos(p1, p2) +function mesecon.cmpPos(p1, p2)  	return (p1.x == p2.x and p1.y == p2.y and p1.z == p2.z)  end -function mesecon:cmpSpecial(r1, r2) +function mesecon.cmpSpecial(r1, r2)  	return (r1.sx == r2.sx and r1.sy == r2.sy and r1.sz == r2.sz)  end -function mesecon:tablecopy(table) -- deep table copy +function mesecon.tablecopy(table) -- deep table copy  	if type(table) ~= "table" then return table end -- no need to copy  	local newtable = {}  	for idx, item in pairs(table) do  		if type(item) == "table" then -			newtable[idx] = mesecon:tablecopy(item) +			newtable[idx] = mesecon.tablecopy(item)  		else  			newtable[idx] = item  		end @@ -183,13 +183,53 @@ function mesecon:tablecopy(table) -- deep table copy  	return newtable  end -function mesecon:cmpAny(t1, t2) +function mesecon.cmpAny(t1, t2)  	if type(t1) ~= type(t2) then return false end  	if type(t1) ~= "table" and type(t2) ~= "table" then return t1 == t2 end  	for i, e in pairs(t1) do -		if not mesecon:cmpAny(e, t2[i]) then return false end +		if not mesecon.cmpAny(e, t2[i]) then return false end  	end  	return true  end + +-- does not overwrite values; number keys (ipairs) are appended, not overwritten +function mesecon.mergetable(source, dest) +	local rval = mesecon.tablecopy(dest) + +	for k, v in pairs(source) do +		rval[k] = dest[k] or mesecon.tablecopy(v) +	end +	for i, v in ipairs(source) do +		table.insert(rval, mesecon.tablecopy(v)) +	end + +	return rval +end + +function mesecon.register_node(name, spec_common, spec_off, spec_on) +	spec_common.drop = spec_common.drop or name .. "_off" +	spec_common.__mesecon_basename = name +	spec_on.__mesecon_state = "on" +	spec_off.__mesecon_state = "off" + +	spec_on = mesecon.mergetable(spec_common, spec_on); +	spec_off = mesecon.mergetable(spec_common, spec_off); + +	minetest.register_node(name .. "_on", spec_on) +	minetest.register_node(name .. "_off", spec_off) +end + +-- swap onstate and offstate nodes, returns new state +function mesecon.flipstate(pos, node) +	local nodedef = minetest.registered_nodes[node.name] +	local newstate +	if (nodedef.__mesecon_state == "on") then newstate = "off" end +	if (nodedef.__mesecon_state == "off") then newstate = "on" end +		 +	minetest.swap_node(pos, {name = nodedef.__mesecon_basename .. "_" .. newstate, +		param2 = node.param2}) + +	return newstate +end diff --git a/mesecons/wires.lua b/mesecons/wires.lua index 499c781..357181f 100644 --- a/mesecons/wires.lua +++ b/mesecons/wires.lua @@ -1,280 +1,251 @@ --- naming scheme: wire:(xp)(zp)(xm)(zm)_on/off --- The conditions in brackets define whether there is a mesecon at that place or not --- 1 = there is one; 0 = there is none --- y always means y+ - -box_center = {-1/16, -.5, -1/16, 1/16, -.5+1/16, 1/16} -box_bump1 =  { -2/16, -8/16,  -2/16, 2/16, -13/32, 2/16 } - -box_xp = {1/16, -.5, -1/16, 8/16, -.5+1/16, 1/16} -box_zp = {-1/16, -.5, 1/16, 1/16, -.5+1/16, 8/16} -box_xm = {-8/16, -.5, -1/16, -1/16, -.5+1/16, 1/16} -box_zm = {-1/16, -.5, -8/16, 1/16, -.5+1/16, -1/16} - -box_xpy = {.5-1/16, -.5+1/16, -1/16, .5, .4999+1/16, 1/16} -box_zpy = {-1/16, -.5+1/16, .5-1/16, 1/16, .4999+1/16, .5} -box_xmy = {-.5, -.5+1/16, -1/16, -.5+1/16, .4999+1/16, 1/16} -box_zmy = {-1/16, -.5+1/16, -.5, 1/16, .4999+1/16, -.5+1/16} - --- Registering the wires - -for xp=0, 1 do -for zp=0, 1 do -for xm=0, 1 do -for zm=0, 1 do -for xpy=0, 1 do -for zpy=0, 1 do -for xmy=0, 1 do -for zmy=0, 1 do -	if (xpy == 1 and xp == 0) or (zpy == 1 and zp == 0)  -	or (xmy == 1 and xm == 0) or (zmy == 1 and zm == 0) then break end - -	local groups -	local nodeid = 	tostring(xp )..tostring(zp )..tostring(xm )..tostring(zm ).. -			tostring(xpy)..tostring(zpy)..tostring(xmy)..tostring(zmy) - -	if nodeid == "00000000" then -		groups = {dig_immediate = 3, mesecon_conductor_craftable=1} -		wiredesc = "Mesecon" -	else -		groups = {dig_immediate = 3, not_in_creative_inventory = 1} -		wiredesc = "Mesecons Wire (ID: "..nodeid..")" +-- naming scheme: wire:(xp)(zp)(xm)(zm)(xpyp)(zpyp)(xmyp)(zmyp)_on/off +-- where x= x direction, z= z direction, y= y direction, p = +1, m = -1, e.g. xpym = {x=1, y=-1, z=0} +-- The (xp)/(zpyp)/.. statements shall be replaced by either 0 or 1 +-- Where 0 means the wire has no visual connection to that direction and +-- 1 means that the wire visually connects to that other node. + +-- ####################### +-- ## Update wire looks ## +-- ####################### + +-- self_pos = pos of any mesecon node, from_pos = pos of conductor to getconnect for +local wire_getconnect = function (from_pos, self_pos) +	local node = minetest.get_node(self_pos) +	if minetest.registered_nodes[node.name] +	and minetest.registered_nodes[node.name].mesecons then +		-- rules of node to possibly connect to +		local rules = {} +		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) +		end + +		for _, r in ipairs(mesecon.flattenrules(rules)) do +			if (mesecon.cmpPos(mesecon.addPosRule(self_pos, r), from_pos)) then +				return true +			end +		end  	end +	return false +end -	local nodebox = {} -	local adjx = false -	local adjz = false -	if xp == 1 then table.insert(nodebox, box_xp) adjx = true end -	if zp == 1 then table.insert(nodebox, box_zp) adjz = true end -	if xm == 1 then table.insert(nodebox, box_xm) adjx = true end -	if zm == 1 then table.insert(nodebox, box_zm) adjz = true end -	if xpy == 1 then table.insert(nodebox, box_xpy) end -	if zpy == 1 then table.insert(nodebox, box_zpy) end -	if xmy == 1 then table.insert(nodebox, box_xmy) end -	if zmy == 1 then table.insert(nodebox, box_zmy) end - -	if adjx and adjz and (xp + zp + xm + zm > 2) then -		table.insert(nodebox, box_bump1) -		tiles_off = { -			"wires_bump_off.png", -			"wires_bump_off.png", -			"wires_vertical_off.png", -			"wires_vertical_off.png", -			"wires_vertical_off.png", -			"wires_vertical_off.png" -		} -		tiles_on = { -			"wires_bump_on.png", -			"wires_bump_on.png", -			"wires_vertical_on.png", -			"wires_vertical_on.png", -			"wires_vertical_on.png", -			"wires_vertical_on.png" -		} -	else -		table.insert(nodebox, box_center) -		tiles_off = { -			"wires_off.png", -			"wires_off.png", -			"wires_vertical_off.png", -			"wires_vertical_off.png", -			"wires_vertical_off.png", -			"wires_vertical_off.png" -		} -		tiles_on = { -			"wires_on.png", -			"wires_on.png", -			"wires_vertical_on.png", -			"wires_vertical_on.png", -			"wires_vertical_on.png", -			"wires_vertical_on.png" -		} +-- Update this node +local wire_updateconnect = function (pos) +	local connections = {} + +	for _, r in ipairs(mesecon.rules.default) do +		if wire_getconnect(pos, mesecon.addPosRule(pos, r)) then +			table.insert(connections, r) +		end  	end -	if nodeid == "00000000" then -		nodebox = {-8/16, -.5, -1/16, 8/16, -.5+1/16, 1/16} +	local nid = {} +	for _, vec in ipairs(connections) do +		-- flat component +		if vec.x ==  1 then nid[0] = "1" end +		if vec.z ==  1 then nid[1] = "1" end +		if vec.x == -1 then nid[2] = "1" end +		if vec.z == -1 then nid[3] = "1"  end + +		-- slopy component +		if vec.y == 1 then +			if vec.x ==  1 then nid[4] = "1" end +			if vec.z ==  1 then nid[5] = "1" end +			if vec.x == -1 then nid[6] = "1" end +			if vec.z == -1 then nid[7] = "1" end +		end  	end -	minetest.register_node("mesecons:wire_"..nodeid.."_off", { -		description = wiredesc, -		drawtype = "nodebox", -		tiles = tiles_off, ---		inventory_image = "wires_inv.png", ---		wield_image = "wires_inv.png", -		inventory_image = "jeija_mesecon_off.png", -		wield_image = "jeija_mesecon_off.png", -		paramtype = "light", -		paramtype2 = "facedir", -		sunlight_propagates = true, -		selection_box = { -              		type = "fixed", -			fixed = {-.5, -.5, -.5, .5, -.5+4/16, .5} -		}, -		node_box = { -			type = "fixed", -			fixed = nodebox -		}, -		groups = groups, -		walkable = false, -		stack_max = 99, -		drop = "mesecons:wire_00000000_off", -		mesecons = {conductor={ -			state = mesecon.state.off, -			onstate = "mesecons:wire_"..nodeid.."_on" -		}} -	}) - -	minetest.register_node("mesecons:wire_"..nodeid.."_on", { -		description = "Wire ID:"..nodeid, -		drawtype = "nodebox", -		tiles = tiles_on, ---		inventory_image = "wires_inv.png", ---		wield_image = "wires_inv.png", -		inventory_image = "jeija_mesecon_off.png", -		wield_image = "jeija_mesecon_off.png", -		paramtype = "light", -		paramtype2 = "facedir", -		sunlight_propagates = true, -		selection_box = { -              		type = "fixed", -			fixed = {-.5, -.5, -.5, .5, -.5+4/16, .5} -		}, -		node_box = { -			type = "fixed", -			fixed = nodebox -		}, -		groups = {dig_immediate = 3, mesecon = 2, not_in_creative_inventory = 1}, -		walkable = false, -		stack_max = 99, -		drop = "mesecons:wire_00000000_off", -		mesecons = {conductor={ -			state = mesecon.state.on, -			offstate = "mesecons:wire_"..nodeid.."_off" -		}} -	}) -end -end -end -end -end -end -end -end +	local nodeid = 	  (nid[0] or "0")..(nid[1] or "0")..(nid[2] or "0")..(nid[3] or "0") +			..(nid[4] or "0")..(nid[5] or "0")..(nid[6] or "0")..(nid[7] or "0") --- Updating the wires: --- Place the right connection wire +	local state_suffix = string.find(minetest.get_node(pos).name, "_off") and "_off" or "_on" +	minetest.set_node(pos, {name = "mesecons:wire_"..nodeid..state_suffix}) +end  local update_on_place_dig = function (pos, node) -	if minetest.registered_nodes[node.name] -	and minetest.registered_nodes[node.name].mesecons then -		mesecon:update_autoconnect(pos) +	-- Update placed node (get_node again as it may have been dug) +	local nn = minetest.get_node(pos) +	if (minetest.registered_nodes[nn.name]) +	and (minetest.registered_nodes[nn.name].mesecon_wire) then +		wire_updateconnect(pos)  	end -end -minetest.register_on_placenode(update_on_place_dig) -minetest.register_on_dignode(update_on_place_dig) - -function mesecon:update_autoconnect(pos, secondcall, replace_old) -	local xppos = {x=pos.x+1, y=pos.y, z=pos.z} -	local zppos = {x=pos.x, y=pos.y, z=pos.z+1} -	local xmpos = {x=pos.x-1, y=pos.y, z=pos.z} -	local zmpos = {x=pos.x, y=pos.y, z=pos.z-1} - -	local xpympos = {x=pos.x+1, y=pos.y-1, z=pos.z} -	local zpympos = {x=pos.x, y=pos.y-1, z=pos.z+1} -	local xmympos = {x=pos.x-1, y=pos.y-1, z=pos.z} -	local zmympos = {x=pos.x, y=pos.y-1, z=pos.z-1} - -	local xpypos = {x=pos.x+1, y=pos.y+1, z=pos.z} -	local zpypos = {x=pos.x, y=pos.y+1, z=pos.z+1} -	local xmypos = {x=pos.x-1, y=pos.y+1, z=pos.z} -	local zmypos = {x=pos.x, y=pos.y+1, z=pos.z-1} - -	if secondcall == nil then -		mesecon:update_autoconnect(xppos, true) -		mesecon:update_autoconnect(zppos, true) -		mesecon:update_autoconnect(xmpos, true) -		mesecon:update_autoconnect(zmpos, true) - -		mesecon:update_autoconnect(xpypos, true) -		mesecon:update_autoconnect(zpypos, true) -		mesecon:update_autoconnect(xmypos, true) -		mesecon:update_autoconnect(zmypos, true) - -		mesecon:update_autoconnect(xpympos, true) -		mesecon:update_autoconnect(zpympos, true) -		mesecon:update_autoconnect(xmympos, true) -		mesecon:update_autoconnect(zmympos, true) +	-- Update nodes around it +	local rules = {} +	if minetest.registered_nodes[node.name] +	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) +	end +	if (not rules) then return end + +	for _, r in ipairs(mesecon.flattenrules(rules)) do +		local np = mesecon.addPosRule(pos, r) +		if minetest.registered_nodes[minetest.get_node(np).name] +		and minetest.registered_nodes[minetest.get_node(np).name].mesecon_wire then +			wire_updateconnect(np) +		end  	end +end -	nodename = minetest.get_node(pos).name -	if string.find(nodename, "mesecons:wire_") == nil and not replace_old then return nil end +function mesecon.update_autoconnect(pos, node) +	if (not node) then node = minetest.get_node(pos) end +	update_on_place_dig(pos, node) +end -	if mesecon:rules_link_anydir(pos, xppos) then xp = 1 else xp = 0 end -	if mesecon:rules_link_anydir(pos, xmpos) then xm = 1 else xm = 0 end -	if mesecon:rules_link_anydir(pos, zppos) then zp = 1 else zp = 0 end -	if mesecon:rules_link_anydir(pos, zmpos) then zm = 1 else zm = 0 end +-- ############################ +-- ## Wire node registration ## +-- ############################ +-- Nodeboxes: +local box_center = {-1/16, -.5, -1/16, 1/16, -.5+1/16, 1/16} +local box_bump1 =  { -2/16, -8/16,  -2/16, 2/16, -13/32, 2/16 } + +local nbox_nid = +{ +	[0] = {1/16, -.5, -1/16, 8/16, -.5+1/16, 1/16}, -- x positive +	[1] = {-1/16, -.5, 1/16, 1/16, -.5+1/16, 8/16}, -- z positive +	[2] = {-8/16, -.5, -1/16, -1/16, -.5+1/16, 1/16}, -- x negative +	[3] = {-1/16, -.5, -8/16, 1/16, -.5+1/16, -1/16}, -- z negative + +	[4] = {.5-1/16, -.5+1/16, -1/16, .5, .4999+1/16, 1/16}, -- x positive up +	[5] = {-1/16, -.5+1/16, .5-1/16, 1/16, .4999+1/16, .5}, -- z positive up +	[6] = {-.5, -.5+1/16, -1/16, -.5+1/16, .4999+1/16, 1/16}, -- x negative up +	[7] = {-1/16, -.5+1/16, -.5, 1/16, .4999+1/16, -.5+1/16}  -- z negative up +} + +local tiles_off = { "mesecons_wire_off.png" } +local tiles_on = { "mesecons_wire_on.png" } + +local selectionbox = +{ +	type = "fixed", +	fixed = {-.5, -.5, -.5, .5, -.5+4/16, .5} +} + +-- go to the next nodeid (ex.: 01000011 --> 01000100) +local nid_inc = function() end +nid_inc = function (nid) +	local i = 0 +	while nid[i-1] ~= 1 do +		nid[i] = (nid[i] ~= 1) and 1 or 0 +		i = i + 1 +	end -	if mesecon:rules_link_anydir(pos, xpympos) then xp = 1 end -	if mesecon:rules_link_anydir(pos, xmympos) then xm = 1 end -	if mesecon:rules_link_anydir(pos, zpympos) then zp = 1 end -	if mesecon:rules_link_anydir(pos, zmympos) then zm = 1 end +	-- BUT: Skip impossible nodeids: +	if ((nid[0] == 0 and nid[4] == 1) or (nid[1] == 0 and nid[5] == 1)  +	or (nid[2] == 0 and nid[6] == 1) or (nid[3] == 0 and nid[7] == 1)) then +		return nid_inc(nid) +	end -	if mesecon:rules_link_anydir(pos, xpypos) then xpy = 1 else xpy = 0 end -	if mesecon:rules_link_anydir(pos, zpypos) then zpy = 1 else zpy = 0 end -	if mesecon:rules_link_anydir(pos, xmypos) then xmy = 1 else xmy = 0 end -	if mesecon:rules_link_anydir(pos, zmypos) then zmy = 1 else zmy = 0 end +	return i <= 8 +end -	if xpy == 1 then xp = 1 end -	if zpy == 1 then zp = 1 end -	if xmy == 1 then xm = 1 end -	if zmy == 1 then zm = 1 end +register_wires = function() +	local nid = {} +	while true do +		-- Create group specifiction and nodeid string (see note above for details) +		local nodeid = 	  (nid[0] or "0")..(nid[1] or "0")..(nid[2] or "0")..(nid[3] or "0") +				..(nid[4] or "0")..(nid[5] or "0")..(nid[6] or "0")..(nid[7] or "0") + +		-- Calculate nodebox +		local nodebox = {type = "fixed", fixed={box_center}} +		for i=0,7 do +			if nid[i] == 1 then +				table.insert(nodebox.fixed, nbox_nid[i]) +			end +		end + +		-- Add bump to nodebox if curved +		if (nid[0] == 1 and nid[1] == 1) or (nid[1] == 1 and nid[2] == 1) +		or (nid[2] == 1 and nid[3] == 1) or (nid[3] == 1 and nid[0] == 1) then +			table.insert(nodebox.fixed, box_bump1) +		end + +		-- If nothing to connect to, still make a nodebox of a straight wire +		if nodeid == "00000000" then +			nodebox.fixed = {-8/16, -.5, -1/16, 8/16, -.5+1/16, 1/16} +		end + +		local rules = {} +		if (nid[0] == 1) then table.insert(rules, vector.new( 1,  0,  0)) end +		if (nid[1] == 1) then table.insert(rules, vector.new( 0,  0,  1)) end +		if (nid[2] == 1) then table.insert(rules, vector.new(-1,  0,  0)) end +		if (nid[3] == 1) then table.insert(rules, vector.new( 0,  0, -1)) end + +		if (nid[0] == 1) then table.insert(rules, vector.new( 1, -1,  0)) end +		if (nid[1] == 1) then table.insert(rules, vector.new( 0, -1,  1)) end +		if (nid[2] == 1) then table.insert(rules, vector.new(-1, -1,  0)) end +		if (nid[3] == 1) then table.insert(rules, vector.new( 0, -1, -1)) end + +		if (nid[4] == 1) then table.insert(rules, vector.new( 1,  1,  0)) end +		if (nid[5] == 1) then table.insert(rules, vector.new( 0,  1,  1)) end +		if (nid[6] == 1) then table.insert(rules, vector.new(-1,  1,  0)) end +		if (nid[7] == 1) then table.insert(rules, vector.new( 0,  1, -1)) end + +		local meseconspec_off = { conductor = { +			rules = rules, +			state = mesecon.state.off, +			onstate = "mesecons:wire_"..nodeid.."_on" +		}} -	local nodeid = 	tostring(xp )..tostring(zp )..tostring(xm )..tostring(zm ).. -			tostring(xpy)..tostring(zpy)..tostring(xmy)..tostring(zmy) +		local meseconspec_on = { conductor = { +			rules = rules, +			state = mesecon.state.on, +			offstate = "mesecons:wire_"..nodeid.."_off" +		}} -	 -	if string.find(nodename, "_off") ~= nil then -		minetest.set_node(pos, {name = "mesecons:wire_"..nodeid.."_off"}) -	else -		minetest.set_node(pos, {name = "mesecons:wire_"..nodeid.."_on" }) +		local groups_on = {dig_immediate = 3, not_in_creative_inventory = 1} +		local groups_off = {dig_immediate = 3} +		if nodeid ~= "00000000" then +			groups_off["not_in_creative_inventory"] = 1 +		end + +		mesecon.register_node("mesecons:wire_"..nodeid, { +			description = "Mesecon", +			drawtype = "nodebox", +			inventory_image = "mesecons_wire_inv.png", +			wield_image = "mesecons_wire_inv.png", +			paramtype = "light", +			paramtype2 = "facedir", +			sunlight_propagates = true, +			selection_box = selectionbox, +			node_box = nodebox, +			walkable = false, +			drop = "mesecons:wire_00000000_off", +			mesecon_wire = true +		}, {tiles = tiles_off, mesecons = meseconspec_off, groups = groups_off}, +		{tiles = tiles_on, mesecons = meseconspec_on, groups = groups_on}) + +		if (nid_inc(nid) == false) then return end  	end  end +register_wires() -if not minetest.registered_nodes["default:stone_with_mese"] then --before MESE update, use old recipes -	minetest.register_craft({ -		output = "mesecons:wire_00000000_off 18", -		recipe = { -			{"default:mese"}, -		} -	}) -else - -	minetest.register_craft({ -		type = "cooking", -		output = "mesecons:wire_00000000_off 2", -		recipe = "default:mese_crystal_fragment", -		cooktime = 3, -	}) - -	minetest.register_craft({ -		type = "cooking", -		output = "mesecons:wire_00000000_off 18", -		recipe = "default:mese_crystal", -		cooktime = 15, -	}) - -	minetest.register_craft({ -		type = "cooking", -		output = "mesecons:wire_00000000_off 162", -		recipe = "default:mese", -		cooktime = 30, -	}) - -end +-- ############## +-- ## Crafting ## +-- ############## +minetest.register_craft({ +	type = "cooking", +	output = "mesecons:wire_00000000_off 2", +	recipe = "default:mese_crystal_fragment", +	cooktime = 3, +})  minetest.register_craft({  	type = "cooking", -	output = "mesecons:wire_00000000_off 16", +	output = "mesecons:wire_00000000_off 18",  	recipe = "default:mese_crystal", +	cooktime = 15, +}) + +minetest.register_craft({ +	type = "cooking", +	output = "mesecons:wire_00000000_off 162", +	recipe = "default:mese", +	cooktime = 30,  }) diff --git a/mesecons_blinkyplant/init.lua b/mesecons_blinkyplant/init.lua index f0ab81f..c3bb3f7 100644 --- a/mesecons_blinkyplant/init.lua +++ b/mesecons_blinkyplant/init.lua @@ -1,98 +1,51 @@  -- The BLINKY_PLANT -minetest.register_node("mesecons_blinkyplant:blinky_plant", { -	drawtype = "plantlike", -	visual_scale = 1, -	tiles = {"jeija_blinky_plant_off.png"}, -	inventory_image = "jeija_blinky_plant_off.png", -	walkable = false, -	groups = {dig_immediate=3, not_in_creative_inventory=1}, -	drop="mesecons_blinkyplant:blinky_plant_off 1", -    description="Deactivated Blinky Plant", -	sounds = default.node_sound_leaves_defaults(), -	selection_box = { -		type = "fixed", -		fixed = {-0.3, -0.5, -0.3, 0.3, -0.5+0.7, 0.3}, -	}, -	mesecons = {receptor = { -		state = mesecon.state.off -	}}, -	on_rightclick = function(pos, node, clicker) -        minetest.set_node(pos, {name="mesecons_blinkyplant:blinky_plant_off"}) -    end	 -}) -minetest.register_node("mesecons_blinkyplant:blinky_plant_off", { -	drawtype = "plantlike", -	visual_scale = 1, -	tiles = {"jeija_blinky_plant_off.png"}, -	inventory_image = "jeija_blinky_plant_off.png", -	paramtype = "light", -	walkable = false, -	groups = {dig_immediate=3, mesecon=2}, -    description="Blinky Plant", -	sounds = default.node_sound_leaves_defaults(), -	selection_box = { -		type = "fixed", -		fixed = {-0.3, -0.5, -0.3, 0.3, -0.5+0.7, 0.3}, -	}, -	mesecons = {receptor = { -		state = mesecon.state.off -	}}, -	on_rightclick = function(pos, node, clicker) -        minetest.set_node(pos, {name="mesecons_blinkyplant:blinky_plant"}) -    end -}) +local toggle_timer = function (pos) +	local timer = minetest.get_node_timer(pos) +	if timer:is_started() then +		timer:stop() +	else +		timer:start(mesecon.setting("blinky_plant_interval", 3)) +	end +end + +local on_timer = function (pos) +	local node = minetest.get_node(pos) +	if(mesecon.flipstate(pos, node) == "on") then +		mesecon.receptor_on(pos) +	else +		mesecon.receptor_off(pos) +	end +	toggle_timer(pos) +end -minetest.register_node("mesecons_blinkyplant:blinky_plant_on", { +mesecon.register_node("mesecons_blinkyplant:blinky_plant", { +	description="Blinky Plant",  	drawtype = "plantlike", -	visual_scale = 1, -	tiles = {"jeija_blinky_plant_on.png"},  	inventory_image = "jeija_blinky_plant_off.png",  	paramtype = "light",  	walkable = false, -	groups = {dig_immediate=3, not_in_creative_inventory=1, mesecon=2}, -	drop="mesecons_blinkyplant:blinky_plant_off 1", -	light_source = LIGHT_MAX-7, -	description = "Blinky Plant",  	sounds = default.node_sound_leaves_defaults(),  	selection_box = {  		type = "fixed",  		fixed = {-0.3, -0.5, -0.3, 0.3, -0.5+0.7, 0.3},  	}, -	mesecons = {receptor = { -		state = mesecon.state.on -	}}, -	on_rightclick = function(pos, node, clicker) -		minetest.set_node(pos, {name = "mesecons_blinkyplant:blinky_plant"}) -		mesecon:receptor_off(pos) -	end +	on_timer = on_timer, +	on_rightclick = toggle_timer, +	on_construct = toggle_timer +},{ +	tiles = {"jeija_blinky_plant_off.png"}, +	groups = {dig_immediate=3}, +	mesecons = {receptor = { state = mesecon.state.off }} +},{ +	tiles = {"jeija_blinky_plant_on.png"}, +	groups = {dig_immediate=3, not_in_creative_inventory=1}, +	mesecons = {receptor = { state = mesecon.state.on }}  })  minetest.register_craft({  	output = "mesecons_blinkyplant:blinky_plant_off 1", -	recipe = { -	{"","group:mesecon_conductor_craftable",""}, -	{"","group:mesecon_conductor_craftable",""}, -	{"default:sapling","default:sapling","default:sapling"}, -	} +	recipe = {	{"","group:mesecon_conductor_craftable",""}, +			{"","group:mesecon_conductor_craftable",""}, +			{"default:sapling","default:sapling","default:sapling"}}  }) - -minetest.register_abm({ -	nodenames = { -		"mesecons_blinkyplant:blinky_plant_off", -		"mesecons_blinkyplant:blinky_plant_on" -	}, -	interval = BLINKY_PLANT_INTERVAL, -	chance = 1, -	action = function(pos, node, active_object_count, active_object_count_wider) -		if node.name == "mesecons_blinkyplant:blinky_plant_off" then -			minetest.add_node(pos, {name="mesecons_blinkyplant:blinky_plant_on"}) -			mesecon:receptor_on(pos) -		else -			minetest.add_node(pos, {name="mesecons_blinkyplant:blinky_plant_off"}) -			mesecon:receptor_off(pos) -		end -		nodeupdate(pos)	 -	end, -}) - diff --git a/mesecons_button/init.lua b/mesecons_button/init.lua index f4a9198..f147d8f 100644 --- a/mesecons_button/init.lua +++ b/mesecons_button/init.lua @@ -8,7 +8,7 @@ mesecon.button_turnoff = function (pos)  		minetest.swap_node(pos, {name = "mesecons_button:button_off", param2=node.param2})  		minetest.sound_play("mesecons_button_pop", {pos=pos})  		local rules = mesecon.rules.buttonlike_get(node) -		mesecon:receptor_off(pos, rules) +		mesecon.receptor_off(pos, rules)  	end  end @@ -42,7 +42,7 @@ minetest.register_node("mesecons_button:button_off", {  	description = "Button",  	on_punch = function (pos, node)  		minetest.swap_node(pos, {name = "mesecons_button:button_on", param2=node.param2}) -		mesecon:receptor_on(pos, mesecon.rules.buttonlike_get(node)) +		mesecon.receptor_on(pos, mesecon.rules.buttonlike_get(node))  		minetest.sound_play("mesecons_button_push", {pos=pos})  		minetest.after(1, mesecon.button_turnoff, pos)  	end, diff --git a/mesecons_compatibility/init.lua b/mesecons_compatibility/init.lua index 5bdce27..0ad04b2 100644 --- a/mesecons_compatibility/init.lua +++ b/mesecons_compatibility/init.lua @@ -15,6 +15,17 @@ doors = {}  --    selection_box_top  --    only_placer_can_open: if true only the player who placed the door can  --                          open it +local function is_right(pos) +	local r1 = minetest.get_node({x=pos.x-1, y=pos.y, z=pos.z}) +	local r2 = minetest.get_node({x=pos.x, y=pos.y, z=pos.z-1}) +	if string.find(r1.name, "door_") or string.find(r2.name, "door_") then +		if string.find(r1.name, "_1") or string.find(r2.name, "_1") then +			return true +		else +			return false +		end +	end +end  function doors:register_door(name, def)  	def.groups.not_in_creative_inventory = 1 @@ -59,6 +70,19 @@ function doors:register_door(name, def)  		meta = minetest.get_meta(pos):to_table()  		minetest.set_node(pos, {name=replace, param2=p2})  		minetest.get_meta(pos):from_table(meta) + +		local snd_1 = "_close" +		local snd_2 = "_open" +		if params[1] == 3 then +			snd_1 = "_open" +			snd_2 = "_close" +		end + +		if is_right(pos) then +			minetest.sound_play("door"..snd_1, {pos = pos, gain = 0.3, max_hear_distance = 10}) +		else +			minetest.sound_play("door"..snd_2, {pos = pos, gain = 0.3, max_hear_distance = 10}) +		end  	end  	local function on_mesecons_signal_open (pos, node) diff --git a/mesecons_delayer/init.lua b/mesecons_delayer/init.lua index 239d378..ba4067f 100644 --- a/mesecons_delayer/init.lua +++ b/mesecons_delayer/init.lua @@ -2,7 +2,7 @@  local delayer_get_output_rules = function(node)  	local rules = {{x = 0, y = 0, z = 1}}  	for i = 0, node.param2 do -		rules = mesecon:rotate_rules_left(rules) +		rules = mesecon.rotate_rules_left(rules)  	end  	return rules  end @@ -10,7 +10,7 @@ end  local delayer_get_input_rules = function(node)  	local rules = {{x = 0, y = 0, z = -1}}  	for i = 0, node.param2 do -		rules = mesecon:rotate_rules_left(rules) +		rules = mesecon.rotate_rules_left(rules)  	end  	return rules  end diff --git a/mesecons_detector/init.lua b/mesecons_detector/init.lua index 8d2f53c..1a8595d 100644 --- a/mesecons_detector/init.lua +++ b/mesecons_detector/init.lua @@ -23,7 +23,7 @@ end  -- returns true if player was found, false if not  local object_detector_scan = function (pos) -	local objs = minetest.get_objects_inside_radius(pos, OBJECT_DETECTOR_RADIUS) +	local objs = minetest.get_objects_inside_radius(pos, mesecon.setting("detector_radius", 6))  	for k, obj in pairs(objs) do  		local isname = obj:get_player_name() -- "" is returned if it is not a player; "" ~= nil!  		local scanname = minetest.get_meta(pos):get_string("scanname") @@ -55,7 +55,8 @@ minetest.register_node("mesecons_detector:object_detector_off", {  	groups = {cracky=3},  	description="Player Detector",  	mesecons = {receptor = { -		state = mesecon.state.off +		state = mesecon.state.off, +		rules = mesecon.rules.pplate  	}},  	on_construct = object_detector_make_formspec,  	on_receive_fields = object_detector_on_receive_fields, @@ -70,7 +71,8 @@ minetest.register_node("mesecons_detector:object_detector_on", {  	groups = {cracky=3,not_in_creative_inventory=1},  	drop = 'mesecons_detector:object_detector_off',  	mesecons = {receptor = { -		state = mesecon.state.on +		state = mesecon.state.on, +		rules = mesecon.rules.pplate  	}},  	on_construct = object_detector_make_formspec,  	on_receive_fields = object_detector_on_receive_fields, @@ -94,7 +96,7 @@ minetest.register_abm(  	action = function(pos)  		if object_detector_scan(pos) then  			minetest.swap_node(pos, {name = "mesecons_detector:object_detector_on"}) -			mesecon:receptor_on(pos) +			mesecon.receptor_on(pos, mesecon.rules.pplate)  		end  	end,  }) @@ -106,7 +108,7 @@ minetest.register_abm(  	action = function(pos)  		if not object_detector_scan(pos) then  			minetest.swap_node(pos, {name = "mesecons_detector:object_detector_off"}) -			mesecon:receptor_off(pos) +			mesecon.receptor_off(pos, mesecon.rules.pplate)  		end  	end,  }) @@ -248,7 +250,7 @@ minetest.register_abm(  	action = function(pos, node)  		if node_detector_scan(pos) then  			minetest.swap_node(pos, {name = "mesecons_detector:node_detector_on", param2 = node.param2}) -			mesecon:receptor_on(pos) +			mesecon.receptor_on(pos)  		end  	end,  }) @@ -260,7 +262,7 @@ minetest.register_abm(  	action = function(pos, node)  		if not node_detector_scan(pos) then  			minetest.swap_node(pos, {name = "mesecons_detector:node_detector_off", param2 = node.param2}) -			mesecon:receptor_off(pos) +			mesecon.receptor_off(pos)  		end  	end,  }) diff --git a/mesecons_extrawires/corner.lua b/mesecons_extrawires/corner.lua index d7f7a02..003275a 100644 --- a/mesecons_extrawires/corner.lua +++ b/mesecons_extrawires/corner.lua @@ -15,7 +15,7 @@ local corner_get_rules = function (node)  	 {x = 0,  y = 0,  z = -1}}  	for i = 0, node.param2 do -		rules = mesecon:rotate_rules_left(rules) +		rules = mesecon.rotate_rules_left(rules)  	end  	return rules diff --git a/mesecons_extrawires/mesewire.lua b/mesecons_extrawires/mesewire.lua index cbb882e..150178c 100644 --- a/mesecons_extrawires/mesewire.lua +++ b/mesecons_extrawires/mesewire.lua @@ -8,12 +8,7 @@ local mesewire_rules =  	{x = 0, y = 0, z =-1},  } -minetest.register_node(":default:mese", { -	description = "Mese Block", -	tiles = {minetest.registered_nodes["default:mese"].tiles[1]}, -	is_ground_content = true, -	groups = {cracky=1}, -	sounds = default.node_sound_stone_defaults(), +minetest.override_item("default:mese", {  	mesecons = {conductor = {  		state = mesecon.state.off,  		onstate = "mesecons_extrawires:mese_powered", diff --git a/mesecons_extrawires/tjunction.lua b/mesecons_extrawires/tjunction.lua index c5f36a2..680dc99 100644 --- a/mesecons_extrawires/tjunction.lua +++ b/mesecons_extrawires/tjunction.lua @@ -16,7 +16,7 @@ local tjunction_get_rules = function (node)  	 {x = 0,  y = 0,  z = -1}}  	for i = 0, node.param2 do -		rules = mesecon:rotate_rules_left(rules) +		rules = mesecon.rotate_rules_left(rules)  	end  	return rules diff --git a/mesecons_extrawires/vertical.lua b/mesecons_extrawires/vertical.lua index 16de55e..cac2ae2 100644 --- a/mesecons_extrawires/vertical.lua +++ b/mesecons_extrawires/vertical.lua @@ -18,7 +18,7 @@ local bottom_box = {  local vertical_rules = {  	{x=0, y=1, z=0}, -	{x=0, y=-1, z=0}, +	{x=0, y=-1, z=0}  }  local top_rules = { @@ -26,7 +26,7 @@ local top_rules = {  	{x=-1,y=0, z=0},  	{x=0,y=0, z=1},  	{x=0,y=0, z=-1}, -	{x=0,y=-1, z=0}, +	{x=0,y=-1, z=0}  }  local bottom_rules = { @@ -35,107 +35,79 @@ local bottom_rules = {  	{x=0, y=0, z=1},  	{x=0, y=0, z=-1},  	{x=0, y=1, z=0}, +	{x=0, y=2, z=0} -- receive power from pressure plate / detector / ... 2 nodes above  }  local vertical_updatepos = function (pos)  	local node = minetest.get_node(pos) -	if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].is_vertical_conductor then -		local node_above = minetest.get_node(mesecon:addPosRule(pos, vertical_rules[1])) -		local node_below = minetest.get_node(mesecon:addPosRule(pos, vertical_rules[2])) +	if minetest.registered_nodes[node.name] +	and minetest.registered_nodes[node.name].is_vertical_conductor then +		local node_above = minetest.get_node(mesecon.addPosRule(pos, vertical_rules[1])) +		local node_below = minetest.get_node(mesecon.addPosRule(pos, vertical_rules[2]))  		local namestate = minetest.registered_nodes[node.name].vertical_conductor_state -		local above = minetest.registered_nodes[node_above.name] and minetest.registered_nodes[node_above.name].is_vertical_conductor -		local below = minetest.registered_nodes[node_below.name] and minetest.registered_nodes[node_below.name].is_vertical_conductor +		local above = minetest.registered_nodes[node_above.name] +			and minetest.registered_nodes[node_above.name].is_vertical_conductor +		local below = minetest.registered_nodes[node_below.name] +			and minetest.registered_nodes[node_below.name].is_vertical_conductor +		local basename = "mesecons_extrawires:vertical_"  		if above and below then -- above and below: vertical mesecon -			minetest.add_node(pos, {name = "mesecons_extrawires:vertical_" .. namestate}) +			minetest.add_node(pos, {name = basename .. namestate})  		elseif above and not below then -- above only: bottom -			minetest.add_node(pos, {name = "mesecons_extrawires:vertical_bottom_" .. namestate}) +			minetest.add_node(pos, {name = basename .. "bottom_" .. namestate})  		elseif not above and below then -- below only: top -			minetest.add_node(pos, {name = "mesecons_extrawires:vertical_top_" .. namestate}) -		else -- no vertical wire above, no vertical wire below: use default wire -			minetest.add_node(pos, {name = "mesecons_extrawires:vertical_" .. namestate}) +			minetest.add_node(pos, {name = basename .. "top_" .. namestate}) +		else -- no vertical wire above, no vertical wire below: use bottom +			minetest.add_node(pos, {name = basename .. "bottom_" .. namestate})  		end +		mesecon.update_autoconnect(pos)  	end  end  local vertical_update = function (pos, node)  	vertical_updatepos(pos) -- this one -	vertical_updatepos(mesecon:addPosRule(pos, vertical_rules[1])) -- above -	vertical_updatepos(mesecon:addPosRule(pos, vertical_rules[2])) -- below +	vertical_updatepos(mesecon.addPosRule(pos, vertical_rules[1])) -- above +	vertical_updatepos(mesecon.addPosRule(pos, vertical_rules[2])) -- below  end  -- Vertical wire -minetest.register_node("mesecons_extrawires:vertical_on", { +mesecon.register_node("mesecons_extrawires:vertical", {  	description = "Vertical mesecon",  	drawtype = "nodebox", -	tiles = {"wires_vertical_on.png"},  	walkable = false,  	paramtype = "light",  	sunlight_propagates = true, -	groups = {dig_immediate=3, not_in_creative_inventory=1},  	selection_box = vertical_box,  	node_box = vertical_box,  	is_vertical_conductor = true, -	vertical_conductor_state = "on", -	mesecons = {conductor = { -		state = mesecon.state.on, -		offstate = "mesecons_extrawires:vertical_off", -		rules = vertical_rules, -	}},  	drop = "mesecons_extrawires:vertical_off",  	after_place_node = vertical_update, -	after_dig_node = vertical_update, -}) - -minetest.register_node("mesecons_extrawires:vertical_off", { -	description = "Vertical mesecon", -	drawtype = "nodebox", -	tiles = {"wires_vertical_off.png"}, -	walkable = false, -	paramtype = "light", -	sunlight_propagates = true, +	after_dig_node = vertical_update +},{ +	tiles = {"mesecons_wire_off.png"},  	groups = {dig_immediate=3}, -	selection_box = vertical_box, -	node_box = vertical_box, -	is_vertical_conductor = true,  	vertical_conductor_state = "off",  	mesecons = {conductor = {  		state = mesecon.state.off,  		onstate = "mesecons_extrawires:vertical_on",  		rules = vertical_rules, -	}}, -	after_place_node = vertical_update, -	after_dig_node = vertical_update, -}) - --- Vertical wire top -minetest.register_node("mesecons_extrawires:vertical_top_on", { -	description = "Vertical mesecon", -	drawtype = "nodebox", -	tiles = {"wires_full_on.png","wires_full_on.png","wires_vertical_on.png"}, -	walkable = false, -	paramtype = "light", -	sunlight_propagates = true, +	}} +},{ +	tiles = {"mesecons_wire_on.png"},  	groups = {dig_immediate=3, not_in_creative_inventory=1}, -	selection_box = top_box, -	node_box = top_box, -	is_vertical_conductor = true,  	vertical_conductor_state = "on",  	mesecons = {conductor = {  		state = mesecon.state.on, -		offstate = "mesecons_extrawires:vertical_top_off", -		rules = top_rules, -	}}, -	drop = "mesecons_extrawires:vertical_off", -	after_place_node = vertical_update, -	after_dig_node = vertical_update, +		offstate = "mesecons_extrawires:vertical_off", +		rules = vertical_rules, +	}}  }) -minetest.register_node("mesecons_extrawires:vertical_top_off", { +-- Vertical wire top +mesecon.register_node("mesecons_extrawires:vertical_top", {  	description = "Vertical mesecon",  	drawtype = "nodebox", -	tiles = {"wires_full_off.png","wires_full_off.png","wires_vertical_off.png"},  	walkable = false,  	paramtype = "light",  	sunlight_propagates = true, @@ -143,43 +115,31 @@ minetest.register_node("mesecons_extrawires:vertical_top_off", {  	selection_box = top_box,  	node_box = top_box,  	is_vertical_conductor = true, +	drop = "mesecons_extrawires:vertical_off", +	after_place_node = vertical_update, +	after_dig_node = vertical_update +},{ +	tiles = {"mesecons_wire_off.png"},  	vertical_conductor_state = "off",  	mesecons = {conductor = {  		state = mesecon.state.off,  		onstate = "mesecons_extrawires:vertical_top_on",  		rules = top_rules, -	}}, -	drop = "mesecons_extrawires:vertical_off", -	after_place_node = vertical_update, -	after_dig_node = vertical_update, -}) - --- Vertical wire bottom -minetest.register_node("mesecons_extrawires:vertical_bottom_on", { -	description = "Vertical mesecon", -	drawtype = "nodebox", -	tiles = {"wires_full_on.png","wires_full_on.png","wires_vertical_on.png"}, -	walkable = false, -	paramtype = "light", -	sunlight_propagates = true, +	}} +},{ +	tiles = {"mesecons_wire_on.png"},  	vertical_conductor_state = "on", -	groups = {dig_immediate = 3, not_in_creative_inventory = 1}, -	selection_box = bottom_box, -	node_box = bottom_box,  	mesecons = {conductor = {  		state = mesecon.state.on, -		offstate = "mesecons_extrawires:vertical_bottom_off", -		rules = bottom_rules, -	}}, -	drop = "mesecons_extrawires:vertical_off", -	after_place_node = vertical_update, -	after_dig_node = vertical_update, +		offstate = "mesecons_extrawires:vertical_top_off", +		rules = top_rules, +	}}  }) -minetest.register_node("mesecons_extrawires:vertical_bottom_off", { +-- Vertical wire bottom +mesecon.register_node("mesecons_extrawires:vertical_bottom", {  	description = "Vertical mesecon",  	drawtype = "nodebox", -	tiles = {"wires_full_off.png","wires_full_off.png","wires_vertical_off.png"},  	walkable = false,  	paramtype = "light",  	sunlight_propagates = true, @@ -187,15 +147,25 @@ minetest.register_node("mesecons_extrawires:vertical_bottom_off", {  	selection_box = bottom_box,  	node_box = bottom_box,  	is_vertical_conductor = true, +	drop = "mesecons_extrawires:vertical_off", +	after_place_node = vertical_update, +	after_dig_node = vertical_update +},{ +	tiles = {"mesecons_wire_off.png"},  	vertical_conductor_state = "off",  	mesecons = {conductor = {  		state = mesecon.state.off,  		onstate = "mesecons_extrawires:vertical_bottom_on",  		rules = bottom_rules, -	}}, -	drop = "mesecons_extrawires:vertical_off", -	after_place_node = vertical_update, -	after_dig_node = vertical_update, +	}} +},{ +	tiles = {"mesecons_wire_on.png"}, +	vertical_conductor_state = "on", +	mesecons = {conductor = { +		state = mesecon.state.on, +		offstate = "mesecons_extrawires:vertical_bottom_off", +		rules = bottom_rules, +	}}  })  minetest.register_craft({ diff --git a/mesecons_gates/init.lua b/mesecons_gates/init.lua index a22edf6..345c32c 100644 --- a/mesecons_gates/init.lua +++ b/mesecons_gates/init.lua @@ -1,6 +1,6 @@  function gate_rotate_rules(node)  	for rotations = 0, node.param2 - 1 do -		rules = mesecon:rotate_rules_left(rules) +		rules = mesecon.rotate_rules_left(rules)  	end  	return rules  end @@ -53,11 +53,11 @@ function set_gate(pos, on)  			local node = minetest.get_node(pos)  			if on then  				minetest.swap_node(pos, {name = "mesecons_gates:"..gate.."_on", param2=node.param2}) -				mesecon:receptor_on(pos, +				mesecon.receptor_on(pos,  				gate_get_output_rules(node))  			else  				minetest.swap_node(pos, {name = "mesecons_gates:"..gate.."_off", param2=node.param2}) -				mesecon:receptor_off(pos, +				mesecon.receptor_off(pos,  				gate_get_output_rules(node))  			end  		end @@ -77,7 +77,7 @@ function pop_gate(pos)  	gate = get_gate(pos)  	minetest.remove_node(pos)  	minetest.after(0.2, function (pos) -		mesecon:receptor_off(pos, mesecon.rules.flat) +		mesecon.receptor_off(pos, mesecon.rules.flat)  	end , pos) -- wait for pending parsings  	minetest.add_item(pos, "mesecons_gates:"..gate.."_off")  end diff --git a/mesecons_hydroturbine/init.lua b/mesecons_hydroturbine/init.lua index ef5ccae..36bd498 100644 --- a/mesecons_hydroturbine/init.lua +++ b/mesecons_hydroturbine/init.lua @@ -66,7 +66,7 @@ nodenames = {"mesecons_hydroturbine:hydro_turbine_off"},  		if minetest.get_node(waterpos).name=="default:water_flowing" then  			minetest.add_node(pos, {name="mesecons_hydroturbine:hydro_turbine_on"})  			nodeupdate(pos) -			mesecon:receptor_on(pos) +			mesecon.receptor_on(pos)  		end  	end,  }) @@ -80,7 +80,7 @@ nodenames = {"mesecons_hydroturbine:hydro_turbine_on"},  		if minetest.get_node(waterpos).name~="default:water_flowing" then  			minetest.add_node(pos, {name="mesecons_hydroturbine:hydro_turbine_off"})  			nodeupdate(pos) -			mesecon:receptor_off(pos) +			mesecon.receptor_off(pos)  		end  	end,  }) diff --git a/mesecons_insulated/init.lua b/mesecons_insulated/init.lua index 9fdf494..c6fc05e 100644 --- a/mesecons_insulated/init.lua +++ b/mesecons_insulated/init.lua @@ -2,7 +2,7 @@ function insulated_wire_get_rules(node)  	local rules = 	{{x = 1,  y = 0,  z = 0},  			 {x =-1,  y = 0,  z = 0}}  	if node.param2 == 1 or node.param2 == 3 then -		return mesecon:rotate_rules_right(rules) +		return mesecon.rotate_rules_right(rules)  	end  	return rules  end @@ -41,7 +41,7 @@ minetest.register_node("mesecons_insulated:insulated_on", {  minetest.register_node("mesecons_insulated:insulated_off", {  	drawtype = "nodebox", -	description = "insulated mesecons", +	description = "Insulated Mesecon",  	tiles = {  		"jeija_insulated_wire_sides_off.png",  		"jeija_insulated_wire_sides_off.png", @@ -78,7 +78,3 @@ minetest.register_craft({  		{"mesecons_materials:fiber", "mesecons_materials:fiber", "mesecons_materials:fiber"},  	}  }) - -mesecon:add_rules("insulated", { -{x = 1,  y = 0,  z = 0}, -{x =-1,  y = 0,  z = 0}}) diff --git a/mesecons_lightstone/init.lua b/mesecons_lightstone/init.lua index 7bb550d..5ed8f15 100644 --- a/mesecons_lightstone/init.lua +++ b/mesecons_lightstone/init.lua @@ -14,7 +14,7 @@ local lightstone_rules = {  	{x=0,  y=-1, z=0},  } -function mesecon:lightstone_add(name, base_item, texture_off, texture_on) +function mesecon.lightstone_add(name, base_item, texture_off, texture_on)  	minetest.register_node("mesecons_lightstone:lightstone_" .. name .. "_off", {  		tiles = {texture_off},  		groups = {cracky=2, mesecon_effector_off = 1, mesecon = 2}, @@ -52,9 +52,9 @@ function mesecon:lightstone_add(name, base_item, texture_off, texture_on)  end -mesecon:lightstone_add("red", "default:clay_brick", "jeija_lightstone_red_off.png", "jeija_lightstone_red_on.png") -mesecon:lightstone_add("green", "default:cactus", "jeija_lightstone_green_off.png", "jeija_lightstone_green_on.png") -mesecon:lightstone_add("blue", "mesecons_materials:fiber", "jeija_lightstone_blue_off.png", "jeija_lightstone_blue_on.png") -mesecon:lightstone_add("gray", "default:cobble", "jeija_lightstone_gray_off.png", "jeija_lightstone_gray_on.png") -mesecon:lightstone_add("darkgray", "default:gravel", "jeija_lightstone_darkgray_off.png", "jeija_lightstone_darkgray_on.png") -mesecon:lightstone_add("yellow", "default:mese_crystal_fragment", "jeija_lightstone_yellow_off.png", "jeija_lightstone_yellow_on.png") +mesecon.lightstone_add("red", "default:clay_brick", "jeija_lightstone_red_off.png", "jeija_lightstone_red_on.png") +mesecon.lightstone_add("green", "default:cactus", "jeija_lightstone_green_off.png", "jeija_lightstone_green_on.png") +mesecon.lightstone_add("blue", "mesecons_materials:fiber", "jeija_lightstone_blue_off.png", "jeija_lightstone_blue_on.png") +mesecon.lightstone_add("gray", "default:cobble", "jeija_lightstone_gray_off.png", "jeija_lightstone_gray_on.png") +mesecon.lightstone_add("darkgray", "default:gravel", "jeija_lightstone_darkgray_off.png", "jeija_lightstone_darkgray_on.png") +mesecon.lightstone_add("yellow", "default:mese_crystal_fragment", "jeija_lightstone_yellow_off.png", "jeija_lightstone_yellow_on.png") diff --git a/mesecons_luacontroller/init.lua b/mesecons_luacontroller/init.lua index f50db1a..d03bed3 100644 --- a/mesecons_luacontroller/init.lua +++ b/mesecons_luacontroller/init.lua @@ -50,11 +50,6 @@ local function update_real_port_states(pos, rule_name, new_state)  		return  	end  	local n = meta:get_int("real_portstates") - 1 -	if n < 0 then -		mesecon.legacy_update_ports(pos) -		n = meta:get_int("real_portstates") - 1 -	end -	-- Create list of bytes in n  	local L = {}  	for i = 1, 4 do  		L[i] = n % 2 @@ -87,9 +82,6 @@ local function get_real_port_states(pos)  	local meta = minetest.get_meta(pos)  	local L = {}  	local n = meta:get_int("real_portstates") - 1 -	if n < 0 then -		return mesecon.legacy_update_ports(pos) -	end  	for _, name in ipairs(port_names) do  		L[name] = ((n % 2) == 1)  		n = math.floor(n / 2) @@ -107,7 +99,6 @@ local function merge_port_states(ports, vports)  	}  end -  local function generate_name(ports)  	local d = ports.d and 1 or 0  	local c = ports.c and 1 or 0 @@ -119,9 +110,9 @@ end  local function set_port(pos, rule, state)  	if state then -		mesecon:receptor_on(pos, {rule}) +		mesecon.receptor_on(pos, {rule})  	else -		mesecon:receptor_off(pos, {rule}) +		mesecon.receptor_off(pos, {rule})  	end  end @@ -157,7 +148,7 @@ end  -----------------  local function overheat_off(pos) -	mesecon:receptor_off(pos, mesecon.rules.flat) +	mesecon.receptor_off(pos, mesecon.rules.flat)  end @@ -260,7 +251,7 @@ local function create_environment(pos, mem, event)  		event = event,  		mem = mem,  		heat = minetest.get_meta(pos):get_int("heat"), -		heat_max = OVERHEAT_MAX, +		heat_max = mesecon.setting("overheat_max", 20),  		print = safe_print,  		interrupt = get_interrupt(pos),  		digiline_send = get_digiline_send(pos), @@ -570,7 +561,7 @@ for d = 0, 1 do  			d = d == 1,  		},  		after_dig_node = function (pos, node) -			mesecon:receptor_off(pos, output_rules) +			mesecon.receptor_off(pos, output_rules)  		end,  		is_luacontroller = true,  	}) diff --git a/mesecons_microcontroller/init.lua b/mesecons_microcontroller/init.lua index 2cea23c..7e290a3 100644 --- a/mesecons_microcontroller/init.lua +++ b/mesecons_microcontroller/init.lua @@ -1,5 +1,7 @@  EEPROM_SIZE = 255 +local microc_rules = {} +  for a = 0, 1 do  for b = 0, 1 do  for c = 0, 1 do @@ -34,7 +36,7 @@ if (a == 0) then table.insert(input_rules, {x = -1, y = 0, z =  0, name = "A"})  if (b == 0) then table.insert(input_rules, {x =  0, y = 0, z =  1, name = "B"}) end  if (c == 0) then table.insert(input_rules, {x =  1, y = 0, z =  0, name = "C"}) end  if (d == 0) then table.insert(input_rules, {x =  0, y = 0, z = -1, name = "D"}) end -mesecon:add_rules(nodename, rules) +microc_rules[nodename] = rules  local mesecons = {effector =  { @@ -131,8 +133,8 @@ minetest.register_node(nodename, {  	sounds = default.node_sound_stone_defaults(),  	mesecons = mesecons,  	after_dig_node = function (pos, node) -		rules = mesecon:get_rules(node.name) -		mesecon:receptor_off(pos, rules) +		rules = microc_rules[node.name] +		mesecon.receptor_off(pos, rules)  	end,  })  end @@ -164,7 +166,7 @@ function update_yc(pos)  	if (mesecon.do_overheat(pos)) then  		minetest.remove_node(pos)  		minetest.after(0.2, function (pos) -			mesecon:receptor_off(pos, mesecon.rules.flat) +			mesecon.receptor_off(pos, mesecon.rules.flat)  		end , pos) -- wait for pending parsings  		minetest.add_item(pos, "mesecons_microcontroller:microcontroller0000")  	end @@ -183,7 +185,7 @@ end  --Code Parsing  function yc_code_remove_commentary(code) -	is_string = false +	local is_string = false  	for i = 1, #code do  		if code:sub(i, i) == '"' then  			is_string = not is_string --toggle is_string @@ -203,15 +205,17 @@ function yc_parsecode(code, pos)  	local c  	local eeprom = meta:get_string("eeprom")  	while true do +		local command, params  		command, endi = parse_get_command(code, endi)  		if command == nil then return nil end  		if command == true then break end --end of code  		if command == "if" then +			local r  			r, endi = yc_command_if(code, endi, yc_merge_portstates(Lreal, Lvirtual), eeprom)  			if r == nil then return nil end  			if r == true then  -- nothing  			elseif r == false then -				endi_new = yc_skip_to_else (code, endi) +				local endi_new = yc_skip_to_else (code, endi)  				if endi_new == nil then --else > not found  					endi = yc_skip_to_endif(code, endi)  				else @@ -221,7 +225,7 @@ function yc_parsecode(code, pos)  			end  		else  			params, endi = parse_get_params(code, endi) -			if params  == nil then return nil end +			if not params then return nil end  		end  		if command == "on" then  			L = yc_command_on (params, Lvirtual) @@ -234,6 +238,7 @@ function yc_parsecode(code, pos)  			local su = yc_command_after(params, pos)  			if su == nil then return nil end  		elseif command == "sbi" then +			local new_eeprom  			new_eeprom, Lvirtual = yc_command_sbi (params, eeprom, yc_merge_portstates(Lreal, Lvirtual), Lvirtual)  			if new_eeprom == nil then return nil  			else eeprom = new_eeprom end @@ -251,7 +256,7 @@ end  function parse_get_command(code, starti)  	i = starti -	s = nil +	local s  	while s ~= "" do  		s = string.sub(code, i, i)  		if s == "(" then @@ -277,7 +282,7 @@ end  function parse_get_params(code, starti)  	i = starti -	s = nil +	local s  	local params = {}  	local is_string = false  	while s ~= "" do @@ -300,7 +305,7 @@ end  function yc_parse_get_eeprom_param(cond, starti)  	i = starti -	s = nil +	local s  	local addr  	while s ~= "" do  		s = string.sub(cond, i, i) @@ -403,7 +408,7 @@ function yc_command_sbi(params, eeprom, L, Lv)  	end  	--is an eeprom address -	new_eeprom = ""; +	local new_eeprom = "";  	for i=1, #eeprom do  		if tonumber(params[1])==i then   			new_eeprom = new_eeprom..status @@ -457,17 +462,17 @@ function yc_command_if(code, starti, L, eeprom)  	cond = yc_command_parsecondition(cond, L, eeprom) +	local result  	if cond == "0" then result = false -	elseif cond == "1" then result = true -	else result = nil end -	if result == nil then end +	elseif cond == "1" then result = true end +	if not result then end  	return result, endi --endi from local cond, endi = yc_command_if_getcondition(code, starti)  end  --Condition parsing  function yc_command_if_getcondition(code, starti)  	i = starti -	s = nil +	local s  	local brackets = 1 --1 Bracket to close  	while s ~= "" do  		s = string.sub(code, i, i) @@ -501,8 +506,8 @@ function yc_command_parsecondition(cond, L, eeprom)  	while i<=l do  		local s = cond:sub(i,i)  		if s == "#" then -			addr, endi = yc_parse_get_eeprom_param(cond, i+1) -			buf = yc_eeprom_read(tonumber(addr), eeprom) +			local addr, endi = yc_parse_get_eeprom_param(cond, i+1) +			local buf = yc_eeprom_read(tonumber(addr), eeprom)  			if buf == nil then return nil end  			local call = cond:sub(i, endi-1)  			cond = string.gsub(cond, call, buf) @@ -576,10 +581,8 @@ end  --Virtual-Hardware functions  function yc_eeprom_read(number, eeprom) -	if number == nil then return nil, nil end -	value = eeprom:sub(number, number) -	if value  == nil then return nil, nil end -	return value, endi +	if not number then return end +	return eeprom:sub(number, number)  end  --Real I/O functions @@ -600,24 +603,24 @@ function yc_action_setports(pos, L, Lv)  	local name = "mesecons_microcontroller:microcontroller"  	local rules  	if Lv.a ~= L.a then -		rules = mesecon:get_rules(name.."0001") -		if L.a == true then mesecon:receptor_on(pos, rules) -		else mesecon:receptor_off(pos, rules) end +		rules = microc_rules[name.."0001"] +		if L.a == true then mesecon.receptor_on(pos, rules) +		else mesecon.receptor_off(pos, rules) end  	end  	if Lv.b ~= L.b then -		rules = mesecon:get_rules(name.."0010") -		if L.b == true then mesecon:receptor_on(pos, rules) -		else mesecon:receptor_off(pos, rules) end +		rules = microc_rules[name.."0010"] +		if L.b == true then mesecon.receptor_on(pos, rules) +		else mesecon.receptor_off(pos, rules) end  	end  	if Lv.c ~= L.c then  -		rules = mesecon:get_rules(name.."0100") -		if L.c == true then mesecon:receptor_on(pos, rules) -		else mesecon:receptor_off(pos, rules) end +		rules = microc_rules[name.."0100"] +		if L.c == true then mesecon.receptor_on(pos, rules) +		else mesecon.receptor_off(pos, rules) end  	end  	if Lv.d ~= L.d then  -		rules = mesecon:get_rules(name.."1000") -		if L.d == true then mesecon:receptor_on(pos, rules) -		else mesecon:receptor_off(pos, rules) end +		rules = microc_rules[name.."1000"] +		if L.d == true then mesecon.receptor_on(pos, rules) +		else mesecon.receptor_off(pos, rules) end  	end  end @@ -637,10 +640,6 @@ function yc_update_real_portstates(pos, node, rulename, newstate)  		return  	end  	local n = meta:get_int("real_portstates") - 1 -	if n < 0 then -		mesecon.legacy_update_ports(pos) -		n = meta:get_int("real_portstates") - 1 -	end  	local L = {}  	for i = 1, 4 do  		L[i] = n%2 @@ -662,9 +661,6 @@ function yc_get_real_portstates(pos) -- determine if ports are powered (by itsel  	local meta = minetest.get_meta(pos)  	local L = {}  	local n = meta:get_int("real_portstates") - 1 -	if n < 0 then -		return mesecon.legacy_update_ports(pos) -	end  	for _, index in ipairs({"a", "b", "c", "d"}) do  		L[index] = ((n%2) == 1)  		n = math.floor(n/2) @@ -673,12 +669,12 @@ function yc_get_real_portstates(pos) -- determine if ports are powered (by itsel  end  function yc_get_virtual_portstates(pos) -- portstates according to the name -	name = minetest.get_node(pos).name -	b, a = string.find(name, ":microcontroller") +	local name = minetest.get_node(pos).name +	local b, a = string.find(name, ":microcontroller")  	if a == nil then return nil end  	a = a + 1 -	Lvirtual = {a=false, b=false, c=false, d=false} +	local Lvirtual = {a=false, b=false, c=false, d=false}  	if name:sub(a  , a  ) == "1" then Lvirtual.d = true end  	if name:sub(a+1, a+1) == "1" then Lvirtual.c = true end  	if name:sub(a+2, a+2) == "1" then Lvirtual.b = true end diff --git a/mesecons_movestones/init.lua b/mesecons_movestones/init.lua index e31f2d2..dcbb00b 100644 --- a/mesecons_movestones/init.lua +++ b/mesecons_movestones/init.lua @@ -8,7 +8,7 @@  -- Pushes all block in front of it  -- Pull all blocks in its back -function mesecon:get_movestone_direction(pos) +function mesecon.get_movestone_direction(pos)  	getactivated = 0  	local lpos  	local getactivated = 0 @@ -28,28 +28,28 @@ function mesecon:get_movestone_direction(pos)  	lpos = {x=pos.x+1, y=pos.y, z=pos.z}  	for n = 1, 3 do -		if mesecon:is_power_on(lpos, rules[n].x, rules[n].y, rules[n].z) then +		if mesecon.is_power_on(lpos, rules[n].x, rules[n].y, rules[n].z) then  			return {x=0, y=0, z=-1}  		end  	end  	lpos = {x = pos.x-1, y = pos.y, z = pos.z}  	for n=4, 6 do -		if mesecon:is_power_on(lpos, rules[n].x, rules[n].y, rules[n].z) then +		if mesecon.is_power_on(lpos, rules[n].x, rules[n].y, rules[n].z) then  			return {x=0, y=0, z=1}  		end  	end  	lpos = {x = pos.x, y = pos.y, z = pos.z+1}  	for n=7, 9 do -		if mesecon:is_power_on(lpos, rules[n].x, rules[n].y, rules[n].z) then +		if mesecon.is_power_on(lpos, rules[n].x, rules[n].y, rules[n].z) then  			return {x=-1, y=0, z=0}  		end  	end  	lpos = {x = pos.x, y = pos.y, z = pos.z-1}  	for n=10, 12 do -		if mesecon:is_power_on(lpos, rules[n].x, rules[n].y, rules[n].z) then +		if mesecon.is_power_on(lpos, rules[n].x, rules[n].y, rules[n].z) then  			return {x=1, y=0, z=0}  		end  	end @@ -64,10 +64,10 @@ minetest.register_node("mesecons_movestones:movestone", {  	sounds = default.node_sound_stone_defaults(),  	mesecons = {effector = {  		action_on = function (pos, node) -			local direction=mesecon:get_movestone_direction(pos) +			local direction=mesecon.get_movestone_direction(pos)  			if not direction then return end  			minetest.remove_node(pos) -			mesecon:update_autoconnect(pos) +			mesecon.update_autoconnect(pos)  			minetest.add_entity(pos, "mesecons_movestones:movestone_entity")  		end  	}} @@ -89,15 +89,16 @@ minetest.register_entity("mesecons_movestones:movestone_entity", {  	on_step = function(self, dtime)  		local pos = self.object:getpos()  		pos.x, pos.y, pos.z = math.floor(pos.x+0.5), math.floor(pos.y+0.5), math.floor(pos.z+0.5) -		local direction = mesecon:get_movestone_direction(pos) +		local direction = mesecon.get_movestone_direction(pos) +		local maxpush = mesecon.setting("movestone_max_push", 50)  		if not direction then -- no mesecon power  			--push only solid nodes  			local name = minetest.get_node(pos).name  			if  name ~= "air" and name ~= "ignore"  			and ((not minetest.registered_nodes[name])  			or minetest.registered_nodes[name].liquidtype == "none") then -				mesecon:mvps_push(pos, self.lastdir, MOVESTONE_MAXIMUM_PUSH) +				mesecon.mvps_push(pos, self.lastdir, maxpush)  			end  			minetest.add_node(pos, {name="mesecons_movestones:movestone"})  			self.object:remove() @@ -105,14 +106,14 @@ minetest.register_entity("mesecons_movestones:movestone_entity", {  		end  		local success, stack, oldstack = -			mesecon:mvps_push(pos, direction, MOVESTONE_MAXIMUM_PUSH) +			mesecon.mvps_push(pos, direction, maxpush)  		if not success then -- Too large stack/stopper in the way  			minetest.add_node(pos, {name="mesecons_movestones:movestone"})  			self.object:remove()  			return  		else -			mesecon:mvps_process_stack (stack) -			mesecon:mvps_move_objects  (pos, direction, oldstack) +			mesecon.mvps_process_stack (stack) +			mesecon.mvps_move_objects  (pos, direction, oldstack)  			self.lastdir = direction  		end @@ -143,10 +144,10 @@ minetest.register_node("mesecons_movestones:sticky_movestone", {  	sounds = default.node_sound_stone_defaults(),  	mesecons = {effector = {  		action_on = function (pos, node) -			local direction=mesecon:get_movestone_direction(pos) +			local direction=mesecon.get_movestone_direction(pos)  			if not direction then return end  			minetest.remove_node(pos) -			mesecon:update_autoconnect(pos) +			mesecon.update_autoconnect(pos)  			minetest.add_entity(pos, "mesecons_movestones:sticky_movestone_entity")  		end  	}} @@ -175,7 +176,7 @@ minetest.register_entity("mesecons_movestones:sticky_movestone_entity", {  	on_step = function(self, dtime)  		local pos = self.object:getpos()  		pos.x, pos.y, pos.z = math.floor(pos.x+0.5), math.floor(pos.y+0.5), math.floor(pos.z+0.5) -		local direction = mesecon:get_movestone_direction(pos) +		local direction = mesecon.get_movestone_direction(pos)  		if not direction then -- no mesecon power  			--push only solid nodes @@ -183,9 +184,9 @@ minetest.register_entity("mesecons_movestones:sticky_movestone_entity", {  			if  name ~= "air" and name ~= "ignore"  			and ((not minetest.registered_nodes[name])  			or minetest.registered_nodes[name].liquidtype == "none") then -				mesecon:mvps_push(pos, self.lastdir, MOVESTONE_MAXIMUM_PUSH) +				mesecon.mvps_push(pos, self.lastdir, MOVESTONE_MAXIMUM_PUSH)  				--STICKY -				mesecon:mvps_pull_all(pos, self.lastdir) +				mesecon.mvps_pull_all(pos, self.lastdir)  			end  			minetest.add_node(pos, {name="mesecons_movestones:sticky_movestone"})  			self.object:remove() @@ -193,24 +194,24 @@ minetest.register_entity("mesecons_movestones:sticky_movestone_entity", {  		end  		local success, stack, oldstack = -			mesecon:mvps_push(pos, direction, MOVESTONE_MAXIMUM_PUSH) +			mesecon.mvps_push(pos, direction, MOVESTONE_MAXIMUM_PUSH)  		if not success then -- Too large stack/stopper in the way  			minetest.add_node(pos, {name="mesecons_movestones:sticky_movestone"})  			self.object:remove()  			return  		else -			mesecon:mvps_process_stack (stack) -			mesecon:mvps_move_objects  (pos, direction, oldstack) +			mesecon.mvps_process_stack (stack) +			mesecon.mvps_move_objects  (pos, direction, oldstack)  			self.lastdir = direction  		end  		self.object:setvelocity({x=direction.x*2, y=direction.y*2, z=direction.z*2})  		--STICKY -		mesecon:mvps_pull_all(pos, direction) +		mesecon.mvps_pull_all(pos, direction)  	end,  }) -mesecon:register_mvps_unmov("mesecons_movestones:movestone_entity") -mesecon:register_mvps_unmov("mesecons_movestones:sticky_movestone_entity") +mesecon.register_mvps_unmov("mesecons_movestones:movestone_entity") +mesecon.register_mvps_unmov("mesecons_movestones:sticky_movestone_entity") diff --git a/mesecons_mvps/init.lua b/mesecons_mvps/init.lua index 0079f1a..163ad28 100644 --- a/mesecons_mvps/init.lua +++ b/mesecons_mvps/init.lua @@ -4,7 +4,7 @@ mesecon.mvps_stoppers = {}  mesecon.mvps_unmov = {}  mesecon.on_mvps_move = {} -function mesecon:is_mvps_stopper(node, pushdir, stack, stackid) +function mesecon.is_mvps_stopper(node, pushdir, stack, stackid)  	local get_stopper = mesecon.mvps_stoppers[node.name]  	if type (get_stopper) == "function" then  		get_stopper = get_stopper(node, pushdir, stack, stackid) @@ -12,7 +12,7 @@ function mesecon:is_mvps_stopper(node, pushdir, stack, stackid)  	return get_stopper  end -function mesecon:register_mvps_stopper(nodename, get_stopper) +function mesecon.register_mvps_stopper(nodename, get_stopper)  	if get_stopper == nil then  			get_stopper = true  	end @@ -20,16 +20,16 @@ function mesecon:register_mvps_stopper(nodename, get_stopper)  end  -- Objects that cannot be moved (e.g. movestones) -function mesecon:register_mvps_unmov(objectname) +function mesecon.register_mvps_unmov(objectname)  	mesecon.mvps_unmov[objectname] = true;  end -function mesecon:is_mvps_unmov(objectname) +function mesecon.is_mvps_unmov(objectname)  	return mesecon.mvps_unmov[objectname]  end  -- Functions to be called on mvps movement -function mesecon:register_on_mvps_move(callback) +function mesecon.register_on_mvps_move(callback)  	mesecon.on_mvps_move[#mesecon.on_mvps_move+1] = callback  end @@ -39,16 +39,14 @@ local function on_mvps_move(moved_nodes)  	end  end -function mesecon:mvps_process_stack(stack) +function mesecon.mvps_process_stack(stack)  	-- update mesecons for placed nodes ( has to be done after all nodes have been added )  	for _, n in ipairs(stack) do -		nodeupdate(n.pos)  		mesecon.on_placenode(n.pos, minetest.get_node(n.pos)) -		mesecon:update_autoconnect(n.pos)  	end  end -function mesecon:mvps_get_stack(pos, dir, maximum) +function mesecon.mvps_get_stack(pos, dir, maximum)  	-- determine the number of nodes to be pushed  	local np = {x = pos.x, y = pos.y, z = pos.z}  	local nodes = {} @@ -67,18 +65,18 @@ function mesecon:mvps_get_stack(pos, dir, maximum)  		table.insert (nodes, {node = nn, pos = np}) -		np = mesecon:addPosRule(np, dir) +		np = mesecon.addPosRule(np, dir)  	end  	return nodes  end -function mesecon:mvps_push(pos, dir, maximum) -- pos: pos of mvps; dir: direction of push; maximum: maximum nodes to be pushed -	local nodes = mesecon:mvps_get_stack(pos, dir, maximum) +function mesecon.mvps_push(pos, dir, maximum) -- pos: pos of mvps; dir: direction of push; maximum: maximum nodes to be pushed +	local nodes = mesecon.mvps_get_stack(pos, dir, maximum)  	if not nodes then return end  	-- determine if one of the nodes blocks the push  	for id, n in ipairs(nodes) do -		if mesecon:is_mvps_stopper(n.node, dir, nodes, id) then +		if mesecon.is_mvps_stopper(n.node, dir, nodes, id) then  			return  		end  	end @@ -92,22 +90,21 @@ function mesecon:mvps_push(pos, dir, maximum) -- pos: pos of mvps; dir: directio  	-- update mesecons for removed nodes ( has to be done after all nodes have been removed )  	for _, n in ipairs(nodes) do  		mesecon.on_dignode(n.pos, n.node) -		mesecon:update_autoconnect(n.pos)  	end  	-- add nodes  	for _, n in ipairs(nodes) do -		np = mesecon:addPosRule(n.pos, dir) +		np = mesecon.addPosRule(n.pos, dir)  		minetest.add_node(np, n.node)  		minetest.get_meta(np):from_table(n.meta)  	end  	local moved_nodes = {} -	local oldstack = mesecon:tablecopy(nodes) +	local oldstack = mesecon.tablecopy(nodes)  	for i in ipairs(nodes) do  		moved_nodes[i] = {}  		moved_nodes[i].oldpos = nodes[i].pos -		nodes[i].pos = mesecon:addPosRule(nodes[i].pos, dir) +		nodes[i].pos = mesecon.addPosRule(nodes[i].pos, dir)  		moved_nodes[i].pos = nodes[i].pos  		moved_nodes[i].node = nodes[i].node  		moved_nodes[i].meta = nodes[i].meta @@ -118,20 +115,20 @@ function mesecon:mvps_push(pos, dir, maximum) -- pos: pos of mvps; dir: directio  	return true, nodes, oldstack  end -mesecon:register_on_mvps_move(function(moved_nodes) +mesecon.register_on_mvps_move(function(moved_nodes)  	for _, n in ipairs(moved_nodes) do  		mesecon.on_placenode(n.pos, n.node) -		mesecon:update_autoconnect(n.pos) +		mesecon.update_autoconnect(n.pos)  	end  end) -function mesecon:mvps_pull_single(pos, dir) -- pos: pos of mvps; direction: direction of pull (matches push direction for sticky pistons) -	np = mesecon:addPosRule(pos, dir) +function mesecon.mvps_pull_single(pos, dir) -- pos: pos of mvps; direction: direction of pull (matches push direction for sticky pistons) +	np = mesecon.addPosRule(pos, dir)  	nn = minetest.get_node(np)  	if ((not minetest.registered_nodes[nn.name]) --unregistered node  	or minetest.registered_nodes[nn.name].liquidtype == "none") --non-liquid node -	and not mesecon:is_mvps_stopper(nn, {x = -dir.x, y = -dir.y, z = -dir.z}, {{pos = np, node = nn}}, 1) then --non-stopper node +	and not mesecon.is_mvps_stopper(nn, {x = -dir.x, y = -dir.y, z = -dir.z}, {{pos = np, node = nn}}, 1) then --non-stopper node  		local meta = minetest.get_meta(np):to_table()  		minetest.remove_node(np)  		minetest.add_node(pos, nn) @@ -140,13 +137,13 @@ function mesecon:mvps_pull_single(pos, dir) -- pos: pos of mvps; direction: dire  		nodeupdate(np)  		nodeupdate(pos)  		mesecon.on_dignode(np, nn) -		mesecon:update_autoconnect(np) +		mesecon.update_autoconnect(np)  		on_mvps_move({{pos = pos, oldpos = np, node = nn, meta = meta}})  	end  	return {{pos = np, node = {param2 = 0, name = "air"}}, {pos = pos, node = nn}}  end -function mesecon:mvps_pull_all(pos, direction) -- pos: pos of mvps; direction: direction of pull +function mesecon.mvps_pull_all(pos, direction) -- pos: pos of mvps; direction: direction of pull  	local lpos = {x=pos.x-direction.x, y=pos.y-direction.y, z=pos.z-direction.z} -- 1 away  	local lnode = minetest.get_node(lpos)  	local lpos2 = {x=pos.x-direction.x*2, y=pos.y-direction.y*2, z=pos.z-direction.z*2} -- 2 away @@ -188,15 +185,15 @@ function mesecon:mvps_pull_all(pos, direction) -- pos: pos of mvps; direction: d  	and minetest.registered_nodes[lnode.name].liquidtype ~= "none")  	minetest.remove_node(oldpos)  	mesecon.on_dignode(oldpos, lnode2) -	mesecon:update_autoconnect(oldpos) +	mesecon.update_autoconnect(oldpos)  	on_mvps_move(moved_nodes)  end -function mesecon:mvps_move_objects(pos, dir, nodestack) +function mesecon.mvps_move_objects(pos, dir, nodestack)  	local objects_to_move = {}  	-- Move object at tip of stack -	local pushpos = mesecon:addPosRule(pos, -- get pos at tip of stack +	local pushpos = mesecon.addPosRule(pos, -- get pos at tip of stack  		{x = dir.x * #nodestack,  		 y = dir.y * #nodestack,  		 z = dir.z * #nodestack}) @@ -211,7 +208,7 @@ function mesecon:mvps_move_objects(pos, dir, nodestack)  	if tonumber(minetest.setting_get("movement_gravity")) > 0 and dir.y == 0 then  		-- If gravity positive and dir horizontal, push players standing on the stack  		for _, n in ipairs(nodestack) do -			local p_above = mesecon:addPosRule(n.pos, {x=0, y=1, z=0}) +			local p_above = mesecon.addPosRule(n.pos, {x=0, y=1, z=0})  			local objects = minetest.get_objects_inside_radius(p_above, 1)  			for _, obj in ipairs(objects) do  				table.insert(objects_to_move, obj) @@ -221,8 +218,8 @@ function mesecon:mvps_move_objects(pos, dir, nodestack)  	for _, obj in ipairs(objects_to_move) do  		local entity = obj:get_luaentity() -		if not entity or not mesecon:is_mvps_unmov(entity.name) then -			local np = mesecon:addPosRule(obj:getpos(), dir) +		if not entity or not mesecon.is_mvps_unmov(entity.name) then +			local np = mesecon.addPosRule(obj:getpos(), dir)  			--move only if destination is not solid  			local nn = minetest.get_node(np) @@ -234,5 +231,5 @@ function mesecon:mvps_move_objects(pos, dir, nodestack)  	end  end -mesecon:register_mvps_stopper("default:chest_locked") -mesecon:register_mvps_stopper("default:furnace") +mesecon.register_mvps_stopper("default:chest_locked") +mesecon.register_mvps_stopper("default:furnace") diff --git a/mesecons_noteblock/init.lua b/mesecons_noteblock/init.lua index 3971076..d63b93e 100644 --- a/mesecons_noteblock/init.lua +++ b/mesecons_noteblock/init.lua @@ -2,7 +2,6 @@ minetest.register_node("mesecons_noteblock:noteblock", {  	description = "Noteblock",  	tiles = {"mesecons_noteblock.png"},  	groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, -	drawtype = "allfaces_optional",  	visual_scale = 1.3,  	paramtype="light",  	after_place_node = function(pos) diff --git a/mesecons_pistons/init.lua b/mesecons_pistons/init.lua index 7780fc9..b247039 100644 --- a/mesecons_pistons/init.lua +++ b/mesecons_pistons/init.lua @@ -33,7 +33,7 @@ local piston_down_rules =  local piston_get_rules = function (node)  	local rules = piston_rules  	for i = 1, node.param2 do -		rules = mesecon:rotate_rules_left(rules) +		rules = mesecon.rotate_rules_left(rules)  	end  	return rules  end @@ -41,7 +41,7 @@ end  piston_facedir_direction = function (node)  	local rules = {{x = 0, y = 0, z = -1}}  	for i = 1, node.param2 do -		rules = mesecon:rotate_rules_left(rules) +		rules = mesecon.rotate_rules_left(rules)  	end  	return rules[1]  end @@ -56,14 +56,15 @@ end  local piston_remove_pusher = function(pos, node)  	pistonspec = minetest.registered_nodes[node.name].mesecons_piston -	if pushername == pistonspec.pusher then --make sure there actually is a pusher (for compatibility reasons mainly) -		return -	end -  	dir = piston_get_direction(pistonspec.dir, node) -	local pusherpos = mesecon:addPosRule(pos, dir) +	local pusherpos = mesecon.addPosRule(pos, dir)  	local pushername = minetest.get_node(pusherpos).name +	-- make sure there actually is a pusher (for compatibility reasons mainly) +	if pushername ~= pistonspec.pusher then +		return +	end +  	minetest.remove_node(pusherpos)  	minetest.sound_play("piston_retract", {  		pos = pos, @@ -77,8 +78,9 @@ local piston_on = function(pos, node)  	local pistonspec = minetest.registered_nodes[node.name].mesecons_piston  	local dir = piston_get_direction(pistonspec.dir, node) -	local np = mesecon:addPosRule(pos, dir) -	local success, stack, oldstack = mesecon:mvps_push(np, dir, PISTON_MAXIMUM_PUSH) +	local np = mesecon.addPosRule(pos, dir) +	local maxpush = mesecon.setting("piston_max_push", 15) +	local success, stack, oldstack = mesecon.mvps_push(np, dir, maxpush)  	if success then  		minetest.add_node(pos, {param2 = node.param2, name = pistonspec.onname})  		minetest.add_node(np,  {param2 = node.param2, name = pistonspec.pusher}) @@ -87,8 +89,8 @@ local piston_on = function(pos, node)  			max_hear_distance = 20,  			gain = 0.3,  		}) -		mesecon:mvps_process_stack (stack) -		mesecon:mvps_move_objects  (np, dir, oldstack) +		mesecon.mvps_process_stack (stack) +		mesecon.mvps_move_objects  (np, dir, oldstack)  	end  end @@ -99,9 +101,9 @@ local piston_off = function(pos, node)  	if pistonspec.sticky then  		dir = piston_get_direction(pistonspec.dir, node) -		pullpos = mesecon:addPosRule(pos, dir) -		stack = mesecon:mvps_pull_single(pullpos, dir) -		mesecon:mvps_process_stack(pos, dir, stack) +		pullpos = mesecon.addPosRule(pos, dir) +		stack = mesecon.mvps_pull_single(pullpos, dir) +		mesecon.mvps_process_stack(pos, dir, stack)  	end  end @@ -692,14 +694,14 @@ local piston_pusher_up_down_get_stopper = function (node, dir, stack, stackid)  	return true  end -mesecon:register_mvps_stopper("mesecons_pistons:piston_pusher_normal", piston_pusher_get_stopper) -mesecon:register_mvps_stopper("mesecons_pistons:piston_pusher_sticky", piston_pusher_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_pusher_normal", piston_pusher_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_pusher_sticky", piston_pusher_get_stopper) -mesecon:register_mvps_stopper("mesecons_pistons:piston_up_pusher_normal", piston_pusher_up_down_get_stopper) -mesecon:register_mvps_stopper("mesecons_pistons:piston_up_pusher_sticky", piston_pusher_up_down_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_up_pusher_normal", piston_pusher_up_down_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_up_pusher_sticky", piston_pusher_up_down_get_stopper) -mesecon:register_mvps_stopper("mesecons_pistons:piston_down_pusher_normal", piston_pusher_up_down_get_stopper) -mesecon:register_mvps_stopper("mesecons_pistons:piston_down_pusher_sticky", piston_pusher_up_down_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_down_pusher_normal", piston_pusher_up_down_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_down_pusher_sticky", piston_pusher_up_down_get_stopper)  -- Register pistons as stoppers if they would be seperated from the stopper @@ -716,12 +718,12 @@ end  local piston_get_stopper = function (node, dir, stack, stackid)  	pistonspec = minetest.registered_nodes[node.name].mesecons_piston  	dir = piston_get_direction(pistonspec.dir, node) -	local pusherpos  = mesecon:addPosRule(stack[stackid].pos, dir) +	local pusherpos  = mesecon.addPosRule(stack[stackid].pos, dir)  	local pushernode = minetest.get_node(pusherpos)  	if minetest.registered_nodes[node.name].mesecons_piston.pusher == pushernode.name then  		for _, s in ipairs(stack) do -			if  mesecon:cmpPos(s.pos, pusherpos) -- pusher is also to be pushed +			if  mesecon.cmpPos(s.pos, pusherpos) -- pusher is also to be pushed  			and s.node.param2 == node.param2 then  				return false  			end @@ -730,14 +732,14 @@ local piston_get_stopper = function (node, dir, stack, stackid)  	return true  end -mesecon:register_mvps_stopper("mesecons_pistons:piston_normal_on", piston_get_stopper) -mesecon:register_mvps_stopper("mesecons_pistons:piston_sticky_on", piston_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_normal_on", piston_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_sticky_on", piston_get_stopper) -mesecon:register_mvps_stopper("mesecons_pistons:piston_up_normal_on", piston_up_down_get_stopper) -mesecon:register_mvps_stopper("mesecons_pistons:piston_up_sticky_on", piston_up_down_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_up_normal_on", piston_up_down_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_up_sticky_on", piston_up_down_get_stopper) -mesecon:register_mvps_stopper("mesecons_pistons:piston_down_normal_on", piston_up_down_get_stopper) -mesecon:register_mvps_stopper("mesecons_pistons:piston_down_sticky_on", piston_up_down_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_down_normal_on", piston_up_down_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_down_sticky_on", piston_up_down_get_stopper)  --craft recipes  minetest.register_craft({ diff --git a/mesecons_pressureplates/init.lua b/mesecons_pressureplates/init.lua index ec8d789..d01e6e5 100644 --- a/mesecons_pressureplates/init.lua +++ b/mesecons_pressureplates/init.lua @@ -9,31 +9,31 @@ local pp_box_on = {  }  pp_on_timer = function (pos, elapsed) -	local node   = minetest.get_node(pos) -	local ppspec = minetest.registered_nodes[node.name].pressureplate +	local node = minetest.get_node(pos) +	local basename = minetest.registered_nodes[node.name].pressureplate_basename  	-- This is a workaround for a strange bug that occurs when the server is started  	-- For some reason the first time on_timer is called, the pos is wrong -	if not ppspec then return end +	if not basename then return end  	local objs   = minetest.get_objects_inside_radius(pos, 1) -	local two_below = mesecon:addPosRule(pos, {x = 0, y = -2, z = 0}) +	local two_below = mesecon.addPosRule(pos, {x = 0, y = -2, z = 0}) -	if objs[1] == nil and node.name == ppspec.onstate then -		minetest.add_node(pos, {name = ppspec.offstate}) -		mesecon:receptor_off(pos) +	if objs[1] == nil and node.name == basename .. "_on" then +		minetest.add_node(pos, {name = basename .. "_off"}) +		mesecon.receptor_off(pos, mesecon.rules.pplate)  		-- force deactivation of mesecon two blocks below (hacky) -		if not mesecon:connected_to_receptor(two_below) then -			mesecon:turnoff(two_below) +		if not mesecon.connected_to_receptor(two_below) then +			mesecon.turnoff(two_below)  		end  	else  		for k, obj in pairs(objs) do  			local objpos = obj:getpos()  			if objpos.y > pos.y-1 and objpos.y < pos.y then -				minetest.add_node(pos, {name=ppspec.onstate}) -				mesecon:receptor_on(pos) +				minetest.add_node(pos, {name = basename .. "_on"}) +				mesecon.receptor_on(pos, mesecon.rules.pplate )  				-- force activation of mesecon two blocks below (hacky) -				mesecon:turnon(two_below) +				mesecon.turnon(two_below)  			end  		end  	end @@ -49,66 +49,40 @@ end  -- image:	inventory and wield image of the pressure plate  -- recipe:	crafting recipe of the pressure plate -function mesecon:register_pressure_plate(offstate, onstate, description, textures_off, textures_on, image_w, image_i, recipe) -	local ppspec = { -		offstate = offstate, -		onstate  = onstate -	} - -	minetest.register_node(offstate, { +function mesecon.register_pressure_plate(basename, description, textures_off, textures_on, image_w, image_i, recipe) +	mesecon.register_node(basename, {  		drawtype = "nodebox", -		tiles = textures_off,  		inventory_image = image_i,  		wield_image = image_w,  		paramtype = "light", -		selection_box = pp_box_off, -		node_box = pp_box_off, -		groups = {snappy = 2, oddly_breakable_by_hand = 3},  	    	description = description, -		pressureplate = ppspec, +		pressureplate_basename = basename,  		on_timer = pp_on_timer, -		mesecons = {receptor = { -			state = mesecon.state.off -		}},  		on_construct = function(pos) -			minetest.get_node_timer(pos):start(PRESSURE_PLATE_INTERVAL) +			minetest.get_node_timer(pos):start(mesecon.setting("pplate_interval", 0.1))  		end, -	}) - -	minetest.register_node(onstate, { -		drawtype = "nodebox", -		tiles = textures_on, -		paramtype = "light", -		selection_box = pp_box_on, +	},{ +		mesecons = {receptor = { state = mesecon.state.off, rules = mesecon.rules.pplate }}, +		node_box = pp_box_off, +		selection_box = pp_box_off, +		groups = {snappy = 2, oddly_breakable_by_hand = 3}, +		tiles = textures_off +	},{ +		mesecons = {receptor = { state = mesecon.state.on, rules = mesecon.rules.pplate }},  		node_box = pp_box_on, +		selection_box = pp_box_on,  		groups = {snappy = 2, oddly_breakable_by_hand = 3, not_in_creative_inventory = 1}, -		drop = offstate, -		pressureplate = ppspec, -		on_timer = pp_on_timer, -		sounds = default.node_sound_wood_defaults(), -		mesecons = {receptor = { -			state = mesecon.state.on -		}}, -		on_construct = function(pos) -			minetest.get_node_timer(pos):start(PRESSURE_PLATE_INTERVAL) -		end, -		after_dig_node = function(pos) -			local two_below = mesecon:addPosRule(pos, {x = 0, y = -2, z = 0}) -			if not mesecon:connected_to_receptor(two_below) then -				mesecon:turnoff(two_below) -			end -		end +		tiles = textures_on  	})  	minetest.register_craft({ -		output = offstate, +		output = basename .. "_off",  		recipe = recipe,  	})  end -mesecon:register_pressure_plate( -	"mesecons_pressureplates:pressure_plate_wood_off", -	"mesecons_pressureplates:pressure_plate_wood_on", +mesecon.register_pressure_plate( +	"mesecons_pressureplates:pressure_plate_wood",  	"Wooden Pressure Plate",  	{"jeija_pressure_plate_wood_off.png","jeija_pressure_plate_wood_off.png","jeija_pressure_plate_wood_off_edges.png"},  	{"jeija_pressure_plate_wood_on.png","jeija_pressure_plate_wood_on.png","jeija_pressure_plate_wood_on_edges.png"}, @@ -116,9 +90,8 @@ mesecon:register_pressure_plate(  	"jeija_pressure_plate_wood_inv.png",  	{{"group:wood", "group:wood"}}) -mesecon:register_pressure_plate( -	"mesecons_pressureplates:pressure_plate_stone_off", -	"mesecons_pressureplates:pressure_plate_stone_on", +mesecon.register_pressure_plate( +	"mesecons_pressureplates:pressure_plate_stone",  	"Stone Pressure Plate",  	{"jeija_pressure_plate_stone_off.png","jeija_pressure_plate_stone_off.png","jeija_pressure_plate_stone_off_edges.png"},  	{"jeija_pressure_plate_stone_on.png","jeija_pressure_plate_stone_on.png","jeija_pressure_plate_stone_on_edges.png"}, diff --git a/mesecons_random/init.lua b/mesecons_random/init.lua index 670bea4..0136309 100644 --- a/mesecons_random/init.lua +++ b/mesecons_random/init.lua @@ -9,7 +9,7 @@ minetest.register_node("mesecons_random:removestone", {  	mesecons = {effector = {  		action_on = function (pos, node)  			minetest.remove_node(pos) -			mesecon:update_autoconnect(pos) +			mesecon.update_autoconnect(pos)  		end  	}}  }) diff --git a/mesecons_receiver/init.lua b/mesecons_receiver/init.lua index 3b1108e..b06baa5 100644 --- a/mesecons_receiver/init.lua +++ b/mesecons_receiver/init.lua @@ -9,11 +9,11 @@ local receiver_get_rules = function (node)  	local rules = {	{x =  1, y = 0, z = 0},  			{x = -2, y = 0, z = 0}}  	if node.param2 == 2 then -		rules = mesecon:rotate_rules_left(rules) +		rules = mesecon.rotate_rules_left(rules)  	elseif node.param2 == 3 then -		rules = mesecon:rotate_rules_right(mesecon:rotate_rules_right(rules)) +		rules = mesecon.rotate_rules_right(mesecon.rotate_rules_right(rules))  	elseif node.param2 == 0 then -		rules = mesecon:rotate_rules_right(rules) +		rules = mesecon.rotate_rules_right(rules)  	end  	return rules  end @@ -81,83 +81,76 @@ minetest.register_node("mesecons_receiver:receiver_off", {  	}}  }) -mesecon:add_rules("receiver_pos", {{x = 2,  y = 0, z = 0}}) - -mesecon:add_rules("receiver_pos_all", { -{x = 2,  y = 0, z = 0}, -{x =-2,  y = 0, z = 0}, -{x = 0,  y = 0, z = 2}, -{x = 0,  y = 0, z =-2}}) - -function mesecon:receiver_get_pos_from_rcpt(pos, param2) -	local rules = mesecon:get_rules("receiver_pos") +function mesecon.receiver_get_pos_from_rcpt(pos, param2) +	local rules = {{x = 2,  y = 0, z = 0}}  	if param2 == nil then param2 = minetest.get_node(pos).param2 end  	if param2 == 2 then -		rules = mesecon:rotate_rules_left(rules) +		rules = mesecon.rotate_rules_left(rules)  	elseif param2 == 3 then -		rules = mesecon:rotate_rules_right(mesecon:rotate_rules_right(rules)) +		rules = mesecon.rotate_rules_right(mesecon.rotate_rules_right(rules))  	elseif param2 == 0 then -		rules = mesecon:rotate_rules_right(rules) +		rules = mesecon.rotate_rules_right(rules)  	end -	np = { -	x = pos.x + rules[1].x, -	y = pos.y + rules[1].y, -	z = pos.z + rules[1].z} +	local np = {	x = pos.x + rules[1].x, +			y = pos.y + rules[1].y, +			z = pos.z + rules[1].z}  	return np  end -function mesecon:receiver_place(rcpt_pos) +function mesecon.receiver_place(rcpt_pos)  	local node = minetest.get_node(rcpt_pos) -	local pos = mesecon:receiver_get_pos_from_rcpt(rcpt_pos, node.param2) +	local pos = mesecon.receiver_get_pos_from_rcpt(rcpt_pos, node.param2)  	local nn = minetest.get_node(pos)  	if string.find(nn.name, "mesecons:wire_") ~= nil then  		minetest.dig_node(pos) -		if mesecon:is_power_on(rcpt_pos) then +		if mesecon.is_power_on(rcpt_pos) then  			minetest.add_node(pos, {name = "mesecons_receiver:receiver_on", param2 = node.param2}) -			mesecon:receptor_on(pos, receiver_get_rules(node)) +			mesecon.receptor_on(pos, receiver_get_rules(node))  		else  			minetest.add_node(pos, {name = "mesecons_receiver:receiver_off", param2 = node.param2})  		end -		mesecon:update_autoconnect(pos) +		mesecon.update_autoconnect(pos)  	end  end -function mesecon:receiver_remove(rcpt_pos, dugnode) -	local pos = mesecon:receiver_get_pos_from_rcpt(rcpt_pos, dugnode.param2) +function mesecon.receiver_remove(rcpt_pos, dugnode) +	local pos = mesecon.receiver_get_pos_from_rcpt(rcpt_pos, dugnode.param2)  	local nn = minetest.get_node(pos)  	if string.find(nn.name, "mesecons_receiver:receiver_") ~=nil then  		minetest.dig_node(pos)  		local node = {name = "mesecons:wire_00000000_off"}  		minetest.add_node(pos, node) -		mesecon:update_autoconnect(pos) +		mesecon.update_autoconnect(pos)  		mesecon.on_placenode(pos, node)  	end  end  minetest.register_on_placenode(function (pos, node)  	if minetest.get_item_group(node.name, "mesecon_needs_receiver") == 1 then -		mesecon:receiver_place(pos) +		mesecon.receiver_place(pos)  	end  end)  minetest.register_on_dignode(function(pos, node)  	if minetest.get_item_group(node.name, "mesecon_needs_receiver") == 1 then -		mesecon:receiver_remove(pos, node) +		mesecon.receiver_remove(pos, node)  	end  end)  minetest.register_on_placenode(function (pos, node)  	if string.find(node.name, "mesecons:wire_") ~=nil then -		rules = mesecon:get_rules("receiver_pos_all") +		local rules = {	{x = 2,  y = 0, z = 0}, +				{x =-2,  y = 0, z = 0}, +				{x = 0,  y = 0, z = 2}, +				{x = 0,  y = 0, z =-2}}  		local i = 1  		while rules[i] ~= nil do -			np = { -			x = pos.x + rules[i].x, -			y = pos.y + rules[i].y, -			z = pos.z + rules[i].z} +			local np = {	x = pos.x + rules[i].x, +					y = pos.y + rules[i].y, +					z = pos.z + rules[i].z}  			if minetest.get_item_group(minetest.get_node(np).name, "mesecon_needs_receiver") == 1 then -				mesecon:receiver_place(np) +				mesecon.receiver_place(np)  			end  			i = i + 1  		end diff --git a/mesecons_solarpanel/init.lua b/mesecons_solarpanel/init.lua index c30fe12..bc5a408 100644 --- a/mesecons_solarpanel/init.lua +++ b/mesecons_solarpanel/init.lua @@ -75,7 +75,7 @@ minetest.register_abm(  		if light >= 12 then  			minetest.set_node(pos, {name="mesecons_solarpanel:solar_panel_on", param2=node.param2}) -			mesecon:receptor_on(pos) +			mesecon.receptor_on(pos)  		end  	end,  }) @@ -89,7 +89,7 @@ minetest.register_abm(  		if light < 12 then  			minetest.set_node(pos, {name="mesecons_solarpanel:solar_panel_off", param2=node.param2}) -			mesecon:receptor_off(pos) +			mesecon.receptor_off(pos)  		end  	end,  }) diff --git a/mesecons_switch/init.lua b/mesecons_switch/init.lua index 1b7f478..074dc62 100644 --- a/mesecons_switch/init.lua +++ b/mesecons_switch/init.lua @@ -1,35 +1,28 @@  -- MESECON_SWITCH -minetest.register_node("mesecons_switch:mesecon_switch_off", { -	tiles = {"jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_off.png"}, +mesecon.register_node("mesecons_switch:mesecon_switch", {  	paramtype2="facedir",  	groups = {dig_immediate=2},  	description="Switch",  	sounds = default.node_sound_stone_defaults(), -	mesecons = {receptor = { -		state = mesecon.state.off -	}}, -	on_punch = function(pos, node) -		minetest.swap_node(pos, {name = "mesecons_switch:mesecon_switch_on", param2 = node.param2}) -		mesecon:receptor_on(pos) -		minetest.sound_play("mesecons_switch", {pos=pos}) -	end -}) - -minetest.register_node("mesecons_switch:mesecon_switch_on", { -	tiles = {"jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_on.png"}, -	paramtype2="facedir", -	groups = {dig_immediate=2,not_in_creative_inventory=1}, -	drop="mesecons_switch:mesecon_switch_off 1", -	sounds = default.node_sound_stone_defaults(), -	mesecons = {receptor = { -		state = mesecon.state.on -	}}, -	on_punch = function(pos, node) -		minetest.swap_node(pos, {name = "mesecons_switch:mesecon_switch_off", param2 = node.param2}) -		mesecon:receptor_off(pos) +	on_punch = function (pos, node) +		if(mesecon.flipstate(pos, node) == "on") then +			mesecon.receptor_on(pos) +		else +			mesecon.receptor_off(pos) +		end  		minetest.sound_play("mesecons_switch", {pos=pos})  	end +},{ +	tiles = {	"jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", +			"jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", +			"jeija_mesecon_switch_side.png", "jeija_mesecon_switch_off.png"}, +	mesecons = {receptor = { state = mesecon.state.off }} +},{ +	tiles = {	"jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", +			"jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", +			"jeija_mesecon_switch_side.png", "jeija_mesecon_switch_on.png"}, +	mesecons = {receptor = { state = mesecon.state.on }}  })  minetest.register_craft({ diff --git a/mesecons_torch/init.lua b/mesecons_torch/init.lua index 97a2991..91f8e65 100644 --- a/mesecons_torch/init.lua +++ b/mesecons_torch/init.lua @@ -2,15 +2,15 @@  local rotate_torch_rules = function (rules, param2)  	if param2 == 5 then -		return mesecon:rotate_rules_right(rules) +		return mesecon.rotate_rules_right(rules)  	elseif param2 == 2 then -		return mesecon:rotate_rules_right(mesecon:rotate_rules_right(rules)) --180 degrees +		return mesecon.rotate_rules_right(mesecon.rotate_rules_right(rules)) --180 degrees  	elseif param2 == 4 then -		return mesecon:rotate_rules_left(rules) +		return mesecon.rotate_rules_left(rules)  	elseif param2 == 1 then -		return mesecon:rotate_rules_down(rules) +		return mesecon.rotate_rules_down(rules)  	elseif param2 == 0 then -		return mesecon:rotate_rules_up(rules) +		return mesecon.rotate_rules_up(rules)  	else  		return rules  	end @@ -91,8 +91,8 @@ minetest.register_abm({  	action = function(pos, node)  		local is_powered = false  		for _, rule in ipairs(torch_get_input_rules(node)) do -			local src = mesecon:addPosRule(pos, rule) -			if mesecon:is_power_on(src) then +			local src = mesecon.addPosRule(pos, rule) +			if mesecon.is_power_on(src) then  				is_powered = true  			end  		end @@ -100,11 +100,11 @@ minetest.register_abm({  		if is_powered then  			if node.name == "mesecons_torch:mesecon_torch_on" then  				minetest.swap_node(pos, {name = "mesecons_torch:mesecon_torch_off", param2 = node.param2}) -				mesecon:receptor_off(pos, torch_get_output_rules(node)) +				mesecon.receptor_off(pos, torch_get_output_rules(node))  			end  		elseif node.name == "mesecons_torch:mesecon_torch_off" then  			minetest.swap_node(pos, {name = "mesecons_torch:mesecon_torch_on", param2 = node.param2}) -			mesecon:receptor_on(pos, torch_get_output_rules(node)) +			mesecon.receptor_on(pos, torch_get_output_rules(node))  		end  	end  }) diff --git a/mesecons_walllever/init.lua b/mesecons_walllever/init.lua index a35d9f1..bd71871 100644 --- a/mesecons_walllever/init.lua +++ b/mesecons_walllever/init.lua @@ -1,16 +1,9 @@  -- WALL LEVER  -- Basically a switch that can be attached to a wall  -- Powers the block 2 nodes behind (using a receiver) -minetest.register_node("mesecons_walllever:wall_lever_off", { +mesecon.register_node("mesecons_walllever:wall_lever", { +	description="Lever",  	drawtype = "nodebox", -	tiles = { -		"jeija_wall_lever_tb.png", -		"jeija_wall_lever_bottom.png", -		"jeija_wall_lever_sides.png", -		"jeija_wall_lever_sides.png", -		"jeija_wall_lever_back.png", -		"jeija_wall_lever_off.png", -	},  	inventory_image = "jeija_wall_lever_off.png",  	wield_image = "jeija_wall_lever_off.png",  	paramtype = "light", @@ -21,29 +14,34 @@ minetest.register_node("mesecons_walllever:wall_lever_off", {  		type = "fixed",  		fixed = { -8/16, -8/16, 3/16, 8/16, 8/16, 8/16 },  	}, +	sounds = default.node_sound_wood_defaults(), +	on_punch = function (pos, node) +		if(mesecon.flipstate(pos, node) == "on") then +			mesecon.receptor_on(pos, mesecon.rules.buttonlike_get(node)) +		else +			mesecon.receptor_off(pos, mesecon.rules.buttonlike_get(node)) +		end +		minetest.sound_play("mesecons_lever", {pos=pos}) +	end +},{ +	tiles = { "jeija_wall_lever_tb.png", "jeija_wall_lever_bottom.png", +		"jeija_wall_lever_sides.png", "jeija_wall_lever_sides.png", +		"jeija_wall_lever_back.png", "jeija_wall_lever_off.png", +	},  	node_box = {  		type = "fixed",  		fixed = {{ -6/16, -6/16, 6/16, 6/16,  6/16, 8/16 },	-- the base "slab"  			 { -5/16, -3/16, 5/16, 5/16,  3/16, 6/16 },	-- the lighted ring area -			 { -4/16, -2/16, 4/16, 4/16,  2/16, 5/16 },	-- the raised bit that the lever "sits" on +			 { -4/16, -2/16, 4/16, 4/16,  2/16, 5/16 },	-- the raised bit  			 { -2/16, -1/16, 3/16, 2/16,  1/16, 4/16 },	-- the lever "hinge"  			 { -1/16, -8/16, 4/16, 1/16,  0,    6/16 }}	-- the lever itself.  	}, -	groups = {dig_immediate=2, mesecon_needs_receiver = 1}, -	description="Lever", -	on_punch = function (pos, node) -		minetest.swap_node(pos, {name = "mesecons_walllever:wall_lever_on", param2 = node.param2}) -		mesecon:receptor_on(pos, mesecon.rules.buttonlike_get(node)) -		minetest.sound_play("mesecons_lever", {pos=pos}) -	end, -	sounds = default.node_sound_wood_defaults(),  	mesecons = {receptor = {  		rules = mesecon.rules.buttonlike_get,  		state = mesecon.state.off -	}} -}) -minetest.register_node("mesecons_walllever:wall_lever_on", { -	drawtype = "nodebox", +	}}, +	groups = {dig_immediate = 2, mesecon_needs_receiver = 1} +},{  	tiles = {  		"jeija_wall_lever_top.png",  		"jeija_wall_lever_tb.png", @@ -52,37 +50,19 @@ minetest.register_node("mesecons_walllever:wall_lever_on", {  		"jeija_wall_lever_back.png",  		"jeija_wall_lever_on.png",  	}, -	inventory_image = "jeija_wall_lever_on.png", -	paramtype = "light", -	paramtype2 = "facedir", -	sunlight_propagates = true, -	walkable = false, -	light_source = LIGHT_MAX-7, -	selection_box = { -		type = "fixed", -		fixed = { -8/16, -8/16, 3/16, 8/16, 8/16, 8/16 }, -	},  	node_box = {  		type = "fixed",  		fixed = {{ -6/16, -6/16,  6/16, 6/16, 6/16,  8/16 },	-- the base "slab"  			 { -5/16, -3/16,  5/16, 5/16, 3/16,  6/16 },	-- the lighted ring area -			 { -4/16, -2/16,  4/16, 4/16, 2/16,  5/16 },	-- the raised bit that the lever "sits" on +			 { -4/16, -2/16,  4/16, 4/16, 2/16,  5/16 },	-- the raised bit  			 { -2/16, -1/16,  3/16, 2/16, 1/16,  4/16 },	-- the lever "hinge"  			 { -1/16,  0,     4/16, 1/16, 8/16,  6/16 }}	-- the lever itself.  	}, -	groups = {dig_immediate = 2, not_in_creative_inventory = 1, mesecon_needs_receiver = 1}, -	drop = "mesecons_walllever:wall_lever_off 1", -	description="Lever", -	on_punch = function (pos, node) -		minetest.swap_node(pos, {name = "mesecons_walllever:wall_lever_off", param2 = node.param2}) -		mesecon:receptor_off(pos, mesecon.rules.buttonlike_get(node)) -		minetest.sound_play("mesecons_lever", {pos=pos}) -	end, -	sounds = default.node_sound_wood_defaults(),  	mesecons = {receptor = {  		rules = mesecon.rules.buttonlike_get,  		state = mesecon.state.on -	}} +	}}, +	groups = {dig_immediate = 2, mesecon_needs_receiver = 1, not_in_creative_inventory = 1}  })  minetest.register_craft({ | 
