aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.h
diff options
context:
space:
mode:
authordaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
committerdaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
commitb691c43c44ff180d10e7d4a9afc83b98551ff586 (patch)
tree3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.h
parentdef8cb415354ac390b7e89052a50605285f1aca9 (diff)
Initial commit
Diffstat (limited to 'Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.h')
-rw-r--r--Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.h143
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;
+};