4jcraft/Minecraft.Client/Platform/Common/XUI/XUI_Leaderboards.h
2026-03-22 12:40:22 -05:00

196 lines
7.6 KiB
C++

#pragma once
#include "XUI_Helper.h"
#include "../media/xuiscene_leaderboards.h"
#include "../Leaderboards/LeaderboardManager.h"
class CXuiCtrlCraftIngredientSlot;
class CScene_Leaderboards : public CXuiSceneImpl,
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
// static LPCWSTR FLAG_ICON_PATHS[37];
int m_iPad;
bool m_bPopulatedOnce;
static const int LEADERBOARD_HEADERS[NUM_LEADERBOARDS][4];
static const int TitleIcons[NUM_LEADERBOARDS][7];
static LPCWSTR m_TitleIconNameA[7];
static LPCWSTR m_TextColumnNameA[7];
HXUIOBJ m_hTextEntryA[7];
struct LeaderboardDescriptor {
DWORD m_viewId;
DWORD m_columnCount;
WORD m_columnIds[8];
LeaderboardDescriptor(DWORD viewId, DWORD columnCount, WORD columnId_0,
WORD columnId_1, WORD columnId_2, WORD columnId_3,
WORD columnId_4, WORD columnId_5, WORD columnId_6,
WORD columnId_7) {
m_viewId = viewId;
m_columnCount = columnCount;
m_columnIds[0] = columnId_0;
m_columnIds[1] = columnId_1;
m_columnIds[2] = columnId_2;
m_columnIds[3] = columnId_3;
m_columnIds[4] = columnId_4;
m_columnIds[5] = columnId_5;
m_columnIds[6] = columnId_6;
m_columnIds[7] = columnId_7;
}
};
static const LeaderboardDescriptor LEADERBOARD_DESCRIPTORS[NUM_LEADERBOARDS]
[4];
struct LeaderboardEntry {
PlayerUID m_xuid;
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
};
struct Leaderboard {
DWORD m_totalEntryCount; // Either total number of entries in
// leaderboard, or total number of results for
// a friends query
DWORD m_entryStartIndex; // Index of first entry
DWORD m_currentEntryCount; // Current number of entries
LeaderboardEntry m_entries[NUM_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
#ifdef _XBOX
LeaderboardManager::EFilterMode
m_currentFilter; // The current filter selected
#endif
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
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
XONLINE_FRIEND* m_friends; // Current player's friends
unsigned int m_numFriends; // Count of friends
PlayerUID* m_filteredFriends; // List of all friend XUIDs (and player's),
// only counting actual friends, not pending
unsigned int m_numFilteredFriends; // Count of filtered friends
CXuiList m_listGamers; // The XUI list showing the leaderboard info
CXuiControl m_textLeaderboard; // The XUI text box showing the current
// leaderboard name
CXuiControl m_textInfo; // The XUI text box showing info messages (loading,
// no results, etc.)
CXuiControl m_textFilter; // The XUI text box showing the current filter
CXuiControl m_textEntries; // The XUI text box showing the total number of
// entries in this leaderboard
CXuiCtrlCraftIngredientSlot* m_pHTitleIconSlots[7];
float m_fTitleIconXPositions[7];
float m_fTextXPositions[7];
XUI_BEGIN_MSG_MAP()
XUI_ON_XM_INIT(OnInit)
XUI_ON_XM_DESTROY(OnDestroy)
XUI_ON_XM_KEYDOWN(OnKeyDown)
XUI_ON_XM_GET_ITEMCOUNT_ALL(OnGetItemCountAll)
XUI_ON_XM_GET_SOURCE_TEXT(OnGetSourceDataText)
XUI_ON_XM_GET_SOURCE_IMAGE(OnGetSourceDataImage)
XUI_ON_XM_NOTIFY_SELCHANGED(OnNotifySelChanged)
XUI_ON_XM_NOTIFY_SET_FOCUS(OnNotifySetFocus)
XUI_END_MSG_MAP()
BEGIN_CONTROL_MAP()
MAP_CONTROL(IDC_XuiListGamers, m_listGamers)
MAP_CONTROL(IDC_XuiTextLeaderboard, m_textLeaderboard)
MAP_CONTROL(IDC_XuiTextInfo, m_textInfo)
MAP_CONTROL(IDC_XuiTextFilter, m_textFilter)
MAP_CONTROL(IDC_XuiTextEntries, m_textEntries)
END_CONTROL_MAP()
HRESULT OnInit(XUIMessageInit* pInitData, BOOL& bHandled);
HRESULT OnDestroy();
HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& bHandled);
HRESULT OnGetItemCountAll(XUIMessageGetItemCount* pGetItemCountData,
BOOL& bHandled);
HRESULT OnGetSourceDataText(XUIMessageGetSourceText* pGetSourceTextData,
BOOL& bHandled);
HRESULT OnGetSourceDataImage(XUIMessageGetSourceImage* pGetImage,
BOOL& bHandled);
HRESULT OnNotifySetFocus(HXUIOBJ hObjSource,
XUINotifyFocus* pNotifyFocusData, BOOL& bHandled);
HRESULT OnNotifySelChanged(HXUIOBJ hObjSource,
XUINotifySelChanged* pNotifySelChangedData,
BOOL& bHandled);
// Start a read request with the current parameters
void ReadStats(int startIndex);
// Callback function called when stats read completes, userdata contains
// pointer to instance of CScene_Leaderboards
virtual bool OnStatsReadComplete(bool success, int numResults,
LeaderboardManager::ViewOut results);
// Copy the stats from the raw m_stats structure into the m_leaderboards
// structure
int m_numStats;
PXUSER_STATS_READ_RESULTS m_stats;
bool RetrieveStats();
// Populate the XUI leaderboard with the contents of m_leaderboards
void PopulateLeaderboard(bool noResults);
// Copy a leaderboard entry from the stats row
void CopyLeaderboardEntry(PXUSER_STATS_ROW statsRow,
LeaderboardEntry* leaderboardEntry,
bool isDistanceLeaderboard);
// Set the header text of the leaderboard
void SetLeaderboardHeader();
// Set the title icons
int SetLeaderboardTitleIcons();
void ClearLeaderboardTitlebar();
void Reposition(int iNumber);
void RepositionText(int iNumber);
void UpdateTooltips();
protected:
bool m_isProcessingStatsRead;
bool m_bReady;
public:
XUI_IMPLEMENT_CLASS(CScene_Leaderboards, L"CScene_Leaderboards",
XUI_CLASS_SCENE)
};