#pragma once
+#include <server/defs.qh>
#include <common/weapons/_all.qh>
+#include <common/physics/player.qh>
const int WAYPOINTFLAG_GENERATED = BIT(23);
const int WAYPOINTFLAG_ITEM = BIT(22);
-const int WAYPOINTFLAG_TELEPORT = BIT(21);
+const int WAYPOINTFLAG_TELEPORT = BIT(21); // teleports, warpzones and jumppads
const int WAYPOINTFLAG_NORELINK = BIT(20);
const int WAYPOINTFLAG_PERSONAL = BIT(19);
const int WAYPOINTFLAG_PROTECTED = BIT(18); // Useless WP detection never kills these.
const int WAYPOINTFLAG_USEFUL = BIT(17); // Useless WP detection temporary flag.
const int WAYPOINTFLAG_DEAD_END = BIT(16); // Useless WP detection temporary flag.
+const int WAYPOINTFLAG_LADDER = BIT(15);
entity kh_worldkeylist;
.entity kh_worldkeynext;
float bot_weapons_mid[Weapons_MAX];
float skill;
+.float bot_tracewalk_time;
.float bot_attack;
.float bot_dodgerating;
.float bot_dodge;
.float bot_moveskill; // moving technique
.float bot_pickup;
.float(entity player, entity item) bot_pickupevalfunc;
-.float bot_strategytime;
.string cleanname;
.float havocbot_role_timeout;
+.void(entity this) havocbot_role;
+.void(entity this) havocbot_previous_role;
.float isbot; // true if this client is actually a bot
.float lastteleporttime;
+.vector lastteleport_origin;
.float navigation_hasgoals;
.float nearestwaypointtimeout;
.entity nearestwaypoint;
.float wp24mincost, wp25mincost, wp26mincost, wp27mincost, wp28mincost, wp29mincost, wp30mincost, wp31mincost;
.float wpconsidered;
.float wpcost;
+.float wphardwired;
.int wpflags;
bool bot_aim(entity this, .entity weaponentity, float shotspeed, float shotspeedupward, float maxshottime, float applygravity);
void havocbot_goalrating_enemyplayers(entity this, float ratingscale, vector org, float sradius);
void havocbot_goalrating_items(entity this, float ratingscale, vector org, float sradius);
+void havocbot_goalrating_waypoints(entity this, float ratingscale, vector org, float sradius);
+bool havocbot_goalrating_item_pickable_check_players(entity this, vector org, entity item, vector item_org);
+
+vector havocbot_middlepoint;
+float havocbot_middlepoint_radius;
+vector havocbot_symmetryaxis_equation;
+
+.float goalentity_lock_timeout;
+.float ignoregoaltime;
+.entity ignoregoal;
+
+.entity bot_basewaypoint;
+.bool navigation_dynamicgoal;
+void navigation_dynamicgoal_init(entity this, bool initially_static);
+void navigation_dynamicgoal_set(entity this);
+void navigation_dynamicgoal_unset(entity this);
entity navigation_findnearestwaypoint(entity ent, float walkfromwp);
void navigation_goalrating_end(entity this);
void navigation_goalrating_start(entity this);
+void navigation_goalrating_timeout_set(entity this);
+void navigation_goalrating_timeout_force(entity this);
+void navigation_goalrating_timeout_expire(entity this, float seconds);
+bool navigation_goalrating_timeout(entity this);
+bool navigation_goalrating_timeout_can_be_anticipated(entity this);
void navigation_markroutes(entity this, entity fixed_source_waypoint);
void navigation_markroutes_inverted(entity fixed_source_waypoint);
void navigation_routerating(entity this, entity e, float f, float rangebias);
-bool tracewalk(entity e, vector start, vector m1, vector m2, vector end, float movemode);
+vector get_closer_dest(entity ent, vector org);
-void waypoint_remove(entity e);
+void set_tracewalk_dest(entity ent, vector org, bool fix_player_dest);
+vector set_tracewalk_dest_2(entity ent, vector org);
+bool tracewalk(entity e, vector start, vector m1, vector m2, vector end, float end_height, float movemode);
+
+void waypoint_remove_fromeditor(entity pl);
+void waypoint_remove(entity wp);
void waypoint_saveall();
void waypoint_schedulerelinkall();
void waypoint_schedulerelink(entity wp);
void waypoint_spawnforitem(entity e);
void waypoint_spawnforitem_force(entity e, vector org);
-void waypoint_spawnforteleporter(entity e, vector destination, float timetaken);
-void waypoint_spawnforteleporter_v(entity e, vector org, vector destination, float timetaken);
+void waypoint_spawnforteleporter(entity e, vector destination, float timetaken, entity tracetest_ent);
+void waypoint_spawnforteleporter_wz(entity e, vector org, vector destination, float timetaken, vector down_dir, entity tracetest_ent);
+void waypoint_spawn_fromeditor(entity pl);
entity waypoint_spawn(vector m1, vector m2, float f);
-
-.entity goalcurrent;
-void navigation_clearroute(entity this);
+void waypoint_unreachable(entity pl);