File Details
Loothing v2.0.21
- R
- Apr 19, 2026
- 903.09 KB
- 44
- 12.0.5+1
- Retail
File Name
loothing_2.0.21.zip
Supported Versions
- 12.0.5
- 12.0.1
Added
- Dreamrift tier tokens (Riftbloom family). The chest slot that Voidspire's Nullcore family doesn't cover is now recognized when you pick up one of the four Riftbloom tokens from the Dreamrift raid: Alnwoven (cloth), Alncured (leather), Alncast (mail), or Alnforged (plate) Riftbloom (item IDs 249347–249350). They appear in the loot picker / roll frame / council table with the correct chest slot, the "(Token)" badge, and the correct armor-class autopass. The detection table has the four IDs directly; the name-pattern fallback was also generalized to handle any Midnight S1 family that follows the
{Void|Aln}<material><suffix>convention (so future hot-fixed tokens Blizzard adds mid-patch still get slotted correctly before their IDs land in the table). - Simulator can fire kills from any raid, not just the current tier. The sim panel has a new Raid dropdown with every raid in the Encounter Journal organized by tier. Tiers are latest-first, with the current-tier final raid tagged
(latest). Selecting a different raid clears the boss dropdown and swaps the boss list so you can test councils against, say, Castle Nathria trinkets without waiting for Midnight bosses to ship. The selection is remembered for the lifetime of the session;/reloadresets to the latest raid. - Icon font across the addon. Loothing now ships Font Awesome 6 Free Solid as an embedded icon font (136 curated icons, ~31 KB), used everywhere an icon makes a UI surface easier to scan at a glance:
- Loot Response: the wishlist indicator finally shows a real ⭐ instead of the empty box WoW's default fonts were rendering for U+2605.
- Council detail popup: parse-performance trend (▲ / ▼ / —) now renders as colored arrow / minus glyphs on the right edge of the parses row, color-coded green / red / grey.
- Main frame tabs: Session shows a dice glyph, Roster a group-of-people glyph, Trade a handshake, History a counter-clockwise clock. Icons animate color alongside the tab text on hover / select / idle.
- Master Looter indicator: roster table shows a gold crown to the left of the ML's name instead of the
[ML]text tag. - Awarded items: a gold trophy glyph appears next to the winner's name in every item list.
- Settings panels: up / down reorder buttons use arrow-up / arrow-down glyphs, delete uses a red xmark, and help text gets an info-circle prefix. The loot picker's "Show blocked items" toggle gets a filter glyph.
- Sync panel: intel-share status shows a plug-circle-check / plug-circle-xmark next to the "Ready" / "No data" line.
- Loot Response title bar: a gold lock glyph appears when your response is locked-in so it's instantly obvious the frame is in review mode (not edit mode).
- Chat errors and warnings:
Loothing:Error(...)/Loothing:Warn(...)messages now prefix an inline alert / red-X texture so warnings stand out in your chat frame.Loothing:Warnis also a new function — it was referenced from 44 places but never defined, so those calls silently threw until this release.
- Loolib icon font API. Addon-library consumers can write
Loolib.Fonts:Icon("star")orLoolib.Fonts:IconColored("trophy", "ffcc00")to pull any of the 136 catalog glyphs, or callLoolib.Fonts:SetIconFont(myFontString, size)to retheme a FontString. Atools/build-icon-font.pyregeneration script re-subsets the upstream Font Awesome TTF from the catalog inCore/Fonts.lua.
Changed
- UI polish pass across every frame. The whole addon now feels more alive: windows fade in/out on show/hide instead of popping, icon buttons hover-scale and press-pulse, tab switches cross-fade, and text buttons tween their colors between hover and press states. The animation timing is tuned per surface (fast on clicks, gentle on panel transitions) and snaps straight to the final state if animations are disabled by the system. Affects MainFrame, RollFrame, VotePanel, CouncilTable, SessionPanel, HistoryPanel, RosterPanel, TradePanel, SyncPanel, DiagPanel, LootPickerFrame, AddItemFrame, ResultsPanel, IconPickerFrame, VersionCheckPanel, ResponseButtonSettingsFrame, AwardReasonsSettingsFrame.
- Button hover/press colors invert for contrast. Primary, success, warning, danger (and now default) button variants swap their text color to the panel background color when you hover or press — previously text stayed light, which became unreadable against the brighter accent/success/warning/danger fills. Every preset theme (amber, emerald, blue, crimson, etc.) now has readable button labels in every state.
- Accent gradient banner and pixel-perfect border on every polished frame. The title strip of every window now carries a soft vertical glow in your current Frame Behavior accent color (Amber, Crimson, Sapphire, etc.) — change the accent in Settings and every open window's banner updates live. Outer frame borders are snapped to a single device pixel so they render crisply at any UI scale.
- MainFrame tab indicator slides between tabs instead of snapping. The underline glides to the new tab on click; the first tab selection still snaps (so opening the frame feels instant).
- Loot Response frame response buttons now react to hover. Hovering Need / Greed / Offspec / Transmog / Pass tints the button's border and fades in a soft glow using that response's own color; the selected response stays pinned in gold so hover can't overwrite the selection state.
- Simulator panel buttons no longer silently disarm the live-raid safety gates. Clicking Toggle / Fire Kill / Queue Kill / Add Loot on the simulator panel previously passed
force = truebehind the scenes, bypassing every refusal (real raid, active session, open picker, encounter in progress). The panel now callsEnable(false)and surfaces the refusal message in chat just like the/lt sim onslash command does. If you want to bypass the gates, use/lt sim on force. - Roster panel Master Looter tag replaced by crown glyph. Rows previously showed
" [ML]"suffixed after the player's name. It now shows a gold crown glyph to the left of the name — faster to scan and matches the council table's ML indicator. - Roster panel council column cleaned up. The column previously showed
"--"for non-council rows and a heavy check-mark glyph for council members; the glyph was an empty box on most installs because the default WoW fonts don't include U+2714. The column now shows a green FA check glyph for council members and an empty cell for everyone else — less visual noise, no more tofu box. - Roster panel name column no longer hogs width. The name column was flagged as "fill" and claimed every pixel left over after the fixed columns — on a widened roster panel, this squished the ilvl / version / council / loot / rank columns to the point of truncating. The name column is now capped at 220 px so every other column breathes.
- Roster panel rank column widened so "Member" / "Leader" / "Assist" don't truncate to
Memb…. Column + row-text width bumped from 60 → 84 px.
Fixed
- Empty boxes (tofu) throughout the UI are gone. WoW's default fonts (Friz Quadrata, Arial Narrow) don't include glyphs for geometric shapes, dingbats, miscellaneous symbols, or most of the Private Use Area — so anything outside ASCII+Latin-1 rendered as an empty rectangle. Every tofu box the codebase was producing is now either drawn through the new icon font or replaced with an inline WoW texture escape. Specific sites that had empty boxes before:
- Loot Response wishlist line (the ⭐ before "On your wishlist: …")
- Move / delete buttons in Response Buttons and Award Reasons settings
- Council table detail popup parse-trend indicator (▲ / ▼ / ◆)
- Roster panel council column check mark
- Response-button settings "Icon set" label in every locale file (en, de, es, pt, ru, brainrot)
Loothing:Warn(...)was a silent no-op. 44 call sites across the codebase referencedLoothing:Warn— including the "too many items in session" warning in Loot Response, the trade-window-expiry warnings in Trade Panel, and several sim / comm handlers — but the method was never actually defined. Calling it threw an error that was absorbed by Blizzard's error handler.Addon:Warnnow exists alongsideAddon:Error, prints with a yellow triangle alert icon and[Loothing Warn]tag, and routes arguments through the same secret-masking helperErroruses.- Loothing now finds its icon font whether you installed Loolib as a standalone library or let Loothing ship the embedded copy. First release used a hardcoded path that only worked in the builder-generated embedded layout; the dev-symlink layout (standalone Loolib next to Loothing) tripped a "attempt to index field 'Fonts' (a nil value)" error on the main frame. The path now probes
C_AddOns.DoesAddOnExist("Loolib")and falls back to the embedded path on miss. - Council detail popup parse-trend glyph no longer drifts above the parses row. Trend arrow was anchored to the Mythic+ row above it rather than the parses row itself, so when the M+ text wrapped to two lines the trend glyph ended up floating between them. Re-anchored to the parses row's own top-right.
- Main frame tabs clip overlong localised names instead of overflowing the tab backdrop. With icons added, long translated tab names (German "Ratsversammlung" etc.) would have extended past the tab's right edge. Tab text now word-wraps off and truncates with ellipsis at the tab border.
- Dead
GetParseSummaryhelper in PlayerIntel deleted. The function was no longer called anywhere in the live addon (the council detail popup now readsintel.parseTrenddirectly), but still contained trend-arrow Unicode glyphs that would have produced tofu boxes if any future caller landed the string in a non-icon-font FontString. - Trinkets and off-class loot now actually drop in the boss-kill simulator. Two stacked problems hid trinkets from sim kills: (1) the Encounter Journal's class/spec loot filter is sticky across sessions and defaults to your character's class + spec —
C_EncounterJournal.GetLootInfoByIndexhonored it and quietly omitted any item not usable by your class, including trinkets with class restrictions and off-class tier tokens. The sim now brackets its loot read withEJ_SetLootFilter(0, 0)and restores the prior filter after, with a pcall wrap so a mid-read error can't leak the cleared filter into the player's live Encounter Journal UI. (2)GenerateItemsForBosspicked items cyclically in EJ order, always returning positions 1–3; trinkets typically sit at positions 10–15 of a loot list so at the defaultcount = 3they literally never came up. Switched to a Fisher-Yates shuffle so every item has an equal chance of being picked.math.randomis also seeded explicitly on simulator enable. - Loot Picker now cleans up when dismissed via ESC,
/console closeallwindows, or any other indirect hide path. The Cancel button already cleared the loot buffer, cancelled the debounce timer, and stopped the post-encounter bag scan viaSession:CancelPendingPrompt. The ESC key (whencloseWithEscapeis on) and any externalHide()caller were going straight through Blizzard's defaultframe:Hide()which bypassed all of that — leaving the buffer full, the timer armed, and the bag scan running. Hitting ESC now runs the same cleanup as the Cancel button. - Loot Picker no longer flashes "No tradable loot detected yet." during its fade-out. When a session ended or a new encounter started, Session wiped the loot buffer and fired the
OnLootBufferChangedevent BEFORE hiding the picker, causing the picker's live-update callback to re-render into an empty state for 130 ms of fade time. The picker is now hidden first (with cleanup suppressed so it doesn't fight Session's own wipe), then the buffer is wiped. - Loot Picker no longer processes
GET_ITEM_INFO_RECEIVEDevents for every item load in the game. The event listener that refreshes cold-cache rows stayed registered forever after the picker's first show, iterating its entries on every tooltip hover / chat hyperlink / bag scan in the game. The listener now registers on show and unregisters on hide. - Simulator
FireKillno longer gets stuck "in flight" forever if a session handler errors. A Lua error insideOnEncounterStartorOnEncounterEndleft the_firingmutex set true permanently, silently rejecting every subsequentFire Killclick with "A kill is already in flight" until reload. Those handler calls are now pcall-wrapped with the mutex cleared on error, andDisablealso clears the mutex so a fresh Enable always starts clean. - Simulator
RefreshTiernow invalidates every raid cache (cachedRaidsByID,_cachedRaidsList, and the single-raid pointer), not just the single-raid pointer, so a manual refresh picks up game patches that add new tiers or raids. - Simulator now restores the Encounter Journal's loot filter even if the read throws. Previously, a mid-read error between
pushEJLootFilterandpopEJLootFilterwould permanently clear the user's saved class/spec filter in the live EJ UI. The pop is also now unconditional — if an external path set a filter between push and pop, the restore still reapplies the original value rather than leaving the interloper in place. - Session filter fallback is now fail-closed when ItemFilter fails to load. The shim
IsItemClassBlockedin Session previously returnedfalse(allow everything) whenLoothing.ItemFilterwas missing. It now falls back to the seeded class-block defaults exposed by SettingsLootFilter, matching the behavior ItemFilter's own fallback already had when Settings was missing. - Loot Picker restore-on-failure preserves table identity.
StartSessionWithPickedItems's failure path used to reassignself.lootBuffer = priorBuffer, breaking any consumer that cached the table reference. It now useswipe()+table.insert()to mutate in place. - Raid dropdown in simulator panel no longer clips long raid names. "Amirdrassil, the Dream's Hope" and similar names used to overflow the 200 px text region and clip into the dropdown's right-side texture. Widened to 260 px. The
(current)marker on the latest-tier final raid was also renamed to(latest)to disambiguate from the selection checkmark. - Roll Frame session-item icons no longer jump farther the further down the list they are. The per-item icon grid on the left of the Loot Response frame used a
SetScale-based hover/press pulse; because each row's icon is anchored with a large-row * rowHeightoffset, the scale animation inadvertently multiplied that offset — the first row's icon barely moved, while the bottom row's icon translated downward and leftward by ~20 pixels on every hover. The scale polish was removed from the session-item icons entirely; Blizzard's built-in hover-highlight texture already provides the "button is interactive" affordance without touching the frame's scale. A note was added to the sharedAttachIconButtonPolishhelper so future callers know not to attach scale polish to buttons anchored at large parent offsets. - Shared animation engine no longer double-ticks a restarted animation. A secondary engine-level correctness issue was also fixed: when a running animation was stopped and immediately replayed, the stopped entry stayed in the active list until the next tick while a fresh entry was also scheduled, so both entries advanced the same animation each frame. Stopped entries are now removed immediately and re-scheduled animations dedupe against any stale entry, and the final tick snaps to the exact target value to prevent float drift across interrupted animations.
- Changing Frame Behavior accent now live-updates the Add Item, Response Button Settings, and Award Reasons Settings dialogs when they are open. The refresh dispatcher was looking up these three modals on the wrong global path, so an accent change took effect only when the user closed and re-opened them. The dispatcher now targets the mixin instances directly. As a belt-and-suspenders, every polished modal (Add Item, Response Button Settings, Award Reasons Settings, Loot Picker, Icon Picker) now re-applies the current accent inside its own Show() so reopening after a closed-state accent change also picks up the change.
- Roll Frame's "suppress unexpected hide" flag could get stuck on after an interrupted close. If you closed the Roll Frame and immediately reopened it while the 130 ms fade-out was still running, the fade-out's cleanup callback never ran — leaving the internal "ignore next unexpected Hide" flag stuck true. Subsequent combat-minimize or external Hide events would be silently swallowed until the next full close-and-reopen cycle. Show() now clears the flag whenever it interrupts an in-flight fade.
- Themed button hover/press colors no longer get overridden by a snap refresh mid-tween. When the theme refreshed (accent change, density change, OnShow, OnEnable) while a hover/press color tween was in flight, the snap refresh would write the target colors first, then the in-flight tween would immediately overwrite them on the next frame. The refresh now stops any running color and press animation groups before snapping, so theme changes win and hover transitions remain smooth in normal use.
- Rapid tab-switching no longer flashes the wrong panel. If you clicked Tab A → B → C faster than the cross-fade could finish (~180 ms), the deferred "fade in Panel B" closure would still fire after Panel C had started, briefly showing B on top of C. The deferred closure now checks whether the current tab is still the one it was scheduled for and bails out if not. The incoming panel's fade-in group is also captured so a follow-up fade-out can cancel it cleanly.
- Loot picker, roll frame, council rows, and vote panel all re-render cleanly when the item cache fills in. This covered tier tokens in 2.0.20; this release extends the same guarantee through every UI surface that renders an item's slot, and consolidates the slot-label formatting (including the
(Token)badge) behind a singleTokenData:FormatItemSlothelper so future UI surfaces pick it up automatically.

