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