//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #include "cbase.h" #include "dodspectatorgui.h" #include "hud.h" #include "dod_shareddefs.h" #include #include #include #include "dod_gamerules.h" #include "c_team.h" #include "c_dod_team.h" #include "c_dod_player.h" #include "c_dod_playerresource.h" using namespace vgui; //----------------------------------------------------------------------------- // Purpose: Constructor //----------------------------------------------------------------------------- CDODSpectatorGUI::CDODSpectatorGUI(IViewPort *pViewPort) : CSpectatorGUI(pViewPort) { } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool CDODSpectatorGUI::NeedsUpdate( void ) { if ( !C_BasePlayer::GetLocalPlayer() ) return false; if( IsVisible() ) return true; //if ( DODGameRules()->IsGameUnderTimeLimit() && m_nLastTime != DODGameRules()->GetTimeLeft() ) // return true; if ( m_nLastSpecMode != C_BasePlayer::GetLocalPlayer()->GetObserverMode() ) return true; if ( m_nLastSpecTarget != C_BasePlayer::GetLocalPlayer()->GetObserverTarget() ) return true; return BaseClass::NeedsUpdate(); } Color CDODSpectatorGUI::GetClientColor(int index) { C_BasePlayer *player = ToBasePlayer( ClientEntityList().GetEnt( index) ); int team = player->GetTeamNumber(); Assert( team == TEAM_ALLIES || team == TEAM_AXIS || team == TEAM_SPECTATOR ); if ( GameResources() ) return GameResources()->GetTeamColor( team ); else return Color( 255, 255, 255, 255 ); } void CDODSpectatorGUI::Update() { BaseClass::Update(); C_BasePlayer *pLocalPlayer = C_BasePlayer::GetLocalPlayer(); if( pLocalPlayer ) { m_nLastSpecMode = pLocalPlayer->GetObserverMode(); m_nLastSpecTarget = pLocalPlayer->GetObserverTarget(); } UpdateTimer(); UpdateScores(); } void CDODSpectatorGUI::UpdateTimer( void ) { C_DODPlayer *pPlayer = C_DODPlayer::GetLocalDODPlayer(); if( !pPlayer || pPlayer->IsHLTV() ) { wchar_t wText[ 63 ]; int timer; timer = (int)( DODGameRules()->GetTimeLeft() ); if ( timer < 0 ) timer = 0; _snwprintf ( wText, sizeof(wText)/sizeof(wchar_t), L"%d:%02d", (timer / 60), (timer % 60) ); wText[62] = 0; SetDialogVariable( "timer", wText ); SetDialogVariable( "reinforcements", wText ); } else if( pPlayer->GetTeamNumber() == TEAM_SPECTATOR ) { SetDialogVariable( "timer", L"" ); SetDialogVariable( "reinforcements", L"" ); } else { SetDialogVariable( "timer", L"" ); // we need to know how much longer we are going to be in death cam // once we know that, we can ask dodgamerules if we are going to make the next // wave. If we aren't, gamerules can tell us the new time based on the reserve wave float flSpawnEligibleTime; if ( pPlayer->GetObserverMode() == OBS_MODE_DEATHCAM ) { flSpawnEligibleTime = pPlayer->GetDeathTime() + DEATH_CAM_TIME; } else flSpawnEligibleTime = 0; //will never return negative seconds int timer = DODGameRules()->GetReinforcementTimerSeconds( pPlayer->GetTeamNumber(), flSpawnEligibleTime ); if( timer < 0 || ( pPlayer->GetObserverMode() == OBS_MODE_DEATHCAM ) ) { SetDialogVariable( "reinforcements", L"" ); } else { char szMins[4], szSecs[4]; int mins = timer / 60; int secs = timer % 60; Q_snprintf( szMins, sizeof(szMins), "%d", mins ); Q_snprintf( szSecs, sizeof(szSecs), "%d", secs ); wchar_t wMins[4], wSecs[4]; g_pVGuiLocalize->ConvertANSIToUnicode(szMins, wMins, sizeof(wMins)); g_pVGuiLocalize->ConvertANSIToUnicode(szSecs, wSecs, sizeof(wSecs)); wchar_t wLabel[128]; if ( mins == 1 ) //"1 minute" { g_pVGuiLocalize->ConstructString( wLabel, sizeof( wLabel ), g_pVGuiLocalize->Find("#Dod_Reinforcements_in_min" ), 2, wMins, wSecs ); } else if ( mins > 0 ) //"2 minutes" { g_pVGuiLocalize->ConstructString( wLabel, sizeof( wLabel ), g_pVGuiLocalize->Find("#Dod_Reinforcements_in_mins" ), 2, wMins, wSecs ); } else if ( secs == 1 ) //"1 second" { g_pVGuiLocalize->ConstructString( wLabel, sizeof( wLabel ), g_pVGuiLocalize->Find("#Dod_Reinforcements_in_sec" ), 1, wSecs ); } else if ( secs == 0 ) //"Prepare to Respawn" { g_pVGuiLocalize->ConstructString( wLabel, sizeof( wLabel ), g_pVGuiLocalize->Find("#Dod_Reinforcements_prepare_to_respawn" ), 0 ); } else //"2 seconds" { g_pVGuiLocalize->ConstructString( wLabel, sizeof( wLabel ), g_pVGuiLocalize->Find("#Dod_Reinforcements_in_secs" ), 1, wSecs ); } SetDialogVariable( "reinforcements", wLabel ); } } } void CDODSpectatorGUI::UpdateScores( void ) { C_DODTeam *pAlliesTeam = static_cast( GetGlobalTeam(TEAM_ALLIES) ); if ( pAlliesTeam ) { SetDialogVariable( "alliesscore", pAlliesTeam->GetRoundsWon() ); } C_DODTeam *pAxisTeam = static_cast( GetGlobalTeam(TEAM_AXIS) ); if ( pAxisTeam ) { SetDialogVariable( "axisscore", pAxisTeam->GetRoundsWon() ); } } bool CDODSpectatorGUI::ShouldShowPlayerLabel( int specmode ) { return ( (specmode == OBS_MODE_IN_EYE) || (specmode == OBS_MODE_CHASE) || (specmode == OBS_MODE_DEATHCAM) ); }