more work on optimizing cpu usage
reverted active grenades on TASK_* items
This commit is contained in:
parent
43e37e9818
commit
66c33472ff
8 changed files with 91 additions and 180 deletions
|
|
@ -993,7 +993,7 @@ private:
|
||||||
|
|
||||||
bool IsInViewCone (const Vector &origin);
|
bool IsInViewCone (const Vector &origin);
|
||||||
void ReactOnSound (void);
|
void ReactOnSound (void);
|
||||||
bool CheckVisibility (entvars_t *targetOrigin, Vector *origin, byte *bodyPart);
|
bool CheckVisibility (edict_t *target, Vector *origin, byte *bodyPart);
|
||||||
bool IsEnemyViewable (edict_t *player);
|
bool IsEnemyViewable (edict_t *player);
|
||||||
|
|
||||||
edict_t *FindNearestButton (const char *className);
|
edict_t *FindNearestButton (const char *className);
|
||||||
|
|
@ -1626,7 +1626,6 @@ public:
|
||||||
|
|
||||||
// prototypes of bot functions...
|
// prototypes of bot functions...
|
||||||
extern int GetWeaponReturn (bool isString, const char *weaponAlias, int weaponIndex = -1);
|
extern int GetWeaponReturn (bool isString, const char *weaponAlias, int weaponIndex = -1);
|
||||||
extern int GetTeam (edict_t *ent);
|
|
||||||
|
|
||||||
extern float GetShootingConeDeviation (edict_t *ent, Vector *position);
|
extern float GetShootingConeDeviation (edict_t *ent, Vector *position);
|
||||||
extern float GetWaveLength (const char *fileName);
|
extern float GetWaveLength (const char *fileName);
|
||||||
|
|
|
||||||
|
|
@ -122,3 +122,8 @@ static inline bool IsEntityNull (const edict_t *ent)
|
||||||
{
|
{
|
||||||
return !ent || !EntOffsetOfEntity (ent);
|
return !ent || !EntOffsetOfEntity (ent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int GetTeam (edict_t *ent)
|
||||||
|
{
|
||||||
|
return g_clients[IndexOfEntity (ent) - 1].team;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -100,7 +100,7 @@ bool Bot::IsInViewCone (const Vector &origin)
|
||||||
return ::IsInViewCone (origin, GetEntity ());
|
return ::IsInViewCone (origin, GetEntity ());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Bot::CheckVisibility (entvars_t *targetEntity, Vector *origin, byte *bodyPart)
|
bool Bot::CheckVisibility (edict_t *target, Vector *origin, byte *bodyPart)
|
||||||
{
|
{
|
||||||
// this function checks visibility of a bot target.
|
// this function checks visibility of a bot target.
|
||||||
|
|
||||||
|
|
@ -110,69 +110,41 @@ bool Bot::CheckVisibility (entvars_t *targetEntity, Vector *origin, byte *bodyPa
|
||||||
*bodyPart = 0;
|
*bodyPart = 0;
|
||||||
|
|
||||||
// check for the body
|
// check for the body
|
||||||
TraceLine (botHead, targetEntity->origin, true, true, GetEntity (), &tr);
|
TraceLine (botHead, target->v.origin, true, true, GetEntity (), &tr);
|
||||||
|
|
||||||
if (tr.flFraction >= 1.0)
|
if (tr.flFraction >= 1.0f)
|
||||||
{
|
{
|
||||||
*bodyPart |= VISIBLE_BODY;
|
*bodyPart |= VISIBLE_BODY;
|
||||||
*origin = targetEntity->origin;
|
*origin = target->v.origin;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check for the head
|
// check for the head
|
||||||
TraceLine (botHead, targetEntity->origin + targetEntity->view_ofs, true, true, GetEntity (), &tr);
|
TraceLine (botHead, target->v.origin + target->v.view_ofs, true, true, GetEntity (), &tr);
|
||||||
|
|
||||||
if (tr.flFraction >= 1.0)
|
if (tr.flFraction >= 1.0f)
|
||||||
{
|
{
|
||||||
*bodyPart |= VISIBLE_HEAD;
|
*bodyPart |= VISIBLE_HEAD;
|
||||||
*origin = targetEntity->origin + targetEntity->view_ofs;
|
*origin = target->v.origin + target->v.view_ofs;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*bodyPart != 0)
|
if (*bodyPart != 0)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
#if 0
|
|
||||||
// dimension table
|
|
||||||
const int8 dimensionTab[8][3] =
|
|
||||||
{
|
|
||||||
{1, 1, 1}, { 1, 1, -1},
|
|
||||||
{1, -1, 1}, {-1, 1, 1},
|
|
||||||
{1, -1, -1}, {-1, -1, 1},
|
|
||||||
{-1, 1, -1}, {-1, -1, -1}
|
|
||||||
};
|
|
||||||
|
|
||||||
// check the box borders
|
|
||||||
for (int i = 7; i >= 0; i--)
|
|
||||||
{
|
|
||||||
Vector targetOrigin = petargetOrigin->origin + Vector (dimensionTab[i][0] * 24.0, dimensionTab[i][1] * 24.0, dimensionTab[i][2] * 24.0);
|
|
||||||
|
|
||||||
// check direct line to random part of the player body
|
|
||||||
TraceLine (botHead, targetOrigin, true, true, GetEntity (), &tr);
|
|
||||||
|
|
||||||
// check if we hit something
|
|
||||||
if (tr.flFraction >= 1.0)
|
|
||||||
{
|
|
||||||
*origin = tr.vecEndPos;
|
|
||||||
*bodyPart |= VISIBLE_OTHER;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
// worst case, choose random position in enemy body
|
// worst case, choose random position in enemy body
|
||||||
for (int i = 0; i < 5; i++)
|
for (int i = 0; i < 5; i++)
|
||||||
{
|
{
|
||||||
Vector targetOrigin = targetEntity->origin; // get the player origin
|
Vector pos = target->v.origin; // get the player origin
|
||||||
|
|
||||||
// find the vector beetwen mins and maxs of the player body
|
// find the vector beetwen mins and maxs of the player body
|
||||||
targetOrigin.x += Random.Float (targetEntity->mins.x * 0.5, targetEntity->maxs.x * 0.5);
|
pos.x += Random.Float (target->v.mins.x * 0.5f, target->v.maxs.x * 0.5f);
|
||||||
targetOrigin.y += Random.Float (targetEntity->mins.y * 0.5, targetEntity->maxs.y * 0.5);
|
pos.y += Random.Float (target->v.mins.y * 0.5f, target->v.maxs.y * 0.5f);
|
||||||
targetOrigin.z += Random.Float (targetEntity->mins.z * 0.5, targetEntity->maxs.z * 0.5);
|
pos.z += Random.Float (target->v.mins.z * 0.5f, target->v.maxs.z * 0.5f);
|
||||||
|
|
||||||
// check direct line to random part of the player body
|
// check direct line to random part of the player body
|
||||||
TraceLine (botHead, targetOrigin, true, true, GetEntity (), &tr);
|
TraceLine (botHead, pos, true, true, GetEntity (), &tr);
|
||||||
|
|
||||||
// check if we hit something
|
// check if we hit something
|
||||||
if (tr.flFraction >= 1.0)
|
if (tr.flFraction >= 1.0f)
|
||||||
{
|
{
|
||||||
*origin = tr.vecEndPos;
|
*origin = tr.vecEndPos;
|
||||||
*bodyPart |= VISIBLE_OTHER;
|
*bodyPart |= VISIBLE_OTHER;
|
||||||
|
|
@ -180,7 +152,6 @@ bool Bot::CheckVisibility (entvars_t *targetEntity, Vector *origin, byte *bodyPa
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -194,7 +165,7 @@ bool Bot::IsEnemyViewable (edict_t *player)
|
||||||
if (IsValidPlayer (pev->dmg_inflictor) && GetTeam (pev->dmg_inflictor) != m_team && ::IsInViewCone (EyePosition (), pev->dmg_inflictor))
|
if (IsValidPlayer (pev->dmg_inflictor) && GetTeam (pev->dmg_inflictor) != m_team && ::IsInViewCone (EyePosition (), pev->dmg_inflictor))
|
||||||
forceTrueIfVisible = true;
|
forceTrueIfVisible = true;
|
||||||
|
|
||||||
if (CheckVisibility (VARS (player), &m_enemyOrigin, &m_visibility) && (IsInViewCone (player->v.origin + Vector (0, 0, 14)) || forceTrueIfVisible))
|
if (CheckVisibility (player, &m_enemyOrigin, &m_visibility) && (IsInViewCone (player->v.origin + Vector (0, 0, 14)) || forceTrueIfVisible))
|
||||||
{
|
{
|
||||||
m_seeEnemyTime = GetWorldTime ();
|
m_seeEnemyTime = GetWorldTime ();
|
||||||
m_lastEnemy = player;
|
m_lastEnemy = player;
|
||||||
|
|
@ -241,7 +212,7 @@ bool Bot::EntityIsVisible (const Vector &dest, bool fromBody)
|
||||||
void Bot::CheckGrenadeThrow (void)
|
void Bot::CheckGrenadeThrow (void)
|
||||||
{
|
{
|
||||||
// check if throwing a grenade is a good thing to do...
|
// check if throwing a grenade is a good thing to do...
|
||||||
if (m_lastEnemy == NULL || yb_ignore_enemies.GetBool () || yb_jasonmode.GetBool () && m_grenadeCheckTime > GetWorldTime () || m_isUsingGrenade || GetTaskId () == TASK_PLANTBOMB || GetTaskId () == TASK_DEFUSEBOMB || m_isReloading || !IsAlive (m_lastEnemy))
|
if (m_lastEnemy == NULL || yb_ignore_enemies.GetBool () || yb_jasonmode.GetBool () || m_grenadeCheckTime > GetWorldTime () || m_isUsingGrenade || GetTaskId () == TASK_PLANTBOMB || GetTaskId () == TASK_DEFUSEBOMB || m_isReloading || !IsAlive (m_lastEnemy))
|
||||||
{
|
{
|
||||||
m_states &= ~(STATE_THROW_HE | STATE_THROW_FB | STATE_THROW_SG);
|
m_states &= ~(STATE_THROW_HE | STATE_THROW_FB | STATE_THROW_SG);
|
||||||
return;
|
return;
|
||||||
|
|
@ -401,6 +372,9 @@ void Bot::AvoidGrenades (void)
|
||||||
{
|
{
|
||||||
edict_t *ent = activeGrenades[it];
|
edict_t *ent = activeGrenades[it];
|
||||||
|
|
||||||
|
if (ent->v.effects & EF_NODRAW)
|
||||||
|
continue;
|
||||||
|
|
||||||
// check if visible to the bot
|
// check if visible to the bot
|
||||||
if (!EntityIsVisible (ent->v.origin) && InFieldOfView (ent->v.origin - EyePosition ()) > pev->fov / 2)
|
if (!EntityIsVisible (ent->v.origin) && InFieldOfView (ent->v.origin - EyePosition ()) > pev->fov / 2)
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -460,17 +434,20 @@ bool Bot::IsBehindSmokeClouds (edict_t *ent)
|
||||||
// find all grenades on the map
|
// find all grenades on the map
|
||||||
IterateArray (activeGrenades, it)
|
IterateArray (activeGrenades, it)
|
||||||
{
|
{
|
||||||
edict_t *pentGrenade = activeGrenades[it];
|
edict_t *grenade = activeGrenades[it];
|
||||||
|
|
||||||
|
if (grenade->v.effects & EF_NODRAW)
|
||||||
|
continue;
|
||||||
|
|
||||||
// if grenade is invisible don't care for it
|
// if grenade is invisible don't care for it
|
||||||
if (!(pentGrenade->v.flags & (FL_ONGROUND | FL_PARTIALGROUND)) || strcmp (STRING (pentGrenade->v.model) + 9, "smokegrenade.mdl"))
|
if (!(grenade->v.flags & (FL_ONGROUND | FL_PARTIALGROUND)) || strcmp (STRING (grenade->v.model) + 9, "smokegrenade.mdl"))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// check if visible to the bot
|
// check if visible to the bot
|
||||||
if (!EntityIsVisible (ent->v.origin) && InFieldOfView (ent->v.origin - EyePosition ()) > pev->fov / 3)
|
if (!EntityIsVisible (ent->v.origin) && InFieldOfView (ent->v.origin - EyePosition ()) > pev->fov / 3)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
const Vector &entityOrigin = GetEntityOrigin (pentGrenade);
|
const Vector &entityOrigin = GetEntityOrigin (grenade);
|
||||||
const Vector &betweenNade = (entityOrigin - pev->origin).Normalize ();
|
const Vector &betweenNade = (entityOrigin - pev->origin).Normalize ();
|
||||||
const Vector &betweenResult = ((Vector (betweenNade.y, betweenNade.x, 0) * 150.0 + entityOrigin) - pev->origin).Normalize ();
|
const Vector &betweenResult = ((Vector (betweenNade.y, betweenNade.x, 0) * 150.0 + entityOrigin) - pev->origin).Normalize ();
|
||||||
|
|
||||||
|
|
@ -2469,7 +2446,7 @@ void Bot::CheckRadioCommands (void)
|
||||||
{
|
{
|
||||||
if (IsEntityNull (m_enemy) && m_seeEnemyTime + 4.0 < GetWorldTime ())
|
if (IsEntityNull (m_enemy) && m_seeEnemyTime + 4.0 < GetWorldTime ())
|
||||||
{
|
{
|
||||||
// Decrease Fear Levels to lower probability of Bot seeking Cover again
|
// decrease fear levels to lower probability of bot seeking cover again
|
||||||
m_fearLevel -= 0.2;
|
m_fearLevel -= 0.2;
|
||||||
|
|
||||||
if (m_fearLevel < 0.0)
|
if (m_fearLevel < 0.0)
|
||||||
|
|
@ -2902,33 +2879,27 @@ void Bot::ChooseAimDirection (void)
|
||||||
TraceResult tr;
|
TraceResult tr;
|
||||||
memset (&tr, 0, sizeof (TraceResult));
|
memset (&tr, 0, sizeof (TraceResult));
|
||||||
|
|
||||||
unsigned int flags = m_aimFlags;
|
|
||||||
|
|
||||||
if (!(m_currentWaypointIndex >= 0 && m_currentWaypointIndex < g_numWaypoints))
|
if (!(m_currentWaypointIndex >= 0 && m_currentWaypointIndex < g_numWaypoints))
|
||||||
GetValidWaypoint ();
|
GetValidWaypoint ();
|
||||||
|
|
||||||
// check if last enemy vector valid
|
// check if last enemy vector valid
|
||||||
if (m_seeEnemyTime + 7.0 < GetWorldTime () && m_lastEnemyOrigin != nullvec)
|
if (m_seeEnemyTime + 7.0 < GetWorldTime () && m_lastEnemyOrigin != nullvec && (pev->origin - m_lastEnemyOrigin).GetLength () >= 1600.0f && IsEntityNull (m_enemy) && !UsesSniper ())
|
||||||
{
|
{
|
||||||
TraceLine (EyePosition (), m_lastEnemyOrigin, false, true, GetEntity (), &tr);
|
TraceLine (EyePosition (), m_lastEnemyOrigin, false, true, GetEntity (), &tr);
|
||||||
|
|
||||||
if ((pev->origin - m_lastEnemyOrigin).GetLength () >= 1600 && IsEntityNull (m_enemy) && !UsesSniper () || (tr.flFraction <= 0.2 && tr.pHit == g_hostEntity))
|
if (tr.flFraction <= 0.2 && tr.pHit == g_hostEntity)
|
||||||
{
|
{
|
||||||
if ((m_aimFlags & (AIM_LAST_ENEMY | AIM_PREDICT_PATH)) && m_wantsToFire)
|
if ((m_aimFlags & (AIM_LAST_ENEMY | AIM_PREDICT_PATH)) && m_wantsToFire)
|
||||||
m_wantsToFire = false;
|
m_wantsToFire = false;
|
||||||
|
|
||||||
m_lastEnemyOrigin = nullvec;
|
m_lastEnemyOrigin = nullvec;
|
||||||
m_aimFlags &= ~(AIM_LAST_ENEMY | AIM_PREDICT_PATH);
|
m_aimFlags &= ~(AIM_LAST_ENEMY | AIM_PREDICT_PATH);
|
||||||
|
|
||||||
flags &= ~(AIM_LAST_ENEMY | AIM_PREDICT_PATH);
|
|
||||||
flags = m_aimFlags;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if (m_lastEnemyOrigin == nullvec)
|
||||||
{
|
|
||||||
m_aimFlags &= ~(AIM_LAST_ENEMY | AIM_PREDICT_PATH);
|
m_aimFlags &= ~(AIM_LAST_ENEMY | AIM_PREDICT_PATH);
|
||||||
flags = m_aimFlags;
|
|
||||||
}
|
unsigned int flags = m_aimFlags;
|
||||||
|
|
||||||
// don't allow bot to look at danger positions under certain circumstances
|
// don't allow bot to look at danger positions under certain circumstances
|
||||||
if (!(flags & (AIM_GRENADE | AIM_ENEMY | AIM_ENTITY)))
|
if (!(flags & (AIM_GRENADE | AIM_ENEMY | AIM_ENTITY)))
|
||||||
|
|
@ -4266,13 +4237,9 @@ void Bot::RunTask (void)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
edict_t *ent = NULL;
|
edict_t *ent = NULL;
|
||||||
Array <entity_t> activeGrenades = g_botManager->GetActiveGrenades ();
|
|
||||||
|
|
||||||
// find all grenades on the map
|
while (!IsEntityNull (ent = FIND_ENTITY_BY_CLASSNAME (ent, "grenade")))
|
||||||
IterateArray (activeGrenades, it)
|
|
||||||
{
|
{
|
||||||
ent = activeGrenades[it];
|
|
||||||
|
|
||||||
if (ent->v.owner == GetEntity () && strcmp (STRING (ent->v.model) + 9, "hegrenade.mdl") == 0)
|
if (ent->v.owner == GetEntity () && strcmp (STRING (ent->v.model) + 9, "hegrenade.mdl") == 0)
|
||||||
{
|
{
|
||||||
// set the correct velocity for the grenade
|
// set the correct velocity for the grenade
|
||||||
|
|
@ -4336,13 +4303,8 @@ void Bot::RunTask (void)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
edict_t *ent = NULL;
|
edict_t *ent = NULL;
|
||||||
Array <entity_t> activeGrenades = g_botManager->GetActiveGrenades ();
|
while (!IsEntityNull (ent = FIND_ENTITY_BY_CLASSNAME (ent, "grenade")))
|
||||||
|
|
||||||
// find all grenades on the map
|
|
||||||
IterateArray (activeGrenades, it)
|
|
||||||
{
|
{
|
||||||
ent = activeGrenades[it];
|
|
||||||
|
|
||||||
if (ent->v.owner == GetEntity () && strcmp (STRING (ent->v.model) + 9, "flashbang.mdl") == 0)
|
if (ent->v.owner == GetEntity () && strcmp (STRING (ent->v.model) + 9, "flashbang.mdl") == 0)
|
||||||
{
|
{
|
||||||
// set the correct velocity for the grenade
|
// set the correct velocity for the grenade
|
||||||
|
|
@ -6081,7 +6043,7 @@ void Bot::ReactOnSound (void)
|
||||||
extern ConVar yb_shoots_thru_walls;
|
extern ConVar yb_shoots_thru_walls;
|
||||||
|
|
||||||
// check if heard enemy can be seen
|
// check if heard enemy can be seen
|
||||||
if (CheckVisibility (VARS (player), &m_lastEnemyOrigin, &m_visibility))
|
if (CheckVisibility (player, &m_lastEnemyOrigin, &m_visibility))
|
||||||
{
|
{
|
||||||
m_enemy = player;
|
m_enemy = player;
|
||||||
m_lastEnemy = player;
|
m_lastEnemy = player;
|
||||||
|
|
|
||||||
|
|
@ -72,21 +72,6 @@ int BotCommandHandler (edict_t *ent, const char *arg0, const char *arg1, const c
|
||||||
else if (stricmp (arg0, "fillserver") == 0 || stricmp (arg0, "fill") == 0)
|
else if (stricmp (arg0, "fillserver") == 0 || stricmp (arg0, "fill") == 0)
|
||||||
g_botManager->FillServer (atoi (arg1), IsNullString (arg2) ? -1 : atoi (arg2), IsNullString (arg3) ? -1 : atoi (arg3), IsNullString (arg4) ? -1 : atoi (arg4));
|
g_botManager->FillServer (atoi (arg1), IsNullString (arg2) ? -1 : atoi (arg2), IsNullString (arg3) ? -1 : atoi (arg3), IsNullString (arg4) ? -1 : atoi (arg4));
|
||||||
|
|
||||||
// swap counter-terrorist and terrorist teams
|
|
||||||
else if (stricmp (arg0, "swaptteams") == 0 || stricmp (arg0, "swap") == 0)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < GetMaxClients (); i++)
|
|
||||||
{
|
|
||||||
if (!(g_clients[i].flags & CF_USED))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (IsValidBot (g_clients[i].ent))
|
|
||||||
FakeClientCommand (g_clients[i].ent, "chooseteam; menuselect %d; menuselect 5", GetTeam (g_clients[i].ent) == TEAM_CF ? 1 : 2);
|
|
||||||
else
|
|
||||||
(*g_engfuncs.pfnClientCommand) (g_clients[i].ent, "chooseteam; menuselect %d", GetTeam (g_clients[i].ent) == TEAM_CF ? 1 : 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// select the weapon mode for bots
|
// select the weapon mode for bots
|
||||||
else if (stricmp (arg0, "weaponmode") == 0 || stricmp (arg0, "wmode") == 0)
|
else if (stricmp (arg0, "weaponmode") == 0 || stricmp (arg0, "wmode") == 0)
|
||||||
{
|
{
|
||||||
|
|
@ -116,48 +101,6 @@ int BotCommandHandler (edict_t *ent, const char *arg0, const char *arg1, const c
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// force bots to execute client command
|
|
||||||
else if (stricmp (arg0, "sendcmd") == 0 || stricmp (arg0, "order") == 0)
|
|
||||||
{
|
|
||||||
if (IsNullString (arg1))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
edict_t *target = EntityOfIndex (atoi (arg1) - 1);
|
|
||||||
|
|
||||||
if (IsValidBot (target))
|
|
||||||
{
|
|
||||||
FakeClientCommand (target, arg2);
|
|
||||||
ClientPrint (ent, print_withtag, "Bot %s executing command %s", STRING (target->v.netname), arg2);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ClientPrint (ent, print_withtag, "Player is not BOT!");
|
|
||||||
}
|
|
||||||
|
|
||||||
// display current time on the server
|
|
||||||
else if (stricmp (arg0, "test") == 0)
|
|
||||||
{
|
|
||||||
ServerPrint ("mp_bt = %.2f", mp_startmoney.GetFloat ());
|
|
||||||
}
|
|
||||||
|
|
||||||
// displays bot about information
|
|
||||||
else if (stricmp (arg0, "about_bot") == 0 || stricmp (arg0, "about") == 0)
|
|
||||||
{
|
|
||||||
if (g_gameVersion == CSV_OLD)
|
|
||||||
{
|
|
||||||
ServerPrint ("Cannot do this on CS 1.5");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
char aboutData[] =
|
|
||||||
"+---------------------------------------------------------------------------------+\n"
|
|
||||||
" The YaPB for Counter-Strike Version " PRODUCT_SUPPORT_VERSION "\n"
|
|
||||||
" Created by " PRODUCT_AUTHOR ", Using PODBot Code\n"
|
|
||||||
" Website: " PRODUCT_URL "\n"
|
|
||||||
"+---------------------------------------------------------------------------------+\n";
|
|
||||||
|
|
||||||
HudMessage (ent, true, Vector (Random.Long (33, 255), Random.Long (33, 255), Random.Long (33, 255)), aboutData);
|
|
||||||
}
|
|
||||||
|
|
||||||
// displays version information
|
// displays version information
|
||||||
else if (stricmp (arg0, "version") == 0 || stricmp (arg0, "ver") == 0)
|
else if (stricmp (arg0, "version") == 0 || stricmp (arg0, "ver") == 0)
|
||||||
{
|
{
|
||||||
|
|
@ -201,7 +144,7 @@ int BotCommandHandler (edict_t *ent, const char *arg0, const char *arg1, const c
|
||||||
|
|
||||||
if (!IsDedicatedServer ())
|
if (!IsDedicatedServer ())
|
||||||
{
|
{
|
||||||
ServerPrint ("yapb autowp - toggle autowppointing.");
|
ServerPrint ("yapb autowp - toggle autowaypointing.");
|
||||||
ServerPrint ("yapb wp - toggle waypoint showing.");
|
ServerPrint ("yapb wp - toggle waypoint showing.");
|
||||||
ServerPrint ("yapb wp on noclip - enable noclip cheat");
|
ServerPrint ("yapb wp on noclip - enable noclip cheat");
|
||||||
ServerPrint ("yapb wp save nocheck - save waypoints without checking.");
|
ServerPrint ("yapb wp save nocheck - save waypoints without checking.");
|
||||||
|
|
@ -209,7 +152,7 @@ int BotCommandHandler (edict_t *ent, const char *arg0, const char *arg1, const c
|
||||||
ServerPrint ("yapb wp menu - open main waypoint menu.");
|
ServerPrint ("yapb wp menu - open main waypoint menu.");
|
||||||
ServerPrint ("yapb wp addbasic - creates basic waypoints on map.");
|
ServerPrint ("yapb wp addbasic - creates basic waypoints on map.");
|
||||||
ServerPrint ("yapb wp find - show direction to specified waypoint.");
|
ServerPrint ("yapb wp find - show direction to specified waypoint.");
|
||||||
ServerPrint ("yapb wp load - wload the waypoint file from hard disk.");
|
ServerPrint ("yapb wp load - load the waypoint file from hard disk.");
|
||||||
ServerPrint ("yapb wp check - checks if all waypoints connections are valid.");
|
ServerPrint ("yapb wp check - checks if all waypoints connections are valid.");
|
||||||
ServerPrint ("yapb wp cache - cache nearest waypoint.");
|
ServerPrint ("yapb wp cache - cache nearest waypoint.");
|
||||||
ServerPrint ("yapb wp teleport - teleport hostile to specified waypoint.");
|
ServerPrint ("yapb wp teleport - teleport hostile to specified waypoint.");
|
||||||
|
|
|
||||||
|
|
@ -1358,12 +1358,7 @@ void BotManager::UpdateActiveGrenades (void)
|
||||||
|
|
||||||
// search the map for any type of grenade
|
// search the map for any type of grenade
|
||||||
while (!IsEntityNull (grenade = FIND_ENTITY_BY_CLASSNAME (grenade, "grenade")))
|
while (!IsEntityNull (grenade = FIND_ENTITY_BY_CLASSNAME (grenade, "grenade")))
|
||||||
{
|
|
||||||
if (grenade->v.effects & EF_NODRAW)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
m_activeGrenades.Push (grenade);
|
m_activeGrenades.Push (grenade);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const Array <entity_t> &BotManager::GetActiveGrenades (void)
|
const Array <entity_t> &BotManager::GetActiveGrenades (void)
|
||||||
|
|
|
||||||
|
|
@ -311,7 +311,7 @@ void Bot::CheckTerrain (float movedDistance, const Vector &dir, const Vector &di
|
||||||
TraceResult tr;
|
TraceResult tr;
|
||||||
edict_t *nearest = NULL;
|
edict_t *nearest = NULL;
|
||||||
|
|
||||||
if (FindNearestPlayer (reinterpret_cast <void **> (&nearest), GetEntity (), pev->maxspeed, true, false, true, true)) // found somebody?
|
if (g_timeRoundStart + 10.0f < GetWorldTime () && FindNearestPlayer (reinterpret_cast <void **> (&nearest), GetEntity (), pev->maxspeed, true, false, true, true)) // found somebody?
|
||||||
{
|
{
|
||||||
MakeVectors (m_moveAngles); // use our movement angles
|
MakeVectors (m_moveAngles); // use our movement angles
|
||||||
|
|
||||||
|
|
@ -655,7 +655,7 @@ bool Bot::DoWaypointNav (void)
|
||||||
if (IsOnFloor () || IsOnLadder ())
|
if (IsOnFloor () || IsOnLadder ())
|
||||||
{
|
{
|
||||||
if (m_desiredVelocity.x != 0.0f && m_desiredVelocity.y != 0.0f)
|
if (m_desiredVelocity.x != 0.0f && m_desiredVelocity.y != 0.0f)
|
||||||
pev->velocity = m_desiredVelocity + m_desiredVelocity * 0.11f;
|
pev->velocity = m_desiredVelocity + m_desiredVelocity * 0.076f;
|
||||||
|
|
||||||
pev->button |= IN_JUMP;
|
pev->button |= IN_JUMP;
|
||||||
|
|
||||||
|
|
@ -1939,7 +1939,6 @@ void Bot::GetValidWaypoint (void)
|
||||||
|
|
||||||
if (m_goalFailed > 1)
|
if (m_goalFailed > 1)
|
||||||
{
|
{
|
||||||
DebugMsg ("GOAL FAILED!");
|
|
||||||
int newGoal = FindGoal ();
|
int newGoal = FindGoal ();
|
||||||
|
|
||||||
m_prevGoalIndex = newGoal;
|
m_prevGoalIndex = newGoal;
|
||||||
|
|
@ -1948,7 +1947,7 @@ void Bot::GetValidWaypoint (void)
|
||||||
// remember index
|
// remember index
|
||||||
GetTask ()->data = newGoal;
|
GetTask ()->data = newGoal;
|
||||||
|
|
||||||
// do pathfinding if it's not the current waypoint
|
// do path finding if it's not the current waypoint
|
||||||
if (newGoal != m_currentWaypointIndex)
|
if (newGoal != m_currentWaypointIndex)
|
||||||
FindPath (m_currentWaypointIndex, newGoal, m_pathType);
|
FindPath (m_currentWaypointIndex, newGoal, m_pathType);
|
||||||
|
|
||||||
|
|
@ -2300,9 +2299,7 @@ bool Bot::GetBestNextWaypoint (void)
|
||||||
|
|
||||||
if (!IsPointOccupied (id))
|
if (!IsPointOccupied (id))
|
||||||
{
|
{
|
||||||
DebugMsg ("postprocess %d -> %d", m_navNode->index, id);
|
|
||||||
m_navNode->index = id;
|
m_navNode->index = id;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -270,19 +270,22 @@ void NetworkMsg::Execute (void *p)
|
||||||
if (IsEntityNull (killer) || IsEntityNull (victim))
|
if (IsEntityNull (killer) || IsEntityNull (victim))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// need to send congrats on well placed shot
|
if (yb_communication_type.GetInt () == 2)
|
||||||
for (int i = 0; i < GetMaxClients (); i++)
|
|
||||||
{
|
{
|
||||||
Bot *bot = g_botManager->GetBot (i);
|
// need to send congrats on well placed shot
|
||||||
|
for (int i = 0; i < GetMaxClients (); i++)
|
||||||
if (bot != NULL && IsAlive (bot->GetEntity ()) && killer != bot->GetEntity () && bot->EntityIsVisible (victim->v.origin) && GetTeam (killer) == GetTeam (bot->GetEntity ()) && GetTeam (killer) != GetTeam (victim))
|
|
||||||
{
|
{
|
||||||
if (killer == g_hostEntity)
|
Bot *bot = g_botManager->GetBot (i);
|
||||||
bot->HandleChatterMessage ("#Bot_NiceShotCommander");
|
|
||||||
else
|
|
||||||
bot->HandleChatterMessage ("#Bot_NiceShotPall");
|
|
||||||
|
|
||||||
break;
|
if (bot != NULL && IsAlive (bot->GetEntity ()) && killer != bot->GetEntity () && bot->EntityIsVisible (victim->v.origin) && GetTeam (killer) == GetTeam (bot->GetEntity ()) && GetTeam (killer) != GetTeam (victim))
|
||||||
|
{
|
||||||
|
if (killer == g_hostEntity)
|
||||||
|
bot->HandleChatterMessage ("#Bot_NiceShotCommander");
|
||||||
|
else
|
||||||
|
bot->HandleChatterMessage ("#Bot_NiceShotPall");
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -394,11 +397,30 @@ void NetworkMsg::Execute (void *p)
|
||||||
g_isCommencing = true;
|
g_isCommencing = true;
|
||||||
|
|
||||||
if (FStrEq (PTR_TO_STR (p), "#CTs_Win"))
|
if (FStrEq (PTR_TO_STR (p), "#CTs_Win"))
|
||||||
|
{
|
||||||
g_botManager->SetLastWinner (TEAM_CF); // update last winner for economics
|
g_botManager->SetLastWinner (TEAM_CF); // update last winner for economics
|
||||||
|
|
||||||
|
if (yb_communication_type.GetInt () == 2)
|
||||||
|
{
|
||||||
|
Bot *bot = g_botManager->FindOneValidAliveBot ();
|
||||||
|
|
||||||
|
if (bot != NULL && IsAlive (bot->GetEntity ()))
|
||||||
|
bot->HandleChatterMessage (PTR_TO_STR (p));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (FStrEq (PTR_TO_STR (p), "#Terrorists_Win"))
|
if (FStrEq (PTR_TO_STR (p), "#Terrorists_Win"))
|
||||||
|
{
|
||||||
g_botManager->SetLastWinner (TEAM_TF); // update last winner for economics
|
g_botManager->SetLastWinner (TEAM_TF); // update last winner for economics
|
||||||
|
|
||||||
|
if (yb_communication_type.GetInt () == 2)
|
||||||
|
{
|
||||||
|
Bot *bot = g_botManager->FindOneValidAliveBot ();
|
||||||
|
|
||||||
|
if (bot != NULL && IsAlive (bot->GetEntity ()))
|
||||||
|
bot->HandleChatterMessage (PTR_TO_STR (p));
|
||||||
|
}
|
||||||
|
}
|
||||||
g_waypoint->SetBombPosition (true);
|
g_waypoint->SetBombPosition (true);
|
||||||
}
|
}
|
||||||
else if (!g_bombPlanted && FStrEq (PTR_TO_STR (p), "#Bomb_Planted"))
|
else if (!g_bombPlanted && FStrEq (PTR_TO_STR (p), "#Bomb_Planted"))
|
||||||
|
|
@ -406,36 +428,28 @@ void NetworkMsg::Execute (void *p)
|
||||||
g_bombPlanted = g_bombSayString = true;
|
g_bombPlanted = g_bombSayString = true;
|
||||||
g_timeBombPlanted = GetWorldTime ();
|
g_timeBombPlanted = GetWorldTime ();
|
||||||
|
|
||||||
if (yb_communication_type.GetInt() == 2)
|
if (yb_communication_type.GetInt () == 2)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < GetMaxClients(); i++)
|
for (int i = 0; i < GetMaxClients (); i++)
|
||||||
{
|
{
|
||||||
Bot *bot = g_botManager->GetBot(i);
|
Bot *bot = g_botManager->GetBot (i);
|
||||||
|
|
||||||
if (bot != NULL && IsAlive(bot->GetEntity()))
|
if (bot != NULL && IsAlive (bot->GetEntity ()))
|
||||||
{
|
{
|
||||||
bot->DeleteSearchNodes();
|
bot->DeleteSearchNodes ();
|
||||||
bot->ResetTasks();
|
bot->ResetTasks ();
|
||||||
|
|
||||||
if (Random.Long(0, 100) < 75 && GetTeam(bot->GetEntity()) == TEAM_CF)
|
if (Random.Long (0, 100) < 75 && GetTeam (bot->GetEntity ()) == TEAM_CF)
|
||||||
bot->ChatterMessage(Chatter_WhereIsTheBomb);
|
bot->ChatterMessage (Chatter_WhereIsTheBomb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g_waypoint->SetBombPosition ();
|
g_waypoint->SetBombPosition ();
|
||||||
}
|
}
|
||||||
else if (m_bot != NULL && FStrEq (PTR_TO_STR (p), "#Switch_To_BurstFire"))
|
else if (m_bot != NULL && FStrEq (PTR_TO_STR (p), "#Switch_To_BurstFire"))
|
||||||
m_bot->m_weaponBurstMode = BM_ON;
|
m_bot->m_weaponBurstMode = BM_ON;
|
||||||
else if (m_bot != NULL && FStrEq (PTR_TO_STR (p), "#Switch_To_SemiAuto"))
|
else if (m_bot != NULL && FStrEq (PTR_TO_STR (p), "#Switch_To_SemiAuto"))
|
||||||
m_bot->m_weaponBurstMode = BM_OFF;
|
m_bot->m_weaponBurstMode = BM_OFF;
|
||||||
|
|
||||||
if (yb_communication_type.GetInt() == 2)
|
|
||||||
{
|
|
||||||
Bot *bot = g_botManager->FindOneValidAliveBot();
|
|
||||||
|
|
||||||
if (bot != NULL && IsAlive(bot->GetEntity()))
|
|
||||||
bot->HandleChatterMessage(PTR_TO_STR(p));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -789,10 +789,6 @@ int GetWeaponPenetrationPower (int id)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int GetTeam (edict_t *ent)
|
|
||||||
{
|
|
||||||
return g_clients[IndexOfEntity (ent) - 1].team;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsValidPlayer (edict_t *ent)
|
bool IsValidPlayer (edict_t *ent)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue