use vanilla chat logic if codecallbacks are missing

This commit is contained in:
BobTheBob 2022-02-25 00:15:28 +00:00
parent 1fda5cab9d
commit f2b56ee582
2 changed files with 40 additions and 32 deletions

View File

@ -17,32 +17,36 @@ struct ChatTags
static void CHudChat__AddGameLineHook(void* self, const char* message, int inboxId, bool isTeam, bool isDead)
{
// This hook is called for each HUD, but we only want our logic to run once.
if (!IsFirstHud(self))
if (g_ClientSquirrelManager->setupfunc("CHudChat_ProcessMessageStartThread") != SQRESULT_ERROR)
{
return;
// This hook is called for each HUD, but we only want our logic to run once.
if (!IsFirstHud(self))
{
return;
}
int senderId = inboxId & CUSTOM_MESSAGE_INDEX_MASK;
bool isAnonymous = senderId == 0;
bool isCustom = isAnonymous || (inboxId & CUSTOM_MESSAGE_INDEX_BIT);
// Type is set to 0 for non-custom messages, custom messages have a type encoded as the first byte
int type = 0;
const char* payload = message;
if (isCustom)
{
type = message[0];
payload = message + 1;
}
g_ClientSquirrelManager->pusharg((int)senderId - 1);
g_ClientSquirrelManager->pusharg(payload);
g_ClientSquirrelManager->pusharg(isTeam);
g_ClientSquirrelManager->pusharg(isDead);
g_ClientSquirrelManager->pusharg(type);
g_ClientSquirrelManager->call(5);
}
int senderId = inboxId & CUSTOM_MESSAGE_INDEX_MASK;
bool isAnonymous = senderId == 0;
bool isCustom = isAnonymous || (inboxId & CUSTOM_MESSAGE_INDEX_BIT);
// Type is set to 0 for non-custom messages, custom messages have a type encoded as the first byte
int type = 0;
const char* payload = message;
if (isCustom)
{
type = message[0];
payload = message + 1;
}
g_ClientSquirrelManager->setupfunc("CHudChat_ProcessMessageStartThread");
g_ClientSquirrelManager->pusharg((int)senderId - 1);
g_ClientSquirrelManager->pusharg(payload);
g_ClientSquirrelManager->pusharg(isTeam);
g_ClientSquirrelManager->pusharg(isDead);
g_ClientSquirrelManager->pusharg(type);
g_ClientSquirrelManager->call(5);
else
CHudChat__AddGameLine(self, message, inboxId, isTeam, isDead);
}
// void NSChatWrite( int context, string str )

View File

@ -15,7 +15,7 @@ class CRecipientFilter
char unknown[58];
};
CServerGameDLL* gServer;
CServerGameDLL* g_pServerGameDLL;
typedef void(__fastcall* CServerGameDLL__OnReceivedSayTextMessageType)(
CServerGameDLL* self, unsigned int senderPlayerId, const char* text, int channelId);
@ -76,18 +76,22 @@ static void CServerGameDLL__OnReceivedSayTextMessageHook(CServerGameDLL* self, u
return;
}
g_ServerSquirrelManager->setupfunc("CServerGameDLL_ProcessMessageStartThread");
g_ServerSquirrelManager->pusharg((int)senderPlayerId - 1);
g_ServerSquirrelManager->pusharg(text);
g_ServerSquirrelManager->pusharg(isTeam);
g_ServerSquirrelManager->call(3);
if (g_ServerSquirrelManager->setupfunc("CServerGameDLL_ProcessMessageStartThread") != SQRESULT_ERROR)
{
g_ServerSquirrelManager->pusharg((int)senderPlayerId - 1);
g_ServerSquirrelManager->pusharg(text);
g_ServerSquirrelManager->pusharg(isTeam);
g_ServerSquirrelManager->call(3);
}
else
CServerGameDLL__OnReceivedSayTextMessageHookBase(self, senderPlayerId, text, isTeam);
}
void ChatSendMessage(unsigned int playerIndex, const char* text, bool isteam)
{
isSkippingHook = true;
CServerGameDLL__OnReceivedSayTextMessage(
gServer,
g_pServerGameDLL,
// Ensure the first bit isn't set, since this indicates a custom message
(playerIndex + 1) & CUSTOM_MESSAGE_INDEX_MASK, text, isteam);
}
@ -164,7 +168,7 @@ SQRESULT SQ_BroadcastMessage(void* sqvm)
return SQRESULT_NULL;
}
void InitialiseServerChatHooks_Engine(HMODULE baseAddress) { gServer = (CServerGameDLL*)((char*)baseAddress + 0x13F0AA98); }
void InitialiseServerChatHooks_Engine(HMODULE baseAddress) { g_pServerGameDLL = (CServerGameDLL*)((char*)baseAddress + 0x13F0AA98); }
void InitialiseServerChatHooks_Server(HMODULE baseAddress)
{