]> icculus.org git repositories - divverent/nexuiz.git/blob - navnodeedit/src/shit.qc
Made autoflagger ignore remote links (at the same time preserve them)
[divverent/nexuiz.git] / navnodeedit / src / shit.qc
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
2 \r
3 vector(vector point, entity current_space, entity goal_space) ClampPointToSpace =\r
4 {\r
5         local float North, South, West, East, Up, Down;\r
6         local float f, f2;\r
7         local vector ret_point, tvec;\r
8         local entity e;\r
9 \r
10         if (!goal_space)\r
11                 goal_space = current_space;\r
12 \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
19 \r
20         f = (East + West) * 0.5;\r
21         f2 = East - self.maxs_x;\r
22         East = max(f, f2);\r
23         f2 = West - self.mins_x;\r
24         West = min(f, f2);\r
25         f = (North + South) * 0.5;\r
26         f2 = North - self.maxs_y;\r
27         North = max(f, f2);\r
28         f2 = South - self.mins_y;\r
29         South = min(f, f2);\r
30         f = (Up + Down) * 0.5;\r
31         f2 = Up - self.maxs_z;\r
32         Up = max(f, f2);\r
33         f2 = Down - self.mins_z;\r
34         Down = min(f, f2);\r
35 \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
39 \r
40         e = goal_space.plane_chain;\r
41         while (e)\r
42         {\r
43                 tvec = self.maxs;\r
44                 if (e.mangle_x < 0)\r
45                         tvec_x = self.mins_x;\r
46                 if (e.mangle_y < 0)\r
47                         tvec_y = self.mins_y;\r
48                 if (e.mangle_z < 0)\r
49                         tvec_z = self.mins_z;\r
50                 tvec += ret_point;\r
51                 f = tvec*e.mangle - goal_space.origin*e.mangle-e.delay;\r
52                 if (f > 0)\r
53                         ret_point = ret_point - f*e.mangle;\r
54                 e = e.list;\r
55         }\r
56         return ret_point;\r
57 };\r
58 \r
59 float(entity node) CheckNode =\r
60 {\r
61         local float f, result;\r
62         local vector tvec;\r
63         local entity plane;\r
64 \r
65         if (boxenclosed(self.origin + self.mins, self.origin + self.maxs, node.origin + node.mins, node.origin + node.maxs))\r
66         {\r
67                 result = TRUE;\r
68                 plane = node.plane_chain;\r
69                 while (plane)\r
70                 {\r
71                         tvec = self.maxs;\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
80                         if (f > 0)\r
81                                 result = FALSE;\r
82                         plane = plane.list;\r
83                 }\r
84         }\r
85         return result;\r
86 };\r
87 \r
88 float(entity currentnode, entity goalnode, float flight) AdvancedTraceWalk =\r
89 {\r
90         local float f, t, bump;\r
91         local float result;\r
92         local float stepdist, fulldist, totaldist;\r
93         local vector goalpoint, oldorg, move;\r
94         local entity oldself;\r
95 \r
96         oldself = self;\r
97         stepdist = cvar("navnodeedit_tracewalk_stepdist");\r
98         fulldist = cvar("navnodeedit_tracewalk_fulldist");\r
99         result = FALSE;\r
100         self = spawn();\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) > 2 && totaldist < fulldist)\r
108         {\r
109                 oldorg = self.origin;\r
110                 if (!flight)\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
114                 if (!flight)\r
115                         move_z = 0;\r
116                 f = vlen(self.origin - goalpoint);\r
117                 f = min(f, stepdist);\r
118                 self.velocity = normalize(move)*f;\r
119                 if (!flight)\r
120                         self.velocity_z = -800;\r
121                 t = 1;\r
122                 bump = 0;\r
123                 while (bump < 16)\r
124                 {\r
125                         bump = bump + 1;\r
126                         tracebox(self.origin, self.mins, self.maxs, self.origin + self.velocity * t, TRUE, self);\r
127                         if (trace_fraction == 1)\r
128                         {\r
129                                 setorigin(self, trace_endpos);\r
130                                 break;\r
131                         }\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
135                         {\r
136                                 t = t * (1 - trace_fraction);\r
137                                 setorigin(self, trace_endpos);\r
138                         }\r
139                 }\r
140                 if (!flight)\r
141                 {\r
142                         tracebox(self.origin, self.mins, self.maxs, self.origin + '0 0 -65536', TRUE, self);\r
143                         setorigin(self, trace_endpos);\r
144                 }\r
145                 if (CheckNode(goalnode))\r
146                 {\r
147                         result = TRUE;\r
148                         break;\r
149                 }\r
150                 totaldist = totaldist + vlen(self.origin - oldorg);\r
151         }\r
152         remove(self);\r
153         self = oldself;\r
154         return result;\r
155 };\r
156 \r
157 void() FlaggerThink =\r
158 {\r
159         local entity e;\r
160 \r
161         self.nextthink = time;\r
162         if (dasnode)\r
163         {\r
164                 if (!(dasnode.lflags0 & LF_REMOTE))\r
165                 if (!AdvancedTraceWalk(dasnode, dasnode.link0, FALSE))\r
166                 {\r
167                         dasnode.lflags0 = LF_NOWALK;\r
168                         if (!AdvancedTraceWalk(dasnode, dasnode.link0, TRUE))\r
169                                 dasnode.lflags0 = LF_NOLINK;\r
170                 }\r
171                 if (dasnode.link1)\r
172                 {\r
173                         if (!(dasnode.lflags1 & LF_REMOTE))\r
174                         if (!AdvancedTraceWalk(dasnode, dasnode.link1, FALSE))\r
175                         {\r
176                                 dasnode.lflags1 = LF_NOWALK;\r
177                                 if (!AdvancedTraceWalk(dasnode, dasnode.link1, TRUE))\r
178                                         dasnode.lflags1 = LF_NOLINK;\r
179                         }\r
180                         if (dasnode.link2)\r
181                         {\r
182                                 if (!(dasnode.lflags2 & LF_REMOTE))\r
183                                 if (!AdvancedTraceWalk(dasnode, dasnode.link2, FALSE))\r
184                                 {\r
185                                         dasnode.lflags2 = LF_NOWALK;\r
186                                         if (!AdvancedTraceWalk(dasnode, dasnode.link2, TRUE))\r
187                                                 dasnode.lflags2 = LF_NOLINK;\r
188                                 }\r
189                                 if (dasnode.link3)\r
190                                 {\r
191                                         if (!(dasnode.lflags3 & LF_REMOTE))\r
192                                         if (!AdvancedTraceWalk(dasnode, dasnode.link3, FALSE))\r
193                                         {\r
194                                                 dasnode.lflags3 = LF_NOWALK;\r
195                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link3, TRUE))\r
196                                                         dasnode.lflags3 = LF_NOLINK;\r
197                                         }\r
198                                         if (dasnode.link4)\r
199                                         {\r
200                                                 if (!(dasnode.lflags4 & LF_REMOTE))\r
201                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link4, FALSE))\r
202                                                 {\r
203                                                         dasnode.lflags4 = LF_NOWALK;\r
204                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link4, TRUE))\r
205                                                                 dasnode.lflags4 = LF_NOLINK;\r
206                                                 }\r
207                                                 if (dasnode.link5)\r
208                                                 {\r
209                                                         if (!(dasnode.lflags5 & LF_REMOTE))\r
210                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link5, FALSE))\r
211                                                         {\r
212                                                                 dasnode.lflags5 = LF_NOWALK;\r
213                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link5, TRUE))\r
214                                                                         dasnode.lflags5 = LF_NOLINK;\r
215                                                         }\r
216                                                         if (dasnode.link6)\r
217                                                         {\r
218                                                                 if (!(dasnode.lflags6 & LF_REMOTE))\r
219                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link6, FALSE))\r
220                                                                 {\r
221                                                                         dasnode.lflags6 = LF_NOWALK;\r
222                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link6, TRUE))\r
223                                                                                 dasnode.lflags6 = LF_NOLINK;\r
224                                                                 }\r
225                                                                 if (dasnode.link7)\r
226                                                                 {\r
227                                                                         if (!(dasnode.lflags7 & LF_REMOTE))\r
228                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link7, FALSE))\r
229                                                                         {\r
230                                                                                 dasnode.lflags7 = LF_NOWALK;\r
231                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link7, TRUE))\r
232                                                                                         dasnode.lflags7 = LF_NOLINK;\r
233                                                                         }\r
234                                                                         if (dasnode.link8)\r
235                                                                         {\r
236                                                                                 if (!(dasnode.lflags8 & LF_REMOTE))\r
237                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link8, FALSE))\r
238                                                                                 {\r
239                                                                                         dasnode.lflags8 = LF_NOWALK;\r
240                                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link8, TRUE))\r
241                                                                                                 dasnode.lflags8 = LF_NOLINK;\r
242                                                                                 }\r
243                                                                                 if (dasnode.link9)\r
244                                                                                 {\r
245                                                                                         if (!(dasnode.lflags9 & LF_REMOTE))\r
246                                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link9, FALSE))\r
247                                                                                         {\r
248                                                                                                 dasnode.lflags9 = LF_NOWALK;\r
249                                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link9, TRUE))\r
250                                                                                                         dasnode.lflags9 = LF_NOLINK;\r
251                                                                                         }\r
252                                                                                         if (dasnode.link10)\r
253                                                                                         {\r
254                                                                                                 if (!(dasnode.lflags10 & LF_REMOTE))\r
255                                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link10, FALSE))\r
256                                                                                                 {\r
257                                                                                                         dasnode.lflags10 = LF_NOWALK;\r
258                                                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link10, TRUE))\r
259                                                                                                                 dasnode.lflags10 = LF_NOLINK;\r
260                                                                                                 }\r
261                                                                                                 if (dasnode.link11)\r
262                                                                                                 {\r
263                                                                                                         if (!(dasnode.lflags11 & LF_REMOTE))\r
264                                                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link11, FALSE))\r
265                                                                                                         {\r
266                                                                                                                 dasnode.lflags11 = LF_NOWALK;\r
267                                                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link11, TRUE))\r
268                                                                                                                         dasnode.lflags11 = LF_NOLINK;\r
269                                                                                                         }\r
270                                                                                                         if (dasnode.link12)\r
271                                                                                                         {\r
272                                                                                                                 if (!(dasnode.lflags12 & LF_REMOTE))\r
273                                                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link12, FALSE))\r
274                                                                                                                 {\r
275                                                                                                                         dasnode.lflags12 = LF_NOWALK;\r
276                                                                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link12, TRUE))\r
277                                                                                                                                 dasnode.lflags12 = LF_NOLINK;\r
278                                                                                                                 }\r
279                                                                                                                 if (dasnode.link13)\r
280                                                                                                                 {\r
281                                                                                                                         if (!(dasnode.lflags13 & LF_REMOTE))\r
282                                                                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link13, FALSE))\r
283                                                                                                                         {\r
284                                                                                                                                 dasnode.lflags13 = LF_NOWALK;\r
285                                                                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link13, TRUE))\r
286                                                                                                                                         dasnode.lflags13 = LF_NOLINK;\r
287                                                                                                                         }\r
288                                                                                                                         if (dasnode.link14)\r
289                                                                                                                         {\r
290                                                                                                                                 if (!(dasnode.lflags14 & LF_REMOTE))\r
291                                                                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link14, FALSE))\r
292                                                                                                                                 {\r
293                                                                                                                                         dasnode.lflags14 = LF_NOWALK;\r
294                                                                                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link14, TRUE))\r
295                                                                                                                                                 dasnode.lflags14 = LF_NOLINK;\r
296                                                                                                                                 }\r
297                                                                                                                                 if (dasnode.link15)\r
298                                                                                                                                 {\r
299                                                                                                                                         if (!(dasnode.lflags15 & LF_REMOTE))\r
300                                                                                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link15, FALSE))\r
301                                                                                                                                         {\r
302                                                                                                                                                 dasnode.lflags15 = LF_NOWALK;\r
303                                                                                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link15, TRUE))\r
304                                                                                                                                                         dasnode.lflags15 = LF_NOLINK;\r
305                                                                                                                                         }\r
306                                                                                                                                         if (dasnode.link16)\r
307                                                                                                                                         {\r
308                                                                                                                                                 if (!(dasnode.lflags16 & LF_REMOTE))\r
309                                                                                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link16, FALSE))\r
310                                                                                                                                                 {\r
311                                                                                                                                                         dasnode.lflags16 = LF_NOWALK;\r
312                                                                                                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link16, TRUE))\r
313                                                                                                                                                                 dasnode.lflags16 = LF_NOLINK;\r
314                                                                                                                                                 }\r
315                                                                                                                                                 if (dasnode.link17)\r
316                                                                                                                                                 {\r
317                                                                                                                                                         if (!(dasnode.lflags17 & LF_REMOTE))\r
318                                                                                                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link17, FALSE))\r
319                                                                                                                                                         {\r
320                                                                                                                                                                 dasnode.lflags17 = LF_NOWALK;\r
321                                                                                                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link17, TRUE))\r
322                                                                                                                                                                         dasnode.lflags17 = LF_NOLINK;\r
323                                                                                                                                                         }\r
324                                                                                                                                                         if (dasnode.link18)\r
325                                                                                                                                                         {\r
326                                                                                                                                                                 if (!(dasnode.lflags18 & LF_REMOTE))\r
327                                                                                                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link18, FALSE))\r
328                                                                                                                                                                 {\r
329                                                                                                                                                                         dasnode.lflags18 = LF_NOWALK;\r
330                                                                                                                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link18, TRUE))\r
331                                                                                                                                                                                 dasnode.lflags18 = LF_NOLINK;\r
332                                                                                                                                                                 }\r
333                                                                                                                                                                 if (dasnode.link19)\r
334                                                                                                                                                                 {\r
335                                                                                                                                                                         if (!(dasnode.lflags19 & LF_REMOTE))\r
336                                                                                                                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link19, FALSE))\r
337                                                                                                                                                                         {\r
338                                                                                                                                                                                 dasnode.lflags19 = LF_NOWALK;\r
339                                                                                                                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link19, TRUE))\r
340                                                                                                                                                                                         dasnode.lflags19 = LF_NOLINK;\r
341                                                                                                                                                                         }\r
342                                                                                                                                                                 }\r
343                                                                                                                                                         }\r
344                                                                                                                                                 }\r
345                                                                                                                                         }\r
346                                                                                                                                 }\r
347                                                                                                                         }\r
348                                                                                                                 }\r
349                                                                                                         }\r
350                                                                                                 }\r
351                                                                                         }\r
352                                                                                 }\r
353                                                                         }\r
354                                                                 }\r
355                                                         }\r
356                                                 }\r
357                                         }\r
358                                 }\r
359                         }\r
360                 }\r
361                 dasnode = dasnode.list;\r
362         }\r
363         else\r
364         {\r
365                 self.think = SUB_Remove;\r
366                 e = findchainflags(flags, FL_CLIENT);\r
367                 while (e)\r
368                 {\r
369                         e.confirm = 0;\r
370                         e = e.chain;            \r
371                 }\r
372         }\r
373 };\r
374 \r
375 void() AutoFlagger =\r
376 {\r
377         local entity e;\r
378 \r
379         dasnode = navnode_chain;\r
380         e = spawn();\r
381         e.think = FlaggerThink;\r
382         e.nextthink = time;\r
383 };