]> icculus.org git repositories - divverent/nexuiz.git/blob - attic/navnodeedit/src/wsystem.qc
moved navnodeedit & TeamNexuiz to attic
[divverent/nexuiz.git] / attic / navnodeedit / src / wsystem.qc
1 void() LinkNavNodes;\r
2 \r
3 float(vector m1, vector m2, vector m3, vector m4) boxesoverlap =\r
4 {\r
5         return m2_x >= m3_x && m1_x <= m4_x && m2_y >= m3_y && m1_y <= m4_y && m2_z >= m3_z && m1_z <= m4_z;\r
6 };\r
7 \r
8 float(entity e, vector start, vector m1, vector m2, vector end) tracewalk =\r
9 {\r
10         local vector move;\r
11         local vector dir;\r
12         local vector nostependpos;\r
13         local float dist;\r
14         local float totaldist;\r
15         local float stepdist;\r
16         local float yaw;\r
17         local float ignorehazards;\r
18         local float p;\r
19         local float nostepfrac;\r
20         local entity saveself;\r
21         move = end - start;\r
22         move_z = 0;\r
23         dist = totaldist = vlen(move);\r
24         dir = normalize(move);\r
25         stepdist = 32;\r
26         saveself = self;\r
27         if (!tracewalkent)\r
28                 tracewalkent = spawn();\r
29         setsize(tracewalkent, m1, m2);\r
30         tracewalkent.owner = self; // avoid collisions\r
31         self = tracewalkent;\r
32         setorigin(self, start);\r
33         p = pointcontents(self.origin);\r
34         if (p == CONTENT_EMPTY)\r
35         {\r
36                 tracebox(start + '0 0 18', self.mins, self.maxs, start + '0 0 -18', FALSE, e);\r
37                 if (trace_fraction >= 1) // start isn't even on the floor\r
38                 {\r
39                         self = saveself;\r
40                         return 0;\r
41                 }\r
42         }\r
43         ignorehazards = FALSE;\r
44         p = pointcontents(start);\r
45         if (p == CONTENT_LAVA || p == CONTENT_SLIME)\r
46                 ignorehazards = TRUE;\r
47         yaw = vectoyaw(move);\r
48         move = end - self.origin;\r
49         while (1)\r
50         {\r
51                 if (boxesoverlap(end, end, self.absmin, self.absmax))\r
52                 {\r
53                         self = saveself;\r
54                         // succeeded\r
55                         return 1;\r
56                 }\r
57                 if (dist <= 0)\r
58                         break;\r
59                 if (stepdist > dist)\r
60                         stepdist = dist;\r
61                 dist = dist - stepdist;\r
62                 p = 0;\r
63                 if (!ignorehazards)\r
64                 {\r
65                         p = pointcontents(self.origin);\r
66                         if (p == CONTENT_LAVA || p == CONTENT_SLIME)\r
67                         {\r
68                                 self = saveself;\r
69                                 // hazards blocking path\r
70                                 return 0;\r
71                         }\r
72                 }\r
73                 if (p == 0)\r
74                         p = pointcontents(self.origin);\r
75                 if (p != CONTENT_EMPTY)\r
76                 {\r
77                         move = normalize(end - self.origin);\r
78                         tracebox(self.origin, self.mins, self.maxs, self.origin + move * stepdist, FALSE, e);\r
79                         if (trace_startsolid || trace_fraction < 1)\r
80                         {\r
81                                 self = saveself;\r
82                                 // failed\r
83                                 return 0;\r
84                         }\r
85                         setorigin(self, trace_endpos);\r
86                 }\r
87                 else\r
88                 {\r
89                         // walkmove failed, fall back to our own methods\r
90                         move = dir * stepdist + self.origin;\r
91                         // trace twice, first at ground level, then at\r
92                         // stepheight, stepheight trace will be used instead\r
93                         // of ground trace if it went further, if ground\r
94                         // level was chosen check if we made any progress,\r
95                         // if we did, fall to floor, if we did not, fail\r
96                         tracebox(self.origin, self.mins, self.maxs, move, FALSE, e);\r
97                         if (trace_startsolid)\r
98                         {\r
99                                 self = saveself;\r
100                                 // failed\r
101                                 return 0;\r
102                         }\r
103                         nostepfrac = trace_fraction;\r
104                         nostependpos = trace_endpos;\r
105                         tracebox(self.origin + '0 0 18', self.mins, self.maxs, move + '0 0 18', FALSE, e);\r
106                         if (trace_fraction > nostepfrac + 0.001)\r
107                         {\r
108                                 // stepped, fall to floor\r
109                                 tracebox(trace_endpos, self.mins, self.maxs, trace_endpos + '0 0 -65536', FALSE, e);\r
110                                 setorigin(self, trace_endpos);\r
111                         }\r
112                         else\r
113                         {\r
114                                 if (nostepfrac >= 0.001)\r
115                                 {\r
116                                         // moved, fall to floor\r
117                                         tracebox(nostependpos, self.mins, self.maxs, nostependpos + '0 0 -65536', FALSE, e);\r
118                                         setorigin(self, trace_endpos);\r
119                                 }\r
120                                 else\r
121                                 {\r
122                                         // didn't move\r
123                                         self = saveself;\r
124                                         // failed\r
125                                         return 0;\r
126                                 }\r
127                         }\r
128                 }\r
129         }\r
130         self = saveself;\r
131         // moved but didn't arrive at the intended destination\r
132         return 0;\r
133 };\r
134 \r
135 entity(entity start, vector org, float mode) FindCurrentNavNode =\r
136 {\r
137         local float f, best_f;\r
138         local entity e, best_e;\r
139 \r
140         best_f = 10000000;\r
141 \r
142         if (mode == M_OVERLAP)\r
143         {\r
144                 if (start.classname == "navnode")\r
145                         e = start.list;\r
146                 else\r
147                         e = navnode_chain;\r
148                 while (e)\r
149                 {\r
150                         if (boxesoverlap(org, org, e.origin + e.mins, e.origin + e.maxs))\r
151                                 return e;\r
152                         e = e.list;\r
153                 }\r
154         }\r
155         else if (mode == M_CLOSEST)\r
156         {\r
157                 if (start.classname == "navnode")\r
158                         e = start.list;\r
159                 else\r
160                         e = navnode_chain;\r
161                 while (e)\r
162                 {\r
163                         f = vlen(org - e.origin);\r
164                         if (f < best_f)\r
165                         {\r
166                                 best_e = e;\r
167                                 best_f = f;\r
168                         }\r
169                         e = e.list;\r
170                 }\r
171                 return best_e;\r
172         }\r
173         return world;\r
174 };\r
175 \r
176 vector(vector org) SnapToGrid =\r
177 {\r
178         local float grid;\r
179         local vector rl, rh, t1, t2, ret;\r
180 \r
181         grid = self.gridsize;\r
182 \r
183         if (org_x < 0)\r
184         {\r
185                 while (rh_x > org_x)\r
186                         rh_x = rh_x - grid;\r
187         }\r
188         else\r
189         {\r
190                 while (rh_x < org_x)\r
191                         rh_x = rh_x + grid;\r
192         }\r
193         if (org_y < 0)\r
194         {\r
195                 while (rh_y > org_y)\r
196                         rh_y = rh_y - grid;\r
197         }\r
198         else\r
199         {\r
200                 while (rh_y < org_y)\r
201                         rh_y = rh_y + grid;\r
202         }\r
203         if (org_z < 0)\r
204         {\r
205                 while (rh_z > org_z)\r
206                         rh_z = rh_z - grid;\r
207         }\r
208         else\r
209         {\r
210                 while (rh_z < org_z)\r
211                         rh_z = rh_z + grid;\r
212         }\r
213 \r
214         if (rh_x < 0)\r
215                 rl_x = rh_x + grid;\r
216         else\r
217                 rl_x = rh_x - grid;\r
218         if (rh_y < 0)\r
219                 rl_y = rh_y + grid;\r
220         else\r
221                 rl_y = rh_y - grid;\r
222         if (rh_z < 0)\r
223                 rl_z = rh_z + grid;\r
224         else\r
225                 rl_z = rh_z - grid;\r
226 \r
227         t1_x = rl_x;\r
228         t1_y = rl_y;\r
229         t1_z = rl_z;\r
230 \r
231         t2_x = rh_x;\r
232         t2_y = rh_y;\r
233         t2_z = rh_z;\r
234 \r
235         if (org_x < 0)\r
236                 org_x = org_x * -1;\r
237         if (org_y < 0)\r
238                 org_y = org_y * -1;\r
239         if (org_z < 0)\r
240                 org_z = org_z * -1;\r
241 \r
242         if (t1_x < 0)\r
243                 t1_x = t1_x * -1;\r
244         if (t1_y < 0)\r
245                 t1_y = t1_y * -1;\r
246         if (t1_z < 0)\r
247                 t1_z = t1_z * -1;\r
248 \r
249         if (t2_x < 0)\r
250                 t2_x = t2_x * -1;\r
251         if (t2_y < 0)\r
252                 t2_y = t2_y * -1;\r
253         if (t2_z < 0)\r
254                 t2_z = t2_z * -1;\r
255 \r
256         t1_x = org_x - t1_x;\r
257         t1_y = org_y - t1_y;\r
258         t1_z = org_z - t1_z;\r
259 \r
260         t2_x = org_x - t2_x;\r
261         t2_y = org_y - t2_y;\r
262         t2_z = org_z - t2_z;\r
263 \r
264         if (t1_x < 0)\r
265                 t1_x = t1_x * -1;\r
266         if (t1_y < 0)\r
267                 t1_y = t1_y * -1;\r
268         if (t1_z < 0)\r
269                 t1_z = t1_z * -1;\r
270 \r
271         if (t2_x < 0)\r
272                 t2_x = t2_x * -1;\r
273         if (t2_y < 0)\r
274                 t2_y = t2_y * -1;\r
275         if (t2_z < 0)\r
276                 t2_z = t2_z * -1;\r
277 \r
278         if (t1_x < t2_x)\r
279                 ret_x = rl_x;\r
280         else\r
281                 ret_x = rh_x;\r
282         if (t1_y < t2_y)\r
283                 ret_y = rl_y;\r
284         else\r
285                 ret_y = rh_y;\r
286         if (t1_z < t2_z)\r
287                 ret_z = rl_z;\r
288         else\r
289                 ret_z = rh_z;\r
290 \r
291         return ret;\r
292 };\r
293 \r
294 void(entity navn) FixPlanes =\r
295 {\r
296         local entity e;\r
297 \r
298         if (!navn)\r
299                 return;\r
300         e = navn.plane_chain;\r
301         if (e)\r
302         {\r
303                 setorigin(e, navn.origin + e.mangle*e.delay);\r
304                 e = e.plane_next;\r
305                 while (e != navn.plane_chain)\r
306                 {\r
307                         setorigin(e, navn.origin + e.mangle*e.delay);\r
308                         e = e.plane_next;\r
309                 }\r
310         }\r
311 };\r
312 \r
313 void(entity navn, vector org) MoveNavNode =\r
314 {\r
315         if (!navn)\r
316                 return;\r
317         setorigin(navn, org);\r
318         FixPlanes(navn);\r
319         LinkNavNodes();\r
320 };\r
321 \r
322 float(entity navn, float ax, float amount) ResizeNavNode =\r
323 {\r
324         local vector v;\r
325 \r
326         if (!navn)\r
327                 return FALSE;\r
328 \r
329         if (ax == 0)\r
330         {\r
331                 amount = amount - navn.origin_x;\r
332                 if (amount < 0)\r
333                         amount = amount*-1;\r
334                 amount = amount - navn.maxs_x;\r
335                 v = navn.maxs;\r
336                 v_x = v_x + (amount*0.5);\r
337                 setsize(navn, v*-1, v);\r
338                 v = navn.origin;\r
339                 if (self.origin_x < navn.origin_x)\r
340                         v_x = navn.origin_x - (amount*0.5);\r
341                 else\r
342                         v_x = navn.origin_x + (amount*0.5);\r
343                 MoveNavNode(navn, v);\r
344         }\r
345         else if (ax == 1)\r
346         {\r
347                 amount = amount - navn.origin_y;\r
348                 if (amount < 0)\r
349                         amount = amount*-1;\r
350                 amount = amount - navn.maxs_y;\r
351                 v = navn.maxs;\r
352                 v_y = v_y + (amount*0.5);\r
353                 setsize(navn, v*-1, v);\r
354                 v = navn.origin;\r
355                 if (self.origin_y < navn.origin_y)\r
356                         v_y = navn.origin_y - (amount*0.5);\r
357                 else\r
358                         v_y = navn.origin_y + (amount*0.5);\r
359                 MoveNavNode(navn, v);\r
360         }\r
361         else if (ax == 2)\r
362         {\r
363                 amount = amount - navn.origin_z;\r
364                 if (amount < 0)\r
365                         amount = amount*-1;\r
366                 amount = amount - navn.maxs_z;\r
367                 v = navn.maxs;\r
368                 v_z = v_z + (amount*0.5);\r
369                 setsize(navn, v*-1, v);\r
370                 v = navn.origin;\r
371                 if (self.origin_z < navn.origin_z)\r
372                         v_z = navn.origin_z - (amount*0.5);\r
373                 else\r
374                         v_z = navn.origin_z + (amount*0.5);\r
375                 MoveNavNode(navn, v);\r
376         }\r
377         LinkNavNodes();\r
378         return TRUE;\r
379 };\r
380 \r
381 void(entity navn, vector normal, float dist) AddPlane =\r
382 {\r
383         local float f;\r
384 \r
385         if (!navn)\r
386                 return;\r
387 \r
388         newmis = spawn();\r
389         newmis.classname = "plane";\r
390         if (!navn.plane_chain)\r
391         {\r
392                 navn.plane_chain = newmis;\r
393                 newmis.plane_next = newmis;\r
394                 newmis.plane_prev = newmis;\r
395         }\r
396         else\r
397         {\r
398                 newmis.plane_next = navn.plane_chain;\r
399                 newmis.plane_prev = newmis.plane_next.plane_prev;\r
400                 newmis.plane_prev.plane_next = newmis;\r
401                 newmis.plane_next.plane_prev = newmis;\r
402         }\r
403         newmis.mangle = normal*-1;\r
404         newmis.delay = dist;\r
405         f = (navn.origin * newmis.mangle) - ((navn.origin + (newmis.delay * newmis.mangle)) * newmis.mangle);\r
406         if (f > 0)\r
407         {\r
408                 newmis.mangle = newmis.mangle*-1;\r
409                 newmis.delay = newmis.delay*-1;\r
410         }\r
411         setorigin (newmis, navn.origin + newmis.mangle*newmis.delay);\r
412         setmodel (newmis, "progs/plane.mdl");\r
413         newmis.angles = vectoangles(newmis.mangle);\r
414         newmis.effects = EF_NODRAW;\r
415 };\r
416 \r
417 void(entity navn, entity delplane) RemovePlane =\r
418 {\r
419         local entity e;\r
420 \r
421         e = navn.plane_chain;\r
422         if (e)\r
423         {\r
424                 if (e == delplane)\r
425                 {\r
426                         if (navn.plane_chain == e)\r
427                                 navn.plane_chain = e.plane_next;\r
428                         e.plane_prev.plane_next = e.plane_next;\r
429                         e.plane_next.plane_prev = e.plane_prev;\r
430                         remove (e);\r
431                         e = navn.plane_chain;\r
432                 }\r
433                 e = e.plane_next;\r
434                 while (e != navn.plane_chain)\r
435                 {\r
436                         if (e == delplane)\r
437                         {\r
438                                 if (navn.plane_chain == e)\r
439                                         navn.plane_chain = e.plane_next;\r
440                                 e.plane_prev.plane_next = e.plane_next;\r
441                                 e.plane_next.plane_prev = e.plane_prev;\r
442                                 remove (e);\r
443                                 e = navn.plane_chain;\r
444                         }\r
445                         e = e.plane_next;\r
446                 }\r
447                 if (navn.plane_chain.origin == nullvector)\r
448                         navn.plane_chain = world;\r
449         }\r
450 };\r
451 \r
452 void() RemoveClippoints =\r
453 {\r
454         if (self.clippoint1)\r
455         {\r
456                 if (self.clippoint2)\r
457                 {\r
458                         if (self.clippoint3)\r
459                                 remove (self.clippoint3);\r
460                         remove (self.clippoint2);\r
461                 }\r
462                 remove (self.clippoint1);\r
463         }\r
464         self.current_clippoint = world;\r
465         self.clippoint1 = self.clippoint2 = self.clippoint3 = world;\r
466 };\r
467 \r
468 void() ClippointThink =\r
469 {\r
470         local float p;\r
471 \r
472         self.nextthink = time + 0.1;\r
473 \r
474         p = pointcontents(self.origin);\r
475         if (p == CONTENT_SOLID)\r
476                 self.effects = EF_NODEPTHTEST | EF_ADDITIVE;\r
477         else\r
478                 self.effects = 0;\r
479 };\r
480 \r
481 void(vector org) SpawnClipPoint =\r
482 {\r
483         if (self.clippoint1)\r
484         {\r
485                 if (self.clippoint2)\r
486                 {\r
487                         if (self.clippoint3)\r
488                                 return;\r
489                         else\r
490                         {\r
491                                 self.clippoint3 = spawn();\r
492                                 setmodel(self.clippoint3, "progs/point.spr");\r
493                                 setsize(self.clippoint3, '0 0 0', '0 0 0');\r
494                                 self.clippoint3.classname = "clippoint";\r
495                                 self.clippoint3.scale = 0.5;\r
496                                 setorigin(self.clippoint3, org);\r
497                                 self.clippoint3.think = ClippointThink;\r
498                                 self.clippoint3.nextthink = time;\r
499                         }\r
500                 }\r
501                 else\r
502                 {\r
503                         self.clippoint2 = spawn();\r
504                         setmodel(self.clippoint2, "progs/point.spr");\r
505                         setsize(self.clippoint2, '0 0 0', '0 0 0');\r
506                         self.clippoint2.classname = "clippoint";\r
507                         self.clippoint2.scale = 0.5;\r
508                         setorigin(self.clippoint2, org);\r
509                         self.clippoint2.think = ClippointThink;\r
510                         self.clippoint2.nextthink = time;\r
511                 }\r
512         }\r
513         else\r
514         {\r
515                 self.clippoint1 = spawn();\r
516                 setmodel(self.clippoint1, "progs/point.spr");\r
517                 setsize(self.clippoint1, '0 0 0', '0 0 0');\r
518                 self.clippoint1.classname = "clippoint";\r
519                 self.clippoint1.scale = 0.5;\r
520                 setorigin(self.clippoint1, org);\r
521                 self.clippoint1.think = ClippointThink;\r
522                 self.clippoint1.nextthink = time;\r
523         }\r
524 };\r
525 \r
526 entity(vector org, vector nnmins, vector nnmaxs) SpawnNavNode =\r
527 {\r
528         newmis = spawn();\r
529         setmodel(newmis, "progs/navnode.spr");\r
530         setsize(newmis, nnmins, nnmaxs);\r
531         newmis.classname = "navnode";\r
532         newmis.frame = 20;\r
533         setorigin(newmis, org);\r
534         return newmis;\r
535 };\r
536 \r
537 void() LinkNavNodes =\r
538 {\r
539         local entity e, t;\r
540 \r
541         navnode_chain = world;\r
542         navnodes = 0;\r
543 \r
544         e = findchain(classname, "navnode");\r
545         while (e)\r
546         {\r
547                 e.list = navnode_chain;\r
548                 navnode_chain = e;\r
549                 e.delay = navnodes;\r
550                 navnodes = navnodes + 1;\r
551                 e = e.chain;\r
552         }\r
553 \r
554         e = navnode_chain;\r
555         while (e)\r
556         {\r
557                 if (e.link0)\r
558                 {\r
559                         e.link0.effects = 0;\r
560                         e.link0.frame = 20;\r
561                         if (e.link0.classname == "remotelinker")\r
562                         {\r
563                                 e.link0.think = SUB_Remove;\r
564                                 e.link0.nextthink = time;\r
565                                 t = navnode_chain;\r
566                                 while (t)\r
567                                 {\r
568                                         if (t.delay == e.link0.delay)\r
569                                                 e.link0 = t;\r
570                                         t = t.list;\r
571                                 }\r
572                                 e.lflags0 = e.lflags0 | LF_REMOTE;\r
573                         }\r
574                         else\r
575                         {\r
576                                 if (!(e.lflags0 & LF_REMOTE))\r
577                                 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link0.origin + e.link0.mins, e.link0.origin + e.link0.maxs))\r
578                                         PushLinks(e, 0);\r
579                         }\r
580                 }\r
581                 if (e.link1)\r
582                 {\r
583                         e.link1.effects = 0;\r
584                         e.link1.frame = 20;\r
585                         if (e.link1.classname == "remotelinker")\r
586                         {\r
587                                 e.link1.think = SUB_Remove;\r
588                                 e.link1.nextthink = time;\r
589                                 t = navnode_chain;\r
590                                 while (t)\r
591                                 {\r
592                                         if (t.delay == e.link1.delay)\r
593                                                 e.link1 = t;\r
594                                         t = t.list;\r
595                                 }\r
596                                 e.lflags1 = e.lflags1 | LF_REMOTE;\r
597                         }\r
598                         else\r
599                         {\r
600                                 if (!(e.lflags1 & LF_REMOTE))\r
601                                 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link1.origin + e.link1.mins, e.link1.origin + e.link1.maxs))\r
602                                         PushLinks(e, 1);\r
603                         }\r
604                 }\r
605                 if (e.link2)\r
606                 {\r
607                         e.link2.effects = 0;\r
608                         e.link2.frame = 20;\r
609                         if (e.link2.classname == "remotelinker")\r
610                         {\r
611                                 e.link2.think = SUB_Remove;\r
612                                 e.link2.nextthink = time;\r
613                                 t = navnode_chain;\r
614                                 while (t)\r
615                                 {\r
616                                         if (t.delay == e.link2.delay)\r
617                                                 e.link2 = t;\r
618                                         t = t.list;\r
619                                 }\r
620                                 e.lflags2 = e.lflags2 | LF_REMOTE;\r
621                         }\r
622                         else\r
623                         {\r
624                                 if (!(e.lflags2 & LF_REMOTE))\r
625                                 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link2.origin + e.link2.mins, e.link2.origin + e.link2.maxs))\r
626                                         PushLinks(e, 2);\r
627                         }\r
628                 }\r
629                 if (e.link3)\r
630                 {\r
631                         e.link3.effects = 0;\r
632                         e.link3.frame = 20;\r
633                         if (e.link3.classname == "remotelinker")\r
634                         {\r
635                                 e.link3.think = SUB_Remove;\r
636                                 e.link3.nextthink = time;\r
637                                 t = navnode_chain;\r
638                                 while (t)\r
639                                 {\r
640                                         if (t.delay == e.link3.delay)\r
641                                                 e.link3 = t;\r
642                                         t = t.list;\r
643                                 }\r
644                                 e.lflags3 = e.lflags3 | LF_REMOTE;\r
645                         }\r
646                         else\r
647                         {\r
648                                 if (!(e.lflags3 & LF_REMOTE))\r
649                                 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link3.origin + e.link3.mins, e.link3.origin + e.link3.maxs))\r
650                                         PushLinks(e, 3);\r
651                         }\r
652                 }\r
653                 if (e.link4)\r
654                 {\r
655                         e.link4.effects = 0;\r
656                         e.link4.frame = 20;\r
657                         if (e.link4.classname == "remotelinker")\r
658                         {\r
659                                 e.link4.think = SUB_Remove;\r
660                                 e.link4.nextthink = time;\r
661                                 t = navnode_chain;\r
662                                 while (t)\r
663                                 {\r
664                                         if (t.delay == e.link4.delay)\r
665                                                 e.link4 = t;\r
666                                         t = t.list;\r
667                                 }\r
668                                 e.lflags4 = e.lflags4 | LF_REMOTE;\r
669                         }\r
670                         else\r
671                         {\r
672                                 if (!(e.lflags4 & LF_REMOTE))\r
673                                 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link4.origin + e.link4.mins, e.link4.origin + e.link4.maxs))\r
674                                         PushLinks(e, 4);\r
675                         }\r
676                 }\r
677                 if (e.link5)\r
678                 {\r
679                         e.link5.effects = 0;\r
680                         e.link5.frame = 20;\r
681                         if (e.link5.classname == "remotelinker")\r
682                         {\r
683                                 e.link5.think = SUB_Remove;\r
684                                 e.link5.nextthink = time;\r
685                                 t = navnode_chain;\r
686                                 while (t)\r
687                                 {\r
688                                         if (t.delay == e.link5.delay)\r
689                                                 e.link5 = t;\r
690                                         t = t.list;\r
691                                 }\r
692                                 e.lflags5 = e.lflags5 | LF_REMOTE;\r
693                         }\r
694                         else\r
695                         {\r
696                                 if (!(e.lflags5 & LF_REMOTE))\r
697                                 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link5.origin + e.link5.mins, e.link5.origin + e.link5.maxs))\r
698                                         PushLinks(e, 5);\r
699                         }\r
700                 }\r
701                 if (e.link6)\r
702                 {\r
703                         e.link6.effects = 0;\r
704                         e.link6.frame = 20;\r
705                         if (e.link6.classname == "remotelinker")\r
706                         {\r
707                                 e.link6.think = SUB_Remove;\r
708                                 e.link6.nextthink = time;\r
709                                 t = navnode_chain;\r
710                                 while (t)\r
711                                 {\r
712                                         if (t.delay == e.link6.delay)\r
713                                                 e.link6 = t;\r
714                                         t = t.list;\r
715                                 }\r
716                                 e.lflags6 = e.lflags6 | LF_REMOTE;\r
717                         }\r
718                         else\r
719                         {\r
720                                 if (!(e.lflags6 & LF_REMOTE))\r
721                                 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link6.origin + e.link6.mins, e.link6.origin + e.link6.maxs))\r
722                                         PushLinks(e, 6);\r
723                         }\r
724                 }\r
725                 if (e.link7)\r
726                 {\r
727                         e.link7.effects = 0;\r
728                         e.link7.frame = 20;\r
729                         if (e.link7.classname == "remotelinker")\r
730                         {\r
731                                 e.link7.think = SUB_Remove;\r
732                                 e.link7.nextthink = time;\r
733                                 t = navnode_chain;\r
734                                 while (t)\r
735                                 {\r
736                                         if (t.delay == e.link7.delay)\r
737                                                 e.link7 = t;\r
738                                         t = t.list;\r
739                                 }\r
740                                 e.lflags7 = e.lflags7 | LF_REMOTE;\r
741                         }\r
742                         else\r
743                         {\r
744                                 if (!(e.lflags7 & LF_REMOTE))\r
745                                 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link7.origin + e.link7.mins, e.link7.origin + e.link7.maxs))\r
746                                         PushLinks(e, 7);\r
747                         }\r
748                 }\r
749                 if (e.link8)\r
750                 {\r
751                         e.link8.effects = 0;\r
752                         e.link8.frame = 20;\r
753                         if (e.link8.classname == "remotelinker")\r
754                         {\r
755                                 e.link8.think = SUB_Remove;\r
756                                 e.link8.nextthink = time;\r
757                                 t = navnode_chain;\r
758                                 while (t)\r
759                                 {\r
760                                         if (t.delay == e.link8.delay)\r
761                                                 e.link8 = t;\r
762                                         t = t.list;\r
763                                 }\r
764                                 e.lflags8 = e.lflags8 | LF_REMOTE;\r
765                         }\r
766                         else\r
767                         {\r
768                                 if (!(e.lflags8 & LF_REMOTE))\r
769                                 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link8.origin + e.link8.mins, e.link8.origin + e.link8.maxs))\r
770                                         PushLinks(e, 8);\r
771                         }\r
772                 }\r
773                 if (e.link9)\r
774                 {\r
775                         e.link9.effects = 0;\r
776                         e.link9.frame = 20;\r
777                         if (e.link9.classname == "remotelinker")\r
778                         {\r
779                                 e.link9.think = SUB_Remove;\r
780                                 e.link9.nextthink = time;\r
781                                 t = navnode_chain;\r
782                                 while (t)\r
783                                 {\r
784                                         if (t.delay == e.link9.delay)\r
785                                                 e.link9 = t;\r
786                                         t = t.list;\r
787                                 }\r
788                                 e.lflags9 = e.lflags9 | LF_REMOTE;\r
789                         }\r
790                         else\r
791                         {\r
792                                 if (!(e.lflags9 & LF_REMOTE))\r
793                                 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link9.origin + e.link9.mins, e.link9.origin + e.link9.maxs))\r
794                                         PushLinks(e, 9);\r
795                         }\r
796                 }\r
797                 if (e.link10)\r
798                 {\r
799                         e.link10.effects = 0;\r
800                         e.link10.frame = 20;\r
801                         if (e.link10.classname == "remotelinker")\r
802                         {\r
803                                 e.link10.think = SUB_Remove;\r
804                                 e.link10.nextthink = time;\r
805                                 t = navnode_chain;\r
806                                 while (t)\r
807                                 {\r
808                                         if (t.delay == e.link10.delay)\r
809                                                 e.link10 = t;\r
810                                         t = t.list;\r
811                                 }\r
812                                 e.lflags10 = e.lflags10 | LF_REMOTE;\r
813                         }\r
814                         else\r
815                         {\r
816                                 if (!(e.lflags10 & LF_REMOTE))\r
817                                 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link10.origin + e.link10.mins, e.link10.origin + e.link10.maxs))\r
818                                         PushLinks(e, 10);\r
819                         }\r
820                 }\r
821                 if (e.link11)\r
822                 {\r
823                         e.link11.effects = 0;\r
824                         e.link11.frame = 20;\r
825                         if (e.link11.classname == "remotelinker")\r
826                         {\r
827                                 e.link11.think = SUB_Remove;\r
828                                 e.link11.nextthink = time;\r
829                                 t = navnode_chain;\r
830                                 while (t)\r
831                                 {\r
832                                         if (t.delay == e.link11.delay)\r
833                                                 e.link11 = t;\r
834                                         t = t.list;\r
835                                 }\r
836                                 e.lflags11 = e.lflags11 | LF_REMOTE;\r
837                         }\r
838                         else\r
839                         {\r
840                                 if (!(e.lflags11 & LF_REMOTE))\r
841                                 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link11.origin + e.link11.mins, e.link11.origin + e.link11.maxs))\r
842                                         PushLinks(e, 11);\r
843                         }\r
844                 }\r
845                 if (e.link12)\r
846                 {\r
847                         e.link12.effects = 0;\r
848                         e.link12.frame = 20;\r
849                         if (e.link12.classname == "remotelinker")\r
850                         {\r
851                                 e.link12.think = SUB_Remove;\r
852                                 e.link12.nextthink = time;\r
853                                 t = navnode_chain;\r
854                                 while (t)\r
855                                 {\r
856                                         if (t.delay == e.link12.delay)\r
857                                                 e.link12 = t;\r
858                                         t = t.list;\r
859                                 }\r
860                                 e.lflags12 = e.lflags12 | LF_REMOTE;\r
861                         }\r
862                         else\r
863                         {\r
864                                 if (!(e.lflags12 & LF_REMOTE))\r
865                                 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link12.origin + e.link12.mins, e.link12.origin + e.link12.maxs))\r
866                                         PushLinks(e, 12);\r
867                         }\r
868                 }\r
869                 if (e.link13)\r
870                 {\r
871                         e.link13.effects = 0;\r
872                         e.link13.frame = 20;\r
873                         if (e.link13.classname == "remotelinker")\r
874                         {\r
875                                 e.link13.think = SUB_Remove;\r
876                                 e.link13.nextthink = time;\r
877                                 t = navnode_chain;\r
878                                 while (t)\r
879                                 {\r
880                                         if (t.delay == e.link13.delay)\r
881                                                 e.link13 = t;\r
882                                         t = t.list;\r
883                                 }\r
884                                 e.lflags13 = e.lflags13 | LF_REMOTE;\r
885                         }\r
886                         else\r
887                         {\r
888                                 if (!(e.lflags13 & LF_REMOTE))\r
889                                 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link13.origin + e.link13.mins, e.link13.origin + e.link13.maxs))\r
890                                         PushLinks(e, 13);\r
891                         }\r
892                 }\r
893                 if (e.link14)\r
894                 {\r
895                         e.link14.effects = 0;\r
896                         e.link14.frame = 20;\r
897                         if (e.link14.classname == "remotelinker")\r
898                         {\r
899                                 e.link14.think = SUB_Remove;\r
900                                 e.link14.nextthink = time;\r
901                                 t = navnode_chain;\r
902                                 while (t)\r
903                                 {\r
904                                         if (t.delay == e.link14.delay)\r
905                                                 e.link14 = t;\r
906                                         t = t.list;\r
907                                 }\r
908                                 e.lflags14 = e.lflags14 | LF_REMOTE;\r
909                         }\r
910                         else\r
911                         {\r
912                                 if (!(e.lflags14 & LF_REMOTE))\r
913                                 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link14.origin + e.link14.mins, e.link14.origin + e.link14.maxs))\r
914                                         PushLinks(e, 14);\r
915                         }\r
916                 }\r
917                 if (e.link15)\r
918                 {\r
919                         e.link15.effects = 0;\r
920                         e.link15.frame = 20;\r
921                         if (e.link15.classname == "remotelinker")\r
922                         {\r
923                                 e.link15.think = SUB_Remove;\r
924                                 e.link15.nextthink = time;\r
925                                 t = navnode_chain;\r
926                                 while (t)\r
927                                 {\r
928                                         if (t.delay == e.link15.delay)\r
929                                                 e.link15 = t;\r
930                                         t = t.list;\r
931                                 }\r
932                                 e.lflags15 = e.lflags15 | LF_REMOTE;\r
933                         }\r
934                         else\r
935                         {\r
936                                 if (!(e.lflags15 & LF_REMOTE))\r
937                                 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link15.origin + e.link15.mins, e.link15.origin + e.link15.maxs))\r
938                                         PushLinks(e, 15);\r
939                         }\r
940                 }\r
941                 if (e.link16)\r
942                 {\r
943                         e.link16.effects = 0;\r
944                         e.link16.frame = 20;\r
945                         if (e.link16.classname == "remotelinker")\r
946                         {\r
947                                 e.link16.think = SUB_Remove;\r
948                                 e.link16.nextthink = time;\r
949                                 t = navnode_chain;\r
950                                 while (t)\r
951                                 {\r
952                                         if (t.delay == e.link16.delay)\r
953                                                 e.link16 = t;\r
954                                         t = t.list;\r
955                                 }\r
956                                 e.lflags16 = e.lflags16 | LF_REMOTE;\r
957                         }\r
958                         else\r
959                         {\r
960                                 if (!(e.lflags16 & LF_REMOTE))\r
961                                 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link16.origin + e.link16.mins, e.link16.origin + e.link16.maxs))\r
962                                         PushLinks(e, 16);\r
963                         }\r
964                 }\r
965                 if (e.link17)\r
966                 {\r
967                         e.link17.effects = 0;\r
968                         e.link17.frame = 20;\r
969                         if (e.link17.classname == "remotelinker")\r
970                         {\r
971                                 e.link17.think = SUB_Remove;\r
972                                 e.link17.nextthink = time;\r
973                                 t = navnode_chain;\r
974                                 while (t)\r
975                                 {\r
976                                         if (t.delay == e.link17.delay)\r
977                                                 e.link17 = t;\r
978                                         t = t.list;\r
979                                 }\r
980                                 e.lflags17 = e.lflags17 | LF_REMOTE;\r
981                         }\r
982                         else\r
983                         {\r
984                                 if (!(e.lflags17 & LF_REMOTE))\r
985                                 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link17.origin + e.link17.mins, e.link17.origin + e.link17.maxs))\r
986                                         PushLinks(e, 17);\r
987                         }\r
988                 }\r
989                 if (e.link18)\r
990                 {\r
991                         e.link18.effects = 0;\r
992                         e.link18.frame = 20;\r
993                         if (e.link18.classname == "remotelinker")\r
994                         {\r
995                                 e.link18.think = SUB_Remove;\r
996                                 e.link18.nextthink = time;\r
997                                 t = navnode_chain;\r
998                                 while (t)\r
999                                 {\r
1000                                         if (t.delay == e.link18.delay)\r
1001                                                 e.link18 = t;\r
1002                                         t = t.list;\r
1003                                 }\r
1004                                 e.lflags18 = e.lflags18 | LF_REMOTE;\r
1005                         }\r
1006                         else\r
1007                         {\r
1008                                 if (!(e.lflags18 & LF_REMOTE))\r
1009                                 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link18.origin + e.link18.mins, e.link18.origin + e.link18.maxs))\r
1010                                         PushLinks(e, 18);\r
1011                         }\r
1012                 }\r
1013                 if (e.link19)\r
1014                 {\r
1015                         e.link19.effects = 0;\r
1016                         e.link19.frame = 20;\r
1017                         if (e.link19.classname == "remotelinker")\r
1018                         {\r
1019                                 e.link19.think = SUB_Remove;\r
1020                                 e.link19.nextthink = time;\r
1021                                 t = navnode_chain;\r
1022                                 while (t)\r
1023                                 {\r
1024                                         if (t.delay == e.link19.delay)\r
1025                                                 e.link19 = t;\r
1026                                         t = t.list;\r
1027                                 }\r
1028                                 e.lflags19 = e.lflags19 | LF_REMOTE;\r
1029                         }\r
1030                         else\r
1031                         {\r
1032                                 if (!(e.lflags19 & LF_REMOTE))\r
1033                                 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link19.origin + e.link19.mins, e.link19.origin + e.link19.maxs))\r
1034                                         PushLinks(e, 19);\r
1035                         }\r
1036                 }\r
1037                 e = e.list;\r
1038         }\r
1039         e = navnode_chain;\r
1040         while (e)\r
1041         {\r
1042                 t = navnode_chain;\r
1043                 while (t)\r
1044                 {\r
1045                         if (boxesoverlap(e.origin + e.mins, e.origin + e.maxs, t.origin + t.mins, t.origin + t.maxs))\r
1046                         if (t != e)\r
1047                         if (t != e.link0)\r
1048                         if (t != e.link1)\r
1049                         if (t != e.link2)\r
1050                         if (t != e.link3)\r
1051                         if (t != e.link4)\r
1052                         if (t != e.link5)\r
1053                         if (t != e.link6)\r
1054                         if (t != e.link7)\r
1055                         if (t != e.link8)\r
1056                         if (t != e.link9)\r
1057                         if (t != e.link10)\r
1058                         if (t != e.link11)\r
1059                         if (t != e.link12)\r
1060                         if (t != e.link13)\r
1061                         if (t != e.link14)\r
1062                         if (t != e.link15)\r
1063                         if (t != e.link16)\r
1064                         if (t != e.link17)\r
1065                         if (t != e.link18)\r
1066                         if (t != e.link19)\r
1067                         {\r
1068                                 if (!e.link0)\r
1069                                         e.link0 = t;\r
1070                                 else if (!e.link1)\r
1071                                         e.link1 = t;\r
1072                                 else if (!e.link2)\r
1073                                         e.link2 = t;\r
1074                                 else if (!e.link3)\r
1075                                         e.link3 = t;\r
1076                                 else if (!e.link4)\r
1077                                         e.link4 = t;\r
1078                                 else if (!e.link5)\r
1079                                         e.link5 = t;\r
1080                                 else if (!e.link6)\r
1081                                         e.link6 = t;\r
1082                                 else if (!e.link7)\r
1083                                         e.link7 = t;\r
1084                                 else if (!e.link8)\r
1085                                         e.link8 = t;\r
1086                                 else if (!e.link9)\r
1087                                         e.link9 = t;\r
1088                                 else if (!e.link10)\r
1089                                         e.link10 = t;\r
1090                                 else if (!e.link11)\r
1091                                         e.link11 = t;\r
1092                                 else if (!e.link12)\r
1093                                         e.link12 = t;\r
1094                                 else if (!e.link13)\r
1095                                         e.link13 = t;\r
1096                                 else if (!e.link14)\r
1097                                         e.link14 = t;\r
1098                                 else if (!e.link15)\r
1099                                         e.link15 = t;\r
1100                                 else if (!e.link16)\r
1101                                         e.link16 = t;\r
1102                                 else if (!e.link17)\r
1103                                         e.link17 = t;\r
1104                                 else if (!e.link18)\r
1105                                         e.link18 = t;\r
1106                                 else if (!e.link19)\r
1107                                         e.link19 = t;\r
1108                                 else\r
1109                                         dprint("WARNING: Too many linking NavNodes!\n");\r
1110                         }\r
1111                         t = t.list;\r
1112                 }\r
1113                 e = e.list;\r
1114         }\r
1115 };\r
1116 \r
1117 void() LoadNavNodes =\r
1118 {\r
1119         local float f, file, length;\r
1120         local float pdst;\r
1121         local float sfl;\r
1122         local float tfl0, tfl1, tfl2, tfl3, tfl4, tfl5, tfl6, tfl7, tfl8, tfl9;\r
1123         local float tfl10, tfl11, tfl12, tfl13, tfl14, tfl15, tfl16, tfl17, tfl18, tfl19;\r
1124         local string s;\r
1125         local float rl0, rl1, rl2, rl3, rl4, rl5, rl6, rl7, rl8, rl9;\r
1126         local float rl10, rl11, rl12, rl13, rl14, rl15, rl16, rl17, rl18, rl19;\r
1127         local vector pln;\r
1128         local vector wborg, wbmaxs, wbmins;\r
1129         local entity e, plane_storage;\r
1130 \r
1131         if (navnodes)\r
1132         {\r
1133                 dprint("NavNodes present, map needs to be reloaded to load navnode-file\n");\r
1134                 return;\r
1135         }\r
1136 \r
1137         plane_storage = spawn();\r
1138 \r
1139         length = strlen(world.model);\r
1140         length = length - 5;\r
1141         s = substring(world.model, 5, length);\r
1142         s = strcat(s, ".nnl");\r
1143 \r
1144         file = fopen(s, FILE_READ);\r
1145 \r
1146         if (file >= 0)\r
1147         {\r
1148                 s = fgets(file);\r
1149                 while (s == "navnode")\r
1150                 {\r
1151                         f = 0;\r
1152                         pdst = -1;\r
1153                         pln = nullvector;\r
1154                         wborg = wbmaxs = wbmins = nullvector;\r
1155                         plane_storage.plane_chain = world;\r
1156                         sfl = 0;\r
1157                         tfl0 = tfl1 = tfl2 = tfl3 = tfl4 = tfl5 = tfl6 = tfl7 = tfl8 = tfl9 = 0;\r
1158                         tfl10 = tfl11 = tfl12 = tfl13 = tfl14 = tfl15 = tfl16 = tfl17 = tfl18 = tfl19 = 0;\r
1159                         rl0 = rl1 = rl2 = rl3 = rl4 = rl5 = rl6 = rl7 = rl8 = rl9 = -1;\r
1160                         rl10 = rl11 = rl12 = rl13 = rl14 = rl15 = rl16 = rl17 = rl18 = rl19 = -1;\r
1161                         s = fgets(file);\r
1162                         wborg = stov(s);\r
1163                         s = fgets(file);\r
1164                         wbmins = stov(s);\r
1165                         s = fgets(file);\r
1166                         wbmaxs = stov(s);\r
1167                         s = fgets(file);\r
1168                         while (s == "plane")\r
1169                         {\r
1170                                 s = fgets(file);\r
1171                                 pln = stov(s);\r
1172                                 s = fgets(file);\r
1173                                 pdst = stof(s);\r
1174                                 AddPlane(plane_storage, pln*-1, pdst);\r
1175                                 s = fgets(file);\r
1176                         }\r
1177                         while (substring(s, 0, 6) == "remote")\r
1178                         {\r
1179                                 length = strlen(s);\r
1180                                 f = stof(substring(s, 6, length));\r
1181                                 s = fgets(file);\r
1182                                 if (!f)\r
1183                                         rl0 = stof(s);\r
1184                                 else if (f == 1)\r
1185                                         rl1 = stof(s);\r
1186                                 else if (f == 2)\r
1187                                         rl2 = stof(s);\r
1188                                 else if (f == 3)\r
1189                                         rl3 = stof(s);\r
1190                                 else if (f == 4)\r
1191                                         rl4 = stof(s);\r
1192                                 else if (f == 5)\r
1193                                         rl5 = stof(s);\r
1194                                 else if (f == 6)\r
1195                                         rl6 = stof(s);\r
1196                                 else if (f == 7)\r
1197                                         rl7 = stof(s);\r
1198                                 else if (f == 8)\r
1199                                         rl8 = stof(s);\r
1200                                 else if (f == 9)\r
1201                                         rl9 = stof(s);\r
1202                                 else if (f == 10)\r
1203                                         rl10 = stof(s);\r
1204                                 else if (f == 11)\r
1205                                         rl11 = stof(s);\r
1206                                 else if (f == 12)\r
1207                                         rl12 = stof(s);\r
1208                                 else if (f == 13)\r
1209                                         rl13 = stof(s);\r
1210                                 else if (f == 14)\r
1211                                         rl14 = stof(s);\r
1212                                 else if (f == 15)\r
1213                                         rl15 = stof(s);\r
1214                                 else if (f == 16)\r
1215                                         rl16 = stof(s);\r
1216                                 else if (f == 17)\r
1217                                         rl17 = stof(s);\r
1218                                 else if (f == 18)\r
1219                                         rl18 = stof(s);\r
1220                                 else if (f == 19)\r
1221                                         rl19 = stof(s);\r
1222                                 s = fgets(file);\r
1223                         }\r
1224                         if (s == "sflags")\r
1225                         {\r
1226                                 s = fgets(file);\r
1227                                 sfl = stof(s);\r
1228                                 s = fgets(file);\r
1229                         }\r
1230                         while (substring(s, 0, 6) == "lflags")\r
1231                         {\r
1232                                 length = strlen(s);\r
1233                                 f = stof(substring(s, 6, length));\r
1234                                 s = fgets(file);\r
1235                                 if (!f)\r
1236                                         tfl0 = stof(s);\r
1237                                 else if (f == 1)\r
1238                                         tfl1 = stof(s);\r
1239                                 else if (f == 2)\r
1240                                         tfl2 = stof(s);\r
1241                                 else if (f == 3)\r
1242                                         tfl3 = stof(s);\r
1243                                 else if (f == 4)\r
1244                                         tfl4 = stof(s);\r
1245                                 else if (f == 5)\r
1246                                         tfl5 = stof(s);\r
1247                                 else if (f == 6)\r
1248                                         tfl6 = stof(s);\r
1249                                 else if (f == 7)\r
1250                                         tfl7 = stof(s);\r
1251                                 else if (f == 8)\r
1252                                         tfl8 = stof(s);\r
1253                                 else if (f == 9)\r
1254                                         tfl9 = stof(s);\r
1255                                 else if (f == 10)\r
1256                                         tfl10 = stof(s);\r
1257                                 else if (f == 11)\r
1258                                         tfl11 = stof(s);\r
1259                                 else if (f == 12)\r
1260                                         tfl12 = stof(s);\r
1261                                 else if (f == 13)\r
1262                                         tfl13 = stof(s);\r
1263                                 else if (f == 14)\r
1264                                         tfl14 = stof(s);\r
1265                                 else if (f == 15)\r
1266                                         tfl15 = stof(s);\r
1267                                 else if (f == 16)\r
1268                                         tfl16 = stof(s);\r
1269                                 else if (f == 17)\r
1270                                         tfl17 = stof(s);\r
1271                                 else if (f == 18)\r
1272                                         tfl18 = stof(s);\r
1273                                 else if (f == 19)\r
1274                                         tfl19 = stof(s);\r
1275                                 s = fgets(file);\r
1276                         }\r
1277                         e = SpawnNavNode(wborg, wbmins, wbmaxs);\r
1278                         if (plane_storage.plane_chain)\r
1279                                 e.plane_chain = plane_storage.plane_chain;\r
1280                         e.sflags = sfl;\r
1281                         e.lflags0 = tfl0;\r
1282                         e.lflags1 = tfl1;\r
1283                         e.lflags2 = tfl2;\r
1284                         e.lflags3 = tfl3;\r
1285                         e.lflags4 = tfl4;\r
1286                         e.lflags5 = tfl5;\r
1287                         e.lflags6 = tfl6;\r
1288                         e.lflags7 = tfl7;\r
1289                         e.lflags8 = tfl8;\r
1290                         e.lflags9 = tfl9;\r
1291                         e.lflags10 = tfl10;\r
1292                         e.lflags11 = tfl11;\r
1293                         e.lflags12 = tfl12;\r
1294                         e.lflags13 = tfl13;\r
1295                         e.lflags14 = tfl14;\r
1296                         e.lflags15 = tfl15;\r
1297                         e.lflags16 = tfl16;\r
1298                         e.lflags17 = tfl17;\r
1299                         e.lflags18 = tfl18;\r
1300                         e.lflags19 = tfl19;\r
1301                         if (rl0 > -1)\r
1302                         {\r
1303                                 newmis = spawn();\r
1304                                 newmis.classname = "remotelinker";\r
1305                                 newmis.delay = rl0;\r
1306                                 e.link0 = newmis;\r
1307                         }\r
1308                         if (rl1 > -1)\r
1309                         {\r
1310                                 newmis = spawn();\r
1311                                 newmis.classname = "remotelinker";\r
1312                                 newmis.delay = rl1;\r
1313                                 e.link1 = newmis;\r
1314                         }\r
1315                         if (rl2 > -1)\r
1316                         {\r
1317                                 newmis = spawn();\r
1318                                 newmis.classname = "remotelinker";\r
1319                                 newmis.delay = rl2;\r
1320                                 e.link2 = newmis;\r
1321                         }\r
1322                         if (rl3 > -1)\r
1323                         {\r
1324                                 newmis = spawn();\r
1325                                 newmis.classname = "remotelinker";\r
1326                                 newmis.delay = rl3;\r
1327                                 e.link3 = newmis;\r
1328                         }\r
1329                         if (rl4 > -1)\r
1330                         {\r
1331                                 newmis = spawn();\r
1332                                 newmis.classname = "remotelinker";\r
1333                                 newmis.delay = rl4;\r
1334                                 e.link4 = newmis;\r
1335                         }\r
1336                         if (rl5 > -1)\r
1337                         {\r
1338                                 newmis = spawn();\r
1339                                 newmis.classname = "remotelinker";\r
1340                                 newmis.delay = rl5;\r
1341                                 e.link5 = newmis;\r
1342                         }\r
1343                         if (rl6 > -1)\r
1344                         {\r
1345                                 newmis = spawn();\r
1346                                 newmis.classname = "remotelinker";\r
1347                                 newmis.delay = rl6;\r
1348                                 e.link6 = newmis;\r
1349                         }\r
1350                         if (rl7 > -1)\r
1351                         {\r
1352                                 newmis = spawn();\r
1353                                 newmis.classname = "remotelinker";\r
1354                                 newmis.delay = rl7;\r
1355                                 e.link7 = newmis;\r
1356                         }\r
1357                         if (rl8 > -1)\r
1358                         {\r
1359                                 newmis = spawn();\r
1360                                 newmis.classname = "remotelinker";\r
1361                                 newmis.delay = rl8;\r
1362                                 e.link8 = newmis;\r
1363                         }\r
1364                         if (rl9 > -1)\r
1365                         {\r
1366                                 newmis = spawn();\r
1367                                 newmis.classname = "remotelinker";\r
1368                                 newmis.delay = rl9;\r
1369                                 e.link9 = newmis;\r
1370                         }\r
1371                         if (rl10 > -1)\r
1372                         {\r
1373                                 newmis = spawn();\r
1374                                 newmis.classname = "remotelinker";\r
1375                                 newmis.delay = rl10;\r
1376                                 e.link10 = newmis;\r
1377                         }\r
1378                         if (rl11 > -1)\r
1379                         {\r
1380                                 newmis = spawn();\r
1381                                 newmis.classname = "remotelinker";\r
1382                                 newmis.delay = rl11;\r
1383                                 e.link11 = newmis;\r
1384                         }\r
1385                         if (rl12 > -1)\r
1386                         {\r
1387                                 newmis = spawn();\r
1388                                 newmis.classname = "remotelinker";\r
1389                                 newmis.delay = rl12;\r
1390                                 e.link12 = newmis;\r
1391                         }\r
1392                         if (rl13 > -1)\r
1393                         {\r
1394                                 newmis = spawn();\r
1395                                 newmis.classname = "remotelinker";\r
1396                                 newmis.delay = rl13;\r
1397                                 e.link13 = newmis;\r
1398                         }\r
1399                         if (rl14 > -1)\r
1400                         {\r
1401                                 newmis = spawn();\r
1402                                 newmis.classname = "remotelinker";\r
1403                                 newmis.delay = rl14;\r
1404                                 e.link14 = newmis;\r
1405                         }\r
1406                         if (rl15 > -1)\r
1407                         {\r
1408                                 newmis = spawn();\r
1409                                 newmis.classname = "remotelinker";\r
1410                                 newmis.delay = rl15;\r
1411                                 e.link15 = newmis;\r
1412                         }\r
1413                         if (rl16 > -1)\r
1414                         {\r
1415                                 newmis = spawn();\r
1416                                 newmis.classname = "remotelinker";\r
1417                                 newmis.delay = rl16;\r
1418                                 e.link16 = newmis;\r
1419                         }\r
1420                         if (rl17 > -1)\r
1421                         {\r
1422                                 newmis = spawn();\r
1423                                 newmis.classname = "remotelinker";\r
1424                                 newmis.delay = rl17;\r
1425                                 e.link17 = newmis;\r
1426                         }\r
1427                         if (rl18 > -1)\r
1428                         {\r
1429                                 newmis = spawn();\r
1430                                 newmis.classname = "remotelinker";\r
1431                                 newmis.delay = rl18;\r
1432                                 e.link18 = newmis;\r
1433                         }\r
1434                         if (rl19 > -1)\r
1435                         {\r
1436                                 newmis = spawn();\r
1437                                 newmis.classname = "remotelinker";\r
1438                                 newmis.delay = rl19;\r
1439                                 e.link19 = newmis;\r
1440                         }\r
1441                         FixPlanes(e);\r
1442                 }\r
1443                 fclose(file);\r
1444         }\r
1445         remove(plane_storage);\r
1446         plane_storage = world;\r
1447         LinkNavNodes();\r
1448 };\r
1449 \r
1450 void() SaveNavNodes =\r
1451 {\r
1452         local float file, length;\r
1453         local float tfl0, tfl1, tfl2, tfl3, tfl4, tfl5, tfl6, tfl7, tfl8, tfl9;\r
1454         local float tfl10, tfl11, tfl12, tfl13, tfl14, tfl15, tfl16, tfl17, tfl18, tfl19;\r
1455         local string s;\r
1456         local entity e, e2;\r
1457 \r
1458         length = strlen(world.model);\r
1459         length = length - 5;\r
1460         s = substring(world.model, 5, length);\r
1461         s = strcat(s, ".nnl");\r
1462 \r
1463         file = fopen(s, FILE_WRITE);\r
1464 \r
1465         if (file >= 0)\r
1466         {\r
1467                 e = navnode_chain;\r
1468                 while (e)\r
1469                 {\r
1470                         fputs(file, "navnode\n");\r
1471                         fputs(file, ftos(e.origin_x));\r
1472                         fputs(file, " ");\r
1473                         fputs(file, ftos(e.origin_y));\r
1474                         fputs(file, " ");\r
1475                         fputs(file, ftos(e.origin_z));\r
1476                         fputs(file, "\n");\r
1477                         fputs(file, ftos(e.mins_x));\r
1478                         fputs(file, " ");\r
1479                         fputs(file, ftos(e.mins_y));\r
1480                         fputs(file, " ");\r
1481                         fputs(file, ftos(e.mins_z));\r
1482                         fputs(file, "\n");\r
1483                         fputs(file, ftos(e.maxs_x));\r
1484                         fputs(file, " ");\r
1485                         fputs(file, ftos(e.maxs_y));\r
1486                         fputs(file, " ");\r
1487                         fputs(file, ftos(e.maxs_z));\r
1488                         fputs(file, "\n");\r
1489                         if (e.plane_chain)\r
1490                         {\r
1491                                 e2 = e.plane_chain;\r
1492                                 fputs(file, "plane\n");\r
1493                                 fputs(file, ftos(e2.mangle_x));\r
1494                                 fputs(file, " ");\r
1495                                 fputs(file, ftos(e2.mangle_y));\r
1496                                 fputs(file, " ");\r
1497                                 fputs(file, ftos(e2.mangle_z));\r
1498                                 fputs(file, "\n");\r
1499                                 fputs(file, ftos(e2.delay));\r
1500                                 fputs(file, "\n");\r
1501                                 e2 = e2.plane_next;\r
1502                                 while (e2 != e.plane_chain)\r
1503                                 {\r
1504                                         fputs(file, "plane\n");\r
1505                                         fputs(file, ftos(e2.mangle_x));\r
1506                                         fputs(file, " ");\r
1507                                         fputs(file, ftos(e2.mangle_y));\r
1508                                         fputs(file, " ");\r
1509                                         fputs(file, ftos(e2.mangle_z));\r
1510                                         fputs(file, "\n");\r
1511                                         fputs(file, ftos(e2.delay));\r
1512                                         fputs(file, "\n");\r
1513                                         e2 = e2.plane_next;\r
1514                                 }\r
1515                         }\r
1516                         if (e.lflags0 & LF_REMOTE)\r
1517                         {\r
1518                                 fputs(file, "remote0\n");\r
1519                                 fputs(file, ftos(e.link0.delay));\r
1520                                 fputs(file, "\n");\r
1521                         }\r
1522                         if (e.lflags1 & LF_REMOTE)\r
1523                         {\r
1524                                 fputs(file, "remote1\n");\r
1525                                 fputs(file, ftos(e.link1.delay));\r
1526                                 fputs(file, "\n");\r
1527                         }\r
1528                         if (e.lflags2 & LF_REMOTE)\r
1529                         {\r
1530                                 fputs(file, "remote2\n");\r
1531                                 fputs(file, ftos(e.link2.delay));\r
1532                                 fputs(file, "\n");\r
1533                         }\r
1534                         if (e.lflags3 & LF_REMOTE)\r
1535                         {\r
1536                                 fputs(file, "remote3\n");\r
1537                                 fputs(file, ftos(e.link3.delay));\r
1538                                 fputs(file, "\n");\r
1539                         }\r
1540                         if (e.lflags4 & LF_REMOTE)\r
1541                         {\r
1542                                 fputs(file, "remote4\n");\r
1543                                 fputs(file, ftos(e.link4.delay));\r
1544                                 fputs(file, "\n");\r
1545                         }\r
1546                         if (e.lflags5 & LF_REMOTE)\r
1547                         {\r
1548                                 fputs(file, "remote5\n");\r
1549                                 fputs(file, ftos(e.link5.delay));\r
1550                                 fputs(file, "\n");\r
1551                         }\r
1552                         if (e.lflags6 & LF_REMOTE)\r
1553                         {\r
1554                                 fputs(file, "remote6\n");\r
1555                                 fputs(file, ftos(e.link6.delay));\r
1556                                 fputs(file, "\n");\r
1557                         }\r
1558                         if (e.lflags7 & LF_REMOTE)\r
1559                         {\r
1560                                 fputs(file, "remote7\n");\r
1561                                 fputs(file, ftos(e.link7.delay));\r
1562                                 fputs(file, "\n");\r
1563                         }\r
1564                         if (e.lflags8 & LF_REMOTE)\r
1565                         {\r
1566                                 fputs(file, "remote8\n");\r
1567                                 fputs(file, ftos(e.link8.delay));\r
1568                                 fputs(file, "\n");\r
1569                         }\r
1570                         if (e.lflags9 & LF_REMOTE)\r
1571                         {\r
1572                                 fputs(file, "remote9\n");\r
1573                                 fputs(file, ftos(e.link9.delay));\r
1574                                 fputs(file, "\n");\r
1575                         }\r
1576                         if (e.lflags10 & LF_REMOTE)\r
1577                         {\r
1578                                 fputs(file, "remote10\n");\r
1579                                 fputs(file, ftos(e.link10.delay));\r
1580                                 fputs(file, "\n");\r
1581                         }\r
1582                         if (e.lflags11 & LF_REMOTE)\r
1583                         {\r
1584                                 fputs(file, "remote11\n");\r
1585                                 fputs(file, ftos(e.link11.delay));\r
1586                                 fputs(file, "\n");\r
1587                         }\r
1588                         if (e.lflags12 & LF_REMOTE)\r
1589                         {\r
1590                                 fputs(file, "remote12\n");\r
1591                                 fputs(file, ftos(e.link12.delay));\r
1592                                 fputs(file, "\n");\r
1593                         }\r
1594                         if (e.lflags13 & LF_REMOTE)\r
1595                         {\r
1596                                 fputs(file, "remote13\n");\r
1597                                 fputs(file, ftos(e.link13.delay));\r
1598                                 fputs(file, "\n");\r
1599                         }\r
1600                         if (e.lflags14 & LF_REMOTE)\r
1601                         {\r
1602                                 fputs(file, "remote14\n");\r
1603                                 fputs(file, ftos(e.link14.delay));\r
1604                                 fputs(file, "\n");\r
1605                         }\r
1606                         if (e.lflags15 & LF_REMOTE)\r
1607                         {\r
1608                                 fputs(file, "remote15\n");\r
1609                                 fputs(file, ftos(e.link15.delay));\r
1610                                 fputs(file, "\n");\r
1611                         }\r
1612                         if (e.lflags16 & LF_REMOTE)\r
1613                         {\r
1614                                 fputs(file, "remote16\n");\r
1615                                 fputs(file, ftos(e.link16.delay));\r
1616                                 fputs(file, "\n");\r
1617                         }\r
1618                         if (e.lflags17 & LF_REMOTE)\r
1619                         {\r
1620                                 fputs(file, "remote17\n");\r
1621                                 fputs(file, ftos(e.link17.delay));\r
1622                                 fputs(file, "\n");\r
1623                         }\r
1624                         if (e.lflags18 & LF_REMOTE)\r
1625                         {\r
1626                                 fputs(file, "remote18\n");\r
1627                                 fputs(file, ftos(e.link18.delay));\r
1628                                 fputs(file, "\n");\r
1629                         }\r
1630                         if (e.lflags19 & LF_REMOTE)\r
1631                         {\r
1632                                 fputs(file, "remote19\n");\r
1633                                 fputs(file, ftos(e.link19.delay));\r
1634                                 fputs(file, "\n");\r
1635                         }\r
1636                         tfl0 = e.lflags0 - (e.lflags0 & LF_REMOTE);\r
1637                         tfl1 = e.lflags1 - (e.lflags1 & LF_REMOTE);\r
1638                         tfl2 = e.lflags2 - (e.lflags2 & LF_REMOTE);\r
1639                         tfl3 = e.lflags3 - (e.lflags3 & LF_REMOTE);\r
1640                         tfl4 = e.lflags4 - (e.lflags4 & LF_REMOTE);\r
1641                         tfl5 = e.lflags5 - (e.lflags5 & LF_REMOTE);\r
1642                         tfl6 = e.lflags6 - (e.lflags6 & LF_REMOTE);\r
1643                         tfl7 = e.lflags7 - (e.lflags7 & LF_REMOTE);\r
1644                         tfl8 = e.lflags8 - (e.lflags8 & LF_REMOTE);\r
1645                         tfl9 = e.lflags9 - (e.lflags9 & LF_REMOTE);\r
1646                         tfl10 = e.lflags10 - (e.lflags10 & LF_REMOTE);\r
1647                         tfl11 = e.lflags11 - (e.lflags11 & LF_REMOTE);\r
1648                         tfl12 = e.lflags12 - (e.lflags12 & LF_REMOTE);\r
1649                         tfl13 = e.lflags13 - (e.lflags13 & LF_REMOTE);\r
1650                         tfl14 = e.lflags14 - (e.lflags14 & LF_REMOTE);\r
1651                         tfl15 = e.lflags15 - (e.lflags15 & LF_REMOTE);\r
1652                         tfl16 = e.lflags16 - (e.lflags16 & LF_REMOTE);\r
1653                         tfl17 = e.lflags17 - (e.lflags17 & LF_REMOTE);\r
1654                         tfl18 = e.lflags18 - (e.lflags18 & LF_REMOTE);\r
1655                         tfl19 = e.lflags19 - (e.lflags19 & LF_REMOTE);\r
1656                         if (e.sflags)\r
1657                         {\r
1658                                 fputs(file, "sflags\n");\r
1659                                 fputs(file, ftos(e.sflags));\r
1660                                 fputs(file, "\n");\r
1661                         }\r
1662                         if (tfl0)\r
1663                         {\r
1664                                 fputs(file, "lflags0\n");\r
1665                                 fputs(file, ftos(tfl0));\r
1666                                 fputs(file, "\n");\r
1667                         }\r
1668                         if (tfl1)\r
1669                         {\r
1670                                 fputs(file, "lflags1\n");\r
1671                                 fputs(file, ftos(tfl1));\r
1672                                 fputs(file, "\n");\r
1673                         }\r
1674                         if (tfl2)\r
1675                         {\r
1676                                 fputs(file, "lflags2\n");\r
1677                                 fputs(file, ftos(tfl2));\r
1678                                 fputs(file, "\n");\r
1679                         }\r
1680                         if (tfl3)\r
1681                         {\r
1682                                 fputs(file, "lflags3\n");\r
1683                                 fputs(file, ftos(tfl3));\r
1684                                 fputs(file, "\n");\r
1685                         }\r
1686                         if (tfl4)\r
1687                         {\r
1688                                 fputs(file, "lflags4\n");\r
1689                                 fputs(file, ftos(tfl4));\r
1690                                 fputs(file, "\n");\r
1691                         }\r
1692                         if (tfl5)\r
1693                         {\r
1694                                 fputs(file, "lflags5\n");\r
1695                                 fputs(file, ftos(tfl5));\r
1696                                 fputs(file, "\n");\r
1697                         }\r
1698                         if (tfl6)\r
1699                         {\r
1700                                 fputs(file, "lflags6\n");\r
1701                                 fputs(file, ftos(tfl6));\r
1702                                 fputs(file, "\n");\r
1703                         }\r
1704                         if (tfl7)\r
1705                         {\r
1706                                 fputs(file, "lflags7\n");\r
1707                                 fputs(file, ftos(tfl7));\r
1708                                 fputs(file, "\n");\r
1709                         }\r
1710                         if (tfl8)\r
1711                         {\r
1712                                 fputs(file, "lflags8\n");\r
1713                                 fputs(file, ftos(tfl8));\r
1714                                 fputs(file, "\n");\r
1715                         }\r
1716                         if (tfl9)\r
1717                         {\r
1718                                 fputs(file, "lflags9\n");\r
1719                                 fputs(file, ftos(tfl9));\r
1720                                 fputs(file, "\n");\r
1721                         }\r
1722                         if (tfl10)\r
1723                         {\r
1724                                 fputs(file, "lflags10\n");\r
1725                                 fputs(file, ftos(tfl10));\r
1726                                 fputs(file, "\n");\r
1727                         }\r
1728                         if (tfl11)\r
1729                         {\r
1730                                 fputs(file, "lflags11\n");\r
1731                                 fputs(file, ftos(tfl11));\r
1732                                 fputs(file, "\n");\r
1733                         }\r
1734                         if (tfl12)\r
1735                         {\r
1736                                 fputs(file, "lflags12\n");\r
1737                                 fputs(file, ftos(tfl12));\r
1738                                 fputs(file, "\n");\r
1739                         }\r
1740                         if (tfl13)\r
1741                         {\r
1742                                 fputs(file, "lflags13\n");\r
1743                                 fputs(file, ftos(tfl13));\r
1744                                 fputs(file, "\n");\r
1745                         }\r
1746                         if (tfl14)\r
1747                         {\r
1748                                 fputs(file, "lflags14\n");\r
1749                                 fputs(file, ftos(tfl14));\r
1750                                 fputs(file, "\n");\r
1751                         }\r
1752                         if (tfl15)\r
1753                         {\r
1754                                 fputs(file, "lflags15\n");\r
1755                                 fputs(file, ftos(tfl15));\r
1756                                 fputs(file, "\n");\r
1757                         }\r
1758                         if (tfl16)\r
1759                         {\r
1760                                 fputs(file, "lflags16\n");\r
1761                                 fputs(file, ftos(tfl16));\r
1762                                 fputs(file, "\n");\r
1763                         }\r
1764                         if (tfl17)\r
1765                         {\r
1766                                 fputs(file, "lflags17\n");\r
1767                                 fputs(file, ftos(tfl17));\r
1768                                 fputs(file, "\n");\r
1769                         }\r
1770                         if (tfl18)\r
1771                         {\r
1772                                 fputs(file, "lflags18\n");\r
1773                                 fputs(file, ftos(tfl18));\r
1774                                 fputs(file, "\n");\r
1775                         }\r
1776                         if (tfl19)\r
1777                         {\r
1778                                 fputs(file, "lflags19\n");\r
1779                                 fputs(file, ftos(tfl19));\r
1780                                 fputs(file, "\n");\r
1781                         }\r
1782                         e = e.list;\r
1783                 }\r
1784         }\r
1785         fclose(file);\r
1786 };