]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/gamec/urrebot_load.c
Made the Urrebot navigation optimization a cvar, for easier testing in the future...
[divverent/nexuiz.git] / data / qcsrc / server / gamec / urrebot_load.c
1 /* --- UrreBotSetup ---\r
2 Issues a random funky name, random colors, playermodel and team to the bot*/\r
3 \r
4 void() UrreBotSetup =\r
5 {\r
6         local float r, shirt, pants;\r
7         local string s;\r
8 \r
9         r = random()*18;\r
10         if (r <= 1)\r
11                 s = "GrooveMachine";\r
12         else if (r <= 2)\r
13                 s = "Worm";\r
14         else if (r <= 3)\r
15                 s = "ClownLock";\r
16         else if (r <= 4)\r
17                 s = "DiscO";\r
18         else if (r <= 5)\r
19                 s = "FunkyFresh";\r
20         else if (r <= 6)\r
21                 s = "DanceWithMe";\r
22         else if (r <= 7)\r
23                 s = "BodyJiggle";\r
24         else if (r <= 8)\r
25                 s = "CantSwim";\r
26         else if (r <= 9)\r
27                 s = "AtomicDog";\r
28         else if (r <= 10)\r
29                 s = "Follower";\r
30         else if (r <= 11)\r
31                 s = "BrassMonkey";\r
32         else if (r <= 12)\r
33                 s = "SirNose";\r
34         else if (r <= 13)\r
35                 s = "StarChild";\r
36         else if (r <= 14)\r
37                 s = "GeorgeC";\r
38         else if (r <= 15)\r
39                 s = "Bootsy";\r
40         else if (r <= 16)\r
41                 s = "Flashlight";\r
42         else if (r <= 17)\r
43                 s = "Bodysnatcher";\r
44         else\r
45                 s = "Boogieboy";\r
46 \r
47         self.netname = s;\r
48 \r
49         r = random()*15;\r
50         if (r <= 1)\r
51         {\r
52                 self.playermodel = "models/player/carni.zym";\r
53                 if (random() < 0.5)\r
54                         self.playerskin = "0";\r
55                 else\r
56                         self.playerskin = "1";\r
57         }\r
58         else if (r <= 2)\r
59         {\r
60                 self.playermodel = "models/player/crash.zym";\r
61                 self.playerskin = "0";\r
62         }\r
63         else if (r <= 3)\r
64         {\r
65                 self.playermodel = "models/player/grunt.zym";\r
66                 self.playerskin = "0";\r
67         }\r
68         else if (r <= 4)\r
69         {\r
70                 self.playermodel = "models/player/headhunter.zym";\r
71                 self.playerskin = "0";\r
72         }\r
73         else if (r <= 5)\r
74         {\r
75                 self.playermodel = "models/player/insurrectionist.zym";\r
76                 self.playerskin = "0";\r
77         }\r
78         else if (r <= 6)\r
79         {\r
80                 self.playermodel = "models/player/jeandarc.zym";\r
81                 self.playerskin = "0";\r
82         }\r
83         else if (r <= 7)\r
84         {\r
85                 self.playermodel = "models/player/lurk.zym";\r
86                 if (random() < 0.5)\r
87                         self.playerskin = "0";\r
88                 else\r
89                         self.playerskin = "1";\r
90         }\r
91         else if (r <= 8)\r
92         {\r
93                 self.playermodel = "models/player/lycanthrope.zym";\r
94                 self.playerskin = "0";\r
95         }\r
96         else if (r <= 9)\r
97         {\r
98                 self.playermodel = "models/player/marine.zym";\r
99                 self.playerskin = "0";\r
100         }\r
101         else if (r <= 10)\r
102         {\r
103                 self.playermodel = "models/player/nexus.zym";\r
104                 if (random() < 0.5)\r
105                         self.playerskin = "0";\r
106                 else\r
107                         self.playerskin = "1";\r
108         }\r
109         else if (r <= 11)\r
110         {\r
111                 self.playermodel = "models/player/pyria.zym";\r
112                 self.playerskin = "0";\r
113         }\r
114         else if (r <= 12)\r
115         {\r
116                 self.playermodel = "models/player/shock.zym";\r
117                 self.playerskin = "0";\r
118         }\r
119         else if (r <= 13)\r
120         {\r
121                 self.playermodel = "models/player/skadi.zym";\r
122                 self.playerskin = "0";\r
123         }\r
124         else if (r <= 14)\r
125         {\r
126                 self.playermodel = "models/player/specop.zym";\r
127                 self.playerskin = "0";\r
128         }\r
129         else\r
130         {\r
131                 self.playermodel = "models/player/visitant.zym";\r
132                 self.playerskin = "0";\r
133         }\r
134 \r
135         if (teamplay)\r
136                 JoinBestTeam(self, 0);\r
137         else\r
138         {\r
139                 shirt = floor(random()*15);\r
140                 pants = floor(random()*15);\r
141                 self.clientcolors = pants + shirt * 16;\r
142         }\r
143 };\r
144 \r
145 /* --- UrreBotAdd ---\r
146 Adds an UrreBot to the server*/\r
147 \r
148 entity(float bottype) UrreBotAdd =\r
149 {\r
150         local float shirt, pants;\r
151         local entity ent, ret;\r
152 \r
153         ent = self;\r
154         self = spawnclient();\r
155         if (!self)\r
156         {\r
157                 bprint("Can not add UrreBot, server full\n");\r
158                 if (bottype == BOT_TYPE_URREBOT)\r
159                         cvar_set("urrebots", ftos(urrebots));\r
160                 else\r
161                         cvar_set("bot_number", ftos(bot_number));\r
162                 self = ent;\r
163                 return world;\r
164         }\r
165         // UrreBotSetup();\r
166         // Requested by Vermeulen\r
167         self.netname = PickARandomName();\r
168         if (teamplay)\r
169                 JoinBestTeam(self, 0);\r
170         else\r
171         {\r
172                 shirt = floor(random()*15);\r
173                 pants = floor(random()*15);\r
174                 self.clientcolors = pants + shirt * 16;\r
175         }\r
176         self.list = urrebot_chain;\r
177         urrebot_chain = self;\r
178         ClientConnect();\r
179         PutClientInServer();\r
180         ret = self;\r
181         self = ent;\r
182 \r
183         strategytoken = urrebot_chain;\r
184 \r
185         return ret;\r
186 };\r
187 \r
188 /* --- UrreBotRemove ---\r
189 removes an UrreBot from the server*/\r
190 \r
191 void() UrreBotRemove =\r
192 {\r
193         local entity ent, t;\r
194 \r
195         ent = findchainflags(flags, FL_CLIENT);\r
196         while (ent)\r
197         {\r
198                 if (clienttype(ent) == CLIENTTYPE_BOT)\r
199                 {\r
200                         if (ent.bot_type == BOT_TYPE_URREBOT)\r
201                         {\r
202                                 if (urrebot_chain == self)\r
203                                         urrebot_chain = self.list;\r
204                                 else\r
205                                 {\r
206                                         t = find(world, classname, "player");\r
207                                         while(t)\r
208                                         {\r
209                                                 if (t.list == ent)\r
210                                                         t.list = ent.list;\r
211                                                 t = find(t, classname, "player");\r
212                                         }\r
213                                 }\r
214                                 if (urrebots > 0)\r
215                                         urrebots -= 1;\r
216                                 self = ent;\r
217                                 ClientDisconnect();\r
218                                 dropclient(ent);\r
219                         }\r
220                 }\r
221                 ent = ent.chain;\r
222         }\r
223 };\r
224 \r
225 /* --- SpawnNavNode ---\r
226 The one to guess what this does gets free bacon from FrikaC*/\r
227 \r
228 entity(vector org, vector nnmins, vector nnmaxs) SpawnNavNode =\r
229 {\r
230         newmis = spawn();\r
231         setsize(newmis, nnmins, nnmaxs);\r
232         newmis.classname = "navnode";\r
233         setorigin(newmis, org);\r
234         return newmis;\r
235 };\r
236 \r
237 /* --- AddPlane ---\r
238 Adds a plane to the plane list of a navnode*/\r
239 \r
240 void(entity navn, vector normal, float dist) AddPlane =\r
241 {\r
242         local float f;\r
243 \r
244         newmis = spawn();\r
245         newmis.classname = "plane";\r
246         newmis.list = navn.plane_chain;\r
247         navn.plane_chain = newmis;\r
248         newmis.mangle = normal*-1;\r
249         newmis.delay = dist;\r
250         f = (navn.origin * newmis.mangle) - ((navn.origin + (newmis.delay * newmis.mangle)) * newmis.mangle);\r
251         if (f > 0)\r
252         {\r
253                 newmis.mangle = newmis.mangle*-1;\r
254                 newmis.delay = newmis.delay*-1;\r
255         }\r
256 };\r
257 \r
258 /* --- SpawnOptPoint ---\r
259 This function spawns waypoints for the most used paths between navnodes as an\r
260 optimisation*/\r
261 \r
262 void(entity navn, entity l1, entity l2) SpawnOptPoint =\r
263 {\r
264         local float upd;\r
265         local vector point;\r
266         local entity oldself;\r
267         local entity l, upd_pt;\r
268 \r
269         newmis = spawn();\r
270         setsize (newmis, PL_MIN, PL_MAX);\r
271         oldself = self;\r
272         self = newmis;\r
273         point = ClampPointToSpace(ClampPointToSpace(l2.origin, l2, navn), l1, navn);\r
274         self = oldself;\r
275         upd = FALSE;\r
276         l = navn.optp_chain;\r
277         while (l)\r
278         {\r
279                 if (point == l.origin)\r
280                 {\r
281                         upd = TRUE;\r
282                         upd_pt = l;\r
283                         l = world;\r
284                 }\r
285                 else\r
286                         l = l.list;\r
287         }\r
288 \r
289         if (upd)\r
290         {\r
291                 if (upd_pt.link0 != l1)\r
292                 if (upd_pt.link1 != l1)\r
293                 if (upd_pt.link2 != l1)\r
294                 if (upd_pt.link3 != l1)\r
295                 if (upd_pt.link4 != l1)\r
296                 if (upd_pt.link5 != l1)\r
297                 if (upd_pt.link6 != l1)\r
298                 if (upd_pt.link7 != l1)\r
299                 if (upd_pt.link8 != l1)\r
300                 if (upd_pt.link9 != l1)\r
301                 {\r
302                         if (!upd_pt.link0)\r
303                                 upd_pt.link0 = l1;\r
304                         else if (!upd_pt.link1)\r
305                                 upd_pt.link1 = l1;\r
306                         else if (!upd_pt.link2)\r
307                                 upd_pt.link2 = l1;\r
308                         else if (!upd_pt.link3)\r
309                                 upd_pt.link3 = l1;\r
310                         else if (!upd_pt.link4)\r
311                                 upd_pt.link4 = l1;\r
312                         else if (!upd_pt.link5)\r
313                                 upd_pt.link5 = l1;\r
314                         else if (!upd_pt.link6)\r
315                                 upd_pt.link6 = l1;\r
316                         else if (!upd_pt.link7)\r
317                                 upd_pt.link7 = l1;\r
318                         else if (!upd_pt.link8)\r
319                                 upd_pt.link8 = l1;\r
320                         else if (!upd_pt.link9)\r
321                                 upd_pt.link9 = l1;\r
322                 }\r
323                 upd = FALSE;\r
324                 if (upd_pt.link10 != l2)\r
325                 if (upd_pt.link11 != l2)\r
326                 if (upd_pt.link12 != l2)\r
327                 if (upd_pt.link13 != l2)\r
328                 if (upd_pt.link14 != l2)\r
329                 if (upd_pt.link15 != l2)\r
330                 if (upd_pt.link16 != l2)\r
331                 if (upd_pt.link17 != l2)\r
332                 if (upd_pt.link18 != l2)\r
333                 if (upd_pt.link19 != l2)\r
334                 {\r
335                         if (!upd_pt.link10)\r
336                         {\r
337                                 upd_pt.link10 = l2;\r
338                                 upd = TRUE;\r
339                         }\r
340                         else if (!upd_pt.link11)\r
341                         {\r
342                                 upd_pt.link11 = l2;\r
343                                 upd = TRUE;\r
344                         }\r
345                         else if (!upd_pt.link12)\r
346                         {\r
347                                 upd_pt.link12 = l2;\r
348                                 upd = TRUE;\r
349                         }\r
350                         else if (!upd_pt.link13)\r
351                         {\r
352                                 upd_pt.link13 = l2;\r
353                                 upd = TRUE;\r
354                         }\r
355                         else if (!upd_pt.link14)\r
356                         {\r
357                                 upd_pt.link14 = l2;\r
358                                 upd = TRUE;\r
359                         }\r
360                         else if (!upd_pt.link15)\r
361                         {\r
362                                 upd_pt.link15 = l2;\r
363                                 upd = TRUE;\r
364                         }\r
365                         else if (!upd_pt.link16)\r
366                         {\r
367                                 upd_pt.link16 = l2;\r
368                                 upd = TRUE;\r
369                         }\r
370                         else if (!upd_pt.link17)\r
371                         {\r
372                                 upd_pt.link17 = l2;\r
373                                 upd = TRUE;\r
374                         }\r
375                         else if (!upd_pt.link18)\r
376                         {\r
377                                 upd_pt.link18 = l2;\r
378                                 upd = TRUE;\r
379                         }\r
380                         else if (!upd_pt.link19)\r
381                         {\r
382                                 upd_pt.link19 = l2;\r
383                                 upd = TRUE;\r
384                         }\r
385                 }\r
386         }\r
387 \r
388         if (!upd)\r
389         {\r
390                 newmis.classname = "optpoint";\r
391                 newmis.list = navn.optp_chain;\r
392                 navn.optp_chain = newmis;\r
393                 setorigin(newmis, point);\r
394                 newmis.link0 = l1;\r
395                 newmis.link10 = l2;\r
396         }\r
397         else\r
398                 remove(newmis);\r
399 };\r
400 \r
401 void() OptimiseNavigation =\r
402 {\r
403         local entity navn, l;\r
404 \r
405         navn = navnode_chain;\r
406         while (navn)\r
407         {\r
408                 l = navn.optp_chain;\r
409                 while (l)\r
410                 {\r
411                         l.think = SUB_Remove;\r
412                         l.nextthink = time;\r
413                         SpawnOptPoint(navn, l.enemy, navn);\r
414                         if (navn.link0 != l.enemy)\r
415                         if (!(navn.lflags0 & LF_NOWALK))\r
416                         if (!(navn.lflags0 & LF_NOLINK))\r
417                                 SpawnOptPoint(navn, l.enemy, navn.link0);\r
418                         if (navn.link1)\r
419                         {\r
420                                 if (navn.link1 != l.enemy)\r
421                                 if (!(navn.lflags1 & LF_NOWALK))\r
422                                 if (!(navn.lflags1 & LF_NOLINK))\r
423                                         SpawnOptPoint(navn, l.enemy, navn.link1);\r
424                                 if (navn.link2)\r
425                                 {\r
426                                         if (navn.link2 != l.enemy)\r
427                                         if (!(navn.lflags2 & LF_NOWALK))\r
428                                         if (!(navn.lflags2 & LF_NOLINK))\r
429                                                 SpawnOptPoint(navn, l.enemy, navn.link2);\r
430                                         if (navn.link3)\r
431                                         {\r
432                                                 if (navn.link3 != l.enemy)\r
433                                                 if (!(navn.lflags3 & LF_NOWALK))\r
434                                                 if (!(navn.lflags3 & LF_NOLINK))\r
435                                                         SpawnOptPoint(navn, l.enemy, navn.link3);\r
436                                                 if (navn.link4)\r
437                                                 {\r
438                                                         if (navn.link4 != l.enemy)\r
439                                                         if (!(navn.lflags4 & LF_NOWALK))\r
440                                                         if (!(navn.lflags4 & LF_NOLINK))\r
441                                                                 SpawnOptPoint(navn, l.enemy, navn.link4);\r
442                                                         if (navn.link5)\r
443                                                         {\r
444                                                                 if (navn.link5 != l.enemy)\r
445                                                                 if (!(navn.lflags5 & LF_NOWALK))\r
446                                                                 if (!(navn.lflags5 & LF_NOLINK))\r
447                                                                         SpawnOptPoint(navn, l.enemy, navn.link5);\r
448                                                                 if (navn.link6)\r
449                                                                 {\r
450                                                                         if (navn.link6 != l.enemy)\r
451                                                                         if (!(navn.lflags6 & LF_NOWALK))\r
452                                                                         if (!(navn.lflags6 & LF_NOLINK))\r
453                                                                                 SpawnOptPoint(navn, l.enemy, navn.link6);\r
454                                                                         if (navn.link7)\r
455                                                                         {\r
456                                                                                 if (navn.link7 != l.enemy)\r
457                                                                                 if (!(navn.lflags7 & LF_NOWALK))\r
458                                                                                 if (!(navn.lflags7 & LF_NOLINK))\r
459                                                                                         SpawnOptPoint(navn, l.enemy, navn.link7);\r
460                                                                                 if (navn.link8)\r
461                                                                                 {\r
462                                                                                         if (navn.link8 != l.enemy)\r
463                                                                                         if (!(navn.lflags8 & LF_NOWALK))\r
464                                                                                         if (!(navn.lflags8 & LF_NOLINK))\r
465                                                                                                 SpawnOptPoint(navn, l.enemy, navn.link8);\r
466                                                                                         if (navn.link9)\r
467                                                                                         {\r
468                                                                                                 if (navn.link9 != l.enemy)\r
469                                                                                                 if (!(navn.lflags9 & LF_NOWALK))\r
470                                                                                                 if (!(navn.lflags9 & LF_NOLINK))\r
471                                                                                                         SpawnOptPoint(navn, l.enemy, navn.link9);\r
472                                                                                                 if (navn.link10)\r
473                                                                                                 {\r
474                                                                                                         if (navn.link10 != l.enemy)\r
475                                                                                                         if (!(navn.lflags10 & LF_NOWALK))\r
476                                                                                                         if (!(navn.lflags10 & LF_NOLINK))\r
477                                                                                                                 SpawnOptPoint(navn, l.enemy, navn.link10);\r
478                                                                                                         if (navn.link11)\r
479                                                                                                         {\r
480                                                                                                                 if (navn.link11 != l.enemy)\r
481                                                                                                                 if (!(navn.lflags11 & LF_NOWALK))\r
482                                                                                                                 if (!(navn.lflags11 & LF_NOLINK))\r
483                                                                                                                         SpawnOptPoint(navn, l.enemy, navn.link11);\r
484                                                                                                                 if (navn.link12)\r
485                                                                                                                 {\r
486                                                                                                                         if (navn.link12 != l.enemy)\r
487                                                                                                                         if (!(navn.lflags12 & LF_NOWALK))\r
488                                                                                                                         if (!(navn.lflags12 & LF_NOLINK))\r
489                                                                                                                                 SpawnOptPoint(navn, l.enemy, navn.link12);\r
490                                                                                                                         if (navn.link13)\r
491                                                                                                                         {\r
492                                                                                                                                 if (navn.link13 != l.enemy)\r
493                                                                                                                                 if (!(navn.lflags13 & LF_NOWALK))\r
494                                                                                                                                 if (!(navn.lflags13 & LF_NOLINK))\r
495                                                                                                                                         SpawnOptPoint(navn, l.enemy, navn.link13);\r
496                                                                                                                                 if (navn.link14)\r
497                                                                                                                                 {\r
498                                                                                                                                         if (navn.link14 != l.enemy)\r
499                                                                                                                                         if (!(navn.lflags14 & LF_NOWALK))\r
500                                                                                                                                         if (!(navn.lflags14 & LF_NOLINK))\r
501                                                                                                                                                 SpawnOptPoint(navn, l.enemy, navn.link14);\r
502                                                                                                                                         if (navn.link15)\r
503                                                                                                                                         {\r
504                                                                                                                                                 if (navn.link15 != l.enemy)\r
505                                                                                                                                                 if (!(navn.lflags15 & LF_NOWALK))\r
506                                                                                                                                                 if (!(navn.lflags15 & LF_NOLINK))\r
507                                                                                                                                                         SpawnOptPoint(navn, l.enemy, navn.link15);\r
508                                                                                                                                                 if (navn.link16)\r
509                                                                                                                                                 {\r
510                                                                                                                                                         if (navn.link16 != l.enemy)\r
511                                                                                                                                                         if (!(navn.lflags16 & LF_NOWALK))\r
512                                                                                                                                                         if (!(navn.lflags16 & LF_NOLINK))\r
513                                                                                                                                                                 SpawnOptPoint(navn, l.enemy, navn.link16);\r
514                                                                                                                                                         if (navn.link17)\r
515                                                                                                                                                         {\r
516                                                                                                                                                                 if (navn.link17 != l.enemy)\r
517                                                                                                                                                                 if (!(navn.lflags17 & LF_NOWALK))\r
518                                                                                                                                                                 if (!(navn.lflags17 & LF_NOLINK))\r
519                                                                                                                                                                         SpawnOptPoint(navn, l.enemy, navn.link17);\r
520                                                                                                                                                                 if (navn.link18)\r
521                                                                                                                                                                 {\r
522                                                                                                                                                                         if (navn.link18 != l.enemy)\r
523                                                                                                                                                                         if (!(navn.lflags18 & LF_NOWALK))\r
524                                                                                                                                                                         if (!(navn.lflags18 & LF_NOLINK))\r
525                                                                                                                                                                                 SpawnOptPoint(navn, l.enemy, navn.link18);\r
526                                                                                                                                                                         if (navn.link19)\r
527                                                                                                                                                                         if (navn.link19 != l.enemy)\r
528                                                                                                                                                                         if (!(navn.lflags19 & LF_NOWALK))\r
529                                                                                                                                                                         if (!(navn.lflags19 & LF_NOLINK))\r
530                                                                                                                                                                                 SpawnOptPoint(navn, l.enemy, navn.link19);\r
531                                                                                                                                                                 }\r
532                                                                                                                                                         }\r
533                                                                                                                                                 }\r
534                                                                                                                                         }\r
535                                                                                                                                 }\r
536                                                                                                                         }\r
537                                                                                                                 }\r
538                                                                                                         }\r
539                                                                                                 }\r
540                                                                                         }\r
541                                                                                 }\r
542                                                                         }\r
543                                                                 }\r
544                                                         }\r
545                                                 }\r
546                                         }\r
547                                 }\r
548                         }\r
549                         l = l.list;\r
550                 }\r
551                 navn = navn.list;\r
552         }\r
553 };\r
554 \r
555 void(entity navn, entity linked) SpawnOptController =\r
556 {\r
557         newmis = spawn();\r
558         newmis.classname = "optcontroller";\r
559         newmis.list = navn.optp_chain;\r
560         navn.optp_chain = newmis;\r
561         newmis.enemy = linked;\r
562 };\r
563 \r
564 /* --- LinkNavNodes ---\r
565 Links the navnodes and gives some special attributes (like doors, teleporters)*/\r
566 \r
567 void() LinkNavNodes =\r
568 {\r
569         local entity e, t, tdest;\r
570 \r
571         navnode_chain = world;\r
572         navnodes = 0;\r
573 \r
574         e = findchain(classname, "navnode");\r
575         while (e)\r
576         {\r
577                 e.list = navnode_chain;\r
578                 navnode_chain = e;\r
579                 e.delay = navnodes;\r
580                 navnodes = navnodes + 1;\r
581                 e = e.chain;\r
582         }\r
583 \r
584         e = navnode_chain;\r
585         while (e)\r
586         {\r
587                 if (e.link0)\r
588                 {\r
589                         e.link0.think = SUB_Remove;\r
590                         e.link0.nextthink = time;\r
591                         t = navnode_chain;\r
592                         while (t)\r
593                         {\r
594                                 if (t.delay == e.link0.delay)\r
595                                         e.link0 = t;\r
596                                 t = t.list;\r
597                         }\r
598                         e.lflags0 = e.lflags0 | LF_REMOTE;\r
599                 }\r
600                 if (e.link1)\r
601                 {\r
602                         e.link1.think = SUB_Remove;\r
603                         e.link1.nextthink = time;\r
604                         t = navnode_chain;\r
605                         while (t)\r
606                         {\r
607                                 if (t.delay == e.link1.delay)\r
608                                         e.link1 = t;\r
609                                 t = t.list;\r
610                         }\r
611                         e.lflags1 = e.lflags1 | LF_REMOTE;\r
612                 }\r
613                 if (e.link2)\r
614                 {\r
615                         e.link2.think = SUB_Remove;\r
616                         e.link2.nextthink = time;\r
617                         t = navnode_chain;\r
618                         while (t)\r
619                         {\r
620                                 if (t.delay == e.link2.delay)\r
621                                         e.link2 = t;\r
622                                 t = t.list;\r
623                         }\r
624                         e.lflags2 = e.lflags2 | LF_REMOTE;\r
625                 }\r
626                 if (e.link3)\r
627                 {\r
628                         e.link3.think = SUB_Remove;\r
629                         e.link3.nextthink = time;\r
630                         t = navnode_chain;\r
631                         while (t)\r
632                         {\r
633                                 if (t.delay == e.link3.delay)\r
634                                         e.link3 = t;\r
635                                 t = t.list;\r
636                         }\r
637                         e.lflags3 = e.lflags3 | LF_REMOTE;\r
638                 }\r
639                 if (e.link4)\r
640                 {\r
641                         e.link4.think = SUB_Remove;\r
642                         e.link4.nextthink = time;\r
643                         t = navnode_chain;\r
644                         while (t)\r
645                         {\r
646                                 if (t.delay == e.link4.delay)\r
647                                         e.link4 = t;\r
648                                 t = t.list;\r
649                         }\r
650                         e.lflags4 = e.lflags4 | LF_REMOTE;\r
651                 }\r
652                 if (e.link5)\r
653                 {\r
654                         e.link5.think = SUB_Remove;\r
655                         e.link5.nextthink = time;\r
656                         t = navnode_chain;\r
657                         while (t)\r
658                         {\r
659                                 if (t.delay == e.link5.delay)\r
660                                         e.link5 = t;\r
661                                 t = t.list;\r
662                         }\r
663                         e.lflags5 = e.lflags5 | LF_REMOTE;\r
664                 }\r
665                 if (e.link6)\r
666                 {\r
667                         e.link6.think = SUB_Remove;\r
668                         e.link6.nextthink = time;\r
669                         t = navnode_chain;\r
670                         while (t)\r
671                         {\r
672                                 if (t.delay == e.link6.delay)\r
673                                         e.link6 = t;\r
674                                 t = t.list;\r
675                         }\r
676                         e.lflags6 = e.lflags6 | LF_REMOTE;\r
677                 }\r
678                 if (e.link7)\r
679                 {\r
680                         e.link7.think = SUB_Remove;\r
681                         e.link7.nextthink = time;\r
682                         t = navnode_chain;\r
683                         while (t)\r
684                         {\r
685                                 if (t.delay == e.link7.delay)\r
686                                         e.link7 = t;\r
687                                 t = t.list;\r
688                         }\r
689                         e.lflags7 = e.lflags7 | LF_REMOTE;\r
690                 }\r
691                 if (e.link8)\r
692                 {\r
693                         e.link8.think = SUB_Remove;\r
694                         e.link8.nextthink = time;\r
695                         t = navnode_chain;\r
696                         while (t)\r
697                         {\r
698                                 if (t.delay == e.link8.delay)\r
699                                         e.link8 = t;\r
700                                 t = t.list;\r
701                         }\r
702                         e.lflags8 = e.lflags8 | LF_REMOTE;\r
703                 }\r
704                 if (e.link9)\r
705                 {\r
706                         e.link9.think = SUB_Remove;\r
707                         e.link9.nextthink = time;\r
708                         t = navnode_chain;\r
709                         while (t)\r
710                         {\r
711                                 if (t.delay == e.link9.delay)\r
712                                         e.link9 = t;\r
713                                 t = t.list;\r
714                         }\r
715                         e.lflags9 = e.lflags9 | LF_REMOTE;\r
716                 }\r
717                 if (e.link10)\r
718                 {\r
719                         e.link10.think = SUB_Remove;\r
720                         e.link10.nextthink = time;\r
721                         t = navnode_chain;\r
722                         while (t)\r
723                         {\r
724                                 if (t.delay == e.link10.delay)\r
725                                         e.link10 = t;\r
726                                 t = t.list;\r
727                         }\r
728                         e.lflags10 = e.lflags10 | LF_REMOTE;\r
729                 }\r
730                 if (e.link11)\r
731                 {\r
732                         e.link11.think = SUB_Remove;\r
733                         e.link11.nextthink = time;\r
734                         t = navnode_chain;\r
735                         while (t)\r
736                         {\r
737                                 if (t.delay == e.link11.delay)\r
738                                         e.link11 = t;\r
739                                 t = t.list;\r
740                         }\r
741                         e.lflags11 = e.lflags11 | LF_REMOTE;\r
742                 }\r
743                 if (e.link12)\r
744                 {\r
745                         e.link12.think = SUB_Remove;\r
746                         e.link12.nextthink = time;\r
747                         t = navnode_chain;\r
748                         while (t)\r
749                         {\r
750                                 if (t.delay == e.link12.delay)\r
751                                         e.link12 = t;\r
752                                 t = t.list;\r
753                         }\r
754                         e.lflags12 = e.lflags12 | LF_REMOTE;\r
755                 }\r
756                 if (e.link13)\r
757                 {\r
758                         e.link13.think = SUB_Remove;\r
759                         e.link13.nextthink = time;\r
760                         t = navnode_chain;\r
761                         while (t)\r
762                         {\r
763                                 if (t.delay == e.link13.delay)\r
764                                         e.link13 = t;\r
765                                 t = t.list;\r
766                         }\r
767                         e.lflags13 = e.lflags13 | LF_REMOTE;\r
768                 }\r
769                 if (e.link14)\r
770                 {\r
771                         e.link14.think = SUB_Remove;\r
772                         e.link14.nextthink = time;\r
773                         t = navnode_chain;\r
774                         while (t)\r
775                         {\r
776                                 if (t.delay == e.link14.delay)\r
777                                         e.link14 = t;\r
778                                 t = t.list;\r
779                         }\r
780                         e.lflags14 = e.lflags14 | LF_REMOTE;\r
781                 }\r
782                 if (e.link15)\r
783                 {\r
784                         e.link15.think = SUB_Remove;\r
785                         e.link15.nextthink = time;\r
786                         t = navnode_chain;\r
787                         while (t)\r
788                         {\r
789                                 if (t.delay == e.link15.delay)\r
790                                         e.link15 = t;\r
791                                 t = t.list;\r
792                         }\r
793                         e.lflags15 = e.lflags15 | LF_REMOTE;\r
794                 }\r
795                 if (e.link16)\r
796                 {\r
797                         e.link16.think = SUB_Remove;\r
798                         e.link16.nextthink = time;\r
799                         t = navnode_chain;\r
800                         while (t)\r
801                         {\r
802                                 if (t.delay == e.link16.delay)\r
803                                         e.link16 = t;\r
804                                 t = t.list;\r
805                         }\r
806                         e.lflags16 = e.lflags16 | LF_REMOTE;\r
807                 }\r
808                 if (e.link17)\r
809                 {\r
810                         e.link17.think = SUB_Remove;\r
811                         e.link17.nextthink = time;\r
812                         t = navnode_chain;\r
813                         while (t)\r
814                         {\r
815                                 if (t.delay == e.link17.delay)\r
816                                         e.link17 = t;\r
817                                 t = t.list;\r
818                         }\r
819                         e.lflags17 = e.lflags17 | LF_REMOTE;\r
820                 }\r
821                 if (e.link18)\r
822                 {\r
823                         e.link18.think = SUB_Remove;\r
824                         e.link18.nextthink = time;\r
825                         t = navnode_chain;\r
826                         while (t)\r
827                         {\r
828                                 if (t.delay == e.link18.delay)\r
829                                         e.link18 = t;\r
830                                 t = t.list;\r
831                         }\r
832                         e.lflags18 = e.lflags18 | LF_REMOTE;\r
833                 }\r
834                 if (e.link19)\r
835                 {\r
836                         e.link19.think = SUB_Remove;\r
837                         e.link19.nextthink = time;\r
838                         t = navnode_chain;\r
839                         while (t)\r
840                         {\r
841                                 if (t.delay == e.link19.delay)\r
842                                         e.link19 = t;\r
843                                 t = t.list;\r
844                         }\r
845                         e.lflags19 = e.lflags19 | LF_REMOTE;\r
846                 }\r
847                 e = e.list;\r
848         }\r
849         e = navnode_chain;\r
850         while (e)\r
851         {\r
852                 if (!(e.sflags & S_TELEPORT))\r
853                 {\r
854                         t = navnode_chain;\r
855                         while (t)\r
856                         {\r
857                                 if (boxesoverlap(e.origin + e.mins, e.origin + e.maxs, t.origin + t.mins, t.origin + t.maxs))\r
858                                 if (t != e)\r
859                                 if (t != e.link0)\r
860                                 if (t != e.link1)\r
861                                 if (t != e.link2)\r
862                                 if (t != e.link3)\r
863                                 if (t != e.link4)\r
864                                 if (t != e.link5)\r
865                                 if (t != e.link6)\r
866                                 if (t != e.link7)\r
867                                 if (t != e.link8)\r
868                                 if (t != e.link9)\r
869                                 if (t != e.link10)\r
870                                 if (t != e.link11)\r
871                                 if (t != e.link12)\r
872                                 if (t != e.link13)\r
873                                 if (t != e.link14)\r
874                                 if (t != e.link15)\r
875                                 if (t != e.link16)\r
876                                 if (t != e.link17)\r
877                                 if (t != e.link18)\r
878                                 if (t != e.link19)\r
879                                 {\r
880                                         if (!e.link0)\r
881                                                 e.link0 = t;\r
882                                         else if (!e.link1)\r
883                                                 e.link1 = t;\r
884                                         else if (!e.link2)\r
885                                                 e.link2 = t;\r
886                                         else if (!e.link3)\r
887                                                 e.link3 = t;\r
888                                         else if (!e.link4)\r
889                                                 e.link4 = t;\r
890                                         else if (!e.link5)\r
891                                                 e.link5 = t;\r
892                                         else if (!e.link6)\r
893                                                 e.link6 = t;\r
894                                         else if (!e.link7)\r
895                                                 e.link7 = t;\r
896                                         else if (!e.link8)\r
897                                                 e.link8 = t;\r
898                                         else if (!e.link9)\r
899                                                 e.link9 = t;\r
900                                         else if (!e.link10)\r
901                                                 e.link10 = t;\r
902                                         else if (!e.link11)\r
903                                                 e.link11 = t;\r
904                                         else if (!e.link12)\r
905                                                 e.link12 = t;\r
906                                         else if (!e.link13)\r
907                                                 e.link13 = t;\r
908                                         else if (!e.link14)\r
909                                                 e.link14 = t;\r
910                                         else if (!e.link15)\r
911                                                 e.link15 = t;\r
912                                         else if (!e.link16)\r
913                                                 e.link16 = t;\r
914                                         else if (!e.link17)\r
915                                                 e.link17 = t;\r
916                                         else if (!e.link18)\r
917                                                 e.link18 = t;\r
918                                         else if (!e.link19)\r
919                                                 e.link19 = t;\r
920                                         else\r
921                                                 dprint("WARNING: Too many linking NavNodes!\n");\r
922                                         if (urrebots_navopt)\r
923                                                 SpawnOptController(e, t);\r
924                                 }\r
925                                 t = t.list;\r
926                         }\r
927                 }\r
928                 e = e.list;\r
929         }\r
930         e = navnode_chain;\r
931         while (e)\r
932         {\r
933                 if (e.sflags & S_TELEPORT)\r
934                 {\r
935                         t = findchain(classname, "trigger_teleport");\r
936                         while (t)\r
937                         {\r
938                                 if (boxesoverlap(t.absmin, t.absmax, e.absmin, e.absmax))\r
939                                 {\r
940                                         tdest = find(world, targetname, t.target);\r
941                                         tdest = FindCurrentNavNode(tdest.origin, '0 0 0', '0 0 0');\r
942                                         e.link0 = tdest;\r
943                                 }\r
944                                 t = t.chain;\r
945                         }\r
946                         if (!e.link0)\r
947                                 error("Expected navnode\n");\r
948                 }\r
949                 else if (e.sflags & S_DOOR)\r
950                 {\r
951                         t = findchain(classname, "door");\r
952                         while (t)\r
953                         {\r
954                                 if (boxesoverlap(t.absmin, t.absmax, e.absmin, e.absmax))\r
955                                         e.goalentity = t;\r
956                                 t = t.chain;\r
957                         }\r
958                         if (!e.goalentity)\r
959                                 error("Expected door\n");\r
960                 }\r
961                 e = e.list;\r
962         }\r
963 };\r
964 \r
965 /* --- LoadNavNodes ---\r
966 Loads the navnodes from an .nnl file (NavNodeList) for the map*/\r
967 \r
968 void() LoadNavNodes =\r
969 {\r
970         local float f, file, length;\r
971         local float pdst;\r
972         local float sfl;\r
973         local float tfl0, tfl1, tfl2, tfl3, tfl4, tfl5, tfl6, tfl7, tfl8, tfl9;\r
974         local float tfl10, tfl11, tfl12, tfl13, tfl14, tfl15, tfl16, tfl17, tfl18, tfl19;\r
975         local string s;\r
976         local float rl0, rl1, rl2, rl3, rl4, rl5, rl6, rl7, rl8, rl9;\r
977         local float rl10, rl11, rl12, rl13, rl14, rl15, rl16, rl17, rl18, rl19;\r
978         local vector pln;\r
979         local vector wborg, wbmaxs, wbmins;\r
980         local entity e, plane_storage;\r
981 \r
982         if (navnodes)\r
983         {\r
984                 dprint("NavNodes present, map needs to be reloaded to load navnode-file\n");\r
985                 return;\r
986         }\r
987 \r
988         plane_storage = spawn();\r
989 \r
990         length = strlen(world.model);\r
991         length = length - 5;\r
992         s = substring(world.model, 5, length);\r
993         s = strcat("maps/", s, ".nnl");\r
994 \r
995         file = fopen(s, FILE_READ);\r
996 \r
997         if (file >= 0)\r
998         {\r
999                 dprint("Found navnode file\n");\r
1000                 s = fgets(file);\r
1001                 while (s == "navnode")\r
1002                 {\r
1003                         f = 0;\r
1004                         pdst = -1;\r
1005                         pln = nullvector;\r
1006                         wborg = wbmaxs = wbmins = nullvector;\r
1007                         plane_storage.plane_chain = world;\r
1008                         sfl = 0;\r
1009                         tfl0 = tfl1 = tfl2 = tfl3 = tfl4 = tfl5 = tfl6 = tfl7 = tfl8 = tfl9 = 0;\r
1010                         tfl10 = tfl11 = tfl12 = tfl13 = tfl14 = tfl15 = tfl16 = tfl17 = tfl18 = tfl19 = 0;\r
1011                         rl0 = rl1 = rl2 = rl3 = rl4 = rl5 = rl6 = rl7 = rl8 = rl9 = -1;\r
1012                         rl10 = rl11 = rl12 = rl13 = rl14 = rl15 = rl16 = rl17 = rl18 = rl19 = -1;\r
1013                         s = fgets(file);\r
1014                         wborg = stov(s);\r
1015                         s = fgets(file);\r
1016                         wbmins = stov(s);\r
1017                         s = fgets(file);\r
1018                         wbmaxs = stov(s);\r
1019                         s = fgets(file);\r
1020                         while (s == "plane")\r
1021                         {\r
1022                                 s = fgets(file);\r
1023                                 pln = stov(s);\r
1024                                 s = fgets(file);\r
1025                                 pdst = stof(s);\r
1026                                 AddPlane(plane_storage, pln*-1, pdst);\r
1027                                 s = fgets(file);\r
1028                         }\r
1029                         while (substring(s, 0, 6) == "remote")\r
1030                         {\r
1031                                 length = strlen(s);\r
1032                                 f = stof(substring(s, 6, length));\r
1033                                 s = fgets(file);\r
1034                                 if (!f)\r
1035                                         rl0 = stof(s);\r
1036                                 else if (f == 1)\r
1037                                         rl1 = stof(s);\r
1038                                 else if (f == 2)\r
1039                                         rl2 = stof(s);\r
1040                                 else if (f == 3)\r
1041                                         rl3 = stof(s);\r
1042                                 else if (f == 4)\r
1043                                         rl4 = stof(s);\r
1044                                 else if (f == 5)\r
1045                                         rl5 = stof(s);\r
1046                                 else if (f == 6)\r
1047                                         rl6 = stof(s);\r
1048                                 else if (f == 7)\r
1049                                         rl7 = stof(s);\r
1050                                 else if (f == 8)\r
1051                                         rl8 = stof(s);\r
1052                                 else if (f == 9)\r
1053                                         rl9 = stof(s);\r
1054                                 else if (f == 10)\r
1055                                         rl10 = stof(s);\r
1056                                 else if (f == 11)\r
1057                                         rl11 = stof(s);\r
1058                                 else if (f == 12)\r
1059                                         rl12 = stof(s);\r
1060                                 else if (f == 13)\r
1061                                         rl13 = stof(s);\r
1062                                 else if (f == 14)\r
1063                                         rl14 = stof(s);\r
1064                                 else if (f == 15)\r
1065                                         rl15 = stof(s);\r
1066                                 else if (f == 16)\r
1067                                         rl16 = stof(s);\r
1068                                 else if (f == 17)\r
1069                                         rl17 = stof(s);\r
1070                                 else if (f == 18)\r
1071                                         rl18 = stof(s);\r
1072                                 else if (f == 19)\r
1073                                         rl19 = stof(s);\r
1074                                 s = fgets(file);\r
1075                         }\r
1076                         if (s == "sflags")\r
1077                         {\r
1078                                 s = fgets(file);\r
1079                                 sfl = stof(s);\r
1080                                 s = fgets(file);\r
1081                         }\r
1082                         while (substring(s, 0, 6) == "lflags")\r
1083                         {\r
1084                                 length = strlen(s);\r
1085                                 f = stof(substring(s, 6, length));\r
1086                                 s = fgets(file);\r
1087                                 if (!f)\r
1088                                         tfl0 = stof(s);\r
1089                                 else if (f == 1)\r
1090                                         tfl1 = stof(s);\r
1091                                 else if (f == 2)\r
1092                                         tfl2 = stof(s);\r
1093                                 else if (f == 3)\r
1094                                         tfl3 = stof(s);\r
1095                                 else if (f == 4)\r
1096                                         tfl4 = stof(s);\r
1097                                 else if (f == 5)\r
1098                                         tfl5 = stof(s);\r
1099                                 else if (f == 6)\r
1100                                         tfl6 = stof(s);\r
1101                                 else if (f == 7)\r
1102                                         tfl7 = stof(s);\r
1103                                 else if (f == 8)\r
1104                                         tfl8 = stof(s);\r
1105                                 else if (f == 9)\r
1106                                         tfl9 = stof(s);\r
1107                                 else if (f == 10)\r
1108                                         tfl10 = stof(s);\r
1109                                 else if (f == 11)\r
1110                                         tfl11 = stof(s);\r
1111                                 else if (f == 12)\r
1112                                         tfl12 = stof(s);\r
1113                                 else if (f == 13)\r
1114                                         tfl13 = stof(s);\r
1115                                 else if (f == 14)\r
1116                                         tfl14 = stof(s);\r
1117                                 else if (f == 15)\r
1118                                         tfl15 = stof(s);\r
1119                                 else if (f == 16)\r
1120                                         tfl16 = stof(s);\r
1121                                 else if (f == 17)\r
1122                                         tfl17 = stof(s);\r
1123                                 else if (f == 18)\r
1124                                         tfl18 = stof(s);\r
1125                                 else if (f == 19)\r
1126                                         tfl19 = stof(s);\r
1127                                 s = fgets(file);\r
1128                         }\r
1129                         e = SpawnNavNode(wborg, wbmins, wbmaxs);\r
1130                         if (plane_storage.plane_chain)\r
1131                                 e.plane_chain = plane_storage.plane_chain;\r
1132                         e.sflags = sfl;\r
1133                         e.lflags0 = tfl0;\r
1134                         e.lflags1 = tfl1;\r
1135                         e.lflags2 = tfl2;\r
1136                         e.lflags3 = tfl3;\r
1137                         e.lflags4 = tfl4;\r
1138                         e.lflags5 = tfl5;\r
1139                         e.lflags6 = tfl6;\r
1140                         e.lflags7 = tfl7;\r
1141                         e.lflags8 = tfl8;\r
1142                         e.lflags9 = tfl9;\r
1143                         e.lflags10 = tfl10;\r
1144                         e.lflags11 = tfl11;\r
1145                         e.lflags12 = tfl12;\r
1146                         e.lflags13 = tfl13;\r
1147                         e.lflags14 = tfl14;\r
1148                         e.lflags15 = tfl15;\r
1149                         e.lflags16 = tfl16;\r
1150                         e.lflags17 = tfl17;\r
1151                         e.lflags18 = tfl18;\r
1152                         e.lflags19 = tfl19;\r
1153                         if (rl0 > -1)\r
1154                         {\r
1155                                 newmis = spawn();\r
1156                                 newmis.classname = "remotelinker";\r
1157                                 newmis.delay = rl0;\r
1158                                 e.link0 = newmis;\r
1159                         }\r
1160                         if (rl1 > -1)\r
1161                         {\r
1162                                 newmis = spawn();\r
1163                                 newmis.classname = "remotelinker";\r
1164                                 newmis.delay = rl1;\r
1165                                 e.link1 = newmis;\r
1166                         }\r
1167                         if (rl2 > -1)\r
1168                         {\r
1169                                 newmis = spawn();\r
1170                                 newmis.classname = "remotelinker";\r
1171                                 newmis.delay = rl2;\r
1172                                 e.link2 = newmis;\r
1173                         }\r
1174                         if (rl3 > -1)\r
1175                         {\r
1176                                 newmis = spawn();\r
1177                                 newmis.classname = "remotelinker";\r
1178                                 newmis.delay = rl3;\r
1179                                 e.link3 = newmis;\r
1180                         }\r
1181                         if (rl4 > -1)\r
1182                         {\r
1183                                 newmis = spawn();\r
1184                                 newmis.classname = "remotelinker";\r
1185                                 newmis.delay = rl4;\r
1186                                 e.link4 = newmis;\r
1187                         }\r
1188                         if (rl5 > -1)\r
1189                         {\r
1190                                 newmis = spawn();\r
1191                                 newmis.classname = "remotelinker";\r
1192                                 newmis.delay = rl5;\r
1193                                 e.link5 = newmis;\r
1194                         }\r
1195                         if (rl6 > -1)\r
1196                         {\r
1197                                 newmis = spawn();\r
1198                                 newmis.classname = "remotelinker";\r
1199                                 newmis.delay = rl6;\r
1200                                 e.link6 = newmis;\r
1201                         }\r
1202                         if (rl7 > -1)\r
1203                         {\r
1204                                 newmis = spawn();\r
1205                                 newmis.classname = "remotelinker";\r
1206                                 newmis.delay = rl7;\r
1207                                 e.link7 = newmis;\r
1208                         }\r
1209                         if (rl8 > -1)\r
1210                         {\r
1211                                 newmis = spawn();\r
1212                                 newmis.classname = "remotelinker";\r
1213                                 newmis.delay = rl8;\r
1214                                 e.link8 = newmis;\r
1215                         }\r
1216                         if (rl9 > -1)\r
1217                         {\r
1218                                 newmis = spawn();\r
1219                                 newmis.classname = "remotelinker";\r
1220                                 newmis.delay = rl9;\r
1221                                 e.link9 = newmis;\r
1222                         }\r
1223                         if (rl10 > -1)\r
1224                         {\r
1225                                 newmis = spawn();\r
1226                                 newmis.classname = "remotelinker";\r
1227                                 newmis.delay = rl10;\r
1228                                 e.link10 = newmis;\r
1229                         }\r
1230                         if (rl11 > -1)\r
1231                         {\r
1232                                 newmis = spawn();\r
1233                                 newmis.classname = "remotelinker";\r
1234                                 newmis.delay = rl11;\r
1235                                 e.link11 = newmis;\r
1236                         }\r
1237                         if (rl12 > -1)\r
1238                         {\r
1239                                 newmis = spawn();\r
1240                                 newmis.classname = "remotelinker";\r
1241                                 newmis.delay = rl12;\r
1242                                 e.link12 = newmis;\r
1243                         }\r
1244                         if (rl13 > -1)\r
1245                         {\r
1246                                 newmis = spawn();\r
1247                                 newmis.classname = "remotelinker";\r
1248                                 newmis.delay = rl13;\r
1249                                 e.link13 = newmis;\r
1250                         }\r
1251                         if (rl14 > -1)\r
1252                         {\r
1253                                 newmis = spawn();\r
1254                                 newmis.classname = "remotelinker";\r
1255                                 newmis.delay = rl14;\r
1256                                 e.link14 = newmis;\r
1257                         }\r
1258                         if (rl15 > -1)\r
1259                         {\r
1260                                 newmis = spawn();\r
1261                                 newmis.classname = "remotelinker";\r
1262                                 newmis.delay = rl15;\r
1263                                 e.link15 = newmis;\r
1264                         }\r
1265                         if (rl16 > -1)\r
1266                         {\r
1267                                 newmis = spawn();\r
1268                                 newmis.classname = "remotelinker";\r
1269                                 newmis.delay = rl16;\r
1270                                 e.link16 = newmis;\r
1271                         }\r
1272                         if (rl17 > -1)\r
1273                         {\r
1274                                 newmis = spawn();\r
1275                                 newmis.classname = "remotelinker";\r
1276                                 newmis.delay = rl17;\r
1277                                 e.link17 = newmis;\r
1278                         }\r
1279                         if (rl18 > -1)\r
1280                         {\r
1281                                 newmis = spawn();\r
1282                                 newmis.classname = "remotelinker";\r
1283                                 newmis.delay = rl18;\r
1284                                 e.link18 = newmis;\r
1285                         }\r
1286                         if (rl19 > -1)\r
1287                         {\r
1288                                 newmis = spawn();\r
1289                                 newmis.classname = "remotelinker";\r
1290                                 newmis.delay = rl19;\r
1291                                 e.link19 = newmis;\r
1292                         }\r
1293                 }\r
1294                 fclose(file);\r
1295         }\r
1296         else\r
1297                 dprint("No navnode file found\n");\r
1298         remove(plane_storage);\r
1299         plane_storage = world;\r
1300 };\r