mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-03-22 23:30:14 +00:00
feat: fire CHAT_MSG_* events to Lua addons for all chat types
Wire chat messages to the addon event system via AddonChatCallback. Every chat message now fires the corresponding WoW event: - CHAT_MSG_SAY, CHAT_MSG_YELL, CHAT_MSG_WHISPER - CHAT_MSG_PARTY, CHAT_MSG_GUILD, CHAT_MSG_OFFICER - CHAT_MSG_RAID, CHAT_MSG_RAID_WARNING, CHAT_MSG_BATTLEGROUND - CHAT_MSG_SYSTEM, CHAT_MSG_CHANNEL, CHAT_MSG_EMOTE Event handlers receive (eventName, message, senderName) arguments. Addons can now filter, react to, or log chat messages in real-time.
This commit is contained in:
parent
510f03fa32
commit
0a0ddbfd9f
3 changed files with 31 additions and 0 deletions
|
|
@ -279,6 +279,10 @@ public:
|
||||||
using ChatBubbleCallback = std::function<void(uint64_t, const std::string&, bool)>;
|
using ChatBubbleCallback = std::function<void(uint64_t, const std::string&, bool)>;
|
||||||
void setChatBubbleCallback(ChatBubbleCallback cb) { chatBubbleCallback_ = std::move(cb); }
|
void setChatBubbleCallback(ChatBubbleCallback cb) { chatBubbleCallback_ = std::move(cb); }
|
||||||
|
|
||||||
|
// Addon chat event callback: fires when any chat message is received (for Lua event dispatch)
|
||||||
|
using AddonChatCallback = std::function<void(const MessageChatData&)>;
|
||||||
|
void setAddonChatCallback(AddonChatCallback cb) { addonChatCallback_ = std::move(cb); }
|
||||||
|
|
||||||
// Emote animation callback: (entityGuid, animationId)
|
// Emote animation callback: (entityGuid, animationId)
|
||||||
using EmoteAnimCallback = std::function<void(uint64_t, uint32_t)>;
|
using EmoteAnimCallback = std::function<void(uint64_t, uint32_t)>;
|
||||||
void setEmoteAnimCallback(EmoteAnimCallback cb) { emoteAnimCallback_ = std::move(cb); }
|
void setEmoteAnimCallback(EmoteAnimCallback cb) { emoteAnimCallback_ = std::move(cb); }
|
||||||
|
|
@ -2634,6 +2638,7 @@ private:
|
||||||
size_t maxChatHistory = 100; // Maximum chat messages to keep
|
size_t maxChatHistory = 100; // Maximum chat messages to keep
|
||||||
std::vector<std::string> joinedChannels_; // Active channel memberships
|
std::vector<std::string> joinedChannels_; // Active channel memberships
|
||||||
ChatBubbleCallback chatBubbleCallback_;
|
ChatBubbleCallback chatBubbleCallback_;
|
||||||
|
AddonChatCallback addonChatCallback_;
|
||||||
EmoteAnimCallback emoteAnimCallback_;
|
EmoteAnimCallback emoteAnimCallback_;
|
||||||
|
|
||||||
// Targeting
|
// Targeting
|
||||||
|
|
|
||||||
|
|
@ -335,6 +335,31 @@ bool Application::initialize() {
|
||||||
if (addonManager_->initialize(gameHandler.get())) {
|
if (addonManager_->initialize(gameHandler.get())) {
|
||||||
std::string addonsDir = assetPath + "/interface/AddOns";
|
std::string addonsDir = assetPath + "/interface/AddOns";
|
||||||
addonManager_->scanAddons(addonsDir);
|
addonManager_->scanAddons(addonsDir);
|
||||||
|
// Wire chat messages to addon event dispatch
|
||||||
|
gameHandler->setAddonChatCallback([this](const game::MessageChatData& msg) {
|
||||||
|
if (!addonManager_ || !addonsLoaded_) return;
|
||||||
|
// Map ChatType to WoW event name
|
||||||
|
const char* eventName = nullptr;
|
||||||
|
switch (msg.type) {
|
||||||
|
case game::ChatType::SAY: eventName = "CHAT_MSG_SAY"; break;
|
||||||
|
case game::ChatType::YELL: eventName = "CHAT_MSG_YELL"; break;
|
||||||
|
case game::ChatType::WHISPER: eventName = "CHAT_MSG_WHISPER"; break;
|
||||||
|
case game::ChatType::PARTY: eventName = "CHAT_MSG_PARTY"; break;
|
||||||
|
case game::ChatType::GUILD: eventName = "CHAT_MSG_GUILD"; break;
|
||||||
|
case game::ChatType::OFFICER: eventName = "CHAT_MSG_OFFICER"; break;
|
||||||
|
case game::ChatType::RAID: eventName = "CHAT_MSG_RAID"; break;
|
||||||
|
case game::ChatType::RAID_WARNING: eventName = "CHAT_MSG_RAID_WARNING"; break;
|
||||||
|
case game::ChatType::BATTLEGROUND: eventName = "CHAT_MSG_BATTLEGROUND"; break;
|
||||||
|
case game::ChatType::SYSTEM: eventName = "CHAT_MSG_SYSTEM"; break;
|
||||||
|
case game::ChatType::CHANNEL: eventName = "CHAT_MSG_CHANNEL"; break;
|
||||||
|
case game::ChatType::EMOTE:
|
||||||
|
case game::ChatType::TEXT_EMOTE: eventName = "CHAT_MSG_EMOTE"; break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
if (eventName) {
|
||||||
|
addonManager_->fireEvent(eventName, {msg.message, msg.senderName});
|
||||||
|
}
|
||||||
|
});
|
||||||
LOG_INFO("Addon system initialized, found ", addonManager_->getAddons().size(), " addon(s)");
|
LOG_INFO("Addon system initialized, found ", addonManager_->getAddons().size(), " addon(s)");
|
||||||
} else {
|
} else {
|
||||||
LOG_WARNING("Failed to initialize addon system");
|
LOG_WARNING("Failed to initialize addon system");
|
||||||
|
|
|
||||||
|
|
@ -14521,6 +14521,7 @@ void GameHandler::addLocalChatMessage(const MessageChatData& msg) {
|
||||||
if (chatHistory.size() > maxChatHistory) {
|
if (chatHistory.size() > maxChatHistory) {
|
||||||
chatHistory.pop_front();
|
chatHistory.pop_front();
|
||||||
}
|
}
|
||||||
|
if (addonChatCallback_) addonChatCallback_(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ============================================================
|
// ============================================================
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue