Repository navigation
0.2.0
GearFall
0.2.0 (2026-10-10)
Full Changelog Previous Releases
- Use BigWigs Packager
- Update README and ship as v0.2.0
- Ignore Bright Linen Fishing Hat
- Fix the ignore context menu generator signature
Menu.PopulateDescription calls the generator as generator(ownerRegion,
rootDescription) - the owner region is the first argument, the root
description the second. Our generator bound the first argument as the
root description, so root:CreateTitle hit a nil (the error was
"attempt to call a nil value" the moment a row was right-clicked).
Skip the owner region, take the description second.
In-game finding: right-clicking a Distribution row threw instead of
opening the menu.
Co-authored-by: BlueAI Platform/opencode/GLM-5.3-Flash orosei-sylvanas@murlo.cz - Fix the Distribution row right-click ignore menu
The row template registered only LeftButtonUp, so right-clicks never
reached OnClick and the FR-9 context menu could not open. Register
RightButtonUp as well; left-click link behavior is untouched.
In-game finding: /gear ignore worked, right-clicking a row did nothing.
Co-authored-by: BlueAI Platform/opencode/GLM-5.3-Flash orosei-sylvanas@murlo.cz - Add ignored items (FR-9): shipped defaults, per-item and single-copy ignores
Some items are never upgrades (fishing hat, cosmetic wands) and some
specific copies are meant for the Auction House instead of the roster.
Ignored items are dropped at the ScanEligibleItems choke point, so no
downstream consumer - draft, window, debug score - ever sees them, and
/gear debug scan bags reports the drop counts per tier.
Three tiers, checked in order:- shipped defaults (ItemIgnores.lua, itemID): Elegant Artisan's Fishing
Hat and the four Scepter of Spectacle toys, all copies, forever - user permanent (db.ignores.items, itemID): one item, all copies,
all characters - user single-copy (db.ignores.instances, keyed by C_Item.GetItemGUID):
exactly one bag copy; sibling copies keep normal verdicts. GUIDs are
per-instance and relog/mail/trade-stable, realm-minted (A->B->A = 3
GUIDs), so a single-copy ignore expires exactly when the copy leaves
the realm. Mail attachments have no ItemLocation, hence only the
permanent option there.
Surfaces: /gear ignore [once] | remove | list (a submenu
like /gear debug), and a MenuUtil context menu on Distribution rows
(bag rows: both tiers; mail rows: permanent only). The slash flow and
the row menu share one set of actions (addon.IgnoreItemPermanently /
IgnoreItemCopy / RemoveItemIgnores); every change refreshes the window.
The 'once' flow scans raw bags and refuses to guess among multiple
copies, pointing at the row menu instead. No auto-cleanup: orphaned
GUID entries are inert by construction and removable via 'remove'.
Scan.lua now stamps itemID on every itemInfo and a GUID on bag rows.
Pinned end to end in the smoke harness: tier order, sibling survival,
multi-copy refusal, combined removal, slash flows, menu option sets.
Co-authored-by: BlueAI Platform/opencode/GLM-5.3-Flash orosei-sylvanas@murlo.cz
- shipped defaults (ItemIgnores.lua, itemID): Elegant Artisan's Fishing
- Split Distribution.lua into the Distribution_* module family
Pure-move refactor along the file's own section seams - no behavior
change. Distribution.lua had grown to 2,964 lines (36% of the codebase)
across eight distinct concerns; the split follows them:- Distribution_Draft.lua: the suggestion engine (BuildDistributionSuggestions)
and per-alt verdicts, plus the shared formatting helpers every sibling
consumes via addon.* (FormatDelta, ClassColor, RowSlot, KIND_COLOR) and
the bag tooltip advice hook. - Distribution_Send.lua: the outbound mail pipeline (Mail All Upgrades,
ExecuteMailForRecipient, the per-recipient Send/Skip/Cancel dialog,
send history) and the mailbox pipeline state (addon.MailboxOpen /
addon.MailRunActive) shared by loot and equip. - Distribution_Loot.lua: the loot-from-mail claim planners (staged,
per-header, per-item) and executors (ExecuteMailLoot/RunMailLoot). - Distribution_Equip.lua: the whole Equip Arrived chain (plan builders,
arrival poll, cursor-based equip sequencer). - Distribution.lua: the window only - row mixin, frame creation, button
wiring (the UpdateBtn trio stays here: they touch the window-local
distFrame), summary bar, mailbox event frame and auto-open.
Load order mirrors the pipeline (Draft -> Send -> Loot -> Equip ->
window) and still defines the row mixin before GearFall.xml processes
it. Only cross-section locals were promoted to addon.; everything else
stayed module-local. Smoke harness file list updated; smoke test and
wowlua_ls both green with zero pin changes.
Co-authored-by: BlueAI Platform/opencode/GLM-5.3-Flash orosei-sylvanas@murlo.cz
- Distribution_Draft.lua: the suggestion engine (BuildDistributionSuggestions)
- Add the Equip Arrived button and inbound-mail auto-open
- Conditional "Equip Arrived" button (bottom-left): visible while the
draft holds arrived promises for the current character, counting both
bag copies and copies still in the inbox. One click runs a two-phase
chain: claim this character's arrived inbox attachments through the
loot sequencer (RunMailLoot, the guard-free split of ExecuteMailLoot),
poll the raw bags until every claimed copy proves its landing (a take
command proves the mail side only - the copy is briefly in transit, in
neither place), rebuild the draft once the landing is proven, then
equip one item at a time. - Equips go through the cursor, the manual drag-to-paperdoll flow in one
pass: PickupContainerItem + EquipCursorItem into the exact slot the
draft scored (server-side auto-equip would pick the first legal slot
and could displace the strong ring of a 100 + 10 pair). The carried
copy pins the cursor, which is what keeps Blizzard's soulbind confirm
popup alive across world mouseovers - both software-only commands
(C_Item.EquipItemByName, then the bag click C_Container.UseContainerItem)
lose the pending equip to any cursor change. The popup is never
answered by the addon: dialog gone without equipping = user said No
(stow the cursor copy, skip, keep the ledger promise); cursor still
holding after 8s silent = refused swap (stow, skip); worn anywhere on
the paper doll = success (ledger promise cleared by identity). - Hardening: bag coordinates are re-verified by item ID and drifted
copies re-located (FindBagCopy) instead of skipped; a pre-carried
cursor is stowed before pickup; any stow that fails (bags full) stops
the run with a warning rather than stranding an item mid-air; a gone
take hands back to the sequencer over the bag copies the click
started with; a never-landing timeout finishes gracefully. - MAIL_SHOW (plus the guaranteed-rescan chain and MAIL_INBOX_UPDATE
rescans) auto-opens the window when gear is inbound - GearFall-routed
arrived copies still in the inbox - or when mailable upgrades exist.
Closing the window while the mailbox is open dismisses the auto-open
for that mailbox session (_distDismissed).
Co-authored-by: BlueAI Platform/opencode/GLM-5.3-Flash orosei-sylvanas@murlo.cz
- Conditional "Equip Arrived" button (bottom-left): visible while the
- Treat ranged weapons as two-handers in the load-out rules
Guns, bows and crossbows (INVTYPE_RANGED, legacy INVTYPE_RANGEDRIGHT)
filled the whole weapon load-out but blocked nothing: IsTwoHanded only
knew INVTYPE_2HWEAPON, so a Survival hunter wearing a respec-leftover gun
got an offhand agility dagger drafted into the empty offhand through the
spec's dual-wield policy. Ranged invTypes now count as two-handed
everywhere load-out shape matters - worn ranged blocks 1H/offhand
candidates and never pairs with a second weapon, even with
allowWeaponLoadoutSwap - while same-shape swaps (gun to better gun) stay
plain upgrades. The Wand subclass is carved out: wands are one-handed and
keep pairing with an offhand frill. Classifying ranged as weapons also
routes class-metadata-less ranged items into the weapon-type gate instead
of the armor gate (weapon subclass 2 read as Leather).
Gear snapshots now record the weapon subclass beside the invType so the
wand/gun split is exact; legacy subclass-less snapshots fail closed on
RANGEDRIGHT (never a wand) and fail open on bare RANGED (wand-safe) until
the character's first capture after the update.
Co-authored-by: BlueAI Platform/opencode/GLM-5.3-Flash orosei-sylvanas@murlo.cz - Recognize arrived pending upgrades in the draft
The incoming ledger (mailed-but-not-yet-equipped projection) only clears
on equip proof, so it read the promised item's own arrival as 'not an
upgrade' and re-drafted it to the next alt down. Scoring now drops the
slot's incoming snapshot when the candidate IS that copy and the alt is
the current character (identity: itemID + itemLevel), and the draft pins
such a candidate to 'Keep for yourself' before the strategy competition,
rendered as 'Arrived - equip it'. The pin requires delta > 0 so a
superseded promise (something better equipped meanwhile) re-offers
normally, and projects into the sim ledger so only one copy per promise
pins; sender-side duplicates stay blocked.
Co-authored-by: BlueAI Platform/opencode/GLM-5.3-Flash orosei-sylvanas@murlo.cz - Initial commit