1 float(vector smins, vector smaxs, vector bmins, vector bmaxs) boxenclosed = {return smins_x >= bmins_x && smaxs_x <= bmaxs_x && smins_y >= bmins_y && smaxs_y <= bmaxs_y && smins_z >= bmins_z && smaxs_z <= bmaxs_z;};
\r
3 vector(vector point, entity current_space, entity goal_space) ClampPointToSpace =
\r
5 local float North, South, West, East, Up, Down;
\r
7 local vector ret_point, tvec;
\r
11 goal_space = current_space;
\r
13 North = min(current_space.origin_y + current_space.maxs_y, goal_space.origin_y + goal_space.maxs_y);
\r
14 South = max(current_space.origin_y + current_space.mins_y, goal_space.origin_y + goal_space.mins_y);
\r
15 East = min(current_space.origin_x + current_space.maxs_x, goal_space.origin_x + goal_space.maxs_x);
\r
16 West = max(current_space.origin_x + current_space.mins_x, goal_space.origin_x + goal_space.mins_x);
\r
17 Up = min(current_space.origin_z + current_space.maxs_z, goal_space.origin_z + goal_space.maxs_z);
\r
18 Down = max(current_space.origin_z + current_space.mins_z, goal_space.origin_z + goal_space.mins_z);
\r
20 f = (East + West) * 0.5;
\r
21 f2 = East - self.maxs_x;
\r
23 f2 = West - self.mins_x;
\r
25 f = (North + South) * 0.5;
\r
26 f2 = North - self.maxs_y;
\r
28 f2 = South - self.mins_y;
\r
30 f = (Up + Down) * 0.5;
\r
31 f2 = Up - self.maxs_z;
\r
33 f2 = Down - self.mins_z;
\r
36 ret_point_x = bound(West, point_x, East);
\r
37 ret_point_y = bound(South, point_y, North);
\r
38 ret_point_z = bound(Down, point_z, Up);
\r
40 e = goal_space.plane_chain;
\r
45 tvec_x = self.mins_x;
\r
47 tvec_y = self.mins_y;
\r
49 tvec_z = self.mins_z;
\r
51 f = tvec*e.mangle - goal_space.origin*e.mangle-e.delay;
\r
53 ret_point = ret_point - f*e.mangle;
\r
59 float(entity node) CheckNode =
\r
61 local float f, result;
\r
65 if (boxenclosed(self.origin + self.mins, self.origin + self.maxs, node.origin + node.mins, node.origin + node.maxs))
\r
68 plane = node.plane_chain;
\r
72 if (plane.mangle_x < 0)
\r
73 tvec_x = self.mins_x;
\r
74 if (plane.mangle_y < 0)
\r
75 tvec_y = self.mins_y;
\r
76 if (plane.mangle_z < 0)
\r
77 tvec_z = self.mins_z;
\r
78 tvec += self.origin;
\r
79 f = tvec*plane.mangle - node.origin*plane.mangle-plane.delay;
\r
88 float(entity currentnode, entity goalnode, float flight) AdvancedTraceWalk =
\r
90 local float f, t, bump;
\r
92 local float stepdist, fulldist, totaldist;
\r
93 local vector goalpoint, oldorg, move;
\r
94 local entity oldself, debugpoint;
\r
97 stepdist = cvar("navnodeedit_tracewalk_stepdist");
\r
98 fulldist = cvar("navnodeedit_tracewalk_fulldist");
\r
101 setsize(self, '-16 -16 -24', '16 16 45');
\r
102 tracebox(self.origin, self.mins, self.maxs, currentnode.origin + '0 0 -65536', TRUE, self);
\r
103 setorigin(self, trace_endpos);
\r
104 setsize(self, '-18 -18 -26', '18 18 47');
\r
105 goalpoint = ClampPointToSpace(self.origin, currentnode, goalnode);
\r
106 setsize(self, '-16 -16 -24', '16 16 45');
\r
107 while(vlen(self.origin - oldorg) > 1 && totaldist < fulldist)
\r
109 oldorg = self.origin;
\r
111 tracebox(self.origin, self.mins, self.maxs, self.origin + '0 0 18', TRUE, self);
\r
112 setorigin(self, trace_endpos);
\r
113 move = self.origin - goalpoint;
\r
116 f = vlen(self.origin - goalpoint);
\r
117 f = min(f, stepdist);
\r
118 self.velocity = normalize(move)*f;
\r
120 self.velocity_z = (f*2)*-1;
\r
126 tracebox(self.origin, self.mins, self.maxs, self.origin + self.velocity * t, TRUE, self);
\r
127 if (trace_fraction == 1)
\r
129 setorigin(self, trace_endpos);
\r
132 if (self.velocity * trace_plane_normal < 0)
\r
133 self.velocity = self.velocity - (trace_plane_normal * (trace_plane_normal * self.velocity));
\r
134 if (trace_fraction >= 0.0001)
\r
136 t = t * (1 - trace_fraction);
\r
137 setorigin(self, trace_endpos);
\r
142 tracebox(self.origin, self.mins, self.maxs, self.origin + '0 0 -65536', TRUE, self);
\r
143 setorigin(self, trace_endpos);
\r
147 debugpoint = spawn();
\r
148 debugpoint.effects = EF_NODEPTHTEST;
\r
149 setmodel(debugpoint, "progs/point.spr");
\r
150 setorigin(debugpoint, self.origin);
\r
151 debugpoint.list = dasdebugpoint;
\r
152 dasdebugpoint = debugpoint;
\r
154 if (CheckNode(goalnode))
\r
159 totaldist = totaldist + vlen(self.origin - oldorg);
\r
166 void() FlaggerThink =
\r
170 self.nextthink = time;
\r
171 if (!dasdebugpoint)
\r
175 if (!(dasnode.lflags0 & LF_REMOTE))
\r
176 if (!AdvancedTraceWalk(dasnode, dasnode.link0, FALSE))
\r
178 dasnode.lflags0 = LF_NOWALK;
\r
179 if (!AdvancedTraceWalk(dasnode, dasnode.link0, TRUE))
\r
180 dasnode.lflags0 = LF_NOLINK;
\r
184 if (!(dasnode.lflags1 & LF_REMOTE))
\r
185 if (!AdvancedTraceWalk(dasnode, dasnode.link1, FALSE))
\r
187 dasnode.lflags1 = LF_NOWALK;
\r
188 if (!AdvancedTraceWalk(dasnode, dasnode.link1, TRUE))
\r
189 dasnode.lflags1 = LF_NOLINK;
\r
193 if (!(dasnode.lflags2 & LF_REMOTE))
\r
194 if (!AdvancedTraceWalk(dasnode, dasnode.link2, FALSE))
\r
196 dasnode.lflags2 = LF_NOWALK;
\r
197 if (!AdvancedTraceWalk(dasnode, dasnode.link2, TRUE))
\r
198 dasnode.lflags2 = LF_NOLINK;
\r
202 if (!(dasnode.lflags3 & LF_REMOTE))
\r
203 if (!AdvancedTraceWalk(dasnode, dasnode.link3, FALSE))
\r
205 dasnode.lflags3 = LF_NOWALK;
\r
206 if (!AdvancedTraceWalk(dasnode, dasnode.link3, TRUE))
\r
207 dasnode.lflags3 = LF_NOLINK;
\r
211 if (!(dasnode.lflags4 & LF_REMOTE))
\r
212 if (!AdvancedTraceWalk(dasnode, dasnode.link4, FALSE))
\r
214 dasnode.lflags4 = LF_NOWALK;
\r
215 if (!AdvancedTraceWalk(dasnode, dasnode.link4, TRUE))
\r
216 dasnode.lflags4 = LF_NOLINK;
\r
220 if (!(dasnode.lflags5 & LF_REMOTE))
\r
221 if (!AdvancedTraceWalk(dasnode, dasnode.link5, FALSE))
\r
223 dasnode.lflags5 = LF_NOWALK;
\r
224 if (!AdvancedTraceWalk(dasnode, dasnode.link5, TRUE))
\r
225 dasnode.lflags5 = LF_NOLINK;
\r
229 if (!(dasnode.lflags6 & LF_REMOTE))
\r
230 if (!AdvancedTraceWalk(dasnode, dasnode.link6, FALSE))
\r
232 dasnode.lflags6 = LF_NOWALK;
\r
233 if (!AdvancedTraceWalk(dasnode, dasnode.link6, TRUE))
\r
234 dasnode.lflags6 = LF_NOLINK;
\r
238 if (!(dasnode.lflags7 & LF_REMOTE))
\r
239 if (!AdvancedTraceWalk(dasnode, dasnode.link7, FALSE))
\r
241 dasnode.lflags7 = LF_NOWALK;
\r
242 if (!AdvancedTraceWalk(dasnode, dasnode.link7, TRUE))
\r
243 dasnode.lflags7 = LF_NOLINK;
\r
247 if (!(dasnode.lflags8 & LF_REMOTE))
\r
248 if (!AdvancedTraceWalk(dasnode, dasnode.link8, FALSE))
\r
250 dasnode.lflags8 = LF_NOWALK;
\r
251 if (!AdvancedTraceWalk(dasnode, dasnode.link8, TRUE))
\r
252 dasnode.lflags8 = LF_NOLINK;
\r
256 if (!(dasnode.lflags9 & LF_REMOTE))
\r
257 if (!AdvancedTraceWalk(dasnode, dasnode.link9, FALSE))
\r
259 dasnode.lflags9 = LF_NOWALK;
\r
260 if (!AdvancedTraceWalk(dasnode, dasnode.link9, TRUE))
\r
261 dasnode.lflags9 = LF_NOLINK;
\r
263 if (dasnode.link10)
\r
265 if (!(dasnode.lflags10 & LF_REMOTE))
\r
266 if (!AdvancedTraceWalk(dasnode, dasnode.link10, FALSE))
\r
268 dasnode.lflags10 = LF_NOWALK;
\r
269 if (!AdvancedTraceWalk(dasnode, dasnode.link10, TRUE))
\r
270 dasnode.lflags10 = LF_NOLINK;
\r
272 if (dasnode.link11)
\r
274 if (!(dasnode.lflags11 & LF_REMOTE))
\r
275 if (!AdvancedTraceWalk(dasnode, dasnode.link11, FALSE))
\r
277 dasnode.lflags11 = LF_NOWALK;
\r
278 if (!AdvancedTraceWalk(dasnode, dasnode.link11, TRUE))
\r
279 dasnode.lflags11 = LF_NOLINK;
\r
281 if (dasnode.link12)
\r
283 if (!(dasnode.lflags12 & LF_REMOTE))
\r
284 if (!AdvancedTraceWalk(dasnode, dasnode.link12, FALSE))
\r
286 dasnode.lflags12 = LF_NOWALK;
\r
287 if (!AdvancedTraceWalk(dasnode, dasnode.link12, TRUE))
\r
288 dasnode.lflags12 = LF_NOLINK;
\r
290 if (dasnode.link13)
\r
292 if (!(dasnode.lflags13 & LF_REMOTE))
\r
293 if (!AdvancedTraceWalk(dasnode, dasnode.link13, FALSE))
\r
295 dasnode.lflags13 = LF_NOWALK;
\r
296 if (!AdvancedTraceWalk(dasnode, dasnode.link13, TRUE))
\r
297 dasnode.lflags13 = LF_NOLINK;
\r
299 if (dasnode.link14)
\r
301 if (!(dasnode.lflags14 & LF_REMOTE))
\r
302 if (!AdvancedTraceWalk(dasnode, dasnode.link14, FALSE))
\r
304 dasnode.lflags14 = LF_NOWALK;
\r
305 if (!AdvancedTraceWalk(dasnode, dasnode.link14, TRUE))
\r
306 dasnode.lflags14 = LF_NOLINK;
\r
308 if (dasnode.link15)
\r
310 if (!(dasnode.lflags15 & LF_REMOTE))
\r
311 if (!AdvancedTraceWalk(dasnode, dasnode.link15, FALSE))
\r
313 dasnode.lflags15 = LF_NOWALK;
\r
314 if (!AdvancedTraceWalk(dasnode, dasnode.link15, TRUE))
\r
315 dasnode.lflags15 = LF_NOLINK;
\r
317 if (dasnode.link16)
\r
319 if (!(dasnode.lflags16 & LF_REMOTE))
\r
320 if (!AdvancedTraceWalk(dasnode, dasnode.link16, FALSE))
\r
322 dasnode.lflags16 = LF_NOWALK;
\r
323 if (!AdvancedTraceWalk(dasnode, dasnode.link16, TRUE))
\r
324 dasnode.lflags16 = LF_NOLINK;
\r
326 if (dasnode.link17)
\r
328 if (!(dasnode.lflags17 & LF_REMOTE))
\r
329 if (!AdvancedTraceWalk(dasnode, dasnode.link17, FALSE))
\r
331 dasnode.lflags17 = LF_NOWALK;
\r
332 if (!AdvancedTraceWalk(dasnode, dasnode.link17, TRUE))
\r
333 dasnode.lflags17 = LF_NOLINK;
\r
335 if (dasnode.link18)
\r
337 if (!(dasnode.lflags18 & LF_REMOTE))
\r
338 if (!AdvancedTraceWalk(dasnode, dasnode.link18, FALSE))
\r
340 dasnode.lflags18 = LF_NOWALK;
\r
341 if (!AdvancedTraceWalk(dasnode, dasnode.link18, TRUE))
\r
342 dasnode.lflags18 = LF_NOLINK;
\r
344 if (dasnode.link19)
\r
346 if (!(dasnode.lflags19 & LF_REMOTE))
\r
347 if (!AdvancedTraceWalk(dasnode, dasnode.link19, FALSE))
\r
349 dasnode.lflags19 = LF_NOWALK;
\r
350 if (!AdvancedTraceWalk(dasnode, dasnode.link19, TRUE))
\r
351 dasnode.lflags19 = LF_NOLINK;
\r
372 dasnode = dasnode.list;
\r
375 e = findchainflags(flags, FL_CLIENT);
\r
385 self.think = SUB_Remove;
\r
386 e = findchainflags(flags, FL_CLIENT);
\r
396 void() AutoFlagger =
\r
405 e.think = SUB_Remove;
\r
406 e.nextthink = time;
\r
412 dasnode = navnode_chain;
\r
414 e.think = FlaggerThink;
\r
415 e.nextthink = time;
\r