From f37a83fc529265682999737b21eaa048c330a43d Mon Sep 17 00:00:00 2001 From: Kelsi Date: Sun, 22 Mar 2026 16:38:34 -0700 Subject: [PATCH] feat: fire CHAT_MSG_* events for all incoming chat messages The SMSG_MESSAGECHAT handler stored messages in chatHistory and triggered chat bubbles, but never fired Lua addon events. Chat frame addons (Prat, Chatter, WIM) and the default ChatFrame all register for CHAT_MSG_SAY, CHAT_MSG_WHISPER, CHAT_MSG_PARTY, CHAT_MSG_GUILD, etc. to display incoming messages. Now fires CHAT_MSG_{type} for every incoming message with the full WoW event signature: message, senderName, language, channelName, displayName, specialFlags, zoneChannelID, channelIndex, channelBaseName, unused, lineID, and senderGUID. Covers all chat types: SAY, YELL, WHISPER, PARTY, RAID, GUILD, OFFICER, CHANNEL, EMOTE, SYSTEM, MONSTER_SAY, etc. --- src/game/game_handler.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/game/game_handler.cpp b/src/game/game_handler.cpp index b908245b..93fc6a58 100644 --- a/src/game/game_handler.cpp +++ b/src/game/game_handler.cpp @@ -13468,6 +13468,31 @@ void GameHandler::handleMessageChat(network::Packet& packet) { } LOG_DEBUG("[", getChatTypeString(data.type), "] ", channelInfo, senderInfo, ": ", data.message); + + // Fire CHAT_MSG_* addon events so Lua chat frames and addons receive messages. + // WoW event args: message, senderName, language, channelName + if (addonEventCallback_) { + std::string eventName = "CHAT_MSG_"; + eventName += getChatTypeString(data.type); + std::string lang = std::to_string(static_cast(data.language)); + // Format sender GUID as hex string for addons that need it + char guidBuf[32]; + snprintf(guidBuf, sizeof(guidBuf), "0x%016llX", (unsigned long long)data.senderGuid); + addonEventCallback_(eventName, { + data.message, + data.senderName, + lang, + data.channelName, + senderInfo, // arg5: displayName + "", // arg6: specialFlags + "0", // arg7: zoneChannelID + "0", // arg8: channelIndex + "", // arg9: channelBaseName + "0", // arg10: unused + "0", // arg11: lineID + guidBuf // arg12: senderGUID + }); + } } void GameHandler::sendTextEmote(uint32_t textEmoteId, uint64_t targetGuid) {