Team Fortress 2 Source Code as on 22/4/2020
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.
|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// TF Rocket
//
//=============================================================================
#include "cbase.h"
#include "tf_weaponbase.h"
#include "tf_projectile_rocket.h"
#include "tf_player.h"
//=============================================================================
//
// TF Rocket functions (Server specific).
//
#define ROCKET_MODEL "models/weapons/w_models/w_rocket.mdl"
LINK_ENTITY_TO_CLASS( tf_projectile_rocket, CTFProjectile_Rocket ); PRECACHE_REGISTER( tf_projectile_rocket );
IMPLEMENT_NETWORKCLASS_ALIASED( TFProjectile_Rocket, DT_TFProjectile_Rocket )
BEGIN_NETWORK_TABLE( CTFProjectile_Rocket, DT_TFProjectile_Rocket ) SendPropBool( SENDINFO( m_bCritical ) ), END_NETWORK_TABLE()
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
CTFProjectile_Rocket *CTFProjectile_Rocket::Create( CBaseEntity *pLauncher, const Vector &vecOrigin, const QAngle &vecAngles, CBaseEntity *pOwner, CBaseEntity *pScorer ) { CTFProjectile_Rocket *pRocket = static_cast<CTFProjectile_Rocket*>( CTFBaseRocket::Create( pLauncher, "tf_projectile_rocket", vecOrigin, vecAngles, pOwner ) );
if ( pRocket ) { pRocket->SetScorer( pScorer ); pRocket->SetEyeBallRocket( false ); pRocket->SetSpell( false );
CTFWeaponBase *pWeapon = dynamic_cast< CTFWeaponBase * >( pLauncher ); bool bDirectHit = pWeapon ? ( pWeapon->GetWeaponID() == TF_WEAPON_ROCKETLAUNCHER_DIRECTHIT ) : false; pRocket->SetDirectHit( bDirectHit ); }
return pRocket; }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CTFProjectile_Rocket::Spawn() { SetModel( ROCKET_MODEL ); BaseClass::Spawn(); }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CTFProjectile_Rocket::Precache() { int iModel = PrecacheModel( ROCKET_MODEL ); PrecacheGibsForModel( iModel ); PrecacheParticleSystem( "critical_rocket_blue" ); PrecacheParticleSystem( "critical_rocket_red" ); PrecacheParticleSystem( "eyeboss_projectile" ); PrecacheParticleSystem( "rockettrail" ); BaseClass::Precache(); }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CTFProjectile_Rocket::SetScorer( CBaseEntity *pScorer ) { m_Scorer = pScorer; }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
CBasePlayer *CTFProjectile_Rocket::GetScorer( void ) { return dynamic_cast<CBasePlayer *>( m_Scorer.Get() ); }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
int CTFProjectile_Rocket::GetDamageType() { int iDmgType = BaseClass::GetDamageType(); if ( m_bCritical ) { iDmgType |= DMG_CRITICAL; }
return iDmgType; }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
int CTFProjectile_Rocket::GetDamageCustom() { if ( m_bDirectHit ) { return TF_DMG_CUSTOM_ROCKET_DIRECTHIT; } else if ( m_bEyeBallRocket ) { return TF_DMG_CUSTOM_EYEBALL_ROCKET; } else if ( m_bSpell ) { return TF_DMG_CUSTOM_SPELL_MONOCULUS; } else return BaseClass::GetDamageCustom(); }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CTFProjectile_Rocket::RocketTouch( CBaseEntity *pOther ) { BaseClass::RocketTouch( pOther ); if (m_bCritical && pOther && pOther->IsPlayer()) { CTFPlayer *pHitPlayer = ToTFPlayer( pOther ); int iHitPlayerTeamNumber = pHitPlayer->GetTeamNumber(); int iRocketTeamNumber = BaseClass::GetTeamNumber();
if (pHitPlayer->IsPlayerClass(TF_CLASS_HEAVYWEAPONS) && !pHitPlayer->m_Shared.InCond( TF_COND_INVULNERABLE) && pHitPlayer->IsAlive() && iHitPlayerTeamNumber != iRocketTeamNumber) { pHitPlayer->AwardAchievement( ACHIEVEMENT_TF_HEAVY_SURVIVE_CROCKET ); } } }
//-----------------------------------------------------------------------------
// Purpose: Rocket was deflected.
//-----------------------------------------------------------------------------
void CTFProjectile_Rocket::Deflected( CBaseEntity *pDeflectedBy, Vector &vecDir ) { CTFPlayer *pTFDeflector = ToTFPlayer( pDeflectedBy ); if ( !pTFDeflector ) return;
ChangeTeam( pTFDeflector->GetTeamNumber() ); SetLauncher( pTFDeflector->GetActiveWeapon() );
CTFPlayer* pOldOwner = ToTFPlayer( GetOwnerEntity() ); SetOwnerEntity( pTFDeflector );
if ( pOldOwner ) { pOldOwner->SpeakConceptIfAllowed( MP_CONCEPT_DEFLECTED, "projectile:1,victim:1" ); }
if ( pTFDeflector->m_Shared.IsCritBoosted() ) { SetCritical( true ); }
CTFWeaponBase::SendObjectDeflectedEvent( pTFDeflector, pOldOwner, GetWeaponID(), this );
IncrementDeflected(); m_nSkin = ( GetTeamNumber() == TF_TEAM_BLUE ) ? 1 : 0; }
|