forked from minetest-mods/mesecons
		
	Add T-junction extrawire (no good textures yet)
This commit is contained in:
		
							
								
								
									
										138
									
								
								mesecons_extrawires/crossing.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								mesecons_extrawires/crossing.lua
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,138 @@
 | 
			
		||||
for x=-1, 1 do for z=-1, 1 do
 | 
			
		||||
	rules = {}
 | 
			
		||||
	nodename = "mesecons_extrawires:crossing"
 | 
			
		||||
	if x == -1 then
 | 
			
		||||
		nodename = nodename .. "A"
 | 
			
		||||
		table.insert(rules, {x=-1, y=0, z=0})
 | 
			
		||||
	end
 | 
			
		||||
	if z == 1 then
 | 
			
		||||
		nodename = nodename .. "B"
 | 
			
		||||
		table.insert(rules, {x=0, y=0, z=1})
 | 
			
		||||
	end
 | 
			
		||||
	if x == 1 then
 | 
			
		||||
		nodename = nodename .. "C"
 | 
			
		||||
		table.insert(rules, {x=1, y=0, z=0})
 | 
			
		||||
	end
 | 
			
		||||
	if z == -1 then
 | 
			
		||||
		nodename = nodename .. "D"
 | 
			
		||||
		table.insert(rules, {x=0, y=0, z=-1})
 | 
			
		||||
	end
 | 
			
		||||
	mesecon:add_rules(nodename, rules)
 | 
			
		||||
	mesecon:register_effector(nodename, nodename, all_rules)
 | 
			
		||||
	if nodename == "mesecons_extrawires:crossing" then
 | 
			
		||||
		description = "Insulated Crossing"
 | 
			
		||||
		groups = {dig_immediate = 3, mesecon = 3, mesecon_conductor_craftable=1}
 | 
			
		||||
	else
 | 
			
		||||
		description = "You hacker you!"
 | 
			
		||||
		drop = "mesecons_extrawires:crossing"
 | 
			
		||||
		groups = {dig_immediate = 3, not_in_creative_inventory=1, mesecon = 3}
 | 
			
		||||
		mesecon:add_receptor_node(nodename, rules)
 | 
			
		||||
	end
 | 
			
		||||
	minetest.register_node(nodename, {
 | 
			
		||||
		drawtype = "nodebox",
 | 
			
		||||
		description = description,
 | 
			
		||||
		tiles = {
 | 
			
		||||
			"jeija_insulated_wire_sides.png",
 | 
			
		||||
		},
 | 
			
		||||
		paramtype = "light",
 | 
			
		||||
		walkable = false,
 | 
			
		||||
		stack_max = 99,
 | 
			
		||||
		selection_box = {
 | 
			
		||||
			type = "fixed",
 | 
			
		||||
			fixed = { -16/32-0.0001, -18/32, -16/32-0.001, 16/32+0.001, -5/32, 16/32+0.001 },
 | 
			
		||||
		},
 | 
			
		||||
		node_box = {
 | 
			
		||||
			type = "fixed",
 | 
			
		||||
			fixed = {
 | 
			
		||||
				{ -16/32-0.001, -17/32, -3/32, 16/32+0.001, -13/32, 3/32 },
 | 
			
		||||
				{ -3/32, -17/32, -16/32-0.001, 3/32, -13/32, -6/32 },
 | 
			
		||||
				{ -3/32, -13/32, -9/32, 3/32, -6/32, -6/32 },
 | 
			
		||||
				{ -3/32, -9/32, -9/32, 3/32, -6/32, 9/32 },
 | 
			
		||||
				{ -3/32, -13/32, 6/32, 3/32, -6/32, 9/32 },
 | 
			
		||||
				{ -3/32, -17/32, 6/32, 3/32, -13/32, 16/32+0.001 },
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		groups = groups,
 | 
			
		||||
		drop = drop,
 | 
			
		||||
	})
 | 
			
		||||
end end
 | 
			
		||||
 | 
			
		||||
function receptor_set(pos, rules, on)
 | 
			
		||||
	if on then
 | 
			
		||||
		mesecon:receptor_on(pos, rules)
 | 
			
		||||
	else
 | 
			
		||||
		mesecon:receptor_off(pos, rules)
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function update_plus(pos, name)
 | 
			
		||||
	vL = {
 | 
			
		||||
		a = string.find(name, "A")~=nil,
 | 
			
		||||
		b = string.find(name, "B")~=nil,
 | 
			
		||||
		c = string.find(name, "C")~=nil,
 | 
			
		||||
		d = string.find(name, "D")~=nil,
 | 
			
		||||
	}
 | 
			
		||||
	rL = yc_get_real_portstates(pos)
 | 
			
		||||
	L = {
 | 
			
		||||
		a = rL.c and not vL.c,
 | 
			
		||||
		b = rL.d and not vL.d,
 | 
			
		||||
		c = rL.a and not vL.a,
 | 
			
		||||
		d = rL.b and not vL.b,
 | 
			
		||||
	}
 | 
			
		||||
	newname = "mesecons_extrawires:crossing"
 | 
			
		||||
	if L.a then newname = newname .. "A" end
 | 
			
		||||
	if L.b then newname = newname .. "B" end
 | 
			
		||||
	if L.c then newname = newname .. "C" end
 | 
			
		||||
	if L.d then newname = newname .. "D" end
 | 
			
		||||
	if newname ~= name then
 | 
			
		||||
		minetest.env:add_node(pos, {name = newname})
 | 
			
		||||
	end
 | 
			
		||||
	if L.a ~= vL.a then
 | 
			
		||||
		receptor_set(pos, mesecon:get_rules("mesecons_extrawires:crossingA"), L.a)
 | 
			
		||||
		if not L.a and yc_get_real_portstates(pos).a then
 | 
			
		||||
			--catch signal changing direction while on
 | 
			
		||||
			update_plus(pos, newname)
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
	if L.b ~= vL.b then
 | 
			
		||||
		receptor_set(pos, mesecon:get_rules("mesecons_extrawires:crossingB"), L.b)
 | 
			
		||||
		if not L.b and yc_get_real_portstates(pos).b then
 | 
			
		||||
			update_plus(pos, newname)
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
	if L.c ~= vL.c then
 | 
			
		||||
		receptor_set(pos, mesecon:get_rules("mesecons_extrawires:crossingC"), L.c)
 | 
			
		||||
		if not L.c and yc_get_real_portstates(pos).c then
 | 
			
		||||
			update_plus(pos, newname)
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
	if L.d ~= vL.d then
 | 
			
		||||
		receptor_set(pos, mesecon:get_rules("mesecons_extrawires:crossingD"), L.d)
 | 
			
		||||
		if not L.c and yc_get_real_portstates(pos).d then
 | 
			
		||||
			update_plus(pos, newname)
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
mesecon:register_on_signal_change(function(pos, node)
 | 
			
		||||
	if string.find(node.name, "mesecons_extrawires:crossing")~=nil then
 | 
			
		||||
		update_plus(pos, node.name)
 | 
			
		||||
	end
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
minetest.register_craft({
 | 
			
		||||
	type = "shapeless",
 | 
			
		||||
	output = "mesecons_extrawires:crossing",
 | 
			
		||||
	recipe = {
 | 
			
		||||
		"mesecons_insulated:insulated_off",
 | 
			
		||||
		"mesecons_insulated:insulated_off",
 | 
			
		||||
	},
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_craft({
 | 
			
		||||
	type = "shapeless",
 | 
			
		||||
	output = "mesecons_insulated:insulated_off 2",
 | 
			
		||||
	recipe = {
 | 
			
		||||
		"mesecons_extrawires:crossing",
 | 
			
		||||
	},
 | 
			
		||||
})
 | 
			
		||||
@@ -1,138 +1,2 @@
 | 
			
		||||
for x=-1, 1 do for z=-1, 1 do
 | 
			
		||||
	rules = {}
 | 
			
		||||
	nodename = "mesecons_extrawires:crossing"
 | 
			
		||||
	if x == -1 then
 | 
			
		||||
		nodename = nodename .. "A"
 | 
			
		||||
		table.insert(rules, {x=-1, y=0, z=0})
 | 
			
		||||
	end
 | 
			
		||||
	if z == 1 then
 | 
			
		||||
		nodename = nodename .. "B"
 | 
			
		||||
		table.insert(rules, {x=0, y=0, z=1})
 | 
			
		||||
	end
 | 
			
		||||
	if x == 1 then
 | 
			
		||||
		nodename = nodename .. "C"
 | 
			
		||||
		table.insert(rules, {x=1, y=0, z=0})
 | 
			
		||||
	end
 | 
			
		||||
	if z == -1 then
 | 
			
		||||
		nodename = nodename .. "D"
 | 
			
		||||
		table.insert(rules, {x=0, y=0, z=-1})
 | 
			
		||||
	end
 | 
			
		||||
	mesecon:add_rules(nodename, rules)
 | 
			
		||||
	mesecon:register_effector(nodename, nodename, all_rules)
 | 
			
		||||
	if nodename == "mesecons_extrawires:crossing" then
 | 
			
		||||
		description = "Insulated Crossing"
 | 
			
		||||
		groups = {dig_immediate = 3, mesecon = 3, mesecon_conductor_craftable=1}
 | 
			
		||||
	else
 | 
			
		||||
		description = "You hacker you!"
 | 
			
		||||
		drop = "mesecons_extrawires:crossing"
 | 
			
		||||
		groups = {dig_immediate = 3, not_in_creative_inventory=1, mesecon = 3}
 | 
			
		||||
		mesecon:add_receptor_node(nodename, rules)
 | 
			
		||||
	end
 | 
			
		||||
	minetest.register_node(nodename, {
 | 
			
		||||
		drawtype = "nodebox",
 | 
			
		||||
		description = description,
 | 
			
		||||
		tiles = {
 | 
			
		||||
			"jeija_insulated_wire_sides.png",
 | 
			
		||||
		},
 | 
			
		||||
		paramtype = "light",
 | 
			
		||||
		walkable = false,
 | 
			
		||||
		stack_max = 99,
 | 
			
		||||
		selection_box = {
 | 
			
		||||
			type = "fixed",
 | 
			
		||||
			fixed = { -16/32-0.0001, -18/32, -16/32-0.001, 16/32+0.001, -5/32, 16/32+0.001 },
 | 
			
		||||
		},
 | 
			
		||||
		node_box = {
 | 
			
		||||
			type = "fixed",
 | 
			
		||||
			fixed = {
 | 
			
		||||
				{ -16/32-0.001, -17/32, -3/32, 16/32+0.001, -13/32, 3/32 },
 | 
			
		||||
				{ -3/32, -17/32, -16/32-0.001, 3/32, -13/32, -6/32 },
 | 
			
		||||
				{ -3/32, -13/32, -9/32, 3/32, -6/32, -6/32 },
 | 
			
		||||
				{ -3/32, -9/32, -9/32, 3/32, -6/32, 9/32 },
 | 
			
		||||
				{ -3/32, -13/32, 6/32, 3/32, -6/32, 9/32 },
 | 
			
		||||
				{ -3/32, -17/32, 6/32, 3/32, -13/32, 16/32+0.001 },
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		groups = groups,
 | 
			
		||||
		drop = drop,
 | 
			
		||||
	})
 | 
			
		||||
end end
 | 
			
		||||
 | 
			
		||||
function receptor_set(pos, rules, on)
 | 
			
		||||
	if on then
 | 
			
		||||
		mesecon:receptor_on(pos, rules)
 | 
			
		||||
	else
 | 
			
		||||
		mesecon:receptor_off(pos, rules)
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function update_plus(pos, name)
 | 
			
		||||
	vL = {
 | 
			
		||||
		a = string.find(name, "A")~=nil,
 | 
			
		||||
		b = string.find(name, "B")~=nil,
 | 
			
		||||
		c = string.find(name, "C")~=nil,
 | 
			
		||||
		d = string.find(name, "D")~=nil,
 | 
			
		||||
	}
 | 
			
		||||
	rL = yc_get_real_portstates(pos)
 | 
			
		||||
	L = {
 | 
			
		||||
		a = rL.c and not vL.c,
 | 
			
		||||
		b = rL.d and not vL.d,
 | 
			
		||||
		c = rL.a and not vL.a,
 | 
			
		||||
		d = rL.b and not vL.b,
 | 
			
		||||
	}
 | 
			
		||||
	newname = "mesecons_extrawires:crossing"
 | 
			
		||||
	if L.a then newname = newname .. "A" end
 | 
			
		||||
	if L.b then newname = newname .. "B" end
 | 
			
		||||
	if L.c then newname = newname .. "C" end
 | 
			
		||||
	if L.d then newname = newname .. "D" end
 | 
			
		||||
	if newname ~= name then
 | 
			
		||||
		minetest.env:add_node(pos, {name = newname})
 | 
			
		||||
	end
 | 
			
		||||
	if L.a ~= vL.a then
 | 
			
		||||
		receptor_set(pos, mesecon:get_rules("mesecons_extrawires:crossingA"), L.a)
 | 
			
		||||
		if not L.a and yc_get_real_portstates(pos).a then
 | 
			
		||||
			--catch signal changing direction while on
 | 
			
		||||
			update_plus(pos, newname)
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
	if L.b ~= vL.b then
 | 
			
		||||
		receptor_set(pos, mesecon:get_rules("mesecons_extrawires:crossingB"), L.b)
 | 
			
		||||
		if not L.b and yc_get_real_portstates(pos).b then
 | 
			
		||||
			update_plus(pos, newname)
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
	if L.c ~= vL.c then
 | 
			
		||||
		receptor_set(pos, mesecon:get_rules("mesecons_extrawires:crossingC"), L.c)
 | 
			
		||||
		if not L.c and yc_get_real_portstates(pos).c then
 | 
			
		||||
			update_plus(pos, newname)
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
	if L.d ~= vL.d then
 | 
			
		||||
		receptor_set(pos, mesecon:get_rules("mesecons_extrawires:crossingD"), L.d)
 | 
			
		||||
		if not L.c and yc_get_real_portstates(pos).d then
 | 
			
		||||
			update_plus(pos, newname)
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
mesecon:register_on_signal_change(function(pos, node)
 | 
			
		||||
	if string.find(node.name, "mesecons_extrawires:crossing")~=nil then
 | 
			
		||||
		update_plus(pos, node.name)
 | 
			
		||||
	end
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
minetest.register_craft({
 | 
			
		||||
	type = "shapeless",
 | 
			
		||||
	output = "mesecons_extrawires:crossing",
 | 
			
		||||
	recipe = {
 | 
			
		||||
		"mesecons_insulated:insulated_off",
 | 
			
		||||
		"mesecons_insulated:insulated_off",
 | 
			
		||||
	},
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_craft({
 | 
			
		||||
	type = "shapeless",
 | 
			
		||||
	output = "mesecons_insulated:insulated_off 2",
 | 
			
		||||
	recipe = {
 | 
			
		||||
		"mesecons_extrawires:crossing",
 | 
			
		||||
	},
 | 
			
		||||
})
 | 
			
		||||
dofile(minetest.get_modpath("mesecons_extrawires").."/crossing.lua");
 | 
			
		||||
dofile(minetest.get_modpath("mesecons_extrawires").."/tjunction.lua");
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										85
									
								
								mesecons_extrawires/tjunction.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								mesecons_extrawires/tjunction.lua
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,85 @@
 | 
			
		||||
local tjunction_nodebox = {
 | 
			
		||||
	type = "fixed",
 | 
			
		||||
	fixed = {{ -16/32-0.001, -17/32, -3/32, 16/32+0.001, -13/32, 3/32 },
 | 
			
		||||
		 { -3/32, -17/32, -16/32+0.001, 3/32, -13/32, -3/32},}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
local tjunction_selectionbox = {
 | 
			
		||||
		type = "fixed",
 | 
			
		||||
		fixed = { -16/32-0.001, -18/32, -16/32, 16/32+0.001, -12/32, 7/32 }
 | 
			
		||||
},
 | 
			
		||||
 | 
			
		||||
minetest.register_node("mesecons_extrawires:tjunction_on", {
 | 
			
		||||
	drawtype = "nodebox",
 | 
			
		||||
	tiles = {
 | 
			
		||||
		"jeija_insulated_wire_sides.png",
 | 
			
		||||
		"jeija_insulated_wire_sides.png",
 | 
			
		||||
		"jeija_insulated_wire_ends_on.png",
 | 
			
		||||
		"jeija_insulated_wire_ends_on.png",
 | 
			
		||||
		"jeija_insulated_wire_sides.png",
 | 
			
		||||
		"jeija_insulated_wire_ends_on.png"
 | 
			
		||||
	},
 | 
			
		||||
	paramtype = "light",
 | 
			
		||||
	paramtype2 = "facedir",
 | 
			
		||||
	walkable = false,
 | 
			
		||||
	sunlight_propagates = true,
 | 
			
		||||
	selection_box = tjunction_selectionbox,
 | 
			
		||||
	node_box = tjunction_nodebox,
 | 
			
		||||
	groups = {dig_immediate = 3, mesecon = 3, mesecon_conductor_craftable=1, not_in_creative_inventory = 1},
 | 
			
		||||
	drop = "mesecons_insulated:insulated_off",
 | 
			
		||||
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_node("mesecons_extrawires:tjunction_off", {
 | 
			
		||||
	drawtype = "nodebox",
 | 
			
		||||
	description = "T-junction",
 | 
			
		||||
	tiles = {
 | 
			
		||||
		"jeija_insulated_wire_sides.png",
 | 
			
		||||
		"jeija_insulated_wire_sides.png",
 | 
			
		||||
		"jeija_insulated_wire_ends_off.png",
 | 
			
		||||
		"jeija_insulated_wire_ends_off.png",
 | 
			
		||||
		"jeija_insulated_wire_sides.png",
 | 
			
		||||
		"jeija_insulated_wire_ends_off.png"
 | 
			
		||||
	},
 | 
			
		||||
	paramtype = "light",
 | 
			
		||||
	paramtype2 = "facedir",
 | 
			
		||||
	walkable = false,
 | 
			
		||||
	sunlight_propagates = true,
 | 
			
		||||
	selection_box = tjunction_selectionbox,
 | 
			
		||||
	node_box = tjunction_nodebox,
 | 
			
		||||
	groups = {dig_immediate = 3, mesecon = 3, mesecon_conductor_craftable=1},
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_craft({
 | 
			
		||||
	output = '"mesecons_extrawires:tjunction_off" 3',
 | 
			
		||||
	recipe = {
 | 
			
		||||
		{"", "", ""},
 | 
			
		||||
		{"mesecons_insulated:insulated_off", "mesecons_insulated:insulated_off", "mesecons_insulated:insulated_off"},
 | 
			
		||||
		{"", "mesecons_insulated:insulated_off", ""},
 | 
			
		||||
	}
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
mesecon:add_rules("tjunction_all", { --all possible rules
 | 
			
		||||
{x = 1,  y = 0,  z = 0},
 | 
			
		||||
{x =-1,  y = 0,  z = 0},
 | 
			
		||||
{x = 0,  y = 0,  z = 1},
 | 
			
		||||
{x = 0,  y = 0,  z =-1},})
 | 
			
		||||
 | 
			
		||||
mesecon:add_rules("tjunction", {
 | 
			
		||||
{x = 1,  y = 0,  z =  0},
 | 
			
		||||
{x =-1,  y = 0,  z =  0},
 | 
			
		||||
{x = 0,  y = 0,  z = -1},})
 | 
			
		||||
 | 
			
		||||
function tjunction_get_rules(param2)
 | 
			
		||||
	local rules = mesecon:get_rules("tjunction")
 | 
			
		||||
	if param2 == 1 then
 | 
			
		||||
		rules = mesecon:rotate_rules_left(mesecon:get_rules("tjunction"))
 | 
			
		||||
	elseif param2 == 2 then
 | 
			
		||||
		rules = mesecon:rotate_rules_right(mesecon:rotate_rules_right(mesecon:get_rules("tjunction")))
 | 
			
		||||
	elseif param2 == 3 then
 | 
			
		||||
		rules = mesecon:rotate_rules_right(mesecon:get_rules("tjunction"))
 | 
			
		||||
	end
 | 
			
		||||
	return rules
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
mesecon:register_conductor("mesecons_extrawires:tjunction_on", "mesecons_extrawires:tjunction_off", mesecon:get_rules("tjunction_all"), tjunction_get_rules)
 | 
			
		||||
		Reference in New Issue
	
	Block a user