diff options
Diffstat (limited to 'game/client/tf/tf_hud_arena_winpanel.cpp')
| -rw-r--r-- | game/client/tf/tf_hud_arena_winpanel.cpp | 659 |
1 files changed, 659 insertions, 0 deletions
diff --git a/game/client/tf/tf_hud_arena_winpanel.cpp b/game/client/tf/tf_hud_arena_winpanel.cpp new file mode 100644 index 0000000..a5710d5 --- /dev/null +++ b/game/client/tf/tf_hud_arena_winpanel.cpp @@ -0,0 +1,659 @@ + +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#include "cbase.h" +#include "tf_hud_arena_winpanel.h" +#include "tf_hud_statpanel.h" +#include "tf_spectatorgui.h" +#include "vgui_controls/AnimationController.h" +#include "iclientmode.h" +#include "engine/IEngineSound.h" +#include "c_tf_playerresource.h" +#include "c_tf_team.h" +#include "tf_clientscoreboard.h" +#include <vgui_controls/Label.h> +#include <vgui_controls/ImagePanel.h> +#include <vgui/ILocalize.h> +#include <vgui/ISurface.h> +#include "vgui_avatarimage.h" +#include "fmtstr.h" +#include "teamplayroundbased_gamerules.h" +#include "tf_gamerules.h" +#include "tf_hud_menu_taunt_selection.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +extern ConVar tf_arena_max_streak; +extern ConVar mp_bonusroundtime; + +extern const char *FormatSeconds( int seconds ); + +//----------------------------------------------------------------------------- +// Purpose: Constructor +//----------------------------------------------------------------------------- +CTFArenaWinPanel::CTFArenaWinPanel( IViewPort *pViewPort ) : EditablePanel( NULL, "ArenaWinPanel" ) +{ + SetAlpha( 0 ); + SetScheme( "ClientScheme" ); + + m_pTeamScorePanel = new EditablePanel( this, "ArenaWinPanelScores" ); + m_pWinnerPanel = new EditablePanel( this, "ArenaWinPanelWinnersPanel" ); + m_pLoserPanel = new EditablePanel( this, "ArenaWinPanelLosersPanel" ); + + m_flTimeUpdateTeamScore = 0; + m_flFlipScoresTimes = 0; + m_iBlueTeamScore = 0; + m_iRedTeamScore = 0; + + ListenForGameEvent( "arena_win_panel" ); + ListenForGameEvent( "teamplay_round_start" ); + ListenForGameEvent( "teamplay_game_over" ); + ListenForGameEvent( "tf_game_over" ); + + m_bShouldBeVisible = false; + + vgui::ivgui()->AddTickSignal( GetVPanel(), 50 ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFArenaWinPanel::ApplySettings( KeyValues *inResourceData ) +{ + BaseClass::ApplySettings( inResourceData ); +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFArenaWinPanel::Reset( void ) +{ + Update(); + m_bShouldBeVisible = false; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFArenaWinPanel::Update( void ) +{ +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFArenaWinPanel::SetVisible( bool state ) +{ + if ( state == IsVisible() ) + return; + + int iRenderGroup = gHUD.LookupRenderGroupIndexByName( "mid" ); + + if ( state ) + { + gHUD.LockRenderGroup( iRenderGroup ); + } + else + { + gHUD.UnlockRenderGroup( iRenderGroup ); + } + + BaseClass::SetVisible( state ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFArenaWinPanel::FireGameEvent( IGameEvent * event ) +{ + const char *pEventName = event->GetName(); + + if ( Q_strcmp( "teamplay_round_start", pEventName ) == 0 ) + { + m_bShouldBeVisible = false; + } + else if ( Q_strcmp( "teamplay_game_over", pEventName ) == 0 ) + { + m_bShouldBeVisible = false; + } + else if ( Q_strcmp( "tf_game_over", pEventName ) == 0 ) + { + m_bShouldBeVisible = false; + } + else if ( Q_strcmp( "arena_win_panel", pEventName ) == 0 ) + { + if ( !g_PR ) + return; + + m_vecPlayerScore.RemoveAll(); + + InvalidateLayout( false, true ); + + if ( TFGameRules() && TFGameRules()->IsInArenaMode() == true && tf_arena_max_streak.GetInt() > 0 && tf_arena_use_queue.GetBool() == true ) + { + m_pArenaStreakPanel->SetVisible( true ); + m_pArenaStreakLabel->SetVisible( true ); + + wchar_t wzStreaNum[16]; + wchar_t wzStreakString[256]=L""; + _snwprintf( wzStreaNum, ARRAYSIZE( wzStreaNum ), L"%i", tf_arena_max_streak.GetInt() ); + + g_pVGuiLocalize->ConstructString_safe( wzStreakString, g_pVGuiLocalize->Find( "#TF_Arena_PlayingTo" ), 1, wzStreaNum ); + + m_pTeamScorePanel->SetDialogVariable( "arenastreaktext", wzStreakString ); + } + else + { + m_pArenaStreakPanel->SetVisible( false ); + m_pArenaStreakLabel->SetVisible( false ); + } + + m_iWinningPlayerTeam = event->GetInt( "winning_team" ); + int iWinReason = event->GetInt( "winreason" ); + + SetDialogVariable( "WinningTeamLabel", "" ); + SetDialogVariable( "AdvancingTeamLabel", "" ); + SetDialogVariable( "WinReasonLabel", "" ); + SetDialogVariable( "DetailsLabel", "" ); + + vgui::ImagePanel *pImagePanelBG = dynamic_cast<vgui::ImagePanel *>( FindChildByName("WinPanelBG") ); + Assert( pImagePanelBG ); + if ( !pImagePanelBG ) + return; + + // set the appropriate background image and label text + const wchar_t *pTeamLabel = L""; + const wchar_t *pTopPlayersLabel = L""; + const wchar_t *pLocalizedTeamName = L""; + const wchar_t *pLocalizedLoserTeamName = L""; + + C_TFTeam *pBlueTeam = GetGlobalTFTeam( TF_TEAM_BLUE ); + const wchar_t *pBlueTeamName = pBlueTeam ? pBlueTeam->Get_Localized_Name() : L"BLU"; + + C_TFTeam *pRedTeam = GetGlobalTFTeam( TF_TEAM_RED ); + const wchar_t *pRedTeamName = pRedTeam ? pRedTeam->Get_Localized_Name() : L"RED"; + + switch ( m_iWinningPlayerTeam ) + { + case TF_TEAM_BLUE: + pImagePanelBG->SetImage( "../hud/winpanel_blue_bg_main.vmt" ); + pTopPlayersLabel = g_pVGuiLocalize->Find( "#Winpanel_BlueMVPs" ); + pLocalizedTeamName = pBlueTeamName; + pLocalizedLoserTeamName = pRedTeamName; + break; + case TF_TEAM_RED: + pImagePanelBG->SetImage( "../hud/winpanel_red_bg_main.vmt" ); + pTopPlayersLabel = g_pVGuiLocalize->Find( "#Winpanel_RedMVPs" ); + pLocalizedTeamName = pRedTeamName; + pLocalizedLoserTeamName = pBlueTeamName; + break; + case TEAM_UNASSIGNED: // stalemate + pImagePanelBG->SetImage( "../hud/winpanel_black_bg_main.vmt" ); + pTeamLabel = g_pVGuiLocalize->Find( "#Winpanel_Stalemate" ); + pTopPlayersLabel = g_pVGuiLocalize->Find( "#Winpanel_TopPlayers" ); + break; + default: + Assert( false ); + break; + } + + SetDialogVariable( "TopPlayersLabel", pTopPlayersLabel ); + + wchar_t wzTeamWin[256] = L""; + if ( TFGameRules() && TFGameRules()->IsInTournamentMode() ) + { + g_pVGuiLocalize->ConstructString_safe( wzTeamWin, g_pVGuiLocalize->Find( "#Winpanel_TournamentTeamWins" ), 1, pLocalizedTeamName ); + g_pVGuiLocalize->ConstructString_safe( m_wzTeamLose, g_pVGuiLocalize->Find( "#Winpanel_TournamentTeamLost" ), 2, pLocalizedLoserTeamName ); + + wchar_t wzTeamMPVs[256]; + g_pVGuiLocalize->ConstructString_safe( wzTeamMPVs, g_pVGuiLocalize->Find( "#Winpanel_TournamentMVPs" ), 1, pLocalizedTeamName ); + + if ( m_iWinningPlayerTeam != TEAM_UNASSIGNED ) + { + SetDialogVariable( "TopPlayersLabel", wzTeamMPVs ); + } + } + else if ( m_iWinningPlayerTeam != TEAM_UNASSIGNED ) + { + g_pVGuiLocalize->ConstructString_safe( wzTeamWin, g_pVGuiLocalize->Find( "#Winpanel_TeamWins" ), 2, pLocalizedTeamName, g_pVGuiLocalize->Find( "#Winpanel_Team1" ) ); + g_pVGuiLocalize->ConstructString_safe( m_wzTeamLose, g_pVGuiLocalize->Find( "#Winpanel_TeamLost" ), 2, pLocalizedLoserTeamName, g_pVGuiLocalize->Find( "#Winpanel_Team1" ) ); + } + + if ( m_iWinningPlayerTeam != TEAM_UNASSIGNED ) + { + pTeamLabel = wzTeamWin; + } + + SetDialogVariable( "WinningTeamLabel", pTeamLabel ); + SetDialogVariable( "LosingTeamLabel", "" ); + + wchar_t wzWinReason[256] = L""; + switch ( iWinReason ) + { + case WINREASON_ALL_POINTS_CAPTURED: + g_pVGuiLocalize->ConstructString_safe( wzWinReason, g_pVGuiLocalize->Find( "#Winreason_AllPointsCaptured" ), 1, pLocalizedTeamName ); + break; + case WINREASON_OPPONENTS_DEAD: + + if ( TFGameRules() && TFGameRules()->IsInArenaMode() == true ) + { + g_pVGuiLocalize->ConstructString_safe( wzWinReason, g_pVGuiLocalize->Find( "#Winreason_Arena" ), 1, pLocalizedTeamName ); + } + else + { + g_pVGuiLocalize->ConstructString_safe( wzWinReason, g_pVGuiLocalize->Find( "#Winreason_OpponentsDead" ), 1, pLocalizedTeamName ); + } + break; + + case WINREASON_STALEMATE: + if ( !TFGameRules() || !TFGameRules()->IsCompetitiveMode() ) + { + g_pVGuiLocalize->ConstructString_safe( wzWinReason, g_pVGuiLocalize->Find( "#Winreason_Stalemate" ), 0 ); + } + break; + + default: + Assert( false ); + break; + } + SetDialogVariable( "WinReasonLabel", wzWinReason ); + + m_bWasFlawlessVictory = IsFlawlessVictory(); + + if ( WINREASON_ALL_POINTS_CAPTURED == iWinReason ) + { + // if this was a full round that ended with point capture or flag capture, show the winning cappers + const char *pCappers = event->GetString( "cappers" ); + int iCappers = Q_strlen( pCappers ); + if ( iCappers > 0 ) + { + char szPlayerNames[256]=""; + wchar_t wzPlayerNames[256]=L""; + wchar_t wzCapMsg[512]=L""; + for ( int i = 0; i < iCappers; i++ ) + { + Q_strncat( szPlayerNames, g_PR->GetPlayerName( (int) pCappers[i] ), ARRAYSIZE( szPlayerNames ) ); + if ( i < iCappers - 1 ) + { + Q_strncat( szPlayerNames, ", ", ARRAYSIZE( szPlayerNames ) ); + } + } + g_pVGuiLocalize->ConvertANSIToUnicode( szPlayerNames, wzPlayerNames, sizeof( wzPlayerNames ) ); + g_pVGuiLocalize->ConstructString_safe( wzCapMsg, g_pVGuiLocalize->Find( "#Winpanel_WinningCapture" ), 1, wzPlayerNames ); + SetDialogVariable( "DetailsLabel", wzCapMsg ); + } + } + else if ( TFGameRules()->IsInArenaMode() == true && m_iWinningPlayerTeam != TEAM_UNASSIGNED ) + { + if ( m_bWasFlawlessVictory ) + { + SetDialogVariable( "DetailsLabel", g_pVGuiLocalize->Find( "#TF_Arena_FlawlessVictory" ) ); + } + } + + // get the current & previous team scores + int iBlueTeamPrevScore = event->GetInt( "blue_score_prev", 0 ); + int iRedTeamPrevScore = event->GetInt( "red_score_prev", 0 ); + m_iBlueTeamScore = event->GetInt( "blue_score", 0 ); + m_iRedTeamScore = event->GetInt( "red_score", 0 ); + + if ( m_pTeamScorePanel ) + { + m_pTeamScorePanel->SetDialogVariable( "blueteamname", pBlueTeamName ); + m_pTeamScorePanel->SetDialogVariable( "redteamname", pRedTeamName ); + + // set the previous team scores in scoreboard + m_pTeamScorePanel->SetDialogVariable( "blueteamscore", iBlueTeamPrevScore ); + m_pTeamScorePanel->SetDialogVariable( "redteamscore", iRedTeamPrevScore ); + + if ( ( m_iBlueTeamScore != iBlueTeamPrevScore ) || ( m_iRedTeamScore != iRedTeamPrevScore ) ) + { + // if the new scores are different, set ourselves to update the scoreboard to the new values after a short delay, so players + // see the scores tick up + m_flTimeUpdateTeamScore = gpGlobals->curtime + 3.5f; + } + + // only show team scores if round is complete + m_pTeamScorePanel->SetVisible( true ); + } + + if ( !g_TF_PR ) + return; + + int iPanelIndex = 0; + + // look for the top 6 players sent in the event + for ( int i = 1; i <= 6; i++ ) + { + iPanelIndex = (iPanelIndex % 3) + 1; + + EditablePanel *pParentPanel = NULL; + + if ( i <= 3 ) + { + pParentPanel = m_pWinnerPanel; + } + else + { + pParentPanel = m_pLoserPanel; + } + + vgui::Label *pPlayerName = dynamic_cast<Label *>( pParentPanel->FindChildByName( CFmtStr( "Player%dName", iPanelIndex ) ) ); + vgui::Label *pPlayerClass = dynamic_cast<Label *>( pParentPanel->FindChildByName( CFmtStr( "Player%dClass", iPanelIndex ) ) ); + vgui::Label *pPlayerDamage = dynamic_cast<Label *>( pParentPanel->FindChildByName( CFmtStr( "Player%dDamage", iPanelIndex ) ) ); + vgui::Label *pPlayerHealing = dynamic_cast<Label *>( pParentPanel->FindChildByName( CFmtStr( "Player%dHealing", iPanelIndex ) ) ); + vgui::Label *pPlayerLifetime = dynamic_cast<Label *>( pParentPanel->FindChildByName( CFmtStr( "Player%dLifetime", iPanelIndex ) ) ); + vgui::Label *pPlayerKills = dynamic_cast<Label *>( pParentPanel->FindChildByName( CFmtStr( "Player%dKills", iPanelIndex ) ) ); + CAvatarImagePanel *pPlayerAvatar = dynamic_cast<CAvatarImagePanel *>( pParentPanel->FindChildByName( CFmtStr( "Player%dAvatar", iPanelIndex) ) ); + + if ( !pPlayerName || !pPlayerClass || !pPlayerDamage || !pPlayerHealing || !pPlayerLifetime || !pPlayerKills || !pPlayerAvatar ) + continue; + + pPlayerName->SetText( "" ); + pPlayerClass->SetText( "" ); + pPlayerDamage->SetText( "" ); + pPlayerHealing->SetText( "" ); + pPlayerLifetime->SetText( "" ); + pPlayerKills->SetText( "" ); + pPlayerAvatar->SetPlayer( NULL ); + + char szPlayerIndexVal[64]="", szPlayerDamageVal[64]="", szPlayerHealingVal[64]="", szPlayerTimeAliveVal[64]="", szPlayerKillingBlowsVal[64]=""; + // get player index and round points from the event + Q_snprintf( szPlayerIndexVal, ARRAYSIZE( szPlayerIndexVal ), "player_%d", i ); + Q_snprintf( szPlayerDamageVal, ARRAYSIZE( szPlayerDamageVal ), "player_%d_damage", i ); + Q_snprintf( szPlayerHealingVal, ARRAYSIZE( szPlayerHealingVal ), "player_%d_healing", i ); + Q_snprintf( szPlayerTimeAliveVal, ARRAYSIZE( szPlayerTimeAliveVal ), "player_%d_lifetime", i ); + Q_snprintf( szPlayerKillingBlowsVal, ARRAYSIZE( szPlayerKillingBlowsVal ), "player_%d_kills", i ); + + int iPlayerIndex = event->GetInt( szPlayerIndexVal, 0 ); + + if ( iPlayerIndex == 0 ) + continue; + + if ( g_TF_PR->IsConnected( iPlayerIndex ) == false ) + continue; + + int iDamageDone = event->GetInt( szPlayerDamageVal, 0 ); + int iHealingDone = event->GetInt( szPlayerHealingVal, 0 ); + int iTimeAlive = event->GetInt( szPlayerTimeAliveVal, 0 ); + int iKillingBlows = event->GetInt( szPlayerKillingBlowsVal, 0 ); + + PlayerArenaRoundScore_t &playerRoundScore = m_vecPlayerScore[m_vecPlayerScore.AddToTail()]; + + playerRoundScore.iPlayerIndex = iPlayerIndex; + playerRoundScore.iTotalDamage = iDamageDone; + playerRoundScore.iTotalHealing = iHealingDone; + playerRoundScore.iTimeAlive = iTimeAlive; + playerRoundScore.iKillingBlows = iKillingBlows; + } + + m_bShouldBeVisible = true; + + SetupPlayerStats(); + + MoveToFront(); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +bool CTFArenaWinPanel::IsFlawlessVictory( void ) +{ + C_TFTeam *pTeam = GetGlobalTFTeam( m_iWinningPlayerTeam ); + bool bAllAlive = true; + + if ( pTeam && g_TF_PR ) + { + if ( pTeam->GetNumPlayers() == 1 ) + return false; + + if ( g_TF_PR->GetNumPlayersForTeam( m_iWinningPlayerTeam, true ) != pTeam->GetNumPlayers() ) + { + bAllAlive = false; + } + } + + return bAllAlive; +} + +//----------------------------------------------------------------------------- +// Purpose: Applies scheme settings +//----------------------------------------------------------------------------- +void CTFArenaWinPanel::SetupPlayerStats( void ) +{ + if ( !g_TF_PR ) + return; + + m_pWinnerPanel->SetVisible( true ); + m_pLoserPanel->SetVisible( false ); + + m_flFlipScoresTimes = gpGlobals->curtime + ( ( TFGameRules() ? TFGameRules()->GetBonusRoundTime() : 5.0f ) * 0.5f ); + + int iWinnersAdded = 1; + int iLosersAdded = 1; + + int iPlayerAdded = 0; + + EditablePanel *pParentPanel = m_pWinnerPanel; + + // look for the top 6 players sent in the event + for ( int i = 0; i < m_vecPlayerScore.Count(); i++ ) + { + bool bShow = true; + + int iPlayerIndex = m_vecPlayerScore[i].iPlayerIndex; + int iIndex = 0; + + if ( m_iWinningPlayerTeam != TEAM_UNASSIGNED ) + { + if ( m_iWinningPlayerTeam == g_TF_PR->GetTeam( iPlayerIndex ) ) + { + pParentPanel = m_pWinnerPanel; + iIndex = iWinnersAdded; + + iWinnersAdded++; + } + else + { + pParentPanel = m_pLoserPanel; + iIndex = iLosersAdded; + + iLosersAdded++; + } + } + else + { + if ( i >= ( m_vecPlayerScore.Count() * 0.5f ) && pParentPanel != m_pLoserPanel ) + { + iPlayerAdded = 0; + pParentPanel = m_pLoserPanel; + } + + iIndex = (iPlayerAdded + 1) % 4; + + iPlayerAdded++; + } + + + int iDamageDone = m_vecPlayerScore[i].iTotalDamage; + int iHealingDone = m_vecPlayerScore[i].iTotalHealing; + int iTimeAlive = m_vecPlayerScore[i].iTimeAlive; + int iKillingBlows = m_vecPlayerScore[i].iKillingBlows; + + CAvatarImagePanel *pPlayerAvatar = dynamic_cast<CAvatarImagePanel *>( pParentPanel->FindChildByName( CFmtStr( "Player%dAvatar", iIndex) ) ); + if ( pPlayerAvatar ) + { + pPlayerAvatar->SetShouldScaleImage( true ); + pPlayerAvatar->SetShouldDrawFriendIcon( false ); + + if ( bShow ) + { + CBasePlayer *pPlayer = UTIL_PlayerByIndex( iPlayerIndex ); + pPlayerAvatar->SetPlayer( pPlayer ); + } + + pPlayerAvatar->SetVisible( bShow ); + } + + vgui::Label *pPlayerName = dynamic_cast<Label *>( pParentPanel->FindChildByName( CFmtStr( "Player%dName", iIndex ) ) ); + vgui::Label *pPlayerClass = dynamic_cast<Label *>( pParentPanel->FindChildByName( CFmtStr( "Player%dClass", iIndex ) ) ); + vgui::Label *pPlayerDamage = dynamic_cast<Label *>( pParentPanel->FindChildByName( CFmtStr( "Player%dDamage", iIndex ) ) ); + vgui::Label *pPlayerHealing = dynamic_cast<Label *>( pParentPanel->FindChildByName( CFmtStr( "Player%dHealing", iIndex ) ) ); + vgui::Label *pPlayerLifetime = dynamic_cast<Label *>( pParentPanel->FindChildByName( CFmtStr( "Player%dLifetime", iIndex ) ) ); + vgui::Label *pPlayerKills = dynamic_cast<Label *>( pParentPanel->FindChildByName( CFmtStr( "Player%dKills", iIndex ) ) ); + + if ( !pPlayerName || !pPlayerClass || !pPlayerDamage || !pPlayerHealing || !pPlayerLifetime || !pPlayerKills ) + continue; + + if ( bShow ) + { + // set the player labels to team color + Color clr = g_TF_PR->GetTeamColor( g_TF_PR->GetTeam( iPlayerIndex ) ); + pPlayerName->SetFgColor( clr ); + pPlayerClass->SetFgColor( clr ); + pPlayerDamage->SetFgColor( clr ); + pPlayerHealing->SetFgColor( clr ); + pPlayerLifetime->SetFgColor( clr ); + pPlayerKills->SetFgColor( clr ); + + // set label contents + pPlayerName->SetText( g_TF_PR->GetPlayerName( iPlayerIndex ) ); + pPlayerClass->SetText( g_aPlayerClassNames[g_TF_PR->GetPlayerClass( iPlayerIndex )] ); + pPlayerDamage->SetText( CFmtStr( "%d", iDamageDone ) ); + pPlayerHealing->SetText( CFmtStr( "%d", iHealingDone ) ); + pPlayerLifetime->SetText( CFmtStr( "%s", FormatSeconds( iTimeAlive ) ) ); + pPlayerKills->SetText( CFmtStr( "%d", iKillingBlows ) ); + } + + // show or hide labels for this player position + pPlayerName->SetVisible( bShow ); + pPlayerClass->SetVisible( bShow ); + pPlayerDamage->SetVisible( bShow ); + pPlayerHealing->SetVisible( bShow ); + pPlayerLifetime->SetVisible( bShow ); + pPlayerKills->SetVisible( bShow ); + } +} + + +//----------------------------------------------------------------------------- +// Purpose: Applies scheme settings +//----------------------------------------------------------------------------- +void CTFArenaWinPanel::ApplySchemeSettings( vgui::IScheme *pScheme ) +{ + BaseClass::ApplySchemeSettings( pScheme ); + + LoadControlSettings( "resource/UI/HudArenaWinPanel.res" ); + + m_pArenaStreakPanel = m_pTeamScorePanel->FindChildByName( "ArenaStreaksBG" ); + m_pArenaStreakLabel = m_pTeamScorePanel->FindChildByName("ArenaStreakLabel" ); +} + +//----------------------------------------------------------------------------- +// Purpose: panel think method +//----------------------------------------------------------------------------- +void CTFArenaWinPanel::OnTick() +{ + // if we've scheduled ourselves to update the team scores, handle it now + if ( m_flTimeUpdateTeamScore > 0 && ( gpGlobals->curtime > m_flTimeUpdateTeamScore ) && m_pTeamScorePanel ) + { + // play a sound + CLocalPlayerFilter filter; + C_BaseEntity::EmitSound( filter, SOUND_FROM_LOCAL_PLAYER, "Hud.EndRoundScored" ); + + // update the team scores + m_pTeamScorePanel->SetDialogVariable( "blueteamscore", m_iBlueTeamScore ); + m_pTeamScorePanel->SetDialogVariable( "redteamscore", m_iRedTeamScore ); + m_flTimeUpdateTeamScore = 0; + } + + if ( m_flFlipScoresTimes > 0 && ( gpGlobals->curtime > m_flFlipScoresTimes ) ) + { + //flip the scores + m_pWinnerPanel->SetVisible( false ); + m_pLoserPanel->SetVisible( true ); + + m_flFlipScoresTimes = 0; + + if ( m_iWinningPlayerTeam != TEAM_UNASSIGNED ) + { + const wchar_t *pTopPlayersLabel = NULL; + + vgui::ImagePanel *pImagePanelBG = dynamic_cast<vgui::ImagePanel *>( FindChildByName("WinPanelBG") ); + + if ( pImagePanelBG == NULL ) + return; + + switch ( m_iWinningPlayerTeam ) + { + case TF_TEAM_BLUE: + pTopPlayersLabel = g_pVGuiLocalize->Find( "#Winpanel_RedMVPs" ); + pImagePanelBG->SetImage( "../hud/winpanel_red_bg_main.vmt" ); + break; + case TF_TEAM_RED: + pTopPlayersLabel = g_pVGuiLocalize->Find( "#Winpanel_BlueMVPs" ); + pImagePanelBG->SetImage( "../hud/winpanel_blue_bg_main.vmt" ); + break; + default: + Assert( false ); + break; + } + + SetDialogVariable( "TopPlayersLabel", pTopPlayersLabel ); + + SetDialogVariable( "LosingTeamLabel", m_wzTeamLose ); + SetDialogVariable( "WinningTeamLabel", "" ); + + + if ( m_bWasFlawlessVictory ) + { + CLocalPlayerFilter filter; + + if ( m_iWinningPlayerTeam == GetLocalPlayerTeam() ) + { + C_BaseEntity::EmitSound( filter, SOUND_FROM_LOCAL_PLAYER, "Announcer.AM_FlawlessVictoryRandom" ); + } + else if ( GetLocalPlayerTeam() == TEAM_SPECTATOR ) + { + C_BaseEntity::EmitSound( filter, SOUND_FROM_LOCAL_PLAYER, "Announcer.AM_FlawlessVictory01" ); + } + else + { + C_BaseEntity::EmitSound( filter, SOUND_FROM_LOCAL_PLAYER, "Announcer.AM_FlawlessDefeatRandom" ); + } + } + } + } + + if ( m_bShouldBeVisible == true ) + { + IViewPortPanel *scoreboard = gViewPortInterface->FindPanelByName( PANEL_SCOREBOARD ); + if ( ( scoreboard && scoreboard->IsVisible() ) || IsInFreezeCam() ) + { + SetVisible( false ); + return; + } + + CHudMenuTauntSelection *pMenuTauntSelection = ( CHudMenuTauntSelection * )GET_HUDELEMENT( CHudMenuTauntSelection ); + if ( pMenuTauntSelection && pMenuTauntSelection->IsVisible() ) + { + SetVisible( false ); + return; + } + + if ( TFGameRules() && TFGameRules()->State_Get() != GR_STATE_TEAM_WIN ) + { + m_bShouldBeVisible = false; + } + } + + SetVisible( m_bShouldBeVisible ); +} |