- Items/MysticScrolls: use the dedicated hidden scanner tooltip for the
server-query poke instead of the global GameTooltip
- Items: count cache hits and this-pass resolutions separately so the
pass 2+ chat output no longer claims old hits as new
- Core: remove dead tiny_json_encode fallback (Util/Json.lua loads first
in the TOC and always defines CoaExporter_Json_Encode)
- Catalogs/Common: ctx.startedAt now ISO 8601 UTC like every other
exporter timestamp
TryResolve cached an entry even when ScanItemTooltip returned 0 lines
(empty string is truthy in Lua), so empty-tooltip scrolls were treated
as cache hits forever and never retried - and per-pass stats disagreed
with the cache. Only cache once at least one tooltip line was captured,
and treat cached-but-empty entries (stale SavedVariables) as misses.
Entries with no backing spell (spellId == 0) fell through to
SetHyperlink("spell:" .. entry.ID), aliasing CoA advancement IDs into
real 3.3.5 spell-ID space - ~3800 rows captured an unrelated spell's
tooltip and adopted its first line as the entry NAME. Spell-less
entries now get an empty tooltip and keep the "ID:<id>" name.
New Collectors/Items.lua mirrors the MysticScrolls async scanner: calls
GetItemInfo()/SetHyperlink() over an id list/range so the client fetches
the templates from the server. This both populates itemcache.wdb (for the
server-side re-import) and captures name/quality/ilvl/slot/icon/spell/
tooltip into the CoaExporterItemCache SavedVariable for direct export.
Commands:
/coae items scan scan the CoA custom block (2000000-2000099 + 2089618)
/coae items scan missing scan the known-missing id list
/coae items scan <from> <to> scan an explicit inclusive range
/coae items scan <id> single id
/coae items export|reset|status
Motivation: CoA per-class character-creation gear (ids 2000000+) is only
cached once a character has viewed it, so unseen items are absent from
both the client cache and db.exil.es. This scans them in without needing
to roll one character per class.
Diagnostic so we can tell whether the patched scan actually ran
(if _meta.playerClass is non-Unknown, /reload picked up the new file)
without having to inspect the chat log.
Ascension's `C_CharacterAdvancement.GetEntryByInternalID` returns the
active character's *own* class entries with `Class` empty (the API
treats the player's class as implicit), while still returning `Class`
populated for every other class.
The entry-walk gate `if entry and entry.Class then ...` was therefore
silently dropping every talent of whatever class you ran the export
on. A Venomancer alt would correctly capture the 41 *other* classes'
talents/skills but produce zero rows for Prophet itself, leaving the
db.exil.es Venomancer page perpetually missing icons for Rotting Away,
Lure, Envenomed Weapons, and friends.
Cache UnitClass("player") at the start of C.Run and substitute it for
`entry.Class` whenever that field is missing or empty. The bucketing
key in `info.cls` now matches the localized class string (consistent
with how the other 41 classes show up in CoaExporterCatalog.talents).
- New AE:GenerateMarkdownSpellbook(): one section per spell tab
(General, class, pet) with icon + name + db.ascension.gg link + rank.
Skips empty tabs.
- /coae export mdspellbook new slash subcommand
- /coae export md now appends a Spellbook section after
Talents in the full wiki page
- UI sidebar: "MD Spellbook" button added under Markdown (Wiki)
New Collectors/Spellbook.lua walks GetNumSpellTabs() and emits one entry
per tab with name, texture, offset, numSpells, and a spells[] array of
{ slot, name, rank, spellID, icon }.
3.3.5/Ascension API differences are handled defensively: name comes
from GetSpellBookItemInfo or vanilla GetSpellName; spellID is parsed
out of GetSpellLink (3.3.5 doesn't return it from GetSpellBookItemInfo);
icon falls back to GetSpellTexture if GetSpellInfo doesn't have it yet.
Wiring:
- CoaExporter.toc: load Collectors/Spellbook.lua after Talents
- Core.lua: AssembleExport() includes spellbook for all + spellbook
- Core.lua: HandleExport() accepts /coae export spellbook
- Core.lua: debug output shows tab + spell counts
- UI/ExportFrame.lua: "Spellbook" button in the Character section
Replaces the cramped two-row button strip with a proper sidebar layout:
Character Markdown Catalog Scrolls Tools
- All - MD Gear - Skills - Scan - Reload UI
- Talents - MD Enchants - Talents - Status - Debug
- Gear - MD Full - All - Help
- Enchants
Section headers in gold; full-width buttons stacked vertically.
The new "Reload UI" button calls ReloadUI() so guildies can flush a
catalog dump to disk without leaving the export window. Debug and Help
buttons route through SlashCmdList["COAE"] so the UI and slash share
one code path.
Frame is 720x500 (was 700x520); the right-side copy-out edit box keeps
its existing CoaExporter_ShowExportFrame() entry point so Core.lua is
unchanged.
Folds three previously-separate Lua addons into one for guild-member use:
- ascension-char-exporter (per-character JSON/Wiki.js Markdown via /ascx)
- CoA_SkillExporter (skills/dispels/passives catalog via /skilldump)
- CoA_TalentExporter (talent-tree catalog via /talentdumpall)
The two CoA catalog dumpers were ~90% identical entry-walkers. Pulled the
shared C_CharacterAdvancement.GetAllEntries() loop into Catalogs/Common.lua
and have Skills.lua / Talents.lua register collectors that share a single
scan pass (so /coae catalog all walks the entry list once, not twice).
Per-character collectors (Talents, Gear, Enchants, MysticScrolls,
MysticScrollProbe) and the AtlasLootAscension-derived ScrollCatalog data
are kept verbatim, just rebranded.
Slash interface:
/coae export {all|talents|gear|enchants|mdgear|mdenchants|md}
/coae catalog {all|skills|talents|dispels [class]|passives [class]|status}
/coae scrolls {scan|export|reset|status}
/coae sv on|off | debug | help
Aliases: /coaexp, /ascx, /asxc, plus legacy /skilldump /talentdumpall
/dispels /passives that map to the catalog subcommands.
SavedVariables: CoaExporterSaved, CoaExporterConfig, CoaExporterScrollCache,
CoaExporterCatalog (skills/dispels/levelPassives/talents/_meta).