Skip to content

0.2.0

Choose a tag to compare

@github-actions github-actions released this 10 Oct 11:39
· 12 commits to main since this release
0.2.0
8a74a2b

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
  • 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
  • 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
  • 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