summaryrefslogtreecommitdiff
path: root/pairingtool.lua
blob: 0b00a38fa232cbb3dbef1b2d17932b0d232b7199 (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
celevator.pairing = {
	playerstate = {}
}

minetest.register_on_player_receive_fields(function (player,formname,fields)
	if formname ~= "celevator:pairing_floornum" then return end
	if not celevator.pairing.playerstate[player:get_player_name()] then return end
	if not tonumber(fields.floornum) then return end
	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(),"Paired to "..minetest.pos_to_string(controllerpos).." as landing "..pairings[hash])
		celevator.pairing.playerstate[player:get_player_name()] = nil
	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_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_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") 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
					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(),"Paired to "..minetest.pos_to_string(controllerpos))
				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,
})