CEPGP LootMaster - ANADOLU [ML]

This is a helper addon to distribute from CEPGP Lootmaster - ANADOLU - Core addon while being Master Looter.

File Details

cepgp_lootmaster_ml-8.7.4.zip

  • R
  • Jul 9, 2026
  • 189.80 KB
  • 39
  • 2.5.6
  • Classic TBC

File Name

cepgp_lootmaster_ml-8.7.4.zip

Supported Versions

  • 2.5.6

Changes

8.7.4 — 2026-07-09

Compatibility — WoW Classic Anniversary 2.5.6

EP/GP Operations Restored — Officer-Note API Removed in 2.5.6

  • Reported: right after the client updated to 2.5.6, every EP/GP operation stopped working — awarding EP, setting GP, Init, and Decay all failed with ...Libs/CEPGP/CEPGP_OfficerNote.lua:56: attempt to call a nil value, thrown up through CEPGP_EPGP.lua DecayGuildlootmaster_options.lua.
  • Cause: 2.5.6 removed the legacy index-based global GuildRosterSetOfficerNote(index, note) (and its sibling GuildRosterSetPublicNote). Since every EP/GP write funnels through CEPGP:WriteOfficerNote, and that called the now-nil global, the entire standings system was dead. The modern engine replaces it with C_GuildInfo.SetNote(guid, note, isPublic) — which needs the member GUID (17th return of GetGuildRosterInfo), not the volatile roster index, and isPublic = false to target the officer note (true would write the public note and leak/corrupt EPGP data).
  • Fix: a local SetOfficerNoteByIndex(index, note) helper resolves the GUID from the roster index and prefers C_GuildInfo.SetNote(guid, note, false), falling back to the legacy global on older clients. WriteOfficerNote now returns a clean error instead of hard-erroring when neither API exists. Applied to all four officer-note write sites: the core EPGP write and the three alt-tagging / note-clearing paths.
  • Where: Libs/CEPGP/CEPGP_OfficerNote.lua (SetOfficerNoteByIndex, WriteOfficerNote), Libs/Guild/guild.lua (alt-tag write, unlink clear, clear-by-rank).

Guild Roster Refresh Restored — Bare GuildRoster() Removed in 2.5.6 (was failing silently)

  • Cause: the same migration removed the bare GuildRoster() global that requests a fresh roster from the server (the modern engine uses C_GuildInfo.GuildRoster()). Seven call sites still guarded only on the legacy global (if GuildRoster then GuildRoster() end), so on 2.5.6 they silently skipped the refresh and then scanned/wrote stale roster data — affecting alt-tagging, officer-note clearing, EPGP-by-rank, and the auto-EP bulk boss award.
  • Fix: Libs/Guild/guild.lua routes all six sites through a new local RequestGuildRoster() (prefers C_GuildInfo.GuildRoster(), legacy fallback); Libs/InstanceTracking/instancetracking.lua inlines the same dual-path. (lootmaster_core.lua / lootmaster_player_ui.lua already used the dual-path.)
  • Where: Libs/Guild/guild.lua (RequestGuildRoster, 6 sites), Libs/InstanceTracking/instancetracking.lua (auto-EP pre-award refresh).

TOC Interface Version → 20506

  • Bumped ## Interface: from 20505 to 20506 in all three addons so they load without the "Out of Date" flag on the 2.5.6 client. Verified no Lua code hard-codes a build/interface check that would reject 2.5.6, and no other removed guild-roster globals (SetGuildRosterSelection, GuildRosterSetPublicNote, SortGuildRoster, …) are in use.
  • Where: cepgp_lootmaster.toc, cepgp_lootmaster_ml/cepgp_lootmaster_ml.toc, cepgp_lootmaster_rt/cepgp_lootmaster_rt.toc.

Removed

Raid Groups Feature Removed Completely

  • Decision: the addon no longer supports Raid Groups. Both subsystems that went by that name are gone:
    • Raid Groups (guild teams) — the named teams of guild members, the "All Raid Groups" attendance-filter pill on the Loot History → Attendance dashboard, the class-coloured members-grid popup, the /lm group slash command, and the per-action permissions (raidgroup.*).
    • Raid Groups Tool (composition planner) — the spec/player-picker drag-and-drop composition window, the "Enable Raid Groups Tool" toggle and "Open Raid Groups Manager" button under LootMaster Admin, and the whole embedded LootMaster.RG module.
  • What was deleted:
    • Files: Libs/RaidGroups/ (lrg_init/raids/compositions/ui.lua — the composition tool) and Libs/RaidTeams/raidteams.lua (the guild-teams subsystem), plus their TOC entries.
    • Core API: CreateRaidGroup / DeleteRaidGroup / AddPlayerToRaidGroup / RemovePlayerFromRaidGroup / GetRaidGroup* / IsSessionForRaidGroup / SetRaidGroupFilter / GetRaidGroupFilter / CanonicalizeMemberName / PrintRaidGroupList / HandleGroupSlash (raidteams.lua), and ShowRaidGroupMembersFrame / ShowRaidGroupsManagerFrame (lootmaster_player_ui.lua).
    • UI: the Raid Group attendance-filter pill + dropdown (the search bar is re-anchored to the From pill), and the raidgroup section of the Permission Matrix. The Root Admins help text no longer mentions managing raid groups.
  • Kept (NOT a raid-groups feature, despite living in the old file): NormalizeRaidName + MAIN_RAID_PATTERNS — these canonicalise a session's instance name ("Coilfang SSC, Gruul's Lair" → "Serpentshrine Cavern") and are used all over the session / loot-history display. They were moved verbatim from raidteams.lua into Libs/InstanceTracking/instancetracking.lua (their natural home) so nothing in the history/attendance UI changes.
  • One-time data purge (lootmaster_core.lua OnInitialize, gated by db.global.raidGroupsPurgedV1): on next login the retired SavedVariables are stripped — the profile keys (raidGroups, raidGroupFilter, raidGroupsTool, raidGroupsToolEnabled), the per-guild raidGroups blocks in the CEPGPLootMasterGuild store (dropped from GUILD_DATA_KEYS, so otherwise never cleaned up), and any copies captured inside saved config snapshots. Runs once.
  • Localisation: removed the raid-group / composition-tool strings from enUS/trTR/deDE (generic words that other features reuse — e.g. Select All, Ranged, none, members — were kept). The Root Admins description key was updated in code + enUS + trTR to drop the "manage raid groups" clause.
  • Where: cepgp_lootmaster.toc, Libs/RaidGroups/* (deleted), Libs/RaidTeams/* (deleted), Libs/InstanceTracking/instancetracking.lua (NormalizeRaidName moved in), Libs/Permissions/permissions.lua (raidgroup.* removed), lootmaster_core.lua (slash command, GUILD_DATA_KEYS, purge), lootmaster_player_ui.lua (filter pill, members popup, manager frame), cepgp_lootmaster_ml/lootmaster_options.lua (tool toggle group, permission section, help text), locale files.

Bug Fixes

Session Recorder — Un-Announced Loot Hand-Traded Now Records as "Free"

  • Reported: The raid session recorder still wasn't capturing everything. Looting an item to your bags and announcing it later records correctly, but giving an item out directly by trade without announcing it never showed up — it should be recorded as a Free hand-out to whoever received it.
  • Cause: The manual-trade detection added in 8.7.3 (TrackManualTrade) only recognised items that were already in the announced loot table. An item you looted to your bags but never announced isn't in that table, so the hand-trade matched nothing: no record was created, and the only trace left was the session's provisional "ML looted it" placeholder — so the loot showed as the Master Looter holding the item (type Manual), never as Free to the actual recipient. On top of that, TRADE_SHOW only armed manual-trade watching when there was announced loot still to give (HasDistributableLoot()), so for an un-announced hand-out the watcher wasn't even running.
  • How it now works: when the ML loots an item to their own bags during an active session, the recorder already logs a provisional auto: self-loot placeholder (core OnChatMsgLoot). That placeholder is the precise signal that "the ML looted this exact item this session but never distributed it." So:
    • TRADE_SHOW now arms manual-trade tracking whenever you're the ML with an active session (new LootMasterML:ShouldTrackManualTrade()), not only when announced loot remains — so an un-announced hand-out is watched too.
    • TrackManualTrade gained a second branch: if a hand-traded item isn't in the announced loot table but the session does have an un-distributed auto: placeholder for it (new core LootMaster:HasUnannouncedSessionLoot(itemLink)), it synthesises a pendingTrade with no lootID and gp = 0. The existing TRADE_CLOSED Free path then records it as LOOTTYPE.FREE to the trade recipient, broadcasts LOOTAWARDED/LOOTED, and RecordLootHistoryEntry's placeholder-removal swaps out the "ML looted it" placeholder — so the session shows the real recipient as Free, not the ML as Manual.
  • Scoped to avoid false positives: a hand-trade is only recorded as Free when the session already logged the ML looting that exact item (the placeholder must exist). Items you trade that weren't looted during the session (bank items, mats from elsewhere, gold) have no placeholder and are never recorded. Announced items are unchanged — they still take the existing GP/award path.
  • Known limitation: like the existing manual-trade and addon-trade paths, only one loot item per trade is finalised (the single pendingTrade design). Hand out multiple un-announced items in separate trades, or announce them, to record each.
  • Where: cepgp_lootmaster_ml/lootmaster_ml.lua (ShouldTrackManualTrade, TrackManualTrade un-announced branch, TRADE_SHOW arming), Libs/SessionSync/sessionsync.lua (HasUnannouncedSessionLoot).