diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/shared/tf/tf_duckleaderboard.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/shared/tf/tf_duckleaderboard.cpp')
| -rw-r--r-- | game/shared/tf/tf_duckleaderboard.cpp | 343 |
1 files changed, 343 insertions, 0 deletions
diff --git a/game/shared/tf/tf_duckleaderboard.cpp b/game/shared/tf/tf_duckleaderboard.cpp new file mode 100644 index 0000000..5b89e23 --- /dev/null +++ b/game/shared/tf/tf_duckleaderboard.cpp @@ -0,0 +1,343 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= +#include "cbase.h" +#include "tf_duckleaderboard.h" +#ifdef CLIENT_DLL + #include "vgui_avatarimage.h" + #include "tf_item_inventory.h" +#endif + +// memdbgon must be the last include file in a .cpp file!!! +#include <tier0/memdbgon.h> + +//------------------------------- +const char *g_szDuckLeaderboardNames[] = +{ + "TF_DUCK_SCORING_OVERALL_RATING", // TF_DUCK_SCORING_OVERALL_RATING + "TF_DUCK_SCORING_PERSONAL_GENERATION", // TF_DUCK_SCORING_PERSONAL_GENERATION + "TF_DUCK_SCORING_PERSONAL_PICKUP_OFFENSE", // TF_DUCK_SCORING_PERSONAL_PICKUP_OFFENSE + "TF_DUCK_SCORING_PERSONAL_PICKUP_DEFENDED", // TF_DUCK_SCORING_PERSONAL_PICKUP_DEFENDED + "TF_DUCK_SCORING_PERSONAL_PICKUP_OBJECTIVE", // TF_DUCK_SCORING_PERSONAL_PICKUP_OBJECTIVE + "TF_DUCK_SCORING_TEAM_PICKUP_MY_DUCKS", // TF_DUCK_SCORING_TEAM_PICKUP_MY_DUCKS + "TF_DUCK_SCORING_PERSONAL_BONUS_PICKUP", // TF_DUCK_SCORING_PERSONAL_BONUS_PICKUP +}; +COMPILE_TIME_ASSERT( ARRAYSIZE( g_szDuckLeaderboardNames ) == DUCK_NUM_LEADERBOARDS ); + +#ifdef CLIENT_DLL + +//----------------------------------------------------------------------------- +CDucksLeaderboard::CDucksLeaderboard( Panel *parent, const char *panelName, const char *pszDuckLeaderboardname ) + : CTFLeaderboardPanel( parent, panelName ) + , m_pszDuckLeaderboardName( pszDuckLeaderboardname ) + , m_pToolTip( NULL ) +{ + m_pToolTip = new CTFTextToolTip( this ); + m_pToolTipEmbeddedPanel = new vgui::EditablePanel( this, "TooltipPanel" ); + m_pToolTipEmbeddedPanel->SetKeyBoardInputEnabled( false ); + m_pToolTipEmbeddedPanel->SetMouseInputEnabled( false ); + m_pToolTip->SetEmbeddedPanel( m_pToolTipEmbeddedPanel ); + m_pToolTip->SetTooltipDelay( 0 ); +} + +//----------------------------------------------------------------------------- +CDucksLeaderboard::~CDucksLeaderboard() +{} + +//----------------------------------------------------------------------------- +void CDucksLeaderboard::ApplySchemeSettings( IScheme *pScheme ) +{ + BaseClass::ApplySchemeSettings( pScheme ); + + LoadControlSettings( "Resource/UI/econ/DucksLeaderboardPanel.res" ); +} + +//----------------------------------------------------------------------------- +bool CDucksLeaderboard::GetLeaderboardData( CUtlVector< LeaderboardEntry_t* > &scores ) +{ + return Leaderboards_GetDuckLeaderboard( scores, m_pszDuckLeaderboardName ); +} + +//----------------------------------------------------------------------------- +bool CDucksLeaderboard::UpdateLeaderboards() +{ + CUtlVector< LeaderboardEntry_t* > scores; + if ( !GetLeaderboardData( scores ) ) + return false; + + CSteamID localSteamID; + if ( steamapicontext && steamapicontext->SteamUser() ) + { + localSteamID = steamapicontext->SteamUser()->GetSteamID(); + } + + // Scores were empty but the leaderboard query was OK? This will happen while the user + // and their friends has no scores. For now, insert a dummy value for the local player. + LeaderboardEntry_t dummyentry; + if ( scores.IsEmpty() ) + { + dummyentry.m_nScore = 0; + dummyentry.m_steamIDUser = localSteamID; + scores.AddToTail( &dummyentry ); + } + + int nStartingIndex = 0; + FOR_EACH_VEC( scores, i ) + { + if ( scores[ i ]->m_steamIDUser == localSteamID ) + { + // Try to go 3 past where the player is if we can, then go back 6 + nStartingIndex = Max( Min( i + 3, scores.Count() ) - 6, 0 ); + break; + } + } + + 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] ); + int nScoreIndex = nStartingIndex + i; + if ( pContainer ) + { + bool bIsEntryVisible = nScoreIndex < scores.Count(); + pContainer->SetVisible( bIsEntryVisible ); + pContainer->SetPos( x, y ); + y += m_yEntryStep; + if ( bIsEntryVisible ) + { + const LeaderboardEntry_t *leaderboardEntry = scores[nScoreIndex]; + const CSteamID &steamID = leaderboardEntry->m_steamIDUser; + bool bIsLocalPlayer = steamapicontext && steamapicontext->SteamUser() && steamapicontext->SteamUser()->GetSteamID() == steamID; + pContainer->SetDialogVariable( "username", InventoryManager()->PersonaName_Get( steamID.GetAccountID() ) ); + float flXPToLevel = DUCK_XP_SCALE; + const float flPreciseLevel = leaderboardEntry->m_nScore / flXPToLevel; + const int nCurrentLevel = floor( flPreciseLevel ); + const float flPercentToNextLevel = flPreciseLevel - nCurrentLevel; + pContainer->SetDialogVariable( "score", nCurrentLevel ); + ProgressBar* pProgressBar = pContainer->FindControl<ProgressBar>( "ProgressToNextLevel", true ); + if ( pProgressBar ) + { + pProgressBar->SetProgress( 1.f - flPercentToNextLevel ); + pProgressBar->SetProgressDirection( ProgressBar::PROGRESS_WEST ); + //const int nNextLevelXP = ( nCurrentLevel + 1 ) * DUCK_XP_SCALE; + pProgressBar->SetTooltip( m_pToolTip, CFmtStr( "%d / %d", leaderboardEntry->m_nScore % DUCK_XP_SCALE, DUCK_XP_SCALE ) ); + } + + CExLabel *pText = pContainer->FindControl< CExLabel >( "UserName" ); + if ( pText ) + { + pText->SetColorStr( bIsLocalPlayer ? m_LocalPlayerTextColor : colorToUse ); + } + + pText = pContainer->FindControl< CExLabel >( "Score" ); + 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; +} + + + +//----------------------------------------------------------------------------- +CDucksLeaderboardManager::CDucksLeaderboardManager( Panel *parent, const char *panelName ) + : EditablePanel( parent, panelName ) + , m_nCurrentPage( 0 ) + , m_flFadeStartTime( Plat_FloatTime() ) + , m_pDimmer( NULL ) +{ + ListenForGameEvent( "gameui_hidden" ); + + m_pToolTip = new CTFTextToolTip( this ); + m_pToolTipEmbeddedPanel = new vgui::EditablePanel( this, "TooltipPanel" ); + m_pToolTipEmbeddedPanel->SetKeyBoardInputEnabled( false ); + m_pToolTipEmbeddedPanel->SetMouseInputEnabled( false ); + m_pToolTip->SetEmbeddedPanel( m_pToolTipEmbeddedPanel ); + m_pToolTip->SetTooltipDelay( 0 ); + + static CSchemaItemDefHandle pDuckBadgeDef( "Duck Badge" ); + // Prevent users who don't own the badge from opening the duck leaderboards + if( CTFPlayerInventory::GetFirstItemOfItemDef( pDuckBadgeDef->GetDefinitionIndex() ) == NULL ) + { + SetVisible( false ); + MarkForDeletion(); + return; + } +} + +//----------------------------------------------------------------------------- +void CDucksLeaderboardManager::ApplySchemeSettings( IScheme *pScheme ) +{ + BaseClass::ApplySchemeSettings( pScheme ); + + LoadControlSettings( "Resource/UI/econ/DucksLeaderboards.res" ); + + m_pDimmer = FindControl<EditablePanel>( "Dimmer" ); + + ShowPage( 0 ); +} + +//----------------------------------------------------------------------------- +void CDucksLeaderboardManager::ApplySettings( KeyValues *inResourceData ) +{ + BaseClass::ApplySettings( inResourceData ); + + m_vecLeaderboards.PurgeAndDeleteElements(); + + EditablePanel* pBackgroundPanel = FindControl< EditablePanel >( "Background", true ); + if ( pBackgroundPanel ) + { + EDuckLeaderboardTypes eShowLeaderboard = TF_DUCK_SCORING_OVERALL_RATING; + CDucksLeaderboard *pLeaderboard = new CDucksLeaderboard( pBackgroundPanel, "DuckLeaderboard", g_szDuckLeaderboardNames[eShowLeaderboard] ); + pLeaderboard->SetDialogVariable( "title", g_pVGuiLocalize->Find( CFmtStr( "#%s", g_szDuckLeaderboardNames[eShowLeaderboard] ) ) ); + pLeaderboard->SetDialogVariable( "description", g_pVGuiLocalize->Find( CFmtStr( "#%s_Desc", g_szDuckLeaderboardNames[eShowLeaderboard] ) ) ); + pLeaderboard->InvalidateLayout( true, true ); + m_vecLeaderboards.AddToTail( pLeaderboard ); + + EditablePanel *pStatsPanel = pBackgroundPanel->FindControl<EditablePanel>( "SecondaryStatsContainer", true ); + if ( pStatsPanel ) + { + m_vecLeaderboards.AddToTail( pStatsPanel ); + + Panel* pScoresContainer = pStatsPanel->FindChildByName( "ScoresContainer", true ); + + if ( pScoresContainer ) + { + CSteamID localSteamID; + if ( steamapicontext && steamapicontext->SteamUser() ) + { + localSteamID= steamapicontext->SteamUser()->GetSteamID(); + } + + KeyValues* pScoreEntryKVs = inResourceData->FindKey( "ScoreEntryKVs" ); + if ( pScoreEntryKVs ) + { + for( int i = 1; i < DUCK_NUM_LEADERBOARDS; ++i ) + { + EditablePanel *pNewEntry = new EditablePanel( pScoresContainer , "Score%d" ); + + pNewEntry->ApplySettings( pScoreEntryKVs ); + pNewEntry->SetDialogVariable( "name", g_pVGuiLocalize->Find( CFmtStr( "#%s", g_szDuckLeaderboardNames[i] ) ) ); + pNewEntry->SetTooltip( m_pToolTip, CFmtStr( "#%s_Desc", g_szDuckLeaderboardNames[i] ) ); + pNewEntry->SetVisible( true ); + pNewEntry->SetPos( 0, m_iScoreStep * i ); // This is off by 1, but that's what we want. It starts at 1, but we want it to start lower + // so it matches the leaderboard entries + + CUtlVector< LeaderboardEntry_t* > scores; + Leaderboards_GetDuckLeaderboard( scores, g_szDuckLeaderboardNames[i] ); + + int nScore = 0; + FOR_EACH_VEC( scores, j ) + { + if ( scores[j]->m_steamIDUser == localSteamID ) + { + nScore = scores[j]->m_nScore; + break; + } + } + + pNewEntry->SetDialogVariable( "score", nScore ); + } + } + } + } + } +} + +//----------------------------------------------------------------------------- +void CDucksLeaderboardManager::OnCommand( const char *command ) +{ + if ( FStrEq( command, "close" ) ) + { + SetVisible( false ); + MarkForDeletion(); + return; + } + else if ( FStrEq( command, "nextpage" ) ) + { + NextPage(); + } + else if ( FStrEq( command, "prevpage" ) ) + { + PrevPage(); + } +} + +//----------------------------------------------------------------------------- +void CDucksLeaderboardManager::FireGameEvent( IGameEvent *event ) +{ + if ( FStrEq( event->GetName(), "gameui_hidden" ) ) + { + SetVisible( false ); + MarkForDeletion(); + return; + } +} + + +void CDucksLeaderboardManager::OnThink() +{ + if ( m_pDimmer ) + { + float flDelta = Plat_FloatTime() - m_flFadeStartTime; + float flAlpha = RemapValClamped( flDelta, 0.f, 0.2f, 0.f, 253.f ); + m_pDimmer->SetAlpha( flAlpha ); + } +} + +//----------------------------------------------------------------------------- +void CDucksLeaderboardManager::NextPage() +{ + ++m_nCurrentPage; + if ( m_nCurrentPage == m_vecLeaderboards.Count() ) + { + m_nCurrentPage = 0; + } + + ShowPage( m_nCurrentPage ); +} + +//----------------------------------------------------------------------------- +void CDucksLeaderboardManager::PrevPage() +{ + --m_nCurrentPage; + if ( m_nCurrentPage < 0 ) + { + m_nCurrentPage = m_vecLeaderboards.Count() - 1; + } + + ShowPage( m_nCurrentPage ); +} + +//----------------------------------------------------------------------------- +void CDucksLeaderboardManager::ShowPage( int nPage ) +{ + for( int i=0; i < m_vecLeaderboards.Count(); ++i ) + { + m_vecLeaderboards[i]->SetVisible( i == nPage ); + } + + EditablePanel* pBackgroundPanel = dynamic_cast< EditablePanel* >( FindChildByName( "Background", true ) ); + if ( pBackgroundPanel ) + { + pBackgroundPanel->SetDialogVariable( "pagenumber", CFmtStr( "%d/%d", nPage + 1, m_vecLeaderboards.Count() ) ); + } +} + + +#endif |