Skip to content
This repository was archived by the owner on Aug 3, 2026. It is now read-only.

EpogArmory v1.6.0 — Auto-sync + quality controls

Choose a tag to compare

@Defcons Defcons released this 15 May 11:09
· 7 commits to main since this release

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.
  • MigratePlayers continues 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.