File Details
EpicDamageMeter v2.5.3
- R
- Jun 18, 2026
- 457.36 KB
- 265
- 12.0.7+14
- Classic TBC + 4
File Name
EpicDamageMeter.zip
Supported Versions
- 12.0.7
- 12.0.5
- 12.0.1
- 5.5.4
- 5.5.3
- 4.4.2
- 4.4.1
- 3.80.1
- 3.80.0
- 3.4.5
- 3.4.4
- 2.5.5
- 2.5.4
- 1.15.8
- 1.15.7
EpicDamageMeter - Changelog
============================
Version 2.5.3
-------------
More Visual Polish: Class BG, Zebra Rows, Pulse, Empty State
CLASS-COLORED BAR BACKGROUND
- The existing "Class Color BG" option now renders a brighter,
cleaner class tint behind the bar track (was a very dark flat
0.15 mix). Centralized so both render paths look identical.
ZEBRA STRIPING
- Alternating rows get a slightly lifted background so long lists
are easier to read (the eye follows each row). Settings > Bars >
"Zebra Stripes" (default on).
TOP-RANK PULSE
- The #1 gold edge accent now gently pulses (alpha bounce). Makes
the leader feel alive without being noisy. Settings > Bars >
"Pulse Top Rank" (default on); independent of the accent itself.
EMPTY STATE
- When there's no combat data yet (fresh login, after a reset, or
an empty segment) the window shows a subtle logo + "Waiting for
combat..." instead of a blank box. Settings > Bars > "Empty
State Hint" (default on).
- All four share centralized helpers (ApplyBarBackground,
ApplyTopRank, ShowEmptyState) so the database and C_DamageMeter
render paths stay perfectly in sync.
Version 2.5.2
-------------
Visual Polish: Spec Icons, Top-Rank Accent, Mode-Tinted Header
SPEC ICONS (Retail)
- Bars now show the actor's SPECIALIZATION icon (e.g. Frost Mage)
instead of a generic class icon. The live C_DamageMeter render
path already had spec icons; we now cache each seen specIconID
by GUID and reuse it on the database / Overall / historical
render paths too, so spec icons persist after combat and across
segment views. The local player's spec is resolved directly via
the spec API (no combat needed). Falls back to the class icon
when the spec is unknown (and on Classic, which has no API).
TOP-RANK ACCENT
- The #1 performer's bar gets a thin gold edge accent so the top
of the meter reads at a glance. Theme-safe (only toggles a
dedicated texture, never touches themed colors). New setting
Settings > Bars > "Highlight Top Rank" (default on).
MODE-TINTED HEADER
- The title-bar accent line now tints to match the active mode
category: orange/red for damage, green for healing, violet for
utility (interrupts, dispels, casts, threat, ...). Updates
instantly on mode switch, so the whole window's accent tells
you what you're looking at.
Version 2.5.1
-------------
Patch 12.0.7 Support (Retail Midnight)
- TOC Interface bumped 120005 -> 120007 for the 12.0.7 client.
No code changes were required: isRetail keys off >= 120000,
and the runtime build version is read from GetBuildInfo(), so
nothing was hardcoded to a specific patch.
- Classic/TBC/MoP/Wrath/Vanilla TOCs unchanged (not Retail);
Version field bumped to 2.5.1 across all flavors for parity.
Version 2.5.0
-------------
Key Bindings + Report to Chat Fix + Client Updates
BINDINGS.XML LOAD FIX
- First build spammed "Unrecognized XML: Binding" warnings (6x per
line). Cause: Bindings.xml was listed in the .toc files, so the
UI-XML parser tried to read it as a frame definition. WoW loads
a file named Bindings.xml from the addon root AUTOMATICALLY —
it must never appear in the TOC. Removed from all 5 TOCs (with
a comment so it doesn't get re-added).
KEY BINDINGS (user request from guino2377)
- New configurable key bindings under
ESC > Options > Keybindings > AddOns > "Epic Damage Meter":
* Toggle meter window
* Show meter window
* Hide meter window
* Open settings
Each player assigns their OWN key, so nothing is hardcoded and
no existing bind is touched — the same approach Details! uses.
- New "Start Hidden" option (Settings > General): keep the meter
hidden on login/reload and reveal it only with your toggle key.
This is the "set display to Never, show via keybind" request.
- Implemented via standard Bindings.xml + Core/Bindings.lua
(localized labels, enUS + deDE). Works on all clients.
REPORT TO CHAT ("can't post data to chat" — user feedback)
REPORT TO CHAT ("can't post data to chat" — user feedback)
- The chat report now honors the segment your window is actually
showing (Current / Overall / a past fight) instead of always
reading the live segment. Look at Overall, click report → you
get the Overall numbers.
- Retail fallback: when the CLEU database has no rows for the
shown segment (data only lives in Blizzard's C_DamageMeter),
the report now reads straight from C_DamageMeter — the same
source the bars render from. Previously this returned "No data
to report" and nothing got posted.
- SecretValue-safe: source names/amounts that are tainted in PvP
are skipped rather than throwing.
- Shared code path: new EDM.UI:BuildReportData() is used by both
the Retail and Classic report commands.
CLIENT VERSION UPDATES
- Mists of Pandaria Classic: 5.5.3 -> 5.5.4 (Interface 50504)
- TBC Anniversary 2.5.5, Retail 12.0.5, Classic Era 1.15.8
confirmed current. All .toc Version fields bumped to 2.5.0.
PvP Crash Fix: SecretValue Taint in Tooltip Cache Key
THE BUG
- 26x error spam in PvP: "attempt to compare local 'expectedKey'
(a secret string value, while execution tainted by
'EpicDamageMeter')" — fired every time a bar tooltip was shown
on a Paladin (or any player) during an arena/BG match.
- Root cause: GetTooltipSpells and SetBarData both built a
composite cache key via string.format("%s|%s|%s|%s", tostring(
actor.guid), ...). On WoW 12.0+ in PvP, actor.guid can be a
SecretValue. tostring() on a SecretValue returns a SECRET
STRING, which then made the whole expectedKey secret. The
subsequent `bar._cachedKey ~= expectedKey` comparison tainted
Lua execution, throwing the error 26 times in a row.
THE FIX
- New _plain() helper at both cache-key build sites: returns the
string form only if the value is NOT secret, otherwise returns
a fallback. Falls back to bar.plainGUID (set for the local
player) before giving up on "?".
- Comparison hardened: if bar._cachedKey itself is somehow
secret, treat as cache miss and reset rather than running the
`~=` compare. Plain == plain compares are safe; only mixed-
taint compares throw.
- Both sites fixed in one pass: SetBarData (~line 1973) and
GetTooltipSpells (~line 2934).
WHY THIS NEVER CAUGHT IT IN PvE
- In PvE, actor.guid is always plain. The bug only triggers
when CLEU is restricted (arena, BG) so the C_DamageMeter path
feeds the bar with secret GUIDs/names. SecretValues are a
12.0+ feature; older clients never had this code path.
PvP Crash Fix #2: SecretValue spellID as Cast-Count Table Key
- After the cache-key fix above, a SECOND PvP crash surfaced once
the Casts column shipped: "attempted to index a table that
cannot be indexed with secret keys" (3x), in GetTooltipSpells.
- Root cause: the new Casts column looked up cast counts via
resolvedCasts[spellId], where spellId came from C_DamageMeter's
combatSpells. In PvP that spellID is a SecretValue. The guard
`spellId and resolvedCasts[spellId]` passed (a secret is truthy)
but the index threw, because you cannot index ANY table with a
secret key.
- Fix: new CastCountText(castSpells, spellId) helper checks
issecretvalue(spellId) BEFORE indexing and returns "" for secret
or missing ids. Applied to all three cast-count lookups:
SetBarData cache build, the DB-abilities tooltip path, and the
C_DamageMeter on-hover path.

