BijouRR-v1.2.12-classic
What's new
BijouRR Changelog
All notable changes to BijouRR are documented here.
[Unreleased]
Nothing yet.
v1.2.12 - 2026-10-04
Changes
- [TOC-002] LOW
## Title:coloured in the fleet brand orange,|cffFF8000BijouRR|r, so BijouRR matches the other addons in the in-game AddOns list (DeltaSync contract, 2026-09-27). BijouRR is not a library, so no## Category:line. Location: BijouRR.toc.
Documentation
- docs/Curseforge_Description.html: "Recent Updates" entries for v1.2.8 to v1.2.10 regrouped under New / Changed / Fixed headings, and the v1.2.8 entry rewritten in player language (it named
logged_off_time,CandidateMatches,GetNumGroupMembers()and other internals). v1.2.7 dropped to keep the last five patches.
Repository
- Language-server hints cleared: unused AceConfig
infoand event-handlerself/ vararg arguments renamed to_in BijouRR.lua and BijouRRConfig.lua;master_specsets the missing-pack global throughrawset. No behaviour change. Tests/guards_spec.lua: the refused-registration spec assertedis_nilon the literal keyBRR_DATA_PACK_REGISTRY.Nameless, which would keep passing if the key were misspelled. It now snapshots the whole registry before the two refused calls and asserts it is unchanged afterwards (Writ peer review 935f3fb1).
v1.2.11 - 2026-09-24
Bug Fixes
- [DEPS-001] HIGH A CurseForge install of BijouRR did not load: VersionCheck-1.0 hard-depends on LibAceGUIWidgets (
## Dependencies: Ace3, LibAceGUIWidgets), CurseForge installed BijouRR without it, and the client then refused VersionCheck-1.0 and so BijouRR. AddedLibAceGUIWidgetsto BijouRR.toc## Dependencies:andlibaceguiwidgetsto.pkgmetarequired-dependencies. BijouRR does not call the library itself; nothing in its existing UI maps onto a LibAceGUIWidgets widget without adding behaviour, and the goal was only that it installs. - [TESTITEM-001] MEDIUM
/bijoumaster testitempredicted Master Looter routing for any data-pack item and "ignored" for any Various item regardless of the toggles, and checked the skill-book skip before the designation (the reverse ofLOOT_OPENED). The verdict now follows the loot handler's order and state: Various whileBRR_VARIOUS_ENABLED, thenGetMasterDesignation, then the skill-book skip, else round-robin if a category claims it. Location: BijouRRMaster.lua. - [MASTER-005] LOW
GetCurrentMasterLooter's roster fallback testedisML == 1; it now tests truthiness, as Blizzard's RaidUI does, so a boolean return also matches. Location: BijouRRMaster.lua. - [TOC-001] LOW
## Version:token lowercased toBijouRR-v1.2.12, matching every other TOC on the box;## Author:corrected fromPmptastytoPimptasty, the account the addon publishes under. - [DEAD-002] LOW Removed code with no production entry point:
count()and the empty-excludeTablebranch (BijouRR.lua),DesiredThreshold()'snilpath (folded intoTryLowerThreshold), theNewAddonfallback in BijouRRConfig.lua,GetAhnQirajItems()(Data Packs/AhnQiraj.lua), and theIsSkillBook-missing branch oftestitem.
Documentation
- [DOCS-001] LOW README.md and docs/Curseforge_Description.html audited claim by claim against the code, and corrected where they disagreed with it (the addon was not changed to match; the operator's directive for this addon is no new functionality):
- "Manual Exclusions: add specific item IDs to the exclusion list on the fly" described a feature that does not exist;
excludeTablein BijouRR.lua is a fixed list. Now "Always Excluded", pointing at/brr excluded. - The Various pack was described as always ignored;
IsInVariousPackonly applies whileBRR_VARIOUS_ENABLED(default off). Both documents now say so, and the FAQ names the real table (the page named a nonexistentBRR_VARIOUS_ITEMS) without code identifiers. - Distribution priority listed the skill-book skip ahead of Master Looter routing; the
LOOT_OPENEDhandler checks designations first. Both documents now give the handler's order. - Data pack contents: 11382 is Blood of the Mountain (labelled Sulfuron Ingot); the BWL and ZG packs hold one item each (not "and crafting materials"); the Various list now names every entry.
- README config section used names the panel does not show ("Enable Auto-Distribution", "Coins", "Enable Master Loot System"); now the panel's own labels, plus the four entries it omitted (Enable Various Exclusions, Enable Chat Logging, Reset All Cycles, Show Status).
/bijoumaster setmasterwas presented as a required setup step; it is a fallback for whenGetCurrentMasterLooterfinds nobody.
- "Manual Exclusions: add specific item IDs to the exclusion list on the fly" described a feature that does not exist;
- In-addon text in BijouRRConfig.lua: the "Enable Master Designations" tooltip claimed Various items are ignored whenever it is on and omitted AQ; the Information box omitted Common and Junk. Both corrected.
Repository
- Offline test suite on the shared WoWAPITesting harness:
Tests/wowapisubmodule (pinned atf885157),.bustedshim,Tests/bijou.luafixture (rebuilds the addon per test in client order: files, then SavedVariables restore, thenADDON_LOADED/OnInitialize, raising ifOnInitializeerrors inside AceAddon'ssafecall), and specs for load/defaults/rotation guard/VersionCheck,LOOT_OPENEDdistribution and priority, master-loot routing and/bijoumaster,/brrand the loot threshold, the options panel, load guards, and the TOC/.pkgmeta dependency contract. 174 specs; 100% line coverage of all eight source files. Run withlua Tests/wowapi/run.luafrom the addon root. .luacheckrcadded (addon globals declared; whitespace warnings and AceConfig's unusedinfoargument ignored)..luarc.jsongained the spec DSL globals and ignoresTests/wowapi..pkgmeta:Testsadded toignore; removed dot-entries (the packager prunes them anyway) and the**/globs, which never match./brrhandler: the emptyelseif input == "" thenbranch replaced with a guard;IsSkillBookreadsGetItemInfo(itemLink or itemID)once.
v1.2.10 — 2026-07-22
Bug Fixes
- [API-001] HIGH Addon failed to load after Blizzard's Classic Era API refresh — the AddOn-management functions were moved into the
C_AddOnsnamespace and the old flat globals (IsAddOnLoaded,GetAddOnMetadata, etc.) were removed. BijouRR cached both at file-scope during load (local IsAddOnLoaded = IsAddOnLoaded,local GetAddOnMetadata = GetAddOnMetadata), so they capturednil, and the firstIsAddOnLoaded("VersionCheck-1.0")call in theADDON_LOADEDhandler threwattempt to call a nil value(BijouRR.lua:598), aborting init. Fix: resolve both caches fromC_AddOnsfirst, falling back to the legacy global —local IsAddOnLoaded = (C_AddOns and C_AddOns.IsAddOnLoaded) or IsAddOnLoaded(same forGetAddOnMetadata). VerifiedNamespace = "C_AddOns"/Environment = "All"for both functions in the updatedAddOnsDocumentation.luaAPI dump. Also addedC_AddOnsto.luarc.jsondiagnostics.globals. Location: BijouRR.lua (top-of-file API caches), .luarc.json.
v1.2.9 — 2026-07-09
Features
[AQ-SPLIT] Split the single "Auto-Designate AQ Items" toggle into two independent toggles — Auto-Designate AQ20 Items (Ruins of Ahn'Qiraj idols, 20866–20868) and Auto-Designate AQ40 Items (Temple of Ahn'Qiraj idols, 20869–20876). Previously one toggle (
BRR_AQ40_ITEMS_TO_MASTER) designated both tiers at once. Guilds running AQ20 only can now route AQ20 idols to the Master Looter without also committing AQ40. Adds aBRR_AQ20_ITEMS_TO_MASTERSavedVariable (defaultfalse) andGetAhnQiraj20Items/GetAhnQiraj40Itemsdata-pack getters; the AhnQiraj pack now builds its combined list from the two tier sublists so they cannot drift.- Migration: an ML who previously enabled the combined "AQ Items" toggle keeps AQ40 auto-designation but must tick the new AQ20 box to restore AQ20 idol routing (AQ20 defaults off).
[COMMON-ITEMS] Added an opt-in single-toggle category that round-robins all Common (white, quality 1) items to the raid — Hourglass Sand (the Chromaggus cure in Blackwing Lair), Runecloth, white gear, etc. — detected by quality via
IsCommonItem(no whitelist). Distributed like coins/bijous (per-loot-window duplicate guard, cycle reset,/brr statusline, cleared in all three reset paths). The loot loop excludes items already claimed by a specific category (coins, bijous, scarabs, gems, lockboxes — all of which are also white) so those keep their own rotation. NewBRR_COMMONtoggle (config "Distribute Common Items" +/brr common) withcommonList/commonsDistributedstate andTryToDistributeCommon.- The single toggle also handles the loot threshold. White items only reach the master-loot window at a Common threshold —
SetLootThreshold(1), confirmed working in Classic Era (the wikis' claim that it errors below Uncommon is retail-only). Enabling "Distribute Common Items" (config or/brr common) lowers the threshold to Common when you lead a raid: immediately on enable and onGROUP_ROSTER_UPDATE/PLAYER_ENTERING_WORLD, via thepcall-guarded threshold helper (the event-time call may be blocked as protected; it degrades silently, and manual/brr thresholdcommands always work). RegisteredGROUP_ROSTER_UPDATE/PLAYER_ENTERING_WORLDon the addon frame. Note: a Common threshold routes all white items raid-wide through the loot window (they stop being free-for-all); grey/poor items stay free-for-all. - Stacks (documented behavior):
GiveMasterLootassigns an entire loot slot, and WoW cannot split a stack during looting (LootSlotis whole-slot; splitting only exists in bags post-loot), so a stacked drop — e.g. Hourglass Sand ×3 or a Runecloth stack in one slot — is handed in full to a single player. The round-robin spreads items across separate drops, not within one stack. This is a WoW master-loot limitation, not an addon choice. - Persisted:
BRR_COMMON,commonList,commonsDistributedadded to## SavedVariables:.
- The single toggle also handles the loot threshold. White items only reach the master-loot window at a Common threshold —
[JUNK-ITEMS] Added a parallel opt-in "Distribute Junk Items" toggle that round-robins all Junk (grey/Poor, quality 0) items, mirroring Common Items (
IsJunkItem,TryToDistributeJunk,BRR_JUNK,junkList/junksDistributed,/brr junk, same category exclusions, status/reset plumbing). Enabling it lowers the loot threshold to Poor —SetLootThreshold(0), confirmed working in Classic Era. The threshold helper is generalized (DesiredThreshold/TryLowerThreshold): it targets the lowest level any enabled toggle needs (Poor if Junk is on, else Common if Common is on, else leaves it alone), and the config toggles set the same. Because Poor is the floor, a Poor threshold routes everything through the loot window (nothing stays free-for-all) — so Junk + Common together give full auto-distribution. Manual/brr threshold pooradded. Persisted:BRR_JUNK,junkList,junksDistributed.
Bug Fixes
[DESIGN-001] HIGH Master-loot designations were a persisted snapshot that went stale against data-pack updates.
masterLootDesignations/masterLootByNamewere saved to disk and only ever populated at toggle-click time, so any item added to (or removed from) a data-pack file in a later version never took effect for an ML who had already enabled that pack — the saved snapshot stayed frozen at whatever the pack contained when they first ticked the box. Fix: removed both tables from## SavedVariables:in BijouRR.toc; they are now rebuilt from the registry at load byRebuildMasterDesignations()(called fromBijouRR:OnInitialize, after the toggle booleans restore and the data packs register), driven by which pack toggles are on. The data packs are now the single source of truth — updating a pack file takes effect on the ML's next login with no re-toggle, and removed IDs no longer linger as orphaned designations. Location: BijouRRMaster.lua (RebuildMasterDesignations), BijouRRConfig.lua (OnInitialize), BijouRR.toc.[MASTER-004] LOW
GetValidMasterLootMembersusedGetNumGroupMembers()as the candidate-list loop cap — the same anti-pattern MASTER-001 fixed insideDistributeMasterLoot. Master-loot candidate indices are not guaranteed 1:1 with group-member count, solastGroupMembers(the denominator in "Completed X/N" messages and/brr status) could be undercounted. Fix: loop1..40and break on the firstnil, matching the corrected pattern elsewhere. Location: BijouRR.luaGetValidMasterLootMembers.[STATUS-001] LOW The per-player summary line of
/brr statuswas garbled —print(... "Coins" .. " Scarabs" .. scarabs)produced output likePlayername: 2 Bijous, 1 Coins Scarabs0, missing a separator and placing the "Scarabs" label before its count. Fix: corrected the format string toN Bijous, N Coins, N Scarabs. Location: BijouRR.lua/brr statushandler.[DATA-001] LOW The Various data pack listed item 18404 labeled "Onyxia Hide Backpack," but 18404 is actually the Onyxia Tooth Pendant (a quest neck that does not drop in raids). The backpack's exclusion was never affected — it is hard-excluded as 17966 in the unconditional
excludeTable— so this was a mislabeled no-op, not a broken exclusion. Fix: corrected the Various entry to 17966 to match its label. Location: Data Packs/Various.lua.[DATA-002] LOW The Ahn'Qiraj data pack registered itself under the key
"AhnQiraj"while the other packs use display-friendly names ("Molten Core","Blackwing Lair","Zul'Gurub"), producing inconsistent output in/bijoumaster statusand/bijoumaster testitem. Fix: registered as"Ahn'Qiraj". Location: Data Packs/AhnQiraj.lua.
Repository
- Brought the repo up to current addon-project conventions: added
CLAUDE.md,.luarc.json(Lua language-server globals),.markdownlint.json/.markdownlintignore, and aLICENSEfile (All Rights Reserved; maintained fork of the original BijouRR by Kaytooben, continued by Pimptasty). These are development files and are excluded from the packaged zip via.pkgmeta.
v1.2.8 — 2026-04-02
Bug Fixes
[PERSIST-003] Fixed
logged_off_timedeclared aslocal, defeating the 1-hour rotation reset guard — the variable was never persisted by WoW's SavedVariables system, so coin/bijou/scarab/green/gem/lockbox rotation lists were wiped on every login regardless of how recently the player logged off. Changed tologged_off_time = logged_off_time or 0.[DIST-001] Fixed five session receiver tables (
sessionBijouReceivers,sessionCoinReceivers,sessionScarabReceivers,sessionGemReceivers,sessionLockboxReceivers) being declared but never passed into theirTryToDistribute*functions. Without this, the per-loot-window duplicate-receive guard was non-functional for all categories except greens.[MASTER-001] Fixed
DistributeMasterLootnamed-player branch usingGetNumGroupMembers()as the candidate loop cap — the correct pattern is to loop up to 40 and break onnil, matching how theMASTERbranch already worked in the same function.[MASTER-001/002] Fixed master loot candidate matching ignoring realm suffixes — on connected-realm clusters,
GetMasterLootCandidatereturns"PlayerName-RealmName". Extracted aCandidateMatches(candidate, targetName)helper that does realm-aware comparison: if the target contains a-, requires a full case-insensitive match; otherwise compares base names only. Both branches ofDistributeMasterLootnow use this helper.[MASTER-003] Removed hardcoded
"pickyminer"fallback master looter name.BRR_MASTER_LOOTER_NAMEnow defaults tonilon a fresh install andDistributeMasterLootreturnsfalsewith a log message when it is unset, rather than giving loot to a hardcoded character. Use/bijoumaster setmaster <name>to configure.[DEAD-001] Removed dead
IsClassBookfunction (was a thin wrapper overIsSkillBookwith no callers) and the unuseditemIsClassBooklocal variable in the loot loop.
Documentation
- Added
docs/BUGS.mdbug tracker documenting all known and resolved issues (PERSIST-001 through DEAD-001). - Added
CHANGELOG.mdpopulated from full git history. - Added
docs/Curseforge_Description.htmlfor CurseForge listing.
v1.2.7 — 2026-04-02
Bug Fixes
[PERSIST-001] Added
BRR_LOGGINGto the## SavedVariables:line in BijouRR.toc. The verbosity toggle was configurable via the config panel and/brr logbut was not persisted — it reverted totrue(debug spam) on every login.[PERSIST-002] Added explicit
falsedefaults forBRR_VARIOUS_ENABLEDandBRR_AQ40_ITEMS_TO_MASTERin BijouRR.lua. Both were listed in SavedVariables and exposed in the config UI but had no initializer, causingnilboolean behaviour on a fresh install.[QOL-001] Changed
BRR_LOGGINGdefault fromtruetofalse. Debug item-scan output is now opt-in rather than on by default for all users.
Internal
- Suppressed
deprecateddiagnostic in the workspace LSP config forGetItemInfo— the annotation marks it deprecated for retail but it is the correct API for Classic Era (Interface 11508).
Pre-release History
The commits below predate version tagging and are grouped by feature milestone.
November 2025 — Content Additions
- Added Mojo of Madness drops to the Various data pack (2025-11-20)
- Added Ony Hide Backpack to the Various data pack (2025-11-18)
- Added AQ data pack covering items from both AQ20 and AQ40 (2025-11-15)
- Added Various data pack — items excluded from rolling and from going into the ML bag; added associated config options and readme (2025-11-15)
- Updated book/skill-book classification to read item data in real time rather than from a static table (2025-11-15)
- Implemented
/brr test <item>item test function to inspect how BijouRR will handle a given item; updated Tranq Tome item ID (2025-11-15)
October 2025 — BWL, ZG & Library Restructure
- Added ZG data pack covering Zul'Gurub master-loot items (2025-10-26)
- Moved Ace3 to a global shared library dependency and added version-check logic (2025-10-25)
- Simplified the Molten Core data pack (2025-10-25)
- Added BWL data pack and BWL exclusion list; updated
GetItemInfoto the current API call (2025-10-25) - Added class ability books to the exclusion logic so they bypass the loot roll system (2025-10-25)
- Fixed master looter designation code (2025-10-25)
- Cleaned up syntax errors (2025-10-24)
October 2025 — Exclusion System & Core Fixes
- Added sacks of gems to the exclusion system (2025-10-23)
- Added exclusion system; initially excluded Onyxia Hide Backpack (2025-10-23)
- Fixed green gear multi-drop logic — multiple green items dropping simultaneously now handled correctly (2025-10-23)
- Updated interface version to match current Classic Era patch (2025-10-23)
- Tuned automation event settings (2025-10-23)
October 2025 — v1.0.0 Initial Release (2025-10-22)
- Initial release of BijouRR — automated bijou, coin, scarab, gem, lockbox, and green-gear distribution for WoW Classic Era raids with master-loot integration.
This mod has no additional files