-- AscensionExporter - Talents collector (active spec only) -- Ensure global addon table exists even if load order varies AscensionExporter = _G.AscensionExporter or {} _G.AscensionExporter = AscensionExporter local AE = AscensionExporter local function get_active_group() if GetActiveTalentGroup then local g = GetActiveTalentGroup() if g == 0 then g = 1 end return g or 1 end return 1 end local function collect_selected_for_tab(tabIndex, talentGroup) local arr = {} local debug = {} local numTalents = GetNumTalents(tabIndex) for talentIndex = 1, numTalents do -- Ascension API signature test - try different parameter combinations local name, iconTexture, tier, column, rank, maxRank, isExceptional, available -- Standard WoW API: GetTalentInfo(tabIndex, talentIndex, inspect, pet, talentGroup) -- Try 1: Just tab and talent index name, iconTexture, tier, column, rank, maxRank = GetTalentInfo(tabIndex, talentIndex) -- Try 2: With nil for inspect/pet if rank == 0 or rank == nil then name, iconTexture, tier, column, rank, maxRank = GetTalentInfo(tabIndex, talentIndex, nil, nil, talentGroup) end -- Try 3: With explicit false for inspect/pet if rank == 0 or rank == nil then name, iconTexture, tier, column, rank, maxRank = GetTalentInfo(tabIndex, talentIndex, false, nil, talentGroup) end -- Try 4: No talentGroup at all if rank == 0 or rank == nil then name, iconTexture, tier, column, rank, maxRank = GetTalentInfo(tabIndex, talentIndex, false, false) end -- Debug first few of each tab to see what we're getting if tabIndex == 3 and talentIndex <= 5 then table.insert(debug, string.format("tab%d [%d]: %s rank=%s/%s tier=%s col=%s", tabIndex, talentIndex, tostring(name), tostring(rank), tostring(maxRank), tostring(tier), tostring(column))) end -- Debug: scan ALL talents looking for any with rank > 0 if rank and rank > 0 then table.insert(debug, string.format("FOUND: tab%d talent%d: name=%s rank=%d/%d", tabIndex, talentIndex, tostring(name), rank, maxRank)) end if rank and rank > 0 then local link = GetTalentLink(tabIndex, talentIndex) local spellId = 0 if link then spellId = tonumber(string.match(link, "talent:(%d+)")) or 0 end table.insert(arr, { tabIndex = tabIndex, talentIndex = talentIndex, name = name or "", rank = rank or 0, maxRank = maxRank or 0, spellId = spellId, }) end end return arr, debug end function AE.CollectTalents() local out = { selected = {}, debug = {}, buildString = nil, talents = {}, } -- Use Ascension's native talent export API if C_CharacterAdvancement and C_CharacterAdvancement.ExportBuild then local buildString = C_CharacterAdvancement.ExportBuild(true) out.buildString = buildString table.insert(out.debug, "Ascension API: C_CharacterAdvancement.ExportBuild() = " .. tostring(buildString)) -- Get individual talent entries if C_CharacterAdvancement.GetKnownTalentEntries then local entries = C_CharacterAdvancement.GetKnownTalentEntries() table.insert(out.debug, string.format("Found %d known talent entries", #entries)) for _, entry in ipairs(entries) do table.insert(out.talents, { id = entry.ID or 0, name = entry.name or "", icon = entry.icon or "", }) end end -- For now, we'll store the build string and parse it later -- The build string format is Ascension's native format if buildString and buildString ~= "" then out.hasTalents = true end return out end -- Fallback to standard WoW API (for non-Ascension servers) local active = get_active_group() out.activeTalentGroup = active local numTabs = GetNumTalentTabs() table.insert(out.debug, "Fallback: using GetNumTalentTabs, numTabs=" .. tostring(numTabs)) for tabIndex = 1, numTabs do local tabName, _, pointsSpent = GetTalentTabInfo(tabIndex, false, false, active) table.insert(out.debug, string.format("tab%d: name=%s points=%d", tabIndex, tostring(tabName), tonumber(pointsSpent) or 0)) local numTalents = GetNumTalents(tabIndex) table.insert(out.debug, string.format("tab%d: numTalents=%d", tabIndex, numTalents)) -- Only export selected ranks for the active group local selected, talentDebug = collect_selected_for_tab(tabIndex, active) -- Add talent-level debug info if talentDebug then for _, msg in ipairs(talentDebug) do table.insert(out.debug, msg) end end table.insert(out.debug, string.format("tab%d: collected=%d talents", tabIndex, #selected)) for _, v in ipairs(selected) do table.insert(out.selected, v) end end return out end -- Mark module as loaded for debug visibility AE._loadedTalents = true