//----------------------------------------------------------------------------- // Teleport the passed player to our destination //----------------------------------------------------------------------------- void CObjectTeleporter::TeleporterSend( CTFPlayer *pPlayer ) { if ( !pPlayer ) return; SetTeleportingPlayer( pPlayer ); pPlayer->m_Shared.AddCond( TF_COND_SELECTED_TO_TELEPORT ); Vector origin = GetAbsOrigin(); CPVSFilter filter( origin ); int iTeam = pPlayer->GetTeamNumber(); if ( pPlayer->m_Shared.InCond( TF_COND_DISGUISED ) ) { iTeam = pPlayer->m_Shared.GetDisguiseTeam(); } const char *pszTeleportedEffect = ConstructTeamParticle( "teleported_%s", iTeam ); const char *pszSparklesEffect = ConstructTeamParticle( "player_sparkles_%s", iTeam ); TE_TFParticleEffect( filter, 0.0, pszTeleportedEffect, origin, vec3_angle ); TE_TFParticleEffect( filter, 0.0, pszSparklesEffect, origin, vec3_angle, pPlayer, PATTACH_POINT ); EmitSound( "Building_Teleporter.Send" ); SetState( TELEPORTER_STATE_SENDING ); m_flMyNextThink = gpGlobals->curtime + 0.1; m_iTimesUsed++; }
//----------------------------------------------------------------------------- // Receive a teleporting player //----------------------------------------------------------------------------- void CObjectTeleporter::TeleporterReceive( CTFPlayer *pPlayer, float flDelay ) { if ( !pPlayer ) return; SetTeleportingPlayer( pPlayer ); Vector origin = GetAbsOrigin(); CPVSFilter filter( origin ); int iTeam = pPlayer->GetTeamNumber(); if ( pPlayer->m_Shared.InCond( TF_COND_DISGUISED ) ) { iTeam = pPlayer->m_Shared.GetDisguiseTeam(); } const char *pszEffectName = ConstructTeamParticle( "teleportedin_%s", iTeam ); TE_TFParticleEffect( filter, 0.0, pszEffectName, origin, vec3_angle ); EmitSound( "Building_Teleporter.Receive" ); SetState( TELEPORTER_STATE_RECEIVING ); m_flMyNextThink = gpGlobals->curtime + BUILD_TELEPORTER_FADEOUT_TIME; if ( pPlayer != GetBuilder() ) m_iTimesUsed++; }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTFFlameThrower::RestartParticleEffect( void ) { CTFPlayer *pOwner = ToTFPlayer( GetPlayerOwner() ); if ( !pOwner ) return; if ( m_pFlameEffect && m_hFlameEffectHost.Get() ) { m_hFlameEffectHost->ParticleProp()->StopEmission( m_pFlameEffect ); } m_iParticleWaterLevel = pOwner->GetWaterLevel(); int iTeam = pOwner->GetTeamNumber(); // Start the appropriate particle effect const char *pszParticleEffect; if ( pOwner->GetWaterLevel() == WL_Eyes ) { pszParticleEffect = "flamethrower_underwater"; } else { if ( m_bCritFire ) { pszParticleEffect = ConstructTeamParticle( "flamethrower_crit_%s", iTeam, true ); } else { pszParticleEffect = iTeam == TF_TEAM_RED ? "flamethrower" : ConstructTeamParticle( "flamethrower_%s", pOwner->GetTeamNumber(), true ); } } // Start the effect on the viewmodel if our owner is the local player C_BaseEntity *pModel = GetWeaponForEffect(); if ( pModel ) { m_pFlameEffect = pModel->ParticleProp()->Create( pszParticleEffect, PATTACH_POINT_FOLLOW, "muzzle" ); m_hFlameEffectHost = pModel; } pOwner->m_Shared.SetParticleToMercColor( m_pFlameEffect ); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void TFExplosionCallback( const Vector &vecOrigin, const Vector &vecNormal, int iWeaponID, ClientEntityHandle_t hEntity, C_TFPlayer *pPlayer, int iTeam, bool bCrit, int iItemID ) { // Get the weapon information. CTFWeaponInfo *pWeaponInfo = NULL; switch ( iWeaponID ) { case TF_WEAPON_GRENADE_PIPEBOMB: case TF_WEAPON_GRENADE_DEMOMAN: pWeaponInfo = GetTFWeaponInfo( TF_WEAPON_PIPEBOMBLAUNCHER ); break; default: pWeaponInfo = GetTFWeaponInfo( iWeaponID ); break; } bool bIsPlayer = false; if ( hEntity.Get() ) { C_BaseEntity *pEntity = C_BaseEntity::Instance( hEntity ); if ( pEntity && pEntity->IsPlayer() ) { bIsPlayer = true; } } // Calculate the angles, given the normal. bool bIsWater = ( UTIL_PointContents( vecOrigin ) & CONTENTS_WATER ); bool bInAir = false; QAngle angExplosion( 0.0f, 0.0f, 0.0f ); // Cannot use zeros here because we are sending the normal at a smaller bit size. if ( fabs( vecNormal.x ) < 0.05f && fabs( vecNormal.y ) < 0.05f && fabs( vecNormal.z ) < 0.05f ) { bInAir = true; angExplosion.Init(); } else { VectorAngles( vecNormal, angExplosion ); bInAir = false; } bool bDeathmatchOverride = ( pPlayer && TFGameRules()->IsDeathmatch() ); // Base explosion effect and sound. const char *pszEffect = "explosion"; const char *pszSound = "BaseExplosionEffect.Sound"; if ( pWeaponInfo ) { // Explosions. if ( bIsWater ) { if ( bCrit && pWeaponInfo->m_szExplosionWaterEffect_Crit[0] ) { pszEffect = ConstructTeamParticle( pWeaponInfo->m_szExplosionWaterEffect_Crit, iTeam, bDeathmatchOverride ); } else if ( pWeaponInfo->m_szExplosionWaterEffect[0] ) { pszEffect = pWeaponInfo->m_szExplosionWaterEffect; } } else { if ( bIsPlayer || bInAir ) { if ( bCrit && pWeaponInfo->m_szExplosionPlayerEffect_Crit[0] ) { pszEffect = ConstructTeamParticle( pWeaponInfo->m_szExplosionPlayerEffect_Crit, iTeam, bDeathmatchOverride ); } else if ( pWeaponInfo->m_szExplosionPlayerEffect[0] ) { pszEffect = pWeaponInfo->m_szExplosionPlayerEffect; } } else { if ( bCrit && pWeaponInfo->m_szExplosionEffect_Crit[0] ) { pszEffect = ConstructTeamParticle( pWeaponInfo->m_szExplosionEffect_Crit, iTeam, bDeathmatchOverride ); } else if ( pWeaponInfo->m_szExplosionEffect[0] ) { pszEffect = pWeaponInfo->m_szExplosionEffect; } } } // Sound. if ( pWeaponInfo->m_szExplosionSound[0] != '\0' ) { pszSound = pWeaponInfo->m_szExplosionSound; } } // Allow schema to override explosion sound. if ( iItemID >= 0 ) { CEconItemDefinition *pItemDef = GetItemSchema()->GetItemDefinition( iItemID ); if ( pItemDef && pItemDef->GetVisuals()->aWeaponSounds[SPECIAL1][0] != '\0' ) { pszSound = pItemDef->GetVisuals()->aWeaponSounds[SPECIAL1]; } } CLocalPlayerFilter filter; C_BaseEntity::EmitSound( filter, SOUND_FROM_WORLD, pszSound, &vecOrigin ); if ( bDeathmatchOverride ) { DispatchParticleEffect( pszEffect, vecOrigin, angExplosion, pPlayer->m_vecPlayerColor, vec3_origin, true ); } else { DispatchParticleEffect( pszEffect, vecOrigin, angExplosion ); } }
//----------------------------------------------------------------------------- // Purpose: // Output : const char //----------------------------------------------------------------------------- const char *GetSyringeTrailParticleName( int iTeamNumber, bool bCritical ) { const char *pszFormat = bCritical ? "nailtrails_medic_%s_crit" : "nailtrails_medic_%s"; return ConstructTeamParticle( pszFormat, iTeamNumber, true ); }
//----------------------------------------------------------------------------- // Purpose: // Output : const char //----------------------------------------------------------------------------- const char *GetTranqDartTrailParticleName( int iTeamNumber, bool bCritical ) { const char *pszFormat = bCritical ? "nailtrails_medic_%s_crit" : "tranq_tracer_teamcolor_%s"; return ConstructTeamParticle( pszFormat, iTeamNumber, true ); }