|
1 | 1 | # Changelog |
2 | 2 |
|
3 | | -## Unreleased (3.7) |
| 3 | +## v4.0.0 - 2026-08-05 |
| 4 | + |
| 5 | +Major release. Consolidates all previously unreleased work (the destruction |
| 6 | +system, smart defaults, toasts, instance-aware junk) with a correctness pass |
| 7 | +over the sell, undo and destroy paths. |
4 | 8 |
|
5 | 9 | ### Added |
6 | 10 | - **Smart Defaults Engine** (`smartDefaults`, default: on) — Learns from your sell and keep decisions. Items you consistently sell (3+ times) are auto-checked in the popup; items you consistently un-check are auto-unchecked. "Learned" and "Kept" badges shown on popup rows. Tooltip shows "ASP: Learned — usually sold/kept". Data pruned on login (30-day decay, 200 item cap per list). |
7 | 11 | - **Toast Notification System** — Non-intrusive slide-in notifications from the right screen edge. Sell summaries now appear as toasts in addition to chat. Toasts stack vertically (max 5), auto-dismiss after 5s, with type-specific accent colors (success/info/warning/danger). Frame pool recycling for zero allocation. |
8 | 12 | - **Instance-Aware Junk Detection** — Tracks items sold per instance in a persistent database. When visiting a vendor after running an instance, items previously sold in that instance are suggested for selling. Popup title shows instance name when inside. Data pruned on login (90-day decay, min 2 sells required). |
9 | | -- **Enhanced Compact Mode** — Compact popup now shows the 5 most valuable items with icon, name, and price below the quality breakdown, giving a quick preview without switching to full mode. |
| 13 | +- **Destruction system v1** — Complete rewrite of the auto-destroy feature with separate destroy filters (quality, ilvl, max vendor value), a never-destroy list, countdown confirmation popup, and a bag pressure valve that auto-triggers when free slots drop below a configurable threshold. Items are destroyed one per tick with cursor verification for safety. |
| 14 | +- **AH value protection** (`ahProtectionEnabled`, default: off) — Protects items worth more than a configurable threshold on the AH from being auto-sold. Requires TSM or Auctionator. Popup rows where AH value exceeds a configurable multiplier of vendor price are color-coded, with a tooltip showing "Worth listing: AH Xg, vendor Yg (Nx)". |
| 15 | +- **Tooltip item status** (`showTooltipStatus`, default: on) — Shows ASP classification in item tooltips: "Will sell (quality filter)", "Protected (uncollected transmog)", "On never-sell list", etc. Works for items in bags, equipped gear, and merchant windows. Togglable in Settings > Display. |
| 16 | +- **Compact mode** (`compactMode`, default: off) — Condensed popup showing item count, total value, per-quality breakdown, and a one-click Sell button. Toggle between compact and detailed views via a button on either popup or `/asp compact`. All filters and protections still apply. The compact popup also shows the 5 most valuable items with icon, name, and price below the quality breakdown. |
10 | 17 | - **Unified Item Actions** — Shift+ALT+Click on bag items to add to always-sell list. Ctrl+ALT+Click to add to never-sell list. Visual flash feedback on both actions. |
| 18 | +- **Safe Mode template** — New profile template for new users: grays only, all protections on. Wizard defaults to Safe Mode when no template or profile is selected. |
| 19 | +- **Sell collected transmog** (`sellCollectedTransmog`, default: off) — Marks items with already-collected transmog appearances for selling. Items pass all existing protections before this criterion applies. |
| 20 | +- **Sell known collectibles** (`sellKnownCollectibles`, default: off) — Marks already-known mounts, pets, and toys for selling. Uses C_MountJournal, C_PetJournal, and C_ToyBox APIs. |
| 21 | +- **Relative ilvl threshold** (`useRelativeIlvl`, `relativeIlvlPercent`, default: off/70%) — Computes a single ilvl sell threshold as a percentage of the player's average equipped ilvl. When enabled, replaces per-quality ilvl sliders. Grays out quality ilvl controls and shows computed threshold in popup header. |
| 22 | +- **Mount equipment protection** (`protectMountEquipment`, default: on) — Toggleable checkbox in popup filters. Never sells mount equipment items. |
| 23 | +- **Warband item protection** (`protectWarband`, default: off) — Toggleable checkbox in popup filters. Protects all warband and account-bound items from selling. Detects bindType 7/8/9 with tooltip-based fallback. |
| 24 | +- **Dynamic bag ID support** — Uses `NUM_TOTAL_EQUIPPED_BAG_SLOTS` for reagent bag support instead of hardcoded bag range. |
11 | 25 |
|
12 | 26 | ### Fixed |
13 | 27 | - **Undo repurchased nothing** — `UndoLastSale` read the buyback price from the wrong `GetBuybackItemInfo` return slot (`numAvailable` instead of `price`). When the client returned `nil` there, the guard rejected every entry and the undo silently did nothing. The reported cost was wrong even when it did run. |
14 | 28 | - **Undo buyback ordering** — The buyback list is now walked from the highest index down. `BuybackItem()` removes an entry and shifts every higher index down, so a single descending pass keeps the remaining indices valid. Replaces a rescan-from-index-1 loop whose comment already claimed to iterate in reverse. |
15 | 29 | - **Undo skips unaffordable items gracefully** — Buyback costs are checked against your gold and reported instead of failing silently. |
16 | 30 | - **Undo buffer was wiped by the next sale** — `undoBuffer.items` aliased `ns.lastSoldBatch`, which is wiped in place at the start of every sell. The batch is now copied into the buffer. |
| 31 | +- **Undo buyback matching** — Use full item link comparison instead of name substring for more precise buyback matching. |
17 | 32 | - **Smart Defaults could never learn** — `PruneLearnedItems` dropped every entry below the 3-occurrence threshold on each login. Since counts start at 1, nothing survived long enough to be learned unless it was sold 3+ times in a single session. Pruning is now by 30-day age decay only. |
18 | 33 | - **First-run wizard could never be replayed** — `charFirstRunComplete` was force-set to `true` on every load for any existing character, before the wizard had a chance to run. It is now only backfilled for characters saved before the flag existed; `Wizard.lua` still sets it on genuine completion. |
19 | 34 | - **Selling away from a merchant** — `ProcessNextBatch` now verifies the merchant window is open before calling `UseContainerItem`, which sells at a vendor but *uses* the item anywhere else. |
20 | 35 | - **Destruction ignored Blizzard's confirmation dialog** — Valuable items raise a typed "DELETE" confirmation. The queue previously counted them as destroyed and cleared the cursor underneath the open dialog on the next tick. Destruction now pauses and hands the item back to you. Destroyed items are also verified a tick later instead of being counted optimistically. |
| 36 | +- **Destroy cursor safety** — Verify `GetCursorInfo` matches expected itemID before `DeleteCursorItem` to prevent accidentally destroying the wrong item when the player is dragging something. |
21 | 37 | - **Tooltip promised "Will sell" for unsellable items** — `ClassifyItem` now mirrors `ShouldSellItem`'s `isLocked` and `hasNoValue` gates. |
22 | | -- **Mount equipment comment** — Corrected a stale comment that said `classID 4 = Armor` above a `classID == 15` check. |
| 38 | +- **Mount equipment misclassified** — Mount equipment is Miscellaneous (classID 15, subclassID 6), not Armor (classID 4). Items like Light-Step Hoofplates are now correctly detected, and the stale comment claiming classID 4 has been corrected. |
| 39 | +- **CanIMogIt locale detection** — Use CanIMogIt's own `NOT_COLLECTED` constants instead of hardcoded English string matching. Fixes false positives on non-English clients. |
| 40 | +- **Warband detection unreliable** — `GetItemInfo` bindType is unreliable for many warband items (reagents, trade goods). Added tooltip fallback via `C_TooltipInfo` using Blizzard's localized binding globals for reliable detection. |
| 41 | +- **Bindings.xml parsing error** — Removed invalid `header` attribute from Binding element. The section header is provided by the `BINDING_HEADER_AUTOSELLPLUS` global. |
23 | 42 | - **`/asp undo` missing from help** — The command was implemented and documented in the README but absent from `/asp help`. |
24 | 43 |
|
25 | 44 | ### Improved |
26 | | -- **Vendor mount detection** — `IsVendorMount` queries the four known vendor mount IDs directly instead of walking the player's entire mount collection on every popup open. |
27 | 45 | - **Test coverage** — Added 40 tests across 7 new suites covering undo/buyback, undo buffer independence, Smart Defaults pruning, the sell-batch merchant guard, the destroy protection chain, vendor mount detection, and ClassifyItem parity. These were previously the least-covered paths despite being the ones that move or delete items. |
| 46 | +- **Self-test messages** — API failure messages are now user-friendly and reassuring instead of technical ("Transmog detection paused — Blizzard changed an API. Sell rules are more conservative until updated."). |
| 47 | +- **Centralized AH lookup** — TSM/Auctionator price queries consolidated into `ns:GetAHValue()` and `ns:HasAHAddon()`, replacing duplicated code in Popup, PopupFilters, and Overlays. |
| 48 | + |
| 49 | +### Performance |
| 50 | +- **Vendor mount detection** — `IsVendorMount` queries the four known vendor mount IDs directly instead of walking the player's entire mount collection on every popup open. |
| 51 | +- **Deferred AH value lookup** — TSM/Auctionator price queries now only run for visible items instead of all bag items. |
| 52 | +- **Confirm list row pooling** — Reuses hidden row frames instead of creating new ones each time the confirm list is shown. |
28 | 53 |
|
29 | 54 | ### Removed |
30 | 55 | - **Dead code** — Unused `ns.defaults` table and an unreachable loop in the destroy confirmation dialog. |
|
33 | 58 | - **Priority sell queue described backwards** — FEATURES.md said the queue was sorted by value *descending*. It sorts ascending (cheapest first), which is what leaves the most valuable items in the 12 buyback slots. The stated outcome was right, the mechanism was wrong. |
34 | 59 | - Documented the destruction confirmation pause and deferred destruction accounting, the sell-batch merchant check, the "Skipped (item locked)" tooltip status, and the corrected setup wizard completion behaviour. Renumbered a duplicated step in the Selling Process list. |
35 | 60 |
|
36 | | -## Unreleased (3.5) |
37 | | - |
38 | | -### Added |
39 | | -- **Tooltip item status** (`showTooltipStatus`, default: on) — Shows ASP classification in item tooltips: "Will sell (quality filter)", "Protected (uncollected transmog)", "On never-sell list", etc. Works for items in bags, equipped gear, and merchant windows. Togglable in Settings > Display. |
40 | | -- **Compact mode** (`compactMode`, default: off) — Condensed popup showing item count, total value, per-quality breakdown, and a one-click Sell button. Toggle between compact and detailed views via a button on either popup or `/asp compact`. All filters and protections still apply. |
41 | | -- **AH value protection** (`ahProtectionEnabled`, default: off) — Protects items worth more than a configurable threshold on the AH from being auto-sold. Requires TSM or Auctionator. Popup rows where AH value exceeds a configurable multiplier of vendor price are color-coded, with a tooltip showing "Worth listing: AH Xg, vendor Yg (Nx)". |
42 | | -- **Safe Mode template** — New profile template for new users: grays only, all protections on. Wizard defaults to Safe Mode when no template or profile is selected. |
43 | | -- **Destruction system v1** — Complete rewrite of the auto-destroy feature with separate destroy filters (quality, ilvl, max vendor value), a never-destroy list, countdown confirmation popup, and a bag pressure valve that auto-triggers when free slots drop below a configurable threshold. Items are destroyed one per tick with cursor verification for safety. |
44 | | - |
45 | | -### Improved |
46 | | -- **Self-test messages** — API failure messages are now user-friendly and reassuring instead of technical ("Transmog detection paused — Blizzard changed an API. Sell rules are more conservative until updated."). |
47 | | -- **Centralized AH lookup** — TSM/Auctionator price queries consolidated into `ns:GetAHValue()` and `ns:HasAHAddon()`, replacing duplicated code in Popup, PopupFilters, and Overlays. |
48 | | - |
49 | | -### Fixed |
50 | | -- **Bindings.xml parsing error** — Removed invalid `header` attribute from Binding element. The section header is provided by the `BINDING_HEADER_AUTOSELLPLUS` global. |
51 | | -- **Mount equipment misclassified** — Mount equipment is Miscellaneous (classID 15, subclassID 6), not Armor (classID 4). Items like Light-Step Hoofplates are now correctly detected. |
52 | | -- **Destroy cursor safety** — Verify `GetCursorInfo` matches expected itemID before `DeleteCursorItem` to prevent accidentally destroying the wrong item when the player is dragging something. |
53 | | -- **CanIMogIt locale detection** — Use CanIMogIt's own `NOT_COLLECTED` constants instead of hardcoded English string matching. Fixes false positives on non-English clients. |
54 | | -- **Warband detection unreliable** — `GetItemInfo` bindType is unreliable for many warband items (reagents, trade goods). Added tooltip fallback via `C_TooltipInfo` using Blizzard's localized binding globals for reliable detection. |
55 | | -- **Undo buyback matching** — Use full item link comparison instead of name substring for more precise buyback matching. |
56 | | - |
57 | | -### Added |
58 | | -- **Sell collected transmog** (`sellCollectedTransmog`, default: off) — Marks items with already-collected transmog appearances for selling. Items pass all existing protections before this criterion applies. |
59 | | -- **Sell known collectibles** (`sellKnownCollectibles`, default: off) — Marks already-known mounts, pets, and toys for selling. Uses C_MountJournal, C_PetJournal, and C_ToyBox APIs. |
60 | | -- **Relative ilvl threshold** (`useRelativeIlvl`, `relativeIlvlPercent`, default: off/70%) — Computes a single ilvl sell threshold as a percentage of the player's average equipped ilvl. When enabled, replaces per-quality ilvl sliders. Grays out quality ilvl controls and shows computed threshold in popup header. |
61 | | -- **Mount equipment protection** (`protectMountEquipment`, default: on) — Toggleable checkbox in popup filters. Never sells mount equipment items. |
62 | | -- **Warband item protection** (`protectWarband`, default: off) — Toggleable checkbox in popup filters. Protects all warband and account-bound items from selling. Detects bindType 7/8/9 with tooltip-based fallback. |
63 | | -- **Dynamic bag ID support** — Uses `NUM_TOTAL_EQUIPPED_BAG_SLOTS` for reagent bag support instead of hardcoded bag range. |
64 | | - |
65 | | -### Performance |
66 | | -- **Deferred AH value lookup** — TSM/Auctionator price queries now only run for visible items instead of all bag items. |
67 | | -- **Confirm list row pooling** — Reuses hidden row frames instead of creating new ones each time the confirm list is shown. |
68 | | - |
69 | 61 | ## v3.3.0 |
70 | 62 |
|
71 | 63 | ### Fixed |
|
0 commit comments