Repository navigation
Releases
EpogArmory has moved to ConLogs-Epoch -- download the new addon
⚠️ EpogArmory is now ConLogs-Epoch
This addon has been renamed and moved. EpogArmory is no longer updated here.
➡️ Download the new addon: https://github.com/Defcons/ConLogsApp/releases/latest
ConLogs-Epoch is the direct successor — same mesh gear inspector, same /epogarmory
features (now also /conlogs), plus it embeds gear/talents into your combat log so a single
uploaded log on epoglogs.com carries everything.
How to switch
- Download ConLogs-Epoch from the link above.
- Delete the old
EpogArmoryfolder fromInterface/AddOns/. - Extract
ConLogs-EpochintoInterface/AddOns/and/reload.
Your saved gear data migrates automatically on first launch — nothing is lost.
(No download is attached to this release on purpose — grab the current version from ConLogsApp.)
v2.0.0 — Dungeon minimize button + whisper-spam defense
v2.0.0 — major release. The cumulative polish across v1.7–v1.11 reaches a maturity milestone. The addon's three top-level surfaces — armory inspector, dummy parse validation, dungeon speedrun tracking — are all in stable shape. This release focuses on two quality-of-life refinements.
1. Dungeon Run frame: minimize button
A new − button sits just left of the close (X) on the Dungeon Run frame. Click it and the frame collapses to a single status row:
LBRS 3:42 2/6 LOG
- Short name — variant short name for multi-variant dungeons (LBRS / UBRS / Live / Undead), first word of the dungeon name otherwise (Blackrock, Scholomance, Onyxia's, Baradin)
- Timer — same log-tied logic as the full frame, counts up while logging is active, freezes yellow on stop,
--:--if never started - N/M — bosses killed / total
- LOG / OFF — logging status
Click the now-+ button to restore the full view. Toggle state persists across /reload and re-login.
Useful pattern: minimize after the variant is locked in, and keep the frame on screen as a tiny progress tracker without it dominating the UI for the rest of the run.
2. Fix: "No player named X is currently playing" chat spam
Some users reported chat being flooded with system error messages naming offline guild members — typically dozens of No player named 'X' is currently playing. lines per minute when autosync was enabled. The v1.9.1 fix attempted to address this but missed a stale-cache edge case.
The root cause: when autosync queues up to 200 sync-response chunks to a peer and that peer logs off mid-burst, every remaining chunk fires the offline-target system error. v1.9.1's online check worked when the guild roster was fresh, but the roster only refreshes when the client calls GuildRoster() — which we only did from the autosync tick every few minutes. So the cache reported stale "online" data and we kept sending.
v2.0.0 fix: added a chat-message filter that catches the actual system error string, suppresses it from chat, AND drains our outbound queue for that target so we don't repeat the same send 199 more times. Combined with the existing cache guard, this is now defense in depth — three independent layers all need to fail before any spam reaches your chat.
Manual /w SomeoneOffline from you still works normally and shows your own errors. The filter only suppresses errors we can prove came from our own sends.
Backward Compatibility
- New SavedVariable
EpogArmoryDB.config.dungeonMinimized(boolean, defaults to false). Additive — existing installs default to non-minimized. - No wire-format / mesh-protocol impact. Mixed-version meshes work fine.
- Mesh peers running v1.x will receive the auto-update notification pointing here.
Install
- Download
EpogArmory.zipbelow. - Extract into
World of Warcraft\Interface\AddOns\. You should end up withInterface\AddOns\EpogArmory\containing five files:EpogArmory.toc,EpogArmory.lua,EpogArmoryUI.lua,EpogArmoryDummy.lua,EpogArmoryDungeon.lua. /reload(or restart the client) — no new files in this version, so/reloadis sufficient.
v1.11.0 — Dungeon trash mob name fixes
v1.11.0 — Dungeon trash mob name fixes. Three silent-failure data bugs found via in-game screenshot feedback. If you've been doing UBRS, Scholomance, or Stratholme Undead speedruns and noticed trash buckets staying at 0/N no matter what you killed, this fixes it.
The bug class
The Dungeon Run frame tracks trash mob kills via the combat log. It does exact-string match against the destName field from UNIT_DIED events. If the mob name in the addon's data table doesn't exactly match the actual in-game NPC name, the match silently misses on every kill — the bucket counter stays at 0/N for the whole run, and the addon happily reports an under-cleared run.
Three names were wrong. All sourced originally from the epoglogs leaderboard rules file (which carried the typos); the addon copy stayed stale.
Three names corrected
| Dungeon | Old (broken) | New (correct) |
|---|---|---|
| Upper Blackrock Spire | Ragetalon Dragonspawn / Ragetalon Flamescale |
Rage Talon Dragonspawn / Rage Talon Flamescale |
| Scholomance | Scolomance Adept (missing 'h') |
Scholomance Adept |
| Stratholme Undead | Ghould Ravener (extra 'd') |
Ghoul Ravener |
After this release, those buckets actually tick up when you kill the mobs.
UBRS visual change
Both UBRS "Rage Talon" buckets now share the same auto-computed display name. The load-time collision detector adds (1) / (2) suffixes, matching the existing Blackhand pattern:
0/10 Rage Talon (1) ← Dragonspawn / Flamescale (this is the one that was broken)
0/14 Blackhand (1)
0/6 Rage Talon (2) ← Dragon Guard / Fire Tongue / Captain
0/6 Blackhand (2)
Backward Compatibility
- No SavedVariables changes.
- No wire-format / mesh-protocol impact.
- Mesh peers running v1.10.x will receive the auto-update notification pointing here.
Install
- Download
EpogArmory.zipbelow. - Extract into
World of Warcraft\Interface\AddOns\. You should end up withInterface\AddOns\EpogArmory\containing five files:EpogArmory.toc,EpogArmory.lua,EpogArmoryUI.lua,EpogArmoryDummy.lua,EpogArmoryDungeon.lua. /reload(or restart the client) — no new files in this version, so/reloadis sufficient.
v1.10.0 — Dungeon frame layout polish
v1.10.0 — Dungeon frame layout polish. Two UI fixes to the Dungeon Run frame from in-game screenshot feedback. No new features, no protocol changes — pure quality-of-life.
1. Stale "Start /combatlog?" prompt fixed
The "Start /combatlog for this run? [Yes] [No]" prompt could stay visible after logging was already active — e.g. if you clicked the bottom "Start logging" button to start the log instead of clicking "Yes" on the prompt, the prompt would just sit there overlapping the bosses section and the default-UI combat-log quick controls.
The prompt now hides immediately when logging becomes active by any means (the bottom button, raid auto-log claiming an existing log, another addon turning /combatlog on).
2. Compact rows + dynamic layout
Two related changes:
- Tighter rows. Boss and trash row pitch reduced from 11px to 10px.
- Dynamic layout. The trash section now sits immediately below the actual last visible boss row instead of at a fixed position reserved for the worst-case 10-boss multi-variant preview. The frame height also auto-adjusts to fit the visible content.
Net effect, per dungeon:
| Dungeon | Before (fixed 430px) | After (dynamic) |
|---|---|---|
| Blackrock Depths (4 boss + 4 trash) | 430, empty middle | ~318 |
| Lower Blackrock Spire (6 + 7) | 430, button clipping "Bloodaxe" | ~378 |
| Upper Blackrock Spire (4 + 4) | 430 | ~318 |
| Scholomance (8 + 4) | 430 | ~338 |
| Stratholme preview (10 + 0) | 430 | ~318 |
| Stratholme Live / Undead (4-6 + 5-6) | 430 | ~328-348 |
| Onyxia's Lair (1 + 0) | 430 (manual open only) | 270 (minimum) |
Bottom button no longer clips trash rows. Smaller dungeons no longer waste vertical space.
Backward Compatibility
- No SavedVariables changes.
- No wire-format / mesh-protocol impact.
- Mesh peers running v1.9.x will receive the auto-update notification pointing here.
Install
- Download
EpogArmory.zipbelow. - Extract into
World of Warcraft\Interface\AddOns\. You should end up withInterface\AddOns\EpogArmory\containing five files:EpogArmory.toc,EpogArmory.lua,EpogArmoryUI.lua,EpogArmoryDummy.lua,EpogArmoryDungeon.lua. /reload(or restart the client) — no new files in this version, so/reloadis sufficient.
v1.9.1 — Single-Target enforcement + whisper-spam fix
v1.9.1 — major release. Single-Target-Only dummy enforcement + a chat-spam bugfix that was hitting users in the wild.
1. Single-Target-Only dummy parses (Project Epoch)
epoglogs.com recently introduced a server-side rule (v0.86.6+) that rejects combat-log uploads where you damaged 2+ training dummies in one pull. The leaderboards at epoglogs.com/dummy-stats are single-target only — Expert's (L60) vs Heroic (L63) dummies have very different EHP curves, and AoE rotations would pollute the rankings.
The addon now mirrors that rule locally so you find out before you upload, not after.
What you'll see in-game:
- Dummy frame title now reads
EpogLogs · Dummy Parse · Single-Target Only(the trailing tag is greyed so it sits as a quieter subtitle). - The moment a second dummy GUID appears in the combat log, a red warning appears under the state badge: "Multi-target damage detected — fight invalidated".
- The fight is flipped to INVALID in real time — the end-of-fight verdict matches what
SaveFightRecorddoes, no "showed CLEAN locally but rejected on upload" surprise. - On Project Epoch realms, the fight is not saved at all to
dummyFights[]so it doesn't pollute your history. A red chat line + popup explain why.
Realm-gated. Only Project Epoch realms (Project Epoch / Epoch / ProjectEpoch) enforce the skip. CoA-style realms where AoE training is valid content keep the save but tag the record with aoe=true for offline analytics. Override list in EpogArmoryDB.skipAoERealms for any exact-string mismatch.
2. Fix: "No player named X" chat-spam
The bug. Some users were seeing dozens (up to 200) lines of No player named 'X' is currently playing. system errors flooding their chat. Reported to me via Onrehab → me: "this happens a lot and i think it's from your armory addon when it's trying to communicate with an offline player".
Root cause. When another player asks your client for a sync (background catch-up of gear data), your client queues up to 200 WHISPER addon messages back to them — one per gear set. If they log off mid-burst, every remaining chunk fires the system error.
Fix. Each WHISPER send now checks if the target is still online before firing. If they're offline, the chunk is silently dropped AND all remaining queued chunks targeting that same offline player are drained in one pass. Zero spam, zero behavior change for online targets, zero protocol impact.
Backward Compatibility
- New SavedVariables fields are additive:
EpogArmoryDB.dummyFights[].aoe,.aoeExtraDummyCount,.aoeExtraDummyName(only set on AoE-tagged records). EpogArmoryDB.skipAoERealmsis optional override; absent means use the built-in Project Epoch list.- Wire format unchanged — no mesh-protocol impact. Mixed-version meshes work fine.
- Mesh peers running v1.8.x will receive the auto-update notification pointing here.
Install
- Download
EpogArmory.zipbelow. - Extract into
World of Warcraft\Interface\AddOns\. You should end up withInterface\AddOns\EpogArmory\containing five files:EpogArmory.toc,EpogArmory.lua,EpogArmoryUI.lua,EpogArmoryDummy.lua,EpogArmoryDungeon.lua. /reload(or restart the client) — no new files in this version, so/reloadis sufficient.- Verify with
/epogarmory statusor just open the dummy frame on your next training dummy session.
v1.8.0 — Dungeon speedruns + raid auto-log + dummy practice
v1.8.0 — major release. Dungeon speedruns + raid auto-log + dummy practice mode. Adds a second top-level surface to the addon (the Dungeon Run frame) and rounds out the dummy parse module that landed in v1.7.0 with several quality-of-life improvements.
1. Dungeon Run frame
A new frame auto-opens when you enter a tracked dungeon. It shows:
- Dungeon name and current logging status
- Boss kill checklist with timestamps (
+ Lord Incendius (1:34)) - Trash bucket requirements (
16/16 Scarshield) with red/yellow/green color cues - Run timer tied to the actual /combatlog session
- One-time prompt asking whether to start /combatlog (Yes/No)
Tracked dungeons: Blackrock Depths, Lower Blackrock Spire, Upper Blackrock Spire, Scholomance, Stratholme (Live), Stratholme (Undead), Baradin Hold.
For multi-variant instances (Blackrock Spire LBRS/UBRS, Stratholme Live/Undead), the frame shows variant selector buttons on entry. The first boss kill also auto-resolves the variant if you forget to click.
Toggle manually with /epogarmory dungeon or via the new minimap right-click menu entry.
2. Raid auto-log (Onyxia's Lair)
Entering a raid instance auto-starts /combatlog silently in the background — no frame, no timer in your face. The combat log is what the leaderboard parser needs; the addon stays out of the way.
Three safeties around the auto-log:
- Ownership check. Before starting, the addon checks if another addon (or you manually) already started a log. If so, it leaves it alone and won't stop it on raid exit.
- Auto-stop on raid exit. When you leave the raid, the addon stops the log it started. If you didn't have it on before entering, you don't have to remember to turn it off.
- /reload safe. The ownership flag is persisted to SavedVariables. /reload during a raid keeps the log running and the addon still knows it owns the log.
Toggle off if you don't want it: /epogarmory raidlog off. Default is on.
3. Dummy parse: PRACTICE mode
When you attack a Training Dummy without auto-log enabled (the default), the dummy frame now becomes a free DPS meter:
- Live DPS readout, total damage, elapsed time
- Player auras and target debuffs (informational only — no validation in practice)
- No /combatlog file, no 1:30 limit, no Validate button
- State badge is cyan (
PRACTICE) instead of green (LOGGING) so it's clearly different from a real log session
Want a real log for leaderboard upload? Tick the "Auto-start log on combat" checkbox or click "Start logging" — same flow as before.
4. Dummy parse: 10-second strict validate window
The Validate button now has a live countdown on its label: VALIDATE (10) → VALIDATE (9) → … → VALIDATE (1). Window expiry shows LOG FAILED - click Reset to try again so you know exactly what happened if you missed the click.
5. Dummy parse: Basic Campfire fallback marker
For the rare case where you have a Fishing Pole equipped during a parse (Fishing would succeed instead of failing), the validate macro now chains /cast Basic Campfire after /cast Fishing. Both spells write a SPELL_CAST_FAILED line into the combat log — the site accepts either as a valid marker.
6. Minimap menu shortcuts
Right-click the minimap button → new entries:
- Open Dummy parse
- Open Dungeon run
No need to memorize the slash commands.
7. New slash commands
/epogarmory dungeon — toggle the Dungeon run frame
/epogarmory dummy — toggle the Dummy parse frame (already existed)
/epogarmory testvalidate — exercise the marker mechanism without a full parse
/epogarmory raidlog [on|off|status] — toggle raid auto-log
/epogarmory dungeondebug — dump dungeon-detection diagnostic info
Backward Compatibility
- All new SavedVariables fields are additive (
config.dummyAutoLog,config.raidAutoLog,dummyFights[],session.addonStartedLog). - Wire format unchanged — no mesh-protocol impact. Mixed-version meshes work fine.
- Mesh peers running v1.7.x will receive the auto-update notification pointing here.
Install
- Download
EpogArmory.zipbelow. - Extract into
World of Warcraft\Interface\AddOns\. You should end up withInterface\AddOns\EpogArmory\containing five files:EpogArmory.tocEpogArmory.luaEpogArmoryUI.luaEpogArmoryDummy.luaEpogArmoryDungeon.lua(new)
- Fully restart the client (not just
/reload) — the new.luafile requires re-parsing the addon manifest. - Type
/epogarmory dungeonto open the new Dungeon Run frame, or just zone into a tracked dungeon to see it auto-open.
v1.7.0 — Dummy parse validation
v1.7.0 — major release. Dummy parse validation. The addon is no longer armory-only — there's a new top-level surface for target-dummy benchmark runs that produces combat logs cryptographically gated for upload to epoglogs.com.
1. Target-dummy parse validation
New module EpogArmoryDummy.lua. When you engage a Training Dummy in a city, the addon:
- Starts
/combatlogautomatically (auto-start is on by default; configurable). - Continuously checks your auras and the dummy's debuffs every quarter-second for 1:30.
- Refuses to stamp the log if anything taints the run — flasks, elixirs, Well Fed, weapon oils, sharpening/weightstones, drums, foreign-source buffs from raidmates, foreign-source debuffs from other players hitting the same dummy.
- After T+1:20, shows a green Validate button (visible even while you're stuck in combat). Clicking it writes a marker line into your combat log that epoglogs.com checks for.
- Prints a CLEAN / INVALID verdict in chat with the exact log filename you should upload.
The marker mechanism uses a secure-button hardware-event click, which is the only way to author CLEU entries that addon-script casts can't produce — meaning the validated log file is impossible to forge from another addon.
2. Big DPS readout
The dummy parse window's focal element is a live DPS number calculated from our own combat log tracking — no Recount or Skada dependency. Total damage and a progress bar with a tick at the 1:20 validation point sit alongside it.
3. Allowed during the parse
Your own buffs, your pet (Hunter pets, Warlock demons, Shadowfiend, Greater Elementals, etc. — all class summons use the same pet unit token), mana potions, and your normal in-combat consumes that aren't flasks/elixirs/food/oils.
4. Auto-stop behaviour
The log stops in any of these cases:
- Reset clicked before validation
- Validate clicked (after the marker is confirmed in CLEU)
- 3-second idle gap during the 1:20–1:30 tail (you stopped hitting the dummy)
- Hard timeout at T+1:30
- 120s safety cap if you stay in combat after the dummy fight ended
Backward Compatibility
- New file (
EpogArmoryDummy.lua), new module — doesn't touch any existing armory code paths. - New SavedVariables fields (
EpogArmoryDB.dummyFights[],EpogArmoryDB.config.dummyAutoLog) are additive; defaults applied automatically on first login after upgrade. - Mesh wire format unchanged. Mixed-version meshes work — older clients see no behavior change.
- Mesh peers running v1.6.x will receive the auto-update notification pointing here.
Install
- Download
EpogArmory.zipbelow. - Extract into
World of Warcraft\Interface\AddOns\. You should end up withInterface\AddOns\EpogArmory\containing four files:EpogArmory.toc,EpogArmory.lua,EpogArmoryUI.lua,EpogArmoryDummy.lua. - Restart the client (or
/reloadif you were already in-game). - Type
/epogdummyto open the dummy parse window, or just engage a Training Dummy in a city — the window opens automatically.
EpogArmory v1.6.0 — Auto-sync + quality controls
v1.6.0 — major release.
Auto-sync and quality controls. The big one is auto-sync: you no longer have to manually /epogarmory syncfrom <name> for every peer to catch up on what they've scanned. The addon does it in the background, slow and steady, one peer every few minutes.
1. Background auto-sync
Every 5 minutes the addon picks one reachable peer and starts a sync via the same wire path as /syncfrom. Slow enough that bandwidth stays modest even in a 100-person guild, but persistent — over an hour or two you'll have synced most active peers' stored scans automatically.
Per-peer cooldown: 24h. EpogArmoryDB.peerInfo[name].lastSyncedFrom is persisted, so the same person doesn't get drained over and over. Survives /reload, re-login, and alt-switching (account-wide).
Selection criteria for who gets auto-synced:
- Currently reachable: in our guild (and online), party, or raid
- Heard from in the last 24h (
peerInfo.lastSeen) - Have at least 10 stored scans (
AUTO_SYNC_MIN_DBSIZE = 10) - Off the 24h cooldown
- Not currently syncing
- Ties broken by largest DB first — most data per sync
Respects existing caps: 3 concurrent syncs max (SYNC_MAX_CONCURRENT). First attempt is 90s after login so the guild roster and peer pings have time to settle.
Default on for new and upgrading users. Toggle:
/epogarmory autosync — show status (countdown, eligible peers, on-cooldown count)
/epogarmory autosync on
/epogarmory autosync off
Manual /syncfrom <name> still works the same — and importantly, a manual sync also writes lastSyncedFrom, so the auto-sync won't re-pick that peer for 24h after you sync them manually.
2. Stricter quality gates
Three new rules for what qualifies for the mesh:
Average ilvl floor: 55. Sets where the average ilvl across filled non-cosmetic slots (shirt + tabard excluded) falls below 55 are rejected as leveling-gear scans. Catches alts mid-questing, fresh L60 dings, and bank-alt scans that shouldn't pollute the mesh. The threshold sits at the floor of L60 dungeon-blue territory — full T0/dungeon set averages ~55-58; pure greens average ~45-50; raid epics 65+. So mostly-blue raiders pass cleanly, mostly-greens reject.
Sparse-cache safe: gate only fires when at least 10 valid ilvl reads are available. Fresh installs and cold meshes aren't false-rejected during warm-up.
Three new utility-item blacklist patterns added at UTILITY_ITEM_NAMES_ANY_SLOT:
- Argent Dawn Commission — +rep trinket from Stratholme leveling drops
- Finkle's Skinner — skinning-only one-handed dagger
- Skull of Impending Doom — novelty trinket from Wailing Caverns
Name-based rather than itemID, since Ascension reassigns vanilla item IDs server-side. Names stay stable across reassignments.
Offhand always optional. The v1.3.3 rule conditionally required slot 17 unless mainhand was a 2H weapon — too strict for titan-grip warriors swapping between 2H + duals mid-fight, prot warriors going 2H briefly, etc. Slot 17 now joins shirt (4) and tabard (19) as never-required.
3. PvP-set routing hardening
The "Insignia/Medallion/Battlemaster's trinket → sets["pvp"]" routing was structurally correct (centralized at one write site in Ingest, receiver recomputes locally instead of trusting the sender's wire field) but had a real silent-fail gap.
The gap: EntryGearLooksPvP resolved trinket names via GetItemInfo(itemID), which reads WoW's client cache — populated by async server queries. A freshly-received itemID might not have a name available yet when Ingest makes the routing decision. Result: the set silently routes to a talent-tree key instead of sets["pvp"].
Meanwhile, the addon's own EpogItemCacheDB IS seeded synchronously from v1.2+ item-info hints (wire pos 40), so it already has the name when the routing happens. The resolver just wasn't consulting it.
Fix: new ResolveItemName(iid) helper checks EpogItemCacheDB[iid].name first, falls back to GetItemInfo. Both EntryGearLooksPvP (receiver) and UnitLooksPvP (sender) use it now. PvP-trinket loadouts route to sets["pvp"] reliably regardless of WoW client cache state.
Diagnostic added: when routing to sets["pvp"], a debug line fires:
[route] Defcom → sets["pvp"] (PvP trinket detected in slot 13/14)
Toggle with /epogarmory debug to verify the gate fires on real scans.
4. Refactor: shared sync-start path
Both manual /syncfrom and auto-sync now go through one StartSyncFromPeer(name, days) helper. The slash command dropped from ~80 lines of inline sync logic to a thin wrapper around the helper. Reduces drift risk between the two paths and ensures both write lastSyncedFrom consistently.
5. Other quality-of-life
The Defense section fix from v1.5.0 (using GetDodgeChance / GetParryChance / GetBlockChance for totals instead of rating-only) and the talent-tree visual pass (bigger cells, more vertical breathing room, brighter rank colors) are all carried forward.
Backward compatibility
- Wire format unchanged — no new fields added in v1.5.x. Mixed-version mesh works: v1.6 peers respond to legacy clients' sync requests the same way, older clients receive v1.6 broadcasts cleanly.
- SavedVariables additions are optional:
peerInfo[name].lastSyncedFrom(treated as 0 / never-synced when missing),config.autoSync(defaulted to true on first run after upgrade). - No DB wipe on update. Existing mesh data preserved.
MigratePlayerscontinues to handle pre-v0.13 flat entries and v0.13+ unkeyed sets.
Install
Extract EpogArmory.zip to <WoW>/Interface/AddOns/, overwriting any previous version.
After upgrading: /reload. Auto-sync starts firing ~90 seconds after login. Watch /epogarmory autosync to see the next-attempt countdown and which peers are eligible.
If you want to disable the auto-sync entirely:
/epogarmory autosync off
Manual /syncfrom and all other functionality stays the same.
EpogArmory v1.5.0 — Stats overview, Guild column, talent tree polish
v1.5.0 — major release.
Stats overview panel, Guild column, talent tree polish, and a tighter inspect frame layout. All built on the v1.4.0 reliability foundation (settle+verify, full-set gate, frame leak fixes).
1. Stats overview panel
A new Stats button on the inspect frame opens a side-panel showing aggregated stats for the active gear set. Layout when fully open: Stats | Inspect | Talents, three docked panels.
Live character-pane snapshot at scan time. Item-only aggregation is wrong for any L60+ character — it misses race+level base attributes, class AP formulas (Hunter ranged AP includes Agility×2), weapon damage with AP scaling, talent multipliers (Lightning Reflexes +15% Agility), and active buff effects. So a Hunter with 339 Agility on the in-game character pane was showing 180 in EpogArmory pre-v1.5.
New CapturePlayerStats(unit) reads from UnitStat / UnitArmor / UnitAttackPower / UnitRangedAttackPower / UnitDamage — these all work on inspected unit tokens (raid5, party1, etc.), so the snapshot fires for both self-scans and inspect-scans of others.
Player-only Blizzard APIs (GetCritChance, GetCombatRatingBonus, GetSpellBonusDamage, GetDodgeChance, etc.) only respond to the implicit "player" — those fields populate when scanning self. For inspect-scans of others, the panel falls back to derived-from-rating sums.
Sections: Base Stats (STR/AGI/STA/INT/SPI/Armor) · Melee (Damage/Speed/Power/Hit/Crit/Haste/Expertise) · Ranged (Power/Hit/Crit/Haste) · Spell (Spell Power/Hit/Crit/Haste/Mp5/Penetration) · Defense (Defense skill/Dodge/Parry/Block/Block Value/Resilience/Armor Pen).
Vanilla + TBC + WotLK gear all sum correctly. Vanilla L60 items express percentages as tooltip text (+1% crit) rather than as rating values — the rating system only arrived in TBC. EpogArmory parses these into entry.tooltipStats already; the new CombinePct helper merges both sources into one displayed % per row:
displayed_pct = sum(rating_value / L80_conversion) for rating keys
+ sum(tooltip_pct_value) for tooltip keys
So a mixed-era character with +1% crit from Devilsaur Eye plus 30 Crit Rating from a TBC ring shows the combined value correctly.
Wire field 43 carries the encoded snapshot (str=74,agi=339,sta=220,armor=2399,mAP=722,...). Stored as set.charStats, persisted in EpogArmoryDB, eventually flowing to epoglogs.com via the standard upload path. Receivers without the field display the (item-only) indicator in the panel title and use the v1.4.0-style fallbacks.
2. Scanners view: Guild column
New wire field 42 carries the scanner's guild name (GetGuildInfo("player") at scan time). Receivers persist to peerInfo[name].guild and display it in a new column inserted between Name and Contrib in the Scanners-view leaderboard.
Self-row guild populated live from the API since peerInfo never tracks self. Forward-compat: pre-v1.5 senders without field 42 don't blow away existing guild values when they broadcast.
Wire-control characters (^, |) stripped defensively from the guild name before encoding.
3. Talent tree visual pass
Closer to Blizzard's PlayerTalentFrame look:
- Cell size: 36 → 40 px
- Horizontal gap: 6 → 12 px
- Vertical gap: 6 → 14 px (the biggest visual change — Blizzard's tree has noticeably more vertical breathing room than horizontal)
- Brighter rank-state colors: max-rank cells glow gold
(1.0, 0.78, 0.18), in-progress cells use saturated green(0.18, 0.78, 0.22), empty cells stay near-black - Frame height bumped from 540 to 600 to fit 9 rows at the new pitch
4. Frame sizing & layout
- Inspect frame: 320 → 360 wide. Slot icon offsets pushed inward (15 → 35 left/right; 55 → 75 for bottom-row weapons) so items have more breathing room around the edges. Icon spacing in the middle is unchanged — only outer padding grew.
- Browser frame: 320 → 380 wide to fit the new Guild column.
- Talent frame: 360×600, drag disabled. Always docks to the inspect frame's right edge via a relative anchor (
TOPLEFT → TOPRIGHT), so dragging the inspect frame carries talents along automatically. Previously letting talents drag independently broke the "stick" relationship. - Stats button grouped horizontally next to Talents (
Talents | Statsrow), with the spec-tab row dropped 10px for clearance.
5. Defense section fixes
GetCombatRatingBonus(3/4/5) only returns the rating-derived bonus — a Hunter with no dodge rating still has 4-5% dodge from base Agility, but my v1.4.4 build was displaying that as 0%. Switched to:
GetDodgeChance()— total dodge incl. base + Agility + items + buffsGetParryChance()— same for parryGetBlockChance()— same for blockUnitDefense("player")— for Defense skill (base + rating modifier)
Display row label changed from "Defense Rating: N (+ skill)" → "Defense: N skill" to match the in-game character pane.
6. Test conclusion: Reality Recalibrators required
A v1.4.1 internal test build disabled the aura interlock to validate whether the v1.4.0 settle (400ms) + verify (1.5s) pipeline was sufficient on its own. Result: no. Ascension/Epoch's transmog override keeps returning cosmetic itemIDs for inspected players past the 1.9s combined window, so without the aura we just broadcast junk gear.
Interlock back on. The REQUIRE_REALITY_AURA flag stays in the code (default true) so re-testing is a one-line revert if server transmog behavior ever changes.
7. Frame leak fixes carried over from v1.4.0
The audit fixes from v1.4.0 are still in place: OnInspectReady's settle/verify timer frames are recycled at module level, the talent panel builds once and reuses, no per-inspect frame leaks.
Backward compatibility
- Wire format additive. Pre-v1.5 receivers ignore positions 42 (senderGuild) and 43 (charStats) silently. v1.5 receivers handle older payloads cleanly.
- No DB wipe on update. All accumulated mesh data preserved.
- Pre-v1.5 cached entries render with v1.4.0-style item-only fallbacks for the new Stats panel. Title shows
(item-only)indicator so users know why values look low. - Mixed-version mesh works: v1.5 senders carry the new fields, older senders don't, receivers handle both.
MigratePlayerscontinues to handle pre-v0.13 flat entries and v0.13+ unkeyed sets.
Install
Extract EpogArmory.zip to <WoW>/Interface/AddOns/, overwriting any previous version.
After upgrading: /reload. Re-scan yourself (equip-and-unequip any item, or /epogarmory cachebuild) once to populate the new charStats field for your own entry. Existing peers' entries upgrade naturally as they re-scan over time.
Note for epoglogs.com integration
The charStats blob persisted in SavedVariables flows directly into the upload payload — the website can now render real character-pane numbers in the armory view. Field reference and display recommendations are documented in the addon's CapturePlayerStats / EncodeCharStats source. Falls back to item-aggregation when the field is absent (pre-v1.5 entries, or inspect-scans of others where player-only APIs don't fire).
EpogArmory v1.4.0 — inspect reliability + quality gate
v1.4.0 — major release.
Inspect reliability + data quality pass. Catches the gear-read race conditions that produced wrong-item rows in the mesh, blocks mid-equipment-swap inspects from polluting the DB, and eliminates two long-standing frame leaks.
1. Gear-read settle window — 400ms
Ascension's transmog system can return cosmetic appearance item IDs for ~290ms after INSPECT_TALENT_READY fires. Reading slots immediately captures the visual, not the gameplay item.
OnInspectReady now defers BuildPayload by 400ms via a one-shot frame timer. current stays set during the wait, so TryInspect won't start a competing inspect. After the settle, the callback re-validates that current.guid and UnitGUID(unit) still match the snapshot — if CheckTimeout cleared the slot mid-settle, the result is safely discarded.
2. Vanity-flip verify pass — +1.5s
Some slot links flip non-deterministically for another second or two after the initial settle, even with the 400ms gate. After the initial broadcast, the addon snapshots the slot fingerprint and re-reads at +1.5s. If any slot's link changed, a corrected payload is built and broadcast — receivers' existing dedup absorbs no-op cases.
3. Instance-entry re-inspect
PLAYER_ENTERING_WORLD now clears the in-memory 15-min cooldown for all current raid/party members when IsInInstance() is true, so every group member is re-queued for a fresh scan at the start of each instance run. The 24-hour EpogArmoryDB.lastScanned mesh gate is preserved — cross-client dedup still works exactly as before.
4. Full-set gear gate
Mid-equipment-swap inspects (where the player has briefly unequipped a weapon) used to slip into the DB as half-loadouts. New CheckFullSet helper validates every "useful" slot before broadcast and before storage:
- Required: head, neck, shoulder, chest, waist, legs, feet, wrist, hands, both rings, both trinkets, back, mainhand, ranged/relic
- Conditional: offhand (slot 17) only when slot 16 isn't a 2H weapon
- Disregarded: shirt (slot 4), tabard (slot 19) — cosmetic only
Both sides enforce: sender retries on the short cooldown if their own scan is incomplete, receiver refuses to persist any incoming broadcast that fails the gate (defends against older addon versions or buggy peers).
5. Frame leak elimination
Two memory leaks fixed via a full codebase audit:
- Per-inspect timer frames:
OnInspectReadywas allocating a freshCreateFrame("Frame")per settle and per verify pass. WoW frames are never garbage-collected — they live forever in the C-side frame registry. A 25-man raid scanned every 4h was leaking ~150 frames/day per client. Hoisted to two module-level recyclable frames. - Talent panel destroy+rebuild:
EpogArmory_OpenTalentsForwas destroying and rebuilding the talent frame on every open, leaking ~180 child objects per click and growingUISpecialFramesunbounded. Switched to build-once-cache;SetPlayer/RenderTabalready handles prior-state cleanup.
6. In-game talent tree
The Talents button on the inspect frame opens a Blizzard-style 9-tier × 4-column grid showing the inspected player's full talent point distribution per tab, with class-tab name labels and dominant-tree default selection. Hover any cell for the talent's name + rank tooltip.
Visual fixes from the v1.3.x iteration cycle: 9-tier rows (was capped at 7, missing TBC content), CreateFrame("Frame") cells with explicit EnableMouse(true) (Button hit-testing was eating OnEnter on 3.3.5), CreateTexture-based per-cell backgrounds (replaced SetBackdrop which silently aborted the render loop), corrected slot draw-layer ordering.
7. Codebase audit
Two parallel audit passes covering all 5,660 lines (EpogArmory.lua + EpogArmoryUI.lua). Confirmed clean: no xpcall extra-arg misuse, no C_Timer, no bit32, no goto, no \z, no modern C_AddOns/Settings.*/MenuUtil/CreateFromMixins anywhere. Tooltip ownership properly defended against pfQuest/Leatrix theft. All bounded queues (outQueue, inQueue, seen, assembly, peerInfo) have explicit cleanup paths.
Backward compatibility
- Wire format unchanged since v1.3.0. Talent ranks at position 41 still optional. All earlier versions parse cleanly via
t[N] or default. - No DB wipe on update — accumulated mesh data survives all future addon upgrades.
MigratePlayerscontinues to handle pre-v0.13 flat entries and v0.13+ unkeyed sets.ShouldStorequality gate runs only on incoming broadcasts. Pre-existing DB entries (including any legacy partial loadouts) survive intact.- Mixed-version mesh works — older clients receive v1.4 broadcasts cleanly, v1.4 clients receive older broadcasts cleanly.
Install
Extract EpogArmory.zip to <WoW>/Interface/AddOns/, overwriting any previous version.
After upgrading: /reload then /epogarmory cachebuild once (only needed if jumping from a pre-v1.2 version).