diff options
| author | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
|---|---|---|
| committer | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
| commit | b691c43c44ff180d10e7d4a9afc83b98551ff586 (patch) | |
| tree | 3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.h | |
| parent | def8cb415354ac390b7e89052a50605285f1aca9 (diff) | |
Initial commit
Diffstat (limited to 'Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.h')
| -rw-r--r-- | Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.h | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.h b/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.h new file mode 100644 index 00000000..20bf0002 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.h @@ -0,0 +1,143 @@ +#pragma once + +#include "UIScene.h" +#include "..\Leaderboards\LeaderboardManager.h" + +class UIScene_LeaderboardsMenu : public UIScene, public LeaderboardReadListener +{ +private: + // 4J Stu - Because the kills leaderboard doesn't a peaceful entry there are some special + // handling to make it skip that. We have re-arranged the order of the leaderboards so + // I am making this in case we do it again. + // 4J Stu - Made it a member of the class, rather than a #define + static const int LEADERBOARD_KILLS_POSITION = 3; + + static const int NUM_LEADERBOARDS = 4;//6; //Number of leaderboards + static const int NUM_ENTRIES = 101; //Cache up to this many entries + static const int READ_SIZE = 15; //Read this many entries at a time + + struct LeaderboardDescriptor { + unsigned int m_columnCount; + bool m_isDistanceLeaderboard; + unsigned int m_title; + + LeaderboardDescriptor(unsigned int columnCount, bool isDistanceLeaderboard, unsigned int title) + { + m_columnCount = columnCount; + m_isDistanceLeaderboard = isDistanceLeaderboard; + m_title = title; + } + }; + + static const LeaderboardDescriptor LEADERBOARD_DESCRIPTORS[NUM_LEADERBOARDS][4]; + static const int TitleIcons[NUM_LEADERBOARDS][7]; + + struct LeaderboardEntry { + PlayerUID m_xuid; + unsigned int m_row; // Row identifier for passing to Iggy as a unique identifier + DWORD m_rank; + WCHAR m_wcRank[12]; + WCHAR m_gamerTag[XUSER_NAME_SIZE+1]; + //int m_locale; + unsigned int m_columns[7]; + WCHAR m_wcColumns[7][12]; + bool m_bPlayer; //Is the player + bool m_bOnline; //Is online + bool m_bFriend; //Is friend + bool m_bRequestedFriend; //Friend request sent but not answered + int m_idsErrorMessage; // 4J-JEV: Non-zero if this entry has an error message instead of results. + }; + + struct Leaderboard { + DWORD m_totalEntryCount; //Either total number of entries in leaderboard, or total number of results for a friends query + vector<LeaderboardEntry> m_entries; + DWORD m_numColumns; + }; + + Leaderboard m_leaderboard; //All leaderboard data for the currently selected filter + + unsigned int m_currentLeaderboard; //The current leaderboard selected for view + LeaderboardManager::EFilterMode m_currentFilter; //The current filter selected + unsigned int m_currentDifficulty; //The current difficulty selected + + unsigned int m_newEntryIndex; //Index of the first entry being read + unsigned int m_newReadSize; //Number of entries in the current read operation + + unsigned int m_newEntriesCount; // Number of new entries in this update + + int m_newTop; //Index of the element that should be at the top of the list + int m_newSel; //Index of the element that should be selected in the list + + bool m_isProcessingStatsRead; + bool m_bPopulatedOnce; + bool m_bReady; + + UIControl_LeaderboardList m_listEntries; + UIControl_Label m_labelFilter, m_labelLeaderboard, m_labelEntries, m_labelInfo; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_listEntries, "Gamers") + + UI_MAP_ELEMENT( m_labelFilter, "Filter") + UI_MAP_ELEMENT( m_labelLeaderboard, "Leaderboard") + UI_MAP_ELEMENT( m_labelEntries, "Entries") + UI_MAP_ELEMENT( m_labelInfo, "Info") + UI_END_MAP_ELEMENTS_AND_NAMES() + + static int ExitLeaderboards(void *pParam,int iPad,C4JStorage::EMessageResult result); + +public: + UIScene_LeaderboardsMenu(int iPad, void *initData, UILayer *parentLayer); + ~UIScene_LeaderboardsMenu(); + + virtual void updateTooltips(); + virtual void updateComponents(); + + virtual EUIScene getSceneType() { return eUIScene_LeaderboardsMenu;} + + // Returns true if this scene has focus for the pad passed in + virtual bool hasFocus(int iPad) { return bHasFocus; } + virtual void handleTimerComplete(int id); + +private: + int GetEntryStartIndex(); + +protected: + virtual wstring getMoviePath(); + +public: + void handleReload(); + + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +private: + //Start a read request with the current parameters + void ReadStats(int startIndex); + + //Copy the stats from the raw m_stats structure into the m_leaderboards structure + int m_numStats; + LeaderboardManager::ViewOut m_stats; + bool RetrieveStats(); + + // Copy a leaderboard entry from the stats row + void CopyLeaderboardEntry(LeaderboardManager::ReadScore *statsRow, int leaderboardEntryIndex, bool isDistanceLeaderboard); + + //Populate the XUI leaderboard with the contents of m_leaderboards + void PopulateLeaderboard(LeaderboardManager::eStatsReturn ret); + + //Set the header text of the leaderboard + void SetLeaderboardHeader(); + + // Set the title icons + int SetLeaderboardTitleIcons(); + + //Callback function called when stats read completes, userdata contains pointer to instance of CScene_Leaderboards + virtual bool OnStatsReadComplete(LeaderboardManager::eStatsReturn ret, int numResults, LeaderboardManager::ViewOut results); + + virtual void customDraw(IggyCustomDrawCallbackRegion *region); + + virtual void handleSelectionChanged(F64 selectedId); + virtual void handleRequestMoreData(F64 startIndex, bool up); + + bool m_bIgnoreInput; +}; |
