Track spectators for each SourceTV instance seperately
This commit is contained in:
parent
10910e8b8e
commit
61f59c5b9b
16
forwards.cpp
16
forwards.cpp
@ -136,8 +136,9 @@ void CForwardManager::UnhookRecorder(IDemoRecorder *recorder)
|
|||||||
SH_REMOVE_HOOK(IDemoRecorder, StopRecording, recorder, SH_MEMBER(this, &CForwardManager::OnStopRecording_Post), true);
|
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)
|
if (m_bHasClientConnectOffset)
|
||||||
SH_ADD_MANUALHOOK(CHLTVServer_ConnectClient, server, SH_MEMBER(this, &CForwardManager::OnSpectatorConnect), false);
|
SH_ADD_MANUALHOOK(CHLTVServer_ConnectClient, server, SH_MEMBER(this, &CForwardManager::OnSpectatorConnect), false);
|
||||||
|
|
||||||
@ -153,13 +154,14 @@ void CForwardManager::HookServer(IServer *server)
|
|||||||
HookClient(client);
|
HookClient(client);
|
||||||
// Ip and password unknown :(
|
// Ip and password unknown :(
|
||||||
// Could add more gamedata to fetch it if people really lateload the extension and expect it to work :B
|
// 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)
|
if (m_bHasClientConnectOffset)
|
||||||
SH_REMOVE_MANUALHOOK(CHLTVServer_ConnectClient, server, SH_MEMBER(this, &CForwardManager::OnSpectatorConnect), false);
|
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);
|
HookClient(client);
|
||||||
|
|
||||||
HLTVClientWrapper *wrapper = g_HLTVClientManager.GetClient(client->GetPlayerSlot() + 1);
|
HLTVServerWrapper *wrapper = g_HLTVServers.GetWrapper(server);
|
||||||
wrapper->Initialize(ipString, pchPassword, client);
|
if (wrapper)
|
||||||
|
{
|
||||||
|
HLTVClientWrapper *clientWrapper = wrapper->GetClient(client->GetPlayerSlot() + 1);
|
||||||
|
clientWrapper->Initialize(ipString, pchPassword, client);
|
||||||
|
}
|
||||||
|
|
||||||
m_SpectatorConnectedFwd->PushCell(client->GetPlayerSlot() + 1);
|
m_SpectatorConnectedFwd->PushCell(client->GetPlayerSlot() + 1);
|
||||||
m_SpectatorConnectedFwd->Execute();
|
m_SpectatorConnectedFwd->Execute();
|
||||||
|
@ -42,28 +42,3 @@ void HLTVClientWrapper::Kick(const char *reason)
|
|||||||
// Go this route due to different IClient::Disconnect signatures in games..
|
// Go this route due to different IClient::Disconnect signatures in games..
|
||||||
m_Client->GetServer()->DisconnectClient(m_Client, reason);
|
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;
|
|
@ -56,16 +56,4 @@ private:
|
|||||||
ke::AString m_Password;
|
ke::AString m_Password;
|
||||||
IClient *m_Client;
|
IClient *m_Client;
|
||||||
};
|
};
|
||||||
|
|
||||||
class HLTVClientManager {
|
|
||||||
|
|
||||||
public:
|
|
||||||
HLTVClientWrapper *GetClient(int index);
|
|
||||||
|
|
||||||
private:
|
|
||||||
ke::Vector<ke::AutoPtr<HLTVClientWrapper>> m_Clients;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern HLTVClientManager g_HLTVClientManager;
|
|
||||||
|
|
||||||
#endif // _INCLUDE_SOURCEMOD_EXTENSION_HLTVCLIENT_H_
|
#endif // _INCLUDE_SOURCEMOD_EXTENSION_HLTVCLIENT_H_
|
@ -65,12 +65,34 @@ int HLTVServerWrapper::GetInstanceNumber()
|
|||||||
return g_HLTVServers.GetInstanceNumber(m_HLTVServer);
|
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()
|
void HLTVServerWrapper::Hook()
|
||||||
{
|
{
|
||||||
if (!m_Connected)
|
if (!m_Connected)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
g_pSTVForwards.HookServer(m_HLTVServer->GetBaseServer());
|
g_pSTVForwards.HookServer(this);
|
||||||
g_pSTVForwards.HookRecorder(m_DemoRecorder);
|
g_pSTVForwards.HookRecorder(m_DemoRecorder);
|
||||||
|
|
||||||
if (g_HLTVServers.HasShutdownOffset())
|
if (g_HLTVServers.HasShutdownOffset())
|
||||||
@ -95,7 +117,7 @@ void HLTVServerWrapper::Unhook()
|
|||||||
if (!m_Connected)
|
if (!m_Connected)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
g_pSTVForwards.UnhookServer(m_HLTVServer->GetBaseServer());
|
g_pSTVForwards.UnhookServer(this);
|
||||||
g_pSTVForwards.UnhookRecorder(m_DemoRecorder);
|
g_pSTVForwards.UnhookRecorder(m_DemoRecorder);
|
||||||
|
|
||||||
if (g_HLTVServers.HasShutdownOffset())
|
if (g_HLTVServers.HasShutdownOffset())
|
||||||
@ -277,6 +299,17 @@ HLTVServerWrapper *HLTVServerWrapperManager::GetWrapper(IHLTVServer *hltvserver)
|
|||||||
return nullptr;
|
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)
|
HLTVServerWrapper *HLTVServerWrapperManager::GetWrapper(IDemoRecorder *demorecorder)
|
||||||
{
|
{
|
||||||
for (unsigned int i = 0; i < m_HLTVServers.length(); i++)
|
for (unsigned int i = 0; i < m_HLTVServers.length(); i++)
|
||||||
|
@ -44,6 +44,7 @@ public:
|
|||||||
IHLTVServer *GetHLTVServer();
|
IHLTVServer *GetHLTVServer();
|
||||||
IServer *GetBaseServer();
|
IServer *GetBaseServer();
|
||||||
IDemoRecorder *GetDemoRecorder();
|
IDemoRecorder *GetDemoRecorder();
|
||||||
|
HLTVClientWrapper *GetClient(int index);
|
||||||
int GetInstanceNumber();
|
int GetInstanceNumber();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -63,6 +64,7 @@ private:
|
|||||||
bool m_Connected = false;
|
bool m_Connected = false;
|
||||||
IHLTVServer *m_HLTVServer = nullptr;
|
IHLTVServer *m_HLTVServer = nullptr;
|
||||||
IDemoRecorder *m_DemoRecorder = nullptr;
|
IDemoRecorder *m_DemoRecorder = nullptr;
|
||||||
|
ke::Vector<ke::AutoPtr<HLTVClientWrapper>> m_Clients;
|
||||||
};
|
};
|
||||||
|
|
||||||
class HLTVServerWrapperManager
|
class HLTVServerWrapperManager
|
||||||
@ -73,6 +75,7 @@ public:
|
|||||||
void AddServer(IHLTVServer *hltvserver);
|
void AddServer(IHLTVServer *hltvserver);
|
||||||
void RemoveServer(IHLTVServer *hltvserver, bool bInformPlugins);
|
void RemoveServer(IHLTVServer *hltvserver, bool bInformPlugins);
|
||||||
HLTVServerWrapper *GetWrapper(IHLTVServer *hltvserver);
|
HLTVServerWrapper *GetWrapper(IHLTVServer *hltvserver);
|
||||||
|
HLTVServerWrapper *GetWrapper(IServer *server);
|
||||||
HLTVServerWrapper *GetWrapper(IDemoRecorder *demorecorder);
|
HLTVServerWrapper *GetWrapper(IDemoRecorder *demorecorder);
|
||||||
int GetInstanceNumber(IHLTVServer *hltvserver);
|
int GetInstanceNumber(IHLTVServer *hltvserver);
|
||||||
|
|
||||||
|
10
natives.cpp
10
natives.cpp
@ -619,7 +619,7 @@ static cell_t Native_IsClientConnected(IPluginContext *pContext, const cell_t *p
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
HLTVClientWrapper *pClient = g_HLTVClientManager.GetClient(client);
|
HLTVClientWrapper *pClient = hltvserver->GetClient(client);
|
||||||
return pClient->IsConnected();
|
return pClient->IsConnected();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -636,7 +636,7 @@ static cell_t Native_GetSpectatorName(IPluginContext *pContext, const cell_t *pa
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
HLTVClientWrapper *pClient = g_HLTVClientManager.GetClient(client);
|
HLTVClientWrapper *pClient = hltvserver->GetClient(client);
|
||||||
if (!pClient->IsConnected())
|
if (!pClient->IsConnected())
|
||||||
{
|
{
|
||||||
pContext->ReportError("Client %d is not connected.", client);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
HLTVClientWrapper *pClient = g_HLTVClientManager.GetClient(client);
|
HLTVClientWrapper *pClient = hltvserver->GetClient(client);
|
||||||
if (!pClient->IsConnected())
|
if (!pClient->IsConnected())
|
||||||
{
|
{
|
||||||
pContext->ReportError("Client %d is not connected.", client);
|
pContext->ReportError("Client %d is not connected.", client);
|
||||||
@ -684,7 +684,7 @@ static cell_t Native_GetSpectatorPassword(IPluginContext *pContext, const cell_t
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
HLTVClientWrapper *pClient = g_HLTVClientManager.GetClient(client);
|
HLTVClientWrapper *pClient = hltvserver->GetClient(client);
|
||||||
if (!pClient->IsConnected())
|
if (!pClient->IsConnected())
|
||||||
{
|
{
|
||||||
pContext->ReportError("Client %d is not connected.", client);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
HLTVClientWrapper *pClient = g_HLTVClientManager.GetClient(client);
|
HLTVClientWrapper *pClient = hltvserver->GetClient(client);
|
||||||
if (!pClient->IsConnected())
|
if (!pClient->IsConnected())
|
||||||
{
|
{
|
||||||
pContext->ReportError("Client %d is not connected.", client);
|
pContext->ReportError("Client %d is not connected.", client);
|
||||||
|
Loading…
Reference in New Issue
Block a user