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