forked from minetest-mods/mesecons
		
	Merge branch 'mesecons_in_nodedef'
Conflicts: mesecons/internal.lua
This commit is contained in:
		| @@ -3,63 +3,82 @@ | ||||
| -- |  \/  | |___ ____  |___ |      |    | | \  | |____ | ||||
| -- |      | |        | |    |      |    | |  \ |     | | ||||
| -- |      | |___ ____| |___ |____  |____| |   \| ____| | ||||
| -- by Jeija and Minerd247 | ||||
| -- by Jeija, Uberi (Temperest), sfan5, VanessaE | ||||
| -- | ||||
| -- | ||||
| -- | ||||
| -- This mod adds mesecons[=minecraft redstone] and different receptors/effectors to minetest. | ||||
| -- | ||||
| -- See the documentation on the forum for additional information, especially about crafting | ||||
| -- | ||||
| -- For developer documentation see the Developers' section on mesecons.tk  | ||||
| -- | ||||
| -- For developer documentation see the Developers' section on mesecons.TK | ||||
| -- | ||||
| -- | ||||
| -- | ||||
| --Quick draft for the mesecons array in the node's definition | ||||
| --mesecons = | ||||
| --{ | ||||
| --	receptor = | ||||
| --	{ | ||||
| --		state = mesecon.state.on/off | ||||
| --		rules = rules/get_rules | ||||
| --	} | ||||
| --	effector = | ||||
| --	{ | ||||
| --		action_on = function | ||||
| --		action_off = function | ||||
| --		action_change = function | ||||
| --		rules = rules/get_rules | ||||
| --	} | ||||
| --	conductor =  | ||||
| --	{ | ||||
| --		state = mesecon.state.on/off | ||||
| --		offstate = opposite state (for state = on only) | ||||
| --		onstate = opposite state (for state = off only) | ||||
| --		rules = rules/get_rules | ||||
| --	} | ||||
| --} | ||||
|  | ||||
|  | ||||
| -- PUBLIC VARIABLES | ||||
| mesecon={} -- contains all functions and all global variables | ||||
| mesecon.actions_on={} -- Saves registered function callbacks for mesecon on | ||||
| mesecon.actions_off={} -- Saves registered function callbacks for mesecon off | ||||
| mesecon.actions_change={} -- Saves registered function callbacks for mesecon change | ||||
| mesecon.receptors={} | ||||
| mesecon.effectors={} | ||||
| mesecon.rules={} | ||||
| mesecon.conductors={} | ||||
| mesecon.actions_on={} -- Saves registered function callbacks for mesecon on | DEPRECATED | ||||
| mesecon.actions_off={} -- Saves registered function callbacks for mesecon off | DEPRECATED | ||||
| mesecon.actions_change={} -- Saves registered function callbacks for mesecon change | DEPRECATED | ||||
| mesecon.receptors={} --  saves all information about receptors  | DEPRECATED | ||||
| mesecon.effectors={} --  saves all information about effectors  | DEPRECATED | ||||
| mesecon.conductors={} -- saves all information about conductors | DEPRECATED | ||||
|  | ||||
| -- INCLUDE SETTINGS | ||||
| -- Settings | ||||
| dofile(minetest.get_modpath("mesecons").."/settings.lua") | ||||
|  | ||||
| --Internal API | ||||
| -- 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"); | ||||
|  | ||||
| -- Internal stuff | ||||
| -- This is the most important file | ||||
| -- it handles signal transmission and basically everything else | ||||
| -- It is also responsible for managing the nodedef things, | ||||
| -- like calling action_on/off/change | ||||
| dofile(minetest.get_modpath("mesecons").."/internal.lua"); | ||||
|  | ||||
| -- API API API API API API API API API API API API API API API API API API | ||||
| -- Deprecated stuff | ||||
| -- To be removed in future releases | ||||
| dofile(minetest.get_modpath("mesecons").."/legacy.lua"); | ||||
|  | ||||
| function mesecon:register_receptor(onstate, offstate, rules, get_rules) | ||||
| 	if get_rules == nil and rules == nil then | ||||
| 		rules = mesecon:get_rules("default") | ||||
| 	end | ||||
| 	table.insert(mesecon.receptors,  | ||||
| 		{onstate = onstate,  | ||||
| 		 offstate = offstate,  | ||||
| 		 rules = rules, | ||||
| 		 get_rules = get_rules}) | ||||
| end | ||||
|  | ||||
| function mesecon:register_effector(onstate, offstate, input_rules, get_input_rules) | ||||
| 	if get_input_rules==nil and input_rules==nil then | ||||
| 		rules=mesecon:get_rules("default") | ||||
| 	end | ||||
| 	table.insert(mesecon.effectors,  | ||||
| 		{onstate = onstate,  | ||||
| 		 offstate = offstate,  | ||||
| 		 input_rules = input_rules,  | ||||
| 		 get_input_rules = get_input_rules}) | ||||
| end | ||||
| -- API | ||||
| -- these are the only functions you need to remember | ||||
|  | ||||
| function mesecon:receptor_on(pos, rules) | ||||
| 	if rules == nil then | ||||
| 		rules = mesecon:get_rules("default") | ||||
| 	end | ||||
| 	rules = rules or mesecon.rules.default | ||||
|  | ||||
| 	for i, rule in ipairs(rules) do | ||||
| 	for _, rule in ipairs(rules) do | ||||
| 		local np = { | ||||
| 		x = pos.x + rule.x, | ||||
| 		y = pos.y + rule.y, | ||||
| @@ -71,11 +90,9 @@ function mesecon:receptor_on(pos, rules) | ||||
| end | ||||
|  | ||||
| function mesecon:receptor_off(pos, rules) | ||||
| 	if rules == nil then | ||||
| 		rules = mesecon:get_rules("default") | ||||
| 	end | ||||
| 	rules = rules or mesecon.rules.default | ||||
|  | ||||
| 	for i, rule in ipairs(rules) do | ||||
| 	for _, rule in ipairs(rules) do | ||||
| 		local np = { | ||||
| 		x = pos.x + rule.x, | ||||
| 		y = pos.y + rule.y, | ||||
| @@ -86,45 +103,11 @@ function mesecon:receptor_off(pos, rules) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| function mesecon:register_on_signal_on(action) | ||||
| 	table.insert(mesecon.actions_on, action) | ||||
| end | ||||
|  | ||||
| function mesecon:register_on_signal_off(action) | ||||
| 	table.insert(mesecon.actions_off, action) | ||||
| end | ||||
|  | ||||
| function mesecon:register_on_signal_change(action) | ||||
| 	table.insert(mesecon.actions_change, action) | ||||
| end | ||||
|  | ||||
| function mesecon:register_conductor (onstate, offstate, rules, get_rules) | ||||
| 	if rules == nil then | ||||
| 		rules = mesecon:get_rules("default") | ||||
| 	end | ||||
| 	table.insert(mesecon.conductors, {onstate = onstate, offstate = offstate, rules = rules, get_rules = get_rules}) | ||||
| end | ||||
|  | ||||
| mesecon:add_rules("default",  | ||||
| {{x=0,  y=0,  z=-1}, | ||||
| {x=1,  y=0,  z=0}, | ||||
| {x=-1, y=0,  z=0}, | ||||
| {x=0,  y=0,  z=1}, | ||||
| {x=1,  y=1,  z=0}, | ||||
| {x=1,  y=-1, z=0}, | ||||
| {x=-1, y=1,  z=0}, | ||||
| {x=-1, y=-1, z=0}, | ||||
| {x=0,  y=1,  z=1}, | ||||
| {x=0,  y=-1, z=1}, | ||||
| {x=0,  y=1,  z=-1}, | ||||
| {x=0,  y=-1, z=-1}}) | ||||
|  | ||||
| print("[MESEcons] Main mod Loaded!") | ||||
| print("[OK] mesecons") | ||||
|  | ||||
| --The actual wires | ||||
| dofile(minetest.get_modpath("mesecons").."/wires.lua"); | ||||
|  | ||||
| --Services like turnoff receptor on dignode and so on | ||||
| dofile(minetest.get_modpath("mesecons").."/services.lua"); | ||||
| --Deprecated stuff | ||||
| dofile(minetest.get_modpath("mesecons").."/legacy.lua"); | ||||
|   | ||||
| @@ -1,7 +1,14 @@ | ||||
| -- INTERNAL | ||||
|  | ||||
| --Receptors | ||||
| -- Receptors | ||||
| -- Nodes that can power mesecons | ||||
| function mesecon:is_receptor_node(nodename) | ||||
| 	if  minetest.registered_nodes[nodename] | ||||
| 	and minetest.registered_nodes[nodename].mesecons | ||||
| 	and minetest.registered_nodes[nodename].mesecons.receptor | ||||
| 	and minetest.registered_nodes[nodename].mesecons.receptor.state == mesecon.state.on then | ||||
| 		return true | ||||
| 	end | ||||
| 	for _, receptor in ipairs(mesecon.receptors) do | ||||
| 		if receptor.onstate == nodename then | ||||
| 			return true | ||||
| @@ -11,6 +18,12 @@ function mesecon:is_receptor_node(nodename) | ||||
| end | ||||
|  | ||||
| function mesecon:is_receptor_node_off(nodename, pos, ownpos) | ||||
| 	if minetest.registered_nodes[nodename] | ||||
| 	and minetest.registered_nodes[nodename].mesecons | ||||
| 	and minetest.registered_nodes[nodename].mesecons.receptor | ||||
| 	and minetest.registered_nodes[nodename].mesecons.receptor.state == mesecon.state.off then | ||||
| 		return true | ||||
| 	end | ||||
| 	for _, receptor in ipairs(mesecon.receptors) do | ||||
| 		if receptor.offstate == nodename then | ||||
| 			return true | ||||
| @@ -20,7 +33,16 @@ function mesecon:is_receptor_node_off(nodename, pos, ownpos) | ||||
| end | ||||
|  | ||||
| function mesecon:receptor_get_rules(node) | ||||
| 	for i, receptor in ipairs(mesecon.receptors) do | ||||
| 	if  minetest.registered_nodes[node.name].mesecons | ||||
| 	and minetest.registered_nodes[node.name].mesecons.receptor then | ||||
| 		local rules = minetest.registered_nodes[node.name].mesecons.receptor.rules | ||||
| 		if type(rules) == 'function' then | ||||
| 			return rules(node) | ||||
| 		elseif rules then | ||||
| 			return rules | ||||
| 		end | ||||
| 	end | ||||
| 	for _, receptor in ipairs(mesecon.receptors) do --TODO | ||||
| 		if receptor.onstate == node.name or receptor.offstate == node.name then | ||||
| 			if receptor.get_rules ~= nil then | ||||
| 				return receptor.get_rules(node.param2) | ||||
| @@ -31,12 +53,19 @@ function mesecon:receptor_get_rules(node) | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| 	return nil | ||||
| 	return mesecon.rules.default | ||||
| end | ||||
|  | ||||
| -- Effectors | ||||
| -- Nodes that can be powered by mesecons | ||||
| function mesecon:is_effector_on(nodename) | ||||
| 	for i, effector in ipairs(mesecon.effectors) do | ||||
| 	if   minetest.registered_nodes[nodename] | ||||
| 	and  minetest.registered_nodes[nodename].mesecons | ||||
| 	and  minetest.registered_nodes[nodename].mesecons.effector | ||||
| 	and minetest.registered_nodes[nodename].mesecons.effector.action_off then | ||||
| 		return true | ||||
| 	end | ||||
| 	for _, effector in ipairs(mesecon.effectors) do --TODO | ||||
| 		if effector.onstate == nodename then | ||||
| 			return true | ||||
| 		end | ||||
| @@ -45,7 +74,13 @@ function mesecon:is_effector_on(nodename) | ||||
| end | ||||
|  | ||||
| function mesecon:is_effector_off(nodename) | ||||
| 	for i, effector in ipairs(mesecon.effectors) do | ||||
| 	if   minetest.registered_nodes[nodename] | ||||
| 	and  minetest.registered_nodes[nodename].mesecons | ||||
| 	and  minetest.registered_nodes[nodename].mesecons.effector | ||||
| 	and minetest.registered_nodes[nodename].mesecons.effector.action_on then | ||||
| 		return true | ||||
| 	end | ||||
| 	for _, effector in ipairs(mesecon.effectors) do --TODO | ||||
| 		if effector.offstate == nodename then | ||||
| 			return true | ||||
| 		end | ||||
| @@ -54,43 +89,73 @@ function mesecon:is_effector_off(nodename) | ||||
| end | ||||
|  | ||||
| function mesecon:is_effector(nodename) | ||||
| 	return mesecon:is_effector_on(nodename) or mesecon:is_effector_off(nodename) | ||||
| 	if  minetest.registered_nodes[nodename] | ||||
| 	and minetest.registered_nodes[nodename].mesecons | ||||
| 	and minetest.registered_nodes[nodename].mesecons.effector then | ||||
| 		return true | ||||
| 	end | ||||
| 	return mesecon:is_effector_on(nodename) or mesecon:is_effector_off(nodename) --TODO | ||||
| end | ||||
|  | ||||
| function mesecon:effector_get_input_rules(node) | ||||
| 	for i, effector in ipairs(mesecon.effectors) do | ||||
| 	if  minetest.registered_nodes[node.name].mesecons | ||||
| 	and minetest.registered_nodes[node.name].mesecons.effector then | ||||
| 		local rules = minetest.registered_nodes[node.name].mesecons.effector.rules | ||||
| 		if type(rules) == 'function' then | ||||
| 			return rules(node) | ||||
| 		elseif rules then | ||||
| 			return rules | ||||
| 		end | ||||
| 	end | ||||
| 	for _, effector in ipairs(mesecon.effectors) do | ||||
| 		if effector.onstate  == node.name  | ||||
| 		or effector.offstate == node.name then | ||||
| 			if effector.get_input_rules ~= nil then | ||||
| 				return effector.get_input_rules(node.param2) | ||||
| 			elseif mesecon.effectors[i].input_rules ~=nil then | ||||
| 			elseif effector.input_rules ~=nil then | ||||
| 				return effector.input_rules | ||||
| 			else | ||||
| 				return mesecon:get_rules("default") | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| 	return mesecon.rules.default | ||||
| end | ||||
|  | ||||
| --Signals | ||||
|  | ||||
| function mesecon:activate(pos) | ||||
| 	local node = minetest.env:get_node(pos)	 | ||||
| 	for i, action in ipairs(mesecon.actions_on) do | ||||
| function mesecon:activate(pos, node) | ||||
| 	if  minetest.registered_nodes[node.name] | ||||
| 	and minetest.registered_nodes[node.name].mesecons | ||||
| 	and minetest.registered_nodes[node.name].mesecons.effector | ||||
| 	and minetest.registered_nodes[node.name].mesecons.effector.action_on then | ||||
| 		minetest.registered_nodes[node.name].mesecons.effector.action_on (pos, node) | ||||
| 	end | ||||
| 	for _, action in ipairs(mesecon.actions_on) do --TODO | ||||
| 		action(pos, node)  | ||||
| 	end | ||||
| end | ||||
|  | ||||
| function mesecon:deactivate(pos) | ||||
| 	local node = minetest.env:get_node(pos)	 | ||||
| 	for i, action in ipairs(mesecon.actions_off) do | ||||
| function mesecon:deactivate(pos, node) --TODO | ||||
| 	if  minetest.registered_nodes[node.name] | ||||
| 	and minetest.registered_nodes[node.name].mesecons | ||||
| 	and minetest.registered_nodes[node.name].mesecons.effector | ||||
| 	and minetest.registered_nodes[node.name].mesecons.effector.action_off then | ||||
| 		minetest.registered_nodes[node.name].mesecons.effector.action_off(pos, node) | ||||
| 	end | ||||
| 	for _, action in ipairs(mesecon.actions_off) do | ||||
| 		action(pos, node)  | ||||
| 	end | ||||
| end | ||||
|  | ||||
| function mesecon:changesignal(pos) | ||||
| 	local node = minetest.env:get_node(pos)	 | ||||
| 	for i, action in ipairs(mesecon.actions_change) do | ||||
| function mesecon:changesignal(pos, node) --TODO | ||||
| 	if  minetest.registered_nodes[node.name] | ||||
| 	and minetest.registered_nodes[node.name].mesecons | ||||
| 	and minetest.registered_nodes[node.name].mesecons.effector | ||||
| 	and minetest.registered_nodes[node.name].mesecons.effector.action_change then | ||||
| 		minetest.registered_nodes[node.name].mesecons.effector.action_change(pos, node) | ||||
| 	end | ||||
| 	for _, action in ipairs(mesecon.actions_change) do | ||||
| 		action(pos, node)  | ||||
| 	end | ||||
| end | ||||
| @@ -98,21 +163,22 @@ end | ||||
| --Rules | ||||
|  | ||||
| function mesecon:add_rules(name, rules) | ||||
| 	table.insert(mesecon.rules, {name = name, rules = rules}) | ||||
| 	mesecon.rules[name] = rules | ||||
| end | ||||
|  | ||||
| function mesecon:get_rules(name) | ||||
| 	for i, rule in ipairs(mesecon.rules) do | ||||
| 		if rule.name==name then | ||||
| 			return rule.rules | ||||
| 		end | ||||
| 	end | ||||
| 	return mesecon.rules[name] | ||||
| end | ||||
|  | ||||
| --Conductor system stuff | ||||
| -- Conductors | ||||
|  | ||||
| function mesecon:get_conductor_on(offstate) | ||||
| 	for i, conductor in ipairs(mesecon.conductors) do | ||||
| 	if  minetest.registered_nodes[offstate] | ||||
| 	and minetest.registered_nodes[offstate].mesecons | ||||
| 	and minetest.registered_nodes[offstate].mesecons.conductor then | ||||
| 		return minetest.registered_nodes[offstate].mesecons.conductor.onstate | ||||
| 	end | ||||
| 	for _, conductor in ipairs(mesecon.conductors) do --TODO | ||||
| 		if conductor.offstate == offstate then | ||||
| 			return conductor.onstate | ||||
| 		end | ||||
| @@ -121,7 +187,12 @@ function mesecon:get_conductor_on(offstate) | ||||
| end | ||||
|  | ||||
| function mesecon:get_conductor_off(onstate) | ||||
| 	for i, conductor in ipairs(mesecon.conductors) do | ||||
| 	if  minetest.registered_nodes[onstate] | ||||
| 	and minetest.registered_nodes[onstate].mesecons | ||||
| 	and minetest.registered_nodes[onstate].mesecons.conductor then | ||||
| 		return minetest.registered_nodes[onstate].mesecons.conductor.offstate | ||||
| 	end | ||||
| 	for _, conductor in ipairs(mesecon.conductors) do --TODO | ||||
| 		if conductor.onstate == onstate then | ||||
| 			return conductor.offstate | ||||
| 		end | ||||
| @@ -129,30 +200,53 @@ function mesecon:get_conductor_off(onstate) | ||||
| 	return false | ||||
| end | ||||
|  | ||||
| function mesecon:is_conductor_on(name) | ||||
| 	for i, conductor in ipairs(mesecon.conductors) do | ||||
| 		if conductor.onstate == name then | ||||
| function mesecon:is_conductor_on(nodename) | ||||
| 	if minetest.registered_nodes[nodename] | ||||
| 	and minetest.registered_nodes[nodename].mesecons | ||||
| 	and minetest.registered_nodes[nodename].mesecons.conductor | ||||
| 	and minetest.registered_nodes[nodename].mesecons.conductor.state == mesecon.state.on then | ||||
| 		return true | ||||
| 	end | ||||
| 	for _, conductor in ipairs(mesecon.conductors) do --TODO | ||||
| 		if conductor.onstate == nodename then | ||||
| 			return true | ||||
| 		end | ||||
| 	end | ||||
| 	return false | ||||
| end | ||||
|  | ||||
| function mesecon:is_conductor_off(name) | ||||
| 	for i, conductor in ipairs(mesecon.conductors) do | ||||
| 		if conductor.offstate == name then | ||||
| function mesecon:is_conductor_off(nodename) | ||||
| 	if minetest.registered_nodes[nodename] | ||||
| 	and minetest.registered_nodes[nodename].mesecons | ||||
| 	and minetest.registered_nodes[nodename].mesecons.conductor | ||||
| 	and minetest.registered_nodes[nodename].mesecons.conductor.state == mesecon.state.off then | ||||
| 		return true | ||||
| 	end | ||||
| 	for _, conductor in ipairs(mesecon.conductors) do --TODO | ||||
| 		if conductor.offstate == nodename then | ||||
| 			return true | ||||
| 		end | ||||
| 	end | ||||
| 	return false | ||||
| end | ||||
|  | ||||
| function mesecon:is_conductor(name) | ||||
| 	return mesecon:is_conductor_on(name) or mesecon:is_conductor_off(name) | ||||
| function mesecon:is_conductor(nodename) | ||||
| 	--TODO | ||||
| 	return mesecon:is_conductor_on(nodename) or mesecon:is_conductor_off(nodename) | ||||
| end | ||||
|  | ||||
| function mesecon:conductor_get_rules(node) | ||||
| 	for i, conductor in ipairs(mesecon.conductors) do | ||||
| 	if minetest.registered_nodes[node.name] | ||||
| 	and minetest.registered_nodes[node.name].mesecons | ||||
| 	and minetest.registered_nodes[node.name].mesecons.conductor then | ||||
| 		local rules = minetest.registered_nodes[node.name].mesecons.conductor.rules | ||||
| 		if type(rules) == 'function' then | ||||
| 			return rules(node) | ||||
| 		elseif rules then | ||||
| 			return rules | ||||
| 		end | ||||
| 	end | ||||
| 	for _, conductor in ipairs(mesecon.conductors) do --TODO | ||||
| 		if conductor.onstate  == node.name  | ||||
| 		or conductor.offstate == node.name then | ||||
| 			if conductor.get_rules ~= nil then | ||||
| @@ -162,6 +256,7 @@ function mesecon:conductor_get_rules(node) | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| 	return mesecon.rules.default | ||||
| end | ||||
|  | ||||
| -- | ||||
| @@ -186,13 +281,10 @@ function mesecon:turnon(pos) | ||||
|  | ||||
| 	if mesecon:is_conductor_off(node.name) then | ||||
| 		local rules = mesecon:conductor_get_rules(node) | ||||
| 		minetest.env:add_node(pos, {name=mesecon:get_conductor_on(node.name), param2 = node.param2}) | ||||
| 		mesecon:swap_node(pos, mesecon:get_conductor_on(node.name)) | ||||
|  | ||||
| 		for i, rule in ipairs(rules) do | ||||
| 			local np = {} | ||||
| 			np.x = pos.x + rule.x | ||||
| 			np.y = pos.y + rule.y | ||||
| 			np.z = pos.z + rule.z | ||||
| 		for _, rule in ipairs(rules) do | ||||
| 			local np = mesecon:addPosRule(pos, rule) | ||||
|  | ||||
| 			if mesecon:rules_link(pos, np) then | ||||
| 				mesecon:turnon(np) | ||||
| @@ -201,25 +293,22 @@ function mesecon:turnon(pos) | ||||
| 	end | ||||
|  | ||||
| 	if mesecon:is_effector(node.name) then | ||||
| 		mesecon:changesignal(pos) | ||||
| 		if mesecon:is_effector_off(node.name) then mesecon:activate(pos) end | ||||
| 		mesecon:changesignal(pos, node) | ||||
| 		if mesecon:is_effector_off(node.name) then | ||||
| 			mesecon:activate(pos, node) | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| function mesecon:turnoff(pos) --receptor rules used because output could have been dug | ||||
| 	local node = minetest.env:get_node(pos) | ||||
| 	local rules | ||||
|  | ||||
| 	if mesecon:is_conductor_on(node.name) then | ||||
| 		rules = mesecon:conductor_get_rules(node) | ||||
| 		local rules = mesecon:conductor_get_rules(node) | ||||
| 		mesecon:swap_node(pos, mesecon:get_conductor_off(node.name)) | ||||
|  | ||||
| 		minetest.env:add_node(pos, {name=mesecon:get_conductor_off(node.name), param2 = node.param2}) | ||||
|  | ||||
| 		for i, rule in ipairs(rules) do | ||||
| 			local np = { | ||||
| 			x = pos.x + rule.x, | ||||
| 			y = pos.y + rule.y, | ||||
| 			z = pos.z + rule.z,} | ||||
| 		for _, rule in ipairs(rules) do | ||||
| 			local np = mesecon:addPosRule(pos, rule) | ||||
|  | ||||
| 			if mesecon:rules_link(pos, np) then | ||||
| 				mesecon:turnoff(np) | ||||
| @@ -228,8 +317,11 @@ function mesecon:turnoff(pos) --receptor rules used because output could have be | ||||
| 	end | ||||
|  | ||||
| 	if mesecon:is_effector(node.name) then | ||||
| 		mesecon:changesignal(pos) | ||||
| 		if mesecon:is_effector_on(node.name) and not mesecon:is_powered(pos) then mesecon:deactivate(pos) end | ||||
| 		mesecon:changesignal(pos, node) | ||||
| 		if mesecon:is_effector_on(node.name) | ||||
| 		and not mesecon:is_powered(pos) then | ||||
| 			mesecon:deactivate(pos, node) | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| @@ -238,7 +330,7 @@ function mesecon:connected_to_pw_src(pos, checked) | ||||
| 	local c = 1 | ||||
| 	checked = checked or {} | ||||
| 	while checked[c] ~= nil do --find out if node has already been checked (to prevent from endless loop) | ||||
| 		if  compare_pos(checked[c], pos) then | ||||
| 		if mesecon:cmpPos(checked[c], pos) then | ||||
| 			return false, checked | ||||
| 		end | ||||
| 		c = c + 1 | ||||
| @@ -257,10 +349,7 @@ function mesecon:connected_to_pw_src(pos, checked) | ||||
| 	local rules = mesecon:conductor_get_rules(node) | ||||
|  | ||||
| 	for _, rule in ipairs(rules) do | ||||
| 		local np = {} | ||||
| 		np.x = pos.x + rule.x | ||||
| 		np.y = pos.y + rule.y | ||||
| 		np.z = pos.z + rule.z | ||||
| 		local np = mesecon:addPosRule(pos, rule) | ||||
| 		if mesecon:rules_link(pos, np) then | ||||
| 			connected, checked = mesecon:connected_to_pw_src(np, checked) | ||||
| 			if connected then  | ||||
| @@ -272,9 +361,6 @@ function mesecon:connected_to_pw_src(pos, checked) | ||||
| end | ||||
|  | ||||
| function mesecon:rules_link(output, input, dug_outputrules) --output/input are positions (outputrules optional, used if node has been dug) | ||||
| 	local k = 1 | ||||
| 	local l = 1 | ||||
|  | ||||
| 	local outputnode = minetest.env:get_node(output) | ||||
| 	local inputnode = minetest.env:get_node(input) | ||||
|  | ||||
| @@ -300,15 +386,10 @@ function mesecon:rules_link(output, input, dug_outputrules) --output/input are p | ||||
| 	end | ||||
|  | ||||
|  | ||||
| 	for k, outputrule in ipairs(outputrules) do | ||||
| 		if  outputrule.x + output.x == input.x | ||||
| 		and outputrule.y + output.y == input.y | ||||
| 		and outputrule.z + output.z == input.z then -- Check if output sends to input | ||||
| 			l = 1 | ||||
| 			for k, inputrule in ipairs(inputrules) do | ||||
| 				if  inputrule.x + input.x == output.x | ||||
| 				and inputrule.y + input.y == output.y | ||||
| 				and inputrule.z + input.z == output.z then --Check if input accepts from output | ||||
| 	for _, outputrule in ipairs(outputrules) do | ||||
| 		if mesecon:cmpPos(mesecon:addPosRule(output, outputrule), input) then -- Check if output sends to input | ||||
| 			for _, inputrule in ipairs(inputrules) do | ||||
| 				if  mesecon:cmpPos(mesecon:addPosRule(input, inputrule), output) then --Check if input accepts from output | ||||
| 					return true | ||||
| 				end | ||||
| 			end | ||||
| @@ -339,11 +420,8 @@ function mesecon:is_powered_by_conductor(pos) | ||||
| 		return false | ||||
| 	end | ||||
|  | ||||
| 	for i, rule in ipairs(rules) do | ||||
| 		local con_pos = { | ||||
| 		x = pos.x + rule.x, | ||||
| 		y = pos.y + rule.y, | ||||
| 		z = pos.z + rule.z} | ||||
| 	for _, rule in ipairs(rules) do | ||||
| 		local con_pos = mesecon:addPosRule(pos, rule) | ||||
|  | ||||
| 		con_node = minetest.env:get_node(con_pos) | ||||
|  | ||||
| @@ -373,11 +451,8 @@ function mesecon:is_powered_by_receptor(pos) | ||||
| 		return false | ||||
| 	end | ||||
|  | ||||
| 	for i, rule in ipairs(rules) do | ||||
| 		local rcpt_pos = { | ||||
| 		x = pos.x + rule.x, | ||||
| 		y = pos.y + rule.y, | ||||
| 		z = pos.z + rule.z} | ||||
| 	for _, rule in ipairs(rules) do | ||||
| 		local rcpt_pos = mesecon:addPosRule(pos, rule) | ||||
|  | ||||
| 		rcpt_node = minetest.env:get_node(rcpt_pos) | ||||
|  | ||||
| @@ -401,10 +476,6 @@ function mesecon:updatenode(pos) | ||||
|     end | ||||
| end | ||||
|  | ||||
| function compare_pos(pos1, pos2) | ||||
| 	return pos1.x == pos2.x and pos1.y == pos2.y and pos1.z == pos2.z | ||||
| end | ||||
|  | ||||
| --Rules rotation Functions: | ||||
| function mesecon:rotate_rules_right(rules) | ||||
| 	local nr={}; | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| --very old: | ||||
|  | ||||
| function mesecon:add_receptor_node(name, rules, get_rules) | ||||
| 	if get_rules==nil and rules==nil then | ||||
| 		rules=mesecon:get_rules("default") | ||||
| @@ -11,3 +13,48 @@ function mesecon:add_receptor_node_off(name, rules, get_rules) | ||||
| 	end | ||||
| 	table.insert(mesecon.receptors, {offstate = name, rules = rules, get_rules = get_rules}) | ||||
| end | ||||
|  | ||||
| --old: | ||||
|  | ||||
| function mesecon:register_receptor(onstate, offstate, rules, get_rules) | ||||
| 	if get_rules == nil and rules == nil then | ||||
| 		rules=mesecon:get_rules("default") | ||||
| 	end | ||||
| 	table.insert(mesecon.receptors,  | ||||
| 		{onstate = onstate,  | ||||
| 		 offstate = offstate,  | ||||
| 		 rules = input_rules,  | ||||
| 		 get_rules = get_rules}) | ||||
| end | ||||
|  | ||||
| function mesecon:register_effector(onstate, offstate, input_rules, get_input_rules) | ||||
| 	if get_input_rules==nil and input_rules==nil then | ||||
| 		rules=mesecon:get_rules("default") | ||||
| 	end | ||||
| 	table.insert(mesecon.effectors,  | ||||
| 		{onstate = onstate,  | ||||
| 		 offstate = offstate,  | ||||
| 		 input_rules = input_rules,  | ||||
| 		 get_input_rules = get_input_rules}) | ||||
| end | ||||
|  | ||||
| function mesecon:register_on_signal_on(action) | ||||
| 	table.insert(mesecon.actions_on, action) | ||||
| end | ||||
|  | ||||
| function mesecon:register_on_signal_off(action) | ||||
| 	table.insert(mesecon.actions_off, action) | ||||
| end | ||||
|  | ||||
| function mesecon:register_on_signal_change(action) | ||||
| 	table.insert(mesecon.actions_change, action) | ||||
| end | ||||
|  | ||||
| function mesecon:register_conductor (onstate, offstate, rules, get_rules) | ||||
| 	if rules == nil then | ||||
| 		rules = mesecon:get_rules("default") | ||||
| 	end | ||||
| 	table.insert(mesecon.conductors, {onstate = onstate, offstate = offstate, rules = rules, get_rules = get_rules}) | ||||
| end | ||||
|  | ||||
| mesecon:add_rules("default", mesecon.rules.default) | ||||
|   | ||||
							
								
								
									
										39
									
								
								mesecons/presets.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								mesecons/presets.lua
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| mesecon.rules = {} | ||||
| mesecon.state = {} | ||||
|  | ||||
| mesecon.rules.default = | ||||
| {{x=0,  y=0,  z=-1}, | ||||
| {x=1,  y=0,  z=0}, | ||||
| {x=-1, y=0,  z=0}, | ||||
| {x=0,  y=0,  z=1}, | ||||
| {x=1,  y=1,  z=0}, | ||||
| {x=1,  y=-1, z=0}, | ||||
| {x=-1, y=1,  z=0}, | ||||
| {x=-1, y=-1, z=0}, | ||||
| {x=0,  y=1,  z=1}, | ||||
| {x=0,  y=-1, z=1}, | ||||
| {x=0,  y=1,  z=-1}, | ||||
| {x=0,  y=-1, z=-1}} | ||||
|  | ||||
| mesecon.rules.buttonlike = | ||||
| {{x = 1,  y = 0, z = 0}, | ||||
| {x = 1,  y = 1, z = 0}, | ||||
| {x = 1,  y =-1, z = 0}, | ||||
| {x = 1,  y =-1, z = 1}, | ||||
| {x = 1,  y =-1, z =-1}, | ||||
| {x = 2,  y = 0, z = 0}} | ||||
|  | ||||
| mesecon.rules.buttonlike_get = function(node) | ||||
| 	local rules = mesecon.rules.buttonlike | ||||
| 	if node.param2 == 2 then | ||||
| 		rules=mesecon:rotate_rules_left(rules) | ||||
| 	elseif node.param2 == 3 then | ||||
| 		rules=mesecon:rotate_rules_right(mesecon:rotate_rules_right(rules)) | ||||
| 	elseif node.param2 == 0 then | ||||
| 		rules=mesecon:rotate_rules_right(rules) | ||||
| 	end | ||||
| 	return rules | ||||
| end | ||||
|  | ||||
| mesecon.state.on = "on" | ||||
| mesecon.state.off = "off" | ||||
| @@ -2,3 +2,4 @@ | ||||
| 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 | ||||
|   | ||||
							
								
								
									
										15
									
								
								mesecons/util.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								mesecons/util.lua
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| function mesecon:swap_node(pos, name) | ||||
| 	local node = minetest.env:get_node(pos) | ||||
| 	local data = minetest.env:get_meta(pos):to_table() | ||||
| 	node.name = name | ||||
| 	minetest.env:add_node(pos, node) | ||||
| 	minetest.env:get_meta(pos):from_table(data) | ||||
| end | ||||
|  | ||||
| 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) | ||||
| 	return (p1.x == p2.x and p1.y == p2.y and p1.z == p2.z) | ||||
| end | ||||
| @@ -41,7 +41,6 @@ else  -- NEW STYLE WIRES | ||||
|  | ||||
| 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_bump2 =  { -3/32, -13/32, -3/32, 3/32, -12/32, 3/32 } | ||||
|  | ||||
| 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} | ||||
| @@ -69,10 +68,10 @@ for zmy=0, 1 do | ||||
| 			tostring(xpy)..tostring(zpy)..tostring(xmy)..tostring(zmy) | ||||
|  | ||||
| 	if nodeid == "00000000" then | ||||
| 		groups = {dig_immediate = 3, mesecon = 2, mesecon_conductor_craftable=1} | ||||
| 		groups = {dig_immediate = 3, mesecon_conductor_craftable=1} | ||||
| 		wiredesc = "Mesecon" | ||||
| 	else | ||||
| 		groups = {dig_immediate = 3, mesecon = 2, not_in_creative_inventory = 1} | ||||
| 		groups = {dig_immediate = 3, not_in_creative_inventory = 1} | ||||
| 		wiredesc = "Mesecons Wire (ID: "..nodeid..")" | ||||
| 	end | ||||
|  | ||||
| @@ -90,7 +89,6 @@ for zmy=0, 1 do | ||||
|  | ||||
| 	if adjx and adjz and (xp + zp + xm + zm > 2) then | ||||
| 		table.insert(nodebox, box_bump1) | ||||
| 		table.insert(nodebox, box_bump2) | ||||
| 		tiles_off = { | ||||
| 			"wires_bump_off.png", | ||||
| 			"wires_bump_off.png", | ||||
| @@ -153,7 +151,11 @@ for zmy=0, 1 do | ||||
| 		groups = groups, | ||||
| 		walkable = false, | ||||
| 		stack_max = 99, | ||||
| 		drop = "mesecons:wire_00000000_off" | ||||
| 		drop = "mesecons:wire_00000000_off", | ||||
| 		mesecons = {conductor={ | ||||
| 			state = mesecon.state.off, | ||||
| 			onstate = "mesecons:wire_"..nodeid.."_on" | ||||
| 		}} | ||||
| 	}) | ||||
|  | ||||
| 	minetest.register_node("mesecons:wire_"..nodeid.."_on", { | ||||
| @@ -174,9 +176,12 @@ for zmy=0, 1 do | ||||
| 		groups = {dig_immediate = 3, mesecon = 2, not_in_creative_inventory = 1}, | ||||
| 		walkable = false, | ||||
| 		stack_max = 99, | ||||
| 		drop = "mesecons:wire_00000000_off" | ||||
| 		drop = "mesecons:wire_00000000_off", | ||||
| 		mesecons = {conductor={ | ||||
| 			state = mesecon.state.on, | ||||
| 			offstate = "mesecons:wire_"..nodeid.."_off" | ||||
| 		}} | ||||
| 	}) | ||||
| 	mesecon:register_conductor("mesecons:wire_"..nodeid.."_on", "mesecons:wire_"..nodeid.."_off") | ||||
| end | ||||
| end | ||||
| end | ||||
| @@ -186,17 +191,15 @@ end | ||||
| end | ||||
| end | ||||
|  | ||||
| minetest.register_on_placenode(function(pos, node) | ||||
| 	if minetest.get_item_group(node.name, "mesecon") > 1 then | ||||
| 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) | ||||
| 	end | ||||
| end) | ||||
| end | ||||
|  | ||||
| minetest.register_on_dignode(function(pos, node) | ||||
| 	if minetest.get_item_group(node.name, "mesecon") > 1 then | ||||
| 		mesecon:update_autoconnect(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} | ||||
| @@ -234,48 +237,20 @@ function mesecon:update_autoconnect(pos, secondcall, replace_old) | ||||
| 	nodename = minetest.env:get_node(pos).name | ||||
| 	if string.find(nodename, "mesecons:wire_") == nil and not replace_old then return nil end | ||||
|  | ||||
| 	if mesecon:rules_link_bothdir(pos, xppos) then xp = 1 else xp = 0 end | ||||
| 	if mesecon:rules_link_bothdir(pos, xmpos) then xm = 1 else xm = 0 end | ||||
| 	if mesecon:rules_link_bothdir(pos, zppos) then zp = 1 else zp = 0 end | ||||
| 	if mesecon:rules_link_bothdir(pos, zmpos) then zm = 1 else zm = 0 end | ||||
|  | ||||
| 	--if the groups mesecon == 1 then wires won't connect to it | ||||
| 	local zmg = 	minetest.get_item_group(minetest.env:get_node(zmpos  ).name, "mesecon") | ||||
| 	local zmymg = 	minetest.get_item_group(minetest.env:get_node(zmympos).name, "mesecon") | ||||
| 	local xmg = 	minetest.get_item_group(minetest.env:get_node(xmpos  ).name, "mesecon") | ||||
| 	local xmymg = 	minetest.get_item_group(minetest.env:get_node(xmympos).name, "mesecon") | ||||
| 	local zpg = 	minetest.get_item_group(minetest.env:get_node(zppos  ).name, "mesecon") | ||||
| 	local zpymg = 	minetest.get_item_group(minetest.env:get_node(zpympos).name, "mesecon") | ||||
| 	local xpg = 	minetest.get_item_group(minetest.env:get_node(xppos  ).name, "mesecon") | ||||
| 	local xpymg = 	minetest.get_item_group(minetest.env:get_node(xpympos).name, "mesecon") | ||||
| 	if mesecon:rules_link_bothdir(pos, xpympos) then xp = 1 end | ||||
| 	if mesecon:rules_link_bothdir(pos, xmympos) then xm = 1 end | ||||
| 	if mesecon:rules_link_bothdir(pos, zpympos) then zp = 1 end | ||||
| 	if mesecon:rules_link_bothdir(pos, zmympos) then zm = 1 end | ||||
|  | ||||
|  | ||||
| 	local xpyg = minetest.get_item_group(minetest.env:get_node(xpypos).name, "mesecon") | ||||
| 	local zpyg = minetest.get_item_group(minetest.env:get_node(zpypos).name, "mesecon") | ||||
| 	local xmyg = minetest.get_item_group(minetest.env:get_node(xmypos).name, "mesecon") | ||||
| 	local zmyg = minetest.get_item_group(minetest.env:get_node(zmypos).name, "mesecon") | ||||
|  | ||||
| 	if ((zmg == 2) or (zmymg == 2)) == true then zm = 1 else zm = 0 end | ||||
| 	if ((xmg == 2) or (xmymg == 2)) == true then xm = 1 else xm = 0 end | ||||
| 	if ((zpg == 2) or (zpymg == 2)) == true then zp = 1 else zp = 0 end | ||||
| 	if ((xpg == 2) or (xpymg == 2)) == true then xp = 1 else xp = 0 end | ||||
|  | ||||
| 	if xpyg == 2 then xpy = 1 else xpy = 0 end | ||||
| 	if zpyg == 2 then zpy = 1 else zpy = 0 end | ||||
| 	if xmyg == 2 then xmy = 1 else xmy = 0 end | ||||
| 	if zmyg == 2 then zmy = 1 else zmy = 0 end | ||||
|  | ||||
| 	-- If group == 3 then the mesecon only connects to input and output ports | ||||
| 	if xpg == 3 and mesecon:rules_link_bothdir(pos, xppos) then xp = 1 end | ||||
| 	if xmg == 3 and mesecon:rules_link_bothdir(pos, xmpos) then xm = 1 end | ||||
| 	if zpg == 3 and mesecon:rules_link_bothdir(pos, zppos) then zp = 1 end | ||||
| 	if zmg == 3 and mesecon:rules_link_bothdir(pos, zmpos) then zm = 1 end | ||||
|  | ||||
| 	if xpymg == 3 and mesecon:rules_link_bothdir(pos, xpympos) then xp = 1 end | ||||
| 	if xmymg == 3 and mesecon:rules_link_bothdir(pos, xmympos) then xm = 1 end | ||||
| 	if zpymg == 3 and mesecon:rules_link_bothdir(pos, zpympos) then zp = 1 end | ||||
| 	if zmymg == 3 and mesecon:rules_link_bothdir(pos, zmympos) then zm = 1 end | ||||
|  | ||||
| 	if xpyg == 3 then if mesecon:rules_link(pos, xpypos) then xpy = 1 end end | ||||
| 	if zpyg == 3 then if mesecon:rules_link(pos, zpypos) then zpy = 1 end end | ||||
| 	if xmyg == 3 then if mesecon:rules_link(pos, xmypos) then xmy = 1 end end | ||||
| 	if zmyg == 3 then if mesecon:rules_link(pos, zmypos) then zmy = 1 end end | ||||
| 	if mesecon:rules_link(pos, xpypos) then xpy = 1 else xpy = 0 end | ||||
| 	if mesecon:rules_link(pos, zpypos) then zpy = 1 else zpy = 0 end | ||||
| 	if mesecon:rules_link(pos, xmypos) then xmy = 1 else xmy = 0 end | ||||
| 	if mesecon:rules_link(pos, zmypos) then zmy = 1 else zmy = 0 end | ||||
|  | ||||
| 	-- Backward compatibility | ||||
| 	if replace_old then | ||||
|   | ||||
		Reference in New Issue
	
	Block a user