DDNet 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 "console.h"
7#include "kernel.h"
8#include "message.h"
9
10#include <base/dbg.h>
11#include <base/hash.h>
12#include <base/math.h>
13#include <base/mem.h>
14#include <base/str.h>
15
18
19#include <generated/protocol.h>
20#include <generated/protocol7.h>
21#include <generated/protocolglue.h>
22
23#include <algorithm>
24#include <array>
25#include <optional>
26#include <type_traits>
27
29class IMap;
30class CRconRole;
31
32// When recording a demo on the server, the ClientId -1 is used
33enum
34{
36};
37
38class IServer : public IInterface
39{
41protected:
43
44public:
45 /*
46 Structure: CClientInfo
47 */
57
58 int Tick() const { return m_CurrentGameTick; }
59 int TickSpeed() const { return SERVER_TICK_SPEED; }
60
61 virtual int Port() const = 0;
62 virtual int MaxClients() const = 0;
63 virtual int ClientCount() const = 0;
64 virtual int DistinctClientCount() const = 0;
65 virtual const char *ClientName(int ClientId) const = 0;
66 virtual const char *ClientClan(int ClientId) const = 0;
67 virtual int ClientCountry(int ClientId) const = 0;
68 virtual bool ClientSlotEmpty(int ClientId) const = 0;
69 virtual bool ClientIngame(int ClientId) const = 0;
70 virtual bool GetClientInfo(int ClientId, CClientInfo *pInfo) const = 0;
71 virtual void SetClientDDNetVersion(int ClientId, int DDNetVersion) = 0;
72 virtual const NETADDR *ClientAddr(int ClientId) const = 0;
73 virtual const std::array<char, NETADDR_MAXSTRSIZE> &ClientAddrStringImpl(int ClientId, bool IncludePort) const = 0;
74 const char *ClientAddrString(int ClientId, bool IncludePort) const { return ClientAddrStringImpl(ClientId, IncludePort).data(); }
75
86 virtual int GetClientVersion(int ClientId) const = 0;
87 virtual int SendMsg(CMsgPacker *pMsg, int Flags, int ClientId) = 0;
88
89 template<class T>
90 requires(!protocol7::is_sixup<T>::value)
91 int SendPackMsg(const T *pMsg, int Flags, int ClientId)
92 {
93 int Result = 0;
94 if(ClientId == -1)
95 {
96 for(int i = 0; i < MaxClients(); i++)
97 if(ClientIngame(i))
98 Result = SendPackMsgTranslate(pMsg, Flags, i);
99 }
100 else
101 {
102 Result = SendPackMsgTranslate(pMsg, Flags, ClientId);
103 }
104 return Result;
105 }
106
107 template<class T>
108 requires(protocol7::is_sixup<T>::value)
109 int SendPackMsg(const T *pMsg, int Flags, int ClientId)
110 {
111 int Result = 0;
112 if(ClientId == -1)
113 {
114 for(int i = 0; i < MaxClients(); i++)
115 if(ClientIngame(i) && IsSixup(i))
116 Result = SendPackMsgTranslate(pMsg, Flags, i);
117 }
118 else if(IsSixup(ClientId))
119 {
120 Result = SendPackMsgTranslate(pMsg, Flags, ClientId);
121 }
122
123 return Result;
124 }
125
126 template<class T>
127 int SendPackMsgTranslate(const T *pMsg, int Flags, int ClientId)
128 {
129 return SendPackMsgOne(pMsg, Flags, ClientId);
130 }
131
132 int SendPackMsgTranslate(const CNetMsg_Sv_Chat *pMsg, int Flags, int ClientId)
133 {
134 protocol7::CNetMsg_Sv_Chat Msg;
135 Msg.m_ClientId = pMsg->m_ClientId;
136 Msg.m_Mode = pMsg->m_Team ? protocol7::CHAT_TEAM : protocol7::CHAT_ALL;
137 Msg.m_pMessage = pMsg->m_pMessage;
138 Msg.m_TargetId = -1;
139 return SendPackMsgTranslateChat(&Msg, Flags, ClientId);
140 }
141
142 // This function is directly being called from CGameContext.
143 // Whisper will always be managed in 0.7 format and only in this function properly
144 // translated for either 0.6 or 0.7 connection including 128p translation.
145 int SendPackMsgTranslateChat(const protocol7::CNetMsg_Sv_Chat *pMsg, int Flags, int ClientId)
146 {
147 protocol7::CNetMsg_Sv_Chat MsgCopy = *pMsg;
148
149 // 0.6 whisper send/recv
150 int WhisperSend = TEAM_WHISPER_SEND + (int)protocol7::NUM_CHATS;
151 int WhisperRecv = TEAM_WHISPER_RECV + (int)protocol7::NUM_CHATS;
152 int *pId = MsgCopy.m_Mode == WhisperSend ? &MsgCopy.m_TargetId : &MsgCopy.m_ClientId;
153
154 // 128 player translation
155 char aBuf[512];
156 if(!ClientSupportsServerMaxClients(ClientId))
157 {
158 // force "Name: message" for team messages from other players to not show duplicate messages when dummy is connected
159 if(*pId >= 0 && ((MsgCopy.m_Mode == protocol7::CHAT_TEAM && *pId != ClientId) || MsgCopy.m_Mode == WhisperRecv || !Translate(*pId, ClientId)))
160 {
161 str_format(aBuf, sizeof(aBuf), "%s: %s", ClientName(*pId), MsgCopy.m_pMessage);
162 MsgCopy.m_pMessage = aBuf;
163
164 // with noname and sending a whisper to ourselves show our own client id as targetid because otherwise it would be two times id 63 with same text which gets shown twice the same msg
165 if(MsgCopy.m_Mode == WhisperSend && *pId == ClientId)
166 Translate(*pId, ClientId);
167 else
168 *pId = GetMaxClients(ClientId) - 1;
169 }
170 }
171
172 if(IsSixup(ClientId))
173 {
174 if(MsgCopy.m_Mode == WhisperSend)
175 {
176 Translate(MsgCopy.m_ClientId, ClientId);
177 MsgCopy.m_Mode = protocol7::CHAT_WHISPER;
178 }
179 else if(MsgCopy.m_Mode == WhisperRecv)
180 {
181 Translate(MsgCopy.m_TargetId, ClientId);
182 MsgCopy.m_Mode = protocol7::CHAT_WHISPER;
183 }
184 return SendPackMsgOne(&MsgCopy, Flags, ClientId);
185 }
186
187 CNetMsg_Sv_Chat Msg;
188 if(MsgCopy.m_Mode == WhisperSend || MsgCopy.m_Mode == WhisperRecv)
189 Msg.m_Team = MsgCopy.m_Mode - protocol7::NUM_CHATS;
190 else
191 Msg.m_Team = (int)(MsgCopy.m_Mode == protocol7::CHAT_TEAM);
192 Msg.m_ClientId = *pId;
193 Msg.m_pMessage = MsgCopy.m_pMessage;
194 return SendPackMsgOne(&Msg, Flags, ClientId);
195 }
196
197 int SendPackMsgTranslate(const CNetMsg_Sv_KillMsg *pMsg, int Flags, int ClientId)
198 {
199 CNetMsg_Sv_KillMsg MsgCopy = *pMsg;
200 if(!Translate(MsgCopy.m_Victim, ClientId))
201 return 0;
202 if(!Translate(MsgCopy.m_Killer, ClientId))
203 MsgCopy.m_Killer = MsgCopy.m_Victim;
204 return SendPackMsgOne(&MsgCopy, Flags, ClientId);
205 }
206
207 int SendPackMsgTranslate(const CNetMsg_Sv_KillMsgTeam *pMsg, int Flags, int ClientId)
208 {
209 CNetMsg_Sv_KillMsgTeam MsgCopy = *pMsg;
210 if(!Translate(MsgCopy.m_First, ClientId))
211 MsgCopy.m_First = -1;
212 return SendPackMsgOne(&MsgCopy, Flags, ClientId);
213 }
214
215 int SendPackMsgTranslate(const CNetMsg_Sv_Emoticon *pMsg, int Flags, int ClientId)
216 {
217 CNetMsg_Sv_Emoticon MsgCopy = *pMsg;
218 return Translate(MsgCopy.m_ClientId, ClientId) && SendPackMsgOne(&MsgCopy, Flags, ClientId);
219 }
220
221 int SendPackMsgTranslate(const protocol7::CNetMsg_Sv_VoteSet *pMsg, int Flags, int ClientId)
222 {
223 protocol7::CNetMsg_Sv_VoteSet MsgCopy = *pMsg;
224 if(!Translate(MsgCopy.m_ClientId, ClientId))
225 MsgCopy.m_ClientId = -1;
226 return SendPackMsgOne(&MsgCopy, Flags, ClientId);
227 }
228
229 int SendPackMsgTranslate(const protocol7::CNetMsg_Sv_Team *pMsg, int Flags, int ClientId)
230 {
231 protocol7::CNetMsg_Sv_Team MsgCopy = *pMsg;
232 return Translate(MsgCopy.m_ClientId, ClientId) && SendPackMsgOne(&MsgCopy, Flags, ClientId);
233 }
234
235 int SendPackMsgTranslate(const protocol7::CNetMsg_Sv_SkinChange *pMsg, int Flags, int ClientId)
236 {
237 protocol7::CNetMsg_Sv_SkinChange MsgCopy = *pMsg;
238 return Translate(MsgCopy.m_ClientId, ClientId) && SendPackMsgOne(&MsgCopy, Flags, ClientId);
239 }
240
241 int SendPackMsgTranslate(const protocol7::CNetMsg_Sv_ClientInfo *pMsg, int Flags, int ClientId)
242 {
243 protocol7::CNetMsg_Sv_ClientInfo MsgCopy = *pMsg;
244 return (Flags & MSGFLAG_NOTRANSLATE || Translate(MsgCopy.m_ClientId, ClientId)) && SendPackMsgOne(&MsgCopy, Flags, ClientId);
245 }
246
247 int SendPackMsgTranslate(const protocol7::CNetMsg_Sv_ClientDrop *pMsg, int Flags, int ClientId)
248 {
249 protocol7::CNetMsg_Sv_ClientDrop MsgCopy = *pMsg;
250 return (Flags & MSGFLAG_NOTRANSLATE || Translate(MsgCopy.m_ClientId, ClientId)) && SendPackMsgOne(&MsgCopy, Flags, ClientId);
251 }
252
253 int SendPackMsgTranslate(const CNetMsg_Sv_RaceFinish *pMsg, int Flags, int ClientId)
254 {
255 if(IsSixup(ClientId))
256 {
257 protocol7::CNetMsg_Sv_RaceFinish Msg7;
258 Msg7.m_ClientId = pMsg->m_ClientId;
259 Msg7.m_Diff = pMsg->m_Diff;
260 Msg7.m_Time = pMsg->m_Time;
261 Msg7.m_RecordPersonal = pMsg->m_RecordPersonal;
262 Msg7.m_RecordServer = pMsg->m_RecordServer;
263 return Translate(Msg7.m_ClientId, ClientId) && SendPackMsgOne(&Msg7, Flags, ClientId);
264 }
265
266 CNetMsg_Sv_RaceFinish MsgCopy = *pMsg;
267 return Translate(MsgCopy.m_ClientId, ClientId) && SendPackMsgOne(&MsgCopy, Flags, ClientId);
268 }
269
270 template<class T>
271 int SendPackMsgOne(const T *pMsg, int Flags, int ClientId)
272 {
273 dbg_assert(ClientId != -1, "SendPackMsgOne called with -1");
274 CMsgPacker Packer(T::ms_MsgId, false, protocol7::is_sixup<T>::value);
275
276 if(pMsg->Pack(&Packer))
277 return -1;
278 return SendMsg(&Packer, Flags, ClientId);
279 }
280
281 bool Translate(int &Target, int ClientId)
282 {
283 // console and server demo pseudo clients operate on untranslated ids (SERVER_DEMO_CLIENT == IConsole::CLIENT_ID_UNSPECIFIED)
284 if(ClientId == SERVER_DEMO_CLIENT || ClientId == IConsole::CLIENT_ID_GAME || ClientId == IConsole::CLIENT_ID_NO_GAME)
285 return true;
287 return true;
288 if(Target < 0 || Target >= MAX_CLIENTS)
289 return false;
290 int *pMap = GetReverseIdMap(ClientId);
291 if(pMap[Target] == -1)
292 return false;
293 Target = pMap[Target];
294 return true;
295 }
296
297 bool ReverseTranslate(int &Target, int ClientId)
298 {
299 // console and server demo pseudo clients operate on untranslated ids (SERVER_DEMO_CLIENT == IConsole::CLIENT_ID_UNSPECIFIED)
300 if(ClientId == SERVER_DEMO_CLIENT || ClientId == IConsole::CLIENT_ID_GAME || ClientId == IConsole::CLIENT_ID_NO_GAME)
301 return true;
303 return true;
304 if(Target < 0 || Target >= GetMaxClients(ClientId))
305 return false;
306 int *pMap = GetIdMap(ClientId);
307 if(pMap[Target] == -1)
308 return false;
309 Target = pMap[Target];
310 return true;
311 }
312
313 virtual bool WouldClientNameChange(int ClientId, const char *pNameRequest) = 0;
314 virtual bool WouldClientClanChange(int ClientId, const char *pClanRequest) = 0;
315 virtual void SetClientName(int ClientId, const char *pName) = 0;
316 virtual void SetClientClan(int ClientId, const char *pClan) = 0;
317 virtual void SetClientCountry(int ClientId, int Country) = 0;
318 virtual void SetClientScore(int ClientId, std::optional<int> Score) = 0;
319 virtual void SetClientFlags(int ClientId, int Flags) = 0;
320
321 virtual std::optional<int> SnapNewId() = 0;
322 virtual void SnapFreeId(int Id) = 0;
323 virtual bool SnapNewItem(int Type, int Id, const void *pData, int Size) = 0;
324
325 template<typename T>
326 bool SnapNewItem(int Id, const T &Data)
327 {
328 const int Type = protocol7::is_sixup<T>::value ? -T::ms_MsgId : T::ms_MsgId;
329 return SnapNewItem(Type, Id, &Data, sizeof(Data));
330 }
331
332 virtual void SnapSetStaticsize(int ItemType, int Size) = 0;
333 virtual void SnapSetStaticsize7(int ItemType, int Size) = 0;
334
335 enum
336 {
339 };
340 virtual void SetRconCid(int ClientId) = 0;
341 virtual int GetAuthedState(int ClientId) const = 0;
342 virtual bool IsRconAuthed(int ClientId) const = 0;
343 virtual bool IsRconAuthedAdmin(int ClientId) const = 0;
344 virtual const char *GetAuthName(int ClientId) const = 0;
345 virtual bool HasAuthHidden(int ClientId) const = 0;
346 virtual void Kick(int ClientId, const char *pReason) = 0;
347 virtual void Ban(int ClientId, int Seconds, const char *pReason, bool VerbatimReason) = 0;
348 virtual void RedirectClient(int ClientId, int Port) = 0;
349 virtual void ChangeMap(const char *pMap) = 0;
350 virtual void ReloadMap() = 0;
351
353
354 // DDRace
355
356 virtual void SaveDemo(int ClientId, float Time) = 0;
357 virtual void StartRecord(int ClientId) = 0;
358 virtual void StopRecord(int ClientId) = 0;
359 virtual bool IsRecording(int ClientId) = 0;
360 virtual void StopDemos() = 0;
361
362 virtual int *GetIdMap(int ClientId) = 0;
363 virtual int *GetReverseIdMap(int ClientId) = 0;
364
365 virtual bool DnsblWhite(int ClientId) = 0;
366 virtual bool DnsblPending(int ClientId) = 0;
367 virtual bool DnsblBlack(int ClientId) = 0;
368 virtual const char *GetAnnouncementLine() = 0;
369 virtual bool ClientPrevIngame(int ClientId) = 0;
370 virtual const char *GetNetErrorString(int ClientId) = 0;
371 virtual void ResetNetErrorString(int ClientId) = 0;
372 virtual bool SetTimedOut(int ClientId, int OrigId) = 0;
373 virtual void SetTimeoutProtected(int ClientId) = 0;
374
375 virtual void SetErrorShutdown(const char *pReason) = 0;
376 virtual void ExpireServerInfo() = 0;
377
378 virtual void FillAntibot(CAntibotRoundData *pData) = 0;
379
380 virtual void SendMsgRaw(int ClientId, const void *pData, int Size, int Flags) = 0;
381
382 virtual bool IsSixup(int ClientId) const = 0;
383 virtual int GetMaxClients(int ClientId) const = 0;
384 virtual bool ClientSupportsServerMaxClients(int ClientId) const = 0;
385};
386
388{
389 MACRO_INTERFACE("gameserver")
390protected:
391public:
392 // `pPersistentData` may be null if this is the first time `IGameServer`
393 // is instantiated.
394 virtual void OnInit(const void *pPersistentData) = 0;
395 virtual void OnConsoleInit() = 0;
396 // Returns `true` if map change accepted.
397 [[nodiscard]] virtual bool OnMapChange(char *pNewMapName, int MapNameSize) = 0;
398 // `pPersistentData` may be null if this is the last time `IGameServer`
399 // is destroyed.
400 virtual void OnShutdown(void *pPersistentData) = 0;
401
402 virtual void OnTick() = 0;
403
404 // Snap for a specific client.
405 //
406 // GlobalSnap is true when sending snapshots to all clients,
407 // otherwise only forced high bandwidth clients would receive snap.
408 // RecordingDemo is true when this snapshot will be recorded to a demo.
409 virtual void OnSnap(int ClientId, bool GlobalSnap, bool RecordingDemo) = 0;
410
411 // Called after sending snapshots to all clients.
412 //
413 // Note if any client has force high bandwidth enabled,
414 // this will not be called when only sending snapshots to these clients.
415 virtual void OnPostGlobalSnap() = 0;
416
417 virtual void OnMessage(int MsgId, CUnpacker *pUnpacker, int ClientId) = 0;
418
419 // Called before map reload, for any data that the game wants to
420 // persist to the next map.
421 //
422 // Has the size of the return value of `PersistentClientDataSize()`.
423 //
424 // Returns whether the game should be supplied with the data when the
425 // client connects for the next map.
426 virtual bool OnClientDataPersist(int ClientId, void *pData) = 0;
427
428 // Called when a client connects.
429 //
430 // If it is reconnecting to the game after a map change, the
431 // `pPersistentData` point is nonnull and contains the data the game
432 // previously stored.
433 virtual void OnClientConnected(int ClientId, void *pPersistentData) = 0;
434
435 virtual void OnClientEnter(int ClientId) = 0;
436 virtual void OnClientDrop(int ClientId, const char *pReason) = 0;
437 // Called when the name, clan or country the server keeps for a client changed.
438 virtual void OnClientInfoChange(int ClientId) = 0;
439 virtual void OnClientPrepareInput(int ClientId, void *pInput) = 0;
440 virtual void OnClientDirectInput(int ClientId, const void *pInput) = 0;
441 virtual void OnClientPredictedInput(int ClientId, const void *pInput) = 0;
442 virtual void OnClientPredictedEarlyInput(int ClientId, const void *pInput) = 0;
443
444 virtual void PreInputClients(int ClientId, bool *pClients) = 0;
445
446 virtual bool IsClientReady(int ClientId) const = 0;
447 virtual bool IsClientPlayer(int ClientId) const = 0;
448 virtual bool IsClientHighBandwidth(int ClientId) const = 0;
449
450 virtual int PersistentDataSize() const = 0;
451 virtual int PersistentClientDataSize() const = 0;
452
453 virtual CUuid GameUuid() const = 0;
454 virtual const char *GameType() const = 0;
455 virtual const char *Version() const = 0;
456 virtual const char *NetVersion() const = 0;
457
458 virtual IMap *Map() = 0;
459 virtual const IMap *Map() const = 0;
460 virtual CNetObjHandler *GetNetObjHandler() = 0;
461 virtual protocol7::CNetObjHandler *GetNetObjHandler7() = 0;
462
463 // DDRace
464
465 virtual void OnPreTickTeehistorian() = 0;
466
467 virtual void OnClientRejoin(int ClientId) = 0;
468 virtual void ReinitPlayerMap(int ClientId, bool Timeout) = 0;
469 virtual void OnSetAuthed(int ClientId, CRconRole *pRole) = 0;
470 virtual bool PlayerExists(int ClientId) const = 0;
471
472 virtual void TeehistorianRecordAntibot(const void *pData, int DataSize) = 0;
473 virtual void TeehistorianRecordPlayerJoin(int ClientId, bool Sixup) = 0;
474 virtual void TeehistorianRecordPlayerDrop(int ClientId, const char *pReason) = 0;
475 virtual void TeehistorianRecordPlayerRejoin(int ClientId) = 0;
476 virtual void TeehistorianRecordPlayerName(int ClientId, const char *pName) = 0;
477 virtual void TeehistorianRecordPlayerFinish(int ClientId, int TimeTicks) = 0;
478 virtual void TeehistorianRecordTeamFinish(int TeamId, int TimeTicks) = 0;
479 virtual void TeehistorianRecordAuthLogin(int ClientId, const char *pRoleName, const char *pAuthName) = 0;
480
481 virtual void FillAntibot(CAntibotRoundData *pData) = 0;
482
489 virtual void OnUpdatePlayerServerInfo(CJsonWriter *pJsonWriter, int ClientId) = 0;
490};
491
493#endif
Definition jsonwriter.h:15
Definition message.h:10
Definition authmanager.h:32
Definition packer.h:54
@ CLIENT_ID_NO_GAME
Definition console.h:51
@ CLIENT_ID_GAME
Definition console.h:50
Definition server.h:388
virtual const char * GameType() const =0
virtual void TeehistorianRecordPlayerFinish(int ClientId, int TimeTicks)=0
virtual void OnSetAuthed(int ClientId, CRconRole *pRole)=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 OnUpdatePlayerServerInfo(CJsonWriter *pJsonWriter, int ClientId)=0
virtual void FillAntibot(CAntibotRoundData *pData)=0
virtual IMap * Map()=0
virtual void OnClientPredictedInput(int ClientId, const void *pInput)=0
virtual CUuid GameUuid() const =0
virtual void OnPostGlobalSnap()=0
virtual void OnClientRejoin(int ClientId)=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 TeehistorianRecordAuthLogin(int ClientId, const char *pRoleName, const char *pAuthName)=0
virtual void OnClientEnter(int ClientId)=0
virtual void TeehistorianRecordAntibot(const void *pData, int DataSize)=0
virtual void OnClientInfoChange(int ClientId)=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 void OnSnap(int ClientId, bool GlobalSnap, bool RecordingDemo)=0
virtual int PersistentClientDataSize() const =0
virtual bool IsClientHighBandwidth(int ClientId) const =0
virtual void OnInit(const void *pPersistentData)=0
virtual void ReinitPlayerMap(int ClientId, bool Timeout)=0
IInterface()
Definition kernel.h:19
Definition map.h:20
Definition server.h:39
virtual int ClientCount() const =0
virtual void RedirectClient(int ClientId, int Port)=0
virtual void SetTimeoutProtected(int ClientId)=0
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:253
virtual bool SnapNewItem(int Type, int Id, const void *pData, int Size)=0
virtual void SetRconCid(int ClientId)=0
bool SnapNewItem(int Id, const T &Data)
Definition server.h:326
virtual bool WouldClientClanChange(int ClientId, const char *pClanRequest)=0
int SendPackMsgTranslateChat(const protocol7::CNetMsg_Sv_Chat *pMsg, int Flags, int ClientId)
Definition server.h:145
virtual void SetClientName(int ClientId, const char *pName)=0
virtual bool WouldClientNameChange(int ClientId, const char *pNameRequest)=0
bool ReverseTranslate(int &Target, int ClientId)
Definition server.h:297
int SendPackMsgTranslate(const T *pMsg, int Flags, int ClientId)
Definition server.h:127
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:58
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:132
virtual void StopDemos()=0
virtual void ExpireServerInfo()=0
int SendPackMsgTranslate(const protocol7::CNetMsg_Sv_ClientInfo *pMsg, int Flags, int ClientId)
Definition server.h:241
virtual int ClientCountry(int ClientId) const =0
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
bool Translate(int &Target, int ClientId)
Definition server.h:281
virtual int * GetIdMap(int ClientId)=0
virtual void ReloadMap()=0
virtual void ChangeMap(const char *pMap)=0
virtual bool ClientPrevIngame(int ClientId)=0
int SendPackMsgTranslate(const protocol7::CNetMsg_Sv_ClientDrop *pMsg, int Flags, int ClientId)
Definition server.h:247
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
int SendPackMsg(const T *pMsg, int Flags, int ClientId)
Definition server.h:109
virtual bool IsRconAuthed(int ClientId) const =0
virtual int GetMaxClients(int ClientId) const =0
const char * ClientAddrString(int ClientId, bool IncludePort) const
Definition server.h:74
virtual bool IsRecording(int ClientId)=0
int SendPackMsgOne(const T *pMsg, int Flags, int ClientId)
Definition server.h:271
virtual int DistinctClientCount() const =0
int TickSpeed() const
Definition server.h:59
virtual const char * ClientName(int ClientId) const =0
int m_CurrentGameTick
Definition server.h:42
virtual int GetAuthedState(int ClientId) const =0
virtual void SetClientDDNetVersion(int ClientId, int DDNetVersion)=0
virtual void SnapSetStaticsize7(int ItemType, int Size)=0
virtual void DemoRecorder_HandleAutoStart()=0
int SendPackMsgTranslate(const protocol7::CNetMsg_Sv_SkinChange *pMsg, int Flags, int ClientId)
Definition server.h:235
virtual bool HasAuthHidden(int ClientId) const =0
@ RCON_CID_VOTE
Definition server.h:338
@ RCON_CID_SERV
Definition server.h:337
virtual void SetClientClan(int ClientId, const char *pClan)=0
virtual bool ClientIngame(int ClientId) const =0
virtual int * GetReverseIdMap(int ClientId)=0
virtual void StopRecord(int ClientId)=0
virtual void SetClientCountry(int ClientId, int Country)=0
int SendPackMsg(const T *pMsg, int Flags, int ClientId)
Definition server.h:91
int SendPackMsgTranslate(const CNetMsg_Sv_KillMsg *pMsg, int Flags, int ClientId)
Definition server.h:197
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
int SendPackMsgTranslate(const CNetMsg_Sv_KillMsgTeam *pMsg, int Flags, int ClientId)
Definition server.h:207
virtual void StartRecord(int ClientId)=0
int SendPackMsgTranslate(const CNetMsg_Sv_Emoticon *pMsg, int Flags, int ClientId)
Definition server.h:215
virtual int GetClientVersion(int ClientId) const =0
int SendPackMsgTranslate(const protocol7::CNetMsg_Sv_VoteSet *pMsg, int Flags, int ClientId)
Definition server.h:221
virtual bool ClientSupportsServerMaxClients(int ClientId) const =0
int SendPackMsgTranslate(const protocol7::CNetMsg_Sv_Team *pMsg, int Flags, int ClientId)
Definition server.h:229
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 std::optional< int > SnapNewId()=0
virtual bool SetTimedOut(int ClientId, int OrigId)=0
virtual bool ClientSlotEmpty(int ClientId) const =0
#define dbg_assert(test, fmt,...)
Definition dbg.h:27
#define MACRO_INTERFACE(Name)
Definition kernel.h:25
Definition protocol7.h:9
@ SERVER_TICK_SPEED
Definition protocol.h:81
@ MSGFLAG_NOTRANSLATE
Definition protocol.h:139
@ MAX_CLIENTS
Definition protocol.h:89
@ SERVER_DEMO_CLIENT
Definition server.h:35
IGameServer * CreateGameServer()
Definition gamecontext.cpp:4712
#define str_format
Definition str.cpp:92
Definition antibot_data.h:111
Definition uuid_manager.h:17
Definition server.h:49
const char * m_pName
Definition server.h:50
const CUuid * m_pConnectionId
Definition server.h:55
int m_Latency
Definition server.h:51
int m_DDNetVersion
Definition server.h:53
bool m_GotDDNetVersion
Definition server.h:52
const char * m_pDDNetVersionStr
Definition server.h:54
Definition types.h:168
Definition score_test.cpp:25