2018-07-06 14:11:38 +00:00
|
|
|
#ifndef GAME_SERVER_SCORE_H
|
|
|
|
#define GAME_SERVER_SCORE_H
|
2010-07-29 05:21:18 +00:00
|
|
|
|
2020-05-26 21:22:16 +00:00
|
|
|
#include <atomic>
|
2020-09-26 19:41:58 +00:00
|
|
|
#include <memory>
|
2020-07-09 21:47:28 +00:00
|
|
|
#include <string>
|
2020-11-05 10:34:20 +00:00
|
|
|
#include <utility>
|
2020-07-09 21:47:28 +00:00
|
|
|
#include <vector>
|
2019-05-19 22:12:59 +00:00
|
|
|
|
2020-08-09 15:54:25 +00:00
|
|
|
#include <engine/map.h>
|
2020-09-26 19:41:58 +00:00
|
|
|
#include <engine/server/databases/connection_pool.h>
|
2020-07-04 17:53:27 +00:00
|
|
|
#include <game/prng.h>
|
2020-09-26 19:41:58 +00:00
|
|
|
#include <game/voting.h>
|
2020-07-04 17:53:27 +00:00
|
|
|
|
2020-05-26 21:22:16 +00:00
|
|
|
#include "save.h"
|
2010-08-20 17:45:09 +00:00
|
|
|
|
2020-07-04 17:53:27 +00:00
|
|
|
struct ISqlData;
|
|
|
|
class IDbConnection;
|
|
|
|
class IServer;
|
|
|
|
class CGameContext;
|
|
|
|
|
2019-04-02 17:53:37 +00:00
|
|
|
enum
|
|
|
|
{
|
|
|
|
NUM_CHECKPOINTS = 25,
|
|
|
|
TIMESTAMP_STR_LENGTH = 20, // 2019-04-02 19:38:36
|
|
|
|
};
|
2010-07-29 05:21:18 +00:00
|
|
|
|
2020-12-08 11:03:43 +00:00
|
|
|
struct CScorePlayerResult : ISqlResult
|
2020-06-24 21:14:09 +00:00
|
|
|
{
|
|
|
|
CScorePlayerResult();
|
|
|
|
|
2020-09-26 19:41:58 +00:00
|
|
|
enum
|
|
|
|
{
|
2021-03-15 13:38:53 +00:00
|
|
|
MAX_MESSAGES = 10,
|
2020-06-24 21:14:09 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
enum Variant
|
|
|
|
{
|
|
|
|
DIRECT,
|
|
|
|
ALL,
|
|
|
|
BROADCAST,
|
|
|
|
MAP_VOTE,
|
|
|
|
PLAYER_INFO,
|
|
|
|
} m_MessageKind;
|
2020-09-26 19:41:58 +00:00
|
|
|
union
|
|
|
|
{
|
2020-06-24 21:14:09 +00:00
|
|
|
char m_aaMessages[MAX_MESSAGES][512];
|
2021-09-13 09:47:47 +00:00
|
|
|
char m_aBroadcast[1024];
|
2020-09-26 19:41:58 +00:00
|
|
|
struct
|
|
|
|
{
|
2020-06-24 21:14:09 +00:00
|
|
|
float m_Time;
|
|
|
|
float m_CpTime[NUM_CHECKPOINTS];
|
|
|
|
int m_Score;
|
|
|
|
int m_HasFinishScore;
|
|
|
|
int m_Birthday; // 0 indicates no birthday
|
|
|
|
} m_Info;
|
|
|
|
struct
|
|
|
|
{
|
2021-09-13 09:47:47 +00:00
|
|
|
char m_aReason[VOTE_REASON_LENGTH];
|
|
|
|
char m_aServer[32 + 1];
|
|
|
|
char m_aMap[MAX_MAP_LENGTH + 1];
|
2020-06-24 21:14:09 +00:00
|
|
|
} m_MapVote;
|
|
|
|
} m_Data; // PLAYER_INFO
|
|
|
|
|
|
|
|
void SetVariant(Variant v);
|
|
|
|
};
|
|
|
|
|
2020-12-08 11:03:43 +00:00
|
|
|
struct CScoreRandomMapResult : ISqlResult
|
2020-06-24 21:14:09 +00:00
|
|
|
{
|
|
|
|
CScoreRandomMapResult(int ClientID) :
|
|
|
|
m_ClientID(ClientID)
|
|
|
|
{
|
2021-09-13 09:47:47 +00:00
|
|
|
m_aMap[0] = '\0';
|
2020-06-24 21:14:09 +00:00
|
|
|
m_aMessage[0] = '\0';
|
|
|
|
}
|
|
|
|
int m_ClientID;
|
2021-09-13 09:47:47 +00:00
|
|
|
char m_aMap[MAX_MAP_LENGTH];
|
2020-06-24 21:14:09 +00:00
|
|
|
char m_aMessage[512];
|
|
|
|
};
|
|
|
|
|
2020-12-08 11:03:43 +00:00
|
|
|
struct CScoreSaveResult : ISqlResult
|
2020-06-24 21:14:09 +00:00
|
|
|
{
|
2020-09-26 19:41:58 +00:00
|
|
|
CScoreSaveResult(int PlayerID, IGameController *Controller) :
|
2020-06-24 21:14:09 +00:00
|
|
|
m_Status(SAVE_FAILED),
|
|
|
|
m_SavedTeam(CSaveTeam(Controller)),
|
|
|
|
m_RequestingPlayer(PlayerID)
|
|
|
|
{
|
|
|
|
m_aMessage[0] = '\0';
|
|
|
|
m_aBroadcast[0] = '\0';
|
|
|
|
}
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
SAVE_SUCCESS,
|
|
|
|
// load team in the following two cases
|
|
|
|
SAVE_FAILED,
|
|
|
|
LOAD_SUCCESS,
|
|
|
|
LOAD_FAILED,
|
|
|
|
} m_Status;
|
|
|
|
char m_aMessage[512];
|
|
|
|
char m_aBroadcast[512];
|
|
|
|
CSaveTeam m_SavedTeam;
|
|
|
|
int m_RequestingPlayer;
|
|
|
|
CUuid m_SaveID;
|
|
|
|
};
|
|
|
|
|
2020-12-08 11:03:43 +00:00
|
|
|
struct CScoreInitResult : ISqlResult
|
2020-06-24 21:14:09 +00:00
|
|
|
{
|
|
|
|
CScoreInitResult() :
|
|
|
|
m_CurrentRecord(0)
|
2020-09-26 19:41:58 +00:00
|
|
|
{
|
|
|
|
}
|
2020-06-24 21:14:09 +00:00
|
|
|
float m_CurrentRecord;
|
|
|
|
};
|
|
|
|
|
2010-08-23 19:37:27 +00:00
|
|
|
class CPlayerData
|
2010-07-29 05:21:18 +00:00
|
|
|
{
|
|
|
|
public:
|
2010-08-23 19:37:27 +00:00
|
|
|
CPlayerData()
|
|
|
|
{
|
|
|
|
Reset();
|
|
|
|
}
|
2020-06-04 15:33:10 +00:00
|
|
|
~CPlayerData() {}
|
2014-10-10 23:01:32 +00:00
|
|
|
|
2010-08-23 19:37:27 +00:00
|
|
|
void Reset()
|
|
|
|
{
|
|
|
|
m_BestTime = 0;
|
|
|
|
m_CurrentTime = 0;
|
2020-10-26 14:14:07 +00:00
|
|
|
for(float &BestCpTime : m_aBestCpTime)
|
|
|
|
BestCpTime = 0;
|
2010-08-23 19:37:27 +00:00
|
|
|
}
|
2014-10-10 23:01:32 +00:00
|
|
|
|
2010-11-04 18:10:51 +00:00
|
|
|
void Set(float Time, float CpTime[NUM_CHECKPOINTS])
|
2010-08-23 19:37:27 +00:00
|
|
|
{
|
|
|
|
m_BestTime = Time;
|
2020-06-04 15:33:10 +00:00
|
|
|
m_CurrentTime = Time;
|
2010-11-04 18:10:51 +00:00
|
|
|
for(int i = 0; i < NUM_CHECKPOINTS; i++)
|
2010-08-23 19:37:27 +00:00
|
|
|
m_aBestCpTime[i] = CpTime[i];
|
|
|
|
}
|
2014-10-10 23:01:32 +00:00
|
|
|
|
2010-08-23 19:37:27 +00:00
|
|
|
float m_BestTime;
|
|
|
|
float m_CurrentTime;
|
2010-11-04 18:10:51 +00:00
|
|
|
float m_aBestCpTime[NUM_CHECKPOINTS];
|
2010-07-29 05:21:18 +00:00
|
|
|
};
|
|
|
|
|
2020-07-04 17:53:27 +00:00
|
|
|
struct CSqlInitData : ISqlData
|
|
|
|
{
|
|
|
|
CSqlInitData(std::shared_ptr<CScoreInitResult> pResult) :
|
2020-12-08 11:03:43 +00:00
|
|
|
ISqlData(std::move(pResult))
|
2020-09-26 19:41:58 +00:00
|
|
|
{
|
|
|
|
}
|
2020-07-04 17:53:27 +00:00
|
|
|
|
|
|
|
// current map
|
2021-09-13 09:47:47 +00:00
|
|
|
char m_aMap[MAX_MAP_LENGTH];
|
2020-07-04 17:53:27 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct CSqlPlayerRequest : ISqlData
|
|
|
|
{
|
|
|
|
CSqlPlayerRequest(std::shared_ptr<CScorePlayerResult> pResult) :
|
2020-12-08 11:03:43 +00:00
|
|
|
ISqlData(std::move(pResult))
|
2020-09-26 19:41:58 +00:00
|
|
|
{
|
|
|
|
}
|
2020-12-08 11:03:43 +00:00
|
|
|
|
2020-07-04 17:53:27 +00:00
|
|
|
// object being requested, either map (128 bytes) or player (16 bytes)
|
2021-09-13 09:47:47 +00:00
|
|
|
char m_aName[MAX_MAP_LENGTH];
|
2020-07-04 17:53:27 +00:00
|
|
|
// current map
|
2021-09-13 09:47:47 +00:00
|
|
|
char m_aMap[MAX_MAP_LENGTH];
|
|
|
|
char m_aRequestingPlayer[MAX_NAME_LENGTH];
|
2020-07-04 17:53:27 +00:00
|
|
|
// relevant for /top5 kind of requests
|
|
|
|
int m_Offset;
|
2021-09-13 09:47:47 +00:00
|
|
|
char m_aServer[5];
|
2020-07-04 17:53:27 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct CSqlRandomMapRequest : ISqlData
|
|
|
|
{
|
|
|
|
CSqlRandomMapRequest(std::shared_ptr<CScoreRandomMapResult> pResult) :
|
2020-12-08 11:03:43 +00:00
|
|
|
ISqlData(std::move(pResult))
|
2020-09-26 19:41:58 +00:00
|
|
|
{
|
|
|
|
}
|
2020-07-04 17:53:27 +00:00
|
|
|
|
2021-09-13 09:47:47 +00:00
|
|
|
char m_aServerType[32];
|
|
|
|
char m_aCurrentMap[MAX_MAP_LENGTH];
|
|
|
|
char m_aRequestingPlayer[MAX_NAME_LENGTH];
|
2020-07-04 17:53:27 +00:00
|
|
|
int m_Stars;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct CSqlScoreData : ISqlData
|
|
|
|
{
|
|
|
|
CSqlScoreData(std::shared_ptr<CScorePlayerResult> pResult) :
|
2020-12-08 11:03:43 +00:00
|
|
|
ISqlData(std::move(pResult))
|
2020-09-26 19:41:58 +00:00
|
|
|
{
|
|
|
|
}
|
2020-07-04 17:53:27 +00:00
|
|
|
|
2020-12-08 11:03:43 +00:00
|
|
|
virtual ~CSqlScoreData(){};
|
2020-07-04 17:53:27 +00:00
|
|
|
|
2021-09-13 09:47:47 +00:00
|
|
|
char m_aMap[MAX_MAP_LENGTH];
|
|
|
|
char m_aGameUuid[UUID_MAXSTRSIZE];
|
|
|
|
char m_aName[MAX_MAP_LENGTH];
|
2020-07-04 17:53:27 +00:00
|
|
|
|
|
|
|
int m_ClientID;
|
|
|
|
float m_Time;
|
|
|
|
char m_aTimestamp[TIMESTAMP_STR_LENGTH];
|
|
|
|
float m_aCpCurrent[NUM_CHECKPOINTS];
|
|
|
|
int m_Num;
|
|
|
|
bool m_Search;
|
|
|
|
char m_aRequestingPlayer[MAX_NAME_LENGTH];
|
|
|
|
};
|
|
|
|
|
|
|
|
struct CSqlTeamScoreData : ISqlData
|
|
|
|
{
|
2020-12-08 11:03:43 +00:00
|
|
|
CSqlTeamScoreData() :
|
|
|
|
ISqlData(nullptr)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2021-09-13 09:47:47 +00:00
|
|
|
char m_aGameUuid[UUID_MAXSTRSIZE];
|
|
|
|
char m_aMap[MAX_MAP_LENGTH];
|
2020-07-04 17:53:27 +00:00
|
|
|
float m_Time;
|
|
|
|
char m_aTimestamp[TIMESTAMP_STR_LENGTH];
|
|
|
|
unsigned int m_Size;
|
2021-09-13 09:47:47 +00:00
|
|
|
char m_aaNames[MAX_CLIENTS][MAX_NAME_LENGTH];
|
2020-07-04 17:53:27 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct CSqlTeamSave : ISqlData
|
|
|
|
{
|
|
|
|
CSqlTeamSave(std::shared_ptr<CScoreSaveResult> pResult) :
|
2020-12-08 11:03:43 +00:00
|
|
|
ISqlData(std::move(pResult))
|
2020-09-26 19:41:58 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
virtual ~CSqlTeamSave(){};
|
2020-07-04 17:53:27 +00:00
|
|
|
|
2021-09-13 09:47:47 +00:00
|
|
|
char m_aClientName[MAX_NAME_LENGTH];
|
|
|
|
char m_aMap[MAX_MAP_LENGTH];
|
|
|
|
char m_aCode[128];
|
2020-07-04 17:53:27 +00:00
|
|
|
char m_aGeneratedCode[128];
|
2021-09-13 09:47:47 +00:00
|
|
|
char m_aServer[5];
|
2020-07-04 17:53:27 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct CSqlTeamLoad : ISqlData
|
|
|
|
{
|
|
|
|
CSqlTeamLoad(std::shared_ptr<CScoreSaveResult> pResult) :
|
2020-12-08 11:03:43 +00:00
|
|
|
ISqlData(std::move(pResult))
|
2020-09-26 19:41:58 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
virtual ~CSqlTeamLoad(){};
|
2020-07-04 17:53:27 +00:00
|
|
|
|
2021-09-13 09:47:47 +00:00
|
|
|
char m_aCode[128];
|
|
|
|
char m_aMap[MAX_MAP_LENGTH];
|
|
|
|
char m_aRequestingPlayer[MAX_NAME_LENGTH];
|
2020-07-04 17:53:27 +00:00
|
|
|
int m_ClientID;
|
|
|
|
// struct holding all player names in the team or an empty string
|
|
|
|
char m_aClientNames[MAX_CLIENTS][MAX_NAME_LENGTH];
|
|
|
|
int m_aClientID[MAX_CLIENTS];
|
|
|
|
int m_NumPlayer;
|
|
|
|
};
|
|
|
|
|
2020-09-26 19:41:58 +00:00
|
|
|
struct CTeamrank
|
|
|
|
{
|
2020-07-18 13:19:26 +00:00
|
|
|
CUuid m_TeamID;
|
|
|
|
char m_aaNames[MAX_CLIENTS][MAX_NAME_LENGTH];
|
|
|
|
unsigned int m_NumNames;
|
|
|
|
CTeamrank();
|
|
|
|
|
|
|
|
// Assumes that a database query equivalent to
|
|
|
|
//
|
|
|
|
// SELECT TeamID, Name [, ...] -- the order is important
|
|
|
|
// FROM record_teamrace
|
|
|
|
// ORDER BY TeamID, Name
|
|
|
|
//
|
|
|
|
// was executed and that the result line of the first team member is already selected.
|
|
|
|
// Afterwards the team member of the next team is selected.
|
2021-01-31 16:58:30 +00:00
|
|
|
//
|
|
|
|
// Returns true on SQL failure
|
|
|
|
//
|
|
|
|
// if another team can be extracted
|
|
|
|
bool NextSqlResult(IDbConnection *pSqlServer, bool *pEnd, char *pError, int ErrorSize);
|
2020-07-18 13:19:26 +00:00
|
|
|
|
|
|
|
bool SamePlayers(const std::vector<std::string> *aSortedNames);
|
|
|
|
};
|
|
|
|
|
2020-07-04 17:53:27 +00:00
|
|
|
class CScore
|
2010-07-29 05:21:18 +00:00
|
|
|
{
|
2010-08-23 19:37:27 +00:00
|
|
|
CPlayerData m_aPlayerData[MAX_CLIENTS];
|
2020-07-04 17:53:27 +00:00
|
|
|
CDbConnectionPool *m_pPool;
|
|
|
|
|
2021-01-31 16:58:30 +00:00
|
|
|
static bool Init(IDbConnection *pSqlServer, const ISqlData *pGameData, char *pError, int ErrorSize);
|
2020-07-04 17:53:27 +00:00
|
|
|
|
2021-01-31 16:58:30 +00:00
|
|
|
static bool RandomMapThread(IDbConnection *pSqlServer, const ISqlData *pGameData, char *pError, int ErrorSize);
|
|
|
|
static bool RandomUnfinishedMapThread(IDbConnection *pSqlServer, const ISqlData *pGameData, char *pError, int ErrorSize);
|
|
|
|
static bool MapVoteThread(IDbConnection *pSqlServer, const ISqlData *pGameData, char *pError, int ErrorSize);
|
2020-07-04 17:53:27 +00:00
|
|
|
|
2021-01-31 16:58:30 +00:00
|
|
|
static bool LoadPlayerDataThread(IDbConnection *pSqlServer, const ISqlData *pGameData, char *pError, int ErrorSize);
|
|
|
|
static bool MapInfoThread(IDbConnection *pSqlServer, const ISqlData *pGameData, char *pError, int ErrorSize);
|
|
|
|
static bool ShowRankThread(IDbConnection *pSqlServer, const ISqlData *pGameData, char *pError, int ErrorSize);
|
|
|
|
static bool ShowTeamRankThread(IDbConnection *pSqlServer, const ISqlData *pGameData, char *pError, int ErrorSize);
|
2021-03-07 22:39:11 +00:00
|
|
|
static bool ShowTopThread(IDbConnection *pSqlServer, const ISqlData *pGameData, char *pError, int ErrorSize);
|
2021-01-31 16:58:30 +00:00
|
|
|
static bool ShowTeamTop5Thread(IDbConnection *pSqlServer, const ISqlData *pGameData, char *pError, int ErrorSize);
|
|
|
|
static bool ShowPlayerTeamTop5Thread(IDbConnection *pSqlServer, const ISqlData *pGameData, char *pError, int ErrorSize);
|
|
|
|
static bool ShowTimesThread(IDbConnection *pSqlServer, const ISqlData *pGameData, char *pError, int ErrorSize);
|
|
|
|
static bool ShowPointsThread(IDbConnection *pSqlServer, const ISqlData *pGameData, char *pError, int ErrorSize);
|
|
|
|
static bool ShowTopPointsThread(IDbConnection *pSqlServer, const ISqlData *pGameData, char *pError, int ErrorSize);
|
|
|
|
static bool GetSavesThread(IDbConnection *pSqlServer, const ISqlData *pGameData, char *pError, int ErrorSize);
|
2020-07-04 17:53:27 +00:00
|
|
|
|
2021-01-31 16:58:30 +00:00
|
|
|
static bool SaveTeamThread(IDbConnection *pSqlServer, const ISqlData *pGameData, bool Failure, char *pError, int ErrorSize);
|
|
|
|
static bool LoadTeamThread(IDbConnection *pSqlServer, const ISqlData *pGameData, bool Failure, char *pError, int ErrorSize);
|
2020-07-04 17:53:27 +00:00
|
|
|
|
2021-01-31 16:58:30 +00:00
|
|
|
static bool SaveScoreThread(IDbConnection *pSqlServer, const ISqlData *pGameData, bool Failure, char *pError, int ErrorSize);
|
|
|
|
static bool SaveTeamScoreThread(IDbConnection *pSqlServer, const ISqlData *pGameData, bool Failure, char *pError, int ErrorSize);
|
2020-07-04 17:53:27 +00:00
|
|
|
|
|
|
|
CGameContext *GameServer() const { return m_pGameServer; }
|
|
|
|
IServer *Server() const { return m_pServer; }
|
|
|
|
CGameContext *m_pGameServer;
|
|
|
|
IServer *m_pServer;
|
|
|
|
|
|
|
|
std::vector<std::string> m_aWordlist;
|
|
|
|
CPrng m_Prng;
|
|
|
|
void GeneratePassphrase(char *pBuf, int BufSize);
|
|
|
|
|
|
|
|
// returns new SqlResult bound to the player, if no current Thread is active for this player
|
|
|
|
std::shared_ptr<CScorePlayerResult> NewSqlPlayerResult(int ClientID);
|
|
|
|
// Creates for player database requests
|
|
|
|
void ExecPlayerThread(
|
2021-01-31 16:58:30 +00:00
|
|
|
bool (*pFuncPtr)(IDbConnection *, const ISqlData *, char *pError, int ErrorSize),
|
2020-09-26 19:41:58 +00:00
|
|
|
const char *pThreadName,
|
|
|
|
int ClientID,
|
|
|
|
const char *pName,
|
|
|
|
int Offset);
|
2020-07-04 17:53:27 +00:00
|
|
|
|
|
|
|
// returns true if the player should be rate limited
|
|
|
|
bool RateLimitPlayer(int ClientID);
|
2014-10-10 23:01:32 +00:00
|
|
|
|
2010-07-29 05:21:18 +00:00
|
|
|
public:
|
2020-07-04 17:53:27 +00:00
|
|
|
CScore(CGameContext *pGameServer, CDbConnectionPool *pPool);
|
|
|
|
~CScore() {}
|
2014-10-10 23:01:32 +00:00
|
|
|
|
2010-08-23 19:37:27 +00:00
|
|
|
CPlayerData *PlayerData(int ID) { return &m_aPlayerData[ID]; }
|
2014-10-10 23:01:32 +00:00
|
|
|
|
2020-07-04 17:53:27 +00:00
|
|
|
void MapInfo(int ClientID, const char *pMapName);
|
|
|
|
void MapVote(int ClientID, const char *pMapName);
|
|
|
|
void LoadPlayerData(int ClientID);
|
|
|
|
void SaveScore(int ClientID, float Time, const char *pTimestamp, float aCpTime[NUM_CHECKPOINTS], bool NotEligible);
|
2014-10-10 23:01:32 +00:00
|
|
|
|
2020-07-04 17:53:27 +00:00
|
|
|
void SaveTeamScore(int *pClientIDs, unsigned int Size, float Time, const char *pTimestamp);
|
2013-07-21 02:52:23 +00:00
|
|
|
|
2021-03-07 22:39:11 +00:00
|
|
|
void ShowTop(int ClientID, int Offset = 1);
|
2020-07-04 17:53:27 +00:00
|
|
|
void ShowRank(int ClientID, const char *pName);
|
2013-07-21 06:46:52 +00:00
|
|
|
|
2020-09-26 19:41:58 +00:00
|
|
|
void ShowTeamTop5(int ClientID, int Offset = 1);
|
2020-12-09 19:23:26 +00:00
|
|
|
void ShowTeamTop5(int ClientID, const char *pName, int Offset = 1);
|
2020-07-04 17:53:27 +00:00
|
|
|
void ShowTeamRank(int ClientID, const char *pName);
|
2014-06-20 20:40:23 +00:00
|
|
|
|
2020-09-26 19:41:58 +00:00
|
|
|
void ShowTopPoints(int ClientID, int Offset = 1);
|
2020-07-04 17:53:27 +00:00
|
|
|
void ShowPoints(int ClientID, const char *pName);
|
2020-06-24 21:14:09 +00:00
|
|
|
|
2020-07-04 17:53:27 +00:00
|
|
|
void ShowTimes(int ClientID, const char *pName, int Offset = 1);
|
|
|
|
void ShowTimes(int ClientID, int Offset = 1);
|
2014-10-10 23:01:32 +00:00
|
|
|
|
2020-07-04 17:53:27 +00:00
|
|
|
void RandomMap(int ClientID, int Stars);
|
|
|
|
void RandomUnfinishedMap(int ClientID, int Stars);
|
2016-05-04 13:32:24 +00:00
|
|
|
|
2020-07-04 17:53:27 +00:00
|
|
|
void SaveTeam(int ClientID, const char *pCode, const char *pServer);
|
|
|
|
void LoadTeam(const char *pCode, int ClientID);
|
|
|
|
void GetSaves(int ClientID);
|
2010-07-29 05:21:18 +00:00
|
|
|
};
|
|
|
|
|
2018-07-06 14:11:38 +00:00
|
|
|
#endif // GAME_SERVER_SCORE_H
|