File Details
cepgp_lootmaster-8.7.3.zip
- R
- Jun 7, 2026
- 856.48 KB
- 842
- 2.5.5
- Classic TBC
File Name
cepgp_lootmaster-8.7.3.zip
Supported Versions
- 2.5.5
Changes
8.7.3 — 2026-06-06
Features
Session Start — Visible Confirmation Message
- Reported: starting a raid session was silent, so it sometimes felt like nothing had happened.
- Fix:
StartLootSessionnow prints a clear confirmation when a new session is created —Raid session started in <zone> (ID: N)plus the EPGP state:(EPGP enabled),(EPGP disabled), or(choose EPGP mode in the popup)when the Yes/No prompt is still pending (the existing "EPGP enabled/disabled for this session" line still prints once you answer). Only fires for a genuinely new session, not when re-attaching to an existing one. - Where:
lootmaster_core.lua(StartLootSession).
Session Attendance — Re-Capture on Resume + Manual Capture Command
- Reported: a session's attendance sometimes only contained the people who won loot, not the whole raid (and those names also had no class colour).
- Mechanism: in
RecordLootHistoryEntrythe full-raid snapshot (UpdateSessionAttendance) is gated to the session's owner/ML, but the winner + distributor are always added (ungated, and with no class). So whenever that gated snapshot never runs for a session — most commonly a session synced in from another ML on an older addon version — attendance collapses to exactly "who had loot," which also explains those names rendering without a class colour. The owner's own freshly-started sessions already snapshot the full roster (at session start, on roster changes, on boss kills and on every award). - Improvements:
StartLootSessionnow re-snapshots the current raid roster whenever it resumes/re-attaches to an existing active session (previously it returned early without capturing), so raiders who joined after the session was first created are recorded — not just later loot winners.- New
LootMaster:CaptureRaidAttendanceNow()+ slash command/lm attendance(aliasesattend,captureattendance): snapshots everyone currently in the raid into the active session's attendance, with class info. Safe — it only writes into a session you own or are currently the master looter of, so you can't pour another raid's roster into a session you're only watching. Prints how many were in the raid / newly added / total.
- Note on past sessions: this can't retroactively repair a finished session that was already stored with only loot winners (e.g. SSC 06/04 if it came from an older client). Re-pull a clean copy from the actual master looter via LM Browse Raid Sessions, and make sure every ML is on the current version so their sessions sync complete. The guild-cache class-colour fallback (below) still colours whatever names are present.
- Where:
lootmaster_core.lua(StartLootSessionresume snapshots,CaptureRaidAttendanceNow,SlashHandler).
Kael'Thas Fight Weapons No Longer Counted As Loot
- Reported: During Kael'Thas Sunstrider, the Master Looter looting the legendary (orange) weapons the boss hands out for the fight made them count as real loot.
- Cause: those weapons (Warp Slicer, Devastation, Cosmic Infuser, Infinity Blade, Phaseshift Bulwark, Staff of Disintegration, Netherstrand Longbow + its ammo — item IDs 30311–30318) are temporary fight tools, but being quality 5 they sailed past the loot threshold and got registered, announced, distributed and recorded like any drop.
- Fix (
cepgp_lootmaster_ml/lootmaster_ml.lua): a hard-codedIGNORED_LOOT_IDSset +LootMasterML:IsIgnoredLootItem().AddLoot(the single loot-table chokepoint) now refuses to register an ignored item, so it never reaches the loot frame, attendance, loot history, orDO_YOU_WANT/CHAT_MSG_LOOTrecording.OPEN_MASTER_LOOT_LISTskips them early (no misleading "could not register loot" message). Crucially the skip sits after thelootToBaghandling, so the ML can still loot the weapons to use them in the fight — they're just never tracked as EPGP loot. - Extensible: add more item IDs to
IGNORED_LOOT_IDSto ignore other temporary/fight items.
Loot History / Attendance — Class Colours Restored From the Guild Cache
- Reported: in one session (SSC 06/04) nobody's name had a class colour.
- Cause: a name's class is baked into the loot entry (and attendance) when it's recorded, resolved from that session's attendance at record time. For sessions recorded before attendance captured the class, or pulled in from another ML via lm-sync (where the per-entry class often isn't preserved), that field is empty — and the display's only fallbacks were the entry's stored class, the session attendance, and the live raid roster (useless when reviewing a past session, since those players aren't in your group now). With all three empty, every name rendered plain white.
- Fix (
lootmaster_player_ui.lua): both name-formatters —FormatHistoryName(loot history) andColorizeNameByClassFile(attendance) — now fall back to the guild roster cache (GetCachedGuildMember(name).class), which knows every guild member's class whether or not they're online or in the raid. So any name that belongs to a current guild member gets its colour back, even on old or synced sessions. (Names of people who've left the guild and were stored without a class will still be plain — there's nothing left to resolve them from.)
Loot Session End — Shut Down Per Item When Given, and Fully When All Given
- Reported: When an item is given out — whether by master-loot assignment, the addon's trade button, or the ML trading it by hand — that item's MS/OS popup and broadcasts should shut down immediately; and once everything's distributed, the whole thing should stop (receiving still works, sending stops). The trigger is "item given", not merely "loot window closed" (the ML often closes the loot window long before the items are actually handed out by trade).
- Per-item shutdown — every give path now ends with
LOOTAWARDED:- Master loot (
GiveLootToCandidate) already broadcastLOOTAWARDED; the addon-trade path (evaluateTrade) and the new manual-trade path now broadcast it too, the instant the trade completes (no more waiting on the ~5sLOOTEDpath). - Player side (
lootmaster_player.lua):LOOTAWARDEDnow closes the MS/OS popup for that item (RemoveLoot+UpdateLootUI), not just the roll-tracker row. So "item given → that item disappears from everyone's screen" holds for all three give methods.
- Master loot (
- Manual-trade detection (
cepgp_lootmaster_ml/lootmaster_ml.lua): when the ML hand-trades (no addon-initiated trade),TRADE_SHOW/TRADE_ACCEPT_UPDATEnow watch the trade (TrackManualTrade). Once both sides accept, the items being offered are matched against the loot table; a still-distributable match synthesizes apendingTradeso the existingTRADE_CLOSEDfinalization runs (awards GP if the recipient is a candidate, broadcastsLOOTAWARDED+LOOTED, records history, removes the item). Strictly scoped: only fires formayDistribute, not-yet-awarded loot items, and only charges GP when the recipient is a candidate for that item. - Full shutdown —
ENDLOOTwhen the last item is gone:EndLootSession()broadcasts anENDLOOTcontrol comm ("ALERT"priority). On receipt the player wipes the popup list, clears the Roll Tracker and drops queued standings — every popup closes and, with nothing left to act on, sending stops (receiving is unaffected; the nextDO_YOU_WANTreopens a fresh popup). On the ML it also sets_lootSessionEnded(soSendRollTrackerUpdatebails on any late responses) and wipes the roll-coalesce tables._lootSessionEnded/_mlSessionActivereset the moment the next loot is handled (OPEN_MASTER_LOOT_LIST/AnnounceLootInternal). - What triggers the full
ENDLOOT:CheckLootSessionComplete()— called after every give (GiveLootToCandidate, trade finalize) and onLOOT_CLOSED— ends the session only when no distributable item remains. Crucially it does not end just because the loot window closed, so guilds that loot to bags first and trade afterwards aren't cut off mid-distribution. - Edge cases: a normal/non-ML loot close never spams
ENDLOOT(gated on_mlSessionActive); losing master-looter status clears the flag (OnMasterLooterChange) so a stale ex-ML can't close popups during the real ML's loot; reopening the same corpse re-arms the session and re-announces so popups come back. - Where:
cepgp_lootmaster_ml/lootmaster_ml.lua(EndLootSession,CheckLootSessionComplete,HasDistributableLoot,TrackManualTrade,TRADE_SHOW/TRADE_ACCEPT_UPDATE/TRADE_CLOSED,evaluateTradeLOOTAWARDED,GiveLootToCandidate,LOOT_CLOSED,SendRollTrackerUpdateguard,AnnounceLootInternal+OPEN_MASTER_LOOT_LISTarming,OnMasterLooterChange),lootmaster_player.lua(LOOTAWARDEDcloses popup,ENDLOOThandler).
Roll Tracker — Per-Item Fairness, Instant Own-Response, Lighter Broadcasting (25-man)
- Reported: With a full raid, after the ML handled the first item and moved to the second, the second item was slow to reach everyone, the tracker made you "wait and see everyone" before it moved on, your own MS/OS click didn't show in the list right away, and "for 25 person everything gets slow."
- Root causes (three, all in the roll-tracker path):
- All-or-nothing fairness gate (
lootmaster_player.luaROLLUPDATE): the receiver hid every item's standings until the viewer's entire popup list was empty, and the withheld updates only flushed when the last popup closed (lootmaster_player_ui.luaUpdateLootUI). So one still-open popup froze the tracker for items you'd already decided. - No local echo of your own pick: your MS/OS only appeared after a round-trip — you → ML → ML re-broadcasts
ROLLUPDATE→ you. Under load that lagged badly. - Broadcast priority + frequency: the ML sent
ROLLUPDATEat AceComm's top"ALERT"priority — the same lane as theDO_YOU_WANTannounce — and on a short 0.4s window. 25 people responding flooded that lane and delayed the next item's announce (the actual "second loot isn't sent right away").
- All-or-nothing fairness gate (
- Fixes:
- Per-item fairness gate: standings for an item are shown the moment you've decided that item (its popup is gone) or you were never a candidate — other open popups no longer block it. You still can't see an item's rolls before committing your own response to it. The flush in
UpdateLootUIis now per-item (surfaces each decided item immediately) instead of waiting for the whole list to clear. - Instant own response: new
LootMaster:ReflectOwnResponseinjects your pick into the tracker locally on click (merging with any standings already shown), so it appears with zero delay. The next authoritativeROLLUPDATEfrom the ML reconciles it with everyone's real roll/PR. Each response button now also carries itsbuttonDatafor this. - Lighter, non-blocking broadcasting:
LootMasterML:SendCommandgained an optionalpriorityarg (default"ALERT", so all control messages —DO_YOU_WANT,LOOTAWARDED,RESPONSESET,DISCARD,LOOTED— are unchanged).ROLLUPDATEnow goes out at"NORMAL", below the control lane, so a response storm can no longer stall the next item's announce. The coalesce window widened 0.4s → 1.0s, so 25 responses produce ~1 broadcast/sec (each carrying the latest full standings) instead of several. The core broadcast-log wrapper forwards the new arg.
- Per-item fairness gate: standings for an item are shown the moment you've decided that item (its popup is gone) or you were never a candidate — other open popups no longer block it. You still can't see an item's rolls before committing your own response to it. The flush in
- Net effect: award item 1 → it leaves the tracker and the next popup is right there; your own pick shows instantly; others' standings stream in ~1s batches without ever choking the item-to-item flow.
- Where:
lootmaster_player.lua(ROLLUPDATEgate),lootmaster_player_ui.lua(UpdateLootUIper-item flush, response buttonbuttonData, newReflectOwnResponse),cepgp_lootmaster_ml/lootmaster_ml.lua(SendCommandpriority arg,ROLLUPDATEat"NORMAL", 1.0s coalesce),lootmaster_core.lua(broadcast-logSendCommandwrapper forwardspriority).
EP/GP Controller — Session Tab Collapses Alts Onto Their Main
- Reported: On the EP/GP Controller's Session source, the attendee list showed connected alt characters and their mains as separate rows. Awarding "the raid" then looked like the same person would be given EP twice — the list should show each person only once (the toon they raided on, shown as their main when they were on an alt), so EP is granted one time per person.
- Root cause:
f:GetSessionRoster()built the list straight fromsession.attendance, which legitimately holds every character that was in the raid (people rotate mains/alts during a night). It never collapsed alts onto their mains, so a raider who appeared on both — or just on an alt — produced multiple rows. (The underlyingCEPGP:BulkEP/BulkGPalready redirect alts to the main and de-dup by main, so the award was effectively once — but the displayed roster contradicted that, and a main awarded via its alt row could nondeterministically receive reduced alt-EP depending on table iteration order.) - Fix:
f:GetSessionRoster()now resolves each attendee through the same alt-management rule the award uses (IsAlt→GetMainCharacterName, gated onaltManagement.enabled) and de-dups by main, so the direct list shows one row per person keyed to their main (with the main's class colour). The exclude-from-guild-rank mode resolves attendees to mains too, so a person who raided on an alt is also excluded from the guild award (previously their main slipped through and got session EP and guild EP). With the defaultaltEPPercentage = 100the awarded amounts are unchanged; the list now simply matches what the bulk award actually does. - Where:
lootmaster_core.lua(f:GetSessionRosterinsideCreateEPGPController).

