promotional bannermobile promotional banner

Loothing

A modern loot council addon for WoW 12.0+ that enables guild masters and officers to manage, distribute, and track raid loot through collaborative council voting, powered by the Loolib framework.
Back to Files

Loothing v2.0.57

File nameloothing_2.0.57.zip
Uploader
FelupFelup
Uploaded
Aug 26, 2026
Downloads
40
Size
1.0 MB
Flavors
Retail
File ID
8736432
Type
R
Release
Supported game versions
  • 12.1.0

What's new

Second full-codebase audit release, run deeper than 2.0.56: five parallel audits (Loolib core, Loolib config, comms, data/loot/council, UI) with every finding independently verified against source, then a second adversarial review of the whole diff. ~115 confirmed defects fixed across Loothing and Loolib. Companion fixes shipped to the loothing.xyz backend (tier-set season detection) and the desktop app (intel key/field formats).

Fixed — tier & player intel (the "old tier counts as current tier" bug)

  • Tier-set counts in Player Intel no longer count previous seasons' sets. The backend's tier-set detector matched every tier-shaped set ever published (all seasons, all expansions) and merged them per class — a player still wearing last season's 4-piece showed as 4pc. Detection now keeps only the newest set per class, and the season registry gained a first-class Midnight Season 2 entry (The Venomous Abyss, journal instance 1320, WCL zone 54, all 8 encounter IDs, the S2 M+ pool) so every "current season/tier" computation resolves to S2 instead of S1.
  • "Loot this tier" now actually means this tier. The intel loot list was a rolling 90-day window, which early in a season included the previous tier's awards; it now cuts off at the current season's start date.
  • Weekly M+ intel from roster-audit syncs now displays. The desktop wrote flat mpWeekCount/mpHighest fields the addon never read; the desktop now writes the mpWeek table the addon expects, and the addon also normalizes old data so already-synced intel displays immediately.
  • Players on multi-word realms (e.g. Twisting Nether) get intel again. Desktop keys use hyphenated realm slugs while in-game names strip spaces; both sides now reconcile, so gear/tier/vault cards aren't permanently blank for those players.
  • Tier card 2pc/4pc colors render (the accent always resolved to the theme color), the no-tier card no longer inherits the previous player's accent, and the Parses tab no longer draws its boss line and hint text on top of each other.

Fixed — settings window (the "dropdowns cause mass Lua errors" bug)

  • Reopening the settings window no longer multiplies everything. Every close/reopen built a whole new settings window and registered another change listener, so after N reopens one settings change ran N full re-renders and any single render fault printed N errors — the "mass Lua errors" report. The window is now built once and reused.
  • Selecting a dropdown value no longer destroys the menu mid-click. Selects that re-render the page from inside their setter (remove ignored item, remove council member, profile switch/copy/delete) tore down the very widgets whose click handler was still running, leaving stuck tooltips and use-after-release errors. Re-renders are now deferred one frame and coalesced.
  • Dropdown menus no longer stack. Every click created a brand-new menu on top of the previous one (each capturing keyboard input); menus are now cached and toggle open/closed. The type-filter menu got the same treatment.
  • Destructive settings now actually confirm. confirm was resolved and then ignored — Clear All History, delete profile, remove council member, and every other destructive option fired with no prompt. They now show a confirmation popup.
  • The session lock works. Group-level disabled (the "settings locked during a session" state) never reached the options inside those groups — voting config, autopass, response buttons were all editable during someone else's session. Disabled state now inherits.
  • Full-width settings controls (import/export boxes, announcement text) no longer overflow the window with their scrollbars unreachable; multiselect checkboxes read their values correctly; validation failures (e.g. bad profile name) print why instead of silently doing nothing; select boxes with no value show empty instead of the literal "nil"; the keybinding widget can now actually capture a key; execute buttons refresh the dialog; the settings scrollbars are themed as intended.

Fixed — voting & awards

  • Simple (default) mode vote tallies counted zero votes. The tally counted against response-ID keys while ballots carry candidate names — no vote ever matched. Tallies now count candidates, report the real winner, and apply the configured tie-breaker (ROLL / ML choice / revote) in simple mode; previously a tied simple vote silently resolved arbitrarily and could show different winners on different clients.
  • The council table's wishlist column works. Wishlist data was attached before any candidates existed, so the column showed "-" for everyone even with a synced wishlist. Candidates are now enriched as their responses arrive.
  • Sorting the council table by item level sorts by item level (it silently sorted alphabetically by name).
  • The History Response filter always returned zero rows because awards never recorded the winner's response; award paths now record it, the response color stripe renders on history rows, and system responses (autopass/disenchant) keep their text in history instead of blanking.
  • A manual /roll no longer counts as your loot roll. Any system roll while the roll window was open was captured as your roll for that item — with the manual roll's own min/max, letting a /roll 1000 outroll the raid.
  • History dates match exports. Award dates were stored in UTC but rendered in local time, so evening raids landed on the next calendar day in the History list while exports said otherwise.

Fixed — comms & sync hardening

  • All message handlers now type-check payloads before field access (~20 handlers could be crashed remotely with a malformed message); batch entries, SESSION_INIT sub-payloads, and intel-share timestamps are type-gated; heartbeats are only accepted from the Master Looter (a forged heartbeat could permanently suppress stale-session recovery); comm statistics can no longer be grown unboundedly by forged command strings.
  • Solo guild sync works again. Whispers to guildmates (sync panel, settings/history share) were silently dropped while not in a group; the sender saw a green "complete" bar for a sync that never happened. The sync panel also no longer lists in-raid guildmates twice, no longer leaves the Send button permanently disabled if closed mid-share, and no longer fakes success when the sync module is unavailable.
  • A malformed intel share can no longer permanently wedge that sender's transfers; a stalled comm replay queue no longer spins its timer forever; test-mode/Simulator sessions no longer broadcast to the real raid (a load-order bug made every test-mode check in the comm layer permanently false).
  • Syncing into an already-closed session no longer produces an empty council table; auto-awarded items are no longer broadcast as phantom un-votable rows to the rest of the raid.

Fixed — trading

  • Trading two copies of the same item to two winners can no longer retire the wrong winner's queue entry. WoW's automatic un-accept (fired when an item is added after an accept) wiped the trade metadata that matched queue entries precisely.
  • The trade window accept-cycle no longer loses staged-item tracking; the Trade tab shows its empty-state message when everything is traded; bag scans no longer abort on transiently-nil bag sizes.

Fixed — roll window & panels

  • Cold-cache items (first drop of the night, batched session items) render their slot/ilvl/upgrade info when the data arrives instead of staying blank until clicked — two systems shared one callback slot and silently overwrote each other.
  • The vote panel no longer closes itself one second after opening for late-accept items, and its candidate list scrolls (12+ candidates previously covered the note box and Submit button). Response sets of 9-10 buttons no longer overlap the roll window's footer.
  • Closing the roll window (or ending a session) while combat-minimized no longer resurrects an empty ghost window after combat; reopening within one item keeps /roll capture alive.
  • The session list's voting countdown ticks instead of freezing at its initial value; the Session Summary's Roll column is no longer clipped to one digit; trinket autopass works (two independent load-order/API bugs made it permanently inert); class restrictions are detected on non-English clients; the equippable-only filter actually filters (it read fields that never existed — with a cloak carve-out so cloaks don't filter non-cloth classes).
  • Settings editors: pressing Enter no longer saves twice and corrupts row layout; resizing no longer rebuilds the settings tree ~60×/second; the ▲/▼ reorder buttons for award reasons work (a duplicate function definition shadowed the real one); response-set menus list sets in stable order; the icon picker highlights the current icon, forgets stale selections, and restores its search placeholder; deleting response set 1 says why it can't instead of silently no-opping; the main window's Ctrl+Scroll size survives relog.

Fixed — Loolib (library)

  • Profile safety: switching to an existing profile now re-applies defaults (previously all default-valued settings read as empty after a logout/switch cycle — including table defaults, which then errored); copying a profile onto itself no longer wipes it; copying to a new profile no longer silently switches you onto the copy.
  • Widget pools: released sliders/edit boxes no longer fire the consumer's change handlers with bogus values (which could rewrite saved settings on panel teardown); pool resets during iteration are safe; object pools guard nil-returning factories.
  • Events/timers: two buckets on the same event no longer clobber each other; a throwing repeating-timer callback no longer errors every tick forever; a mid-dispatch re-registration no longer permanently leaks a frame event registration.
  • Animation engine: finish callbacks are deferred out of the update loop (a repeating animation group could double-tick its members); Pause() is documented as the restart it actually is.
  • Dropdown templates: first-open menus are no longer 1px wide; submenus close with their parent and take clicks reliably; ESC no longer eats all other keys while a menu is open; ClearOptions no longer wipes the caller's shared table; option rows with slider/editbox extras no longer throw on open (operator-precedence bug passed a table to SetPoint); menu item frames are reused instead of leaking a full set per open.
  • Misc: NaN values fail loudly at serialization instead of silently corrupting the payload on the receiving side; theme changes from inside a theme callback are full no-ops instead of half-applied; TempTable.UnpackAndRelease preserves embedded nils; Once-wrapped functions that threw no longer error on every later call; dialog SetIcon renders (the icon region never existed); 4-argument Point() calls produce a valid anchor.

Companion releases

  • loothing.xyz backend: newest-per-class tier-set detection, Midnight Season 2 registry (verified IDs from client data build 12.1.0.69497), season-start loot windows, tier-set cache invalidation.
  • Desktop app: roster-audit sync writes mpWeek in the addon's schema and de-hyphenates realm slugs in player keys. Full-codebase audit release: every subsystem (comms, core, data, UI, debug tooling) was reviewed end to end, every finding independently verified against the source, and ~70 confirmed defects fixed. No features added; behavior changes below are all bug fixes.

Fixed — settings & data safety

  • Upgrading no longer silently resets migrated settings. The settings migration read through the defaults layer, so legacy values (UI scale, session trigger mode, history sharing, voting mode, and a dozen more) could be seen as "already migrated" and destroyed on upgrade. Migrations now read exactly what you actually stored, and only backfill defaults after the whole chain succeeds.
  • Importing a settings profile no longer wipes the council roster, ignore list, or custom response sets. The import merge treated data lists as shape templates: a 12-person council imported as empty, and custom response buttons were truncated to the default count. Containers and lists are now taken from the import as-is.
  • Profile exports now carry your history settings (share mode, max entries) instead of resetting every importer to the defaults.
  • Re-imported history rows no longer vanish on the next reload when using overwrite import, and import totals are honest — rows rejected (history disabled, test mode, bad winner) count as skipped, not imported.
  • History age pruning is now configurable (history.maxAgeDays, default 180; 0 disables) instead of an unconditional 180-day purge at every login.
  • History lists and exports are actually sorted newest-first. The sort was requested but never applied, so everything rendered in storage order.
  • Award history records the normalized winner name, so per-player stats and "delete all entries for this player" work for winners entered via auto-award or with odd realm casing.
  • CSV/TSV exports keep the winner's realm, so cross-realm winners survive an export/import round trip instead of being re-attributed to your realm.

Fixed — comms & sync

  • Guild sync works again. Settings/history sync and profile shares to guildmates were dropped at three separate gates (the send gate, the queue drain gate, and the receive handlers all required raid membership). All three now accept guild peers.
  • Solo players can send guild traffic again. Version checks, guild sync, and intel share were silently dropped whenever you weren't in a party, because the guild channel was gated on group-oriented connection state.
  • Reloading mid-raid no longer gets your messages dropped as duplicates. The replay-protection sequence restarted from zero on reload, so peers holding the old IDs discarded your first messages (including loot responses) for up to two minutes.
  • Observer-roster resync no longer loops forever. A client that missed the roster broadcast re-requested it, but the resend was suppressed as "unchanged" — permanently. Resyncs now force the send.
  • Guaranteed-delivery messages survive rapid restriction flapping — an in-flight replay's unsent remainder is re-queued instead of discarded.
  • Mid-session version checks no longer mark the whole raid "Not Installed" (which also broke /lt ml handoff's install check). Known versions are preserved while requests are suppressed, and a player who genuinely uninstalled now demotes properly after consecutive silent queries.
  • Vote re-polls work during ML handover — a council member's stored vote is re-broadcast even when the ML can't be resolved at that moment.

Fixed — sessions, voting & awards

  • Auto-award to a disenchanter no longer breaks loot distribution. A crash in the disenchanter scan aborted item processing mid-add, leaving the item stuck on the ML's client only — never announced, never voted. (The "raid note" scan it relied on used an API field that doesn't exist; it now uses the explicit setting and the guild-note fallback.)
  • Revotes clear the previous round's tallies. Vote counts displayed from the prior round until someone voted again, letting the ML award against phantom votes.
  • Votes can be retracted during the post-tally grace window, matching when they can be cast.
  • Council members who join mid-session see real ilvl-diff values instead of +0 for every candidate.
  • A remote candidate update carrying an unknown custom response no longer wipes the response you already recorded for that candidate.
  • Cross-realm disenchant awards go to the right player — the enchanter list returned bare names that were re-realmed to your realm.
  • Cross-realm party leaders are recognized consistently — a casing mismatch made non-ML clients treat the same leader as a new ML on party→raid conversion and wipe council/MLDB state mid-session.
  • Declining the "handle loot?" prompt no longer sticks forever. The decline latch survived leaving the group and silently suppressed the ML prompt in your next raid.
  • Item links sent to candidates keep their context (upgrade track/source) — the link neutralizer was zeroing the wrong field.
  • /lt ignore <itemID> works with a bare item ID, as the usage text always claimed, and prints the real item name for pasted links.

Fixed — UI

  • Closed dialogs can no longer silently dismiss unrelated prompts. Recycled dialog frames left stale tracking entries, so ending a session could dismiss the ML's open award confirmation, and stale entries could stall ML-state resolution.
  • Lists that shrink while scrolled no longer render blank (history search, session items, award matrix, and every other themed-scrollbar list) — fixed once in the scrollbar's range-clamp.
  • Hovering empty note/gear cells no longer shows another player's note or equipped item — pooled cells kept the previous row's data reference.
  • A slow-loading item no longer discards your in-progress response or ranking in the roll frame and vote panel, and no longer reopens a panel you closed.
  • Player Intel wishlist tooltips survive rebinding — they died permanently after the first refresh due to a frame-pool reset bug.
  • Filter menus toggle correctly while open — class/response/rank checkboxes read a stale snapshot, so un-checking re-added the filter and check marks never appeared.
  • Theme/accent switching no longer drops the ML's selected candidate (and the Award button no longer greys out).
  • Award reason reordering actually reorders — the up/down buttons were a visual no-op.
  • The sync panel's Send button recovers after visiting the Intel tab with no data, and the intel status icon no longer overlaps the Date Range label.
  • Combat-minimize can no longer restore an invisible, click-swallowing window when combat started during the close animation, and quick double-toggles reopen the window instead of feeling dead.
  • The results panel no longer declares a tie that contradicts its own winner, and version-check rows are pooled instead of leaking frames every query.

Fixed — debug tooling (dev)

  • Test mode can no longer broadcast fake sessions to a live raid — the lead/assist gate now applies to every enable path (/lt test full, scenarios, panels), not just /lt test on.
  • /lt test off fully disconnects test hooks — an orphaned callback could write fake responses into live loot items, and /lt sim off left fake council members that could be saved into your real roster.
  • Test runs no longer block settings saves for the rest of the session, wipe your in-memory history view, destroy a real reconnect cache, disable secret-value guards, or transmit garbage to your group.
  • Eight test suites that crashed or silently skipped due to nil module references now load and run correctly (the lint whitelist that masked them is gone), and two suites no longer spam failures into chat at every login.

This mod has no related projects