summaryrefslogtreecommitdiff
path: root/pairingtool.lua
blob: 7a48f31285023b56202d302d4ffdd16790f53c11 (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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
celevator.pairing = {
	playerstate = {}
}

minetest.register_on_player_receive_fields(function (player,formname,fields)
	if not celevator.pairing.playerstate[player:get_player_name()] then return end
	if not tonumber(fields.floornum) then return end
	if formname == "celevator:pairing_callbutton_floornum" then
		local targetpos = celevator.pairing.playerstate[player:get_player_name()].pos
		local controllerpos = celevator.pairing.playerstate[player:get_player_name()].controllerpos
		if minetest.get_item_group(minetest.get_node(targetpos).name,"_celevator_callbutton") == 1 then
			local nodemeta = minetest.get_meta(targetpos)
			nodemeta:set_string("controllerpos",minetest.pos_to_string(controllerpos))
			local controllermeta = minetest.get_meta(controllerpos)
			local pairings = minetest.deserialize(controllermeta:get_string("callbuttons")) or {}
			local hash = minetest.hash_node_position(targetpos)
			pairings[hash] = math.floor(tonumber(fields.floornum))
			controllermeta:set_string("callbuttons",minetest.serialize(pairings))
			minetest.chat_send_player(player:get_player_name(),"Call button paired to "..minetest.pos_to_string(controllerpos).." as landing "..pairings[hash])
			celevator.pairing.playerstate[player:get_player_name()] = nil
		end
	elseif formname == "celevator:pairing_lantern_floornum" then
		local targetpos = celevator.pairing.playerstate[player:get_player_name()].pos
		local controllerpos = celevator.pairing.playerstate[player:get_player_name()].controllerpos
		if minetest.get_item_group(minetest.get_node(targetpos).name,"_celevator_lantern") == 1 then
			local nodemeta = minetest.get_meta(targetpos)
			nodemeta:set_string("controllerpos",minetest.pos_to_string(controllerpos))
			local controllermeta = minetest.get_meta(controllerpos)
			local pairings = minetest.deserialize(controllermeta:get_string("lanterns")) or {}
			local hash = minetest.hash_node_position(targetpos)
			pairings[hash] = math.floor(tonumber(fields.floornum))
			controllermeta:set_string("lanterns",minetest.serialize(pairings))
			minetest.chat_send_player(player:get_player_name(),"Lantern paired to "..minetest.pos_to_string(controllerpos).." as landing "..pairings[hash])
			celevator.pairing.playerstate[player:get_player_name()] = nil
		end
	end
end)

minetest.register_tool("celevator:pairingtool",{
	description = "Pairing Tool",
	inventory_image = "celevator_pairingtool.png",
	on_use = function(itemstack,player,pointed)
		if not (pointed and pointed.under) then return itemstack end
		if not (player and player:get_player_name()) then return end
		local pos = pointed.under
		local name = player:get_player_name()
		local node = minetest.get_node(pos)
		if not node then return itemstack end
		if celevator.controller.iscontroller(pos) then
			local stackmeta = itemstack:get_meta()
			stackmeta:set_string("controllerpos",minetest.pos_to_string(pos))
			minetest.chat_send_player(name,"Now pairing with controller at "..minetest.pos_to_string(pos))
		elseif minetest.get_item_group(node.name,"_celevator_drive") == 1 then
			local stackmeta = itemstack:get_meta()
			stackmeta:set_string("drivepos",minetest.pos_to_string(pos))
			minetest.chat_send_player(name,"Now pairing with drive at "..minetest.pos_to_string(pos))
		elseif minetest.get_item_group(node.name,"_celevator_machine") == 1 then
			local stackmeta = itemstack:get_meta()
			local nodemeta = minetest.get_meta(pos)
			local oldpairing = minetest.string_to_pos(nodemeta:get_string("drivepos"))
			local drivepos = minetest.string_to_pos(stackmeta:get_string("drivepos"))
			local origin = minetest.string_to_pos(nodemeta:get_string("origin"))
			if not origin then
				minetest.chat_send_player(name,"Car has not been located! Try punching the machine to search for one.")
			elseif not drivepos then
				minetest.chat_send_player(name,"Nothing has been selected to pair with! Punch a drive first.")
			elseif oldpairing then
				local drivemeta = minetest.get_meta(oldpairing)
				drivemeta:set_string("machinepos","")
				drivemeta:set_string("apos","0")
				drivemeta:set_string("dpos","0")
				drivemeta:set_string("vel","0")
				drivemeta:set_string("maxvel","0.2")
				drivemeta:set_string("state","uninit")
				drivemeta:set_string("startpos","0")
				drivemeta:set_string("origin",minetest.pos_to_string(origin))
				nodemeta:set_string("drivepos","")
				minetest.chat_send_player(player:get_player_name(),"Unpaired from "..minetest.pos_to_string(oldpairing))
			elseif minetest.get_item_group(minetest.get_node(drivepos).name,"_celevator_drive") ~= 1 then
				minetest.chat_send_player(name,"Drive has been removed. Punch a new drive to pair to that one.")
			else
				if minetest.is_protected(drivepos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
					minetest.chat_send_player(name,"Unable to pair - drive at "..minetest.pos_to_string(drivepos).." is protected!")
					minetest.record_protection_violation(drivepos,name)
				elseif minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
					minetest.chat_send_player(name,"Unable to pair - item to be paired is protected!")
					minetest.record_protection_violation(pos,name)
				else
					local drivemeta = minetest.get_meta(drivepos)
					nodemeta:set_string("drivepos",minetest.pos_to_string(drivepos))
					drivemeta:set_string("machinepos",minetest.pos_to_string(pos))
					drivemeta:set_string("state","stopped")
					minetest.chat_send_player(player:get_player_name(),"Machine paired to "..minetest.pos_to_string(drivepos))
				end
			end
		elseif minetest.get_item_group(node.name,"_celevator_callbutton") == 1 then
			local stackmeta = itemstack:get_meta()
			local nodemeta = minetest.get_meta(pos)
			local oldpairing = minetest.string_to_pos(nodemeta:get_string("controllerpos"))
			local controllerpos = minetest.string_to_pos(stackmeta:get_string("controllerpos"))
			if not controllerpos then
				minetest.chat_send_player(name,"Nothing has been selected to pair with! Punch a controller or dispatcher first.")
			elseif oldpairing then
				local controllermeta = minetest.get_meta(oldpairing)
				local pairings = minetest.deserialize(controllermeta:get_string("callbuttons"))
				if pairings then
					local hash = minetest.hash_node_position(pos)
					pairings[hash] = nil
					controllermeta:set_string("callbuttons",minetest.serialize(pairings))
				end
				nodemeta:set_string("controllerpos","")
				minetest.chat_send_player(player:get_player_name(),"Unpaired from "..minetest.pos_to_string(oldpairing))
			elseif celevator.controller.iscontroller(controllerpos) then
				if minetest.is_protected(controllerpos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
					minetest.chat_send_player(name,"Unable to pair - controller at "..minetest.pos_to_string(controllerpos).." is protected!")
					minetest.record_protection_violation(controllerpos,name)
				elseif minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
					minetest.chat_send_player(name,"Unable to pair - item to be paired is protected!")
					minetest.record_protection_violation(pos,name)
				else
					celevator.pairing.playerstate[name] = {
						pos = pos,
						controllerpos = controllerpos,
					}
					minetest.show_formspec(name,"celevator:pairing_callbutton_floornum","field[floornum;Landing Number;1]")
				end
			else
				minetest.chat_send_player(name,"Controller or dispatcher has been removed. Punch a new controller or dispatcher to pair to that one.")
			end
		elseif minetest.get_item_group(node.name,"_celevator_pi") or minetest.get_item_group(node.name,"_celevator_lantern") == 1 then
			local stackmeta = itemstack:get_meta()
			local nodemeta = minetest.get_meta(pos)
			local oldpairing = minetest.string_to_pos(nodemeta:get_string("controllerpos"))
			local controllerpos = minetest.string_to_pos(stackmeta:get_string("controllerpos"))
			if not controllerpos then
				minetest.chat_send_player(name,"Nothing has been selected to pair with! Punch a controller or dispatcher first.")
			elseif oldpairing then
				local controllermeta = minetest.get_meta(oldpairing)
				local pairings = minetest.deserialize(controllermeta:get_string("pis"))
				if pairings then
					local hash = minetest.hash_node_position(pos)
					pairings[hash] = nil
					controllermeta:set_string("pis",minetest.serialize(pairings))
				end
				nodemeta:set_string("controllerpos","")
				nodemeta:set_int("uparrow",0)
				nodemeta:set_int("downarrow",0)
				nodemeta:set_int("flash_fs",0)
				nodemeta:set_int("flash_is",0)
				nodemeta:set_string("text","")
				celevator.pi.updatedisplay(pos)
				minetest.chat_send_player(player:get_player_name(),"Unpaired from "..minetest.pos_to_string(oldpairing))
			elseif celevator.controller.iscontroller(controllerpos) then
				if minetest.is_protected(controllerpos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
					minetest.chat_send_player(name,"Unable to pair - controller at "..minetest.pos_to_string(controllerpos).." is protected!")
					minetest.record_protection_violation(controllerpos,name)
				elseif minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
					minetest.chat_send_player(name,"Unable to pair - item to be paired is protected!")
					minetest.record_protection_violation(pos,name)
				else
					if minetest.get_item_group(node.name,"_celevator_pi") == 1 then
						local controllermeta = minetest.get_meta(controllerpos)
						nodemeta:set_string("controllerpos",minetest.pos_to_string(controllerpos))
						local pairings = minetest.deserialize(controllermeta:get_string("pis")) or {}
						local hash = minetest.hash_node_position(pos)
						pairings[hash] = true
						controllermeta:set_string("pis",minetest.serialize(pairings))
						minetest.chat_send_player(player:get_player_name(),"PI paired to "..minetest.pos_to_string(controllerpos))
					end
					if minetest.get_item_group(node.name,"_celevator_lantern") == 1 then
						celevator.pairing.playerstate[name] = {
							pos = pos,
							controllerpos = controllerpos,
						}
						minetest.show_formspec(name,"celevator:pairing_lantern_floornum","field[floornum;Landing Number;1]")
					end
				end
			else
				minetest.chat_send_player(name,"Controller or dispatcher has been removed. Punch a new controller or dispatcher to pair to that one.")
			end
		end
		return itemstack
	end,
})