Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

170 lines
4.9 KiB

//========= Copyright Valve Corporation, All rights reserved. ============//
// boss_alpha_chase_victim.cpp
// Michael Booth, November 2010
#include "cbase.h"
#ifdef TF_RAID_MODE
#include "player_vs_environment/boss_alpha/boss_alpha.h"
#include "player_vs_environment/boss_alpha/behavior/boss_alpha_chase_victim.h"
#include "player_vs_environment/boss_alpha/behavior/boss_alpha_lost_victim.h"
#include "player_vs_environment/boss_alpha/behavior/boss_alpha_nuke_attack.h"
#include "player_vs_environment/boss_alpha/behavior/boss_alpha_launch_grenades.h"
#include "player_vs_environment/boss_alpha/behavior/boss_alpha_launch_rockets.h"
extern ConVar tf_boss_alpha_grenade_launch_range;
extern ConVar tf_boss_alpha_chase_range;
//---------------------------------------------------------------------------------------------
CBossAlphaChaseVictim::CBossAlphaChaseVictim( CBaseCombatCharacter *chaseTarget )
{
m_chaseTarget = chaseTarget;
m_lastKnownTargetSpot = chaseTarget->GetAbsOrigin();
}
//---------------------------------------------------------------------------------------------
ActionResult< CBossAlpha > CBossAlphaChaseVictim::OnStart( CBossAlpha *me, Action< CBossAlpha > *priorAction )
{
if ( m_chaseTarget == NULL )
{
return Done( "Target is NULL" );
}
m_lastKnownTargetSpot = m_chaseTarget->GetAbsOrigin();
return Continue();
}
//---------------------------------------------------------------------------------------------
ActionResult< CBossAlpha > CBossAlphaChaseVictim::Update( CBossAlpha *me, float interval )
{
if ( m_chaseTarget == NULL || !m_chaseTarget->IsAlive() )
{
return ChangeTo( new CBossAlphaLostVictim, "No victim" );
}
if ( m_chaseTarget != me->GetAttackTarget() )
{
return Done( "Changing targets" );
}
Vector moveGoal = m_chaseTarget->GetAbsOrigin();
if ( me->IsLineOfSightClear( m_chaseTarget ) )
{
if ( !m_visibleTimer.HasStarted() )
{
m_visibleTimer.Start();
}
if ( me->HasAbility( CBossAlpha::CAN_NUKE ) && me->GetNukeTimer()->IsElapsed() )
{
return SuspendFor( new CBossAlphaNukeAttack, "Nuking!" );
}
m_lastKnownTargetSpot = m_chaseTarget->GetAbsOrigin();
if ( me->HasAbility( CBossAlpha::CAN_LAUNCH_STICKIES ) )
{
if ( ( me->GetGrenadeTimer()->IsElapsed() && me->IsRangeLessThan( m_chaseTarget, tf_boss_alpha_grenade_launch_range.GetFloat() ) ) ||
me->IsInCondition( CBossAlpha::ENRAGED ) )
{
return SuspendFor( new CBossAlphaLaunchGrenades, "Target is close (or I am enraged) - grenades!" );
}
}
// chase into line of sight a bit so they can't immediately get behind cover again
if ( me->HasAbility( CBossAlpha::CAN_FIRE_ROCKETS ) )
{
if ( m_visibleTimer.IsGreaterThen( 1.0f ) ||
me->IsRangeLessThan( m_chaseTarget, tf_boss_alpha_chase_range.GetFloat() ) )
{
return SuspendFor( new CBossAlphaLaunchRockets, "Fire!" );
}
}
if ( me->IsRangeLessThan( m_chaseTarget, 150.0f ) )
{
// too close - stand still
if ( !me->GetBodyInterface()->IsActivity( ACT_MP_STAND_MELEE ) )
{
me->GetBodyInterface()->StartActivity( ACT_MP_STAND_MELEE );
}
return Continue();
}
}
else
{
m_visibleTimer.Invalidate();
// move to where we last saw our target
moveGoal = m_lastKnownTargetSpot;
if ( me->IsRangeLessThan( m_lastKnownTargetSpot, 20.0f ) )
{
// reached spot where we last saw our victim - give up
me->SetAttackTarget( NULL );
return ChangeTo( new CBossAlphaLostVictim, "I lost my chase victim" );
}
}
// move into sight of target
if ( m_path.GetAge() > 1.0f )
{
CBossAlphaPathCost cost( me );
m_path.Compute( me, moveGoal, cost );
}
me->GetLocomotionInterface()->Run();
m_path.Update( me );
// play running animation
if ( !me->GetBodyInterface()->IsActivity( ACT_MP_RUN_MELEE ) )
{
me->GetBodyInterface()->StartActivity( ACT_MP_RUN_MELEE );
}
return Continue();
}
//---------------------------------------------------------------------------------------------
EventDesiredResult< CBossAlpha > CBossAlphaChaseVictim::OnMoveToSuccess( CBossAlpha *me, const Path *path )
{
return TryDone( RESULT_CRITICAL, "Reached move goal" );
}
//---------------------------------------------------------------------------------------------
EventDesiredResult< CBossAlpha > CBossAlphaChaseVictim::OnMoveToFailure( CBossAlpha *me, const Path *path, MoveToFailureType reason )
{
return TryDone( RESULT_CRITICAL, "Path follow failed" );
}
//---------------------------------------------------------------------------------------------
void CBossAlphaChaseVictim::OnEnd( CBossAlpha *me, Action< CBossAlpha > *nextAction )
{
}
//---------------------------------------------------------------------------------------------
EventDesiredResult< CBossAlpha > CBossAlphaChaseVictim::OnStuck( CBossAlpha *me )
{
// we're stuck - just warp to the our next path goal
if ( m_path.GetCurrentGoal() )
{
me->SetAbsOrigin( m_path.GetCurrentGoal()->pos + Vector( 0, 0, 10.0f ) );
}
return TryContinue();
}
#endif // TF_RAID_MODE