From ee59c37b83a905a4cc7f486495174238c2f33fc8 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Fri, 20 Mar 2026 17:33:34 -0700 Subject: [PATCH] feat: add loot method change notifications and CRITERIA_UPDATE event Show "Loot method changed to Master Looter/Round Robin/etc." in chat when group loot method changes via SMSG_GROUP_LIST. Fire CRITERIA_UPDATE addon event with criteria ID and progress when achievement criteria progress changes, enabling achievement tracking addons. --- src/game/game_handler.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/game/game_handler.cpp b/src/game/game_handler.cpp index 47e07e77..a2a0cc51 100644 --- a/src/game/game_handler.cpp +++ b/src/game/game_handler.cpp @@ -4993,8 +4993,14 @@ void GameHandler::handlePacket(network::Packet& packet) { uint64_t progress = packet.readUInt64(); packet.readUInt32(); // elapsedTime packet.readUInt32(); // creationTime + uint64_t oldProgress = 0; + auto cpit = criteriaProgress_.find(criteriaId); + if (cpit != criteriaProgress_.end()) oldProgress = cpit->second; criteriaProgress_[criteriaId] = progress; LOG_DEBUG("SMSG_CRITERIA_UPDATE: id=", criteriaId, " progress=", progress); + // Fire addon event for achievement tracking addons + if (addonEventCallback_ && progress != oldProgress) + addonEventCallback_("CRITERIA_UPDATE", {std::to_string(criteriaId), std::to_string(progress)}); } break; } @@ -19780,6 +19786,7 @@ void GameHandler::handleGroupList(network::Packet& packet) { const bool hasRoles = isActiveExpansion("wotlk"); // Snapshot state before reset so we can detect transitions. const uint32_t prevCount = partyData.memberCount; + const uint8_t prevLootMethod = partyData.lootMethod; const bool wasInGroup = !partyData.isEmpty(); // Reset before parsing — SMSG_GROUP_LIST is a full replacement, not a delta. // Without this, repeated GROUP_LIST packets push duplicate members. @@ -19796,6 +19803,14 @@ void GameHandler::handleGroupList(network::Packet& packet) { } else if (nowInGroup && partyData.memberCount != prevCount) { LOG_INFO("Group updated: ", partyData.memberCount, " members"); } + // Loot method change notification + if (wasInGroup && nowInGroup && partyData.lootMethod != prevLootMethod) { + static const char* kLootMethods[] = { + "Free for All", "Round Robin", "Master Looter", "Group Loot", "Need Before Greed" + }; + const char* methodName = (partyData.lootMethod < 5) ? kLootMethods[partyData.lootMethod] : "Unknown"; + addSystemChatMessage(std::string("Loot method changed to ") + methodName + "."); + } // Fire GROUP_ROSTER_UPDATE / PARTY_MEMBERS_CHANGED for Lua addons if (addonEventCallback_) { addonEventCallback_("GROUP_ROSTER_UPDATE", {});