diff --git a/src/engine/server.h b/src/engine/server.h index 52f944a3c..191a0a085 100644 --- a/src/engine/server.h +++ b/src/engine/server.h @@ -32,6 +32,7 @@ public: virtual bool ClientIngame(int ClientID) = 0; virtual int GetClientInfo(int ClientID, CClientInfo *pInfo) = 0; virtual void GetClientAddr(int ClientID, char *pAddrStr, int Size) = 0; + virtual void RestrictRconOutput(int ClientID) = 0; virtual int SendMsg(CMsgPacker *pMsg, int Flags, int ClientID) = 0; diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp index 1a18587a5..de49c9447 100644 --- a/src/engine/server/server.cpp +++ b/src/engine/server/server.cpp @@ -313,6 +313,8 @@ CServer::CServer() : m_DemoRecorder(&m_SnapshotDelta) m_RconClientID = IServer::RCON_CID_SERV; m_RconAuthLevel = AUTHED_ADMIN; + m_RconRestrict = -1; + Init(); } @@ -789,7 +791,7 @@ void CServer::SendRconLineAuthed(const char *pLine, void *pUser) for(i = 0; i < MAX_CLIENTS; i++) { - if(pThis->m_aClients[i].m_State != CClient::STATE_EMPTY && pThis->m_aClients[i].m_Authed >= pThis->m_RconAuthLevel) + if(pThis->m_aClients[i].m_State != CClient::STATE_EMPTY && pThis->m_aClients[i].m_Authed >= pThis->m_RconAuthLevel && (pThis->m_RconRestrict == -1 || pThis->m_RconRestrict == i)) pThis->SendRconLine(i, pLine); } diff --git a/src/engine/server/server.h b/src/engine/server/server.h index 09b5ec377..8c99e72e8 100644 --- a/src/engine/server/server.h +++ b/src/engine/server/server.h @@ -169,6 +169,8 @@ public: CRegister m_Register; CMapChecker m_MapChecker; + int m_RconRestrict; + CServer(); int TrySetClientName(int ClientID, const char *pName); @@ -256,6 +258,7 @@ public: int m_aPrevStates[MAX_CLIENTS]; char *GetAnnouncementLine(char const *FileName); unsigned m_AnnouncementLastLine; + void RestrictRconOutput(int ClientID) { m_RconRestrict = ClientID; } }; #endif diff --git a/src/game/server/gamecontext.cpp b/src/game/server/gamecontext.cpp index 3f796cfa1..8a83805e2 100644 --- a/src/game/server/gamecontext.cpp +++ b/src/game/server/gamecontext.cpp @@ -802,9 +802,10 @@ void CGameContext::OnMessage(int MsgID, CUnpacker *pUnpacker, int ClientID) *pMessage = ' '; pMessage++; } - if(pMsg->m_pMessage[0]=='/') + if(pMsg->m_pMessage[0]=='/') // TODO: Add spam protection { m_ChatResponseTargetID = ClientID; + Server()->RestrictRconOutput(ClientID); Console()->SetFlagMask(CFGFLAG_CHAT); if (pPlayer->m_Authed) @@ -821,6 +822,7 @@ void CGameContext::OnMessage(int MsgID, CUnpacker *pUnpacker, int ClientID) Console()->SetAccessLevel(IConsole::ACCESS_LEVEL_ADMIN); Console()->SetFlagMask(CFGFLAG_SERVER); m_ChatResponseTargetID = -1; + Server()->RestrictRconOutput(-1); } else SendChat(ClientID, Team, pMsg->m_pMessage, ClientID);