Files
MinecraftConsoles/Minecraft.Client/Common/Leaderboards/LeaderboardManager.h
2026-03-01 12:16:08 +08:00

269 lines
6.2 KiB
C++

#pragma once
// Forward Declarations.
class LeaderboardManager;
// READ LISTENTER //
class LeaderboardReadListener;
// ABSTRACT CLASS //
class LeaderboardManager
{
public:
enum eStatsReturn
{
eStatsReturn_Success=0,
eStatsReturn_NoResults,
eStatsReturn_NetworkError
};
enum eProperty_Kills
{
eProperty_Kills_Zombie=0,
eProperty_Kills_Skeleton,
eProperty_Kills_Creeper,
eProperty_Kills_Spider,
eProperty_Kills_SpiderJockey,
eProperty_Kills_ZombiePigman,
eProperty_Kills_Slime,
eProperty_Kills_Rating,
eProperty_Kills_Max,
};
enum eProperty_Mining
{
eProperty_Mining_Dirt=0,
eProperty_Mining_Stone,
eProperty_Mining_Sand,
eProperty_Mining_Cobblestone,
eProperty_Mining_Gravel,
eProperty_Mining_Clay,
eProperty_Mining_Obsidian,
eProperty_Mining_Rating,
eProperty_Mining_Max,
};
enum eProperty_Farming
{
eProperty_Farming_Egg=0,
eProperty_Farming_Wheat,
eProperty_Farming_Mushroom,
eProperty_Farming_Sugarcane,
eProperty_Farming_Milk,
eProperty_Farming_Pumpkin,
eProperty_Farming_Rating,
eProperty_Farming_Max,
};
enum eProperty_Travelling
{
eProperty_Travelling_Walked=0,
eProperty_Travelling_Fallen,
eProperty_Travelling_Minecart,
eProperty_Travelling_Boat,
eProperty_Travelling_Rating,
eProperty_Travelling_Max,
};
enum EStatsType
{
eStatsType_Travelling=0,
eStatsType_Mining,
eStatsType_Farming,
eStatsType_Kills,
eStatsType_MAX,
eStatsType_UNDEFINED
};
enum EFilterMode
{
eFM_Friends=0, //Stats belonging to current user's friends
eFM_MyScore, //Stats around the current user's rank
eFM_TopRank, //Stats at the top of the leaderboard
eNumFilterModes,
eFM_UNDEFINED
};
static const wstring filterNames[eNumFilterModes];
typedef struct KillsRecord
{
public:
unsigned short m_zombie;
unsigned short m_skeleton;
unsigned short m_creeper;
unsigned short m_spider;
unsigned short m_spiderJockey;
unsigned short m_zombiePigman;
unsigned short m_slime;
} KillsRecord;
typedef struct MiningRecord
{
public:
unsigned short m_dirt;
unsigned short m_stone;
unsigned short m_sand;
unsigned short m_cobblestone;
unsigned short m_gravel;
unsigned short m_clay;
unsigned short m_obsidian;
} MiningRecord;
typedef struct FarmingRecord
{
public:
unsigned short m_eggs;
unsigned short m_wheat;
unsigned short m_mushroom;
unsigned short m_sugarcane;
unsigned short m_milk;
unsigned short m_pumpkin;
} FarmingRecord;
typedef struct TravellingRecord
{
public:
unsigned int m_walked;
unsigned int m_fallen;
unsigned int m_minecart;
unsigned int m_boat;
} TravellingRecord;
public:
#ifdef _XBOX
typedef XSESSION_VIEW_PROPERTIES *ViewIn;
typedef PXUSER_STATS_READ_RESULTS ViewOut;
#else
static const int RECORD_SIZE = 40; //base32
typedef struct StatsData
{
EStatsType m_statsType;
union
{
LeaderboardManager::KillsRecord m_kills;
LeaderboardManager::MiningRecord m_mining;
LeaderboardManager::FarmingRecord m_farming;
LeaderboardManager::TravellingRecord m_travelling;
unsigned char m_padding[RECORD_SIZE];
};
} StatsData;
typedef struct RegisterScore
{
int m_iPad;
int m_score;
int m_difficulty;
StatsData m_commentData;
} RegisterScore;
typedef struct ReadScore
{
// Maximum number of columns in a scoreboard.
static const unsigned int STATSDATA_MAX = 8;
PlayerUID m_uid; // Player's unique identifier.
unsigned long m_rank; // Rank of the player on this scoreboard.
wstring m_name; // Player's display name.
unsigned long m_totalScore; // Sum of all the player's scores on this leaderboard.
unsigned short m_statsSize; // Iff (m_hasResults): Number of columns on this leaderboard.
unsigned long m_statsData[STATSDATA_MAX]; // Iff (m_hasResults): Player's score for each appropriate column.
int m_idsErrorMessage; // Iff (not m_hasResults): error message explaining what went wrong.
} ReadScore;
typedef struct ReadView
{
unsigned int m_numQueries;
ReadScore *m_queries;
} ReadView;
typedef ReadView ViewOut;
typedef RegisterScore *ViewIn;
#endif
public:
LeaderboardManager();
virtual ~LeaderboardManager() {}
protected:
virtual void zeroReadParameters();
EFilterMode m_eFilterMode;
// Parameters for reading.
int m_difficulty;
EStatsType m_statsType;
LeaderboardReadListener *m_readListener;
PlayerUID m_myXUID;
unsigned int m_startIndex, m_readCount;
private:
static LeaderboardManager *m_instance; //Singleton instance of the LeaderboardManager
public:
static LeaderboardManager *Instance() { return m_instance; }
static void DeleteInstance();
virtual void Tick() = 0;
//Open a session
virtual bool OpenSession() = 0;
//Close a session
virtual void CloseSession() = 0;
//Delete a session
virtual void DeleteSession() = 0;
//Write the given stats
//This is called synchronously and will not free any memory allocated for views when it is done
virtual bool WriteStats(unsigned int viewCount, ViewIn views) = 0;
virtual bool ReadStats_Friends(LeaderboardReadListener *callback, int difficulty, EStatsType type, PlayerUID myUID, unsigned int startIndex, unsigned int readCount);
virtual bool ReadStats_MyScore(LeaderboardReadListener *callback, int difficulty, EStatsType type, PlayerUID myUID, unsigned int readCount);
virtual bool ReadStats_TopRank(LeaderboardReadListener *callback, int difficulty, EStatsType type, unsigned int startIndex, unsigned int readCount);
//Perform a flush of the stats
virtual void FlushStats() = 0;
//Cancel the current operation
virtual void CancelOperation() = 0;
//Is the leaderboard manager idle.
virtual bool isIdle() = 0;
public:
#ifndef _XBOX
static void printStats(ReadView &view);
#endif
};
class LeaderboardReadListener
{
public:
#ifdef _XBOX
virtual bool OnStatsReadComplete(bool success, int numResults, LeaderboardManager::ViewOut results) = 0;
#else
virtual bool OnStatsReadComplete(LeaderboardManager::eStatsReturn ret, int numResults, LeaderboardManager::ViewOut results) = 0;
#endif
};
#ifndef _XBOX
class DebugReadListener : public LeaderboardReadListener
{
public:
virtual bool OnStatsReadComplete(LeaderboardManager::eStatsReturn ret, int numResults, LeaderboardManager::ViewOut results);
static DebugReadListener *m_instance;
};
#endif