CkraigCooldownManager5.0retail.zip
What's new
# CkraigCooldownManager — Changelog
All notable changes to this addon are documented here.
Format: `## [Version] — YYYY-MM-DD`
---
## [5.0] — 2026-10-05
Big feature update ported from the WoW Forever edition, a full CPU tuning pass, and a tidier addon folder.
### Added
- **Curved bars** (CkArcBars library, 24 arc styles in `media/arcs/`): Health, Power and Druid Mana bars, Cooldown Bar clusters, Segment Bars and Custom Aura bars can be drawn as a curve (Shape = Curved). Vertical / Horizontal stay the default.
- Cooldown Bars: "Curved (arc textures)" in each cluster's Flow Direction list, with Curved Style, Curved Side and fill / background / outline opacity. Clusters also get their own icon size and offsets.
- **Weapon art styles**: 29 full-colour weapon textures (axes, swords, warglaives, staves, maces, bow, scythe, daggers...) in every Curved Style list as "Weapon art: ...". They keep their own colours instead of the bar colour; upright for Left / Right (fills hilt to tip), flat for Up / Down.
- **Stance / Form filter** (Essential + Utility): show a spell only in chosen stances, forms or stealth.
- **Custom Auras rework**: multiple groups, one-icon groups, per-class lists (the old list is migrated automatically), curved bars, and groups can attach to a Dynamic Icons cluster.
- **Tracked Spells**: Move Up / Move Down per spell; the order is kept inside Essential / Utility / Dynamic Icons too.
- **Guide window**: Curved Bars and Stance / Form filter pages.
- **Profiler** (`/ccmprofile`):
- `/ccmprofile events [seconds]`: CPU per event, out of combat vs in combat, and which file owns it.
- New "HOOKS ON BLIZZARD FRAMES" section: every hook the addon puts on Blizzard frames is timed (file:line + method).
- `/ccmprofile trace <name>` now works on live game clients.
### Changed (CPU)
- **Tracked Spells**: entering / leaving combat no longer rebuilds every icon (~1 ms each time) unless "show only in combat" or an only-on-cooldown / only-when-ready spell needs it.
- **Tracked Spell States**: the red attack flash runs on a timer instead of every frame; the range safety net only redraws icons whose range changed (every 2 s in combat, 5 s out of combat).
- **Target Count**: no timer out of combat; every 0.5 s in combat (was 0.1 s), and widgets are only touched when something changed.
- **Icon Extras**: decoration pass every 0.5 s in combat, every 2 s out of combat (was 0.25 s always); cached formatters and shape keys, hidden viewers skipped.
- **Pandemic glow suppression**: 4 sweeps a second in combat, 1 a second out of combat (was 4/s always), and the expensive per-icon search (~0.5 ms per pass) is skipped where Blizzard's pandemic pool is already hooked.
- **Dynamic Icons**: alpha watchdog every 2 s out of combat.
- **Essential Buffs**: pandemic ticker every 2 s out of combat (0.5 s in combat).
- **Totems**: fast updates only while a totem is in its warning window; otherwise every 0.5 s.
- **Trinkets & Racials**: looting / selling only rebuilds the icons when a tracked potion or healthstone count changed.
- All event registrations go through `CCMF_RegisterEvent` / `CCMF_RegisterUnitEvent` (unknown events are skipped instead of erroring, and the event profiler can see every handler).
### Changed (addon folder)
- **One loader per folder**: the `.toc` now lists 13 `Load_<Folder>.xml` files (Libs, compat, locale, core, utils, data, profiles, trackers, cooldownbars, ResourceBars, PresetProfiles, visuals, ui) instead of every file. Same files in the same order; Cooldown Bars now loads right after the trackers. A full game restart is needed once after updating.
### Fixed
- **Profiler**: starting `/ccmprofile` could throw "script ran too long" (it walked every frame in the UI for nothing); counters captured once were lost on the next run.
- **Segment Bars**: not built after `/reload`; choosing a Weapon art style threw an error.
- **Resource bars**: the stack is rebuilt in combat when the set of visible bars changes (e.g. combo points on entering Cat Form).
## [4.3.0] — 2026-07-23
Patch 12.1 compatibility pass, Aura Slots duration bars, and the potion tracking system.
### Added
- **Aura Slots: group Display Mode** (`Auraslots.lua`, `ui/options/AuraSlotsOptions.lua`): the Display Mode dropdown now switches an entire group between **Icons** and **Bars** in one step, instead of toggling each spell individually.
- `SpellWantsBar()`: a spell renders as a bar when the group is in Bars mode *or* that spell has its own Duration Bar override, so per-spell bars still work inside Icons mode.
- Spells rendering as bars are excluded from the icon container, so a Bars-mode group shows no leftover icons.
- **Aura Slots: duration bar layout controls** (`ui/options/AuraSlotsOptions.lua`): per-group **Bar Growth Direction** (up/down) and **Bar Vertical Gap** (0–30px, `barVerticalGap`). A gap of `0` packs bars flush.
- **Aura Slots: per-spell duration bar colours** (`Auraslots.lua`, `ui/options/AuraSlotsOptions.lua`): each spell can override the group's bar **Fill** and **Background** colours, with a **Reset Bar** button to fall back to the group colour.
- `ResolveBarFill()` / `ResolveBarBG()`: resolve per-spell override → group colour → default, reusing the existing override cache so there is no per-frame cost.
- **Aura Slots: 12.1 aura API support** (`Auraslots.lua`):
- `AddAuraSound` / `RemoveAuraSound` (renamed from `AddAuraAppliedSound` in 12.1 PTR 6) resolved at load with automatic fallback to the old names, plus a per-spell **When** trigger (Added / Stack gained / Removed).
- `layoutIndex` passed in the aura group layout options for deterministic group draw order.
- `SetAuraGroupFilterString` applied after group creation so a group's filter can change without a full rebuild.
- `excludeSpellIDs` and boolean candidate-filter negation (`isStealable = false`) passed through to `candidateFilters`.
- **Potion tracking system** (`trackers/items/TrinketRacials.lua`, `ui/options/TrinketRacialsOptions.lua`): add and remove potions by item ID, per-potion role filter (All / Healer / Tank / Damager), a separate healer mana section, **Scan Bags** to find untracked potions, and manual Up/Down priority ordering.
- Crafted-quality (rank) detection via a three-layer cascade: `C_TradeSkillUI.GetItemCraftedQualityByItemInfo`, tooltip atlas scan, then a bag-instance link scan for single-ID multi-rank items.
- **Auto-add other ranks**: probes neighbouring item IDs and adds same-name rank siblings automatically.
- Effective potion lists cached per category and role.
- **Preset profile toggle** (`ui/options/PresetProfilesUI.lua`): **Enable Preset Profiles** checkbox (default on). Disabling releases the preset string tables at login.
- **Action bar proc glow override** (`ui/options/GlowOptions.lua`): optional **Also Override Action Bar Proc Glows** checkbox (default off). Proc glow handling is otherwise scoped to CCM viewers only.
- **Default (Blizzard) bar texture** (`cooldownbars/BarCore.lua`): restores Blizzard's native atlas fills in place rather than substituting a flat statusbar texture.
### Changed
- **Aura Slots duration bars now use the native `SetDurationBar` path** (`Auraslots.lua`): Blizzard drives the fill from the secure side, which is the only way duration bars can function during combat now that aura timing is secret. Bars fill left-to-right rather than draining — an accepted trade for bars that work mid-fight.
- **Aura Slots bar packing** (`Auraslots.lua`): visible bars are placed contiguously from the group anchor, advancing by each bar's **measured** height plus the configured gap rather than the height *setting*, so bars touch exactly at a gap of `0` regardless of height configuration.
- **Aura Slots Edit Mode anchor** (`Auraslots.lua`): in Bars mode the group's Edit Mode frame is sized to the bar dimensions (`durationBarWidth` × `durationBarHeight`) instead of a square icon, so the selection highlight matches what actually renders.
- **Resource bar restacking is deferred during combat** (`ResourceBars/ResourceBarsCore.lua`): `RestackAllViewers()` returns early while in combat and flags a reconcile, which runs once on `PLAYER_REGEN_ENABLED`. Prevents any in-combat relayout from nudging anchored bars.
- **Glow settings normalisation is cached** (`visuals/GlowManager.lua`): `normalizedGlowCache` with `InvalidateGlowSettingsCache()` reduces `NormalizeGlowSettings` from thousands of calls per minute to one per settings change.
- **Essential Buff Tracker pandemic polling** (`trackers/buffs/EssentialBuffTracker.lua`): revision-stamped light pass so the 0.5s ticker only touches icons that have not already been stamped.
### Fixed
- **Aura Slots: bars did not build in Bars mode** (`Auraslots.lua`): with every spell rendering as a bar the icon count fell to zero, and the builder returned before creating the aura container or its duration-bar slots. The early return now falls through whenever the group has bar spells, and the group anchor stays shown so bars have a valid anchor point.
- **Aura Slots: bar list ignored group Bars mode** (`Auraslots.lua`): `durBarSids` required a populated `spellOverrides` table, so a Bars-mode group with no per-spell overrides collected no bar spells at all.
- **Aura Slots: bars left a gap when one expired** (`Auraslots.lua`): a bar that timed out hid itself from its own `OnUpdate` without triggering a relayout, so the remaining bars kept their old positions. Expiry now requests a coalesced re-pack (`_RequestDurationRepack`) and the remaining bars close up immediately.
- **Aura Slots: stale bar range on recycled bars** (`Auraslots.lua`): pooled bars kept the previous spell's max value, producing a fill fraction that did not match the time shown. The bar's duration is now stored on the frame and the range re-asserted each update.
- **Aura Slots: duration bars vanished in combat** (`Auraslots.lua`): the FontString laundering used to read secret `expirationTime` was closed by the 12.1 `FormatNumber` secret fix. When an aura is present but its timing is unreadable the bar now stays visible as a static full bar instead of hiding; the countdown resumes out of combat.
- **Aura Slots: retired "bars" display mode rendered nothing** (`Auraslots.lua`, `ui/options/AuraSlotsOptions.lua`): the old `CCM_AuraBars` renderer no longer exists, so groups saved in that mode silently displayed nothing. Bars mode is now backed by the duration-bar renderer, and `NormalizeDisplayMode()` migrates saved values correctly.
- **Aura Slots: dispel-type border options did not match the real API** (`Auraslots.lua`): rebuilt against the documented `CustomAuraButtonBorderOptions` structure (`style = "Color"`, `customDispelColorMap`). The border is coloured by dispel type, not by remaining duration; the earlier duration-curve implementation could never have worked. The option was subsequently removed from the panel as it applies to icons rather than bars.
- **Essential viewer icons shifted on proc** (`trackers/buffs/EssentialBuffTracker.lua`): icons were anchored `TOP → viewer TOP`, so they were horizontally centred on a viewer whose width changes when a proc triggers a relayout; the whole row rode the centre by half the width delta and only settled after combat. Icons now anchor to the viewer's `TOPLEFT` using a fixed width origin, with `maxRowWidth` pre-scanned before placement so every row shares the same origin.
- **Resource bars slid sideways on proc** (`trackers/buffs/EssentialBuffTracker.lua`): the `_ccmResourceAnchor` frame was anchored to the viewer's `TOP` (centre) and moved with the same width swing, dragging every anchored resource bar with it. The anchor is now pinned to the viewer's stable `TOPLEFT` corner.
- **Login bar flash** (`cooldownbars/BarCore.lua`): bars no longer flash their default texture before saved styling is applied.
- **240 ms login hitch** removed: dropped a forced `collectgarbage()` during initialisation.
- **Devourer Demon Hunter Void Ray indicator** (`ResourceBars/PowerBar.lua`): documented that `InvalidateDevourerCache()` is not wired to `PLAYER_SPECIALIZATION_CHANGED`, so the indicator can remain stale after a respec until `/reload`.
### Performance
- **Aura Slots sound watcher coalesced** (`Auraslots.lua`): `UNIT_AURA` previously ran a full sound pass on every event. The handler now sets a pending flag and defers the work by 0.05s, collapsing a burst of events into a single pass.
- **Configured sound list cached** (`Auraslots.lua`): `GetConfiguredSoundList()` caches the flattened spell/sound list against `_visRevision` instead of walking every group's `spellOverrides` on each pass, and exits immediately when no sounds are configured.
- **Preset strings released at login**: reclaims roughly 2.3 MB when preset profiles are disabled.
- All three `UNIT_AURA` watchers use `RegisterUnitEvent(..., "player")` and unregister entirely when their feature is unused.
### Known limitations (Patch 12.1)
- Aura duration and application counts are **secret during combat**, encounters, M+ and PvP. Addon-drawn bars cannot read them, and the FontString laundering workaround was closed in 12.1. Duration bars therefore rely on the native `SetDurationBar` path, which Blizzard drives.
- Clients without `AuraContainer:AddAuraSlot` cannot show native duration bars at all; those groups fall back to addon-drawn bars, which display presence but not a live countdown in combat.
- Segmented stack bars were prototyped and removed: the live application count is secret in combat, and the native `SetApplicationCount` writes a text region rather than a value that can drive a bar fill.
---
## [4.2.3] — 2026-06-17
### Fixed
- **CooldownBars cluster mode dynamic repositioning** (`cooldownbars/BarCore.lua`): cluster mode bars now automatically compact when cooldowns expire, moving remaining bars to fill gaps without requiring user ability presses.
- `IsClusterBarClearlyInactive()`: new filter function with 0.1s grace period (reduced from 1.0s) to determine when bars should be hidden from layout
- `BuildOrderedBarsForCluster()`: filters out inactive bars before layout, hides them with `alpha=0`
- Automatic refresh ticker: 0.5s periodic check triggers `ScheduleBBUpdate()` when expired bars are detected, enabling real-time compaction
- Function ordering: moved `IsClusterBarClearlyInactive()` definition before `BuildOrderedBarsForCluster()` to prevent nil function errors
- **CooldownBars cluster mode grow directions** (`cooldownbars/BarCore.lua`): grow-up and grow-down now maintain stable corner pinning (TOPLEFT for grow-down, BOTTOMLEFT for grow-up) preventing bars from shifting position during layout updates.
---
## [4.2.2] — 2026-06-09
### Added
- **Tracked Spells: Only Ready visibility toggle** (`ui/options/TrackedSpellsOptions.lua`, `trackers/cooldowns/TrackedSpells.lua`): per-spell option to show an icon only when the spell is ready; mutually exclusive with **Only On Cooldown**.
- **Tracked Spells: group clear action** (`ui/options/TrackedSpellsOptions.lua`): each tracked-spell group now has a **Remove All Spells** button to wipe all tracked entries in that group at once.
- **Segment Bars: display segment override** (`trackers/cooldowns/SegmentBars.lua`, `ui/options/SegmentBarsOptions.lua`): added a separate **Display Segments** setting so high-stack buffs can map a large real max (for example `100`) onto a smaller visible segment count (for example `5`).
- **Segment Bars: segment mapping helper text** (`ui/options/SegmentBarsOptions.lua`): spell options now show a live explanation of how many real stacks each displayed segment represents.
### Changed
- **Tracked Spells cursor mode layering** (`trackers/cooldowns/TrackedSpells.lua`): cursor-anchored icons now render on higher strata/frame level so they stay visible over party and raid frames during mouseover healing.
- **Segment Bars count semantics** (`trackers/cooldowns/SegmentBars.lua`, `ui/options/SegmentBarsOptions.lua`): `maxSegments` now acts as the real tracked max count, while visual slot count is controlled separately by the optional display override.
### Fixed
- **Tracked Spells render gating** (`trackers/cooldowns/TrackedSpells.lua`): spellbook/action/flyout entries that resolve poorly through `IsSpellKnown()` now still render when a valid spellbook slot exists.
- **Tracked Spells options locale regression** (`ui/options/TrackedSpellsOptions.lua`): removed AceLocale dependency from the new group-clear button text to prevent missing-locale-entry errors in the options panel.
## [4.2.1] — 2026-06-08
### Added
- **Vengeance DH Soul Fragment tracker** (`ResourceBars/VengeanceSoulTracker.lua`): dedicated segmented bar showing live Soul Fragment count (spell 247454) for Vengeance Demon Hunter.
- **Guardian Druid Ironfur tracker** (`ResourceBars/IronfurTracker.lua`): overlapping timed segment bars for Ironfur stacks (spell 192081). Each cast creates an independent draining segment; supports Reinforced Fur and Guardian of Elune talent detection.
- **Brewmaster Monk orb tracker** (`ResourceBars/MonkOrbTracker.lua`): segmented bar for Press the Advantage orbs (spell 322101) for Brewmaster Monk.
- **Fury Warrior Whirlwind tracker** (`ResourceBars/WarriorWhirlwindTracker.lua`): segmented bar for Improved Whirlwind stacks tracking generators (Whirlwind, Thunder Blast) and spenders (Bloodthirst, Raging Blow, Execute, Impending Victory). Supports Unhinged talent.
- **Enhancement Shaman Maelstrom tracker** (`ResourceBars/MaelstromTracker.lua`): segmented bar for Maelstrom Weapon stacks (buff 344179).
- **CooldownBars documentation stubs** (`cooldownbars/SpellIdentity.lua`, `ClusterAnchors.lua`, `BarLayout.lua`, `BarStyle.lua`, `BarOptions.lua`): not loaded by the addon — serve as indexed code-navigation references for `BarCore.lua` sections.
- **enGB locale** (`locale/enGB.lua`): British English stub registered with AceLocale; falls back to enUS. British spelling overrides can be added as needed.
- **TOC patch 120007** added to supported interface versions.
### Changed
- **DynamicIcons OOC fast-path gate**: spell fingerprint cache (`_di_spellFingerprint`) skips the full sort/skin/cluster layout pass out of combat when the visible spell set is unchanged, reducing idle overhead.
---
## [4.1] — 2026-06-01
### Added
- **Locale translations** for French (frFR), German (deDE), Spanish/EU (esES), and Spanish/LATAM (esMX): all ~280 UI field labels translated across all option panels.
- **Locale stubs** for Italian (itIT), Korean (koKR), Brazilian Portuguese (ptBR), Russian (ruRU), Simplified Chinese (zhCN), and Traditional Chinese (zhTW): files present and registered; all strings fall back to English via AceLocale until translations are provided.
- **Fleeting Potion of Recklessness R3** (item ID 245902) added to power potion tracking (`POWER_POTIONS`, `TRINKET_POWER_POTIONS`, `ITEM_RANKS` with gold rank indicator, `DEFAULT_POTION_DURATIONS`).
### Changed
- **All 13 option panel files** (`ui/options/*.lua`) had hardcoded English strings replaced with `L["..."]` lookups, enabling full UI localisation for any supported locale.
- **Tab labels and option panel titles** are now localised (previously hardcoded English strings were passed directly to AceConfig `name` fields).
- **Icon Size, Icon Width Override, Icon Height Override, and Row Size sliders** now use `step = 0.1` (previously `step = 1`), allowing decimal values such as `34.1`.
Applies to Essential Buff Tracker, Utility Buff Tracker, and all per-cluster icon size settings.
Note: the Atlas arrow buttons on these sliders now adjust by 0.1 per click.
- **SkinIcon** (`EssentialBuffTracker.lua`) no longer rounds icon dimensions back to integers after `SetSize`, preserving sub-pixel decimal sizes set via the UI.
---
## [4.0] — 2026-06-01
### Added
- **Profiler** (`utils/Profiler.lua`): lightweight CPU profiler using `debugprofilestop()`.
Hook any CCM frame or function via `/ccmprofile start [seconds]`, stop early with `/ccmprofile stop`, view results with `/ccmprofile report`.
- **AceLocale** infrastructure: `locale/enUS.lua` with English strings. Other languages can be added in `locale/<locale>.lua`.
- **Preset profiles** for all 39 class/spec combinations.
- **Defensive Aura tracker** (`trackers/buffs/DefensiveAuraTracker.lua`).
- **Spell Keybind Overlay** (`visuals/SpellKeybindOverlay.lua`): shows active keybind text on tracked spell icons.
- **Segment Bars** (`trackers/cooldowns/SegmentBars.lua`): segmented resource-style tracking bars.
- **Cluster mode** in CooldownBars: up to 10 independent anchor groups with per-cluster grow direction.
- **LibEditMode** integration for drag/position persistence across Edit Mode layouts.
- **Resource Bars** module: Health, Power, Alt Power, Class Resources (Combo Points, Runes, Maelstrom, Brew Stacks, Soul Shards, Orbs).
- **Atlas arrow buttons** on all AceGUI sliders for precise 1-step adjustment.
### Changed
- TOC Title changed from `CkraigCooldownManager` to `CCM - Cooldown Manager`.
- TOC Category changed from `Unit Frames` to `Action Bars`.
- All bar styling now always runs fully (removed `_bb_styleVersion` gating that could cause visual inconsistencies).
- `BarCore.lua` is the single-file master module — SPELL IDENTITY and CLUSTER ANCHORS sections are inline, not split out.
### Removed
- Root-level `colorpickers.lua` (dead code, superseded by `ui/ColorPickers.lua`).
- Root-level `ProfileManager.lua` (dead code, superseded by `profiles/ProfileManager.lua`).
- `CkraigCooldownManager_NEW.toc` (duplicate of main TOC).
- `frescotest.lua` (empty dev scratch file).
- `GlowManager_README.txt` (generic content, covered by inline code comments).
### Fixed
- `GetBestPotionCooldown` calls in `TrinketRacials.lua` updated for TWW API changes.
- AceGUI dropdown `OnPulloutClose` / `OnRelease` contamination fixed.
- AceGUI slider `SetBodyState` HookScript guard added.
- Atlas arrow buttons (`Minimal_SliderBar_Button_Left/Right`) added to all sliders.
---
## [3.x] — Prior versions
Pre-4.0 history not tracked. Version 4.0 is a substantial rewrite adding Resource Bars, Preset Profiles, Profiler, and the Cluster anchor system.
This mod has no additional files

