//----------------------------------------------------------------------------- // Purpose: Burn charge level to generate invulnerability //----------------------------------------------------------------------------- void CWeaponMedigun::SecondaryAttack( void ) { CTFPlayer *pOwner = ToTFPlayer( GetOwnerEntity() ); if ( !pOwner ) return; if ( !CanAttack() ) return; // Ensure they have a full charge and are not already in charge release mode if ( m_flChargeLevel < 1.0 || m_bChargeRelease ) { #ifdef CLIENT_DLL // Deny, flash if ( !m_bChargeRelease && m_flFlashCharge <= 0 ) { m_flFlashCharge = 10; pOwner->EmitSound( "Player.DenyWeaponSelection" ); } #endif return; } if ( pOwner->HasTheFlag() ) { #ifdef GAME_DLL CSingleUserRecipientFilter filter( pOwner ); TFGameRules()->SendHudNotification( filter, HUD_NOTIFY_NO_INVULN_WITH_FLAG ); #endif pOwner->EmitSound( "Player.DenyWeaponSelection" ); return; } // Start super charge m_bChargeRelease = true; m_flReleaseStartedAt = 0;//gpGlobals->curtime; #ifdef GAME_DLL CTF_GameStats.Event_PlayerInvulnerable( pOwner ); pOwner->m_Shared.RecalculateChargeEffects(); pOwner->SpeakConceptIfAllowed( MP_CONCEPT_MEDIC_CHARGEDEPLOYED ); if ( m_hHealingTarget && m_hHealingTarget->IsPlayer() ) { CTFPlayer *pTFPlayer = ToTFPlayer( m_hHealingTarget ); pTFPlayer->m_Shared.RecalculateChargeEffects(); pTFPlayer->SpeakConceptIfAllowed( MP_CONCEPT_HEALTARGET_CHARGEDEPLOYED ); } IGameEvent * event = gameeventmanager->CreateEvent( "player_chargedeployed" ); if ( event ) { event->SetInt( "userid", pOwner->GetUserID() ); gameeventmanager->FireEvent( event, true ); // don't send to clients } #endif }
//---------------------------------------------------------------------------------------- // Purpose: moves the player //---------------------------------------------------------------------------------------- void CTFGameMovement::PlayerMove() { // call base class to do movement BaseClass::PlayerMove(); // handle player's interaction with water int nNewWaterLevel = m_pTFPlayer->GetWaterLevel(); if ( m_nOldWaterLevel != nNewWaterLevel ) { if ( WL_NotInWater == m_nOldWaterLevel ) { // The player has just entered the water. Determine if we should play a splash sound. bool bPlaySplash = false; Vector vecVelocity = m_pTFPlayer->GetAbsVelocity(); if ( vecVelocity.z <= -200.0f ) { // If the player has significant downward velocity, play a splash regardless of water depth. (e.g. Jumping hard into a puddle) bPlaySplash = true; } else { // Look at the water depth below the player. If it's significantly deep, play a splash to accompany the sinking that's about to happen. Vector vecStart = m_pTFPlayer->GetAbsOrigin(); Vector vecEnd = vecStart; vecEnd.z -= 20; // roughly thigh deep trace_t tr; // see if we hit anything solid a little bit below the player UTIL_TraceLine( vecStart, vecEnd, MASK_SOLID,m_pTFPlayer, COLLISION_GROUP_NONE, &tr ); if ( tr.fraction >= 1.0f ) { // some amount of water below the player, play a splash bPlaySplash = true; } } if ( bPlaySplash ) { m_pTFPlayer->EmitSound( "Physics.WaterSplash" ); } } } }