promotional bannermobile promotional banner

Vamooses Dye Studio

Vamoose Dye Studio replaces Blizzard's dye UI with an enhanced interface for browsing, previewing, and managing housing dyes with custom palettes and live dyeing.

File Details

Vamoose's Dye Studio v2.1.5

  • R
  • May 26, 2026
  • 924.13 KB
  • 345
  • 12.0.5
  • Retail

File Name

VamoosesDyeStudio-2.1.5.zip

Supported Versions

  • 12.0.5

**Live mode Apply button**
- Apply now lights up correctly when you stage dye changes on a decor that started with empty channels. Previously the button stayed greyed out with no visible cost, even when you'd picked owned dyes for every empty slot. Root cause: the old gate relied on Blizzard's GetNumDyesToSpendOnSelectedDecor which returns 0 in the empty-fill scenario. New gate compares your current picks against the channel state when you first clicked the decor, independent of the broken API.
- Apply stays disabled when you preview a dye you don't actually own in your bags. Blizzard previews dyes regardless of ownership (the world shows the color), but CommitDyesForSelectedDecor silently reverts to the original because it can't deduct what you don't have. The new ownership check prevents the silent revert; if you're missing dyes, Apply waits until you pick them up. The slot picker also shows the count next to each dye so you can see the inventory state at a glance.
- After a successful Apply, the baseline refreshes to the just-committed state, so subsequent changes or clears re-enable Apply correctly. Previously the baseline was frozen at the LIVE_MODE_ENTER moment; "apply purple, then clear" wouldn't re-enable Apply for the clear because the slot-vs-snapshot comparison both saw "empty".

**Cost preview ("+N dyes" label)**
- The "+N dyes / -N back" label next to Auto-save now derives from your slot picks vs the original snapshot, not Blizzard's cost API. Previously the label blanked out in the empty-fill scenario; now correctly shows "+3 dyes" for a three-channel fill on an empty decor. Apply gate and cost label read from the same source so they always agree.

**Channel picker count suffix**
- Each channel slot at the bottom of the Live edit panel now shows the owned count of the assigned dye, matching the format used in the dye list above ("Arcwine x3" instead of just "Arcwine"). Picking a dye you don't own shows "--" and turns the name red, signaling the affordability issue at the slot row itself.

**Auto-save no longer creates blank snapshots**
- Hitting Apply after a "Clear all" (or right-clicking every channel) used to autosave a blank loadout in the Saved Variants sidebar -- an all-empty snapshot with no useful content. Now skips the autosave entirely when the commit is a full wipe, so the sidebar stays clean. Manual Snapshot button gets the same fix. Root cause: the empty-check used `if slot.dyeColorID` which is truthy for the no-dye sentinel value 0 (Lua 0-truthy trap).

**Internal**
- Unified the originalDyes snapshot path. Previously the LiveCustomizeObserver's SnapshotDyes and the LIVE_COMMIT_SNAPSHOT reducer each had their own loop to build the baseline, producing slightly different shapes (nil vs 0 for empty slots) that consumers had to normalize. Replaced both with a single buildOriginalDyes helper in VDS_Store.lua, used by LIVE_MODE_ENTER and LIVE_COMMIT_SNAPSHOT reducers. SnapshotDyes deleted. One canonical shape, no path divergence possible.
- Added LIVE_COMMIT_SNAPSHOT action that refreshes live.originalDyes from the just-committed slots after each successful Apply, so the Apply gate's baseline tracks each commit instead of going stale.
- live.cost selector rewired to derive spend/remove from the slot-vs-original delta instead of reading session.ui.live.cost (which was populated from Blizzard's flaky cost API). Same baseline as the Apply gate so the two stay in lockstep.