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.
120 lines
3.1 KiB
120 lines
3.1 KiB
4 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
// boss_alpha_launch_rockets.cpp
|
||
|
// Michael Booth, November 2010
|
||
|
|
||
|
#include "cbase.h"
|
||
|
|
||
|
#ifdef TF_RAID_MODE
|
||
|
|
||
|
#include "tf_projectile_rocket.h"
|
||
|
#include "player_vs_environment/boss_alpha/boss_alpha.h"
|
||
|
#include "player_vs_environment/boss_alpha/behavior/boss_alpha_launch_rockets.h"
|
||
|
|
||
|
ConVar tf_boss_alpha_dont_shoot( "tf_boss_alpha_dont_shoot", "0"/*, FCVAR_CHEAT*/ );
|
||
|
|
||
|
|
||
|
//---------------------------------------------------------------------------------------------
|
||
|
ActionResult< CBossAlpha > CBossAlphaLaunchRockets::OnStart( CBossAlpha *me, Action< CBossAlpha > *priorAction )
|
||
|
{
|
||
|
// start animation
|
||
|
me->GetBodyInterface()->StartActivity( ACT_MP_STAND_SECONDARY );
|
||
|
|
||
|
m_animLayer = me->AddLayeredSequence( me->LookupSequence( "taunt02" ), 0 );
|
||
|
|
||
|
m_timer.Start( 1.0f );
|
||
|
|
||
|
m_rocketsLeft = me->GetRocketLaunchCount();
|
||
|
|
||
|
me->AddCondition( CBossAlpha::BUSY );
|
||
|
me->LockAttackTarget();
|
||
|
|
||
|
me->EmitSound( "RobotBoss.LaunchRockets" );
|
||
|
|
||
|
if ( me->GetAttackTarget() == NULL )
|
||
|
{
|
||
|
return Done( "No target" );
|
||
|
}
|
||
|
|
||
|
m_target = me->GetAttackTarget();
|
||
|
m_lastTargetPosition = m_target->WorldSpaceCenter();
|
||
|
|
||
|
return Continue();
|
||
|
}
|
||
|
|
||
|
|
||
|
//---------------------------------------------------------------------------------------------
|
||
|
ActionResult< CBossAlpha > CBossAlphaLaunchRockets::Update( CBossAlpha *me, float interval )
|
||
|
{
|
||
|
if ( m_target != NULL )
|
||
|
{
|
||
|
m_lastTargetPosition = m_target->WorldSpaceCenter();
|
||
|
}
|
||
|
|
||
|
me->GetLocomotionInterface()->FaceTowards( m_lastTargetPosition );
|
||
|
|
||
|
if ( m_timer.IsElapsed() && m_launchTimer.IsElapsed() )
|
||
|
{
|
||
|
if ( !m_rocketsLeft )
|
||
|
{
|
||
|
return Done();
|
||
|
}
|
||
|
|
||
|
--m_rocketsLeft;
|
||
|
m_launchTimer.Start( me->GetRocketInterval() );
|
||
|
|
||
|
QAngle launchAngles = me->GetAbsAngles();
|
||
|
|
||
|
if ( m_target == NULL )
|
||
|
{
|
||
|
Vector to = m_lastTargetPosition - me->WorldSpaceCenter();
|
||
|
VectorAngles( to, launchAngles );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
float range = me->GetRangeTo( m_target->EyePosition() );
|
||
|
|
||
|
const float rocketSpeed = me->GetRocketAimError() * 1100.0f; // 2000.0f; // 1100.0f; nerfing accuracy
|
||
|
float flightTime = range / rocketSpeed;
|
||
|
|
||
|
Vector aimSpot = m_target->EyePosition() + m_target->GetAbsVelocity() * flightTime;
|
||
|
|
||
|
Vector to = aimSpot - me->WorldSpaceCenter();
|
||
|
VectorAngles( to, launchAngles );
|
||
|
}
|
||
|
|
||
|
if ( !tf_boss_alpha_dont_shoot.GetBool() )
|
||
|
{
|
||
|
CTFProjectile_Rocket *pRocket = CTFProjectile_Rocket::Create( me, me->WorldSpaceCenter(), launchAngles, me, me );
|
||
|
if ( pRocket )
|
||
|
{
|
||
|
if ( me->IsInCondition( CBossAlpha::ENRAGED ) )
|
||
|
{
|
||
|
pRocket->SetCritical( true );
|
||
|
pRocket->EmitSound( "Weapon_RPG.SingleCrit" );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
me->EmitSound( me->GetRocketSoundEffect() );
|
||
|
}
|
||
|
|
||
|
pRocket->SetDamage( me->GetRocketDamage() );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return Continue();
|
||
|
}
|
||
|
|
||
|
|
||
|
//---------------------------------------------------------------------------------------------
|
||
|
void CBossAlphaLaunchRockets::OnEnd( CBossAlpha *me, Action< CBossAlpha > *nextAction )
|
||
|
{
|
||
|
me->RemoveCondition( CBossAlpha::ENRAGED );
|
||
|
me->RemoveCondition( CBossAlpha::BUSY );
|
||
|
me->FastRemoveLayer( m_animLayer );
|
||
|
me->UnlockAttackTarget();
|
||
|
}
|
||
|
|
||
|
|
||
|
#endif // TF_RAID_MODE
|