Repository navigation
Releases: Cieper/wow-gearfall
Releases · Cieper/wow-gearfall
Release list
0.4.1
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
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
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
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
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
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
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 on...