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.
This commit is contained in:
Kelsi 2026-03-20 17:33:34 -07:00
parent c44e1bde0a
commit ee59c37b83

View file

@ -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", {});