2010-11-20 10:37:14 +00:00
|
|
|
/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
|
|
|
|
/* If you are missing that file, acquire a complete release at teeworlds.com. */
|
2010-05-29 07:25:38 +00:00
|
|
|
#ifndef ENGINE_SERVER_H
|
|
|
|
#define ENGINE_SERVER_H
|
2018-06-05 19:22:40 +00:00
|
|
|
|
2023-05-22 14:32:48 +00:00
|
|
|
#include <optional>
|
2020-06-15 13:37:09 +00:00
|
|
|
#include <type_traits>
|
|
|
|
|
2018-06-05 19:22:40 +00:00
|
|
|
#include <base/hash.h>
|
2018-12-11 08:23:12 +00:00
|
|
|
#include <base/math.h>
|
2023-12-11 23:44:46 +00:00
|
|
|
#include <base/system.h>
|
2018-06-05 19:22:40 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
#include "kernel.h"
|
|
|
|
#include "message.h"
|
2024-08-23 18:07:11 +00:00
|
|
|
#include <engine/shared/jsonwriter.h>
|
2020-09-26 19:41:58 +00:00
|
|
|
#include <engine/shared/protocol.h>
|
2013-12-31 05:13:57 +00:00
|
|
|
#include <game/generated/protocol.h>
|
2020-04-16 08:46:43 +00:00
|
|
|
#include <game/generated/protocol7.h>
|
2020-06-14 17:32:14 +00:00
|
|
|
#include <game/generated/protocolglue.h>
|
2010-05-29 07:25:38 +00:00
|
|
|
|
2020-05-13 20:27:49 +00:00
|
|
|
struct CAntibotRoundData;
|
|
|
|
|
2024-03-05 14:44:09 +00:00
|
|
|
// When recording a demo on the server, the ClientId -1 is used
|
2022-03-04 20:23:32 +00:00
|
|
|
enum
|
|
|
|
{
|
|
|
|
SERVER_DEMO_CLIENT = -1
|
|
|
|
};
|
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
class IServer : public IInterface
|
|
|
|
{
|
2023-11-28 20:46:03 +00:00
|
|
|
MACRO_INTERFACE("server")
|
2010-05-29 07:25:38 +00:00
|
|
|
protected:
|
|
|
|
int m_CurrentGameTick;
|
|
|
|
|
|
|
|
public:
|
|
|
|
/*
|
|
|
|
Structure: CClientInfo
|
|
|
|
*/
|
|
|
|
struct CClientInfo
|
|
|
|
{
|
|
|
|
const char *m_pName;
|
|
|
|
int m_Latency;
|
2020-05-22 15:58:41 +00:00
|
|
|
bool m_GotDDNetVersion;
|
|
|
|
int m_DDNetVersion;
|
|
|
|
const char *m_pDDNetVersionStr;
|
2024-03-05 14:44:09 +00:00
|
|
|
const CUuid *m_pConnectionId;
|
2010-05-29 07:25:38 +00:00
|
|
|
};
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
int Tick() const { return m_CurrentGameTick; }
|
2023-11-23 14:33:30 +00:00
|
|
|
int TickSpeed() const { return SERVER_TICK_SPEED; }
|
2010-05-29 07:25:38 +00:00
|
|
|
|
2020-08-29 12:14:37 +00:00
|
|
|
virtual int Port() const = 0;
|
2011-12-04 15:51:33 +00:00
|
|
|
virtual int MaxClients() const = 0;
|
2021-02-08 21:26:26 +00:00
|
|
|
virtual int ClientCount() const = 0;
|
|
|
|
virtual int DistinctClientCount() const = 0;
|
2024-03-05 14:44:09 +00:00
|
|
|
virtual const char *ClientName(int ClientId) const = 0;
|
|
|
|
virtual const char *ClientClan(int ClientId) const = 0;
|
|
|
|
virtual int ClientCountry(int ClientId) const = 0;
|
|
|
|
virtual bool ClientSlotEmpty(int ClientId) const = 0;
|
|
|
|
virtual bool ClientIngame(int ClientId) const = 0;
|
|
|
|
virtual bool ClientAuthed(int ClientId) const = 0;
|
|
|
|
virtual bool GetClientInfo(int ClientId, CClientInfo *pInfo) const = 0;
|
|
|
|
virtual void SetClientDDNetVersion(int ClientId, int DDNetVersion) = 0;
|
|
|
|
virtual void GetClientAddr(int ClientId, char *pAddrStr, int Size) const = 0;
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2022-08-03 21:26:42 +00:00
|
|
|
/**
|
|
|
|
* Returns the version of the client with the given client ID.
|
|
|
|
*
|
2024-03-05 14:44:09 +00:00
|
|
|
* @param ClientId the client Id, which must be between 0 and
|
2022-08-03 21:26:42 +00:00
|
|
|
* MAX_CLIENTS - 1, or equal to SERVER_DEMO_CLIENT for server demos.
|
|
|
|
*
|
|
|
|
* @return The version of the client with the given client ID.
|
|
|
|
* For server demos this is always the latest client version.
|
|
|
|
* On errors, VERSION_NONE is returned.
|
|
|
|
*/
|
2024-03-05 14:44:09 +00:00
|
|
|
virtual int GetClientVersion(int ClientId) const = 0;
|
|
|
|
virtual int SendMsg(CMsgPacker *pMsg, int Flags, int ClientId) = 0;
|
2010-05-29 07:25:38 +00:00
|
|
|
|
2020-06-15 13:37:09 +00:00
|
|
|
template<class T, typename std::enable_if<!protocol7::is_sixup<T>::value, int>::type = 0>
|
2024-03-05 14:44:09 +00:00
|
|
|
inline int SendPackMsg(const T *pMsg, int Flags, int ClientId)
|
2013-12-31 05:13:57 +00:00
|
|
|
{
|
2020-06-15 13:37:09 +00:00
|
|
|
int Result = 0;
|
2024-03-05 14:44:09 +00:00
|
|
|
if(ClientId == -1)
|
2013-12-31 05:13:57 +00:00
|
|
|
{
|
2022-02-21 15:33:51 +00:00
|
|
|
for(int i = 0; i < MaxClients(); i++)
|
2013-12-31 05:13:57 +00:00
|
|
|
if(ClientIngame(i))
|
2022-07-11 17:02:16 +00:00
|
|
|
Result = SendPackMsgTranslate(pMsg, Flags, i);
|
2020-09-26 19:41:58 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2024-03-05 14:44:09 +00:00
|
|
|
Result = SendPackMsgTranslate(pMsg, Flags, ClientId);
|
2013-12-31 05:13:57 +00:00
|
|
|
}
|
2020-06-15 13:37:09 +00:00
|
|
|
return Result;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<class T, typename std::enable_if<protocol7::is_sixup<T>::value, int>::type = 1>
|
2024-03-05 14:44:09 +00:00
|
|
|
inline int SendPackMsg(const T *pMsg, int Flags, int ClientId)
|
2020-06-15 13:37:09 +00:00
|
|
|
{
|
|
|
|
int Result = 0;
|
2024-03-05 14:44:09 +00:00
|
|
|
if(ClientId == -1)
|
2020-06-15 13:37:09 +00:00
|
|
|
{
|
2022-02-21 15:33:51 +00:00
|
|
|
for(int i = 0; i < MaxClients(); i++)
|
2020-06-15 13:37:09 +00:00
|
|
|
if(ClientIngame(i) && IsSixup(i))
|
|
|
|
Result = SendPackMsgOne(pMsg, Flags, i);
|
|
|
|
}
|
2024-03-05 14:44:09 +00:00
|
|
|
else if(IsSixup(ClientId))
|
|
|
|
Result = SendPackMsgOne(pMsg, Flags, ClientId);
|
2020-06-15 13:37:09 +00:00
|
|
|
|
|
|
|
return Result;
|
2013-12-31 05:13:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template<class T>
|
2024-03-05 14:44:09 +00:00
|
|
|
int SendPackMsgTranslate(const T *pMsg, int Flags, int ClientId)
|
2013-12-31 05:13:57 +00:00
|
|
|
{
|
2024-03-05 14:44:09 +00:00
|
|
|
return SendPackMsgOne(pMsg, Flags, ClientId);
|
2013-12-31 05:13:57 +00:00
|
|
|
}
|
|
|
|
|
2024-03-05 14:44:09 +00:00
|
|
|
int SendPackMsgTranslate(const CNetMsg_Sv_Emoticon *pMsg, int Flags, int ClientId)
|
2013-12-31 05:13:57 +00:00
|
|
|
{
|
2022-07-11 17:02:16 +00:00
|
|
|
CNetMsg_Sv_Emoticon MsgCopy;
|
|
|
|
mem_copy(&MsgCopy, pMsg, sizeof(MsgCopy));
|
2024-03-05 14:44:09 +00:00
|
|
|
return Translate(MsgCopy.m_ClientId, ClientId) && SendPackMsgOne(&MsgCopy, Flags, ClientId);
|
2013-12-31 05:13:57 +00:00
|
|
|
}
|
|
|
|
|
2024-03-05 14:44:09 +00:00
|
|
|
int SendPackMsgTranslate(const CNetMsg_Sv_Chat *pMsg, int Flags, int ClientId)
|
2013-12-31 05:13:57 +00:00
|
|
|
{
|
2022-07-11 17:02:16 +00:00
|
|
|
CNetMsg_Sv_Chat MsgCopy;
|
|
|
|
mem_copy(&MsgCopy, pMsg, sizeof(MsgCopy));
|
|
|
|
|
2022-06-30 22:36:32 +00:00
|
|
|
char aBuf[1000];
|
2024-03-05 14:44:09 +00:00
|
|
|
if(MsgCopy.m_ClientId >= 0 && !Translate(MsgCopy.m_ClientId, ClientId))
|
2013-12-31 05:13:57 +00:00
|
|
|
{
|
2024-03-05 14:44:09 +00:00
|
|
|
str_format(aBuf, sizeof(aBuf), "%s: %s", ClientName(MsgCopy.m_ClientId), MsgCopy.m_pMessage);
|
2022-07-11 17:02:16 +00:00
|
|
|
MsgCopy.m_pMessage = aBuf;
|
2024-03-05 14:44:09 +00:00
|
|
|
MsgCopy.m_ClientId = VANILLA_MAX_CLIENTS - 1;
|
2013-12-31 05:13:57 +00:00
|
|
|
}
|
2020-06-12 12:53:18 +00:00
|
|
|
|
2024-03-05 14:44:09 +00:00
|
|
|
if(IsSixup(ClientId))
|
2020-06-12 12:53:18 +00:00
|
|
|
{
|
|
|
|
protocol7::CNetMsg_Sv_Chat Msg7;
|
2024-03-05 14:44:09 +00:00
|
|
|
Msg7.m_ClientId = MsgCopy.m_ClientId;
|
2022-07-11 17:02:16 +00:00
|
|
|
Msg7.m_pMessage = MsgCopy.m_pMessage;
|
|
|
|
Msg7.m_Mode = MsgCopy.m_Team > 0 ? protocol7::CHAT_TEAM : protocol7::CHAT_ALL;
|
2024-03-05 14:44:09 +00:00
|
|
|
Msg7.m_TargetId = -1;
|
|
|
|
return SendPackMsgOne(&Msg7, Flags, ClientId);
|
2020-06-12 12:53:18 +00:00
|
|
|
}
|
|
|
|
|
2024-03-05 14:44:09 +00:00
|
|
|
return SendPackMsgOne(&MsgCopy, Flags, ClientId);
|
2013-12-31 05:13:57 +00:00
|
|
|
}
|
|
|
|
|
2024-03-05 14:44:09 +00:00
|
|
|
int SendPackMsgTranslate(const CNetMsg_Sv_KillMsg *pMsg, int Flags, int ClientId)
|
2013-12-31 05:13:57 +00:00
|
|
|
{
|
2022-07-11 17:02:16 +00:00
|
|
|
CNetMsg_Sv_KillMsg MsgCopy;
|
|
|
|
mem_copy(&MsgCopy, pMsg, sizeof(MsgCopy));
|
2024-03-05 14:44:09 +00:00
|
|
|
if(!Translate(MsgCopy.m_Victim, ClientId))
|
2020-09-26 19:41:58 +00:00
|
|
|
return 0;
|
2024-03-05 14:44:09 +00:00
|
|
|
if(!Translate(MsgCopy.m_Killer, ClientId))
|
2022-07-11 17:02:16 +00:00
|
|
|
MsgCopy.m_Killer = MsgCopy.m_Victim;
|
2024-03-05 14:44:09 +00:00
|
|
|
return SendPackMsgOne(&MsgCopy, Flags, ClientId);
|
2013-12-31 05:13:57 +00:00
|
|
|
}
|
|
|
|
|
2024-03-05 14:44:09 +00:00
|
|
|
int SendPackMsgTranslate(const CNetMsg_Sv_RaceFinish *pMsg, int Flags, int ClientId)
|
2023-12-29 07:33:36 +00:00
|
|
|
{
|
2024-03-05 14:44:09 +00:00
|
|
|
if(IsSixup(ClientId))
|
2023-12-29 07:33:36 +00:00
|
|
|
{
|
|
|
|
protocol7::CNetMsg_Sv_RaceFinish Msg7;
|
2024-03-05 14:44:09 +00:00
|
|
|
Msg7.m_ClientId = pMsg->m_ClientId;
|
2023-12-29 07:33:36 +00:00
|
|
|
Msg7.m_Diff = pMsg->m_Diff;
|
|
|
|
Msg7.m_Time = pMsg->m_Time;
|
|
|
|
Msg7.m_RecordPersonal = pMsg->m_RecordPersonal;
|
|
|
|
Msg7.m_RecordServer = pMsg->m_RecordServer;
|
2024-03-05 14:44:09 +00:00
|
|
|
return SendPackMsgOne(&Msg7, Flags, ClientId);
|
2023-12-29 07:33:36 +00:00
|
|
|
}
|
2024-03-05 14:44:09 +00:00
|
|
|
return SendPackMsgOne(pMsg, Flags, ClientId);
|
2023-12-29 07:33:36 +00:00
|
|
|
}
|
|
|
|
|
2013-12-31 05:13:57 +00:00
|
|
|
template<class T>
|
2024-03-05 14:44:09 +00:00
|
|
|
int SendPackMsgOne(const T *pMsg, int Flags, int ClientId)
|
2010-05-29 07:25:38 +00:00
|
|
|
{
|
2024-03-05 14:44:09 +00:00
|
|
|
dbg_assert(ClientId != -1, "SendPackMsgOne called with -1");
|
|
|
|
CMsgPacker Packer(T::ms_MsgId, false, protocol7::is_sixup<T>::value);
|
2020-06-14 17:32:14 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
if(pMsg->Pack(&Packer))
|
|
|
|
return -1;
|
2024-03-05 14:44:09 +00:00
|
|
|
return SendMsg(&Packer, Flags, ClientId);
|
2010-05-29 07:25:38 +00:00
|
|
|
}
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2020-09-26 19:41:58 +00:00
|
|
|
bool Translate(int &Target, int Client)
|
2013-12-31 05:13:57 +00:00
|
|
|
{
|
2020-03-29 02:36:38 +00:00
|
|
|
if(IsSixup(Client))
|
|
|
|
return true;
|
2022-07-30 08:57:46 +00:00
|
|
|
if(GetClientVersion(Client) >= VERSION_DDNET_OLD)
|
2013-12-31 05:13:57 +00:00
|
|
|
return true;
|
2017-03-21 10:24:44 +00:00
|
|
|
int *pMap = GetIdMap(Client);
|
|
|
|
bool Found = false;
|
2020-09-26 19:41:58 +00:00
|
|
|
for(int i = 0; i < VANILLA_MAX_CLIENTS; i++)
|
2013-12-31 05:13:57 +00:00
|
|
|
{
|
2020-09-26 19:41:58 +00:00
|
|
|
if(Target == pMap[i])
|
2013-12-31 05:13:57 +00:00
|
|
|
{
|
2017-03-21 10:24:44 +00:00
|
|
|
Target = i;
|
|
|
|
Found = true;
|
2013-12-31 05:13:57 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2017-03-21 10:24:44 +00:00
|
|
|
return Found;
|
2013-12-31 05:13:57 +00:00
|
|
|
}
|
|
|
|
|
2020-09-26 19:41:58 +00:00
|
|
|
bool ReverseTranslate(int &Target, int Client)
|
2013-12-31 05:13:57 +00:00
|
|
|
{
|
2020-03-29 02:36:38 +00:00
|
|
|
if(IsSixup(Client))
|
|
|
|
return true;
|
2022-07-30 08:57:46 +00:00
|
|
|
if(GetClientVersion(Client) >= VERSION_DDNET_OLD)
|
2013-12-31 05:13:57 +00:00
|
|
|
return true;
|
2020-09-26 19:41:58 +00:00
|
|
|
Target = clamp(Target, 0, VANILLA_MAX_CLIENTS - 1);
|
2017-03-21 10:24:44 +00:00
|
|
|
int *pMap = GetIdMap(Client);
|
2020-09-26 19:41:58 +00:00
|
|
|
if(pMap[Target] == -1)
|
2013-12-31 05:13:57 +00:00
|
|
|
return false;
|
2017-03-21 10:24:44 +00:00
|
|
|
Target = pMap[Target];
|
2013-12-31 05:13:57 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2018-06-05 19:22:40 +00:00
|
|
|
virtual void GetMapInfo(char *pMapName, int MapNameSize, int *pMapSize, SHA256_DIGEST *pSha256, int *pMapCrc) = 0;
|
2017-09-12 12:58:44 +00:00
|
|
|
|
2024-03-05 14:44:09 +00:00
|
|
|
virtual bool WouldClientNameChange(int ClientId, const char *pNameRequest) = 0;
|
|
|
|
virtual bool WouldClientClanChange(int ClientId, const char *pClanRequest) = 0;
|
|
|
|
virtual void SetClientName(int ClientId, const char *pName) = 0;
|
|
|
|
virtual void SetClientClan(int ClientId, const char *pClan) = 0;
|
|
|
|
virtual void SetClientCountry(int ClientId, int Country) = 0;
|
|
|
|
virtual void SetClientScore(int ClientId, std::optional<int> Score) = 0;
|
|
|
|
virtual void SetClientFlags(int ClientId, int Flags) = 0;
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2024-03-05 14:44:09 +00:00
|
|
|
virtual int SnapNewId() = 0;
|
|
|
|
virtual void SnapFreeId(int Id) = 0;
|
|
|
|
virtual void *SnapNewItem(int Type, int Id, int Size) = 0;
|
2010-05-29 07:25:38 +00:00
|
|
|
|
2023-02-10 18:34:57 +00:00
|
|
|
template<typename T>
|
2024-03-05 14:44:09 +00:00
|
|
|
T *SnapNewItem(int Id)
|
2023-02-10 18:34:57 +00:00
|
|
|
{
|
2024-03-05 14:44:09 +00:00
|
|
|
const int Type = protocol7::is_sixup<T>::value ? -T::ms_MsgId : T::ms_MsgId;
|
|
|
|
return static_cast<T *>(SnapNewItem(Type, Id, sizeof(T)));
|
2023-02-10 18:34:57 +00:00
|
|
|
}
|
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
virtual void SnapSetStaticsize(int ItemType, int Size) = 0;
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2020-09-26 19:41:58 +00:00
|
|
|
enum
|
|
|
|
{
|
|
|
|
RCON_CID_SERV = -1,
|
|
|
|
RCON_CID_VOTE = -2,
|
2011-12-31 11:11:48 +00:00
|
|
|
};
|
2024-03-05 14:44:09 +00:00
|
|
|
virtual void SetRconCid(int ClientId) = 0;
|
|
|
|
virtual int GetAuthedState(int ClientId) const = 0;
|
|
|
|
virtual const char *GetAuthName(int ClientId) const = 0;
|
|
|
|
virtual void Kick(int ClientId, const char *pReason) = 0;
|
2024-08-20 14:51:37 +00:00
|
|
|
virtual void Ban(int ClientId, int Seconds, const char *pReason, bool VerbatimReason) = 0;
|
2024-03-05 14:44:09 +00:00
|
|
|
virtual void RedirectClient(int ClientId, int Port, bool Verbose = false) = 0;
|
2020-04-23 19:34:55 +00:00
|
|
|
virtual void ChangeMap(const char *pMap) = 0;
|
2024-08-26 23:19:40 +00:00
|
|
|
virtual void ReloadMap() = 0;
|
2019-02-04 22:09:14 +00:00
|
|
|
|
2011-08-13 00:11:06 +00:00
|
|
|
virtual void DemoRecorder_HandleAutoStart() = 0;
|
|
|
|
|
2011-04-09 06:41:31 +00:00
|
|
|
// DDRace
|
|
|
|
|
2024-03-05 14:44:09 +00:00
|
|
|
virtual void SaveDemo(int ClientId, float Time) = 0;
|
|
|
|
virtual void StartRecord(int ClientId) = 0;
|
|
|
|
virtual void StopRecord(int ClientId) = 0;
|
|
|
|
virtual bool IsRecording(int ClientId) = 0;
|
2023-12-02 10:10:20 +00:00
|
|
|
virtual void StopDemos() = 0;
|
2014-09-26 00:05:22 +00:00
|
|
|
|
2024-03-05 14:44:09 +00:00
|
|
|
virtual void GetClientAddr(int ClientId, NETADDR *pAddr) const = 0;
|
2013-12-31 05:13:57 +00:00
|
|
|
|
2024-03-05 14:44:09 +00:00
|
|
|
virtual int *GetIdMap(int ClientId) = 0;
|
2015-11-23 21:49:18 +00:00
|
|
|
|
2024-03-05 14:44:09 +00:00
|
|
|
virtual bool DnsblWhite(int ClientId) = 0;
|
|
|
|
virtual bool DnsblPending(int ClientId) = 0;
|
|
|
|
virtual bool DnsblBlack(int ClientId) = 0;
|
2024-09-18 10:16:29 +00:00
|
|
|
virtual const char *GetAnnouncementLine() = 0;
|
|
|
|
virtual void ReadAnnouncementsFile(const char *pFileName) = 0;
|
2024-03-05 14:44:09 +00:00
|
|
|
virtual bool ClientPrevIngame(int ClientId) = 0;
|
|
|
|
virtual const char *GetNetErrorString(int ClientId) = 0;
|
|
|
|
virtual void ResetNetErrorString(int ClientId) = 0;
|
|
|
|
virtual bool SetTimedOut(int ClientId, int OrigId) = 0;
|
|
|
|
virtual void SetTimeoutProtected(int ClientId) = 0;
|
2017-10-13 00:25:50 +00:00
|
|
|
|
|
|
|
virtual void SetErrorShutdown(const char *pReason) = 0;
|
2019-11-03 00:07:10 +00:00
|
|
|
virtual void ExpireServerInfo() = 0;
|
2019-09-15 11:32:40 +00:00
|
|
|
|
2023-01-11 00:35:50 +00:00
|
|
|
virtual void FillAntibot(CAntibotRoundData *pData) = 0;
|
|
|
|
|
2024-03-05 14:44:09 +00:00
|
|
|
virtual void SendMsgRaw(int ClientId, const void *pData, int Size, int Flags) = 0;
|
2020-05-13 20:27:49 +00:00
|
|
|
|
2021-12-14 23:26:15 +00:00
|
|
|
virtual const char *GetMapName() const = 0;
|
2020-03-29 02:36:38 +00:00
|
|
|
|
2024-03-05 14:44:09 +00:00
|
|
|
virtual bool IsSixup(int ClientId) const = 0;
|
2010-05-29 07:25:38 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class IGameServer : public IInterface
|
|
|
|
{
|
2023-11-28 20:46:03 +00:00
|
|
|
MACRO_INTERFACE("gameserver")
|
2010-05-29 07:25:38 +00:00
|
|
|
protected:
|
|
|
|
public:
|
2023-08-25 12:52:37 +00:00
|
|
|
// `pPersistentData` may be null if this is the first time `IGameServer`
|
|
|
|
// is instantiated.
|
|
|
|
virtual void OnInit(const void *pPersistentData) = 0;
|
2010-05-29 07:25:38 +00:00
|
|
|
virtual void OnConsoleInit() = 0;
|
2015-07-14 20:08:29 +00:00
|
|
|
virtual void OnMapChange(char *pNewMapName, int MapNameSize) = 0;
|
2023-08-25 12:52:37 +00:00
|
|
|
// `pPersistentData` may be null if this is the last time `IGameServer`
|
|
|
|
// is destroyed.
|
|
|
|
virtual void OnShutdown(void *pPersistentData) = 0;
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
virtual void OnTick() = 0;
|
|
|
|
virtual void OnPreSnap() = 0;
|
2024-03-05 14:44:09 +00:00
|
|
|
virtual void OnSnap(int ClientId) = 0;
|
2010-05-29 07:25:38 +00:00
|
|
|
virtual void OnPostSnap() = 0;
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2024-03-05 14:44:09 +00:00
|
|
|
virtual void OnMessage(int MsgId, CUnpacker *pUnpacker, int ClientId) = 0;
|
2010-05-29 07:25:38 +00:00
|
|
|
|
2021-02-07 15:03:31 +00:00
|
|
|
// Called before map reload, for any data that the game wants to
|
|
|
|
// persist to the next map.
|
|
|
|
//
|
|
|
|
// Has the size of the return value of `PersistentClientDataSize()`.
|
|
|
|
//
|
|
|
|
// Returns whether the game should be supplied with the data when the
|
|
|
|
// client connects for the next map.
|
2024-03-05 14:44:09 +00:00
|
|
|
virtual bool OnClientDataPersist(int ClientId, void *pData) = 0;
|
2021-02-07 15:03:31 +00:00
|
|
|
|
|
|
|
// Called when a client connects.
|
|
|
|
//
|
|
|
|
// If it is reconnecting to the game after a map change, the
|
|
|
|
// `pPersistentData` point is nonnull and contains the data the game
|
|
|
|
// previously stored.
|
2024-03-05 14:44:09 +00:00
|
|
|
virtual void OnClientConnected(int ClientId, void *pPersistentData) = 0;
|
2021-02-07 15:03:31 +00:00
|
|
|
|
2024-03-05 14:44:09 +00:00
|
|
|
virtual void OnClientEnter(int ClientId) = 0;
|
|
|
|
virtual void OnClientDrop(int ClientId, const char *pReason) = 0;
|
|
|
|
virtual void OnClientPrepareInput(int ClientId, void *pInput) = 0;
|
|
|
|
virtual void OnClientDirectInput(int ClientId, void *pInput) = 0;
|
|
|
|
virtual void OnClientPredictedInput(int ClientId, void *pInput) = 0;
|
|
|
|
virtual void OnClientPredictedEarlyInput(int ClientId, void *pInput) = 0;
|
2011-03-15 08:58:57 +00:00
|
|
|
|
2024-03-05 14:44:09 +00:00
|
|
|
virtual bool IsClientReady(int ClientId) const = 0;
|
|
|
|
virtual bool IsClientPlayer(int ClientId) const = 0;
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2023-08-25 12:52:37 +00:00
|
|
|
virtual int PersistentDataSize() const = 0;
|
2021-02-07 15:03:31 +00:00
|
|
|
virtual int PersistentClientDataSize() const = 0;
|
|
|
|
|
2021-02-08 21:26:26 +00:00
|
|
|
virtual CUuid GameUuid() const = 0;
|
|
|
|
virtual const char *GameType() const = 0;
|
|
|
|
virtual const char *Version() const = 0;
|
|
|
|
virtual const char *NetVersion() const = 0;
|
2011-08-26 18:03:30 +00:00
|
|
|
|
|
|
|
// DDRace
|
|
|
|
|
2021-09-14 20:11:22 +00:00
|
|
|
virtual void OnPreTickTeehistorian() = 0;
|
|
|
|
|
2024-03-05 14:44:09 +00:00
|
|
|
virtual void OnSetAuthed(int ClientId, int Level) = 0;
|
|
|
|
virtual bool PlayerExists(int ClientId) const = 0;
|
2017-09-13 20:35:09 +00:00
|
|
|
|
2023-08-25 12:26:09 +00:00
|
|
|
virtual void TeehistorianRecordAntibot(const void *pData, int DataSize) = 0;
|
2024-03-05 14:44:09 +00:00
|
|
|
virtual void TeehistorianRecordPlayerJoin(int ClientId, bool Sixup) = 0;
|
|
|
|
virtual void TeehistorianRecordPlayerDrop(int ClientId, const char *pReason) = 0;
|
|
|
|
virtual void TeehistorianRecordPlayerRejoin(int ClientId) = 0;
|
2024-04-14 18:32:31 +00:00
|
|
|
virtual void TeehistorianRecordPlayerName(int ClientId, const char *pName) = 0;
|
2024-04-14 18:32:37 +00:00
|
|
|
virtual void TeehistorianRecordPlayerFinish(int ClientId, int TimeTicks) = 0;
|
|
|
|
virtual void TeehistorianRecordTeamFinish(int TeamId, int TimeTicks) = 0;
|
2020-05-13 20:27:49 +00:00
|
|
|
|
|
|
|
virtual void FillAntibot(CAntibotRoundData *pData) = 0;
|
2022-11-14 07:04:34 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Used to report custom player info to master servers.
|
2023-05-22 14:32:48 +00:00
|
|
|
*
|
2024-08-23 18:07:11 +00:00
|
|
|
* @param pJsonWriter A pointer to a CJsonStringWriter which the custom data will be added to.
|
2022-11-14 07:04:34 +00:00
|
|
|
* @param i The client id.
|
|
|
|
*/
|
2024-08-23 18:07:11 +00:00
|
|
|
virtual void OnUpdatePlayerServerInfo(CJsonStringWriter *pJSonWriter, int Id) = 0;
|
2010-05-29 07:25:38 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
extern IGameServer *CreateGameServer();
|
|
|
|
#endif
|