Fix OnSpectatorChatMessage to not include playername
The engine formats the chat message like "Name : Message" before sending it through BroadcastLocalChat. Catch the message beforehand and pass only that to plugins if possible.
This commit is contained in:
		
							parent
							
								
									59aa65d712
								
							
						
					
					
						commit
						b5b2d75c1c
					
				| @ -43,11 +43,13 @@ SH_DECL_HOOK1(IClient, ExecuteStringCommand, SH_NOATTRIB, 0, bool, const char *) | ||||
| void CCommonHooks::AddSpectatorHook(CForwardManager *fwdmgr, IClient *client) | ||||
| { | ||||
| 	SH_ADD_HOOK(IClient, ExecuteStringCommand, client, SH_MEMBER(fwdmgr, &CForwardManager::OnSpectatorExecuteStringCommand), false); | ||||
| 	SH_ADD_HOOK(IClient, ExecuteStringCommand, client, SH_MEMBER(fwdmgr, &CForwardManager::OnSpectatorExecuteStringCommand_Post), true); | ||||
| } | ||||
| 
 | ||||
| void CCommonHooks::RemoveSpectatorHook(CForwardManager *fwdmgr, IClient *client) | ||||
| { | ||||
| 	SH_REMOVE_HOOK(IClient, ExecuteStringCommand, client, SH_MEMBER(fwdmgr, &CForwardManager::OnSpectatorExecuteStringCommand), false); | ||||
| 	SH_REMOVE_HOOK(IClient, ExecuteStringCommand, client, SH_MEMBER(fwdmgr, &CForwardManager::OnSpectatorExecuteStringCommand_Post), true); | ||||
| } | ||||
| 
 | ||||
| void CCommonHooks::AddHLTVClientHook(HLTVServerWrapper *wrapper, IClient *client) | ||||
|  | ||||
							
								
								
									
										78
									
								
								forwards.cpp
									
									
									
									
									
								
							
							
						
						
									
										78
									
								
								forwards.cpp
									
									
									
									
									
								
							| @ -434,6 +434,9 @@ void CForwardManager::OnSpectatorPutInServer() | ||||
| 
 | ||||
| bool CForwardManager::OnSpectatorExecuteStringCommand(const char *s) | ||||
| { | ||||
| 	if (!hltvserver) | ||||
| 		RETURN_META_VALUE(MRES_IGNORED, true); | ||||
| 
 | ||||
| 	IClient *client = META_IFACEPTR(IClient); | ||||
| 	if (!s || !s[0]) | ||||
| 		RETURN_META_VALUE(MRES_IGNORED, true); | ||||
| @ -450,43 +453,72 @@ bool CForwardManager::OnSpectatorExecuteStringCommand(const char *s) | ||||
| 		// Save the client index and message.
 | ||||
| 		hltvserver->SetLastChatClient(client); | ||||
| 		hltvserver->SetLastChatMessage(args[1]); | ||||
| 
 | ||||
| 		/*bool ret = SH_CALL(client, &IClient::ExecuteStringCommand)(s);
 | ||||
| 
 | ||||
| 		hltvserver->SetLastChatClient(0); | ||||
| 		hltvserver->SetLastChatMessage(nullptr); | ||||
| 		RETURN_META_VALUE(MRES_SUPERCEDE, ret);*/ | ||||
| 	} | ||||
| 
 | ||||
| 	RETURN_META_VALUE(MRES_IGNORED, true); | ||||
| } | ||||
| 
 | ||||
| // Reset the pointers after the command was executed.
 | ||||
| bool CForwardManager::OnSpectatorExecuteStringCommand_Post(const char *s) | ||||
| { | ||||
| 	if (!hltvserver) | ||||
| 		RETURN_META_VALUE(MRES_IGNORED, true); | ||||
| 
 | ||||
| 	// TODO find correct hltvserver this client is connected to!
 | ||||
| 
 | ||||
| 	hltvserver->SetLastChatClient(nullptr); | ||||
| 	hltvserver->SetLastChatMessage(nullptr); | ||||
| 
 | ||||
| 	RETURN_META_VALUE(MRES_IGNORED, true); | ||||
| } | ||||
| 
 | ||||
| DETOUR_DECL_MEMBER2(DetourHLTVServer_BroadcastLocalChat, void, const char *, chat, const char *, chatgroup) | ||||
| { | ||||
| 	// IServer is +8 from CHLTVServer due to multiple inheritance
 | ||||
| 	IServer *server = (IServer *)((intptr_t)this + 8); | ||||
| 	HLTVServerWrapper *wrapper = g_HLTVServers.GetWrapper(server); | ||||
| 
 | ||||
| 	// Copy content in changeable buffer.
 | ||||
| 	char chatBuffer[256], groupBuffer[256]; | ||||
| 	// TODO: Use saved wrapper->GetLastChatMessage() and add "name : " manually again after plugins are done.
 | ||||
| 	ke::SafeStrcpy(chatBuffer, sizeof(chatBuffer), chat); | ||||
| 	ke::SafeStrcpy(groupBuffer, sizeof(groupBuffer), chatgroup); | ||||
| 
 | ||||
| 	// See if we can provide only the chat message without the name printed before.
 | ||||
| 	// The engine formats the chat like "Name : Message" before calling BroadcastLocalChat..
 | ||||
| 	if (wrapper) | ||||
| 	{ | ||||
| 		// Call the forward for this message.
 | ||||
| 		bool supercede = g_pSTVForwards.CallOnSpectatorChatMessage(wrapper, chatBuffer, sizeof(chatBuffer), groupBuffer, sizeof(groupBuffer)); | ||||
| 		if (supercede) | ||||
| 			return; | ||||
| 		const char *msg = wrapper->GetLastChatMessage(); | ||||
| 		// Use only the typed text if possible
 | ||||
| 		if (msg) | ||||
| 			ke::SafeStrcpy(chatBuffer, sizeof(chatBuffer), msg); | ||||
| 	} | ||||
| 
 | ||||
| 	// Call the engine function with our modified parameters.
 | ||||
| 	DETOUR_MEMBER_CALL(DetourHLTVServer_BroadcastLocalChat)(chatBuffer, groupBuffer); | ||||
| 	// Call the forward for this message.
 | ||||
| 	bool supercede = g_pSTVForwards.CallOnSpectatorChatMessage(wrapper, chatBuffer, sizeof(chatBuffer), groupBuffer, sizeof(groupBuffer)); | ||||
| 	if (supercede) | ||||
| 		return; | ||||
| 
 | ||||
| 	// Use the potentially modified strings.
 | ||||
| 	chat = chatBuffer; | ||||
| 	chatgroup = groupBuffer; | ||||
| 
 | ||||
| 	char messageBuffer[1024]; | ||||
| 	// Might have to add the name again, if we had the chat message in our hands.
 | ||||
| 	if (wrapper) | ||||
| 	{ | ||||
| 		g_pSTVForwards.CallOnSpectatorChatMessage_Post(wrapper, chatBuffer, groupBuffer); | ||||
| 		if (wrapper->GetLastChatMessage()) | ||||
| 		{ | ||||
| 			// Format the message the same as the engine does.
 | ||||
| 			ke::SafeSprintf(messageBuffer, sizeof(messageBuffer), "%s : %s", wrapper->GetLastChatClient()->GetClientName(), chatBuffer); | ||||
| 			chat = messageBuffer; | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	// Print the message
 | ||||
| 	DETOUR_MEMBER_CALL(DetourHLTVServer_BroadcastLocalChat)(chat, chatgroup); | ||||
| 	 | ||||
| 	// Call the post message forward with the changed output.
 | ||||
| 	g_pSTVForwards.CallOnSpectatorChatMessage_Post(wrapper, chatBuffer, groupBuffer); | ||||
| } | ||||
| 
 | ||||
| void CForwardManager::CreateBroadcastLocalChatDetour() | ||||
| @ -518,9 +550,12 @@ void CForwardManager::RemoveBroadcastLocalChatDetour() | ||||
| bool CForwardManager::CallOnSpectatorChatMessage(HLTVServerWrapper *server, char *msg, int msglen, char *chatgroup, int grouplen) | ||||
| { | ||||
| 	int clientIndex = 0; | ||||
| 	IClient *client = server->GetLastChatClient(); | ||||
| 	if (client) | ||||
| 		clientIndex = client->GetPlayerSlot() + 1; | ||||
| 	if (server) | ||||
| 	{ | ||||
| 		IClient *client = server->GetLastChatClient(); | ||||
| 		if (client) | ||||
| 			clientIndex = client->GetPlayerSlot() + 1; | ||||
| 	} | ||||
| 
 | ||||
| 	m_SpectatorChatMessageFwd->PushCell(clientIndex); | ||||
| 	m_SpectatorChatMessageFwd->PushStringEx(msg, msglen, SM_PARAM_STRING_UTF8 | SM_PARAM_STRING_COPY, SM_PARAM_COPYBACK); | ||||
| @ -536,9 +571,12 @@ bool CForwardManager::CallOnSpectatorChatMessage(HLTVServerWrapper *server, char | ||||
| void CForwardManager::CallOnSpectatorChatMessage_Post(HLTVServerWrapper *server, const char *msg, const char *chatgroup) | ||||
| { | ||||
| 	int clientIndex = 0; | ||||
| 	IClient *client = server->GetLastChatClient(); | ||||
| 	if (client) | ||||
| 		clientIndex = client->GetPlayerSlot() + 1; | ||||
| 	if (server) | ||||
| 	{ | ||||
| 		IClient *client = server->GetLastChatClient(); | ||||
| 		if (client) | ||||
| 			clientIndex = client->GetPlayerSlot() + 1; | ||||
| 	} | ||||
| 
 | ||||
| 	m_SpectatorChatMessagePostFwd->PushCell(clientIndex); | ||||
| 	m_SpectatorChatMessagePostFwd->PushString(msg); | ||||
|  | ||||
| @ -86,6 +86,7 @@ public: | ||||
| 	void CallOnSpectatorChatMessage_Post(HLTVServerWrapper *server, const char *msg, const char *chatgroup); | ||||
| 
 | ||||
| 	bool OnSpectatorExecuteStringCommand(const char *s); | ||||
| 	bool OnSpectatorExecuteStringCommand_Post(const char *s); | ||||
| 	void CreateBroadcastLocalChatDetour(); | ||||
| 	void RemoveBroadcastLocalChatDetour(); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user