Epic Damage Meter

A lightweight, non-bloated World of Warcraft damage meter designed for accurate real-time tracking and minimal to non existent performance impact.

File Details

EpicDamageMeter v2.3.9e

  • R
  • Apr 24, 2026
  • 276.43 KB
  • 443
  • 12.0.5+13
  • Classic TBC + 4

File Name

EpicDamageMeter.zip

Supported Versions

  • 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.3.9
-------------
New Features
- Death Recap overlay (modeled on Details\frames\window_deathrecap.lua):
  a styled panel that replaces Blizzard's stock death recap when it opens.
  Hooks DeathRecap_LoadUI so DeathRecapFrame_OpenRecap is intercepted,
  hides Blizzard's Recap1-5 lines, then reads DeathRecap_GetEvents(recapID)
  and renders up to five gradient-pill rows with spell icon, time delta,
  spell name, damage (crit = gold, normal = red), source class color, and
  HP% at time of hit. Matches the Settings redesign palette (ACCENT blue
  + ACCENT_HOT violet). /edm dr to preview.
- Arena Summary window (modeled on Details\frames\window_arenasummary.lua):
  on PVP_MATCH_COMPLETE inside an arena, after a 0.5s settle, freezes a
  snapshot of the current segment and renders a two-column scoreboard —
  your team (blue stripe) vs enemy team (red stripe), sorted by damage,
  each row showing damage + DPS, healing + HPS, and a compact misc strip
  for deaths / interrupts / dispels. Footer totals team damage and team
  healing. Outcome badge reads VICTORY / DEFEAT / DRAW from
  C_PvP.GetActiveMatchWinner vs GetBattlefieldArenaFaction. Classification
  is GUID-based: group members = friendly, arena1-5 = enemy. Lighter than
  Details' 1285-line implementation (no long-term archive, no compressed
  save), but covers the core use case. /edm arena to preview.
- Threat display mode (modeled on Details! Tiny Threat): right-click the mode button
  and pick Threat under Utility. Resolves a reference mob (boss1-5, target, focus,
  mouseover, or targettarget) and polls UnitDetailedThreatSituation for every group
  member on UNIT_THREAT_LIST_UPDATE and PLAYER_TARGET_CHANGED. Percent column shows
  the scaled threat% (100 = aggro threshold); bars are color-coded by threat status:
  red = tanking, orange = about to pull, yellow = getting close, class color = safe.
  Creates actor entries on the fly so non-damaging group members still appear..

Bug Fixes
- Hardened Threat module against Retail 12.0 SecretValue boolean taint: every WoW API
  return that could be a SecretValue (UnitExists, UnitIsDeadOrGhost, UnitCanAttack,
  UnitDetailedThreatSituation's isTanking) is now either pcall-guarded or coerced
  through tostring before any boolean test. Queries the 5 return values of
  UnitDetailedThreatSituation inside a pcall closure so isTanking is dropped at the
  pcall boundary and can never reach a Lua boolean expression. Also forces
  actor.threatIsTank to a strict true/false Lua boolean. Fixes the
  "attempt to perform boolean test on local 'isTanking' (a secret boolean value
  tainted by 'EpicDamageMeter')" error spam on new-patch raid/instance content
  (e.g., Windrunner Spire, Seat of the Triumvirate). (Thanks to ursiDEE and
  MrPapaBear for reporting)
- Fixed detail window showing "No damage data" when clicking an enemy arena
  player or battleground opponent. Two fixes, based on how Details handles
  the same case:
    (1) Removed the blanket SecretValue-GUID rejection in CallSpellAPI.
        Details\boot.lua:328 (Details222.B.GetSpells) and
        Details\core\parser_nocleu1.lua:552 (getSpells) both pass the raw
        sourceGUID from C_DamageMeter.combatSources directly to
        GetCombatSessionSourceFromType / GetCombatSessionSourceFromID — no
        SecretValue filtering. We now do the same (still wrapped in pcall
        for safety), so arena/BG opponents whose GUIDs arrive as
        SecretValues reach the API and return their spell breakdown.
    (2) MainFrame's plain-GUID map now also covers arena1-5 + their pets
        and walks C_NamePlate.GetNamePlates to pick up battleground
        opponents via nameplate unit tokens — UnitGUID on those returns
        plain strings, giving us a guaranteed-plain fallback if the
        session-source GUID path ever stumbles.
  (Thanks to tidgey for reporting)
- Fixed overkill damage being counted in damage done/DPS totals. Effective damage is now
  tracked (amount - overkill), matching how Details and other meters handle it.
  (Thanks to Undercover for reporting)
- Fixed PvP combat data being wiped when leaving arena or battleground. Zone change auto-reset
  now only triggers when entering a new dungeon or raid, not when returning to the open world.
  (Thanks to user_myc0mwa16b49mnts for reporting)
- Fixed meter disappearing after PvP combat ends due to aggressive zone-change reset logic.
- Fixed Threat module crashing on Retail 12.0 with "attempt to perform boolean test on
  a secret boolean value". Rewrote the module to use the same patterns as Details! does
  in unitframe.lua and plugins_statusbar.lua: `local _, status, ...` discards isTanking
  at the call site, and tank state is read from UnitGroupRolesAssigned instead of the
  SecretValue return. No pcall wrapper needed — Details has shipped this pattern for
  years without taint issues. (Thanks to ursiDEE for reporting)

UI Redesign
- Settings panel got a full visual overhaul (not just a polish pass):
  - New "glass indigo" palette: vivid sky-blue accent plus a violet secondary used
    for gradients and highlights, deeper panel body, tighter contrast ladder between
    sidebar, content, section cards, and rows.
  - Panel resized to 860x640 (from 820x620); sidebar widened to 180px so longer
    category labels (and future ones) breathe.
  - Title bar is now a premium header (54px): deep vertical gradient base with a
    horizontal violet→blue accent wash layered on top, a two-segment rainbow top
    line (violet → blue → cyan), bottom separator tinted with the accent gradient,
    and a soft drop shadow for clear separation from the body.
  - New emblem logo: 26x26 rounded square with a violet→blue vertical gradient,
    inner sheen on the top half, soft horizontal halo behind it, and a white "E"
    glyph with outline + shadow. Paired with a larger 16pt wordmark (cyan-teal
    "Epic" / gold "Damage" / soft-red "Meter") and a breadcrumb-style subtitle
    ("/ Settings" in dim text).
  - Setup Wizard button is a gradient pill: violet→blue fill, top sheen, white
    icon + outlined bold label, decorative sparkle dots on the right, and an
    outer halo glow that fades in on hover (plus a brighter gradient + sheen
    shift). The border brightens from 28% to 55% white on hover.
  - Section headers became card-style: flat dark card with 1px inner border, chunky
    accent→violet vertical pill on the left, soft glow around the pill, larger 13pt
    outline title, right-aligned + / − collapse chevron (instead of v / >).
  - Rows redesigned from the ground up: no more alternating background stripes,
    no per-row left accent edge — just flat rows with a 1px hairline divider at the
    bottom and an accent-tinted hover fill. Rows are taller (32px toggle/color,
    34px dropdown, 48px slider) with more breathing room.
  - Sliders got a custom track: thin 4px dark pill with an accent-to-violet
    horizontal-gradient fill that grows from the left as you drag. Default WoW
    slider track graphics are hidden, keeping only the handle.
  - Dropdowns are now pill-shaped, with an accent left-stripe inside the button
    that brightens on hover, plus an accent-colored chevron.
  - Every interactive element now uses the same "gradient pill + halo" language
    as the Setup Wizard button, giving the panel a coherent premium look:
    - Sidebar nav active tab: violet→blue horizontal gradient fill, top sheen
      band, outer halo glow bleeding out of the button, left accent pill in
      violet→blue vertical gradient, outlined bold label with shadow.
    - Reset Data / Reload UI buttons: gradient pill style with per-button
      brand colors (red for Reset, green for Reload), halo that fades in on
      hover, top sheen, outlined 12pt label. Slightly taller (34px).
    - Toggle switches: gradient fill (violet→blue) + outer halo when ON,
      flat neutral when OFF. Knob is pure white on, dim gray off.
    - Dropdowns: gradient fill + top sheen + hover halo + violet→blue left
      accent stripe that brightens on hover. Border switches from neutral to
      accent-blue on hover. The opened menu has an accent gradient top line
      and an accent-tinted border.
  - Sidebar has a subtle vertical violet wash layered on top of its dark base,
    and its right divider is now a vertical accent gradient line.
  - Content area has its own subtle violet top-down wash for depth.
  - Toggle switches are slightly larger (40x18).

- Setup Wizard now speaks the exact same premium visual language as the main
  settings panel:
  - Frame border picks up an accent-tinted color instead of the old grey edge.
  - Title bar rebuilt to match settings (54px): vertical gradient base + violet
    →blue horizontal wash, top sheen band, two-segment rainbow top line
    (violet → blue → cyan), accent-gradient bottom separator. Hosts the same
    26x26 emblem logo with "E" glyph + halo, 15pt wordmark, breadcrumb "/",
    and subtitle reading "Setup Wizard / step name".
  - Skip button is a proper pill now: dark gradient fill, top sheen, 1px
    border, outlined SKIP label — hovers into a warm red border + halo glow
    + brighter fill instead of the old text-with-underline look.
  - Progress bar sized up to 30px with a violet wash, accent-gradient
    bottom divider, 8px step dots, and a violet→blue horizontal gradient
    track that fills from the first to the last completed step. Active step
    now uses a pure white 10x10 dot with white outlined label; completed
    steps shift to the accent color; upcoming stays dim.
  - Bottom nav bar redesigned (56px): violet wash + accent-gradient top
    divider. Back / Next are full gradient pill buttons with halo, fill,
    sheen, and outlined label — primary (Next) in violet→blue, secondary
    (Back) in dark with an accent hover border + subtle halo.
  - Section headers use the same violet→blue vertical pill (3x12) +
    outlined 11pt title + accent gradient underline as the main panel.
  - Selection cards (theme / layout picker) are now gradient pill cards
    with a halo glow and a left violet→blue stripe when selected, a pure
    white checkmark, and an accent-border hover state when unselected.
  - Wizard content area is now scrollable (mouse wheel). Fixes the Behavior
    step rendering its last toggles underneath the Back / Next buttons on
    smaller wizard heights. Scroll position resets to top on step change.
  - Wizard toggle rows match the main toggle rows: flat row with hairline
    divider, accent-tinted hover wash, and the premium 40x18 gradient
    switch (violet→blue fill + halo when ON, white knob; neutral dark
    when OFF, dim gray knob).

Code Quality
- Removed AI-generated comment patterns (section separators, marketing language, obvious
  state-the-obvious comments) across all UI and Core files.
- Headers now describe file contents without adjectives or version markers.

Version 2.3.8
-------------
Bug Fixes (Community Reports)
- Fixed ALL dropdown menus not saving selections: CreateDropdownRow passed numeric array
  index to setter instead of string value. Affected every dropdown in settings (Skin,
  Combat Behavior, Font Face, Bar Texture, etc.). Arrays now preserve intended order.
  (Thanks to Undercover for reporting the symptom on MoP Classic)
- Fixed "Combat Behavior" changes not applying immediately: Selecting a mode now calls
  UpdateVisibility right away instead of waiting for next combat event.
- Fixed visibility features (Hide in Combat, Only in Group, Combat Alpha, etc.) completely
  missing on MoP, TBC, and Classic Era: Added defaults, UpdateVisibility(), and per-instance
  ShowWindow/HideWindow to all clients.
- Fixed segments not separating between fights on MoP/TBC/Classic Era: Added auto-segment
  logic with configurable "Segment Gap" setting (default 3s). Retail threshold reduced from
  hardcoded 10s to use the same setting.
- Fixed class/spec icons not showing on bars: Replaced string-path icon lookup with
  fileDataID-based table for all 13 classes + special types. Fixes nil dirty-check bypass.

Version 2.3.6
-------------
New Features
- Setup Wizard: 7-step first-run experience (Welcome, Theme, Font, Display, Layout, Behavior, Done).
  Appears automatically on first login. Features: step progress bar with labeled dots, skin cards
  with mini-bar previews, font list with live Cyrillic preview, bar overlay/format/info toggles,
  window size/scale/opacity sliders, visibility & combat behavior toggles, summary card on finish.
  All changes apply live. Skip button cleanly placed in title bar.
- Per-skin unique bar effects: Each of the 23 themes now has its own distinct visual identity beyond
  just colors. Each skin defines unique overlays, accent lines, inner glow, spark color/intensity,
  animation easing, and hover behavior:
  • Overlay types: topShine, bottomFade, innerGlow, duoTone, scanline, holographic, glossy, shadow
  • Accent lines: per-skin colored top/bottom/left edge accents
  • Inner glow: gradient glow strips from top/bottom edges (neon, cyberpunk, midnight, etc.)
  • Spark: per-skin spark color and intensity at bar leading edge
  • Animation: smooth (exponential), snappy (instant), elastic (bouncy overshoot) per skin
  • Hover styles: glow, brighten, neonPulse, borderFlash, ember, frost, arcane, subtle
  • Flash color: per-skin crit flash tint
- Per-skin bar layout system: Each theme defines a complete bar design beyond just effects:
  • Icon shape: square (default), round (with minimap ring border), or hidden per skin
  • Value position: right (standard), overlay (on bar fill), or stacked (vertical name+value)
  • Rank style: number (#1, #2), colored dot (●), or hidden per skin
  • Background style: gradient, solid, dark (dimmed), or none per skin
  • Background direction: VERTICAL or HORIZONTAL gradient per skin

New Features
- Enemy Damage Taken display mode: Shows damage taken per enemy NPC/boss. Hover to see
  which players dealt the most damage to that target. Useful for tracking add damage and
  identifying who's slacking on priority targets. Available in mode dropdown under Damage.
- Hide in Combat visibility mode: Opposite of "Auto-Hide OOC" — hides the meter when
  entering combat and shows it when leaving. Perfect for overlapping with a threat meter
  so both share the same screen space with opposing visibility rules.
  (Thanks to Undercover for the suggestion)
- Separate combat alpha: New "Combat Alpha" toggle with independent In-Combat and
  Out-of-Combat opacity sliders (0-100%). Can be used instead of hide/show for a
  smooth fade-based approach to combat visibility control.

Bug Fixes (Community Reports)
- Fixed pet damage not merging with owner on MoP, Classic, and TBC clients: Parser was
  reading from wrong config path (profile.general.mergePets instead of profile.combat.mergePlayerPets).
  Treants, Water Elementals, and all other pets now correctly merge with owner.
  (Thanks to pawnzee for the detailed report)

Visual Improvements
- All per-skin effects boosted to be clearly visible (overlays, accents, glow strips, spark 2-3× stronger)
- Accent lines widened to 2px (top/bottom) and 3px (left) for clear visibility
- Inner glow strips now cover 60% of bar height (was 40%)
- More layout variety: Glass, Midnight, Ocean, Warcraft now use stacked text; Toxic uses overlay text

Bug Fixes
- Fixed name text disappearing on skins with hidden rank/icon (ElvUI, Minimal, Shadow, Toxic):
  rankText had no anchor after ClearAllPoints when rankStyle="none", causing nameText to vanish.
  Now nameText anchors directly to icon when rank is hidden.
- Fixed name text appearing right-aligned on some skins (missing SetJustifyH after ClearAllPoints)
- Removed "stacked" text layout (name+value vertical) — caused text overlap on bars under 28px
- Fixed critical bug: profile settings (theme, fonts, scale, opacity, title bar visibility, etc.)
  were lost on every reload/login. The custom AceDB-3.0-EDM library's copyTable() unconditionally
  overwrote saved profile values with hardcoded defaults from Constants.lua each time db.profile
  was first accessed. Now only missing keys are filled in, preserving user changes across sessions.
  (Thanks to Pentara [Mind] for the detailed bug report identifying Constants.lua as the culprit.)
- Fixed crash spam "attempt to compare local 'str' (a secret string value tainted)" in Parser_Classic.lua:96
  (safeStr() now uses issecretvalue() to bail out before comparing tainted WoW 12.0 strings)
- Fixed Settings crash "attempt to call upvalue 'setValue' (a nil value)" — Minimap Icon toggle on Retail
  was missing the tooltip nil arg, causing the getter to land in the tooltip slot and setValue to be nil
- Removed "Enable Addon" toggle from Settings (the addon is always enabled when loaded)
- Fixed /edm slash command not working on Retail (AceConsole-3.0-EDM lib name didn't match the
  "AceConsole-3.0" mixin string in NewAddon, so RegisterChatCommand silently no-op'd; added
  direct SlashCmdList fallback to match Classic)
- Fixed misleading login hint: "/edm for options" now correctly says "/edm config for settings"
  (in all 5 locales — bare /edm shows the main window, /edm config opens Settings)
- Font dropdowns now only show fonts with full Cyrillic AND special character (äöüéèàñß) support —
  player names with accents or Cyrillic letters no longer appear as missing-glyph boxes. Detection
  uses width-ratio tests (Cyrillic "Ж" must be ≥ 1.5× wider than "I"; accented Latin chars must
  differ from uniform notdef boxes). Currently-saved fonts that don't pass remain visible with a
  "(missing glyphs)" hint so users can change them.

Settings Panel Redesign (visual only — no functional changes)
- Larger, more readable section headers with bottom divider line and breathing room between groups
- Section titles now use mixed case + larger 12pt outlined font (was 9pt uppercase)
- Sidebar nav: bigger tabs (42px), larger icons + labels, animated hover state, glow + accent strip on selected
- Title bar redesigned: 42px tall, gradient accent glow line, logo dot, separate subtitle
- Reset Data / Reload UI buttons larger and more polished (32px, gradient hover)
- Slightly wider panel (820x620) for better content density
- Row heights and label fonts bumped for readability (toggles 28px, sliders 42px, dropdowns 30px, colors 28px)
- Softer alternating row backgrounds — less visual noise
- Universal row hover highlight on every row (toggle/slider/dropdown/color/dual)
- Each row has a subtle blue left-edge accent that ties section content together visually
- Larger toggle switches (34x16) and color swatches (40x18)
- Color swatches now glow with accent border on hover
- Dropdown buttons highlight with accent border on hover
- Slider value labels now outlined for better visibility
- Wider dropdowns (180px) with more legible 10pt text

Version 2.2
-------------
Profile System
- Simplified profile UI (Details-style: dropdown switch, create, copy, delete — no collapsible sections)
- Profiles now save/restore window position, size, scale and display mode per instance
- Multiple windows fully supported: each window remembers its own layout per profile
- Fixed "Profile not found" error (dropdown passed array index instead of profile name)
- Reset Profile preserves window positions

Font System
- Font Face and Font Style changes now trigger a confirmation popup + UI reload (required for WoW to apply)
- Font validation: only fonts that actually render text are shown in the dropdown
- Runtime font discovery from Blizzard font objects (WoW 12.0+ compatible — no more hardcoded broken paths)
- Fonts apply correctly to all bars including new bars created during combat (cached font system)
- Removed broken font registrations (2002, Morpheus, Skurri paths that no longer exist in TWW)

Names & Display
- Fixed names not showing on bars (dirty-check was skipping name updates when values unchanged)
- Fixed realm names showing on bars ("Player-Realm" now correctly stripped to "Player")
- Fixed special characters in names breaking color formatting (switched from string.format %s to concatenation)
- NickTag nickname support (Details-compatible — shows nicknames set in Details, configurable toggle)

Pets
- Merge Pet Damage option now only available on Classic/TBC/Wrath/MoP (toggle ON/OFF)
- Retail always merges pet damage (Blizzard's C_DamageMeter API pre-merges pets — cannot be separated)
- Classic: pet damage correctly merged into owner or shown separately depending on setting

Graph
- Graph v3: Premium visual redesign with layered glow effects, live pulse dot, gradient fills, bottom info bar
- Graph now reads data directly from the tracker (same data source as bars — fixes Retail SecretValue issue)
- Graph data buffer uses batch trim instead of repeated table.remove (performance fix)

Data Persistence
- Fixed damage data disappearing after combat ends (C_DamageMeter sync no longer zeroes out segment when API returns empty)
- Damage bars now persist between fights, only reset when new combat begins

Stability & Internals
- Removed all debug print() statements from production code (converted to Utils.Debug)
- Profile errors now show popup dialogs instead of chat messages
- Profile success messages removed (silent operation)
- Database nil guards: safe instance info lookup, timeline nil check
- Database timeline buffer uses batch trim (same as Graph)
- DetailWindow C_DamageMeter API calls wrapped in pcall (prevents errors on expired sessions)
- Font test FontString reused instead of leaking a new one each time
- Event registration wrapped in SafeRegisterEvent with debug logging on failure
- WotLK Reforged support (new TOC file, Interface: 30800)
- TOC versions updated to 2.2 across all game versions

Version 2.1
-------------
- Fixed window width/height not applying on login (ApplySettings now called after UI initialize)
- All font SetFont calls protected with pcall fallback (prevents broken text on invalid font paths)

Version 2.0
-------------
- Unified addon: Single folder supports Retail (12.0.1), Classic (1.15.8), TBC Anniversary (2.5.5), MoP Classic (5.5.3)
- Multi-TOC architecture with runtime API detection
- Retail WoW 12.0 support: C_DamageMeter API integration with Secret Values handling
- Real-time combat data display on Retail (renders directly from C_DamageMeter during combat)
- Fixed font, font size, and font flag changes not applying to bars
- Fixed Show Percent toggle not working
- Fixed Show Rank toggle not working
- Fixed graph not displaying data on Retail (now queries C_DamageMeter for totals)
- Fixed window scale not applying on reload (value saved but not rendered — reported on TBCA)
- Scale now saved per-character and re-applied in ApplySettings
- Fixed Current/Overall tabs both showing overall data
- Fixed combat timer stuck at 0:01
- Fixed left-click toggle window not working
- Fixed combat duration not accumulating across multiple combat phases
- Show Fight Duration toggle now works in status bar
- Separated DPS from Damage Done display (DPS shows per-second + percent, Damage Done shows total + DPS)
- Separated HPS from Healing Done display (same distinction)
- Fixed sorting not updating during combat (insertion sort with per-comparison pcall for secret values)
- Detail window opens on bar click with spell breakdown
- Mouseover tooltips on bars showing DPS/HPS and top abilities
- Graph anchors to main window instead of UIParent
- Graph collects data during combat even when hidden
- Isolated Ace3 libraries (-EDM suffix) for all clients
- Updated Twitch link to twitch.tv/JugoBetrugoTV
- Removed interface version from config display
- Performance: Rewrote Retail combat rendering to use GetCombatSessionFromType (1 API call for all players)
- Performance: Eliminated per-player roster building and per-GUID API queries (40→1 calls in BGs)
- Performance: Uses amountPerSecond from API for DPS/HPS (no manual division needed)
- Performance: Uses session.maxAmount + SetMinMaxValues for secret-safe bar proportions
- Performance: Spec icons from API (specIconID, NeverSecret) instead of generic class icons
- Performance: isLocalPlayer (NeverSecret) for player highlight instead of UnitName comparison
- Performance: Dirty-check rendering (skip GPU calls when bar data unchanged)
- Performance: Cached settings per update cycle (avoid per-bar profile lookups)
- Performance: Insertion sort for secret values during combat (per-comparison pcall)
- Performance: Roster cache with 3s TTL (avoid rebuilding raid roster every tick)
- Performance: Minimum 0.5s refresh rate clamp (prevents excessive update frequency)
- Performance: LayoutBars skip when bar count/scroll/height unchanged
- Performance: Color/texture updates only on class or rank change
- Performance: Name text updates only on actor name change
- Performance: Icon texture updates only on class change
- Performance: C_Timer polyfill, bit-lib compatibility, tainted value detection

Version 1.1.0
-------------
- Added multi-client support (Retail, Classic Era, MoP Remix)
- Interface versions: 110207 (Retail), 11508 (Classic), 50503 (MoP)
- Fixed Damage Taken mode to correctly show damage received
- Fixed DPS display calculations
- Improved click handler for damage bars
- Enhanced graph smoothing with Catmull-Rom spline interpolation
- Performance optimizations:
  - Localized globals across all modules for faster lookups
  - Added UI update throttling (100ms) to reduce CPU usage
  - Implemented table reuse to reduce garbage collection
  - Pre-computed bit masks for flag checks
  - Added class color caching

Version 1.0.0
-------------
- Initial release
- Real-time damage and healing tracking
- Beautiful graph visualization with animations
- Skin system support
- Detail window with spell breakdown
- Minimap button integration
- Combat segment tracking