4jcraft/Minecraft.Client/Platform/Common/Leaderboards/LeaderboardManager.h
2026-03-30 02:17:54 -05:00

253 lines
7.3 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 std::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:
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.
std::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;
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:
static void printStats(ReadView& view);
};
class LeaderboardReadListener {
public:
virtual bool OnStatsReadComplete(LeaderboardManager::eStatsReturn ret,
int numResults,
LeaderboardManager::ViewOut results) = 0;
};
class DebugReadListener : public LeaderboardReadListener {
public:
virtual bool OnStatsReadComplete(LeaderboardManager::eStatsReturn ret,
int numResults,
LeaderboardManager::ViewOut results);
static DebugReadListener* m_instance;
};