//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTeamRoundTimer::InputRoundSpawn( inputdata_t &input ) { if ( !m_bResetTimeOnRoundStart && ( m_nState == RT_STATE_NORMAL ) ) { m_nTimeToUseAfterSetupFinished = GetTimeRemaining(); } else { m_nTimeToUseAfterSetupFinished = m_nTimerInitialLength; } if ( m_nSetupTimeLength > 0 ) { SetTimeRemaining( m_nSetupTimeLength ); SetState( RT_STATE_SETUP ); if ( ShowInHud() && !TeamplayRoundBasedRules()->IsInWaitingForPlayers() ) { UTIL_LogPrintf( "World triggered \"Round_Setup_Begin\"\n" ); } } else { SetTimeRemaining( m_nTimeToUseAfterSetupFinished ); SetState( RT_STATE_NORMAL ); } if ( !m_bStartPaused && !TeamplayRoundBasedRules()->IsInWaitingForPlayers() ) { ResumeTimer(); } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTeamRoundTimer::CalculateOutputMessages( void ) { float flTime = GetTimeRemaining(); #ifndef GAME_DLL // We need to add a couple seconds to the time remaining because we've probably lost ~0.5 seconds from the timer while // waiting for the update to arrive from the server and we don't want to miss any critical countdown messages. If the time // remaining is over 10 seconds...adding 2 seconds to the total when calculating our output messages won't affect anything if ( flTime > 10.0f ) { flTime += 2.0f; } #endif m_bFireFinished = ( flTime > 0.0f ); m_bFire5MinRemain = ( flTime >= 300.0f ); m_bFire4MinRemain = ( flTime >= 240.0f ); m_bFire3MinRemain = ( flTime >= 180.0f ); m_bFire2MinRemain = ( flTime >= 120.0f ); m_bFire1MinRemain = ( flTime >= 60.0f ); m_bFire30SecRemain = ( flTime >= 30.0f ); m_bFire10SecRemain = ( flTime >= 10.0f ); m_bFire5SecRemain = ( flTime >= 5.0f ); m_bFire4SecRemain = ( flTime >= 4.0f ); m_bFire3SecRemain = ( flTime >= 3.0f ); m_bFire2SecRemain = ( flTime >= 2.0f ); m_bFire1SecRemain = ( flTime >= 1.0f ); }
//----------------------------------------------------------------------------- // Purpose: Timer is paused at round end, stops the countdown //----------------------------------------------------------------------------- void CGEGameTimer::Pause() { if ( IsStarted() && !IsPaused() ) { // Store our pause time remaining to our currently remaining time m_flPauseTimeRemaining = GetTimeRemaining(); m_bPaused = true; } }
//----------------------------------------------------------------------------- // Purpose: To start or re-start the timer after a pause //----------------------------------------------------------------------------- void CGEGameTimer::Resume() { if ( IsStarted() && IsPaused() ) { // Set our new end time to our Resume Time plus our Remaining Time m_flEndTime = gpGlobals->curtime + GetTimeRemaining(); m_flPauseTimeRemaining = 0; m_bPaused = false; } }
double SoundD3D::GetTimeElapsed() const { double time_elapsed = 0; if (IsPlaying()) { time_elapsed = total_time - GetTimeRemaining(); } return time_elapsed; }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTeamRoundTimer::ClientThink() { if ( IsDisabled() || m_bTimerPaused || IsInCommentaryMode() ) return; if ( IsStopWatchTimer() == true && IsWatchingTimeStamps() == true ) return; float flTime = GetTimeRemaining(); if ( flTime <= 61.0 && m_bFire1MinRemain ) { m_bFire1MinRemain = false; SendTimeWarning( RT_WARNING_60SECS ); } else if ( flTime <= 31.0 && m_bFire30SecRemain ) { m_bFire30SecRemain = false; SendTimeWarning( RT_WARNING_30SECS ); } else if ( flTime <= 11.0 && m_bFire10SecRemain ) { m_bFire10SecRemain = false; SendTimeWarning( RT_WARNING_10SECS ); } else if ( flTime <= 6.0 && m_bFire5SecRemain ) { m_bFire5SecRemain = false; SendTimeWarning( RT_WARNING_5SECS ); } else if ( flTime <= 5.0 && m_bFire4SecRemain ) { m_bFire4SecRemain = false; SendTimeWarning( RT_WARNING_4SECS ); } else if ( flTime <= 4.0 && m_bFire3SecRemain ) { m_bFire3SecRemain = false; SendTimeWarning( RT_WARNING_3SECS ); } else if ( flTime <= 3.0 && m_bFire2SecRemain ) { m_bFire2SecRemain = false; SendTimeWarning( RT_WARNING_2SECS ); } else if ( flTime <= 2.0 && m_bFire1SecRemain ) { m_bFire1SecRemain = false; SendTimeWarning( RT_WARNING_1SECS ); } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTeamRoundTimer::InputSetMaxTime( inputdata_t &input ) { int nSeconds = input.value.Int(); m_nTimerMaxLength = nSeconds; if ( m_nTimerMaxLength > 0 ) { // make sure our current time is not above the max length if ( GetTimeRemaining() > m_nTimerMaxLength ) { SetTimeRemaining( m_nTimerMaxLength ); } } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTeamRoundTimer::RoundTimerThink( void ) { if ( TeamplayRoundBasedRules()->IsInPreMatch() == true && IsDisabled() == false ) { inputdata_t data; InputDisable( data ); } if ( IsDisabled() || m_bTimerPaused || IsInCommentaryMode() || gpGlobals->eLoadType == MapLoad_Background ) { SetContextThink( &CTeamRoundTimer::RoundTimerThink, gpGlobals->curtime + 0.05, ROUND_TIMER_THINK ); return; } // Don't do anything when the game has been won or if we're loading a bugbait report if ( TeamplayRoundBasedRules()->RoundHasBeenWon() || TeamplayRoundBasedRules()->IsLoadingBugBaitReport() ) { // We want to stop timers when the round has been won, but we don't want to // force mapmakers to deal with having to unpause it. This little hack works around that. if ( !m_bTimerPaused ) { PauseTimer(); m_bPauseDueToWin = true; } SetContextThink( &CTeamRoundTimer::RoundTimerThink, gpGlobals->curtime + 0.05, ROUND_TIMER_THINK ); return; } else if ( m_bPauseDueToWin ) { ResumeTimer(); m_bPauseDueToWin = false; } float flTime = GetTimeRemaining(); if ( flTime > 0 && ShowInHud() ) // is this the timer we're showing in the HUD? { TeamplayRoundBasedRules()->SetOvertime( false ); } if ( flTime <= 0.0f && m_bFireFinished ) { // Allow the gamerules to prevent timer expiration (i.e. while a control point is contested) if ( !TeamplayGameRules()->TimerMayExpire() ) { // we don't want the timer to keep going (negative time) m_flTimerEndTime = gpGlobals->curtime; // is this the timer we're showing in the HUD? if ( ShowInHud() ) { TeamplayRoundBasedRules()->SetOvertime( true ); } // Think slower SetContextThink( &CTeamRoundTimer::RoundTimerThink, gpGlobals->curtime + 1.0, ROUND_TIMER_THINK ); return; } m_OnFinished.FireOutput( this, this ); m_bFireFinished = false; } else if ( flTime <= 300.0 && m_bFire5MinRemain ) { m_On5MinRemain.FireOutput( this, this ); m_bFire5MinRemain = false; } else if ( flTime <= 240.0 && m_bFire4MinRemain ) { m_On4MinRemain.FireOutput( this, this ); m_bFire4MinRemain = false; } else if ( flTime <= 180.0 && m_bFire3MinRemain ) { m_On3MinRemain.FireOutput( this, this ); m_bFire3MinRemain = false; } else if ( flTime <= 120.0 && m_bFire2MinRemain ) { m_On2MinRemain.FireOutput( this, this ); m_bFire2MinRemain = false; } else if ( flTime <= 60.0 && m_bFire1MinRemain ) { m_On1MinRemain.FireOutput( this, this ); m_bFire1MinRemain = false; } else if ( flTime <= 30.0 && m_bFire30SecRemain ) { m_On30SecRemain.FireOutput( this, this ); m_bFire30SecRemain = false; } else if ( flTime <= 10.0 && m_bFire10SecRemain ) { m_On10SecRemain.FireOutput( this, this ); m_bFire10SecRemain = false; } else if ( flTime <= 5.0 && m_bFire5SecRemain ) { m_On5SecRemain.FireOutput( this, this ); m_bFire5SecRemain = false; } else if ( flTime <= 4.0 && m_bFire4SecRemain ) { m_On4SecRemain.FireOutput( this, this ); m_bFire4SecRemain = false; } else if ( flTime <= 3.0 && m_bFire3SecRemain ) { m_On3SecRemain.FireOutput( this, this ); m_bFire3SecRemain = false; } else if ( flTime <= 2.0 && m_bFire2SecRemain ) { m_On2SecRemain.FireOutput( this, this ); m_bFire2SecRemain = false; } else if ( flTime <= 1.0 && m_bFire1SecRemain ) { m_On1SecRemain.FireOutput( this, this ); m_bFire1SecRemain = false; } SetContextThink( &CTeamRoundTimer::RoundTimerThink, gpGlobals->curtime + 0.05, ROUND_TIMER_THINK ); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTeamRoundTimer::RoundTimerSetupThink( void ) { if ( TeamplayRoundBasedRules()->IsInPreMatch() == true && IsDisabled() == false ) { inputdata_t data; InputDisable( data ); m_OnSetupFinished.FireOutput( this, this ); } if ( IsDisabled() || m_bTimerPaused ) { SetContextThink( &CTeamRoundTimer::RoundTimerSetupThink, gpGlobals->curtime + 0.05, ROUND_TIMER_SETUP_THINK ); return; } float flTime = GetTimeRemaining(); TeamplayRoundBasedRules()->SetOvertime( false ); if ( flTime <= 0.0f && m_bFireFinished ) { IGameEvent *event = gameeventmanager->CreateEvent( "teamplay_setup_finished" ); if ( event ) { gameeventmanager->FireEvent( event ); } m_OnSetupFinished.FireOutput( this, this ); m_bFireFinished = false; SetTimeRemaining( m_nTimeToUseAfterSetupFinished ); SetState( RT_STATE_NORMAL ); if ( ShowInHud() && !TeamplayRoundBasedRules()->IsInWaitingForPlayers() ) { UTIL_LogPrintf( "World triggered \"Round_Setup_End\"\n" ); } return; } else if ( flTime <= 60.0 && m_bFire1MinRemain ) { m_On1MinRemain.FireOutput( this, this ); m_bFire1MinRemain = false; } else if ( flTime <= 30.0 && m_bFire30SecRemain ) { m_On30SecRemain.FireOutput( this, this ); m_bFire30SecRemain = false; } else if ( flTime <= 10.0 && m_bFire10SecRemain ) { m_On10SecRemain.FireOutput( this, this ); m_bFire10SecRemain = false; } else if ( flTime <= 5.0 && m_bFire5SecRemain ) { m_On5SecRemain.FireOutput( this, this ); m_bFire5SecRemain = false; } else if ( flTime <= 4.0 && m_bFire4SecRemain ) { m_On4SecRemain.FireOutput( this, this ); m_bFire4SecRemain = false; } else if ( flTime <= 3.0 && m_bFire3SecRemain ) { m_On3SecRemain.FireOutput( this, this ); m_bFire3SecRemain = false; } else if ( flTime <= 2.0 && m_bFire2SecRemain ) { m_On2SecRemain.FireOutput( this, this ); m_bFire2SecRemain = false; } else if ( flTime <= 1.0 && m_bFire1SecRemain ) { m_On1SecRemain.FireOutput( this, this ); m_bFire1SecRemain = false; } SetContextThink( &CTeamRoundTimer::RoundTimerSetupThink, gpGlobals->curtime + 0.05, ROUND_TIMER_SETUP_THINK ); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTeamRoundTimer::SendTimeWarning( int nWarning ) { // don't play sounds if the level designer has turned them off or if it's during the WaitingForPlayers time if ( !m_bTimerPaused && m_bAutoCountdown && !TeamplayRoundBasedRules()->IsInWaitingForPlayers() ) { C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer(); if ( pPlayer ) { if ( ObjectiveResource() ) { bool bShouldPlaySound = false; if ( TeamplayRoundBasedRules()->IsInTournamentMode() == true && TeamplayRoundBasedRules()->IsInStopWatch() == true ) { int iActiveTimer = ObjectiveResource()->GetTimerToShowInHUD(); int iStopWatchTimer = ObjectiveResource()->GetStopWatchTimer(); if ( IsStopWatchTimer() == true && IsWatchingTimeStamps() == false ) { CTeamRoundTimer *pTimer = dynamic_cast< CTeamRoundTimer* >( ClientEntityList().GetEnt( iActiveTimer ) ); if ( pTimer && pTimer->IsTimerPaused() == false && pTimer->GetTimeRemaining() > GetTimeRemaining() ) { bShouldPlaySound = true; } } else { CTeamRoundTimer *pStopWatch = dynamic_cast< CTeamRoundTimer* >( ClientEntityList().GetEnt( iStopWatchTimer ) ); if ( ObjectiveResource()->GetTimerToShowInHUD() == entindex() ) { if ( pStopWatch ) { if ( pStopWatch->IsTimerPaused() == true ) { bShouldPlaySound = true; } if ( pStopWatch->GetTimeRemaining() > GetTimeRemaining() && pStopWatch->IsWatchingTimeStamps() == false ) { bShouldPlaySound = true; } if ( pStopWatch->IsWatchingTimeStamps() == true ) { bShouldPlaySound = true; } } else { bShouldPlaySound = true; } } } } else { if( ObjectiveResource()->GetTimerToShowInHUD() == entindex()) { bShouldPlaySound = true; } } if ( bShouldPlaySound == true ) { pPlayer->EmitSound( GetTimeWarningSound( nWarning ) ); } } } } }
//----------------------------------------------------------------------------- // Purpose: Add seconds to the timer while it is running or paused //----------------------------------------------------------------------------- void CTeamRoundTimer::AddTimerSeconds( int iSecondsToAdd, int iTeamResponsible /* = TEAM_UNASSIGNED*/ ) { if ( IsDisabled() ) return; if ( TeamplayRoundBasedRules()->InStalemate() ) return; // we only want to add time if we're round_running or team_win so the control points // don't add time when they try to set their default owner when the map is first loading if ( TeamplayRoundBasedRules()->State_Get() != GR_STATE_RND_RUNNING && TeamplayRoundBasedRules()->State_Get() != GR_STATE_TEAM_WIN ) return; if ( m_nTimerMaxLength > 0 ) { // will adding this many seconds push us over our max length? if ( GetTimeRemaining() + iSecondsToAdd > m_nTimerMaxLength ) { // adjust to only add up to our max length iSecondsToAdd = m_nTimerMaxLength - GetTimeRemaining(); } } if ( m_bTimerPaused ) { m_flTimeRemaining += (float)iSecondsToAdd; } else { m_flTimerEndTime += (float)iSecondsToAdd; } m_nTimerLength += iSecondsToAdd; CalculateOutputMessages(); if ( ObjectiveResource() && ObjectiveResource()->GetTimerInHUD() == entindex() ) { if ( !TeamplayRoundBasedRules()->InStalemate() && !TeamplayRoundBasedRules()->RoundHasBeenWon() ) { if ( iTeamResponsible >= LAST_SHARED_TEAM+1 ) { for ( int iTeam = LAST_SHARED_TEAM+1 ; iTeam < GetNumberOfTeams(); iTeam++ ) { if ( iTeam == iTeamResponsible ) { CTeamRecipientFilter filter( iTeam, true ); EmitSound( filter, entindex(), ROUND_TIMER_TIME_ADDED_WINNER ); } else { CTeamRecipientFilter filter( iTeam, true ); EmitSound( filter, entindex(), ROUND_TIMER_TIME_ADDED_LOSER ); } } } else { CReliableBroadcastRecipientFilter filter; EmitSound( filter, entindex(), ROUND_TIMER_TIME_ADDED ); } } // is this the timer we're showing in the HUD? if ( m_bShowInHUD ) { IGameEvent *event = gameeventmanager->CreateEvent( "teamplay_timer_time_added" ); if ( event ) { event->SetInt( "timer", entindex() ); event->SetInt( "seconds_added", iSecondsToAdd ); gameeventmanager->FireEvent( event ); } } } }
CString CDownload::GetDownloadStatus() const { CString strText; if ( m_bClearing ) // Briefly marked for removal { LoadString( strText, IDS_STATUS_CLEARING ); } else if ( IsPaused() ) { if ( GetFileError() == ERROR_SUCCESS || IsSeeding() ) LoadString( strText, IDS_STATUS_PAUSED ); else LoadString( strText, IsMoving() ? IDS_STATUS_CANTMOVE : IDS_STATUS_FILEERROR ); } else if ( IsCompleted() ) { if ( IsSeeding() ) LoadString( strText, m_bTorrentTrackerError ? IDS_STATUS_TRACKERDOWN : IDS_STATUS_SEEDING ); else LoadString( strText, IDS_STATUS_COMPLETED ); } else if ( IsMoving() ) { LoadString( strText, IDS_STATUS_MOVING ); } else if ( IsStarted() && GetProgress() == 100.0f ) { LoadString( strText, IDS_STATUS_VERIFYING ); } else if ( ! IsTrying() ) { LoadString( strText, IDS_STATUS_QUEUED ); } else if ( IsDownloading() ) { const DWORD nTime = GetTimeRemaining(); if ( nTime == 0xFFFFFFFF ) LoadString( strText, IDS_STATUS_ACTIVE ); // IDS_STATUS_DOWNLOADING else if ( nTime == 0 ) LoadString( strText, IDS_STATUS_DOWNLOADING ); else if ( nTime > 86400 ) strText.Format( L"%u:%.2u:%.2u:%.2u", nTime / 86400, ( nTime / 3600 ) % 24, ( nTime / 60 ) % 60, nTime % 60 ); else strText.Format( L"%u:%.2u:%.2u", nTime / 3600, ( nTime / 60 ) % 60, nTime % 60 ); } else if ( GetEffectiveSourceCount() > 0 ) { LoadString( strText, IDS_STATUS_PENDING ); } else if ( IsTorrent() ) { if ( GetTaskType() == dtaskAllocate ) LoadString( strText, IDS_STATUS_CREATING ); else if ( m_bTorrentTrackerError ) LoadString( strText, IDS_STATUS_TRACKERDOWN ); else LoadString( strText, IDS_STATUS_TORRENT ); } else // Inactive { LoadString( strText, IDS_STATUS_QUEUED ); } return strText; }