From 61f59c5b9b8a53b8f55bc4cadc7b73c1ecf7f02e Mon Sep 17 00:00:00 2001 From: Peace-Maker Date: Sun, 6 Mar 2016 12:50:07 +0100 Subject: [PATCH] Track spectators for each SourceTV instance seperately --- forwards.cpp | 16 +++++++++++----- hltvclientwrapper.cpp | 25 ------------------------- hltvclientwrapper.h | 12 ------------ hltvserverwrapper.cpp | 37 +++++++++++++++++++++++++++++++++++-- hltvserverwrapper.h | 3 +++ natives.cpp | 10 +++++----- 6 files changed, 54 insertions(+), 49 deletions(-) diff --git a/forwards.cpp b/forwards.cpp index 9f9e3d6..2854bce 100644 --- a/forwards.cpp +++ b/forwards.cpp @@ -136,8 +136,9 @@ void CForwardManager::UnhookRecorder(IDemoRecorder *recorder) SH_REMOVE_HOOK(IDemoRecorder, StopRecording, recorder, SH_MEMBER(this, &CForwardManager::OnStopRecording_Post), true); } -void CForwardManager::HookServer(IServer *server) +void CForwardManager::HookServer(HLTVServerWrapper *wrapper) { + IServer *server = wrapper->GetBaseServer(); if (m_bHasClientConnectOffset) SH_ADD_MANUALHOOK(CHLTVServer_ConnectClient, server, SH_MEMBER(this, &CForwardManager::OnSpectatorConnect), false); @@ -153,13 +154,14 @@ void CForwardManager::HookServer(IServer *server) HookClient(client); // Ip and password unknown :( // Could add more gamedata to fetch it if people really lateload the extension and expect it to work :B - g_HLTVClientManager.GetClient(i + 1)->Initialize("", "", client); + wrapper->GetClient(i + 1)->Initialize("", "", client); } } } -void CForwardManager::UnhookServer(IServer *server) +void CForwardManager::UnhookServer(HLTVServerWrapper *wrapper) { + IServer *server = wrapper->GetBaseServer(); if (m_bHasClientConnectOffset) SH_REMOVE_MANUALHOOK(CHLTVServer_ConnectClient, server, SH_MEMBER(this, &CForwardManager::OnSpectatorConnect), false); @@ -297,8 +299,12 @@ IClient *CForwardManager::OnSpectatorConnect(netadr_t & address, int nProtocol, HookClient(client); - HLTVClientWrapper *wrapper = g_HLTVClientManager.GetClient(client->GetPlayerSlot() + 1); - wrapper->Initialize(ipString, pchPassword, client); + HLTVServerWrapper *wrapper = g_HLTVServers.GetWrapper(server); + if (wrapper) + { + HLTVClientWrapper *clientWrapper = wrapper->GetClient(client->GetPlayerSlot() + 1); + clientWrapper->Initialize(ipString, pchPassword, client); + } m_SpectatorConnectedFwd->PushCell(client->GetPlayerSlot() + 1); m_SpectatorConnectedFwd->Execute(); diff --git a/hltvclientwrapper.cpp b/hltvclientwrapper.cpp index 5da679e..ca2dddc 100644 --- a/hltvclientwrapper.cpp +++ b/hltvclientwrapper.cpp @@ -42,28 +42,3 @@ void HLTVClientWrapper::Kick(const char *reason) // Go this route due to different IClient::Disconnect signatures in games.. m_Client->GetServer()->DisconnectClient(m_Client, reason); } - -HLTVClientWrapper *HLTVClientManager::GetClient(int index) -{ - // Grow the vector with null pointers - // There might have been clients with lower indexes before we were loaded. - if (m_Clients.length() < (size_t)index) - { - int start = m_Clients.length(); - m_Clients.resize(index); - for (int i = start; i < index; i++) - { - m_Clients[i] = nullptr; - } - } - - if (!m_Clients[index - 1]) - { - m_Clients[index - 1] = new HLTVClientWrapper(); - } - - return m_Clients[index - 1]; -} - -// FIXME: ClientManager instance for each hltvserver instance in csgo! -HLTVClientManager g_HLTVClientManager; \ No newline at end of file diff --git a/hltvclientwrapper.h b/hltvclientwrapper.h index 171a143..5b2e88f 100644 --- a/hltvclientwrapper.h +++ b/hltvclientwrapper.h @@ -56,16 +56,4 @@ private: ke::AString m_Password; IClient *m_Client; }; - -class HLTVClientManager { - -public: - HLTVClientWrapper *GetClient(int index); - -private: - ke::Vector> m_Clients; -}; - -extern HLTVClientManager g_HLTVClientManager; - #endif // _INCLUDE_SOURCEMOD_EXTENSION_HLTVCLIENT_H_ \ No newline at end of file diff --git a/hltvserverwrapper.cpp b/hltvserverwrapper.cpp index 0badc7c..f2c25ef 100644 --- a/hltvserverwrapper.cpp +++ b/hltvserverwrapper.cpp @@ -65,12 +65,34 @@ int HLTVServerWrapper::GetInstanceNumber() return g_HLTVServers.GetInstanceNumber(m_HLTVServer); } +HLTVClientWrapper *HLTVServerWrapper::GetClient(int index) +{ + // Grow the vector with null pointers + // There might have been clients with lower indexes before we were loaded. + if (m_Clients.length() < (size_t)index) + { + int start = m_Clients.length(); + m_Clients.resize(index); + for (int i = start; i < index; i++) + { + m_Clients[i] = nullptr; + } + } + + if (!m_Clients[index - 1]) + { + m_Clients[index - 1] = new HLTVClientWrapper(); + } + + return m_Clients[index - 1]; +} + void HLTVServerWrapper::Hook() { if (!m_Connected) return; - g_pSTVForwards.HookServer(m_HLTVServer->GetBaseServer()); + g_pSTVForwards.HookServer(this); g_pSTVForwards.HookRecorder(m_DemoRecorder); if (g_HLTVServers.HasShutdownOffset()) @@ -95,7 +117,7 @@ void HLTVServerWrapper::Unhook() if (!m_Connected) return; - g_pSTVForwards.UnhookServer(m_HLTVServer->GetBaseServer()); + g_pSTVForwards.UnhookServer(this); g_pSTVForwards.UnhookRecorder(m_DemoRecorder); if (g_HLTVServers.HasShutdownOffset()) @@ -277,6 +299,17 @@ HLTVServerWrapper *HLTVServerWrapperManager::GetWrapper(IHLTVServer *hltvserver) return nullptr; } +HLTVServerWrapper *HLTVServerWrapperManager::GetWrapper(IServer *server) +{ + for (unsigned int i = 0; i < m_HLTVServers.length(); i++) + { + HLTVServerWrapper *wrapper = m_HLTVServers[i]; + if (wrapper->GetBaseServer() == server) + return wrapper; + } + return nullptr; +} + HLTVServerWrapper *HLTVServerWrapperManager::GetWrapper(IDemoRecorder *demorecorder) { for (unsigned int i = 0; i < m_HLTVServers.length(); i++) diff --git a/hltvserverwrapper.h b/hltvserverwrapper.h index 3bddb41..1780c80 100644 --- a/hltvserverwrapper.h +++ b/hltvserverwrapper.h @@ -44,6 +44,7 @@ public: IHLTVServer *GetHLTVServer(); IServer *GetBaseServer(); IDemoRecorder *GetDemoRecorder(); + HLTVClientWrapper *GetClient(int index); int GetInstanceNumber(); private: @@ -63,6 +64,7 @@ private: bool m_Connected = false; IHLTVServer *m_HLTVServer = nullptr; IDemoRecorder *m_DemoRecorder = nullptr; + ke::Vector> m_Clients; }; class HLTVServerWrapperManager @@ -73,6 +75,7 @@ public: void AddServer(IHLTVServer *hltvserver); void RemoveServer(IHLTVServer *hltvserver, bool bInformPlugins); HLTVServerWrapper *GetWrapper(IHLTVServer *hltvserver); + HLTVServerWrapper *GetWrapper(IServer *server); HLTVServerWrapper *GetWrapper(IDemoRecorder *demorecorder); int GetInstanceNumber(IHLTVServer *hltvserver); diff --git a/natives.cpp b/natives.cpp index 4e54faf..c322f1e 100644 --- a/natives.cpp +++ b/natives.cpp @@ -619,7 +619,7 @@ static cell_t Native_IsClientConnected(IPluginContext *pContext, const cell_t *p return 0; } - HLTVClientWrapper *pClient = g_HLTVClientManager.GetClient(client); + HLTVClientWrapper *pClient = hltvserver->GetClient(client); return pClient->IsConnected(); } @@ -636,7 +636,7 @@ static cell_t Native_GetSpectatorName(IPluginContext *pContext, const cell_t *pa return 0; } - HLTVClientWrapper *pClient = g_HLTVClientManager.GetClient(client); + HLTVClientWrapper *pClient = hltvserver->GetClient(client); if (!pClient->IsConnected()) { pContext->ReportError("Client %d is not connected.", client); @@ -660,7 +660,7 @@ static cell_t Native_GetSpectatorIP(IPluginContext *pContext, const cell_t *para return 0; } - HLTVClientWrapper *pClient = g_HLTVClientManager.GetClient(client); + HLTVClientWrapper *pClient = hltvserver->GetClient(client); if (!pClient->IsConnected()) { pContext->ReportError("Client %d is not connected.", client); @@ -684,7 +684,7 @@ static cell_t Native_GetSpectatorPassword(IPluginContext *pContext, const cell_t return 0; } - HLTVClientWrapper *pClient = g_HLTVClientManager.GetClient(client); + HLTVClientWrapper *pClient = hltvserver->GetClient(client); if (!pClient->IsConnected()) { pContext->ReportError("Client %d is not connected.", client); @@ -708,7 +708,7 @@ static cell_t Native_KickClient(IPluginContext *pContext, const cell_t *params) return 0; } - HLTVClientWrapper *pClient = g_HLTVClientManager.GetClient(client); + HLTVClientWrapper *pClient = hltvserver->GetClient(client); if (!pClient->IsConnected()) { pContext->ReportError("Client %d is not connected.", client);