summaryrefslogtreecommitdiff
path: root/mesecons_receiver/init.lua
blob: c203102b95e761212a30e4008d6ec8ddfe7c2fbc (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
minetest.register_node("mesecons_receiver:receiver_on", {
	tiles = {"default_wood.png"},
	groups = {dig_immediate = 3, mesecon = 3, not_in_creative_inventory = 1},
	drop = "mesecons:wire_00000000_off",
})

minetest.register_node("mesecons_receiver:receiver_off", {
	description = "You hacker you",
	tiles = {"default_stone.png"},
	groups = {dig_immediate = 3, mesecon = 3},
	drop = "mesecons:wire_00000000_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}})

mesecon:add_rules("mesecon_receiver", {
{x = 1, y = 0, z = 0},
{x = -2, y = 0, z = 0},})

mesecon:add_rules("mesecon_receiver_all", {
{x = 1, y = 0, z = 0},
{x =-2, y = 0, z = 0},
{x =-1, y = 0, z = 0},
{x = 2, y = 0, z = 0},
{x = 0, y = 0, z = 1},
{x = 0, y = 0, z =-2},
{x = 1, y = 0, z =-1},
{x =-2, y = 0, z = 2},})

function receiver_get_rules(param2)
	local rules = mesecon:get_rules("mesecon_receiver")
	if param2 == 2 then
		rules = mesecon:rotate_rules_left(rules)
	elseif param2 == 3 then
		rules = mesecon:rotate_rules_right(mesecon:rotate_rules_right(rules))
	elseif param2 == 0 then
		rules = mesecon:rotate_rules_right(rules)
	end
	return rules
end

mesecon:register_conductor("mesecons_receiver:receiver_on", "mesecons_receiver:receiver_off", mesecon:get_rules("mesecon_receiver_all"), receiver_get_rules)

function mesecon:receiver_get_pos_from_rcpt(pos)
	node = minetest.env:get_node(pos)
	local rules = mesecon:get_rules("receiver_pos")
	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
	np = {
	x = pos.x + rules[1].x,
	y = pos.y + rules[1].y,
	z = pos.z + rules[1].z}
	return np
end

function mesecon:receiver_place(rcpt_pos)
	local node = minetest.env:get_node(rcpt_pos)
	pos = mesecon:receiver_get_pos_from_rcpt(rcpt_pos, node.param2)
	nn = minetest.env:get_node(pos)

	if string.find(nn.name, "mesecons:wire_") ~= nil then
		minetest.env:dig_node(pos)
		minetest.env:add_node(pos, {name = "mesecons_receiver:receiver_off", param2 = node.param2})
		mesecon:update_autoconnect(pos)
	end
end

function mesecon:receiver_remove(rcpt_pos)
	pos = mesecon:receiver_get_pos_from_rcpt(rcpt_pos)
	node = minetest.env:get_node(pos)

	if string.find(node.name, "mesecons_receiver:receiver_") ~=nil then
		minetest.env:dig_node(pos)
		minetest.env:place_node(pos, {name = "mesecons:wire_00000000_off"})
		mesecon:update_autoconnect(pos)
	end
end

minetest.register_on_placenode(function (pos, node)
	if minetest.get_item_group(node.name, "mesecon_needs_receiver") == 1 then
		mesecon:receiver_place(pos)
	end
end)

minetest.register_on_dignode(function(pos, node)
	if minetest.get_item_group(node.name, "mesecon_needs_receiver") == 1 then
		mesecon:receiver_remove(pos)
	end
end)

minetest.register_on_placenode(function (pos, node)
	if string.find(node.name, "mesecons:wire_") ~=nil then
		rules = mesecon:get_rules("receiver_pos_all")
		local i = 1
		while rules[i] ~= nil do
			np = {
			x = pos.x + rules[i].x,
			y = pos.y + rules[i].y,
			z = pos.z + rules[i].z}
			if minetest.get_item_group(minetest.env:get_node(np).name, "mesecon_needs_receiver") == 1 then
				mesecon:receiver_place(np)
			end
			i = i + 1
		end
	end
end)