summaryrefslogtreecommitdiff
path: root/game/client/tf/tf_hud_arena_winpanel.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/tf/tf_hud_arena_winpanel.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/client/tf/tf_hud_arena_winpanel.cpp')
-rw-r--r--game/client/tf/tf_hud_arena_winpanel.cpp659
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 );
+}