54 #define MAX_CHASE_DISTANCE 700 58 if (
vdist(gco - this.
origin, >, autocvar_sv_maxspeed * 1.5)
64 if (this.
goalentity.bot_pickup &&
time >
this.bot_strategytime - 5)
89 if (dropper && dropper.nearestwaypointtimeout && dropper.nearestwaypointtimeout <
time + 2)
106 if ((ent.classname !=
"waypoint") || ent.wpisbox)
108 vector wm1 = ent.origin + ent.mins;
109 vector wm2 = ent.origin + ent.maxs;
110 dest.x =
bound(wm1.x, org.x, wm2.x);
111 dest.y =
bound(wm1.y, org.y, wm2.y);
112 dest.z =
bound(wm1.z, org.z, wm2.z);
121 if ((ent.classname !=
"waypoint") || ent.wpisbox)
123 vector wm1 = ent.origin + ent.mins;
124 vector wm2 = ent.origin + ent.maxs;
129 wm1 +=
vec2(PL_MIN_CONST) +
'-1 -1 0';
130 wm2 +=
vec2(PL_MAX_CONST) +
'1 1 0';
141 fix_player_dest =
false;
160 tracebox(ent.origin, ent.mins, ent.maxs, ent.origin -
'0 0 700',
MOVE_NORMAL, ent);
179 vector closer_dest =
'0 0 0';
180 if ((ent.classname !=
"waypoint") || ent.wpisbox)
182 vector wm1 = ent.origin + ent.mins;
183 vector wm2 = ent.origin + ent.maxs;
184 closer_dest.x =
bound(wm1.x, org.x, wm2.x);
185 closer_dest.y =
bound(wm1.y, org.y, wm2.y);
186 closer_dest.z =
bound(wm1.z, org.z, wm2.z);
196 closer_dest = ent.origin;
217 if(!ent.navigation_dynamicgoal)
228 if(
boxesoverlap(org + m1 +
'-1 -1 -1', org + m2 +
'1 1 1', it.absmin, it.absmax))
232 top.z = it.absmax.z + (PL_MAX_CONST.z - PL_MIN_CONST.z);
233 tracebox(org, m1, m2, top, movemode, e);
250 float RES_min_h = org.z;
251 float RES_max_h = lim;
253 org.z = 0.5 * (RES_min_h + RES_max_h);
258 }
while (RES_max_h - RES_min_h >= 1);
263 #define RESURFACE_LIMITED(org, lim) org = resurface_limited(org, lim, m1) 266 #define NAV_SWIM_ONWATER 1 267 #define NAV_SWIM_UNDERWATER 2 282 vector flatdir = end - start;
284 float flatdist =
vlen(flatdir);
287 bool ignorehazards =
false;
292 ignorehazards =
true;
307 end2.z += end_height;
312 if (flatdist > 0 &&
WETFEET(org))
320 tracebox(org, m1, m2, org -
eZ * (m2.z - m1.z), movemode, e);
339 if (org.z > end2.z + 1)
341 tracebox(org, m1, m2, end2, movemode, e);
343 if (org.z > end2.z + 1)
346 else if (org.z < end.z - 1)
352 tracebox(v, m1, m2, end, movemode, e);
362 if (org.z < end.z - 1)
386 if (stepdist > flatdist)
394 fixed_end.z =
bound(end.z, org.z, end2.z);
395 if (stepdist == flatdist) {
399 move = org + (fixed_end - org) * (stepdist / flatdist);
400 flatdist =
vlen(
vec2(fixed_end - move));
405 flatdist -= stepdist;
406 move = org + flatdir * stepdist;
411 tracebox(org, m1, m2, move, movemode, e);
476 tracebox(org, m1, m2, move, movemode, e);
478 bool stepswum =
false;
485 if (flatdist > 0 && stepswim_move.z > end2.z + stepheightvec.z)
486 stepswim_move.z = end2.z;
488 tracebox(org + stepheightvec, m1, m2, stepswim_move, movemode, e);
502 float org_z_prev = org.z;
504 if(org.z == org_z_prev)
561 tracebox(org, m1, m2, move, movemode, e);
608 tracebox(org, m1, m2, move, movemode, e);
656 traceline( org, move, movemode, e);
664 nextmove = move + (flatdir * stepdist);
665 traceline( move, nextmove, movemode, e);
694 tracebox(move, m1, m2, move +
'0 0 -65536', movemode, e);
715 if(move.z >= end2.z && org.z < end2.z)
720 if(org.z > move.z - 1 || !
SUBMERGED(org))
897 if (
vdist(v - org, <, bestdist))
899 traceline(v, org,
true, ent);
921 ent = ent.tag_entity;
923 vector pm1 = ent.origin + ent.mins;
924 vector pm2 = ent.origin + ent.maxs;
942 if(boxesoverlap(pm1, pm2, it.absmin, it.absmax))
944 if(walkfromwp && !ent.navigation_dynamicgoal)
945 waypoint_clearlinks(ent);
960 org += 0.5 * (ent.mins + ent.maxs);
961 org.z = ent.origin.z + ent.mins.z - PL_MIN_CONST.z;
991 bestdist =
vlen(
v - org);
995 if(!
best && !ent.navigation_dynamicgoal)
997 int solid_save = ent.solid;
1003 best = it.nearestwaypoint;
1007 ent.solid = solid_save;
1030 set_tracewalk_dest(it, this.origin, false);
1032 vector diff = tracewalk_dest - this.origin;
1033 diff.z = max(0, diff.z);
1034 if(vdist(diff, <, maxdist))
1036 it.wpconsidered = true;
1037 if (tracewalk(this, this.origin, this.mins, this.maxs,
1038 tracewalk_dest, tracewalk_dest_height, bot_navigation_movemode))
1040 it.wpnearestpoint = tracewalk_dest;
1041 it.wpcost = waypoint_gettravelcost(this.origin, tracewalk_dest, this, it) + it.dmg;
1059 m1 = wp.origin + wp.mins;
1060 m2 = wp.origin + wp.maxs;
1061 v.x =
bound(m1_x, p.x, m2_x);
1062 v.y =
bound(m1_y, p.y, m2_y);
1063 v.z =
bound(m1_z, p.z, m2_z);
1068 cost += w.wp00mincost;
1071 if (wp.wpcost > cost)
1076 wp.wpnearestpoint =
v;
1088 it.wpconsidered =
false;
1089 it.wpnearestpoint =
'0 0 0';
1090 it.wpcost = 10000000;
1095 if(fixed_source_waypoint)
1097 fixed_source_waypoint.wpconsidered =
true;
1098 fixed_source_waypoint.wpnearestpoint = fixed_source_waypoint.origin + 0.5 * (fixed_source_waypoint.mins + fixed_source_waypoint.maxs);
1099 fixed_source_waypoint.wpcost = fixed_source_waypoint.dmg;
1100 fixed_source_waypoint.wpfire = 1;
1101 fixed_source_waypoint.enemy =
NULL;
1107 float increment, maxdistance;
1111 maxdistance = 50000;
1122 bool searching =
true;
1131 p = it.wpnearestpoint;
1133 wp = it.wp00;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp00mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1134 wp = it.wp01;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp01mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1135 wp = it.wp02;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp02mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1136 wp = it.wp03;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp03mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1137 wp = it.wp04;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp04mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1138 wp = it.wp05;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp05mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1139 wp = it.wp06;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp06mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1140 wp = it.wp07;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp07mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1141 wp = it.wp08;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp08mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1142 wp = it.wp09;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp09mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1143 wp = it.wp10;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp10mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1144 wp = it.wp11;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp11mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1145 wp = it.wp12;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp12mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1146 wp = it.wp13;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp13mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1147 wp = it.wp14;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp14mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1148 wp = it.wp15;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp15mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1149 wp = it.wp16;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp16mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1150 wp = it.wp17;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp17mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1151 wp = it.wp18;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp18mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1152 wp = it.wp19;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp19mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1153 wp = it.wp20;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp20mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1154 wp = it.wp21;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp21mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1155 wp = it.wp22;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp22mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1156 wp = it.wp23;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp23mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1157 wp = it.wp24;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp24mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1158 wp = it.wp25;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp25mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1159 wp = it.wp26;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp26mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1160 wp = it.wp27;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp27mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1161 wp = it.wp28;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp28mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1162 wp = it.wp29;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp29mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1163 wp = it.wp30;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp30mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1164 wp = it.wp31;if (wp){cost2 = cost + wp.dmg;if (wp.wpcost > cost2 + it.wp31mincost) navigation_markroutes_checkwaypoint(it, wp, cost2, p);
1165 }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
1177 it.wpconsidered =
false;
1178 it.wpnearestpoint =
'0 0 0';
1179 it.wpcost = 10000000;
1184 if(fixed_source_waypoint)
1186 fixed_source_waypoint.wpconsidered =
true;
1187 fixed_source_waypoint.wpnearestpoint = fixed_source_waypoint.origin + 0.5 * (fixed_source_waypoint.mins + fixed_source_waypoint.maxs);
1188 fixed_source_waypoint.wpcost = fixed_source_waypoint.dmg;
1189 fixed_source_waypoint.wpfire = 1;
1190 fixed_source_waypoint.enemy =
NULL;
1194 error(
"need to start with a waypoint\n");
1197 bool searching =
true;
1206 p = it.wpnearestpoint;
1208 IL_EACH(g_waypoints, it != wp,
1210 if(!waypoint_islinked(it, wp))
1212 cost2 = cost + it.dmg;
1213 navigation_markroutes_checkwaypoint(wp, it, cost2, p);
1222 if (!e || e.blacklisted) {
return; }
1229 bool rate_wps =
false;
1238 traceline(e.origin, e.origin +
'0 0 -1500',
true,
NULL);
1244 else if(tracebox_hits_trigger_hurt(e.origin, e.mins, e.maxs,
trace_endpos))
1255 &&
vdist(it.origin - theEnemy.origin, <, 500)
1256 &&
vdist(it.origin -
this.origin, >, 100)
1257 &&
vdist(it.origin -
this.origin, <, 10000),
1259 float dist = vlen2(it.origin - theEnemy.origin);
1260 if (dist < best_dist)
1272 vector goal_org = (e.absmin + e.absmax) * 0.5;
1277 if(this.
items & IT_JETPACK)
1283 LOG_DEBUG(
"jetpack ai: evaluating path for ", e.classname);
1290 traceline(goal_org, goal_org +
'0 0 65535',
MOVE_NORMAL, e);
1298 LOG_DEBUG(
"jetpack ai: can bridge these two points");
1301 float zdistance, xydistance, cost, t, fuel;
1304 down =
'0 0 -1' * (STAT(PL_MAX,
this).z - STAT(PL_MIN,
this).z) * 10;
1307 npa = pointa + down;
1308 npb = pointb + down;
1310 if(npa.z<=
this.absmax.z)
1313 if(npb.z<=e.absmax.z)
1328 xydistance =
vlen(pointa - pointb);
1329 zdistance =
fabs(pointa.z -
this.origin.z);
1331 t = zdistance / autocvar_g_jetpack_maxspeed_up;
1332 t += xydistance / autocvar_g_jetpack_maxspeed_side;
1333 fuel = t * autocvar_g_jetpack_fuel * 0.8;
1344 cost = xydistance / (autocvar_g_jetpack_maxspeed_side/autocvar_sv_maxspeed);
1345 cost += zdistance / (autocvar_g_jetpack_maxspeed_up/autocvar_sv_maxspeed);
1349 f = f * rangebias / (rangebias + cost);
1353 LOG_DEBUG(
"jetpack path: added goal ", e.classname,
" (with rating ",
ftos(f),
")");
1376 e.nearestwaypoint =
NULL;
1378 if ((!e.nearestwaypoint || e.navigation_dynamicgoal)
1379 && e.nearestwaypointtimeout >= 0 &&
time > e.nearestwaypointtimeout)
1381 if(
IS_BOT_CLIENT(e) && e.goalcurrent && e.goalcurrent.classname ==
"waypoint")
1382 e.nearestwaypoint = nwp = e.goalcurrent;
1387 LOG_DEBUG(
"FAILED to find a nearest waypoint to '", e.classname,
"' #",
etos(e));
1389 if(!e.navigation_dynamicgoal)
1390 e.blacklisted =
true;
1394 LOG_DEBUG(
"The entity '", e.classname,
"' is going to be excluded from path finding during this match");
1399 if(e.navigation_dynamicgoal)
1400 e.nearestwaypointtimeout =
time + 2;
1402 e.nearestwaypointtimeout =
time + 3 +
random() * 2;
1404 nwp = e.nearestwaypoint;
1407 if (nwp && nwp.wpcost < 10000000)
1410 float nwptoitem_cost = 0;
1412 nwptoitem_cost = nwp.wp00mincost;
1415 float cost = nwp.wpcost + nwptoitem_cost;
1416 LOG_DEBUG(
"checking ^5", e.classname,
"^7 with base rating ^xf04",
ftos(f),
"^7 and rangebias ^xf40",
ftos(rangebias));
1417 f = f * rangebias / (rangebias + cost);
1418 LOG_DEBUG(
" ^5", e.classname,
"^7 with cost ^6",
ftos(cost),
"^7 and final rating ^2",
ftos(f));
1421 LOG_DEBUG(
" ground path: ^3added goal ^5", e.classname);
1466 && (
trace_ent ==
this ||
tracewalk(
this, startposition, STAT(PL_MIN,
this), STAT(PL_MAX,
this),
1476 e = e.nearestwaypoint;
1479 else if(teleport_goal)
1495 e = nearest_wp.enemy;
1501 &&
tracewalk(
this, nearest_wp.enemy.origin, STAT(PL_MIN,
this), STAT(PL_MAX,
this),
1504 e = nearest_wp.enemy;
1517 e = nearest_wp.enemy;
1521 entity wp = nearest_wp.enemy;
1523 bool walkable =
false;
1528 &&
tracewalk(goal, wp.origin, PL_MIN_CONST, PL_MAX_CONST,
1532 e = nearest_wp.enemy;
1562 bool cut_allowed =
false;
1581 while (deviation.y < -180) deviation.y += 360;
1582 while (deviation.y > 180) deviation.y -= 360;
1583 if (
fabs(deviation.y) > 25)
1619 LOG_DEBUG(
"path optimized for ", this.
netname,
", removed a goal from the queue");
1631 int removed_goals = 0;
1634 return removed_goals;
1656 this.
aistatus &= ~AI_STATUS_WAYPOINT_PERSONAL_GOING;
1663 float max_delay = 0.1;
1667 return removed_goals;
1679 return removed_goals;
1698 this.
aistatus &= ~AI_STATUS_WAYPOINT_PERSONAL_GOING;
1709 return removed_goals;
1735 this.
aistatus &= ~AI_STATUS_WAYPOINT_PERSONAL_GOING;
1742 return removed_goals;
1751 if(this.
goalcurrent.classname ==
"waypoint" && !
this.goalcurrent.wpisbox)
1771 this.
aistatus &= ~AI_STATUS_WAYPOINT_PERSONAL_GOING;
1778 return removed_goals;
1780 return removed_goals;
1797 if(wp.classname !=
"waypoint")
1799 wp = wp.nearestwaypoint;
1803 if(
vdist(wp.origin -
this.origin, >, min_dist))
1808 if(vdist(it.origin - this.origin, <, min_dist))
1821 if (!
tracewalk(
this, this.
origin, STAT(PL_MIN,
this), STAT(PL_MAX,
this),
1888 v.x = bound(m1_x, v.x, m2_x);
1889 v.y = bound(m1_y, v.y, m2_y);
1890 v.z = bound(m1_z, v.z, m2_z);
1891 o = (it.absmin + it.absmax) * 0.5;
1892 d = waypoint_getlinearcost(it.bot_dodgerating) - waypoint_gettravelcost(o, v, it, wp_cur);
1895 traceline(o, v, true, NULL);
1896 if (trace_fraction == 1)
1897 danger = danger + d;
1912 bool has_user_waypoints =
false;
1915 has_user_waypoints = true;
1918 if (!has_user_waypoints)
1921 float search_radius = 1000;
1940 if (
tracewalk(
this, this.
origin, STAT(PL_MIN,
this), STAT(PL_MAX,
this),
1966 LOG_DEBUG(this.
netname,
" stuck, reachable waypoint found, heading to it");
1986 LOG_DEBUG(this.
netname,
" stuck, scanning reachable waypoints within ",
ftos(search_radius),
" qu");
1992 if(bot_waypoint_queue_goal)
1993 bot_waypoint_queue_goal.bot_waypoint_queue_nextgoal = it;
1997 bot_waypoint_queue_goal = it;
1998 bot_waypoint_queue_goal.bot_waypoint_queue_nextgoal = NULL;
2052 te_customflash(position, 40, 2, c);
2113 go = ( goal.absmin + goal.absmax ) * 0.5;
2114 te_lightning2(
NULL, org, go);
void navigation_goalrating_timeout_expire(entity this, float seconds)
float nearestwaypointtimeout
#define IL_EACH(this, cond, body)
bool navigation_goalrating_timeout_can_be_anticipated(entity this)
void navigation_goalrating_end(entity this)
void navigation_routerating(entity this, entity e, float f, float rangebias)
bool navigation_dynamicgoal
bool navigation_check_submerged_state(entity ent, vector pos)
#define navigation_item_iswalkablelink(to_item, from_wp)
#define RESURFACE_LIMITED(org, lim)
const int WATERLEVEL_SUBMERGED
bool autocvar_bot_debug_tracewalk
void navigation_clearroute(entity this)
float waypoint_gettravelcost(vector from, vector to, entity from_ent, entity to_ent)
float bot_waypoint_queue_bestgoalrating
const int WAYPOINTFLAG_PROTECTED
float autocvar_bot_ai_navigation_jetpack
float autocvar_bot_ai_strategyinterval
void debugnode(entity this, vector node)
float goalentity_lock_timeout
bool tracewalk(entity e, vector start, vector m1, vector m2, vector end, float end_height, float movemode)
entity navigation_get_really_close_waypoint(entity this)
float autocvar_bot_ai_ignoregoal_timeout
#define navigation_item_add_link(from_wp, to_item, walkable)
vector set_tracewalk_dest_2(entity ent, vector org)
const int WAYPOINTFLAG_JUMP
void navigation_poproute(entity this)
const float CONTENT_SOLID
vector get_closer_dest(entity ent, vector org)
entity navigation_bestgoal
#define navigation_item_getlinknum(to_item, from_wp)
float checkpvs(vector viewpos, entity viewee)
void navigation_markroutes_checkwaypoint(entity w, entity wp, float cost, vector p)
const int AI_STATUS_WAYPOINT_PERSONAL_GOING
const int WPFLAGMASK_NORELINK
#define SUBMERGED_UNDEFINED
void navigation_dynamicgoal_init(entity this, bool initially_static)
void navigation_markroutes_inverted(entity fixed_source_waypoint)
const float DEBUG_NODE_WARNING
IntrusiveList g_bot_dodge
entity bot_waypoint_queue_bestgoal
int autocvar_g_waypointeditor_auto
void navigation_markroutes(entity this, entity fixed_source_waypoint)
float goalcurrent_distance_z
bool waypointeditor_enabled
bool navigation_shortenpath(entity this)
vector resurface_limited(vector org, float lim, vector m1)
const float MOVE_NOMONSTERS
void navigation_goalrating_start(entity this)
#define NAV_SWIM_UNDERWATER
const float CONTENT_SLIME
bool navigation_goalrating_timeout(entity this)
const int WAYPOINTFLAG_TELEPORT
ERASEABLE float boxesoverlap(vector m1, vector m2, vector m3, vector m4)
requires that m2>m1 in all coordinates, and that m4>m3
#define navigation_item_initlinks_ifneeded(e)
entity navigation_findnearestwaypoint(entity ent, float walkfromwp)
const float CONTENT_WATER
float autocvar_bot_ai_strategyinterval_movingtarget
ERASEABLE void navigation_goalrating_timeout_extend_if_needed(entity this, float seconds)
vector navigation_jetpack_point
int navigation_poptouchedgoals(entity this)
float goalcurrent_distance_time
bool autocvar_bot_wander_enable
float goalcurrent_distance_2d
const int AI_STATUS_WAYPOINT_PERSONAL_REACHED
float tracewalk_dest_height
entity bot_waypoint_queue_goal
const int WATERLEVEL_WETFEET
float waypoint_getlinearcost(float dist)
IntrusiveList g_waypoints
entity bot_waypoint_queue_owner
vector(float skel, float bonenum) _skel_get_boneabs_hidden
bool navigation_checkladders(entity e, vector org, vector m1, vector m2, vector end, vector end2, int movemode)
void navigation_goalrating_timeout_force(entity this)
bool navigation_routetogoal(entity this, entity e, vector startposition)
void navigation_unstuck(entity this)
float bot_navigation_movemode
void navigation_pushroute(entity this, entity e)
void set_tracewalk_dest(entity ent, vector org, bool fix_player_dest)
entity navigation_jetpack_goal
float GetResource(entity e, Resource res_type)
Returns the current amount of resource the given entity has.
#define vdist(v, cmp, f)
Vector distance comparison, avoids sqrt()
void debuggoalstack(entity this)
const float BOT_BUNNYHOP_WP_DETECTION_RANGE
#define IS_BOT_CLIENT(v)
want: (IS_CLIENT(v) && !IS_REAL_CLIENT(v))
void debugnodestatus(vector position, float status)
bool trigger_push_test(entity this, entity item)
if (item != NULL) returns true if the item can be reached by using this jumppad, false otherwise if (...
const int WAYPOINTFLAG_GENERATED
#define MAX_CHASE_DISTANCE
const int WAYPOINTFLAG_PERSONAL
float navigation_testtracewalk
float autocvar_bot_ai_navigation_jetpack_mindistance
void navigation_dynamicgoal_unset(entity this)
const int AI_STATUS_STUCK
void navigation_dynamicgoal_set(entity this, entity dropper)
entity navigation_findnearestwaypoint_withdist_except(entity ent, float walkfromwp, float bestdist, entity except)
void botframe_updatedangerousobjects(float maxupdate)
void navigation_goalrating_timeout_set(entity this)
float navigation_waypoint_will_link(vector v, vector org, entity ent, vector v2, float v2_height, vector o2, float o2_height, float walkfromwp, float bestdist)
float navigation_markroutes_nearestwaypoints(entity this, float maxdist)
const int AI_STATUS_RUNNING
bool goalentity_shouldbefrozen
const float DEBUG_NODE_SUCCESS
float navigation_bestrating
#define TELEPORT_USED(pl, tele_wp)
const float DEBUG_NODE_FAIL
bool havocbot_goalrating_item_pickable_check_players(entity this, vector org, entity item, vector item_org)