const int AI_STATUS_JETPACK_LANDING = BIT(10);
const int AI_STATUS_STUCK = BIT(11); // Cannot reach any goal
-.float isbot; // true if this client is actually a bot
+.bool isbot; // true if this client is actually a bot
.int aistatus;
// Skill system
entity bot_list;
.entity nextbot;
.string cleanname;
+// the *_freeme fields exist only to avoid an engine crash
+// when trying to strunzone the original fields
.string netname_freeme;
.string playermodel_freeme;
.string playerskin_freeme;
.float bot_pickup;
.float bot_pickupbasevalue;
+.bool bot_pickup_respawning;
.float bot_canfire;
.float bot_strategytime;
+.float bot_jump_time;
.float bot_forced_team;
.float bot_config_loaded;
float botframe_spawnedwaypoints;
float botframe_nextthink;
float botframe_nextdangertime;
-float bot_cvar_nextthink;
-float bot_ignore_bots; // let bots not attack other bots (only works in non-teamplay)
+
+int _content_type;
+#define IN_LAVA(pos) (_content_type = pointcontents(pos), (_content_type == CONTENT_LAVA || _content_type == CONTENT_SLIME))
+#define IN_LIQUID(pos) (_content_type = pointcontents(pos), (_content_type == CONTENT_WATER || _content_type == CONTENT_LAVA || _content_type == CONTENT_SLIME))
+#define SUBMERGED(pos) IN_LIQUID(pos + autocvar_sv_player_viewoffset)
+#define WETFEET(pos) IN_LIQUID(pos + eZ * (m1.z + 1))
/*
* Functions
*/
entity bot_spawn();
-float bot_fixcount();
+bool bot_fixcount();
void bot_think(entity this);
void bot_setnameandstuff(entity this);
void bot_custom_weapon_priority_setup();
void bot_endgame();
void bot_relinkplayerlist();
-void bot_clear(entity this);
void bot_clientdisconnect(entity this);
void bot_clientconnect(entity this);
void bot_removefromlargestteam();