//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // //============================================================================= #include "cbase.h" #include "c_tf_projectile_rocket.h" #include "particles_new.h" #include "tf_gamerules.h" IMPLEMENT_NETWORKCLASS_ALIASED( TFProjectile_Rocket, DT_TFProjectile_Rocket ) BEGIN_NETWORK_TABLE( C_TFProjectile_Rocket, DT_TFProjectile_Rocket ) RecvPropBool( RECVINFO( m_bCritical ) ), END_NETWORK_TABLE() //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- C_TFProjectile_Rocket::C_TFProjectile_Rocket( void ) { pEffect = NULL; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- C_TFProjectile_Rocket::~C_TFProjectile_Rocket( void ) { if ( pEffect ) { ParticleProp()->StopEmission( pEffect ); } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void C_TFProjectile_Rocket::OnDataChanged(DataUpdateType_t updateType) { BaseClass::OnDataChanged(updateType); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void C_TFProjectile_Rocket::CreateTrails( void ) { if ( IsDormant() ) return; bool bUsingCustom = false; if ( pEffect ) { ParticleProp()->StopEmission( pEffect ); pEffect = NULL; } int iAttachment = LookupAttachment( "trail" ); if ( iAttachment == INVALID_PARTICLE_ATTACHMENT ) return; if ( enginetrace->GetPointContents( GetAbsOrigin() ) & MASK_WATER ) { ParticleProp()->Create( "rockettrail_underwater", PATTACH_POINT_FOLLOW, "trail" ); bUsingCustom = true; } else if ( GetTeamNumber() == TEAM_UNASSIGNED ) { ParticleProp()->Create( "rockettrail_underwater", PATTACH_POINT_FOLLOW, "trail" ); bUsingCustom = true; } else { // Halloween Spell Effect Check int iHalloweenSpell = 0; // if the owner is a Sentry, Check its owner CBaseObject *pSentry = GetOwnerEntity() && GetOwnerEntity()->IsBaseObject() ? assert_cast( GetOwnerEntity() ) : NULL; if ( TF_IsHolidayActive( kHoliday_HalloweenOrFullMoon ) ) { if ( pSentry ) { CALL_ATTRIB_HOOK_INT_ON_OTHER( pSentry->GetOwner(), iHalloweenSpell, halloween_pumpkin_explosions ); } else { CALL_ATTRIB_HOOK_INT_ON_OTHER( GetOwnerEntity(), iHalloweenSpell, halloween_pumpkin_explosions ); } } // Mini rockets from airstrike RL if ( iHalloweenSpell > 0 ) { ParticleProp()->Create( "halloween_rockettrail", PATTACH_POINT_FOLLOW, iAttachment ); bUsingCustom = true; } else if ( !pSentry ) { if ( GetLauncher() ) { int iMiniRocket = 0; CALL_ATTRIB_HOOK_INT_ON_OTHER( GetLauncher(), iMiniRocket, mini_rockets ); if ( iMiniRocket ) { ParticleProp()->Create( "rockettrail_airstrike", PATTACH_POINT_FOLLOW, iAttachment ); bUsingCustom = true; // rockettrail_airstrike_line CTFPlayer *pPlayer = ToTFPlayer( GetOwnerEntity() ); if ( pPlayer && pPlayer->m_Shared.InCond( TF_COND_BLASTJUMPING ) ) { ParticleProp()->Create( "rockettrail_airstrike_line", PATTACH_POINT_FOLLOW, iAttachment ); } } } } } if ( !bUsingCustom ) { if ( GetTrailParticleName() ) { ParticleProp()->Create( GetTrailParticleName(), PATTACH_POINT_FOLLOW, iAttachment ); } } if ( m_bCritical ) { switch( GetTeamNumber() ) { case TF_TEAM_BLUE: pEffect = ParticleProp()->Create( "critical_rocket_blue", PATTACH_ABSORIGIN_FOLLOW ); break; case TF_TEAM_RED: pEffect = ParticleProp()->Create( "critical_rocket_red", PATTACH_ABSORIGIN_FOLLOW ); break; default: pEffect = ParticleProp()->Create( "eyeboss_projectile", PATTACH_ABSORIGIN_FOLLOW ); break; } } }