Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 41 additions & 17 deletions src/game/server/neo/bot/behavior/neo_bot_retreat_from_grenade.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,42 @@ ConVar neo_bot_debug_retreat_from_grenade( "neo_bot_debug_retreat_from_grenade",
ConVar neo_bot_grenade_check_radius( "neo_bot_grenade_check_radius", "500", FCVAR_CHEAT );


//---------------------------------------------------------------------------------------------
// In flight a smoke looks like a frag, unless we know who threw it
static bool IsUnidentifiedSmoke( CNEOBot *me, CBaseEntity *grenade )
{
if ( !FClassnameIs( grenade, "neo_grenade_smoke" ) )
{
return false;
}

CBaseCombatCharacter *thrower = static_cast< CBaseGrenade * >( grenade )->GetThrower();
if ( !thrower )
{
return true;
}

if ( thrower == me )
{
return false;
}

if ( NEORules()->IsTeamplay() && thrower->GetTeamNumber() == me->GetTeamNumber() )
{
return false;
}

const CKnownEntity *known = me->GetVisionInterface()->GetKnown( thrower );
if ( !known || !known->WasEverVisible() )
{
return true;
}

CNEO_Player *pThrower = ToNEOPlayer( thrower );
return !pThrower || pThrower->GetClass() != NEO_CLASS_SUPPORT;
}


//---------------------------------------------------------------------------------------------
CBaseEntity *CNEOBotRetreatFromGrenade::FindDangerousGrenade( CNEOBot *me )
{
Expand All @@ -41,7 +77,7 @@ CBaseEntity *CNEOBotRetreatFromGrenade::FindDangerousGrenade( CNEOBot *me )
CBaseEntity *pOwner = pSound->m_hOwner.Get();
// Use FClassnameIs to check if it's a generic base grenade or our specific ones
// FClassnameIs is better than dynamic_cast inside a loop when possible
if ( pOwner && ( FClassnameIs( pOwner, pszGrenadeClass ) || FClassnameIs( pOwner, "neo_grenade_smoke" ) ) )
if ( pOwner && ( FClassnameIs( pOwner, pszGrenadeClass ) || IsUnidentifiedSmoke( me, pOwner ) ) )
{
// Found a dangerous grenade
closestThreat = pOwner;
Expand Down Expand Up @@ -240,14 +276,6 @@ ActionResult< CNEOBot > CNEOBotRetreatFromGrenade::Update( CNEOBot *me, float in
}

const CNavArea *grenadeArea = TheNavMesh->GetNavArea( m_grenade->GetAbsOrigin() );
bool bIsExposed = false;
if ( grenadeArea && me->GetLastKnownArea() )
{
if ( grenadeArea->IsPotentiallyVisible( me->GetLastKnownArea() ) )
{
bIsExposed = true;

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also took the opportunity to remove some dead stub code that didn't end up being used for anything impactful.

}
}

// track projectile and relation to escape destination every update
if ( !m_coverArea || ( grenadeArea && grenadeArea->IsPotentiallyVisible( m_coverArea ) ) )
Expand All @@ -268,16 +296,12 @@ ActionResult< CNEOBot > CNEOBotRetreatFromGrenade::Update( CNEOBot *me, float in
return Done("Reacting to contact instead");
}

if ( me->GetLastKnownArea() != m_coverArea || !bIsExposed )
if ( m_repathTimer.IsElapsed() || !m_path.IsValid() )
{
// not in cover yet
if ( m_repathTimer.IsElapsed() || !m_path.IsValid() )
{
CNEOBotPathCompute( me, m_path, m_coverArea->GetCenter(), FASTEST_ROUTE );
m_repathTimer.Start( 1.0f );
}
m_path.Update( me );
CNEOBotPathCompute( me, m_path, m_coverArea->GetCenter(), FASTEST_ROUTE );
m_repathTimer.Start( 1.0f );
}
m_path.Update( me );

return Continue();
}
Expand Down