Skip to content

Releases: Cieper/wow-gearfall

0.4.1

Choose a tag to compare

@github-actions github-actions released this 26 Oct 19:37
0.4.1
473c076

GearFall

0.4.1 (2026-10-26)

Full Changelog Previous Releases

  • Version 0.4.1
  • Fix Windwalker being offered non-Agility weapons
    Co-authored-by: BlueAI Platform/opencode/GLM-5.3-Flash orosei-sylvanas@murlo.cz

0.4.0

Choose a tag to compare

@github-actions github-actions released this 10 Oct 22:00
0.4.0
4afe7d1

GearFall

0.4.0 (2026-10-10)

Full Changelog Previous Releases

  • Version 0.4.0
  • Remember mail/bank rows after their source closes; badge layout
    Last-visit snapshots (session-scoped): while the mailbox or bank is
    open every scan refreshes that source's snapshot; when it closes the
    stored rows keep feeding the draft stamped sourceClosed - remembered,
    still drafted and cascading like bag items, never claimable (the
    lootable predicates refuse them). Closing a source now refreshes the
    draft, so rows convert to remembered instead of lingering stale.
    Remembered rows grey their envelope/chest badge out instead of hiding
    it - desaturated, dark vertex tint (SetDesaturated no-ops on atlas
    textures like the envelope), dimmed, button disabled, tooltip says
    "from your last visit". Auto-open never fires for remembered rows,
    and bag changes rescan while the window itself is on screen. Badges
    also moved from trailing the advice text into a fixed two-slot column
    at the row's right edge (envelope outer, chest inner), so they sit in
    the same spot on every row and header and a mixed header shows them
    side by side.
    Co-authored-by: BlueAI Platform/opencode/GLM-5.3-Flash orosei-sylvanas@murlo.cz
  • Bank and Warbank scanning with withdraw claims
    While the bank frame is open, character bank and Warbank tabs are
    scanned as a third inventory (C_Bank tab data + the container APIs
    Blizzard's own BankPanel uses; bag bind gate kept for soulbound
    storage). Bank rows draft like bag rows, carry a chest badge that
    withdraws the item (or a whole header's worth), and a staged
    Withdraw from Bank button works one draft stage per click. The
    withdraw move is Blizzard's own right-click withdraw
    (C_Container.UseContainerItem on the bank tab slot), so items land
    in the first empty bag slot; each command is confirmed by polling
    the source slot empty. Bank rows are never attached to a letter
    directly - withdrawing re-enters them in the bag pipeline.
    Co-authored-by: BlueAI Platform/opencode/GLM-5.3-Flash orosei-sylvanas@murlo.cz

0.3.0

Choose a tag to compare

@github-actions github-actions released this 10 Oct 18:43
0.3.0
00053c3

GearFall

0.3.0 (2026-10-10)

Full Changelog Previous Releases

  • Version 0.3.0
  • New gearing rule: never make respec suggestions
    A sibling-only item (the alt's own spec rejects it, another spec of the
    class would use it) can now be a final "no" instead of a respec hold.
    One gate in SpecUsesItem's known-spec branch, before the sibling probe:
    no respec verdicts, no respec holds, no respec tags anywhere downstream;
    the rejection reason stays the honest main-spec one. Per-alt override
    wins over the account-wide default; the spec-less class question is
    deliberately untouched.
    Co-authored-by: BlueAI Platform/opencode/GLM-5.3-Flash orosei-sylvanas@murlo.cz
  • Unique-Equipped items: plan at most one copy per alt
    Two identical Unique-Equipped trinkets were both drafted to the same
    alt (one into each trinket slot) even though the alt can only ever
    wear one. GetItemLinkInfo now captures a uniqueEquipped flag from
    C_Item.GetItemUniquenessByID - calibrated on 120100: the plain tooltip
    line reads back isUnique=true with nil category fields, so the flag
    accepts the category-less shape (and, defensively, the -1 pseudo-
    category); a named limit category flags only when its cap is 1.
    A copy of a unique the alt already wears still pins to the worn slot
    (higher ilvl = upgrade of that slot), and a duplicate of a copy already
    inbound - real send ledger or draft projection - pins the same way and
    scores delta 0, falling to the next alt or Left over. The hold budget
    follows suit: one unique copy per item per alt. /gear debug stats now
    prints the raw uniqueness API values beside the flag, and the scan
    report marks flagged items UNIQUE-EQUIPPED.
    Co-authored-by: BlueAI Platform/opencode/GLM-5.3-Flash orosei-sylvanas@murlo.cz
  • Add /gear flush and a Distribution alert for stale incoming-gear promises
    A mailed upgrade that got returned or expired used to leave a promise
    that never cleared: the slot stayed phantom-blocked and the window kept
    "Arrived - equip it" state for gear that would never arrive. /gear flush
    [alt|all] (with confirm) drops the stale ledger, and the Distribution
    window grows a warning-! alert (transmog-icon-warning-small) beside the
    Rescan button when promises to the current character are not visible in
    the draft - right-click it to clear.
    Co-authored-by: BlueAI Platform/opencode/GLM-5.3-Flash orosei-sylvanas@murlo.cz

0.2.2

Choose a tag to compare

@github-actions github-actions released this 10 Oct 15:15
0.2.2
b7b1c0f

GearFall

0.2.2 (2026-10-10)

Full Changelog Previous Releases

  • Grey/white items are no longer suggested as "save for later" when they will never be an upgrade.
  • Never advise "save for later" for items that can never be upgrades
    A Poor/Common candidate is permanently unable to beat Uncommon+ gear,
    while the level and weapon load-out gates behind "eventually" are only
    temporary. When eligibility answers "eventually" but the statless gate
    would block EVERY candidate slot, ScoreItemForAlt now falls through to
    normal scoring instead of returning the hold: the item reports as
    wearable-but-not-an-upgrade ("safe to sell/enchant") from the start
    instead of flipping to "not an upgrade" once the alt levels past the
    requirement.
    The "eventually" verdicts (level gate and all four load-out gates) now
    return slotID/candidateSlots so the scorer can resolve target slots.
    Snap collection (worn + mail-ledger incoming, with the self-arrival
    nuance) moved into CollectSlotSnaps so evalSlot and the new
    StatlessBlockedEverywhere share one implementation. Any unblocked
    candidate slot (an empty finger, an empty chest) keeps the "eventually"
    hold - a statless item stays a legal fill there. Unresolvable or
    quality-less snapshots fail open, like every other gate.
    Co-authored-by: BlueAI Platform/opencode/GLM-5.3-Flash orosei-sylvanas@murlo.cz

0.2.1-a

Choose a tag to compare

@github-actions github-actions released this 10 Oct 14:00
0.2.1-a
307dcee

GearFall

0.2.1-a (2026-10-10)

Full Changelog Previous Releases

  • Added a CHANGELOG and automation to upload new versions automatically
    from GitHub to CurseForge, WoWInterface, and wago.io.

0.2.1

Choose a tag to compare

@github-actions github-actions released this 10 Oct 13:57
0.2.1
307dcee

GearFall

0.2.1 (2026-10-10)

Full Changelog Previous Releases

  • Added a CHANGELOG and automation to upload new versions automatically
    from GitHub to CurseForge, WoWInterface, and wago.io.

0.2.0

Choose a tag to compare

@github-actions github-actions released this 10 Oct 11:39
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 on...
Read more