DDraceNetwork Documentation
Loading...
Searching...
No Matches
server.h
Go to the documentation of this file.
1/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
2/* If you are missing that file, acquire a complete release at teeworlds.com. */
3#ifndef ENGINE_SERVER_H
4#define ENGINE_SERVER_H
5
6#include <array>
7#include <optional>
8#include <type_traits>
9
10#include <base/hash.h>
11#include <base/math.h>
12#include <base/system.h>
13
14#include "kernel.h"
15#include "message.h"
18#include <generated/protocol.h>
19#include <generated/protocol7.h>
20#include <generated/protocolglue.h>
21
23
24// When recording a demo on the server, the ClientId -1 is used
25enum
26{
28};
29
30class IServer : public IInterface
31{
35
36public:
37 /*
38 Structure: CClientInfo
39 */
49
50 int Tick() const { return m_CurrentGameTick; }
51 int TickSpeed() const { return SERVER_TICK_SPEED; }
52
53 virtual int Port() const = 0;
54 virtual int MaxClients() const = 0;
55 virtual int ClientCount() const = 0;
56 virtual int DistinctClientCount() const = 0;
57 virtual const char *ClientName(int ClientId) const = 0;
58 virtual const char *ClientClan(int ClientId) const = 0;
59 virtual int ClientCountry(int ClientId) const = 0;
60 virtual bool ClientSlotEmpty(int ClientId) const = 0;
61 virtual bool ClientIngame(int ClientId) const = 0;
62 virtual bool GetClientInfo(int ClientId, CClientInfo *pInfo) const = 0;
63 virtual void SetClientDDNetVersion(int ClientId, int DDNetVersion) = 0;
64 virtual const NETADDR *ClientAddr(int ClientId) const = 0;
65 virtual const std::array<char, NETADDR_MAXSTRSIZE> &ClientAddrStringImpl(int ClientId, bool IncludePort) const = 0;
66 inline const char *ClientAddrString(int ClientId, bool IncludePort) const { return ClientAddrStringImpl(ClientId, IncludePort).data(); }
67
78 virtual int GetClientVersion(int ClientId) const = 0;
79 virtual int SendMsg(CMsgPacker *pMsg, int Flags, int ClientId) = 0;
80
82 inline int SendPackMsg(const T *pMsg, int Flags, int ClientId)
83 {
84 int Result = 0;
85 if(ClientId == -1)
86 {
87 for(int i = 0; i < MaxClients(); i++)
88 if(ClientIngame(i))
89 Result = SendPackMsgTranslate(pMsg, Flags, i);
90 }
91 else
92 {
93 Result = SendPackMsgTranslate(pMsg, Flags, ClientId);
94 }
95 return Result;
96 }
97
99 inline int SendPackMsg(const T *pMsg, int Flags, int ClientId)
100 {
101 int Result = 0;
102 if(ClientId == -1)
103 {
104 for(int i = 0; i < MaxClients(); i++)
105 if(ClientIngame(i) && IsSixup(i))
106 Result = SendPackMsgOne(pMsg, Flags, i);
107 }
108 else if(IsSixup(ClientId))
109 Result = SendPackMsgOne(pMsg, Flags, ClientId);
110
111 return Result;
112 }
113
114 template<class T>
115 int SendPackMsgTranslate(const T *pMsg, int Flags, int ClientId)
116 {
117 return SendPackMsgOne(pMsg, Flags, ClientId);
118 }
119
120 int SendPackMsgTranslate(const CNetMsg_Sv_Emoticon *pMsg, int Flags, int ClientId)
121 {
123 mem_copy(&MsgCopy, pMsg, sizeof(MsgCopy));
124 return Translate(MsgCopy.m_ClientId, ClientId) && SendPackMsgOne(&MsgCopy, Flags, ClientId);
125 }
126
127 int SendPackMsgTranslate(const CNetMsg_Sv_Chat *pMsg, int Flags, int ClientId)
128 {
130 mem_copy(&MsgCopy, pMsg, sizeof(MsgCopy));
131
132 char aBuf[1000];
133 if(MsgCopy.m_ClientId >= 0 && !Translate(MsgCopy.m_ClientId, ClientId))
134 {
135 str_format(aBuf, sizeof(aBuf), "%s: %s", ClientName(MsgCopy.m_ClientId), MsgCopy.m_pMessage);
136 MsgCopy.m_pMessage = aBuf;
137 MsgCopy.m_ClientId = VANILLA_MAX_CLIENTS - 1;
138 }
139
140 if(IsSixup(ClientId))
141 {
143 Msg7.m_ClientId = MsgCopy.m_ClientId;
144 Msg7.m_pMessage = MsgCopy.m_pMessage;
146 Msg7.m_TargetId = -1;
147 return SendPackMsgOne(&Msg7, Flags, ClientId);
148 }
149
150 return SendPackMsgOne(&MsgCopy, Flags, ClientId);
151 }
152
153 int SendPackMsgTranslate(const CNetMsg_Sv_KillMsg *pMsg, int Flags, int ClientId)
154 {
156 mem_copy(&MsgCopy, pMsg, sizeof(MsgCopy));
157 if(!Translate(MsgCopy.m_Victim, ClientId))
158 return 0;
159 if(!Translate(MsgCopy.m_Killer, ClientId))
160 MsgCopy.m_Killer = MsgCopy.m_Victim;
161 return SendPackMsgOne(&MsgCopy, Flags, ClientId);
162 }
163
164 int SendPackMsgTranslate(const CNetMsg_Sv_RaceFinish *pMsg, int Flags, int ClientId)
165 {
166 if(IsSixup(ClientId))
167 {
169 Msg7.m_ClientId = pMsg->m_ClientId;
170 Msg7.m_Diff = pMsg->m_Diff;
171 Msg7.m_Time = pMsg->m_Time;
172 Msg7.m_RecordPersonal = pMsg->m_RecordPersonal;
173 Msg7.m_RecordServer = pMsg->m_RecordServer;
174 return SendPackMsgOne(&Msg7, Flags, ClientId);
175 }
176 return SendPackMsgOne(pMsg, Flags, ClientId);
177 }
178
179 template<class T>
180 int SendPackMsgOne(const T *pMsg, int Flags, int ClientId)
181 {
182 dbg_assert(ClientId != -1, "SendPackMsgOne called with -1");
184
185 if(pMsg->Pack(&Packer))
186 return -1;
187 return SendMsg(&Packer, Flags, ClientId);
188 }
189
190 bool Translate(int &Target, int Client)
191 {
192 if(IsSixup(Client))
193 return true;
195 return true;
196 int *pMap = GetIdMap(Client);
197 bool Found = false;
198 for(int i = 0; i < VANILLA_MAX_CLIENTS; i++)
199 {
200 if(Target == pMap[i])
201 {
202 Target = i;
203 Found = true;
204 break;
205 }
206 }
207 return Found;
208 }
209
210 bool ReverseTranslate(int &Target, int Client)
211 {
212 if(IsSixup(Client))
213 return true;
215 return true;
216 Target = std::clamp(Target, 0, VANILLA_MAX_CLIENTS - 1);
217 int *pMap = GetIdMap(Client);
218 if(pMap[Target] == -1)
219 return false;
220 Target = pMap[Target];
221 return true;
222 }
223
224 virtual void GetMapInfo(char *pMapName, int MapNameSize, int *pMapSize, SHA256_DIGEST *pSha256, int *pMapCrc) = 0;
225
226 virtual bool WouldClientNameChange(int ClientId, const char *pNameRequest) = 0;
227 virtual bool WouldClientClanChange(int ClientId, const char *pClanRequest) = 0;
228 virtual void SetClientName(int ClientId, const char *pName) = 0;
229 virtual void SetClientClan(int ClientId, const char *pClan) = 0;
230 virtual void SetClientCountry(int ClientId, int Country) = 0;
231 virtual void SetClientScore(int ClientId, std::optional<int> Score) = 0;
232 virtual void SetClientFlags(int ClientId, int Flags) = 0;
233
234 virtual int SnapNewId() = 0;
235 virtual void SnapFreeId(int Id) = 0;
236 virtual void *SnapNewItem(int Type, int Id, int Size) = 0;
237
238 template<typename T>
239 T *SnapNewItem(int Id)
240 {
241 const int Type = protocol7::is_sixup<T>::value ? -T::ms_MsgId : T::ms_MsgId;
242 return static_cast<T *>(SnapNewItem(Type, Id, sizeof(T)));
243 }
244
245 virtual void SnapSetStaticsize(int ItemType, int Size) = 0;
246
247 enum
248 {
251 };
252 virtual void SetRconCid(int ClientId) = 0;
253 virtual int GetAuthedState(int ClientId) const = 0;
254 virtual bool IsRconAuthed(int ClientId) const = 0;
255 virtual bool IsRconAuthedAdmin(int ClientId) const = 0;
256 virtual const char *GetAuthName(int ClientId) const = 0;
257 virtual bool HasAuthHidden(int ClientId) const = 0;
258 virtual void Kick(int ClientId, const char *pReason) = 0;
259 virtual void Ban(int ClientId, int Seconds, const char *pReason, bool VerbatimReason) = 0;
260 virtual void RedirectClient(int ClientId, int Port) = 0;
261 virtual void ChangeMap(const char *pMap) = 0;
262 virtual void ReloadMap() = 0;
263
265
266 // DDRace
267
268 virtual void SaveDemo(int ClientId, float Time) = 0;
269 virtual void StartRecord(int ClientId) = 0;
270 virtual void StopRecord(int ClientId) = 0;
271 virtual bool IsRecording(int ClientId) = 0;
272 virtual void StopDemos() = 0;
273
274 virtual int *GetIdMap(int ClientId) = 0;
275
276 virtual bool DnsblWhite(int ClientId) = 0;
277 virtual bool DnsblPending(int ClientId) = 0;
278 virtual bool DnsblBlack(int ClientId) = 0;
279 virtual const char *GetAnnouncementLine() = 0;
280 virtual bool ClientPrevIngame(int ClientId) = 0;
281 virtual const char *GetNetErrorString(int ClientId) = 0;
282 virtual void ResetNetErrorString(int ClientId) = 0;
283 virtual bool SetTimedOut(int ClientId, int OrigId) = 0;
284 virtual void SetTimeoutProtected(int ClientId) = 0;
285
286 virtual void SetErrorShutdown(const char *pReason) = 0;
287 virtual void ExpireServerInfo() = 0;
288
290
291 virtual void SendMsgRaw(int ClientId, const void *pData, int Size, int Flags) = 0;
292
293 virtual const char *GetMapName() const = 0;
294
295 virtual bool IsSixup(int ClientId) const = 0;
296};
297
299{
300 MACRO_INTERFACE("gameserver")
302public:
303 // `pPersistentData` may be null if this is the first time `IGameServer`
304 // is instantiated.
307 // Returns `true` if map change accepted.
309 // `pPersistentData` may be null if this is the last time `IGameServer`
310 // is destroyed.
312
313 virtual void OnTick() = 0;
314
315 // Snap for a specific client.
316 //
317 // GlobalSnap is true when sending snapshots to all clients,
318 // otherwise only forced high bandwidth clients would receive snap.
319 virtual void OnSnap(int ClientId, bool GlobalSnap) = 0;
320
321 // Called after sending snapshots to all clients.
322 //
323 // Note if any client has force high bandwidth enabled,
324 // this will not be called when only sending snapshots to these clients.
326
327 virtual void OnMessage(int MsgId, CUnpacker *pUnpacker, int ClientId) = 0;
328
329 // Called before map reload, for any data that the game wants to
330 // persist to the next map.
331 //
332 // Has the size of the return value of `PersistentClientDataSize()`.
333 //
334 // Returns whether the game should be supplied with the data when the
335 // client connects for the next map.
336 virtual bool OnClientDataPersist(int ClientId, void *pData) = 0;
337
338 // Called when a client connects.
339 //
340 // If it is reconnecting to the game after a map change, the
341 // `pPersistentData` point is nonnull and contains the data the game
342 // previously stored.
343 virtual void OnClientConnected(int ClientId, void *pPersistentData) = 0;
344
345 virtual void OnClientEnter(int ClientId) = 0;
346 virtual void OnClientDrop(int ClientId, const char *pReason) = 0;
347 virtual void OnClientPrepareInput(int ClientId, void *pInput) = 0;
348 virtual void OnClientDirectInput(int ClientId, const void *pInput) = 0;
349 virtual void OnClientPredictedInput(int ClientId, const void *pInput) = 0;
350 virtual void OnClientPredictedEarlyInput(int ClientId, const void *pInput) = 0;
351
352 virtual void PreInputClients(int ClientId, bool *pClients) = 0;
353
354 virtual bool IsClientReady(int ClientId) const = 0;
355 virtual bool IsClientPlayer(int ClientId) const = 0;
356 virtual bool IsClientHighBandwidth(int ClientId) const = 0;
357
360
365
368
369 // DDRace
370
372
373 virtual void OnSetAuthed(int ClientId, int Level) = 0;
374 virtual bool PlayerExists(int ClientId) const = 0;
375
376 virtual void TeehistorianRecordAntibot(const void *pData, int DataSize) = 0;
377 virtual void TeehistorianRecordPlayerJoin(int ClientId, bool Sixup) = 0;
378 virtual void TeehistorianRecordPlayerDrop(int ClientId, const char *pReason) = 0;
380 virtual void TeehistorianRecordPlayerName(int ClientId, const char *pName) = 0;
383
385
393};
394
396#endif
Definition jsonwriter.h:105
Definition message.h:10
Definition protocol.h:1501
Definition packer.h:54
Definition server.h:299
virtual const char * GameType() const =0
virtual void TeehistorianRecordPlayerFinish(int ClientId, int TimeTicks)=0
virtual void TeehistorianRecordPlayerName(int ClientId, const char *pName)=0
virtual void OnMessage(int MsgId, CUnpacker *pUnpacker, int ClientId)=0
virtual int PersistentDataSize() const =0
virtual bool OnClientDataPersist(int ClientId, void *pData)=0
virtual void FillAntibot(CAntibotRoundData *pData)=0
virtual void OnSetAuthed(int ClientId, int Level)=0
virtual void OnClientPredictedInput(int ClientId, const void *pInput)=0
virtual CUuid GameUuid() const =0
virtual void OnPostGlobalSnap()=0
virtual CNetObjHandler * GetNetObjHandler()=0
virtual void OnPreTickTeehistorian()=0
virtual void TeehistorianRecordTeamFinish(int TeamId, int TimeTicks)=0
virtual const char * NetVersion() const =0
virtual void OnSnap(int ClientId, bool GlobalSnap)=0
virtual void OnClientEnter(int ClientId)=0
virtual void TeehistorianRecordAntibot(const void *pData, int DataSize)=0
virtual void OnUpdatePlayerServerInfo(CJsonStringWriter *pJSonWriter, int Id)=0
virtual void OnTick()=0
virtual void OnClientConnected(int ClientId, void *pPersistentData)=0
virtual void PreInputClients(int ClientId, bool *pClients)=0
virtual void OnConsoleInit()=0
virtual const char * Version() const =0
virtual bool IsClientPlayer(int ClientId) const =0
virtual void OnClientDirectInput(int ClientId, const void *pInput)=0
virtual protocol7::CNetObjHandler * GetNetObjHandler7()=0
virtual void OnClientPredictedEarlyInput(int ClientId, const void *pInput)=0
virtual bool PlayerExists(int ClientId) const =0
virtual void OnClientDrop(int ClientId, const char *pReason)=0
virtual void TeehistorianRecordPlayerDrop(int ClientId, const char *pReason)=0
virtual bool IsClientReady(int ClientId) const =0
virtual void OnShutdown(void *pPersistentData)=0
virtual void OnClientPrepareInput(int ClientId, void *pInput)=0
virtual void TeehistorianRecordPlayerRejoin(int ClientId)=0
virtual void TeehistorianRecordPlayerJoin(int ClientId, bool Sixup)=0
virtual bool OnMapChange(char *pNewMapName, int MapNameSize)=0
virtual int PersistentClientDataSize() const =0
virtual bool IsClientHighBandwidth(int ClientId) const =0
virtual void OnInit(const void *pPersistentData)=0
Definition kernel.h:10
Definition server.h:31
virtual int ClientCount() const =0
virtual void RedirectClient(int ClientId, int Port)=0
virtual void SetTimeoutProtected(int ClientId)=0
bool ReverseTranslate(int &Target, int Client)
Definition server.h:210
virtual bool IsRconAuthedAdmin(int ClientId) const =0
virtual const NETADDR * ClientAddr(int ClientId) const =0
int SendPackMsgTranslate(const CNetMsg_Sv_RaceFinish *pMsg, int Flags, int ClientId)
Definition server.h:164
virtual int SnapNewId()=0
virtual void GetMapInfo(char *pMapName, int MapNameSize, int *pMapSize, SHA256_DIGEST *pSha256, int *pMapCrc)=0
virtual void SetRconCid(int ClientId)=0
int SendPackMsg(const T *pMsg, int Flags, int ClientId)
Definition server.h:82
virtual bool WouldClientClanChange(int ClientId, const char *pClanRequest)=0
virtual void SetClientName(int ClientId, const char *pName)=0
virtual const char * GetMapName() const =0
virtual bool WouldClientNameChange(int ClientId, const char *pNameRequest)=0
int SendPackMsgTranslate(const T *pMsg, int Flags, int ClientId)
Definition server.h:115
virtual void SnapSetStaticsize(int ItemType, int Size)=0
virtual int Port() const =0
virtual bool DnsblBlack(int ClientId)=0
virtual void SnapFreeId(int Id)=0
int Tick() const
Definition server.h:50
virtual bool DnsblWhite(int ClientId)=0
virtual int SendMsg(CMsgPacker *pMsg, int Flags, int ClientId)=0
virtual const char * GetAuthName(int ClientId) const =0
virtual bool IsSixup(int ClientId) const =0
int SendPackMsgTranslate(const CNetMsg_Sv_Chat *pMsg, int Flags, int ClientId)
Definition server.h:127
virtual void StopDemos()=0
virtual void ExpireServerInfo()=0
virtual int ClientCountry(int ClientId) const =0
@ RCON_CID_VOTE
Definition server.h:250
@ RCON_CID_SERV
Definition server.h:249
virtual void Ban(int ClientId, int Seconds, const char *pReason, bool VerbatimReason)=0
virtual int MaxClients() const =0
virtual void SetClientScore(int ClientId, std::optional< int > Score)=0
virtual int * GetIdMap(int ClientId)=0
virtual void ReloadMap()=0
virtual void ChangeMap(const char *pMap)=0
virtual bool ClientPrevIngame(int ClientId)=0
virtual bool GetClientInfo(int ClientId, CClientInfo *pInfo) const =0
virtual void FillAntibot(CAntibotRoundData *pData)=0
virtual const std::array< char, NETADDR_MAXSTRSIZE > & ClientAddrStringImpl(int ClientId, bool IncludePort) const =0
virtual void SetErrorShutdown(const char *pReason)=0
virtual void SetClientFlags(int ClientId, int Flags)=0
virtual bool IsRconAuthed(int ClientId) const =0
const char * ClientAddrString(int ClientId, bool IncludePort) const
Definition server.h:66
virtual bool IsRecording(int ClientId)=0
int SendPackMsgOne(const T *pMsg, int Flags, int ClientId)
Definition server.h:180
virtual void * SnapNewItem(int Type, int Id, int Size)=0
virtual int DistinctClientCount() const =0
int TickSpeed() const
Definition server.h:51
virtual const char * ClientName(int ClientId) const =0
int m_CurrentGameTick
Definition server.h:34
virtual int GetAuthedState(int ClientId) const =0
T * SnapNewItem(int Id)
Definition server.h:239
virtual void SetClientDDNetVersion(int ClientId, int DDNetVersion)=0
virtual void DemoRecorder_HandleAutoStart()=0
virtual bool HasAuthHidden(int ClientId) const =0
virtual void SetClientClan(int ClientId, const char *pClan)=0
virtual bool ClientIngame(int ClientId) const =0
virtual void StopRecord(int ClientId)=0
bool Translate(int &Target, int Client)
Definition server.h:190
virtual void SetClientCountry(int ClientId, int Country)=0
int SendPackMsgTranslate(const CNetMsg_Sv_KillMsg *pMsg, int Flags, int ClientId)
Definition server.h:153
virtual const char * GetAnnouncementLine()=0
virtual void Kick(int ClientId, const char *pReason)=0
virtual bool DnsblPending(int ClientId)=0
virtual void SaveDemo(int ClientId, float Time)=0
virtual void StartRecord(int ClientId)=0
int SendPackMsgTranslate(const CNetMsg_Sv_Emoticon *pMsg, int Flags, int ClientId)
Definition server.h:120
virtual int GetClientVersion(int ClientId) const =0
virtual void ResetNetErrorString(int ClientId)=0
virtual void SendMsgRaw(int ClientId, const void *pData, int Size, int Flags)=0
virtual const char * ClientClan(int ClientId) const =0
virtual const char * GetNetErrorString(int ClientId)=0
virtual bool SetTimedOut(int ClientId, int OrigId)=0
virtual bool ClientSlotEmpty(int ClientId) const =0
Definition vmath.h:15
@ VERSION_DDNET_OLD
Definition protocol.h:115
@ SERVER_TICK_SPEED
Definition protocol.h:80
@ VANILLA_MAX_CLIENTS
Definition protocol.h:89
#define dbg_assert(test, fmt,...)
Definition system.h:64
void mem_copy(void *dest, const void *source, size_t size)
Definition system.cpp:180
#define MACRO_INTERFACE(Name)
Definition kernel.h:25
Definition protocol7.h:8
@ CHAT_TEAM
Definition protocol7.h:101
@ CHAT_ALL
Definition protocol7.h:100
@ SERVER_DEMO_CLIENT
Definition server.h:27
IGameServer * CreateGameServer()
Definition gamecontext.cpp:4623
Definition antibot_data.h:111
Definition protocol.h:754
Definition protocol.h:842
Definition protocol.h:770
Definition protocol.h:1294
Definition uuid_manager.h:17
Definition server.h:41
const char * m_pName
Definition server.h:42
const CUuid * m_pConnectionId
Definition server.h:47
int m_Latency
Definition server.h:43
int m_DDNetVersion
Definition server.h:45
bool m_GotDDNetVersion
Definition server.h:44
const char * m_pDDNetVersionStr
Definition server.h:46
Definition types.h:72
Definition hash.h:15
Definition score.cpp:22
Definition protocol7.h:520
Definition protocol7.h:1094
Definition protocol7.h:248
#define str_format
Definition system.cpp:3110