Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
3.7 KiB

5 years ago
#include "cbase.h"
#include "tf_leaderboardpanel.h"
#include "econ_controls.h"
#include "tf_asyncpanel.h"
#include "tf_mapinfo.h"
#include "vgui_avatarimage.h"
#include "tf_item_inventory.h"
CTFLeaderboardPanel::CTFLeaderboardPanel( Panel *pParent, const char *pszPanelName )
: CBaseASyncPanel( pParent, pszPanelName )
{}
//-----------------------------------------------------------------------------
// Purpose: Create leaderboard panels
//-----------------------------------------------------------------------------
void CTFLeaderboardPanel::ApplySchemeSettings( vgui::IScheme *pScheme )
{
BaseClass::ApplySchemeSettings( pScheme );
LoadControlSettings( "Resource/UI/econ/LeaderboardPanel.res" );
}
void CTFLeaderboardPanel::ApplySettings( KeyValues *inResourceData )
{
BaseClass::ApplySettings( inResourceData );
IScheme *pScheme = vgui::scheme()->GetIScheme( GetScheme() );
m_EvenTextColor = GetSchemeColor( inResourceData->GetString( "EvenTextColor" ), pScheme);
m_OddTextColor = GetSchemeColor( inResourceData->GetString( "OddTextColor" ), pScheme);
m_LocalPlayerTextColor = GetSchemeColor( inResourceData->GetString( "LocalPlayerTextColor" ), pScheme);
EditablePanel *pScoresContainer = dynamic_cast< EditablePanel* >( FindChildByName( "ScoresContainer", true ) );
if ( pScoresContainer )
{
m_vecLeaderboardEntries.Purge();
for ( int i = 0; i < 7; ++ i )
{
vgui::EditablePanel *pEntryUI = new vgui::EditablePanel( pScoresContainer, "LeaderboardEntry" );
pEntryUI->ApplySchemeSettings( pScheme );
pEntryUI->LoadControlSettings( "Resource/UI/LeaderboardSpreadEntry.res" );
m_vecLeaderboardEntries.AddToTail( pEntryUI );
}
}
}
//-----------------------------------------------------------------------------
// Purpose: Check for leaderboard data
//-----------------------------------------------------------------------------
bool CTFLeaderboardPanel::CheckForData_Internal()
{
return UpdateLeaderboards();
}
//-----------------------------------------------------------------------------
// Purpose: Checks if we have friends leaderboard data downloaded. If so, sets
// the data into the panels
//-----------------------------------------------------------------------------
bool CTFLeaderboardPanel::UpdateLeaderboards()
{
CUtlVector< LeaderboardEntry_t* > scores;
if ( !GetLeaderboardData( scores ) )
return false;
int x=0,y=0;
FOR_EACH_VEC( m_vecLeaderboardEntries, i )
{
Color colorToUse = i % 2 == 1 ? m_OddTextColor : m_EvenTextColor;
EditablePanel *pContainer = dynamic_cast< EditablePanel* >( m_vecLeaderboardEntries[i] );
if ( pContainer )
{
bool bIsEntryVisible = i < scores.Count();
pContainer->SetVisible( bIsEntryVisible );
pContainer->SetPos( x, y );
y += m_yEntryStep;
if ( bIsEntryVisible )
{
const LeaderboardEntry_t* leaderboardEntry = scores[i];
const CSteamID &steamID = leaderboardEntry->m_steamIDUser;
bool bIsLocalPlayer = steamapicontext && steamapicontext->SteamUser() && steamapicontext->SteamUser()->GetSteamID() == steamID;
pContainer->SetDialogVariable( "rank", leaderboardEntry->m_nGlobalRank );
pContainer->SetDialogVariable( "username", InventoryManager()->PersonaName_Get( steamID.GetAccountID() ) );
pContainer->SetDialogVariable( "score", leaderboardEntry->m_nScore );
CExLabel *pText = dynamic_cast< CExLabel* >( pContainer->FindChildByName( "UserName" ) );
if ( pText )
{
pText->SetColorStr( bIsLocalPlayer ? m_LocalPlayerTextColor : colorToUse );
}
CAvatarImagePanel *pAvatar = dynamic_cast< CAvatarImagePanel* >( pContainer->FindChildByName( "AvatarImage" ) );
if ( pAvatar )
{
pAvatar->SetShouldDrawFriendIcon( false );
pAvatar->SetPlayer( steamID, k_EAvatarSize32x32 );
}
}
}
}
return true;
}