diff options
33 files changed, 276 insertions, 309 deletions
| diff --git a/mesecons/actionqueue.lua b/mesecons/actionqueue.lua index e0b8c65..e7cbc55 100644 --- a/mesecons/actionqueue.lua +++ b/mesecons/actionqueue.lua @@ -14,7 +14,7 @@ function mesecon.queue:add_action(pos, func, params, time, overwritecheck, prior  	priority = priority or 1  	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,  				priority=priority} diff --git a/mesecons/internal.lua b/mesecons/internal.lua index d45b0bf..edf361f 100644 --- a/mesecons/internal.lua +++ b/mesecons/internal.lua @@ -26,10 +26,6 @@  -- 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 -  -- 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 @@ -244,18 +240,6 @@ function mesecon:changesignal(pos, node, rulename, newstate, recdepth)  	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] -end -  -- Conductors  function mesecon:is_conductor_on(node, rulename) @@ -548,7 +532,7 @@ 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 +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) diff --git a/mesecons/services.lua b/mesecons/services.lua index d549cb0..0cf94d2 100644 --- a/mesecons/services.lua +++ b/mesecons/services.lua @@ -1,6 +1,8 @@  -- 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)) @@ -18,7 +20,7 @@ mesecon.on_placenode = function (pos, node)  				mesecon:turnon(pos, rule)  			end  			--mesecon:receptor_on (pos, mesecon:conductor_get_rules(node)) -		elseif mesecon:is_conductor_off(node.name) then +		elseif mesecon:is_conductor_on(node) then  			minetest.swap_node(pos, {name = mesecon:get_conductor_off(node)})  		end  	end @@ -41,8 +43,11 @@ mesecon.on_dignode = function (pos, 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) 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..e49e82c 100644 --- a/mesecons/util.lua +++ b/mesecons/util.lua @@ -193,3 +193,20 @@ function mesecon:cmpAny(t1, t2)  	return true  end + +-- does not overwrite values +mesecon.mergetable = function(source, dest) +	for k, v in pairs(source) do +		dest[k] = dest[k] or v +	end +end + +mesecon.register_node = function(name, spec_common, spec_off, spec_on) +	spec_common.drop = spec_common.drop or name .. "_off" + +	mesecon.mergetable(spec_common, spec_on); +	mesecon.mergetable(spec_common, spec_off); + +	minetest.register_node(name .. "_on", spec_on) +	minetest.register_node(name .. "_off", spec_off) +end diff --git a/mesecons/wires.lua b/mesecons/wires.lua index 499c781..158d436 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 {} +			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 {} +		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_extrawires/vertical.lua b/mesecons_extrawires/vertical.lua index 16de55e..24e36e1 100644 --- a/mesecons_extrawires/vertical.lua +++ b/mesecons_extrawires/vertical.lua @@ -69,7 +69,7 @@ end  minetest.register_node("mesecons_extrawires:vertical_on", {  	description = "Vertical mesecon",  	drawtype = "nodebox", -	tiles = {"wires_vertical_on.png"}, +	tiles = {"mesecons_wire_on.png"},  	walkable = false,  	paramtype = "light",  	sunlight_propagates = true, @@ -91,7 +91,7 @@ minetest.register_node("mesecons_extrawires:vertical_on", {  minetest.register_node("mesecons_extrawires:vertical_off", {  	description = "Vertical mesecon",  	drawtype = "nodebox", -	tiles = {"wires_vertical_off.png"}, +	tiles = {"mesecons_wire_off.png"},  	walkable = false,  	paramtype = "light",  	sunlight_propagates = true, @@ -113,7 +113,7 @@ minetest.register_node("mesecons_extrawires:vertical_off", {  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"}, +	tiles = {"mesecons_wire_on.png"},  	walkable = false,  	paramtype = "light",  	sunlight_propagates = true, @@ -135,7 +135,7 @@ minetest.register_node("mesecons_extrawires:vertical_top_on", {  minetest.register_node("mesecons_extrawires:vertical_top_off", {  	description = "Vertical mesecon",  	drawtype = "nodebox", -	tiles = {"wires_full_off.png","wires_full_off.png","wires_vertical_off.png"}, +	tiles = {"mesecons_wire_off.png"},  	walkable = false,  	paramtype = "light",  	sunlight_propagates = true, @@ -158,7 +158,7 @@ minetest.register_node("mesecons_extrawires:vertical_top_off", {  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"}, +	tiles = {"mesecons_wire_on.png"},  	walkable = false,  	paramtype = "light",  	sunlight_propagates = true, @@ -179,7 +179,7 @@ minetest.register_node("mesecons_extrawires:vertical_bottom_on", {  minetest.register_node("mesecons_extrawires:vertical_bottom_off", {  	description = "Vertical mesecon",  	drawtype = "nodebox", -	tiles = {"wires_full_off.png","wires_full_off.png","wires_vertical_off.png"}, +	tiles = {"mesecons_wire_off.png"},  	walkable = false,  	paramtype = "light",  	sunlight_propagates = true, diff --git a/mesecons_insulated/init.lua b/mesecons_insulated/init.lua index 9fdf494..26e3efb 100644 --- a/mesecons_insulated/init.lua +++ b/mesecons_insulated/init.lua @@ -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_microcontroller/init.lua b/mesecons_microcontroller/init.lua index 8c9f3b8..9883b85 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,7 +133,7 @@ minetest.register_node(nodename, {  	sounds = default.node_sound_stone_defaults(),  	mesecons = mesecons,  	after_dig_node = function (pos, node) -		rules = mesecon:get_rules(node.name) +		rules = microc_rules[node.name]  		mesecon:receptor_off(pos, rules)  	end,  }) @@ -600,22 +602,22 @@ 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") +		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") +		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") +		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") +		rules = microc_rules[name.."1000"]  		if L.d == true then mesecon:receptor_on(pos, rules)  		else mesecon:receptor_off(pos, rules) end  	end diff --git a/mesecons_movestones/init.lua b/mesecons_movestones/init.lua index e31f2d2..e8c52cb 100644 --- a/mesecons_movestones/init.lua +++ b/mesecons_movestones/init.lua @@ -67,7 +67,7 @@ minetest.register_node("mesecons_movestones:movestone", {  			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  	}} @@ -146,7 +146,7 @@ minetest.register_node("mesecons_movestones:sticky_movestone", {  			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  	}} diff --git a/mesecons_mvps/init.lua b/mesecons_mvps/init.lua index 0079f1a..a9c0da8 100644 --- a/mesecons_mvps/init.lua +++ b/mesecons_mvps/init.lua @@ -42,9 +42,7 @@ end  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 @@ -92,7 +90,6 @@ 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 @@ -121,7 +118,7 @@ end  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) @@ -140,7 +137,7 @@ 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}} @@ -188,7 +185,7 @@ 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 diff --git a/mesecons_receiver/init.lua b/mesecons_receiver/init.lua index 3b1108e..b368f24 100644 --- a/mesecons_receiver/init.lua +++ b/mesecons_receiver/init.lua @@ -81,16 +81,8 @@ 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") +	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) @@ -119,7 +111,7 @@ function mesecon:receiver_place(rcpt_pos)  		else  			minetest.add_node(pos, {name = "mesecons_receiver:receiver_off", param2 = node.param2})  		end -		mesecon:update_autoconnect(pos) +		mesecon.update_autoconnect(pos)  	end  end @@ -130,7 +122,7 @@ function mesecon:receiver_remove(rcpt_pos, dugnode)  		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 @@ -149,7 +141,10 @@ end)  minetest.register_on_placenode(function (pos, node)  	if string.find(node.name, "mesecons:wire_") ~=nil then -		rules = mesecon:get_rules("receiver_pos_all") +		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 = { | 
