//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // //============================================================================= #include "cbase.h" #include "tf_weapon_rocketpack.h" // Client specific. #ifdef CLIENT_DLL #include "c_tf_player.h" // Server specific. #else #include "tf_player.h" #include "tf_ammo_pack.h" #include "ilagcompensationmanager.h" #include "tf_gamerules.h" #endif // TFRocketPack -- IMPLEMENT_NETWORKCLASS_ALIASED( TFRocketPack, DT_TFWeaponRocketPack ) BEGIN_NETWORK_TABLE( CTFRocketPack, DT_TFWeaponRocketPack ) END_NETWORK_TABLE() BEGIN_PREDICTION_DATA( CTFRocketPack ) END_PREDICTION_DATA() LINK_ENTITY_TO_CLASS( tf_weapon_rocketpack, CTFRocketPack ); PRECACHE_WEAPON_REGISTER( tf_weapon_rocketpack ); //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- CTFRocketPack::CTFRocketPack() { m_flRefireTime = 0; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTFRocketPack::PreCache( void ) { PrecacheParticleSystem( "rocketbackblast" ); PrecacheScriptSound( "Weapon_Liberty_Launcher.Single" ); BaseClass::Precache(); } #ifdef GAME_DLL //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool CTFRocketPack::CanFire( void ) { CTFPlayer *pOwner = ToTFPlayer( GetOwner() ); if ( !pOwner ) return false; if ( !TFGameRules()->IsMannVsMachineMode() ) return false; if ( TFGameRules() && (TFGameRules()->State_Get() == GR_STATE_PREROUND) ) return false; if ( pOwner->m_Shared.IsLoser() ) return false; if ( pOwner->m_Shared.InCond( TF_COND_STUNNED ) ) return false; if ( pOwner->IsTaunting() ) return false; if ( m_flRefireTime > gpGlobals->curtime ) return false; if ( pOwner->GetAmmoCount( TF_AMMO_GRENADES1 ) > 0) return true; return false; } #endif // GAME_DLL //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTFRocketPack::PrimaryAttack( void ) { CTFPlayer *pOwner = ToTFPlayer( GetOwner() ); if ( !pOwner ) return; if ( !CanAttack() ) return; #ifdef GAME_DLL if ( !CanFire() ) return; // Launch if ( !pOwner->m_Shared.InCond( TF_COND_ROCKETPACK ) ) { pOwner->m_Shared.AddCond( TF_COND_ROCKETPACK ); pOwner->m_Shared.StunPlayer( 0.5f, 1.0f, TF_STUN_MOVEMENT ); } Vector vecDir; pOwner->EyeVectors( &vecDir ); pOwner->SetAbsVelocity( vec3_origin ); Vector vecFlightDir = -vecDir; VectorNormalize( vecFlightDir ); float flForce = 450.f; const float flPushScale = ( pOwner->GetFlags() & FL_ONGROUND ) ? 1.2f : 1.8f; // Greater force while airborne const float flVertPushScale = ( pOwner->GetFlags() & FL_ONGROUND ) ? 1.2f : 0.25f; // Less vertical force while airborne Vector vecForce = vecFlightDir * -flForce * flPushScale; vecForce.z += 1.f * flForce * flVertPushScale; pOwner->RemoveFlag( FL_ONGROUND ); pOwner->ApplyAbsVelocityImpulse( vecForce ); pOwner->RemoveAmmo( m_pWeaponInfo->GetWeaponData( m_iWeaponMode ).m_iAmmoPerShot, m_iPrimaryAmmoType ); pOwner->EmitSound( "Weapon_Liberty_Launcher.Single" ); m_flRefireTime = gpGlobals->curtime + 0.25f; #endif // GAME_DLL StartEffectBarRegen(); if ( pOwner->GetAmmoCount( TF_AMMO_GRENADES1 ) == 0 ) { g_pGameRules->SwitchToNextBestWeapon( pOwner, this ); } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool CTFRocketPack::Deploy( void ) { CTFPlayer *pOwner = ToTFPlayer( GetOwner() ); if ( pOwner ) { pOwner->m_Shared.SetRocketPackEquipped( true ); } return BaseClass::Deploy(); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool CTFRocketPack::Holster( CBaseCombatWeapon *pSwitchingTo ) { CTFPlayer *pOwner = ToTFPlayer( GetOwner() ); if ( pOwner ) { pOwner->m_Shared.SetRocketPackEquipped( false ); } return BaseClass::Holster( pSwitchingTo ); }