]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/pathlib/path_waypoint.qc
Merge remote-tracking branch 'origin/TimePath/experiments/csqc_prediction' into TimeP...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / pathlib / path_waypoint.qc
1 var float pathlib_wpp_open(entity wp, entity child, float cost);
2
3 void pathlib_wpp_close(entity wp)
4 {
5     --pathlib_open_cnt;
6     ++pathlib_closed_cnt;
7
8     wp.pathlib_list = closedlist;
9
10     if(wp == best_open_node)
11         best_open_node = world;
12
13     if(wp == goal_node)
14         pathlib_foundgoal = true;
15 }
16
17 float pathlib_wpp_opencb(entity wp, entity child, float cost)
18 {
19
20     if(child.pathlib_list == closedlist)
21         return false;
22
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);
25
26     child.path_prev      = wp;
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;
32
33
34     if(child == goal_node)
35         pathlib_foundgoal = true;
36
37     ++pathlib_open_cnt;
38
39     if(best_open_node.pathlib_node_f > child.pathlib_node_f)
40         best_open_node = child;
41
42     return true;
43 }
44
45 float pathlib_wpp_openncb(entity wp, entity child, float cost)
46 {
47
48     if(child.pathlib_list == closedlist)
49         return false;
50
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);
53
54     child.path_prev      = wp;
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;
59
60     if(child == goal_node)
61         pathlib_foundgoal = true;
62
63     ++pathlib_open_cnt;
64
65     if(best_open_node.pathlib_node_f > child.pathlib_node_f)
66         best_open_node = child;
67
68     return true;
69 }
70
71 float pathlib_wpp_expand(entity wp)
72 {
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;
105
106     return 32;
107 }
108
109 entity pathlib_wpp_bestopen()
110 {
111     entity n, best;
112
113     if(best_open_node)
114         return best_open_node;
115
116     n = findchainentity(pathlib_list, openlist);
117     best = n;
118     while(n)
119     {
120         if(n.pathlib_node_f < best.pathlib_node_f)
121             best = n;
122
123         n = n.chain;
124     }
125
126     return best;
127
128 }
129
130 entity pathlib_waypointpath(entity wp_from, entity wp_to, float callback)
131 {
132     entity n;
133     float ptime;
134
135     ptime                                       = gettime(GETTIME_REALTIME);
136     pathlib_starttime           = ptime;
137         pathlib_movecost                = 300;
138         pathlib_movecost_diag   = vlen('1 1 0' * pathlib_movecost);
139
140         if (!pathlib_wpp_waypointcallback)
141                 callback = false;
142
143         if (callback)
144                 pathlib_wpp_open = pathlib_wpp_opencb;
145         else
146                 pathlib_wpp_open = pathlib_wpp_openncb;
147
148         pathlib_heuristic = pathlib_h_none;
149
150     if (!openlist)
151         openlist       = spawn();
152
153     if (!closedlist)
154         closedlist     = spawn();
155
156     pathlib_closed_cnt       = 0;
157     pathlib_open_cnt         = 0;
158     pathlib_searched_cnt     = 0;
159     pathlib_foundgoal      = false;
160
161     dprint("pathlib_waypointpath init\n");
162
163     // Initialize waypoint grid
164     // FIXME! presisted chain for better preformance
165     for(n = findchain(classname, "waypoint"); n; n = n.chain)
166     {
167         n.pathlib_list = world;
168         n.pathlib_node_g = 0;
169         n.pathlib_node_f = 0;
170         n.pathlib_node_h = 0;
171
172         //setmodel(n, "models/runematch/rune.mdl");
173         //n.effects = EF_LOWPRECISION;
174         //n.colormod = '0 0 0';
175         //n.scale = 1;
176
177     }
178
179     goal_node  = wp_to;
180     start_node = wp_from;
181
182     start_node.pathlib_list = closedlist;
183     dprint("Expanding ",ftos(pathlib_wpp_expand(start_node))," links\n");
184     if(pathlib_open_cnt <= 0)
185     {
186         dprint("pathlib_waypointpath: Start waypoint not linked! aborting.\n");
187         return world;
188     }
189
190     return world;
191 }
192
193 entity pathlib_waypointpath_step()
194 {
195     entity n;
196
197     n = pathlib_wpp_bestopen();
198     if(!n)
199     {
200         dprint("Cannot find best open node, abort.\n");
201         return world;
202     }
203     pathlib_wpp_close(n);
204         dprint("Expanding ",ftos(pathlib_wpp_expand(n))," links\n");
205
206     if(pathlib_foundgoal)
207     {
208         entity start, end, open, ln;
209
210         dprint("Target found. Rebuilding and filtering path...\n");
211
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);
215                 ln    = end;
216
217                 for(open = goal_node; open.path_prev != start_node; open = open.path_prev)
218                 {
219                         n    = path_build(ln,open.origin,open.path_prev,start);
220                         ln.path_prev = n;
221                         ln = n;
222                 }
223                 start.path_next = n;
224                 n.path_prev = start;
225
226         return start;
227     }
228
229     return world;
230 }
231 void plas_think()
232 {
233     pathlib_waypointpath_step();
234     if(pathlib_foundgoal)
235         return;
236     self.nextthink = time + 0.1;
237 }
238
239 void pathlib_waypointpath_autostep()
240 {
241     entity n;
242     n = spawn();
243     n.think = plas_think;
244     n.nextthink = time + 0.1;
245 }