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