Proc Alert - Retail

Customizable proc and cooldown alerts (text, icons, sounds, TTS) with per-spec resource bars and threshold coloring for every class.

File Details

1.2.2

  • R
  • Jul 11, 2026
  • 1.90 MB
  • 12
  • 12.1.0+1
  • Retail

File Name

ProcAlert-1.2.2.zip

Supported Versions

  • 12.1.0
  • 12.0.7

CHANGELOG

All notable changes to ProcAlert are documented here. Releases are tagged in git.

[Unreleased / WIP]

[v1.2.2] - 2026-07-11

WoW 12.0.7 Retail + 12.1.0 PTR (Interface 120007, 120100). Git tag: 1.2.2

Added

  • .pkgmeta for CurseForge's GitHub-linked auto-packager: package-as: ProcAlert keeps the packaged addon folder name stable regardless of the repo folder's own casing, and manual-changelog wires CurseForge auto-builds to this CHANGELOG.md instead of a generated commit list.
  • ## X-Curse-Project-ID: 1583705 in the TOC for packager/tool compatibility.

Changed

  • Confirmed working on the 12.1.0 PTR; TOC now lists both 120007 and 120100 as supported Interface versions so the addon loads on live and PTR clients.
  • README wording updated to "Proc Alert" to match the CurseForge listing title.

[v1.2.1] - 2026-07-10

WoW 12.0.7 Retail (Interface 120007). Git tag: 1.2.1

Fixed

  • Hotfix: import crash on some WoW clients where load is unavailable (options.lua:ImportProfile). Import parser now falls back to loadstring (sandboxed via setfenv) instead of calling a nil loader.

[v1.2.0] - 2026-07-09

WoW 12.0.7 Retail (Interface 120007). Git tag: 1.2

Added

  • Diagnostics dashboard (display_diagnostics.lua) in the Settings Debug tab, surfacing live profiler/memoization/pool stats (PA.Diagnostics.GetStats).
  • Generic frame-pool / object-factory / memoization utilities (utils/pool.lua, utils/object_factory.lua, utils/memoizer.lua) backing the row-pooling fixes below.

Changed

  • Rule editor and spell picker lists now reuse existing row frames instead of destroying/recreating them (CreateFrame + Hide/SetParent(nil)) on every rebuild, avoiding per-rebuild frame churn and GC pressure.
  • Rule editor rebuilds are now coalesced via PA.Editor.RequestRebuild() instead of rebuilding immediately from every mutation site, so several changes from one action only trigger a single rebuild.
  • The main update loop moved from a per-rendered-frame OnUpdate driver to a C_Timer.NewTicker(0.05, ...), decoupling it from render FPS; elapsed time is clamped to 0.25s to avoid a large catch-up jump after a loading-screen/lag spike.
  • Resource bars are now only refreshed on ticks where a tracked resource (aura/health/power/rune) actually changed, instead of every tick.

Fixed

  • Pulse/glow/bounce alert animations updated on every single rendered frame via OnUpdate — on a high-refresh-rate setup (e.g. 200 FPS) that's 200 SetAlpha/SetPoint calls per second for an effect that's a slow sine wave. Decoupled the visual update from the render frame rate (fixed ~15 Hz cadence via an elapsed-time accumulator, confirmed as the biggest perf win of this pass) — same look, big drop in work on high-FPS systems.
  • The BOUNCE icon pulse pattern (display.lua) re-anchored the icon (ClearAllPoints+SetPoint, a full layout pass) on every single rendered frame (60+/sec) for as long as any alert was bouncing, even though the rounded bounce offset only actually changes a few times per second. Now the re-anchor is skipped whenever the rounded Y offset is unchanged from the previous frame — removes continuous, mostly-wasted layout work during sustained fights with active bounce alerts.
  • C_Spell.GetSpellCooldown() was called independently by CooldownSwipeShown (GCD filtering), SpellReadyState's fallback branch, and the COOLDOWN_PCT condition type — so any rule set tracking both "spell ready" and "cooldown %" for the same spell (a common combo, e.g. trinket/cooldown alerts) paid for the same C-API call multiple times per tick. Added a shared per-Evaluate memoization cache (GetSpellCooldownMemo, wiped alongside the existing ready-state memo) so each spellID is only queried once per tick regardless of how many conditions reference it. Reduces sustained per-tick CPU cost in longer fights with many active cooldown-based rules.
  • Fixed the root cause of the recurring ~1-second full freezes ("richtige Spitzen, wo ne Sekunde nichts mehr geht") under heavy combat load: utils/profiler.lua's built-in micro-profiler appended every single Evaluate() measurement to an unbounded array (up to ~20x/s), growing into tens of thousands of entries over a long raid/M+ run — a classic trigger for a large, stop-the-world Lua GC pause. Only the running aggregates (count/avg/peak/min) and the last sample are kept now; nothing else read the full history.
  • PA.Engine.UpdateAura() allocated a brand-new { stacks, duration, icon } table on every single UNIT_AURA refresh (very frequent in combat with procs/HoTs/debuffs). It now reuses the existing per-spellID table, cutting steady-state GC pressure during heavy aura churn.
  • RenderOutput (TEXT_CENTER/TEXT_PULSE) re-ran the expensive SetFont() whenever only the text color changed (e.g. pulsing/threshold colors), because font and color shared one dirty-check. Font and color changes are now gated independently, so SetFont() only runs on an actual font/size/flag change.
  • ICON_GLOW/ICON_DISPLAY called C_Spell.GetSpellTexture() on every render tick (10-20x/s) even when the spellID hadn't changed. The texture is now only re-resolved when the spellID actually changes.
  • TTS alerts queued behind each other (overlap=false) instead of interrupting, so announcements fell further and further behind when procs fired faster than speech could finish. C_VoiceChat.StopSpeakingText() now cancels a still-playing line before a new one starts.
  • Fixed severe frame stutter ("ruckelt wie sau") every time a TTS line fired: with the default system-voice setting, C_TTSSettings.GetVoiceOptionID() (an expensive system-voice enumeration) was re-run on every single alert; it's now resolved once and cached. StopSpeakingText() is also no longer called unconditionally — it now only fires while a previous line is actually still speaking, tracked via the real VOICE_CHAT_TTS_PLAYBACK_STARTED/FINISHED/FAILED events, instead of on every alert regardless of state.
  • Hardened voiceID/Enum.TtsVoiceType lookups against nil so a bad value can no longer throw inside the TTS pcall and silently disable speech.
  • Active profile now falls back to the last valid character profile while spec data is still unavailable after load / cinematic transitions, so Evoker resource bars and other per-profile settings no longer appear to reset into a temporary _0 profile.
  • Resource-bar positions are now persisted by resource name as well as legacy index, so Evoker bars keep their placement across spec-order changes and scene transitions.
  • Legacy resource-bar position tables are now auto-migrated to name keys on profile activation, and numeric leftovers are cleaned up after the first successful bind.
  • Evoker resource bars now fall back to Mana + Essence when spec data is not ready during rebuild, so Mana no longer disappears on reload / first open (2026-07-05)
  • RebuildResourceBars now initializes all cache tables before wiping them, so resource-bar rebuilds no longer abort on reload/options refresh (2026-07-05)
  • Main ticker and pulse-driver helpers were forward-declared so the performance patch stays scope-safe in Lua (2026-07-05)
  • Post-release docs now note the microlag/performance pass in README and changelog (2026-07-05)

[v1.1.0 Production] - 2026-07-05

WoW 12.0.7 Retail (Interface 120007). Git tag: procalert-v1.1.0-production

Added

  • Live Auras PopUp feature for rule condition creation (2026-07-05)
  • Per-bar width/height overrides for resource bars (2026-07-05)
  • Rule Snapshots: save/load/delete named snapshots of rules + settings per character/spec (2026-07-05)
  • Vertical resource bars option (bottom-to-top fill via StatusBar orientation) (2026-07-05)
  • Debug panel now hidden unless enabled via the "Show Debug panel" checkbox (sv._debug) (2026-07-05)

Changed

  • Resource Bars panel: per-bar enable/label/width/height block moved above the threshold colours (2026-07-05)
  • Threshold colour grid switched from 2 to 3 columns (2026-07-05)

Fixed

  • Output-frame pulse updates now stop their OnUpdate when inactive and re-enable it only while pulsing (2026-07-05)
  • Resource-bar rebuilds are now coalesced to one next-frame refresh and bar values/labels are diffed before setter calls (2026-07-05)
  • Rule-list rebuilds now coalesce to one next-frame render on rapid move/delete actions (2026-07-05)
  • Main update tick now clamps large elapsed spikes after loading screens (2026-07-05)
  • Spell picker now reuses result rows and its empty-state message instead of orphaning frames on every search (2026-07-05)
  • Resource bars are now rebuilt in place instead of recreating named bar frames on every options change (2026-07-05)
  • Rule editor list now reuses rule rows and pooled section headers instead of recreating them on every rebuild (2026-07-05)
  • Checkboxes not reflecting their saved state on first show / after reload (e.g. Show Debug panel appeared unchecked despite being enabled); MakeCheckbox now applies its getValue deferred (2026-07-05)
  • Memory-leak in Live Auras OnUpdate script (2026-07-05)
  • onSelect Closure variable staleness (2026-07-05)
  • Delete() API typo in ui_helpers + rule_editor (2026-07-05)
  • Locale key duplication in enUS (2026-07-05)
  • Live Auras button overlapping operator/value controls for stack conditions (2026-07-05)
  • Live Auras button visibility not refreshed when condition type changes (2026-07-05)
  • Live Auras button limited to buff conditions (popup only lists active buffs) (2026-07-05)
  • Frame leak in Live Auras popup — item buttons now pooled/reused (2026-07-05)
  • Bar width/height getters nil-guarded and zero-value global fallback rejected (2026-07-05)

[v1.0.0 Production] - 2026-07-04

WoW 12.0.7 Retail (Interface 120007). Git tag: procalert-v1.0.0-production

Fixed - Production Bugs (High Priority)

  • DK Runes bar showing full (6/6) constantly → workaround GetRuneCooldown(1..6) loop with fallback UnitPower (engine.lua)
  • Width/Height inputs in options not rendering after /reload → deferred SetText via C_Timer.After(0) (options.lua)
  • Minimap right-click blocked in combat with taint error → InCombatLockdown guard + Settings.OpenToCategory pcall (ProcAlert.lua)

Added - Major Features

  • Per-Character Profiles: Profile key now CharKey_CLASS_specID (not account-global). Each character has own config. Migration preserves legacy data.
  • Per-Bar Threshold Coloring: Each resource + Health has independent threshold config (settings.thresholds[resName]). Lua-side color-curve logic for secret values.
  • Special Resources: Soul Fragments, Maelstrom Weapon, Icicles, Ebon Might via SpecialResourceConfig (constants.lua). Data-driven, analog EnhanceQoL.
  • Bar Styling: Dropdown to choose bar texture. LibSharedMedia-3.0 integration (optional). Texture path saved (reload-robust).
  • Live Threshold Coloring: Threshold colors applied to all resource bars + health (was Fury-only). Uses SetVertexColor passthrough + cache for secret-safe flickerless updates.

Fixed - Architecture

  • Secret-Value Handling: UnitPower values tainted in combat (12.0). Colors declassified via Curve. Lua-compare blocked for values. SetValue accepts secret (AllowedWhenTainted).
  • Canvas-FirstShow Race: Settings-Panel Checkbox/Input/Dropdown unrendered after /reload. Pattern: SetValue + C_Timer.After(0) reapply. Applied to all UI inputs.
  • Rule Priority: Deterministic sort. _ruleOrder[rule] tiebreaker prevents flipping. 1 output-slot per frame (highest prio wins).
  • Frame Strata: Lowered to MEDIUM (from HIGH) so Blizzard Settings panel visible above.

Changed

  • Export/Import format: envelope{version, rules, settings}. Settings included per-character.
  • Profile Display: Shows spec-ID suffix, fallback to DisplayName override.
  • Bar Ordering: Health always last (index-stable for existing resourceBarPositions).
  • Locale: 181 keys, all 5 languages (enUS deDE esES frFR itIT) maintained parity.

Removed

  • Resource-Value Conditions (SOUL_FRAGS, FURY_PCT, RESOURCE_VALUE, RESOURCE_PCT): Out-of-combat only due to secret-values in combat. Kept CUSTOM_LUA for backward-compat.
  • Duplicate Locales: Deleted esMX, koKR, ptBR, ruRU, zhCN, zhTW (not maintained, CurseForge no longer source-of-truth).

[v0.9.0] - 2026-06-21

WoW 12.0.x Retail. Initial public release.

Added

  • Rule Editor with drag-drop UI, priority sorting, frame grouping
  • Alert Outputs: Icon glow, text, screen flash, sound, TTS
  • Resource Bars: Fury, Combo Points, Holy Power, Arcane Charges (+ special resources)
  • Threshold Coloring (Fury bar only)
  • Testmode, Debug diagnostics
  • Multi-language support (5 locales via AceLocale-3.0)

Known Issues

  • DH Meta-Form detection (STANCE_ACTIVE) needs confirmation via /pa debugauras