summaryrefslogtreecommitdiff
path: root/mesecons_extrawires/crossing.lua
blob: 9ceb9acdc3690752a639fffe228047a2c3050831 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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",
	},
})