]> icculus.org git repositories - divverent/nexuiz.git/blob - navnodeedit/src/shit.qc
Added automatic link flagger. Currently experimental, someone try it out please,...
[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         self = oldself;\r
153         return result;\r
154 };\r
155 \r
156 void() FlaggerThink =\r
157 {\r
158         local entity e;\r
159 \r
160         self.nextthink = time;\r
161         if (dasnode)\r
162         {\r
163                 if (!AdvancedTraceWalk(dasnode, dasnode.link0, FALSE))\r
164                 {\r
165                         dasnode.lflags0 = LF_NOWALK;\r
166                         if (!AdvancedTraceWalk(dasnode, dasnode.link0, TRUE))\r
167                                 dasnode.lflags0 = LF_NOLINK;\r
168                 }\r
169                 if (dasnode.link1)\r
170                 {\r
171                         if (!AdvancedTraceWalk(dasnode, dasnode.link1, FALSE))\r
172                         {\r
173                                 dasnode.lflags1 = LF_NOWALK;\r
174                                 if (!AdvancedTraceWalk(dasnode, dasnode.link1, TRUE))\r
175                                         dasnode.lflags1 = LF_NOLINK;\r
176                         }\r
177                         if (dasnode.link2)\r
178                         {\r
179                                 if (!AdvancedTraceWalk(dasnode, dasnode.link2, FALSE))\r
180                                 {\r
181                                         dasnode.lflags2 = LF_NOWALK;\r
182                                         if (!AdvancedTraceWalk(dasnode, dasnode.link2, TRUE))\r
183                                                 dasnode.lflags2 = LF_NOLINK;\r
184                                 }\r
185                                 if (dasnode.link3)\r
186                                 {\r
187                                         if (!AdvancedTraceWalk(dasnode, dasnode.link3, FALSE))\r
188                                         {\r
189                                                 dasnode.lflags3 = LF_NOWALK;\r
190                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link3, TRUE))\r
191                                                         dasnode.lflags3 = LF_NOLINK;\r
192                                         }\r
193                                         if (dasnode.link4)\r
194                                         {\r
195                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link4, FALSE))\r
196                                                 {\r
197                                                         dasnode.lflags4 = LF_NOWALK;\r
198                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link4, TRUE))\r
199                                                                 dasnode.lflags4 = LF_NOLINK;\r
200                                                 }\r
201                                                 if (dasnode.link5)\r
202                                                 {\r
203                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link5, FALSE))\r
204                                                         {\r
205                                                                 dasnode.lflags5 = LF_NOWALK;\r
206                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link5, TRUE))\r
207                                                                         dasnode.lflags5 = LF_NOLINK;\r
208                                                         }\r
209                                                         if (dasnode.link6)\r
210                                                         {\r
211                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link6, FALSE))\r
212                                                                 {\r
213                                                                         dasnode.lflags6 = LF_NOWALK;\r
214                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link6, TRUE))\r
215                                                                                 dasnode.lflags6 = LF_NOLINK;\r
216                                                                 }\r
217                                                                 if (dasnode.link7)\r
218                                                                 {\r
219                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link7, FALSE))\r
220                                                                         {\r
221                                                                                 dasnode.lflags7 = LF_NOWALK;\r
222                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link7, TRUE))\r
223                                                                                         dasnode.lflags7 = LF_NOLINK;\r
224                                                                         }\r
225                                                                         if (dasnode.link8)\r
226                                                                         {\r
227                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link8, FALSE))\r
228                                                                                 {\r
229                                                                                         dasnode.lflags8 = LF_NOWALK;\r
230                                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link8, TRUE))\r
231                                                                                                 dasnode.lflags8 = LF_NOLINK;\r
232                                                                                 }\r
233                                                                                 if (dasnode.link9)\r
234                                                                                 {\r
235                                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link9, FALSE))\r
236                                                                                         {\r
237                                                                                                 dasnode.lflags9 = LF_NOWALK;\r
238                                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link9, TRUE))\r
239                                                                                                         dasnode.lflags9 = LF_NOLINK;\r
240                                                                                         }\r
241                                                                                         if (dasnode.link10)\r
242                                                                                         {\r
243                                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link10, FALSE))\r
244                                                                                                 {\r
245                                                                                                         dasnode.lflags10 = LF_NOWALK;\r
246                                                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link10, TRUE))\r
247                                                                                                                 dasnode.lflags10 = LF_NOLINK;\r
248                                                                                                 }\r
249                                                                                                 if (dasnode.link11)\r
250                                                                                                 {\r
251                                                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link11, FALSE))\r
252                                                                                                         {\r
253                                                                                                                 dasnode.lflags11 = LF_NOWALK;\r
254                                                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link11, TRUE))\r
255                                                                                                                         dasnode.lflags11 = LF_NOLINK;\r
256                                                                                                         }\r
257                                                                                                         if (dasnode.link12)\r
258                                                                                                         {\r
259                                                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link12, FALSE))\r
260                                                                                                                 {\r
261                                                                                                                         dasnode.lflags12 = LF_NOWALK;\r
262                                                                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link12, TRUE))\r
263                                                                                                                                 dasnode.lflags12 = LF_NOLINK;\r
264                                                                                                                 }\r
265                                                                                                                 if (dasnode.link13)\r
266                                                                                                                 {\r
267                                                                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link13, FALSE))\r
268                                                                                                                         {\r
269                                                                                                                                 dasnode.lflags13 = LF_NOWALK;\r
270                                                                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link13, TRUE))\r
271                                                                                                                                         dasnode.lflags13 = LF_NOLINK;\r
272                                                                                                                         }\r
273                                                                                                                         if (dasnode.link14)\r
274                                                                                                                         {\r
275                                                                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link14, FALSE))\r
276                                                                                                                                 {\r
277                                                                                                                                         dasnode.lflags14 = LF_NOWALK;\r
278                                                                                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link14, TRUE))\r
279                                                                                                                                                 dasnode.lflags14 = LF_NOLINK;\r
280                                                                                                                                 }\r
281                                                                                                                                 if (dasnode.link15)\r
282                                                                                                                                 {\r
283                                                                                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link15, FALSE))\r
284                                                                                                                                         {\r
285                                                                                                                                                 dasnode.lflags15 = LF_NOWALK;\r
286                                                                                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link15, TRUE))\r
287                                                                                                                                                         dasnode.lflags15 = LF_NOLINK;\r
288                                                                                                                                         }\r
289                                                                                                                                         if (dasnode.link16)\r
290                                                                                                                                         {\r
291                                                                                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link16, FALSE))\r
292                                                                                                                                                 {\r
293                                                                                                                                                         dasnode.lflags16 = LF_NOWALK;\r
294                                                                                                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link16, TRUE))\r
295                                                                                                                                                                 dasnode.lflags16 = LF_NOLINK;\r
296                                                                                                                                                 }\r
297                                                                                                                                                 if (dasnode.link17)\r
298                                                                                                                                                 {\r
299                                                                                                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link17, FALSE))\r
300                                                                                                                                                         {\r
301                                                                                                                                                                 dasnode.lflags17 = LF_NOWALK;\r
302                                                                                                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link17, TRUE))\r
303                                                                                                                                                                         dasnode.lflags17 = LF_NOLINK;\r
304                                                                                                                                                         }\r
305                                                                                                                                                         if (dasnode.link18)\r
306                                                                                                                                                         {\r
307                                                                                                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link18, FALSE))\r
308                                                                                                                                                                 {\r
309                                                                                                                                                                         dasnode.lflags18 = LF_NOWALK;\r
310                                                                                                                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link18, TRUE))\r
311                                                                                                                                                                                 dasnode.lflags18 = LF_NOLINK;\r
312                                                                                                                                                                 }\r
313                                                                                                                                                                 if (dasnode.link19)\r
314                                                                                                                                                                 {\r
315                                                                                                                                                                         if (!AdvancedTraceWalk(dasnode, dasnode.link19, FALSE))\r
316                                                                                                                                                                         {\r
317                                                                                                                                                                                 dasnode.lflags19 = LF_NOWALK;\r
318                                                                                                                                                                                 if (!AdvancedTraceWalk(dasnode, dasnode.link19, TRUE))\r
319                                                                                                                                                                                         dasnode.lflags19 = LF_NOLINK;\r
320                                                                                                                                                                         }\r
321                                                                                                                                                                 }\r
322                                                                                                                                                         }\r
323                                                                                                                                                 }\r
324                                                                                                                                         }\r
325                                                                                                                                 }\r
326                                                                                                                         }\r
327                                                                                                                 }\r
328                                                                                                         }\r
329                                                                                                 }\r
330                                                                                         }\r
331                                                                                 }\r
332                                                                         }\r
333                                                                 }\r
334                                                         }\r
335                                                 }\r
336                                         }\r
337                                 }\r
338                         }\r
339                 }\r
340                 dasnode = dasnode.list;\r
341         }\r
342         else\r
343         {\r
344                 self.think = SUB_Remove;\r
345                 e = findchainflags(flags, FL_CLIENT);\r
346                 while (e)\r
347                 {\r
348                         e.confirm = 0;\r
349                         e = e.chain;            \r
350                 }\r
351         }\r
352 };\r
353 \r
354 void() AutoFlagger =\r
355 {\r
356         local entity e;\r
357 \r
358         dasnode = navnode_chain;\r
359         e = spawn();\r
360         e.think = FlaggerThink;\r
361         e.nextthink = time;\r
362 };