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
317 setorigin(navn, org);
\r
322 float(entity navn, float ax, float amount) ResizeNavNode =
\r
331 amount = amount - navn.origin_x;
\r
333 amount = amount*-1;
\r
334 amount = amount - navn.maxs_x;
\r
336 v_x = v_x + (amount*0.5);
\r
337 setsize(navn, v*-1, v);
\r
339 if (self.origin_x < navn.origin_x)
\r
340 v_x = navn.origin_x - (amount*0.5);
\r
342 v_x = navn.origin_x + (amount*0.5);
\r
343 MoveNavNode(navn, v);
\r
347 amount = amount - navn.origin_y;
\r
349 amount = amount*-1;
\r
350 amount = amount - navn.maxs_y;
\r
352 v_y = v_y + (amount*0.5);
\r
353 setsize(navn, v*-1, v);
\r
355 if (self.origin_y < navn.origin_y)
\r
356 v_y = navn.origin_y - (amount*0.5);
\r
358 v_y = navn.origin_y + (amount*0.5);
\r
359 MoveNavNode(navn, v);
\r
363 amount = amount - navn.origin_z;
\r
365 amount = amount*-1;
\r
366 amount = amount - navn.maxs_z;
\r
368 v_z = v_z + (amount*0.5);
\r
369 setsize(navn, v*-1, v);
\r
371 if (self.origin_z < navn.origin_z)
\r
372 v_z = navn.origin_z - (amount*0.5);
\r
374 v_z = navn.origin_z + (amount*0.5);
\r
375 MoveNavNode(navn, v);
\r
381 void(entity navn, vector normal, float dist) AddPlane =
\r
389 newmis.classname = "plane";
\r
390 if (!navn.plane_chain)
\r
392 navn.plane_chain = newmis;
\r
393 newmis.plane_next = newmis;
\r
394 newmis.plane_prev = newmis;
\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
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
408 newmis.mangle = newmis.mangle*-1;
\r
409 newmis.delay = newmis.delay*-1;
\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
417 void(entity navn, entity delplane) RemovePlane =
\r
421 e = navn.plane_chain;
\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
431 e = navn.plane_chain;
\r
434 while (e != navn.plane_chain)
\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
443 e = navn.plane_chain;
\r
447 if (navn.plane_chain.origin == nullvector)
\r
448 navn.plane_chain = world;
\r
452 void() RemoveClippoints =
\r
454 if (self.clippoint1)
\r
456 if (self.clippoint2)
\r
458 if (self.clippoint3)
\r
459 remove (self.clippoint3);
\r
460 remove (self.clippoint2);
\r
462 remove (self.clippoint1);
\r
464 self.current_clippoint = world;
\r
465 self.clippoint1 = self.clippoint2 = self.clippoint3 = world;
\r
468 void() ClippointThink =
\r
472 self.nextthink = time + 0.1;
\r
474 p = pointcontents(self.origin);
\r
475 if (p == CONTENT_SOLID)
\r
476 self.effects = EF_NODEPTHTEST | EF_ADDITIVE;
\r
481 void(vector org) SpawnClipPoint =
\r
483 if (self.clippoint1)
\r
485 if (self.clippoint2)
\r
487 if (self.clippoint3)
\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
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
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
526 entity(vector org, vector nnmins, vector nnmaxs) SpawnNavNode =
\r
529 setmodel(newmis, "progs/navnode.spr");
\r
530 setsize(newmis, nnmins, nnmaxs);
\r
531 newmis.classname = "navnode";
\r
533 setorigin(newmis, org);
\r
537 void() LinkNavNodes =
\r
541 navnode_chain = world;
\r
544 e = findchain(classname, "navnode");
\r
547 e.list = navnode_chain;
\r
549 e.delay = navnodes;
\r
550 navnodes = navnodes + 1;
\r
559 e.link0.effects = 0;
\r
560 e.link0.frame = 20;
\r
561 if (e.link0.classname == "remotelinker")
\r
563 e.link0.think = SUB_Remove;
\r
564 e.link0.nextthink = time;
\r
568 if (t.delay == e.link0.delay)
\r
572 e.lflags0 = e.lflags0 | LF_REMOTE;
\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
583 e.link1.effects = 0;
\r
584 e.link1.frame = 20;
\r
585 if (e.link1.classname == "remotelinker")
\r
587 e.link1.think = SUB_Remove;
\r
588 e.link1.nextthink = time;
\r
592 if (t.delay == e.link1.delay)
\r
596 e.lflags1 = e.lflags1 | LF_REMOTE;
\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
607 e.link2.effects = 0;
\r
608 e.link2.frame = 20;
\r
609 if (e.link2.classname == "remotelinker")
\r
611 e.link2.think = SUB_Remove;
\r
612 e.link2.nextthink = time;
\r
616 if (t.delay == e.link2.delay)
\r
620 e.lflags2 = e.lflags2 | LF_REMOTE;
\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
631 e.link3.effects = 0;
\r
632 e.link3.frame = 20;
\r
633 if (e.link3.classname == "remotelinker")
\r
635 e.link3.think = SUB_Remove;
\r
636 e.link3.nextthink = time;
\r
640 if (t.delay == e.link3.delay)
\r
644 e.lflags3 = e.lflags3 | LF_REMOTE;
\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
655 e.link4.effects = 0;
\r
656 e.link4.frame = 20;
\r
657 if (e.link4.classname == "remotelinker")
\r
659 e.link4.think = SUB_Remove;
\r
660 e.link4.nextthink = time;
\r
664 if (t.delay == e.link4.delay)
\r
668 e.lflags4 = e.lflags4 | LF_REMOTE;
\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
679 e.link5.effects = 0;
\r
680 e.link5.frame = 20;
\r
681 if (e.link5.classname == "remotelinker")
\r
683 e.link5.think = SUB_Remove;
\r
684 e.link5.nextthink = time;
\r
688 if (t.delay == e.link5.delay)
\r
692 e.lflags5 = e.lflags5 | LF_REMOTE;
\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
703 e.link6.effects = 0;
\r
704 e.link6.frame = 20;
\r
705 if (e.link6.classname == "remotelinker")
\r
707 e.link6.think = SUB_Remove;
\r
708 e.link6.nextthink = time;
\r
712 if (t.delay == e.link6.delay)
\r
716 e.lflags6 = e.lflags6 | LF_REMOTE;
\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
727 e.link7.effects = 0;
\r
728 e.link7.frame = 20;
\r
729 if (e.link7.classname == "remotelinker")
\r
731 e.link7.think = SUB_Remove;
\r
732 e.link7.nextthink = time;
\r
736 if (t.delay == e.link7.delay)
\r
740 e.lflags7 = e.lflags7 | LF_REMOTE;
\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
751 e.link8.effects = 0;
\r
752 e.link8.frame = 20;
\r
753 if (e.link8.classname == "remotelinker")
\r
755 e.link8.think = SUB_Remove;
\r
756 e.link8.nextthink = time;
\r
760 if (t.delay == e.link8.delay)
\r
764 e.lflags8 = e.lflags8 | LF_REMOTE;
\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
775 e.link9.effects = 0;
\r
776 e.link9.frame = 20;
\r
777 if (e.link9.classname == "remotelinker")
\r
779 e.link9.think = SUB_Remove;
\r
780 e.link9.nextthink = time;
\r
784 if (t.delay == e.link9.delay)
\r
788 e.lflags9 = e.lflags9 | LF_REMOTE;
\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
799 e.link10.effects = 0;
\r
800 e.link10.frame = 20;
\r
801 if (e.link10.classname == "remotelinker")
\r
803 e.link10.think = SUB_Remove;
\r
804 e.link10.nextthink = time;
\r
808 if (t.delay == e.link10.delay)
\r
812 e.lflags10 = e.lflags10 | LF_REMOTE;
\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
823 e.link11.effects = 0;
\r
824 e.link11.frame = 20;
\r
825 if (e.link11.classname == "remotelinker")
\r
827 e.link11.think = SUB_Remove;
\r
828 e.link11.nextthink = time;
\r
832 if (t.delay == e.link11.delay)
\r
836 e.lflags11 = e.lflags11 | LF_REMOTE;
\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
847 e.link12.effects = 0;
\r
848 e.link12.frame = 20;
\r
849 if (e.link12.classname == "remotelinker")
\r
851 e.link12.think = SUB_Remove;
\r
852 e.link12.nextthink = time;
\r
856 if (t.delay == e.link12.delay)
\r
860 e.lflags12 = e.lflags12 | LF_REMOTE;
\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
871 e.link13.effects = 0;
\r
872 e.link13.frame = 20;
\r
873 if (e.link13.classname == "remotelinker")
\r
875 e.link13.think = SUB_Remove;
\r
876 e.link13.nextthink = time;
\r
880 if (t.delay == e.link13.delay)
\r
884 e.lflags13 = e.lflags13 | LF_REMOTE;
\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
895 e.link14.effects = 0;
\r
896 e.link14.frame = 20;
\r
897 if (e.link14.classname == "remotelinker")
\r
899 e.link14.think = SUB_Remove;
\r
900 e.link14.nextthink = time;
\r
904 if (t.delay == e.link14.delay)
\r
908 e.lflags14 = e.lflags14 | LF_REMOTE;
\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
919 e.link15.effects = 0;
\r
920 e.link15.frame = 20;
\r
921 if (e.link15.classname == "remotelinker")
\r
923 e.link15.think = SUB_Remove;
\r
924 e.link15.nextthink = time;
\r
928 if (t.delay == e.link15.delay)
\r
932 e.lflags15 = e.lflags15 | LF_REMOTE;
\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
943 e.link16.effects = 0;
\r
944 e.link16.frame = 20;
\r
945 if (e.link16.classname == "remotelinker")
\r
947 e.link16.think = SUB_Remove;
\r
948 e.link16.nextthink = time;
\r
952 if (t.delay == e.link16.delay)
\r
956 e.lflags16 = e.lflags16 | LF_REMOTE;
\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
967 e.link17.effects = 0;
\r
968 e.link17.frame = 20;
\r
969 if (e.link17.classname == "remotelinker")
\r
971 e.link17.think = SUB_Remove;
\r
972 e.link17.nextthink = time;
\r
976 if (t.delay == e.link17.delay)
\r
980 e.lflags17 = e.lflags17 | LF_REMOTE;
\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
991 e.link18.effects = 0;
\r
992 e.link18.frame = 20;
\r
993 if (e.link18.classname == "remotelinker")
\r
995 e.link18.think = SUB_Remove;
\r
996 e.link18.nextthink = time;
\r
1000 if (t.delay == e.link18.delay)
\r
1004 e.lflags18 = e.lflags18 | LF_REMOTE;
\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
1015 e.link19.effects = 0;
\r
1016 e.link19.frame = 20;
\r
1017 if (e.link19.classname == "remotelinker")
\r
1019 e.link19.think = SUB_Remove;
\r
1020 e.link19.nextthink = time;
\r
1021 t = navnode_chain;
\r
1024 if (t.delay == e.link19.delay)
\r
1028 e.lflags19 = e.lflags19 | LF_REMOTE;
\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
1039 e = navnode_chain;
\r
1042 t = navnode_chain;
\r
1045 if (boxesoverlap(e.origin + e.mins, e.origin + e.maxs, t.origin + t.mins, t.origin + t.maxs))
\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
1070 else if (!e.link1)
\r
1072 else if (!e.link2)
\r
1074 else if (!e.link3)
\r
1076 else if (!e.link4)
\r
1078 else if (!e.link5)
\r
1080 else if (!e.link6)
\r
1082 else if (!e.link7)
\r
1084 else if (!e.link8)
\r
1086 else if (!e.link9)
\r
1088 else if (!e.link10)
\r
1090 else if (!e.link11)
\r
1092 else if (!e.link12)
\r
1094 else if (!e.link13)
\r
1096 else if (!e.link14)
\r
1098 else if (!e.link15)
\r
1100 else if (!e.link16)
\r
1102 else if (!e.link17)
\r
1104 else if (!e.link18)
\r
1106 else if (!e.link19)
\r
1109 dprint("WARNING: Too many linking NavNodes!\n");
\r
1117 void() LoadNavNodes =
\r
1119 local float f, file, length;
\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
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
1128 local vector wborg, wbmaxs, wbmins;
\r
1129 local entity e, plane_storage;
\r
1133 dprint("NavNodes present, map needs to be reloaded to load navnode-file\n");
\r
1137 plane_storage = spawn();
\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
1144 file = fopen(s, FILE_READ);
\r
1149 while (s == "navnode")
\r
1154 wborg = wbmaxs = wbmins = nullvector;
\r
1155 plane_storage.plane_chain = world;
\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
1168 while (s == "plane")
\r
1174 AddPlane(plane_storage, pln*-1, pdst);
\r
1177 while (substring(s, 0, 6) == "remote")
\r
1179 length = strlen(s);
\r
1180 f = stof(substring(s, 6, length));
\r
1224 if (s == "sflags")
\r
1230 while (substring(s, 0, 6) == "lflags")
\r
1232 length = strlen(s);
\r
1233 f = stof(substring(s, 6, length));
\r
1277 e = SpawnNavNode(wborg, wbmins, wbmaxs);
\r
1278 if (plane_storage.plane_chain)
\r
1279 e.plane_chain = plane_storage.plane_chain;
\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
1304 newmis.classname = "remotelinker";
\r
1305 newmis.delay = rl0;
\r
1311 newmis.classname = "remotelinker";
\r
1312 newmis.delay = rl1;
\r
1318 newmis.classname = "remotelinker";
\r
1319 newmis.delay = rl2;
\r
1325 newmis.classname = "remotelinker";
\r
1326 newmis.delay = rl3;
\r
1332 newmis.classname = "remotelinker";
\r
1333 newmis.delay = rl4;
\r
1339 newmis.classname = "remotelinker";
\r
1340 newmis.delay = rl5;
\r
1346 newmis.classname = "remotelinker";
\r
1347 newmis.delay = rl6;
\r
1353 newmis.classname = "remotelinker";
\r
1354 newmis.delay = rl7;
\r
1360 newmis.classname = "remotelinker";
\r
1361 newmis.delay = rl8;
\r
1367 newmis.classname = "remotelinker";
\r
1368 newmis.delay = rl9;
\r
1374 newmis.classname = "remotelinker";
\r
1375 newmis.delay = rl10;
\r
1376 e.link10 = newmis;
\r
1381 newmis.classname = "remotelinker";
\r
1382 newmis.delay = rl11;
\r
1383 e.link11 = newmis;
\r
1388 newmis.classname = "remotelinker";
\r
1389 newmis.delay = rl12;
\r
1390 e.link12 = newmis;
\r
1395 newmis.classname = "remotelinker";
\r
1396 newmis.delay = rl13;
\r
1397 e.link13 = newmis;
\r
1402 newmis.classname = "remotelinker";
\r
1403 newmis.delay = rl14;
\r
1404 e.link14 = newmis;
\r
1409 newmis.classname = "remotelinker";
\r
1410 newmis.delay = rl15;
\r
1411 e.link15 = newmis;
\r
1416 newmis.classname = "remotelinker";
\r
1417 newmis.delay = rl16;
\r
1418 e.link16 = newmis;
\r
1423 newmis.classname = "remotelinker";
\r
1424 newmis.delay = rl17;
\r
1425 e.link17 = newmis;
\r
1430 newmis.classname = "remotelinker";
\r
1431 newmis.delay = rl18;
\r
1432 e.link18 = newmis;
\r
1437 newmis.classname = "remotelinker";
\r
1438 newmis.delay = rl19;
\r
1439 e.link19 = newmis;
\r
1445 remove(plane_storage);
\r
1446 plane_storage = world;
\r
1450 void() SaveNavNodes =
\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
1456 local entity e, e2;
\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
1463 file = fopen(s, FILE_WRITE);
\r
1467 e = navnode_chain;
\r
1470 fputs(file, "navnode\n");
\r
1471 fputs(file, ftos(e.origin_x));
\r
1473 fputs(file, ftos(e.origin_y));
\r
1475 fputs(file, ftos(e.origin_z));
\r
1476 fputs(file, "\n");
\r
1477 fputs(file, ftos(e.mins_x));
\r
1479 fputs(file, ftos(e.mins_y));
\r
1481 fputs(file, ftos(e.mins_z));
\r
1482 fputs(file, "\n");
\r
1483 fputs(file, ftos(e.maxs_x));
\r
1485 fputs(file, ftos(e.maxs_y));
\r
1487 fputs(file, ftos(e.maxs_z));
\r
1488 fputs(file, "\n");
\r
1489 if (e.plane_chain)
\r
1491 e2 = e.plane_chain;
\r
1492 fputs(file, "plane\n");
\r
1493 fputs(file, ftos(e2.mangle_x));
\r
1495 fputs(file, ftos(e2.mangle_y));
\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
1504 fputs(file, "plane\n");
\r
1505 fputs(file, ftos(e2.mangle_x));
\r
1507 fputs(file, ftos(e2.mangle_y));
\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
1516 if (e.lflags0 & LF_REMOTE)
\r
1518 fputs(file, "remote0\n");
\r
1519 fputs(file, ftos(e.link0.delay));
\r
1520 fputs(file, "\n");
\r
1522 if (e.lflags1 & LF_REMOTE)
\r
1524 fputs(file, "remote1\n");
\r
1525 fputs(file, ftos(e.link1.delay));
\r
1526 fputs(file, "\n");
\r
1528 if (e.lflags2 & LF_REMOTE)
\r
1530 fputs(file, "remote2\n");
\r
1531 fputs(file, ftos(e.link2.delay));
\r
1532 fputs(file, "\n");
\r
1534 if (e.lflags3 & LF_REMOTE)
\r
1536 fputs(file, "remote3\n");
\r
1537 fputs(file, ftos(e.link3.delay));
\r
1538 fputs(file, "\n");
\r
1540 if (e.lflags4 & LF_REMOTE)
\r
1542 fputs(file, "remote4\n");
\r
1543 fputs(file, ftos(e.link4.delay));
\r
1544 fputs(file, "\n");
\r
1546 if (e.lflags5 & LF_REMOTE)
\r
1548 fputs(file, "remote5\n");
\r
1549 fputs(file, ftos(e.link5.delay));
\r
1550 fputs(file, "\n");
\r
1552 if (e.lflags6 & LF_REMOTE)
\r
1554 fputs(file, "remote6\n");
\r
1555 fputs(file, ftos(e.link6.delay));
\r
1556 fputs(file, "\n");
\r
1558 if (e.lflags7 & LF_REMOTE)
\r
1560 fputs(file, "remote7\n");
\r
1561 fputs(file, ftos(e.link7.delay));
\r
1562 fputs(file, "\n");
\r
1564 if (e.lflags8 & LF_REMOTE)
\r
1566 fputs(file, "remote8\n");
\r
1567 fputs(file, ftos(e.link8.delay));
\r
1568 fputs(file, "\n");
\r
1570 if (e.lflags9 & LF_REMOTE)
\r
1572 fputs(file, "remote9\n");
\r
1573 fputs(file, ftos(e.link9.delay));
\r
1574 fputs(file, "\n");
\r
1576 if (e.lflags10 & LF_REMOTE)
\r
1578 fputs(file, "remote10\n");
\r
1579 fputs(file, ftos(e.link10.delay));
\r
1580 fputs(file, "\n");
\r
1582 if (e.lflags11 & LF_REMOTE)
\r
1584 fputs(file, "remote11\n");
\r
1585 fputs(file, ftos(e.link11.delay));
\r
1586 fputs(file, "\n");
\r
1588 if (e.lflags12 & LF_REMOTE)
\r
1590 fputs(file, "remote12\n");
\r
1591 fputs(file, ftos(e.link12.delay));
\r
1592 fputs(file, "\n");
\r
1594 if (e.lflags13 & LF_REMOTE)
\r
1596 fputs(file, "remote13\n");
\r
1597 fputs(file, ftos(e.link13.delay));
\r
1598 fputs(file, "\n");
\r
1600 if (e.lflags14 & LF_REMOTE)
\r
1602 fputs(file, "remote14\n");
\r
1603 fputs(file, ftos(e.link14.delay));
\r
1604 fputs(file, "\n");
\r
1606 if (e.lflags15 & LF_REMOTE)
\r
1608 fputs(file, "remote15\n");
\r
1609 fputs(file, ftos(e.link15.delay));
\r
1610 fputs(file, "\n");
\r
1612 if (e.lflags16 & LF_REMOTE)
\r
1614 fputs(file, "remote16\n");
\r
1615 fputs(file, ftos(e.link16.delay));
\r
1616 fputs(file, "\n");
\r
1618 if (e.lflags17 & LF_REMOTE)
\r
1620 fputs(file, "remote17\n");
\r
1621 fputs(file, ftos(e.link17.delay));
\r
1622 fputs(file, "\n");
\r
1624 if (e.lflags18 & LF_REMOTE)
\r
1626 fputs(file, "remote18\n");
\r
1627 fputs(file, ftos(e.link18.delay));
\r
1628 fputs(file, "\n");
\r
1630 if (e.lflags19 & LF_REMOTE)
\r
1632 fputs(file, "remote19\n");
\r
1633 fputs(file, ftos(e.link19.delay));
\r
1634 fputs(file, "\n");
\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
1658 fputs(file, "sflags\n");
\r
1659 fputs(file, ftos(e.sflags));
\r
1660 fputs(file, "\n");
\r
1664 fputs(file, "lflags0\n");
\r
1665 fputs(file, ftos(tfl0));
\r
1666 fputs(file, "\n");
\r
1670 fputs(file, "lflags1\n");
\r
1671 fputs(file, ftos(tfl1));
\r
1672 fputs(file, "\n");
\r
1676 fputs(file, "lflags2\n");
\r
1677 fputs(file, ftos(tfl2));
\r
1678 fputs(file, "\n");
\r
1682 fputs(file, "lflags3\n");
\r
1683 fputs(file, ftos(tfl3));
\r
1684 fputs(file, "\n");
\r
1688 fputs(file, "lflags4\n");
\r
1689 fputs(file, ftos(tfl4));
\r
1690 fputs(file, "\n");
\r
1694 fputs(file, "lflags5\n");
\r
1695 fputs(file, ftos(tfl5));
\r
1696 fputs(file, "\n");
\r
1700 fputs(file, "lflags6\n");
\r
1701 fputs(file, ftos(tfl6));
\r
1702 fputs(file, "\n");
\r
1706 fputs(file, "lflags7\n");
\r
1707 fputs(file, ftos(tfl7));
\r
1708 fputs(file, "\n");
\r
1712 fputs(file, "lflags8\n");
\r
1713 fputs(file, ftos(tfl8));
\r
1714 fputs(file, "\n");
\r
1718 fputs(file, "lflags9\n");
\r
1719 fputs(file, ftos(tfl9));
\r
1720 fputs(file, "\n");
\r
1724 fputs(file, "lflags10\n");
\r
1725 fputs(file, ftos(tfl10));
\r
1726 fputs(file, "\n");
\r
1730 fputs(file, "lflags11\n");
\r
1731 fputs(file, ftos(tfl11));
\r
1732 fputs(file, "\n");
\r
1736 fputs(file, "lflags12\n");
\r
1737 fputs(file, ftos(tfl12));
\r
1738 fputs(file, "\n");
\r
1742 fputs(file, "lflags13\n");
\r
1743 fputs(file, ftos(tfl13));
\r
1744 fputs(file, "\n");
\r
1748 fputs(file, "lflags14\n");
\r
1749 fputs(file, ftos(tfl14));
\r
1750 fputs(file, "\n");
\r
1754 fputs(file, "lflags15\n");
\r
1755 fputs(file, ftos(tfl15));
\r
1756 fputs(file, "\n");
\r
1760 fputs(file, "lflags16\n");
\r
1761 fputs(file, ftos(tfl16));
\r
1762 fputs(file, "\n");
\r
1766 fputs(file, "lflags17\n");
\r
1767 fputs(file, ftos(tfl17));
\r
1768 fputs(file, "\n");
\r
1772 fputs(file, "lflags18\n");
\r
1773 fputs(file, ftos(tfl18));
\r
1774 fputs(file, "\n");
\r
1778 fputs(file, "lflags19\n");
\r
1779 fputs(file, ftos(tfl19));
\r
1780 fputs(file, "\n");
\r