From 48bfecc0d3cd47c15d51b3f189d528feda93aad3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Wed, 22 Nov 2023 17:57:42 +0100 Subject: [PATCH] Ensure debug dummies are not included in server info Also fix normal clients being disconnected/controlled like debug dummies. Closes #7523. --- src/engine/server/server.cpp | 21 +++++++++++++-------- src/engine/server/server.h | 6 ++++++ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp index 0773ed7a1..b26c911c1 100644 --- a/src/engine/server/server.cpp +++ b/src/engine/server/server.cpp @@ -573,6 +573,7 @@ int CServer::Init() Client.m_Traffic = 0; Client.m_TrafficSince = 0; Client.m_ShowIps = false; + Client.m_DebugDummy = false; Client.m_AuthKey = -1; Client.m_Latency = 0; Client.m_Sixup = false; @@ -1083,6 +1084,7 @@ int CServer::NewClientNoAuthCallback(int ClientID, void *pUser) pThis->m_aClients[ClientID].m_AuthTries = 0; pThis->m_aClients[ClientID].m_pRconCmdToSend = 0; pThis->m_aClients[ClientID].m_ShowIps = false; + pThis->m_aClients[ClientID].m_DebugDummy = false; pThis->m_aClients[ClientID].m_DDNetVersion = VERSION_NONE; pThis->m_aClients[ClientID].m_GotDDNetVersionPacket = false; pThis->m_aClients[ClientID].m_DDNetVersionSettled = false; @@ -1114,6 +1116,7 @@ int CServer::NewClientCallback(int ClientID, void *pUser, bool Sixup) pThis->m_aClients[ClientID].m_Traffic = 0; pThis->m_aClients[ClientID].m_TrafficSince = 0; pThis->m_aClients[ClientID].m_ShowIps = false; + pThis->m_aClients[ClientID].m_DebugDummy = false; pThis->m_aClients[ClientID].m_DDNetVersion = VERSION_NONE; pThis->m_aClients[ClientID].m_GotDDNetVersionPacket = false; pThis->m_aClients[ClientID].m_DDNetVersionSettled = false; @@ -1200,6 +1203,7 @@ int CServer::DelClientCallback(int ClientID, const char *pReason, void *pUser) pThis->m_aClients[ClientID].m_Traffic = 0; pThis->m_aClients[ClientID].m_TrafficSince = 0; pThis->m_aClients[ClientID].m_ShowIps = false; + pThis->m_aClients[ClientID].m_DebugDummy = false; pThis->m_aPrevStates[ClientID] = CClient::STATE_EMPTY; pThis->m_aClients[ClientID].m_Snapshots.PurgeAll(); pThis->m_aClients[ClientID].m_Sixup = false; @@ -1933,7 +1937,7 @@ void CServer::CacheServerInfo(CCache *pCache, int Type, bool SendClients) int PlayerCount = 0, ClientCount = 0; for(int i = 0; i < MAX_CLIENTS; i++) { - if(m_aClients[i].m_State != CClient::STATE_EMPTY) + if(m_aClients[i].IncludedInServerInfo()) { if(GameServer()->IsClientPlayer(i)) PlayerCount++; @@ -2065,7 +2069,7 @@ void CServer::CacheServerInfo(CCache *pCache, int Type, bool SendClients) for(int i = 0; i < MAX_CLIENTS; i++) { - if(m_aClients[i].m_State != CClient::STATE_EMPTY) + if(m_aClients[i].IncludedInServerInfo()) { if(Remaining == 0) { @@ -2147,7 +2151,7 @@ void CServer::CacheServerInfoSixup(CCache *pCache, bool SendClients) int PlayerCount = 0, ClientCount = 0; for(int i = 0; i < MAX_CLIENTS; i++) { - if(m_aClients[i].m_State != CClient::STATE_EMPTY) + if(m_aClients[i].IncludedInServerInfo()) { if(GameServer()->IsClientPlayer(i)) PlayerCount++; @@ -2183,7 +2187,7 @@ void CServer::CacheServerInfoSixup(CCache *pCache, bool SendClients) { for(int i = 0; i < MAX_CLIENTS; i++) { - if(m_aClients[i].m_State != CClient::STATE_EMPTY) + if(m_aClients[i].IncludedInServerInfo()) { Packer.AddString(ClientName(i), MAX_NAME_LENGTH); // client name Packer.AddString(ClientClan(i), MAX_CLAN_LENGTH); // client clan @@ -2286,7 +2290,7 @@ void CServer::UpdateRegisterServerInfo() int PlayerCount = 0, ClientCount = 0; for(int i = 0; i < MAX_CLIENTS; i++) { - if(m_aClients[i].m_State != CClient::STATE_EMPTY) + if(m_aClients[i].IncludedInServerInfo()) { if(GameServer()->IsClientPlayer(i)) PlayerCount++; @@ -2334,7 +2338,7 @@ void CServer::UpdateRegisterServerInfo() bool FirstPlayer = true; for(int i = 0; i < MAX_CLIENTS; i++) { - if(m_aClients[i].m_State != CClient::STATE_EMPTY) + if(m_aClients[i].IncludedInServerInfo()) { char aCName[32]; char aCClan[32]; @@ -2628,17 +2632,18 @@ void CServer::UpdateDebugDummies(bool ForceDisconnect) if(AddDummy && m_aClients[ClientID].m_State == CClient::STATE_EMPTY) { NewClientCallback(ClientID, this, false); + m_aClients[ClientID].m_DebugDummy = true; GameServer()->OnClientConnected(ClientID, nullptr); m_aClients[ClientID].m_State = CClient::STATE_INGAME; str_format(m_aClients[ClientID].m_aName, sizeof(m_aClients[ClientID].m_aName), "Debug dummy %d", DummyIndex + 1); GameServer()->OnClientEnter(ClientID); } - else if(!AddDummy && m_aClients[ClientID].m_State == CClient::STATE_INGAME) + else if(!AddDummy && m_aClients[ClientID].m_DebugDummy) { DelClientCallback(ClientID, "Dropping debug dummy", this); } - if(AddDummy && m_aClients[ClientID].m_State == CClient::STATE_INGAME) + if(AddDummy && m_aClients[ClientID].m_DebugDummy) { CNetObj_PlayerInput Input = {0}; Input.m_Direction = (ClientID & 1) ? -1 : 1; diff --git a/src/engine/server/server.h b/src/engine/server/server.h index 16d442721..3dd469b49 100644 --- a/src/engine/server/server.h +++ b/src/engine/server/server.h @@ -197,6 +197,7 @@ public: int m_NextMapChunk; int m_Flags; bool m_ShowIps; + bool m_DebugDummy; const IConsole::CCommandInfo *m_pRconCmdToSend; @@ -220,6 +221,11 @@ public: std::shared_ptr m_pDnsblLookup; bool m_Sixup; + + bool IncludedInServerInfo() const + { + return m_State != STATE_EMPTY && !m_DebugDummy; + } }; CClient m_aClients[MAX_CLIENTS];