3 float(vector m1, vector m2, vector m3, vector m4) boxesoverlap =
\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
8 float(entity e, vector start, vector m1, vector m2, vector end) tracewalk =
\r
12 local vector nostependpos;
\r
14 local float totaldist;
\r
15 local float stepdist;
\r
17 local float ignorehazards;
\r
19 local float nostepfrac;
\r
20 local entity saveself;
\r
23 dist = totaldist = vlen(move);
\r
24 dir = normalize(move);
\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
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
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
51 if (boxesoverlap(end, end, self.absmin, self.absmax))
\r
59 if (stepdist > dist)
\r
61 dist = dist - stepdist;
\r
65 p = pointcontents(self.origin);
\r
66 if (p == CONTENT_LAVA || p == CONTENT_SLIME)
\r
69 // hazards blocking path
\r
74 p = pointcontents(self.origin);
\r
75 if (p != CONTENT_EMPTY)
\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
85 setorigin(self, trace_endpos);
\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
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
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
114 if (nostepfrac >= 0.001)
\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
131 // moved but didn't arrive at the intended destination
\r
135 entity(entity start, vector org, float mode) FindCurrentNavNode =
\r
137 local float f, best_f;
\r
138 local entity e, best_e;
\r
142 if (mode == M_OVERLAP)
\r
144 if (start.classname == "navnode")
\r
150 if (boxesoverlap(org, org, e.origin + e.mins, e.origin + e.maxs))
\r
155 else if (mode == M_CLOSEST)
\r
157 if (start.classname == "navnode")
\r
163 f = vlen(org - e.origin);
\r
176 vector(vector org) SnapToGrid =
\r
179 local vector rl, rh, t1, t2, ret;
\r
181 grid = self.gridsize;
\r
185 while (rh_x > org_x)
\r
186 rh_x = rh_x - grid;
\r
190 while (rh_x < org_x)
\r
191 rh_x = rh_x + grid;
\r
195 while (rh_y > org_y)
\r
196 rh_y = rh_y - grid;
\r
200 while (rh_y < org_y)
\r
201 rh_y = rh_y + grid;
\r
205 while (rh_z > org_z)
\r
206 rh_z = rh_z - grid;
\r
210 while (rh_z < org_z)
\r
211 rh_z = rh_z + grid;
\r
215 rl_x = rh_x + grid;
\r
217 rl_x = rh_x - grid;
\r
219 rl_y = rh_y + grid;
\r
221 rl_y = rh_y - grid;
\r
223 rl_z = rh_z + grid;
\r
225 rl_z = rh_z - grid;
\r
236 org_x = org_x * -1;
\r
238 org_y = org_y * -1;
\r
240 org_z = org_z * -1;
\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
260 t2_x = org_x - t2_x;
\r
261 t2_y = org_y - t2_y;
\r
262 t2_z = org_z - t2_z;
\r
294 void(entity navn) FixPlanes =
\r
300 e = navn.plane_chain;
\r
303 setorigin(e, navn.origin + e.mangle*e.delay);
\r
305 while (e != navn.plane_chain)
\r
307 setorigin(e, navn.origin + e.mangle*e.delay);
\r
313 void(entity navn, vector org) MoveNavNode =
\r
319 setorigin(navn, org);
\r
324 float(entity navn, float ax, float amount) ResizeNavNode =
\r
333 amount = amount - navn.origin_x;
\r
335 amount = amount*-1;
\r
336 amount = amount - navn.maxs_x;
\r
338 v_x = v_x + (amount*0.5);
\r
339 setsize(navn, v*-1, v);
\r
341 if (self.origin_x < navn.origin_x)
\r
342 v_x = navn.origin_x - (amount*0.5);
\r
344 v_x = navn.origin_x + (amount*0.5);
\r
345 MoveNavNode(navn, v);
\r
349 amount = amount - navn.origin_y;
\r
351 amount = amount*-1;
\r
352 amount = amount - navn.maxs_y;
\r
354 v_y = v_y + (amount*0.5);
\r
355 setsize(navn, v*-1, v);
\r
357 if (self.origin_y < navn.origin_y)
\r
358 v_y = navn.origin_y - (amount*0.5);
\r
360 v_y = navn.origin_y + (amount*0.5);
\r
361 MoveNavNode(navn, v);
\r
365 amount = amount - navn.origin_z;
\r
367 amount = amount*-1;
\r
368 amount = amount - navn.maxs_z;
\r
370 v_z = v_z + (amount*0.5);
\r
371 setsize(navn, v*-1, v);
\r
373 if (self.origin_z < navn.origin_z)
\r
374 v_z = navn.origin_z - (amount*0.5);
\r
376 v_z = navn.origin_z + (amount*0.5);
\r
377 MoveNavNode(navn, v);
\r
383 void(entity navn, vector normal, float dist) AddPlane =
\r
391 newmis.classname = "plane";
\r
392 if (!navn.plane_chain)
\r
394 navn.plane_chain = newmis;
\r
395 newmis.plane_next = newmis;
\r
396 newmis.plane_prev = newmis;
\r
400 newmis.plane_next = navn.plane_chain;
\r
401 newmis.plane_prev = newmis.plane_next.plane_prev;
\r
402 newmis.plane_prev.plane_next = newmis;
\r
403 newmis.plane_next.plane_prev = newmis;
\r
405 newmis.mangle = normal*-1;
\r
406 newmis.delay = dist;
\r
407 f = (navn.origin * newmis.mangle) - ((navn.origin + (newmis.delay * newmis.mangle)) * newmis.mangle);
\r
410 newmis.mangle = newmis.mangle*-1;
\r
411 newmis.delay = newmis.delay*-1;
\r
413 setorigin (newmis, navn.origin + newmis.mangle*newmis.delay);
\r
414 setmodel (newmis, "progs/plane.mdl");
\r
415 newmis.angles = vectoangles(newmis.mangle);
\r
416 newmis.effects = EF_NODRAW;
\r
419 void(entity navn, entity delplane) RemovePlane =
\r
423 e = navn.plane_chain;
\r
428 if (navn.plane_chain == e)
\r
429 navn.plane_chain = e.plane_next;
\r
430 e.plane_prev.plane_next = e.plane_next;
\r
431 e.plane_next.plane_prev = e.plane_prev;
\r
433 e = navn.plane_chain;
\r
436 while (e != navn.plane_chain)
\r
440 if (navn.plane_chain == e)
\r
441 navn.plane_chain = e.plane_next;
\r
442 e.plane_prev.plane_next = e.plane_next;
\r
443 e.plane_next.plane_prev = e.plane_prev;
\r
445 e = navn.plane_chain;
\r
449 if (navn.plane_chain.origin == nullvector)
\r
450 navn.plane_chain = world;
\r
454 void() RemoveClippoints =
\r
456 if (self.clippoint1)
\r
458 if (self.clippoint2)
\r
460 if (self.clippoint3)
\r
461 remove (self.clippoint3);
\r
462 remove (self.clippoint2);
\r
464 remove (self.clippoint1);
\r
466 self.current_clippoint = world;
\r
467 self.clippoint1 = self.clippoint2 = self.clippoint3 = world;
\r
470 void() ClippointThink =
\r
474 self.nextthink = time + 0.1;
\r
476 p = pointcontents(self.origin);
\r
477 if (p == CONTENT_SOLID)
\r
478 self.effects = EF_NODEPTHTEST | EF_ADDITIVE;
\r
483 void(vector org) SpawnClipPoint =
\r
485 if (self.clippoint1)
\r
487 if (self.clippoint2)
\r
489 if (self.clippoint3)
\r
493 self.clippoint3 = spawn();
\r
494 setmodel(self.clippoint3, "progs/point.spr");
\r
495 setsize(self.clippoint3, '0 0 0', '0 0 0');
\r
496 self.clippoint3.classname = "clippoint";
\r
497 self.clippoint3.scale = 0.5;
\r
498 setorigin(self.clippoint3, org);
\r
499 self.clippoint3.think = ClippointThink;
\r
500 self.clippoint3.nextthink = time;
\r
505 self.clippoint2 = spawn();
\r
506 setmodel(self.clippoint2, "progs/point.spr");
\r
507 setsize(self.clippoint2, '0 0 0', '0 0 0');
\r
508 self.clippoint2.classname = "clippoint";
\r
509 self.clippoint2.scale = 0.5;
\r
510 setorigin(self.clippoint2, org);
\r
511 self.clippoint2.think = ClippointThink;
\r
512 self.clippoint2.nextthink = time;
\r
517 self.clippoint1 = spawn();
\r
518 setmodel(self.clippoint1, "progs/point.spr");
\r
519 setsize(self.clippoint1, '0 0 0', '0 0 0');
\r
520 self.clippoint1.classname = "clippoint";
\r
521 self.clippoint1.scale = 0.5;
\r
522 setorigin(self.clippoint1, org);
\r
523 self.clippoint1.think = ClippointThink;
\r
524 self.clippoint1.nextthink = time;
\r
528 entity(vector org, vector nnmins, vector nnmaxs) SpawnNavNode =
\r
531 setmodel(newmis, "progs/navnode.spr");
\r
532 setsize(newmis, nnmins, nnmaxs);
\r
533 newmis.classname = "navnode";
\r
535 setorigin(newmis, org);
\r
539 void() LinkNavNodes =
\r
543 navnode_chain = world;
\r
546 e = findchain(classname, "navnode");
\r
549 e.list = navnode_chain;
\r
551 e.delay = navnodes;
\r
552 navnodes = navnodes + 1;
\r
561 e.link0.effects = 0;
\r
562 e.link0.frame = 20;
\r
563 if (e.link0.classname == "remotelinker")
\r
565 e.link0.think = SUB_Remove;
\r
566 e.link0.nextthink = time;
\r
570 if (t.delay == e.link0.delay)
\r
574 e.lflags0 = e.lflags0 | LF_REMOTE;
\r
578 if (!(e.lflags0 & LF_REMOTE))
\r
579 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link0.origin + e.link0.mins, e.link0.origin + e.link0.maxs))
\r
585 e.link1.effects = 0;
\r
586 e.link1.frame = 20;
\r
587 if (e.link1.classname == "remotelinker")
\r
589 e.link1.think = SUB_Remove;
\r
590 e.link1.nextthink = time;
\r
594 if (t.delay == e.link1.delay)
\r
598 e.lflags1 = e.lflags1 | LF_REMOTE;
\r
602 if (!(e.lflags1 & LF_REMOTE))
\r
603 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link1.origin + e.link1.mins, e.link1.origin + e.link1.maxs))
\r
609 e.link2.effects = 0;
\r
610 e.link2.frame = 20;
\r
611 if (e.link2.classname == "remotelinker")
\r
613 e.link2.think = SUB_Remove;
\r
614 e.link2.nextthink = time;
\r
618 if (t.delay == e.link2.delay)
\r
622 e.lflags2 = e.lflags2 | LF_REMOTE;
\r
626 if (!(e.lflags2 & LF_REMOTE))
\r
627 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link2.origin + e.link2.mins, e.link2.origin + e.link2.maxs))
\r
633 e.link3.effects = 0;
\r
634 e.link3.frame = 20;
\r
635 if (e.link3.classname == "remotelinker")
\r
637 e.link3.think = SUB_Remove;
\r
638 e.link3.nextthink = time;
\r
642 if (t.delay == e.link3.delay)
\r
646 e.lflags3 = e.lflags3 | LF_REMOTE;
\r
650 if (!(e.lflags3 & LF_REMOTE))
\r
651 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link3.origin + e.link3.mins, e.link3.origin + e.link3.maxs))
\r
657 e.link4.effects = 0;
\r
658 e.link4.frame = 20;
\r
659 if (e.link4.classname == "remotelinker")
\r
661 e.link4.think = SUB_Remove;
\r
662 e.link4.nextthink = time;
\r
666 if (t.delay == e.link4.delay)
\r
670 e.lflags4 = e.lflags4 | LF_REMOTE;
\r
674 if (!(e.lflags4 & LF_REMOTE))
\r
675 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link4.origin + e.link4.mins, e.link4.origin + e.link4.maxs))
\r
681 e.link5.effects = 0;
\r
682 e.link5.frame = 20;
\r
683 if (e.link5.classname == "remotelinker")
\r
685 e.link5.think = SUB_Remove;
\r
686 e.link5.nextthink = time;
\r
690 if (t.delay == e.link5.delay)
\r
694 e.lflags5 = e.lflags5 | LF_REMOTE;
\r
698 if (!(e.lflags5 & LF_REMOTE))
\r
699 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link5.origin + e.link5.mins, e.link5.origin + e.link5.maxs))
\r
705 e.link6.effects = 0;
\r
706 e.link6.frame = 20;
\r
707 if (e.link6.classname == "remotelinker")
\r
709 e.link6.think = SUB_Remove;
\r
710 e.link6.nextthink = time;
\r
714 if (t.delay == e.link6.delay)
\r
718 e.lflags6 = e.lflags6 | LF_REMOTE;
\r
722 if (!(e.lflags6 & LF_REMOTE))
\r
723 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link6.origin + e.link6.mins, e.link6.origin + e.link6.maxs))
\r
729 e.link7.effects = 0;
\r
730 e.link7.frame = 20;
\r
731 if (e.link7.classname == "remotelinker")
\r
733 e.link7.think = SUB_Remove;
\r
734 e.link7.nextthink = time;
\r
738 if (t.delay == e.link7.delay)
\r
742 e.lflags7 = e.lflags7 | LF_REMOTE;
\r
746 if (!(e.lflags7 & LF_REMOTE))
\r
747 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link7.origin + e.link7.mins, e.link7.origin + e.link7.maxs))
\r
753 e.link8.effects = 0;
\r
754 e.link8.frame = 20;
\r
755 if (e.link8.classname == "remotelinker")
\r
757 e.link8.think = SUB_Remove;
\r
758 e.link8.nextthink = time;
\r
762 if (t.delay == e.link8.delay)
\r
766 e.lflags8 = e.lflags8 | LF_REMOTE;
\r
770 if (!(e.lflags8 & LF_REMOTE))
\r
771 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link8.origin + e.link8.mins, e.link8.origin + e.link8.maxs))
\r
777 e.link9.effects = 0;
\r
778 e.link9.frame = 20;
\r
779 if (e.link9.classname == "remotelinker")
\r
781 e.link9.think = SUB_Remove;
\r
782 e.link9.nextthink = time;
\r
786 if (t.delay == e.link9.delay)
\r
790 e.lflags9 = e.lflags9 | LF_REMOTE;
\r
794 if (!(e.lflags9 & LF_REMOTE))
\r
795 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link9.origin + e.link9.mins, e.link9.origin + e.link9.maxs))
\r
801 e.link10.effects = 0;
\r
802 e.link10.frame = 20;
\r
803 if (e.link10.classname == "remotelinker")
\r
805 e.link10.think = SUB_Remove;
\r
806 e.link10.nextthink = time;
\r
810 if (t.delay == e.link10.delay)
\r
814 e.lflags10 = e.lflags10 | LF_REMOTE;
\r
818 if (!(e.lflags10 & LF_REMOTE))
\r
819 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link10.origin + e.link10.mins, e.link10.origin + e.link10.maxs))
\r
825 e.link11.effects = 0;
\r
826 e.link11.frame = 20;
\r
827 if (e.link11.classname == "remotelinker")
\r
829 e.link11.think = SUB_Remove;
\r
830 e.link11.nextthink = time;
\r
834 if (t.delay == e.link11.delay)
\r
838 e.lflags11 = e.lflags11 | LF_REMOTE;
\r
842 if (!(e.lflags11 & LF_REMOTE))
\r
843 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link11.origin + e.link11.mins, e.link11.origin + e.link11.maxs))
\r
849 e.link12.effects = 0;
\r
850 e.link12.frame = 20;
\r
851 if (e.link12.classname == "remotelinker")
\r
853 e.link12.think = SUB_Remove;
\r
854 e.link12.nextthink = time;
\r
858 if (t.delay == e.link12.delay)
\r
862 e.lflags12 = e.lflags12 | LF_REMOTE;
\r
866 if (!(e.lflags12 & LF_REMOTE))
\r
867 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link12.origin + e.link12.mins, e.link12.origin + e.link12.maxs))
\r
873 e.link13.effects = 0;
\r
874 e.link13.frame = 20;
\r
875 if (e.link13.classname == "remotelinker")
\r
877 e.link13.think = SUB_Remove;
\r
878 e.link13.nextthink = time;
\r
882 if (t.delay == e.link13.delay)
\r
886 e.lflags13 = e.lflags13 | LF_REMOTE;
\r
890 if (!(e.lflags13 & LF_REMOTE))
\r
891 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link13.origin + e.link13.mins, e.link13.origin + e.link13.maxs))
\r
897 e.link14.effects = 0;
\r
898 e.link14.frame = 20;
\r
899 if (e.link14.classname == "remotelinker")
\r
901 e.link14.think = SUB_Remove;
\r
902 e.link14.nextthink = time;
\r
906 if (t.delay == e.link14.delay)
\r
910 e.lflags14 = e.lflags14 | LF_REMOTE;
\r
914 if (!(e.lflags14 & LF_REMOTE))
\r
915 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link14.origin + e.link14.mins, e.link14.origin + e.link14.maxs))
\r
921 e.link15.effects = 0;
\r
922 e.link15.frame = 20;
\r
923 if (e.link15.classname == "remotelinker")
\r
925 e.link15.think = SUB_Remove;
\r
926 e.link15.nextthink = time;
\r
930 if (t.delay == e.link15.delay)
\r
934 e.lflags15 = e.lflags15 | LF_REMOTE;
\r
938 if (!(e.lflags15 & LF_REMOTE))
\r
939 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link15.origin + e.link15.mins, e.link15.origin + e.link15.maxs))
\r
945 e.link16.effects = 0;
\r
946 e.link16.frame = 20;
\r
947 if (e.link16.classname == "remotelinker")
\r
949 e.link16.think = SUB_Remove;
\r
950 e.link16.nextthink = time;
\r
954 if (t.delay == e.link16.delay)
\r
958 e.lflags16 = e.lflags16 | LF_REMOTE;
\r
962 if (!(e.lflags16 & LF_REMOTE))
\r
963 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link16.origin + e.link16.mins, e.link16.origin + e.link16.maxs))
\r
969 e.link17.effects = 0;
\r
970 e.link17.frame = 20;
\r
971 if (e.link17.classname == "remotelinker")
\r
973 e.link17.think = SUB_Remove;
\r
974 e.link17.nextthink = time;
\r
978 if (t.delay == e.link17.delay)
\r
982 e.lflags17 = e.lflags17 | LF_REMOTE;
\r
986 if (!(e.lflags17 & LF_REMOTE))
\r
987 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link17.origin + e.link17.mins, e.link17.origin + e.link17.maxs))
\r
993 e.link18.effects = 0;
\r
994 e.link18.frame = 20;
\r
995 if (e.link18.classname == "remotelinker")
\r
997 e.link18.think = SUB_Remove;
\r
998 e.link18.nextthink = time;
\r
1002 if (t.delay == e.link18.delay)
\r
1006 e.lflags18 = e.lflags18 | LF_REMOTE;
\r
1010 if (!(e.lflags18 & LF_REMOTE))
\r
1011 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link18.origin + e.link18.mins, e.link18.origin + e.link18.maxs))
\r
1017 e.link19.effects = 0;
\r
1018 e.link19.frame = 20;
\r
1019 if (e.link19.classname == "remotelinker")
\r
1021 e.link19.think = SUB_Remove;
\r
1022 e.link19.nextthink = time;
\r
1023 t = navnode_chain;
\r
1026 if (t.delay == e.link19.delay)
\r
1030 e.lflags19 = e.lflags19 | LF_REMOTE;
\r
1034 if (!(e.lflags19 & LF_REMOTE))
\r
1035 if (!boxesoverlap(e.origin + e.mins, e.origin + e.maxs, e.link19.origin + e.link19.mins, e.link19.origin + e.link19.maxs))
\r
1041 e = navnode_chain;
\r
1044 t = navnode_chain;
\r
1047 if (boxesoverlap(e.origin + e.mins, e.origin + e.maxs, t.origin + t.mins, t.origin + t.maxs))
\r
1059 if (t != e.link10)
\r
1060 if (t != e.link11)
\r
1061 if (t != e.link12)
\r
1062 if (t != e.link13)
\r
1063 if (t != e.link14)
\r
1064 if (t != e.link15)
\r
1065 if (t != e.link16)
\r
1066 if (t != e.link17)
\r
1067 if (t != e.link18)
\r
1068 if (t != e.link19)
\r
1072 else if (!e.link1)
\r
1074 else if (!e.link2)
\r
1076 else if (!e.link3)
\r
1078 else if (!e.link4)
\r
1080 else if (!e.link5)
\r
1082 else if (!e.link6)
\r
1084 else if (!e.link7)
\r
1086 else if (!e.link8)
\r
1088 else if (!e.link9)
\r
1090 else if (!e.link10)
\r
1092 else if (!e.link11)
\r
1094 else if (!e.link12)
\r
1096 else if (!e.link13)
\r
1098 else if (!e.link14)
\r
1100 else if (!e.link15)
\r
1102 else if (!e.link16)
\r
1104 else if (!e.link17)
\r
1106 else if (!e.link18)
\r
1108 else if (!e.link19)
\r
1111 dprint("WARNING: Too many linking NavNodes!\n");
\r
1119 void() LoadNavNodes =
\r
1121 local float f, file, length;
\r
1124 local float tfl0, tfl1, tfl2, tfl3, tfl4, tfl5, tfl6, tfl7, tfl8, tfl9;
\r
1125 local float tfl10, tfl11, tfl12, tfl13, tfl14, tfl15, tfl16, tfl17, tfl18, tfl19;
\r
1127 local float rl0, rl1, rl2, rl3, rl4, rl5, rl6, rl7, rl8, rl9;
\r
1128 local float rl10, rl11, rl12, rl13, rl14, rl15, rl16, rl17, rl18, rl19;
\r
1130 local vector wborg, wbmaxs, wbmins;
\r
1131 local entity e, plane_storage;
\r
1135 dprint("NavNodes present, map needs to be reloaded to load navnode-file\n");
\r
1139 plane_storage = spawn();
\r
1141 length = strlen(world.model);
\r
1142 length = length - 5;
\r
1143 s = substring(world.model, 5, length);
\r
1144 s = strcat(s, ".nnl");
\r
1146 file = fopen(s, FILE_READ);
\r
1151 while (s == "navnode")
\r
1156 wborg = wbmaxs = wbmins = nullvector;
\r
1157 plane_storage.plane_chain = world;
\r
1159 tfl0 = tfl1 = tfl2 = tfl3 = tfl4 = tfl5 = tfl6 = tfl7 = tfl8 = tfl9 = 0;
\r
1160 tfl10 = tfl11 = tfl12 = tfl13 = tfl14 = tfl15 = tfl16 = tfl17 = tfl18 = tfl19 = 0;
\r
1161 rl0 = rl1 = rl2 = rl3 = rl4 = rl5 = rl6 = rl7 = rl8 = rl9 = -1;
\r
1162 rl10 = rl11 = rl12 = rl13 = rl14 = rl15 = rl16 = rl17 = rl18 = rl19 = -1;
\r
1170 while (s == "plane")
\r
1176 AddPlane(plane_storage, pln*-1, pdst);
\r
1179 while (substring(s, 0, 6) == "remote")
\r
1181 length = strlen(s);
\r
1182 f = stof(substring(s, 6, length));
\r
1226 if (s == "sflags")
\r
1232 while (substring(s, 0, 6) == "lflags")
\r
1234 length = strlen(s);
\r
1235 f = stof(substring(s, 6, length));
\r
1279 e = SpawnNavNode(wborg, wbmins, wbmaxs);
\r
1280 if (plane_storage.plane_chain)
\r
1281 e.plane_chain = plane_storage.plane_chain;
\r
1293 e.lflags10 = tfl10;
\r
1294 e.lflags11 = tfl11;
\r
1295 e.lflags12 = tfl12;
\r
1296 e.lflags13 = tfl13;
\r
1297 e.lflags14 = tfl14;
\r
1298 e.lflags15 = tfl15;
\r
1299 e.lflags16 = tfl16;
\r
1300 e.lflags17 = tfl17;
\r
1301 e.lflags18 = tfl18;
\r
1302 e.lflags19 = tfl19;
\r
1306 newmis.classname = "remotelinker";
\r
1307 newmis.delay = rl0;
\r
1313 newmis.classname = "remotelinker";
\r
1314 newmis.delay = rl1;
\r
1320 newmis.classname = "remotelinker";
\r
1321 newmis.delay = rl2;
\r
1327 newmis.classname = "remotelinker";
\r
1328 newmis.delay = rl3;
\r
1334 newmis.classname = "remotelinker";
\r
1335 newmis.delay = rl4;
\r
1341 newmis.classname = "remotelinker";
\r
1342 newmis.delay = rl5;
\r
1348 newmis.classname = "remotelinker";
\r
1349 newmis.delay = rl6;
\r
1355 newmis.classname = "remotelinker";
\r
1356 newmis.delay = rl7;
\r
1362 newmis.classname = "remotelinker";
\r
1363 newmis.delay = rl8;
\r
1369 newmis.classname = "remotelinker";
\r
1370 newmis.delay = rl9;
\r
1376 newmis.classname = "remotelinker";
\r
1377 newmis.delay = rl10;
\r
1378 e.link10 = newmis;
\r
1383 newmis.classname = "remotelinker";
\r
1384 newmis.delay = rl11;
\r
1385 e.link11 = newmis;
\r
1390 newmis.classname = "remotelinker";
\r
1391 newmis.delay = rl12;
\r
1392 e.link12 = newmis;
\r
1397 newmis.classname = "remotelinker";
\r
1398 newmis.delay = rl13;
\r
1399 e.link13 = newmis;
\r
1404 newmis.classname = "remotelinker";
\r
1405 newmis.delay = rl14;
\r
1406 e.link14 = newmis;
\r
1411 newmis.classname = "remotelinker";
\r
1412 newmis.delay = rl15;
\r
1413 e.link15 = newmis;
\r
1418 newmis.classname = "remotelinker";
\r
1419 newmis.delay = rl16;
\r
1420 e.link16 = newmis;
\r
1425 newmis.classname = "remotelinker";
\r
1426 newmis.delay = rl17;
\r
1427 e.link17 = newmis;
\r
1432 newmis.classname = "remotelinker";
\r
1433 newmis.delay = rl18;
\r
1434 e.link18 = newmis;
\r
1439 newmis.classname = "remotelinker";
\r
1440 newmis.delay = rl19;
\r
1441 e.link19 = newmis;
\r
1447 remove(plane_storage);
\r
1448 plane_storage = world;
\r
1452 void() SaveNavNodes =
\r
1454 local float file, length;
\r
1455 local float tfl0, tfl1, tfl2, tfl3, tfl4, tfl5, tfl6, tfl7, tfl8, tfl9;
\r
1456 local float tfl10, tfl11, tfl12, tfl13, tfl14, tfl15, tfl16, tfl17, tfl18, tfl19;
\r
1458 local entity e, e2;
\r
1460 length = strlen(world.model);
\r
1461 length = length - 5;
\r
1462 s = substring(world.model, 5, length);
\r
1463 s = strcat(s, ".nnl");
\r
1465 file = fopen(s, FILE_WRITE);
\r
1469 e = navnode_chain;
\r
1472 fputs(file, "navnode\n");
\r
1473 fputs(file, ftos(e.origin_x));
\r
1475 fputs(file, ftos(e.origin_y));
\r
1477 fputs(file, ftos(e.origin_z));
\r
1478 fputs(file, "\n");
\r
1479 fputs(file, ftos(e.mins_x));
\r
1481 fputs(file, ftos(e.mins_y));
\r
1483 fputs(file, ftos(e.mins_z));
\r
1484 fputs(file, "\n");
\r
1485 fputs(file, ftos(e.maxs_x));
\r
1487 fputs(file, ftos(e.maxs_y));
\r
1489 fputs(file, ftos(e.maxs_z));
\r
1490 fputs(file, "\n");
\r
1491 if (e.plane_chain)
\r
1493 e2 = e.plane_chain;
\r
1494 fputs(file, "plane\n");
\r
1495 fputs(file, ftos(e2.mangle_x));
\r
1497 fputs(file, ftos(e2.mangle_y));
\r
1499 fputs(file, ftos(e2.mangle_z));
\r
1500 fputs(file, "\n");
\r
1501 fputs(file, ftos(e2.delay));
\r
1502 fputs(file, "\n");
\r
1503 e2 = e2.plane_next;
\r
1504 while (e2 != e.plane_chain)
\r
1506 fputs(file, "plane\n");
\r
1507 fputs(file, ftos(e2.mangle_x));
\r
1509 fputs(file, ftos(e2.mangle_y));
\r
1511 fputs(file, ftos(e2.mangle_z));
\r
1512 fputs(file, "\n");
\r
1513 fputs(file, ftos(e2.delay));
\r
1514 fputs(file, "\n");
\r
1515 e2 = e2.plane_next;
\r
1518 if (e.lflags0 & LF_REMOTE)
\r
1520 fputs(file, "remote0\n");
\r
1521 fputs(file, ftos(e.link0.delay));
\r
1522 fputs(file, "\n");
\r
1524 if (e.lflags1 & LF_REMOTE)
\r
1526 fputs(file, "remote1\n");
\r
1527 fputs(file, ftos(e.link1.delay));
\r
1528 fputs(file, "\n");
\r
1530 if (e.lflags2 & LF_REMOTE)
\r
1532 fputs(file, "remote2\n");
\r
1533 fputs(file, ftos(e.link2.delay));
\r
1534 fputs(file, "\n");
\r
1536 if (e.lflags3 & LF_REMOTE)
\r
1538 fputs(file, "remote3\n");
\r
1539 fputs(file, ftos(e.link3.delay));
\r
1540 fputs(file, "\n");
\r
1542 if (e.lflags4 & LF_REMOTE)
\r
1544 fputs(file, "remote4\n");
\r
1545 fputs(file, ftos(e.link4.delay));
\r
1546 fputs(file, "\n");
\r
1548 if (e.lflags5 & LF_REMOTE)
\r
1550 fputs(file, "remote5\n");
\r
1551 fputs(file, ftos(e.link5.delay));
\r
1552 fputs(file, "\n");
\r
1554 if (e.lflags6 & LF_REMOTE)
\r
1556 fputs(file, "remote6\n");
\r
1557 fputs(file, ftos(e.link6.delay));
\r
1558 fputs(file, "\n");
\r
1560 if (e.lflags7 & LF_REMOTE)
\r
1562 fputs(file, "remote7\n");
\r
1563 fputs(file, ftos(e.link7.delay));
\r
1564 fputs(file, "\n");
\r
1566 if (e.lflags8 & LF_REMOTE)
\r
1568 fputs(file, "remote8\n");
\r
1569 fputs(file, ftos(e.link8.delay));
\r
1570 fputs(file, "\n");
\r
1572 if (e.lflags9 & LF_REMOTE)
\r
1574 fputs(file, "remote9\n");
\r
1575 fputs(file, ftos(e.link9.delay));
\r
1576 fputs(file, "\n");
\r
1578 if (e.lflags10 & LF_REMOTE)
\r
1580 fputs(file, "remote10\n");
\r
1581 fputs(file, ftos(e.link10.delay));
\r
1582 fputs(file, "\n");
\r
1584 if (e.lflags11 & LF_REMOTE)
\r
1586 fputs(file, "remote11\n");
\r
1587 fputs(file, ftos(e.link11.delay));
\r
1588 fputs(file, "\n");
\r
1590 if (e.lflags12 & LF_REMOTE)
\r
1592 fputs(file, "remote12\n");
\r
1593 fputs(file, ftos(e.link12.delay));
\r
1594 fputs(file, "\n");
\r
1596 if (e.lflags13 & LF_REMOTE)
\r
1598 fputs(file, "remote13\n");
\r
1599 fputs(file, ftos(e.link13.delay));
\r
1600 fputs(file, "\n");
\r
1602 if (e.lflags14 & LF_REMOTE)
\r
1604 fputs(file, "remote14\n");
\r
1605 fputs(file, ftos(e.link14.delay));
\r
1606 fputs(file, "\n");
\r
1608 if (e.lflags15 & LF_REMOTE)
\r
1610 fputs(file, "remote15\n");
\r
1611 fputs(file, ftos(e.link15.delay));
\r
1612 fputs(file, "\n");
\r
1614 if (e.lflags16 & LF_REMOTE)
\r
1616 fputs(file, "remote16\n");
\r
1617 fputs(file, ftos(e.link16.delay));
\r
1618 fputs(file, "\n");
\r
1620 if (e.lflags17 & LF_REMOTE)
\r
1622 fputs(file, "remote17\n");
\r
1623 fputs(file, ftos(e.link17.delay));
\r
1624 fputs(file, "\n");
\r
1626 if (e.lflags18 & LF_REMOTE)
\r
1628 fputs(file, "remote18\n");
\r
1629 fputs(file, ftos(e.link18.delay));
\r
1630 fputs(file, "\n");
\r
1632 if (e.lflags19 & LF_REMOTE)
\r
1634 fputs(file, "remote19\n");
\r
1635 fputs(file, ftos(e.link19.delay));
\r
1636 fputs(file, "\n");
\r
1638 tfl0 = e.lflags0 - (e.lflags0 & LF_REMOTE);
\r
1639 tfl1 = e.lflags1 - (e.lflags1 & LF_REMOTE);
\r
1640 tfl2 = e.lflags2 - (e.lflags2 & LF_REMOTE);
\r
1641 tfl3 = e.lflags3 - (e.lflags3 & LF_REMOTE);
\r
1642 tfl4 = e.lflags4 - (e.lflags4 & LF_REMOTE);
\r
1643 tfl5 = e.lflags5 - (e.lflags5 & LF_REMOTE);
\r
1644 tfl6 = e.lflags6 - (e.lflags6 & LF_REMOTE);
\r
1645 tfl7 = e.lflags7 - (e.lflags7 & LF_REMOTE);
\r
1646 tfl8 = e.lflags8 - (e.lflags8 & LF_REMOTE);
\r
1647 tfl9 = e.lflags9 - (e.lflags9 & LF_REMOTE);
\r
1648 tfl10 = e.lflags10 - (e.lflags10 & LF_REMOTE);
\r
1649 tfl11 = e.lflags11 - (e.lflags11 & LF_REMOTE);
\r
1650 tfl12 = e.lflags12 - (e.lflags12 & LF_REMOTE);
\r
1651 tfl13 = e.lflags13 - (e.lflags13 & LF_REMOTE);
\r
1652 tfl14 = e.lflags14 - (e.lflags14 & LF_REMOTE);
\r
1653 tfl15 = e.lflags15 - (e.lflags15 & LF_REMOTE);
\r
1654 tfl16 = e.lflags16 - (e.lflags16 & LF_REMOTE);
\r
1655 tfl17 = e.lflags17 - (e.lflags17 & LF_REMOTE);
\r
1656 tfl18 = e.lflags18 - (e.lflags18 & LF_REMOTE);
\r
1657 tfl19 = e.lflags19 - (e.lflags19 & LF_REMOTE);
\r
1660 fputs(file, "sflags\n");
\r
1661 fputs(file, ftos(e.sflags));
\r
1662 fputs(file, "\n");
\r
1666 fputs(file, "lflags0\n");
\r
1667 fputs(file, ftos(tfl0));
\r
1668 fputs(file, "\n");
\r
1672 fputs(file, "lflags1\n");
\r
1673 fputs(file, ftos(tfl1));
\r
1674 fputs(file, "\n");
\r
1678 fputs(file, "lflags2\n");
\r
1679 fputs(file, ftos(tfl2));
\r
1680 fputs(file, "\n");
\r
1684 fputs(file, "lflags3\n");
\r
1685 fputs(file, ftos(tfl3));
\r
1686 fputs(file, "\n");
\r
1690 fputs(file, "lflags4\n");
\r
1691 fputs(file, ftos(tfl4));
\r
1692 fputs(file, "\n");
\r
1696 fputs(file, "lflags5\n");
\r
1697 fputs(file, ftos(tfl5));
\r
1698 fputs(file, "\n");
\r
1702 fputs(file, "lflags6\n");
\r
1703 fputs(file, ftos(tfl6));
\r
1704 fputs(file, "\n");
\r
1708 fputs(file, "lflags7\n");
\r
1709 fputs(file, ftos(tfl7));
\r
1710 fputs(file, "\n");
\r
1714 fputs(file, "lflags8\n");
\r
1715 fputs(file, ftos(tfl8));
\r
1716 fputs(file, "\n");
\r
1720 fputs(file, "lflags9\n");
\r
1721 fputs(file, ftos(tfl9));
\r
1722 fputs(file, "\n");
\r
1726 fputs(file, "lflags10\n");
\r
1727 fputs(file, ftos(tfl10));
\r
1728 fputs(file, "\n");
\r
1732 fputs(file, "lflags11\n");
\r
1733 fputs(file, ftos(tfl11));
\r
1734 fputs(file, "\n");
\r
1738 fputs(file, "lflags12\n");
\r
1739 fputs(file, ftos(tfl12));
\r
1740 fputs(file, "\n");
\r
1744 fputs(file, "lflags13\n");
\r
1745 fputs(file, ftos(tfl13));
\r
1746 fputs(file, "\n");
\r
1750 fputs(file, "lflags14\n");
\r
1751 fputs(file, ftos(tfl14));
\r
1752 fputs(file, "\n");
\r
1756 fputs(file, "lflags15\n");
\r
1757 fputs(file, ftos(tfl15));
\r
1758 fputs(file, "\n");
\r
1762 fputs(file, "lflags16\n");
\r
1763 fputs(file, ftos(tfl16));
\r
1764 fputs(file, "\n");
\r
1768 fputs(file, "lflags17\n");
\r
1769 fputs(file, ftos(tfl17));
\r
1770 fputs(file, "\n");
\r
1774 fputs(file, "lflags18\n");
\r
1775 fputs(file, ftos(tfl18));
\r
1776 fputs(file, "\n");
\r
1780 fputs(file, "lflags19\n");
\r
1781 fputs(file, ftos(tfl19));
\r
1782 fputs(file, "\n");
\r