1 var float pathlib_wpp_open(entity wp, entity child, float cost);
3 void pathlib_wpp_close(entity wp)
8 wp.pathlib_list = closedlist;
10 if(wp == best_open_node)
11 best_open_node = world;
14 pathlib_foundgoal = TRUE;
17 float pathlib_wpp_opencb(entity wp, entity child, float cost)
20 if(child.pathlib_list == closedlist)
23 // FIXME! wp.wp##mincost is NOT distance. Make it distance or add a field for distance to be used here (for better speed)
24 cost = vlen(child.origin - wp.origin);
27 child.pathlib_list = openlist;
28 child.pathlib_node_g = wp.pathlib_node_g + cost;
29 child.pathlib_node_h = pathlib_heuristic(child.origin, goal_node.origin);
30 child.pathlib_node_c = pathlib_wpp_waypointcallback(child, wp);
31 child.pathlib_node_f = child.pathlib_node_g + child.pathlib_node_h + child.pathlib_node_c;
34 if(child == goal_node)
35 pathlib_foundgoal = TRUE;
39 if(best_open_node.pathlib_node_f > child.pathlib_node_f)
40 best_open_node = child;
45 float pathlib_wpp_openncb(entity wp, entity child, float cost)
48 if(child.pathlib_list == closedlist)
51 // FIXME! wp.wp##mincost is NOT distance. Make it distance or add a field for distance to be used here (for better speed)
52 cost = vlen(child.origin - wp.origin);
55 child.pathlib_list = openlist;
56 child.pathlib_node_g = wp.pathlib_node_g + cost;
57 child.pathlib_node_h = pathlib_heuristic(child.origin, goal_node.origin);
58 child.pathlib_node_f = child.pathlib_node_g + child.pathlib_node_h;
60 if(child == goal_node)
61 pathlib_foundgoal = TRUE;
65 if(best_open_node.pathlib_node_f > child.pathlib_node_f)
66 best_open_node = child;
71 float pathlib_wpp_expand(entity wp)
73 if(wp.wp00) pathlib_wpp_open(wp,wp.wp00,wp.wp00mincost); else return 0;
74 if(wp.wp01) pathlib_wpp_open(wp,wp.wp01,wp.wp01mincost); else return 1;
75 if(wp.wp02) pathlib_wpp_open(wp,wp.wp02,wp.wp02mincost); else return 2;
76 if(wp.wp03) pathlib_wpp_open(wp,wp.wp03,wp.wp03mincost); else return 3;
77 if(wp.wp04) pathlib_wpp_open(wp,wp.wp04,wp.wp04mincost); else return 4;
78 if(wp.wp05) pathlib_wpp_open(wp,wp.wp05,wp.wp05mincost); else return 5;
79 if(wp.wp06) pathlib_wpp_open(wp,wp.wp06,wp.wp06mincost); else return 6;
80 if(wp.wp07) pathlib_wpp_open(wp,wp.wp07,wp.wp07mincost); else return 7;
81 if(wp.wp08) pathlib_wpp_open(wp,wp.wp08,wp.wp08mincost); else return 8;
82 if(wp.wp09) pathlib_wpp_open(wp,wp.wp09,wp.wp09mincost); else return 9;
83 if(wp.wp10) pathlib_wpp_open(wp,wp.wp10,wp.wp10mincost); else return 10;
84 if(wp.wp11) pathlib_wpp_open(wp,wp.wp11,wp.wp11mincost); else return 11;
85 if(wp.wp12) pathlib_wpp_open(wp,wp.wp12,wp.wp12mincost); else return 12;
86 if(wp.wp13) pathlib_wpp_open(wp,wp.wp13,wp.wp13mincost); else return 13;
87 if(wp.wp14) pathlib_wpp_open(wp,wp.wp14,wp.wp14mincost); else return 14;
88 if(wp.wp15) pathlib_wpp_open(wp,wp.wp15,wp.wp15mincost); else return 15;
89 if(wp.wp16) pathlib_wpp_open(wp,wp.wp16,wp.wp16mincost); else return 16;
90 if(wp.wp17) pathlib_wpp_open(wp,wp.wp17,wp.wp17mincost); else return 17;
91 if(wp.wp18) pathlib_wpp_open(wp,wp.wp18,wp.wp18mincost); else return 18;
92 if(wp.wp19) pathlib_wpp_open(wp,wp.wp19,wp.wp19mincost); else return 19;
93 if(wp.wp20) pathlib_wpp_open(wp,wp.wp20,wp.wp20mincost); else return 20;
94 if(wp.wp21) pathlib_wpp_open(wp,wp.wp21,wp.wp21mincost); else return 21;
95 if(wp.wp22) pathlib_wpp_open(wp,wp.wp22,wp.wp22mincost); else return 22;
96 if(wp.wp23) pathlib_wpp_open(wp,wp.wp23,wp.wp23mincost); else return 23;
97 if(wp.wp24) pathlib_wpp_open(wp,wp.wp24,wp.wp24mincost); else return 24;
98 if(wp.wp25) pathlib_wpp_open(wp,wp.wp25,wp.wp25mincost); else return 25;
99 if(wp.wp26) pathlib_wpp_open(wp,wp.wp26,wp.wp26mincost); else return 26;
100 if(wp.wp27) pathlib_wpp_open(wp,wp.wp27,wp.wp27mincost); else return 27;
101 if(wp.wp28) pathlib_wpp_open(wp,wp.wp28,wp.wp28mincost); else return 28;
102 if(wp.wp29) pathlib_wpp_open(wp,wp.wp29,wp.wp29mincost); else return 29;
103 if(wp.wp30) pathlib_wpp_open(wp,wp.wp30,wp.wp30mincost); else return 30;
104 if(wp.wp31) pathlib_wpp_open(wp,wp.wp31,wp.wp31mincost); else return 31;
109 entity pathlib_wpp_bestopen()
114 return best_open_node;
116 n = findchainentity(pathlib_list, openlist);
120 if(n.pathlib_node_f < best.pathlib_node_f)
130 entity pathlib_waypointpath(entity wp_from, entity wp_to, float callback)
135 ptime = gettime(GETTIME_REALTIME);
136 pathlib_starttime = ptime;
137 pathlib_movecost = 300;
138 pathlib_movecost_diag = vlen('1 1 0' * pathlib_movecost);
140 if (!pathlib_wpp_waypointcallback)
144 pathlib_wpp_open = pathlib_wpp_opencb;
146 pathlib_wpp_open = pathlib_wpp_openncb;
148 pathlib_heuristic = pathlib_h_none;
154 closedlist = spawn();
156 pathlib_closed_cnt = 0;
157 pathlib_open_cnt = 0;
158 pathlib_searched_cnt = 0;
159 pathlib_foundgoal = FALSE;
161 dprint("pathlib_waypointpath init\n");
163 // Initialize waypoint grid
164 // FIXME! presisted chain for better preformance
165 for(n = findchain(classname, "waypoint"); n; n = n.chain)
167 n.pathlib_list = world;
168 n.pathlib_node_g = 0;
169 n.pathlib_node_f = 0;
170 n.pathlib_node_h = 0;
172 //setmodel(n, "models/runematch/rune.mdl");
173 //n.effects = EF_LOWPRECISION;
174 //n.colormod = '0 0 0';
180 start_node = wp_from;
182 start_node.pathlib_list = closedlist;
183 dprint("Expanding ",ftos(pathlib_wpp_expand(start_node))," links\n");
184 if(pathlib_open_cnt <= 0)
186 dprint("pathlib_waypointpath: Start waypoint not linked! aborting.\n");
193 entity pathlib_waypointpath_step()
197 n = pathlib_wpp_bestopen();
200 dprint("Cannot find best open node, abort.\n");
203 pathlib_wpp_close(n);
204 dprint("Expanding ",ftos(pathlib_wpp_expand(n))," links\n");
206 if(pathlib_foundgoal)
208 entity start, end, open, ln;
210 dprint("Target found. Rebuilding and filtering path...\n");
212 buildpath_nodefilter = buildpath_nodefilter_none;
213 start = path_build(world, start_node.origin, world, world);
214 end = path_build(world, goal_node.origin, world, start);
217 for(open = goal_node; open.path_prev != start_node; open = open.path_prev)
219 n = path_build(ln,open.origin,open.path_prev,start);
233 pathlib_waypointpath_step();
234 if(pathlib_foundgoal)
236 self.nextthink = time + 0.1;
239 void pathlib_waypointpath_autostep()
243 n.think = plas_think;
244 n.nextthink = time + 0.1;