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