5 // .entity path_start;
\r
7 .float(vector start,vector end) path_validate;
\r
9 float pathlib_stdproc_path_validate(vector start,vector end)
\r
11 tracebox(start, self.mins, self.maxs, end, MOVE_NOMONSTERS, self);
\r
13 if(vlen(trace_endpos - end) < 32)
\r
19 void pathlib_point_use()
\r
24 entity pathlib_createpoint(entity parent,entity next,entity first,vector where)
\r
28 point.classname = "path_node";
\r
30 //bprint("Create point\n");
\r
32 traceline(where + '0 0 32' ,where - '0 0 10000',MOVE_NOMONSTERS,self);
\r
33 where = trace_endpos + '0 0 32';
\r
35 setorigin(point,where);
\r
38 point.owner = parent;
\r
41 point.classname = "path_master";
\r
42 point.owner = point;
\r
46 point.path_prev = parent;
\r
49 point.path_next = next;
\r
51 point.classname = "path_end";
\r
56 #define pathib_maxdivide 128
\r
58 vector pathlib_findsubpath(vector start,vector vcrash,vector end,float maxsize)
\r
65 float pathlength_best;
\r
70 pathlength_best = 1000000;
\r
72 step = vlen(self.maxs - self.mins) * 1.5;
\r
75 //bprint("pathlib_findsubpath: step=",s);
\r
76 //s = ftos(maxsize);
\r
77 //bprint(" size=",s,"\n");
\r
79 //for(z = -maxsize; z < maxsize; z += step)
\r
80 for(y = -maxsize; y < maxsize; y += step)
\r
81 for(x = -maxsize; x < maxsize; x += step)
\r
85 point_x = point_x + x;
\r
86 point_y = point_y + y;
\r
88 traceline(point + '0 0 32' ,point - '0 0 10000',MOVE_NOMONSTERS,self);
\r
89 point = trace_endpos + '0 0 32';
\r
91 clear = self.path_validate(start,point);
\r
95 //bprint("Good point\n");
\r
97 dist = vlen(start - point);
\r
100 pathlength = dist + vlen(point - end);
\r
101 if(pathlength < pathlength_best)
\r
104 pathlength_best = pathlength;
\r
111 if(pathlength_best != 1000000)
\r
117 float pathlib_path(entity start,entity end)
\r
120 vector subpath_point;
\r
122 //bprint("pathlib_path...\n");
\r
125 if(start.cnt > pathib_maxdivide)
\r
128 if(self.path_validate(start.origin,end.origin))
\r
131 vcrash = trace_endpos;
\r
133 subpath_point = pathlib_findsubpath(start.origin,vcrash,end.origin,500);
\r
135 if(subpath_point == vcrash)
\r
138 subpoint = pathlib_createpoint(start,end,start.owner,subpath_point);
\r
139 subpoint.cnt = start.cnt +1;
\r
140 start.path_next = subpoint;
\r
141 end.path_prev = subpoint;
\r
142 if(self.path_validate(start.origin,end.origin))
\r
145 return pathlib_path(subpoint,end);
\r
152 if(c > pathib_maxdivide)
\r
155 subpath_point = pathlib_findsubpath(subpoint2.origin,vcrash,end.origin,2000);
\r
156 if(subpath_point == vcrash)
\r
159 subpoint = pathlib_createpoint(subpoint2,end,start.owner,subpath_point);
\r
160 subpoint.cnt = subpoint2.cnt +1;
\r
161 subpoint2.path_next = subpoint;
\r
163 clear = self.path_validate(subpoint2.origin,end.origin);
\r
164 vcrash = trace_endpos;
\r
167 subpoint2 = subpoint;
\r
179 void pathlib_path_optimize(entity start,entity end)
\r
181 entity point,point_tmp;
\r
182 point = start.path_next;
\r
185 while(point != end)
\r
190 //bprint("pathlib_path_optimize runaway!\n");
\r
194 point = point.path_next;
\r
195 if(self.path_validate(point_tmp.path_prev.origin,point_tmp.path_next.origin))
\r
198 point_tmp.path_next.path_prev = point_tmp.path_prev;
\r
199 point_tmp.path_prev.path_next = point_tmp.path_next;
\r
205 void pathlib_deletepath(entity start)
\r
209 e = findentity(start, owner, start);
\r
213 e = findentity(start, owner, start);
\r
217 void pathlib_showpath(entity start)
\r
223 te_lightning1(e,e.origin,e.path_next.origin);
\r
228 entity dynpath_make(vector from, vector to)
\r
230 entity e_start,e_end;
\r
235 if(!self.path_validate)
\r
236 self.path_validate = pathlib_stdproc_path_validate;
\r
238 e_start = pathlib_createpoint(world,world,world,from);
\r
239 e_start.owner = e_start;
\r
240 e_end = pathlib_createpoint(e_start,world,e_start,to);
\r
241 e_start.path_next = e_end;
\r
244 if(!pathlib_path(e_start,e_end))
\r
246 //bprint("Crap.\n");
\r
247 pathlib_deletepath(e_start);
\r
252 pathlib_path_optimize(e_start,e_end);
\r
257 //bprint("^2Path created in ", s, " seconds\n");
\r
263 void pathlib_test_think()
\r
265 //bprint("pathlib_test tink...\n");
\r
266 pathlib_showpath(self.enemy);
\r
267 self.nextthink = time + 0.5;
\r
269 void pathlib_test_dinit()
\r
273 // bprint("pathlib_test spawning...\n");
\r
275 if(self.target == "")
\r
277 bprint("^1 ==== ERROR: pathlib_test with no target. ====\n");
\r
282 end = find(world,targetname,self.target);
\r
285 bprint("^1 ==== ERROR: pathlib_test with no valid target. ====\n");
\r
290 setsize(self,'-70 -70 0','70 70 70');
\r
291 path = dynpath_make(self.origin,end.origin);
\r
294 bprint("^1 ==== ERROR: pathlib_test pathing fail ====\n");
\r
300 self.think = pathlib_test_think;
\r
301 self.nextthink = time + 0.5;
\r
304 void spawnfunc_pathlib_test()
\r
306 self.think = pathlib_test_dinit;
\r
307 self.nextthink = time + 2;
\r