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,
})
|