Repository navigation
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).