From 0a56cbe560250ae3a61a8bafd32ae71f8394b8f1 Mon Sep 17 00:00:00 2001 From: Florian Berthold Date: Fri, 29 May 2026 19:53:03 +0200 Subject: [PATCH 01/14] coa.17: comprehensive partial-data hardening + DataStore_Characters login scan + Skills strip cap - Hardening sweep across DataStore_* (softened crash-asserts in Talents/Containers/Quests to graceful nil) + Altoholic frames (guarded remaining getter results). - DataStore_Characters: scan on login (was ghost-gated -> name/level/class never populated; the core 'no character data' cause). - Skills tab: cap inline professions at 6 (+N) so the strip stops overflowing into Cooking. --- Altoholic/Altoholic.toc | 2 +- Altoholic/Frames/BagUsage.lua | 18 +++++++------- Altoholic/Frames/Containers.lua | 6 ++--- Altoholic/Frames/GuildMembers.lua | 6 ++--- Altoholic/Frames/GuildProfessions.lua | 16 +++++++------ Altoholic/Frames/Skills.lua | 3 ++- Altoholic/Tooltip.lua | 2 +- DataStore_Characters/DataStore_Characters.lua | 13 ++++++---- DataStore_Containers/DataStore_Containers.lua | 17 +++++++------ DataStore_Crafts/DataStore_Crafts.lua | 5 +++- DataStore_Quests/DataStore_Quests.lua | 6 +++-- DataStore_Talents/DataStore_Talents.lua | 24 ++++++++++--------- 12 files changed, 68 insertions(+), 50 deletions(-) diff --git a/Altoholic/Altoholic.toc b/Altoholic/Altoholic.toc index 850bbe9..a225962 100644 --- a/Altoholic/Altoholic.toc +++ b/Altoholic/Altoholic.toc @@ -13,7 +13,7 @@ ## Author: Thaoky, Telkar-RG ## X-Edited-By: Exiles (Sub-Net) — florian.berthold@sub-net.at -## Version: 3.3.002b-coa.16 +## Version: 3.3.002b-coa.17 ## X-Category: Inventory, Tradeskill, Mail ## X-Localizations: enUS, frFR, zhCN, zhTW, deDE, koKR, esES, esMX, ruRU ## X-Website: http://wow.curse.com/downloads/wow-addons/details/altoholic.aspx diff --git a/Altoholic/Frames/BagUsage.lua b/Altoholic/Frames/BagUsage.lua index 988a59e..8c29a9b 100644 --- a/Altoholic/Frames/BagUsage.lua +++ b/Altoholic/Frames/BagUsage.lua @@ -118,15 +118,15 @@ function ns:Update() _G[entry..i.."BankSlotsNormalText"]:SetText(L["Bank not visited yet"]) else _G[entry..i.."BankSlotsNormalText"]:SetText(format("%s/%s|r/%s|r/%s|r/%s|r/%s|r/%s|r/%s |r(%s|r)", - DS:GetContainerSize(character, 100), - WHITE .. DS:GetContainerSize(character, 5), - WHITE .. DS:GetContainerSize(character, 6), - WHITE .. DS:GetContainerSize(character, 7), - WHITE .. DS:GetContainerSize(character, 8), - WHITE .. DS:GetContainerSize(character, 9), - WHITE .. DS:GetContainerSize(character, 10), - WHITE .. DS:GetContainerSize(character, 11), - CYAN .. DS:GetNumBankSlots(character))) + DS:GetContainerSize(character, 100) or 0, -- CoA: empty/unscanned bank bags return nil size + WHITE .. (DS:GetContainerSize(character, 5) or 0), + WHITE .. (DS:GetContainerSize(character, 6) or 0), + WHITE .. (DS:GetContainerSize(character, 7) or 0), + WHITE .. (DS:GetContainerSize(character, 8) or 0), + WHITE .. (DS:GetContainerSize(character, 9) or 0), + WHITE .. (DS:GetContainerSize(character, 10) or 0), + WHITE .. (DS:GetContainerSize(character, 11) or 0), + CYAN .. (DS:GetNumBankSlots(character) or 0))) end elseif (lineType == INFO_TOTAL_LINE) then _G[entry..i.."Collapse"]:Hide() diff --git a/Altoholic/Frames/Containers.lua b/Altoholic/Frames/Containers.lua index f57b3ae..afc46be 100644 --- a/Altoholic/Frames/Containers.lua +++ b/Altoholic/Frames/Containers.lua @@ -177,8 +177,8 @@ local function UpdateSpread() local slotID = bagIndices[line].from - 3 + j local itemID, itemLink, itemCount = DS:GetSlotInfo(container, slotID) - - if (slotID <= containerSize) then + + if (slotID <= (containerSize or 0)) then -- CoA: containerSize nil for unscanned bag on partial-data alt if itemID then Altoholic:SetItemButtonTexture(itemName, GetItemIcon(itemID)); @@ -278,7 +278,7 @@ local function UpdateAllInOne() local container = DS:GetContainer(character, containerID) local _, _, containerSize = DS:GetContainerInfo(character, containerID) - for slotID = 1, containerSize do + for slotID = 1, (containerSize or 0) do -- CoA: containerSize nil for unscanned bag on partial-data alt local itemID, itemLink, itemCount = DS:GetSlotInfo(container, slotID) if itemID then currentSlotIndex = currentSlotIndex + 1 diff --git a/Altoholic/Frames/GuildMembers.lua b/Altoholic/Frames/GuildMembers.lua index c98f917..5a49210 100644 --- a/Altoholic/Frames/GuildMembers.lua +++ b/Altoholic/Frames/GuildMembers.lua @@ -81,9 +81,9 @@ local SecondaryLevelSort = {-- sort functions for the alts end end, ["level"] = function(a, b) - local levelA = select(4, DataStore:GetGuildMemberInfo(a)) - local levelB = select(4, DataStore:GetGuildMemberInfo(b)) - + local levelA = select(4, DataStore:GetGuildMemberInfo(a)) or 0 -- CoA: nil level on partial guild data crashed table.sort + local levelB = select(4, DataStore:GetGuildMemberInfo(b)) or 0 + if viewSortOrder then return levelA < levelB else diff --git a/Altoholic/Frames/GuildProfessions.lua b/Altoholic/Frames/GuildProfessions.lua index 5d40473..b98653f 100644 --- a/Altoholic/Frames/GuildProfessions.lua +++ b/Altoholic/Frames/GuildProfessions.lua @@ -25,9 +25,9 @@ local PrimaryLevelSort = { -- sort functions for the mains end end, ["level"] = function(a, b) - local levelA = select(4, DataStore:GetGuildMemberInfo(a.name)) - local levelB = select(4, DataStore:GetGuildMemberInfo(b.name)) - + local levelA = select(4, DataStore:GetGuildMemberInfo(a.name)) or 0 -- CoA: nil level on partial guild data crashed table.sort + local levelB = select(4, DataStore:GetGuildMemberInfo(b.name)) or 0 + if viewSortOrder then return levelA < levelB else @@ -76,9 +76,9 @@ local SecondaryLevelSort = {-- sort functions for the alts end end, ["level"] = function(a, b) - local levelA = select(4, DataStore:GetGuildMemberInfo(a)) - local levelB = select(4, DataStore:GetGuildMemberInfo(b)) - + local levelA = select(4, DataStore:GetGuildMemberInfo(a)) or 0 -- CoA: nil level on partial guild data crashed table.sort + local levelB = select(4, DataStore:GetGuildMemberInfo(b)) or 0 + if viewSortOrder then return levelA < levelB else @@ -199,6 +199,7 @@ local function DisplayProfessionLink(frameName, member, index) local icon = addon:TextureToFontstring(addon:GetSpellIcon(tonumber(spellID)), 18, 18) .. " " if link then local curRank, maxRank = DataStore:GetProfessionInfo(link) + curRank, maxRank = curRank or 0, maxRank or 0 -- CoA: GetProfessionInfo returns nil if the link doesn't match the trade pattern local ts = addon.TradeSkills text:SetText(icon .. ts:GetColor(curRank) .. curRank .. "/" .. maxRank) else @@ -350,7 +351,8 @@ function ns:OnEnter(self) if not spellID or not link then return end local curRank, maxRank = DataStore:GetProfessionInfo(link) - + curRank, maxRank = curRank or 0, maxRank or 0 -- CoA: nil ranks when link doesn't match trade pattern; guard concat below + AltoTooltip:ClearLines(); AltoTooltip:SetOwner(self, "ANCHOR_RIGHT"); diff --git a/Altoholic/Frames/Skills.lua b/Altoholic/Frames/Skills.lua index 9b20507..b8c8a24 100644 --- a/Altoholic/Frames/Skills.lua +++ b/Altoholic/Frames/Skills.lua @@ -118,7 +118,8 @@ function ns:Update() local professions = Characters:GetField(line, "professions") local profText = "" if professions then - for _, p in ipairs(professions) do + for idx, p in ipairs(professions) do + if idx > 6 then profText = profText .. YELLOW .. "+" .. (#professions - 6) .. "|r"; break end -- CoA: cap inline profs so the strip fits its 325px cell local rank = p.rank or 0 local profIcon = "" if p.spellID then diff --git a/Altoholic/Tooltip.lua b/Altoholic/Tooltip.lua index 6726406..1b4809e 100644 --- a/Altoholic/Tooltip.lua +++ b/Altoholic/Tooltip.lua @@ -380,7 +380,7 @@ local function GetItemCount(searchedID) for tabID = 1, 6 do local tabCount = DataStore:GetGuildBankTabItemCount(guildKey, tabID, searchedID) if tabCount > 0 then - table.insert(tabCounters, format("%s: %s", WHITE .. DataStore:GetGuildBankTabName(guildKey, tabID), TEAL..tabCount)) + table.insert(tabCounters, format("%s: %s", WHITE .. (DataStore:GetGuildBankTabName(guildKey, tabID) or ""), TEAL..tabCount)) -- CoA: tab name nil on partial guild-bank data end end diff --git a/DataStore_Characters/DataStore_Characters.lua b/DataStore_Characters/DataStore_Characters.lua index af8ef98..97d4d21 100644 --- a/DataStore_Characters/DataStore_Characters.lua +++ b/DataStore_Characters/DataStore_Characters.lua @@ -86,10 +86,15 @@ local function OnPlayerMoney() addon.ThisCharacter.money = GetMoney(); end +local hasScannedThisSession local function OnPlayerAlive() - -- print("DataStore_Characters.lua") -- DEBUG 2025 07 21 - if not UnitIsGhost("player") then return end -- only scan if player released spirit and went to graveyard - + -- CoA: scan once at login. PLAYER_ALIVE also fires on resurrect / Feign-Death cancel + -- (unchanged data), so skip those. The previous "only when ghost" gate skipped LOGIN + -- too, so name/level/class/money/XP never populated on a normal login - the root of + -- "no character data". (Same trap as DataStore_Inventory / _Skills; see commit fdcb25a.) + if hasScannedThisSession then return end + hasScannedThisSession = true + local character = addon.ThisCharacter character.name = UnitName("player") -- to simplify processing a bit, the name is saved in the table too, in addition to being part of the key @@ -263,7 +268,7 @@ local function _GetGuildInfo(character) end local function _GetPlayTime(character) - return character.played + return character.played or 0 -- CoA: nil on partial-data alt; callers do arithmetic (AccountSummary) end local function _GetLocation(character) diff --git a/DataStore_Containers/DataStore_Containers.lua b/DataStore_Containers/DataStore_Containers.lua index 37cd2ad..3888724 100644 --- a/DataStore_Containers/DataStore_Containers.lua +++ b/DataStore_Containers/DataStore_Containers.lua @@ -678,25 +678,28 @@ local BagTypeStrings = { local function _GetContainerInfo(character, containerID) local bag = _GetContainer(character, containerID) + if type(bag) ~= "table" then return end -- CoA: unscanned bag on partial-data alt; was an index-nil crash return bag.icon, bag.link, bag.size, bag.freeslots, BagTypeStrings[bag.bagtype] end local function _GetContainerSize(character, containerID) -- containerID can be number or string - return character.Containers["Bag" .. containerID].size + local bag = character.Containers["Bag" .. containerID] -- CoA: nil for unscanned bag on partial-data alt + return bag and bag.size end local function _GetSlotInfo(bag, slotID) - assert(type(bag) == "table") -- this is the pointer to a bag table, obtained through addon:GetContainer() - assert(type(slotID) == "number") + -- CoA: partial-data alts can have an unscanned/nil bag pointer (GetContainer returns nil + -- for a "BagN" the Containers module never scanned); return empties instead of asserting. + if type(bag) ~= "table" or type(slotID) ~= "number" then return end -- return itemID, itemLink, itemCount - return bag.ids[slotID], bag.links[slotID], bag.counts[slotID] or 1 + return bag.ids and bag.ids[slotID], bag.links and bag.links[slotID], (bag.counts and bag.counts[slotID]) or 1 end local function _GetContainerCooldownInfo(bag, slotID) - assert(type(bag) == "table") -- this is the pointer to a bag table, obtained through addon:GetContainer() - assert(type(slotID) == "number") + -- CoA: partial-data alts can have an unscanned/nil bag pointer; degrade to nil gracefully. + if type(bag) ~= "table" or type(slotID) ~= "number" or type(bag.cooldowns) ~= "table" then return end local cd = bag.cooldowns[slotID] if cd then @@ -868,7 +871,7 @@ end local function _GetGuildBankTabItemCount(guild, tabID, searchedID) local count = 0 local container = guild.Tabs[tabID] - + if type(container) ~= "table" or type(container.ids) ~= "table" then return count end -- CoA: unscanned guild bank tab; was a pairs(nil) crash on item tooltips for slotID, id in pairs(container.ids) do if (id == searchedID) then count = count + (container.counts[slotID] or 1) diff --git a/DataStore_Crafts/DataStore_Crafts.lua b/DataStore_Crafts/DataStore_Crafts.lua index ad65af2..6c9d88e 100644 --- a/DataStore_Crafts/DataStore_Crafts.lua +++ b/DataStore_Crafts/DataStore_Crafts.lua @@ -625,6 +625,9 @@ local function _GetProfessionInfo(profession) end local function _GetNumCraftLines(profession) + -- CoA: profession is nil for an unscanned/custom profession on a partial-data alt; + -- callers use this as a numeric `for` limit, so return 0 instead of crashing on #nil.Crafts + if type(profession) ~= "table" or type(profession.Crafts) ~= "table" then return 0 end return #profession.Crafts end @@ -709,7 +712,7 @@ local function _GetNumRecipesByColor(profession) for i = 1, _GetNumCraftLines(profession) do local isHeader, color = _GetCraftLineInfo(profession, i) - if not isHeader then + if not isHeader and color and counts[color] then -- CoA: custom-profession craft lines can carry an out-of-range/nil color counts[color] = counts[color] + 1 end end diff --git a/DataStore_Quests/DataStore_Quests.lua b/DataStore_Quests/DataStore_Quests.lua index 73b0cfd..ca68a76 100644 --- a/DataStore_Quests/DataStore_Quests.lua +++ b/DataStore_Quests/DataStore_Quests.lua @@ -274,8 +274,10 @@ local function _GetQuestLogRewardInfo(character, index, rewardIndex) end local function _GetQuestInfo(link) - assert(type(link) == "string") - + -- CoA: GetQuestLogInfo can hand back a nil link for a partial-data alt; degrade to nil + -- returns instead of asserting (callers already nil-check the returned name/level). + if type(link) ~= "string" then return end + local questID, questLevel = link:match("quest:(%d+):(-?%d+)") local questName = link:match("%[(.+)%]") diff --git a/DataStore_Talents/DataStore_Talents.lua b/DataStore_Talents/DataStore_Talents.lua index 430231b..f979fb2 100644 --- a/DataStore_Talents/DataStore_Talents.lua +++ b/DataStore_Talents/DataStore_Talents.lua @@ -234,7 +234,9 @@ local function _GetReferenceTable() end local function _GetClassReference(class) - assert(type(class) == "string") + -- CoA: custom classes (MONK, BARBARIAN, …) have no vanilla reference table; return nil + -- instead of asserting/crashing so callers can degrade gracefully. + if type(class) ~= "string" then return end return addon.ref.global[class] end @@ -251,27 +253,28 @@ local function _IsClassKnown(class) class = class or "" -- if by any chance nil is passed, trap it to make sure the function does not fail, but returns nil anyway local ref = _GetClassReference(class) - if ref.Order then -- if the Order field is not nil, we have data for this class + if ref and ref.Order then -- CoA: ref is nil for custom classes; was an unguarded index crash return true end end local function _ImportClassReference(class, data) - assert(type(class) == "string") - assert(type(data) == "table") - + -- CoA: data arrives over Comm/AccountSharing; a peer with no reference for a custom + -- class can send nil, which used to crash the import. Skip silently instead. + if type(class) ~= "string" or type(data) ~= "table" then return end + addon.ref.global[class] = data end local function _GetClassTrees(class) - assert(type(class) == "string") - + -- CoA: ref is nil for custom classes; guard so the `for tree in DS:GetClassTrees()` + -- loops in Talents.lua get an empty iterator instead of an index-nil crash. local ref = _GetClassReference(class) - local order = ref.Order + local order = ref and ref.Order if order then return order:gmatch("([^,]+)") end - -- to do, add a return value that does not require validity testing by the caller + return function() return nil end -- empty iterator so callers can loop safely end local function _GetTreeInfo(class, tree) @@ -284,8 +287,7 @@ end local function _GetTreeNameByID(class, id) -- returns the name of tree "id" for a given class - assert(type(class) == "string") - + -- CoA: _GetClassTrees now yields an empty iterator for custom classes, so no assert needed local index = 1 for name in _GetClassTrees(class) do if index == id then From 219e74904691f276a488e7b37fda6b2ffc630627 Mon Sep 17 00:00:00 2001 From: Florian Berthold Date: Fri, 29 May 2026 20:05:03 +0200 Subject: [PATCH 02/14] coa.18: guard DataStore_Achievements nil criteria quantity GetAchievementCriteriaInfo returns nil reqQuantity/quantity for some CoA achievements; 'reqQuantity > 1' crashed. Guarded both. --- Altoholic/Altoholic.toc | 2 +- DataStore_Achievements/DataStore_Achievements.lua | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Altoholic/Altoholic.toc b/Altoholic/Altoholic.toc index a225962..e9bfd29 100644 --- a/Altoholic/Altoholic.toc +++ b/Altoholic/Altoholic.toc @@ -13,7 +13,7 @@ ## Author: Thaoky, Telkar-RG ## X-Edited-By: Exiles (Sub-Net) — florian.berthold@sub-net.at -## Version: 3.3.002b-coa.17 +## Version: 3.3.002b-coa.18 ## X-Category: Inventory, Tradeskill, Mail ## X-Localizations: enUS, frFR, zhCN, zhTW, deDE, koKR, esES, esMX, ruRU ## X-Website: http://wow.curse.com/downloads/wow-addons/details/altoholic.aspx diff --git a/DataStore_Achievements/DataStore_Achievements.lua b/DataStore_Achievements/DataStore_Achievements.lua index e8525f2..9ab3ece 100644 --- a/DataStore_Achievements/DataStore_Achievements.lua +++ b/DataStore_Achievements/DataStore_Achievements.lua @@ -55,8 +55,8 @@ local function ScanSingleAchievement(id, isCompleted, month, day, year) if critCompleted then table.insert(CriteriaCache, tostring(j)) else - if reqQuantity > 1 then - table.insert(CriteriaCache, j .. ":" .. quantity) + if (reqQuantity or 0) > 1 then -- CoA: GetAchievementCriteriaInfo can return nil quantities for custom/partial achievements + table.insert(CriteriaCache, j .. ":" .. (quantity or 0)) end end end From d440c62a737c02cf9f845029997d25f3e5827bbb Mon Sep 17 00:00:00 2001 From: Florian Berthold Date: Fri, 29 May 2026 20:23:40 +0200 Subject: [PATCH 03/14] coa.19: revert the window enlargement (restore original 832x447 frame) The coa.12 enlargement couldn't extend WoW's fixed AuctionFrame art cleanly -> fragmented background + broken scrollbar. Reverted to the original clean frame (14 rows, intact art, working scrollbar). All crash fixes, Skills professions cap, login-scan, class icons, and the char-view profession wrap are preserved (they live in different lines/files). --- Altoholic/Altoholic.toc | 4 +-- Altoholic/Altoholic.xml | 49 ++------------------------- Altoholic/Frames/AccountSummary.lua | 2 +- Altoholic/Frames/AccountSummary.xml | 32 +---------------- Altoholic/Frames/Activity.lua | 2 +- Altoholic/Frames/Activity.xml | 32 +---------------- Altoholic/Frames/AuctionHouse.lua | 4 +-- Altoholic/Frames/AuctionHouse.xml | 17 +--------- Altoholic/Frames/BagUsage.lua | 2 +- Altoholic/Frames/BagUsage.xml | 32 +---------------- Altoholic/Frames/Calendar.lua | 2 +- Altoholic/Frames/Calendar.xml | 34 ++----------------- Altoholic/Frames/Containers.lua | 4 +-- Altoholic/Frames/Containers.xml | 17 +--------- Altoholic/Frames/Currencies.lua | 2 +- Altoholic/Frames/Currencies.xml | 12 +------ Altoholic/Frames/Equipment.lua | 2 +- Altoholic/Frames/Equipment.xml | 17 +--------- Altoholic/Frames/GuildBankTabs.lua | 2 +- Altoholic/Frames/GuildBankTabs.xml | 32 +---------------- Altoholic/Frames/GuildMembers.lua | 2 +- Altoholic/Frames/GuildMembers.xml | 32 +---------------- Altoholic/Frames/GuildProfessions.lua | 2 +- Altoholic/Frames/GuildProfessions.xml | 32 +---------------- Altoholic/Frames/Keys.lua | 2 +- Altoholic/Frames/Keys.xml | 12 +------ Altoholic/Frames/Mails.lua | 2 +- Altoholic/Frames/Mails.xml | 17 +--------- Altoholic/Frames/Pets.lua | 2 +- Altoholic/Frames/Pets.xml | 14 ++------ Altoholic/Frames/Quests.lua | 2 +- Altoholic/Frames/Quests.xml | 32 +---------------- Altoholic/Frames/Recipes.lua | 2 +- Altoholic/Frames/Recipes.xml | 32 +---------------- Altoholic/Frames/Reputations.lua | 2 +- Altoholic/Frames/Reputations.xml | 12 +------ Altoholic/Frames/Search.lua | 4 +-- Altoholic/Frames/Search.xml | 17 +--------- Altoholic/Frames/Skills.lua | 2 +- Altoholic/Frames/Skills.xml | 32 +---------------- Altoholic/Frames/TabCharacters.xml | 2 +- Altoholic/Frames/TabGuildBank.xml | 2 +- Altoholic/Frames/TabSearch.xml | 2 +- Altoholic/Frames/TabSummary.xml | 2 +- README.md | 2 -- 45 files changed, 52 insertions(+), 512 deletions(-) diff --git a/Altoholic/Altoholic.toc b/Altoholic/Altoholic.toc index e9bfd29..f4c2e9f 100644 --- a/Altoholic/Altoholic.toc +++ b/Altoholic/Altoholic.toc @@ -13,7 +13,7 @@ ## Author: Thaoky, Telkar-RG ## X-Edited-By: Exiles (Sub-Net) — florian.berthold@sub-net.at -## Version: 3.3.002b-coa.18 +## Version: 3.3.002b-coa.19 ## X-Category: Inventory, Tradeskill, Mail ## X-Localizations: enUS, frFR, zhCN, zhTW, deDE, koKR, esES, esMX, ruRU ## X-Website: http://wow.curse.com/downloads/wow-addons/details/altoholic.aspx @@ -70,4 +70,4 @@ Frames\Skills.xml Frames\Search.xml Frames\Talents.xml -Frames\Keys.xml \ No newline at end of file +Frames\Keys.xml diff --git a/Altoholic/Altoholic.xml b/Altoholic/Altoholic.xml index 696cf24..ac97f6f 100644 --- a/Altoholic/Altoholic.xml +++ b/Altoholic/Altoholic.xml @@ -92,7 +92,7 @@ - + @@ -172,49 +172,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -222,7 +179,7 @@ - + @@ -234,7 +191,7 @@ - + diff --git a/Altoholic/Frames/AccountSummary.lua b/Altoholic/Frames/AccountSummary.lua index 98a04a1..96dde04 100644 --- a/Altoholic/Frames/AccountSummary.lua +++ b/Altoholic/Frames/AccountSummary.lua @@ -168,7 +168,7 @@ end function ns:Update() - local VisibleLines = 20 + local VisibleLines = 14 local frame = "AltoholicFrameSummary" local entry = frame.."Entry" diff --git a/Altoholic/Frames/AccountSummary.xml b/Altoholic/Frames/AccountSummary.xml index a4a7bfc..e65f1c0 100644 --- a/Altoholic/Frames/AccountSummary.xml +++ b/Altoholic/Frames/AccountSummary.xml @@ -168,7 +168,7 @@ - + @@ -294,36 +294,6 @@ - - - - - - diff --git a/Altoholic/Frames/Activity.lua b/Altoholic/Frames/Activity.lua index 2324d52..9ff1899 100644 --- a/Altoholic/Frames/Activity.lua +++ b/Altoholic/Frames/Activity.lua @@ -23,7 +23,7 @@ local ns = addon.Activity -- ns = namespace local Characters = addon.Characters function ns:Update() - local VisibleLines = 20 + local VisibleLines = 14 local frame = "AltoholicFrameActivity" local entry = frame.."Entry" diff --git a/Altoholic/Frames/Activity.xml b/Altoholic/Frames/Activity.xml index a1e9f44..763049c 100644 --- a/Altoholic/Frames/Activity.xml +++ b/Altoholic/Frames/Activity.xml @@ -176,7 +176,7 @@ - + @@ -302,36 +302,6 @@ - - - - - - diff --git a/Altoholic/Frames/AuctionHouse.lua b/Altoholic/Frames/AuctionHouse.lua index 772931c..2991518 100644 --- a/Altoholic/Frames/AuctionHouse.lua +++ b/Altoholic/Frames/AuctionHouse.lua @@ -136,7 +136,7 @@ function ns:InvalidateView() end function ns:UpdateAuctions() - local VisibleLines = 10 + local VisibleLines = 7 local frame = "AltoholicFrameAuctions" local entry = frame.."Entry" @@ -217,7 +217,7 @@ function ns:UpdateAuctions() end function ns:UpdateBids() - local VisibleLines = 10 + local VisibleLines = 7 local frame = "AltoholicFrameAuctions" local entry = frame.."Entry" diff --git a/Altoholic/Frames/AuctionHouse.xml b/Altoholic/Frames/AuctionHouse.xml index 5d343bc..f2cf05b 100644 --- a/Altoholic/Frames/AuctionHouse.xml +++ b/Altoholic/Frames/AuctionHouse.xml @@ -106,7 +106,7 @@ - + @@ -222,21 +222,6 @@ - - - diff --git a/Altoholic/Frames/BagUsage.lua b/Altoholic/Frames/BagUsage.lua index 8c29a9b..eacdbc2 100644 --- a/Altoholic/Frames/BagUsage.lua +++ b/Altoholic/Frames/BagUsage.lua @@ -22,7 +22,7 @@ local ns = addon.BagUsage -- ns = namespace local Characters = addon.Characters function ns:Update() - local VisibleLines = 20 + local VisibleLines = 14 local frame = "AltoholicFrameBagUsage" local entry = frame.."Entry" diff --git a/Altoholic/Frames/BagUsage.xml b/Altoholic/Frames/BagUsage.xml index a9ac8cc..9714cb5 100644 --- a/Altoholic/Frames/BagUsage.xml +++ b/Altoholic/Frames/BagUsage.xml @@ -177,7 +177,7 @@ - + @@ -303,36 +303,6 @@ - - - - - - diff --git a/Altoholic/Frames/Calendar.lua b/Altoholic/Frames/Calendar.lua index 5561a84..65f796d 100644 --- a/Altoholic/Frames/Calendar.lua +++ b/Altoholic/Frames/Calendar.lua @@ -764,7 +764,7 @@ function Altoholic.Calendar.Events:BuildList() self:BuildView() end -local NUM_EVENTLINES = 20 +local NUM_EVENTLINES = 14 function Altoholic.Calendar.Events:Update() local self = Altoholic.Calendar.Events diff --git a/Altoholic/Frames/Calendar.xml b/Altoholic/Frames/Calendar.xml index fdc0fea..fa3ee8f 100644 --- a/Altoholic/Frames/Calendar.xml +++ b/Altoholic/Frames/Calendar.xml @@ -131,7 +131,7 @@ - + @@ -286,7 +286,7 @@ - + @@ -406,36 +406,6 @@ - - - - - - diff --git a/Altoholic/Frames/Containers.lua b/Altoholic/Frames/Containers.lua index afc46be..27f3670 100644 --- a/Altoholic/Frames/Containers.lua +++ b/Altoholic/Frames/Containers.lua @@ -96,7 +96,7 @@ end local function UpdateSpread() local mode = UIDropDownMenu_GetSelectedValue(AltoholicFrameContainers_SelectContainerView) local rarity = UIDropDownMenu_GetSelectedValue(AltoholicFrameContainers_SelectRarity) - local VisibleLines = 10 + local VisibleLines = 7 local frame = "AltoholicFrameContainers" local entry = frame.."Entry" @@ -242,7 +242,7 @@ end local function UpdateAllInOne() local mode = UIDropDownMenu_GetSelectedValue(AltoholicFrameContainers_SelectContainerView) local rarity = UIDropDownMenu_GetSelectedValue(AltoholicFrameContainers_SelectRarity) - local VisibleLines = 10 + local VisibleLines = 7 local frame = "AltoholicFrameContainers" local entry = frame.."Entry" diff --git a/Altoholic/Frames/Containers.xml b/Altoholic/Frames/Containers.xml index 4ff8fca..85c2d4b 100644 --- a/Altoholic/Frames/Containers.xml +++ b/Altoholic/Frames/Containers.xml @@ -137,7 +137,7 @@ - + @@ -282,21 +282,6 @@ - - - diff --git a/Altoholic/Frames/Currencies.lua b/Altoholic/Frames/Currencies.lua index 1d7637c..3d94c38 100644 --- a/Altoholic/Frames/Currencies.lua +++ b/Altoholic/Frames/Currencies.lua @@ -177,7 +177,7 @@ local function Currencies_UpdateEx(self, offset, entry, desc) end local CurrenciesScrollFrame_Desc = { - NumLines = 10, + NumLines = 8, LineHeight = 41, Frame = "AltoholicFrameCurrencies", GetSize = function() return #usedTokens end, diff --git a/Altoholic/Frames/Currencies.xml b/Altoholic/Frames/Currencies.xml index b33792a..823221a 100644 --- a/Altoholic/Frames/Currencies.xml +++ b/Altoholic/Frames/Currencies.xml @@ -175,7 +175,7 @@ - + @@ -302,16 +302,6 @@ - - diff --git a/Altoholic/Frames/Equipment.lua b/Altoholic/Frames/Equipment.lua index 6587eb7..2d684c5 100644 --- a/Altoholic/Frames/Equipment.lua +++ b/Altoholic/Frames/Equipment.lua @@ -415,7 +415,7 @@ function ns:GetInventoryTypeName(inv) end function ns:Update() - local VisibleLines = 10 + local VisibleLines = 7 local frame = "AltoholicFrameEquipment" local entry = frame.."Entry" diff --git a/Altoholic/Frames/Equipment.xml b/Altoholic/Frames/Equipment.xml index e8aa3fe..9c02118 100644 --- a/Altoholic/Frames/Equipment.xml +++ b/Altoholic/Frames/Equipment.xml @@ -117,7 +117,7 @@ - + @@ -213,21 +213,6 @@ - - - diff --git a/Altoholic/Frames/GuildBankTabs.lua b/Altoholic/Frames/GuildBankTabs.lua index e7e60f6..165693c 100644 --- a/Altoholic/Frames/GuildBankTabs.lua +++ b/Altoholic/Frames/GuildBankTabs.lua @@ -72,7 +72,7 @@ function ns:Update() BuildView() end - local VisibleLines = 20 + local VisibleLines = 14 local frame = "AltoholicFrameGuildBankTabs" local entry = frame.."Entry" diff --git a/Altoholic/Frames/GuildBankTabs.xml b/Altoholic/Frames/GuildBankTabs.xml index 16736cb..2dd2070 100644 --- a/Altoholic/Frames/GuildBankTabs.xml +++ b/Altoholic/Frames/GuildBankTabs.xml @@ -107,7 +107,7 @@ - + @@ -233,36 +233,6 @@ - - - - - - diff --git a/Altoholic/Frames/GuildMembers.lua b/Altoholic/Frames/GuildMembers.lua index 5a49210..f16624e 100644 --- a/Altoholic/Frames/GuildMembers.lua +++ b/Altoholic/Frames/GuildMembers.lua @@ -285,7 +285,7 @@ function ns:Update() BuildView() end - local VisibleLines = 20 + local VisibleLines = 14 local frame = "AltoholicFrameGuildMembers" local entry = frame.."Entry" diff --git a/Altoholic/Frames/GuildMembers.xml b/Altoholic/Frames/GuildMembers.xml index 73877a6..d416eb3 100644 --- a/Altoholic/Frames/GuildMembers.xml +++ b/Altoholic/Frames/GuildMembers.xml @@ -159,7 +159,7 @@ - + @@ -307,36 +307,6 @@ - - - - - - - - - - - - diff --git a/Altoholic/Frames/Keys.lua b/Altoholic/Frames/Keys.lua index 3aabe6d..ca50d17 100644 --- a/Altoholic/Frames/Keys.lua +++ b/Altoholic/Frames/Keys.lua @@ -461,7 +461,7 @@ function ns:Update() AltoTooltip:Hide(); GameTooltip:Hide(); - local VisibleLines = 10 + local VisibleLines = 8 local NumLines = VisibleLines local frame = "AltoholicFrameKeys" local entry = frame.."Entry" diff --git a/Altoholic/Frames/Keys.xml b/Altoholic/Frames/Keys.xml index 9687994..db9922a 100644 --- a/Altoholic/Frames/Keys.xml +++ b/Altoholic/Frames/Keys.xml @@ -221,7 +221,7 @@ - + @@ -317,16 +317,6 @@ - - diff --git a/Altoholic/Frames/Mails.lua b/Altoholic/Frames/Mails.lua index 9578c64..ab9401d 100644 --- a/Altoholic/Frames/Mails.lua +++ b/Altoholic/Frames/Mails.lua @@ -81,7 +81,7 @@ function ns:BuildView(field, ascending) end function ns:Update() - local VisibleLines = 10 + local VisibleLines = 7 local frame = "AltoholicFrameMail" local entry = frame.."Entry" local player = addon:GetCurrentCharacter() diff --git a/Altoholic/Frames/Mails.xml b/Altoholic/Frames/Mails.xml index f72d190..2ba22ce 100644 --- a/Altoholic/Frames/Mails.xml +++ b/Altoholic/Frames/Mails.xml @@ -84,7 +84,7 @@ - + @@ -190,21 +190,6 @@ - - - diff --git a/Altoholic/Frames/Pets.lua b/Altoholic/Frames/Pets.lua index e48daf7..89f9b50 100644 --- a/Altoholic/Frames/Pets.lua +++ b/Altoholic/Frames/Pets.lua @@ -212,7 +212,7 @@ function ns:UpdatePets() end function ns:UpdatePetsAllInOne() - local VisibleLines = 10 + local VisibleLines = 8 local frame = "AltoholicFramePetsAllInOne" local entry = frame.."Entry" diff --git a/Altoholic/Frames/Pets.xml b/Altoholic/Frames/Pets.xml index 115f927..ae8c97b 100644 --- a/Altoholic/Frames/Pets.xml +++ b/Altoholic/Frames/Pets.xml @@ -25,7 +25,7 @@ - + @@ -333,7 +333,7 @@ - + @@ -429,16 +429,6 @@ - - diff --git a/Altoholic/Frames/Quests.lua b/Altoholic/Frames/Quests.lua index e6c8c26..c2246f8 100644 --- a/Altoholic/Frames/Quests.lua +++ b/Altoholic/Frames/Quests.lua @@ -34,7 +34,7 @@ function ns:Update() local character = addon.Tabs.Characters:GetCurrent() - local VisibleLines = 20 + local VisibleLines = 14 local frame = "AltoholicFrameQuests" local entry = frame.."Entry" diff --git a/Altoholic/Frames/Quests.xml b/Altoholic/Frames/Quests.xml index d73145c..707715a 100644 --- a/Altoholic/Frames/Quests.xml +++ b/Altoholic/Frames/Quests.xml @@ -106,7 +106,7 @@ - + @@ -232,36 +232,6 @@ - - - - - - diff --git a/Altoholic/Frames/Recipes.lua b/Altoholic/Frames/Recipes.lua index 37d27b5..493b075 100644 --- a/Altoholic/Frames/Recipes.lua +++ b/Altoholic/Frames/Recipes.lua @@ -218,7 +218,7 @@ end function ns:Update() local currentProfession = addon.TradeSkills.CurrentProfession - local VisibleLines = 20 + local VisibleLines = 14 local frame = "AltoholicFrameRecipes" local entry = frame.."Entry" diff --git a/Altoholic/Frames/Recipes.xml b/Altoholic/Frames/Recipes.xml index 466478d..2f1c0f4 100644 --- a/Altoholic/Frames/Recipes.xml +++ b/Altoholic/Frames/Recipes.xml @@ -196,7 +196,7 @@ - + @@ -459,36 +459,6 @@ - - - - - - diff --git a/Altoholic/Frames/Reputations.lua b/Altoholic/Frames/Reputations.lua index e421b7b..556ffa1 100644 --- a/Altoholic/Frames/Reputations.lua +++ b/Altoholic/Frames/Reputations.lua @@ -365,7 +365,7 @@ local function Reputations_UpdateEx(self, offset, entry, desc) end local ReputationsScrollFrame_Desc = { - NumLines = 10, + NumLines = 8, LineHeight = 41, Frame = "AltoholicFrameReputations", GetSize = function() return #displayedFactions end, diff --git a/Altoholic/Frames/Reputations.xml b/Altoholic/Frames/Reputations.xml index 4e7bd9a..b36c483 100644 --- a/Altoholic/Frames/Reputations.xml +++ b/Altoholic/Frames/Reputations.xml @@ -178,7 +178,7 @@ - + @@ -309,16 +309,6 @@ - - diff --git a/Altoholic/Frames/Search.lua b/Altoholic/Frames/Search.lua index 78afba2..d4c7405 100644 --- a/Altoholic/Frames/Search.lua +++ b/Altoholic/Frames/Search.lua @@ -239,7 +239,7 @@ function ns:Realm_Update() end function ns:Loots_Update() - local VisibleLines = 10 + local VisibleLines = 7 local frame = "AltoholicFrameSearch" local entry = frame.."Entry" @@ -311,7 +311,7 @@ function ns:Loots_Update() end function ns:Upgrade_Update() - local VisibleLines = 10 + local VisibleLines = 7 local frame = "AltoholicFrameSearch" local entry = frame.."Entry" diff --git a/Altoholic/Frames/Search.xml b/Altoholic/Frames/Search.xml index 1889133..f4c4ca8 100644 --- a/Altoholic/Frames/Search.xml +++ b/Altoholic/Frames/Search.xml @@ -240,7 +240,7 @@ - + @@ -331,21 +331,6 @@ - - - diff --git a/Altoholic/Frames/Skills.lua b/Altoholic/Frames/Skills.lua index b8c8a24..96e782c 100644 --- a/Altoholic/Frames/Skills.lua +++ b/Altoholic/Frames/Skills.lua @@ -29,7 +29,7 @@ local size = 22 local inset = 2 function ns:Update() - local VisibleLines = 20 + local VisibleLines = 14 local frame = "AltoholicFrameSkills" local entry = frame.."Entry" diff --git a/Altoholic/Frames/Skills.xml b/Altoholic/Frames/Skills.xml index c669b2b..1a9477f 100644 --- a/Altoholic/Frames/Skills.xml +++ b/Altoholic/Frames/Skills.xml @@ -194,7 +194,7 @@ - + @@ -320,36 +320,6 @@ - - - - - - diff --git a/Altoholic/Frames/TabCharacters.xml b/Altoholic/Frames/TabCharacters.xml index e4fe64b..de17777 100644 --- a/Altoholic/Frames/TabCharacters.xml +++ b/Altoholic/Frames/TabCharacters.xml @@ -55,7 +55,7 @@ - + diff --git a/Altoholic/Frames/TabGuildBank.xml b/Altoholic/Frames/TabGuildBank.xml index 13e640a..70f8d8d 100644 --- a/Altoholic/Frames/TabGuildBank.xml +++ b/Altoholic/Frames/TabGuildBank.xml @@ -18,7 +18,7 @@ - + diff --git a/Altoholic/Frames/TabSearch.xml b/Altoholic/Frames/TabSearch.xml index 021d887..a97ed71 100644 --- a/Altoholic/Frames/TabSearch.xml +++ b/Altoholic/Frames/TabSearch.xml @@ -3,7 +3,7 @@ - + diff --git a/Altoholic/Frames/TabSummary.xml b/Altoholic/Frames/TabSummary.xml index ec41794..f0255ff 100644 --- a/Altoholic/Frames/TabSummary.xml +++ b/Altoholic/Frames/TabSummary.xml @@ -14,7 +14,7 @@ - + diff --git a/README.md b/README.md index 68d861b..987c7b9 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,6 @@ Altoholic: modified development for WotLK Ported for the Ascension CoA (Vol'jin) 3.3.5a client by the Exiles guild. Released as `*-coa.N` tags via Gitea Actions; see `Exiles/coa-altoholic`. -- **3.3.002b-coa.12** — Bigger main window (real size, not scale): `AltoholicFrame` 447→555px tall; AuctionFrame background art re-anchored with a middle filler; every scrolling tab shows more rows (18px tabs 14→20, 41px tabs 7/8→10) with matching `$parentEntryN` frames + grown scrollframes. Visual polish (art seam, scrollbar track length) may need a tweak after testing. -- **3.3.002b-coa.11** — Hotfix: Skills tab crash — `$parentSkill1` ButtonText global-name collision left `Skill1NormalText` nil; made it self-contained. - **3.3.002b-coa.10** — Three CoA data-coverage features: - **Reputation** is now data-driven: shows every faction a character actually has (grouped by in-game category), so CoA's custom factions (and future ones) appear automatically. The old hardcoded faction tree is kept only as an icon lookup. - **Class icons** for CoA custom classes (12–32) now render from a bundled CoA atlas (`Altoholic/images/coa-classes.blp`, texcoords from the CoA Details fork) instead of falling back to the Warrior glue icon. From d915f6b844a914d5eec58f5be287b74107cad7cf Mon Sep 17 00:00:00 2001 From: Florian Berthold Date: Fri, 29 May 2026 20:30:29 +0200 Subject: [PATCH 04/14] coa.20: restore bigger window + relocate char-view professions - Re-applied the window enlargement (832x555, more rows) - user accepts the AuctionFrame art seam in exchange for the bigger frame. - Char-view professions (Prof1-8) moved out of the cramped bottom Cooking/FirstAid row into the open middle-left gap (2 rows of 4) so they stop overlapping/overflowing. --- Altoholic/Altoholic.toc | 4 +-- Altoholic/Altoholic.xml | 49 +++++++++++++++++++++++++-- Altoholic/Frames/AccountSummary.lua | 2 +- Altoholic/Frames/AccountSummary.xml | 32 ++++++++++++++++- Altoholic/Frames/Activity.lua | 2 +- Altoholic/Frames/Activity.xml | 32 ++++++++++++++++- Altoholic/Frames/AuctionHouse.lua | 4 +-- Altoholic/Frames/AuctionHouse.xml | 17 +++++++++- Altoholic/Frames/BagUsage.lua | 2 +- Altoholic/Frames/BagUsage.xml | 32 ++++++++++++++++- Altoholic/Frames/Calendar.lua | 2 +- Altoholic/Frames/Calendar.xml | 34 +++++++++++++++++-- Altoholic/Frames/Containers.lua | 4 +-- Altoholic/Frames/Containers.xml | 17 +++++++++- Altoholic/Frames/Currencies.lua | 2 +- Altoholic/Frames/Currencies.xml | 12 ++++++- Altoholic/Frames/Equipment.lua | 2 +- Altoholic/Frames/Equipment.xml | 17 +++++++++- Altoholic/Frames/GuildBankTabs.lua | 2 +- Altoholic/Frames/GuildBankTabs.xml | 32 ++++++++++++++++- Altoholic/Frames/GuildMembers.lua | 2 +- Altoholic/Frames/GuildMembers.xml | 32 ++++++++++++++++- Altoholic/Frames/GuildProfessions.lua | 2 +- Altoholic/Frames/GuildProfessions.xml | 32 ++++++++++++++++- Altoholic/Frames/Keys.lua | 2 +- Altoholic/Frames/Keys.xml | 12 ++++++- Altoholic/Frames/Mails.lua | 2 +- Altoholic/Frames/Mails.xml | 17 +++++++++- Altoholic/Frames/Pets.lua | 2 +- Altoholic/Frames/Pets.xml | 14 ++++++-- Altoholic/Frames/Quests.lua | 2 +- Altoholic/Frames/Quests.xml | 32 ++++++++++++++++- Altoholic/Frames/Recipes.lua | 2 +- Altoholic/Frames/Recipes.xml | 32 ++++++++++++++++- Altoholic/Frames/Reputations.lua | 2 +- Altoholic/Frames/Reputations.xml | 12 ++++++- Altoholic/Frames/Search.lua | 4 +-- Altoholic/Frames/Search.xml | 17 +++++++++- Altoholic/Frames/Skills.lua | 2 +- Altoholic/Frames/Skills.xml | 32 ++++++++++++++++- Altoholic/Frames/TabCharacters.xml | 6 ++-- Altoholic/Frames/TabGuildBank.xml | 2 +- Altoholic/Frames/TabSearch.xml | 2 +- Altoholic/Frames/TabSummary.xml | 2 +- README.md | 2 ++ 45 files changed, 514 insertions(+), 54 deletions(-) diff --git a/Altoholic/Altoholic.toc b/Altoholic/Altoholic.toc index f4c2e9f..3227bf5 100644 --- a/Altoholic/Altoholic.toc +++ b/Altoholic/Altoholic.toc @@ -13,7 +13,7 @@ ## Author: Thaoky, Telkar-RG ## X-Edited-By: Exiles (Sub-Net) — florian.berthold@sub-net.at -## Version: 3.3.002b-coa.19 +## Version: 3.3.002b-coa.20 ## X-Category: Inventory, Tradeskill, Mail ## X-Localizations: enUS, frFR, zhCN, zhTW, deDE, koKR, esES, esMX, ruRU ## X-Website: http://wow.curse.com/downloads/wow-addons/details/altoholic.aspx @@ -70,4 +70,4 @@ Frames\Skills.xml Frames\Search.xml Frames\Talents.xml -Frames\Keys.xml +Frames\Keys.xml \ No newline at end of file diff --git a/Altoholic/Altoholic.xml b/Altoholic/Altoholic.xml index ac97f6f..696cf24 100644 --- a/Altoholic/Altoholic.xml +++ b/Altoholic/Altoholic.xml @@ -92,7 +92,7 @@ - + @@ -172,6 +172,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -179,7 +222,7 @@ - + @@ -191,7 +234,7 @@ - + diff --git a/Altoholic/Frames/AccountSummary.lua b/Altoholic/Frames/AccountSummary.lua index 96dde04..98a04a1 100644 --- a/Altoholic/Frames/AccountSummary.lua +++ b/Altoholic/Frames/AccountSummary.lua @@ -168,7 +168,7 @@ end function ns:Update() - local VisibleLines = 14 + local VisibleLines = 20 local frame = "AltoholicFrameSummary" local entry = frame.."Entry" diff --git a/Altoholic/Frames/AccountSummary.xml b/Altoholic/Frames/AccountSummary.xml index e65f1c0..a4a7bfc 100644 --- a/Altoholic/Frames/AccountSummary.xml +++ b/Altoholic/Frames/AccountSummary.xml @@ -168,7 +168,7 @@ - + @@ -294,6 +294,36 @@ + + + + + + diff --git a/Altoholic/Frames/Activity.lua b/Altoholic/Frames/Activity.lua index 9ff1899..2324d52 100644 --- a/Altoholic/Frames/Activity.lua +++ b/Altoholic/Frames/Activity.lua @@ -23,7 +23,7 @@ local ns = addon.Activity -- ns = namespace local Characters = addon.Characters function ns:Update() - local VisibleLines = 14 + local VisibleLines = 20 local frame = "AltoholicFrameActivity" local entry = frame.."Entry" diff --git a/Altoholic/Frames/Activity.xml b/Altoholic/Frames/Activity.xml index 763049c..a1e9f44 100644 --- a/Altoholic/Frames/Activity.xml +++ b/Altoholic/Frames/Activity.xml @@ -176,7 +176,7 @@ - + @@ -302,6 +302,36 @@ + + + + + + diff --git a/Altoholic/Frames/AuctionHouse.lua b/Altoholic/Frames/AuctionHouse.lua index 2991518..772931c 100644 --- a/Altoholic/Frames/AuctionHouse.lua +++ b/Altoholic/Frames/AuctionHouse.lua @@ -136,7 +136,7 @@ function ns:InvalidateView() end function ns:UpdateAuctions() - local VisibleLines = 7 + local VisibleLines = 10 local frame = "AltoholicFrameAuctions" local entry = frame.."Entry" @@ -217,7 +217,7 @@ function ns:UpdateAuctions() end function ns:UpdateBids() - local VisibleLines = 7 + local VisibleLines = 10 local frame = "AltoholicFrameAuctions" local entry = frame.."Entry" diff --git a/Altoholic/Frames/AuctionHouse.xml b/Altoholic/Frames/AuctionHouse.xml index f2cf05b..5d343bc 100644 --- a/Altoholic/Frames/AuctionHouse.xml +++ b/Altoholic/Frames/AuctionHouse.xml @@ -106,7 +106,7 @@ - + @@ -222,6 +222,21 @@ + + + diff --git a/Altoholic/Frames/BagUsage.lua b/Altoholic/Frames/BagUsage.lua index eacdbc2..8c29a9b 100644 --- a/Altoholic/Frames/BagUsage.lua +++ b/Altoholic/Frames/BagUsage.lua @@ -22,7 +22,7 @@ local ns = addon.BagUsage -- ns = namespace local Characters = addon.Characters function ns:Update() - local VisibleLines = 14 + local VisibleLines = 20 local frame = "AltoholicFrameBagUsage" local entry = frame.."Entry" diff --git a/Altoholic/Frames/BagUsage.xml b/Altoholic/Frames/BagUsage.xml index 9714cb5..a9ac8cc 100644 --- a/Altoholic/Frames/BagUsage.xml +++ b/Altoholic/Frames/BagUsage.xml @@ -177,7 +177,7 @@ - + @@ -303,6 +303,36 @@ + + + + + + diff --git a/Altoholic/Frames/Calendar.lua b/Altoholic/Frames/Calendar.lua index 65f796d..5561a84 100644 --- a/Altoholic/Frames/Calendar.lua +++ b/Altoholic/Frames/Calendar.lua @@ -764,7 +764,7 @@ function Altoholic.Calendar.Events:BuildList() self:BuildView() end -local NUM_EVENTLINES = 14 +local NUM_EVENTLINES = 20 function Altoholic.Calendar.Events:Update() local self = Altoholic.Calendar.Events diff --git a/Altoholic/Frames/Calendar.xml b/Altoholic/Frames/Calendar.xml index fa3ee8f..fdc0fea 100644 --- a/Altoholic/Frames/Calendar.xml +++ b/Altoholic/Frames/Calendar.xml @@ -131,7 +131,7 @@ - + @@ -286,7 +286,7 @@ - + @@ -406,6 +406,36 @@ + + + + + + diff --git a/Altoholic/Frames/Containers.lua b/Altoholic/Frames/Containers.lua index 27f3670..afc46be 100644 --- a/Altoholic/Frames/Containers.lua +++ b/Altoholic/Frames/Containers.lua @@ -96,7 +96,7 @@ end local function UpdateSpread() local mode = UIDropDownMenu_GetSelectedValue(AltoholicFrameContainers_SelectContainerView) local rarity = UIDropDownMenu_GetSelectedValue(AltoholicFrameContainers_SelectRarity) - local VisibleLines = 7 + local VisibleLines = 10 local frame = "AltoholicFrameContainers" local entry = frame.."Entry" @@ -242,7 +242,7 @@ end local function UpdateAllInOne() local mode = UIDropDownMenu_GetSelectedValue(AltoholicFrameContainers_SelectContainerView) local rarity = UIDropDownMenu_GetSelectedValue(AltoholicFrameContainers_SelectRarity) - local VisibleLines = 7 + local VisibleLines = 10 local frame = "AltoholicFrameContainers" local entry = frame.."Entry" diff --git a/Altoholic/Frames/Containers.xml b/Altoholic/Frames/Containers.xml index 85c2d4b..4ff8fca 100644 --- a/Altoholic/Frames/Containers.xml +++ b/Altoholic/Frames/Containers.xml @@ -137,7 +137,7 @@ - + @@ -282,6 +282,21 @@ + + + diff --git a/Altoholic/Frames/Currencies.lua b/Altoholic/Frames/Currencies.lua index 3d94c38..1d7637c 100644 --- a/Altoholic/Frames/Currencies.lua +++ b/Altoholic/Frames/Currencies.lua @@ -177,7 +177,7 @@ local function Currencies_UpdateEx(self, offset, entry, desc) end local CurrenciesScrollFrame_Desc = { - NumLines = 8, + NumLines = 10, LineHeight = 41, Frame = "AltoholicFrameCurrencies", GetSize = function() return #usedTokens end, diff --git a/Altoholic/Frames/Currencies.xml b/Altoholic/Frames/Currencies.xml index 823221a..b33792a 100644 --- a/Altoholic/Frames/Currencies.xml +++ b/Altoholic/Frames/Currencies.xml @@ -175,7 +175,7 @@ - + @@ -302,6 +302,16 @@ + + diff --git a/Altoholic/Frames/Equipment.lua b/Altoholic/Frames/Equipment.lua index 2d684c5..6587eb7 100644 --- a/Altoholic/Frames/Equipment.lua +++ b/Altoholic/Frames/Equipment.lua @@ -415,7 +415,7 @@ function ns:GetInventoryTypeName(inv) end function ns:Update() - local VisibleLines = 7 + local VisibleLines = 10 local frame = "AltoholicFrameEquipment" local entry = frame.."Entry" diff --git a/Altoholic/Frames/Equipment.xml b/Altoholic/Frames/Equipment.xml index 9c02118..e8aa3fe 100644 --- a/Altoholic/Frames/Equipment.xml +++ b/Altoholic/Frames/Equipment.xml @@ -117,7 +117,7 @@ - + @@ -213,6 +213,21 @@ + + + diff --git a/Altoholic/Frames/GuildBankTabs.lua b/Altoholic/Frames/GuildBankTabs.lua index 165693c..e7e60f6 100644 --- a/Altoholic/Frames/GuildBankTabs.lua +++ b/Altoholic/Frames/GuildBankTabs.lua @@ -72,7 +72,7 @@ function ns:Update() BuildView() end - local VisibleLines = 14 + local VisibleLines = 20 local frame = "AltoholicFrameGuildBankTabs" local entry = frame.."Entry" diff --git a/Altoholic/Frames/GuildBankTabs.xml b/Altoholic/Frames/GuildBankTabs.xml index 2dd2070..16736cb 100644 --- a/Altoholic/Frames/GuildBankTabs.xml +++ b/Altoholic/Frames/GuildBankTabs.xml @@ -107,7 +107,7 @@ - + @@ -233,6 +233,36 @@ + + + + + + diff --git a/Altoholic/Frames/GuildMembers.lua b/Altoholic/Frames/GuildMembers.lua index f16624e..5a49210 100644 --- a/Altoholic/Frames/GuildMembers.lua +++ b/Altoholic/Frames/GuildMembers.lua @@ -285,7 +285,7 @@ function ns:Update() BuildView() end - local VisibleLines = 14 + local VisibleLines = 20 local frame = "AltoholicFrameGuildMembers" local entry = frame.."Entry" diff --git a/Altoholic/Frames/GuildMembers.xml b/Altoholic/Frames/GuildMembers.xml index d416eb3..73877a6 100644 --- a/Altoholic/Frames/GuildMembers.xml +++ b/Altoholic/Frames/GuildMembers.xml @@ -159,7 +159,7 @@ - + @@ -307,6 +307,36 @@ + + + + + + + + + + + + diff --git a/Altoholic/Frames/Keys.lua b/Altoholic/Frames/Keys.lua index ca50d17..3aabe6d 100644 --- a/Altoholic/Frames/Keys.lua +++ b/Altoholic/Frames/Keys.lua @@ -461,7 +461,7 @@ function ns:Update() AltoTooltip:Hide(); GameTooltip:Hide(); - local VisibleLines = 8 + local VisibleLines = 10 local NumLines = VisibleLines local frame = "AltoholicFrameKeys" local entry = frame.."Entry" diff --git a/Altoholic/Frames/Keys.xml b/Altoholic/Frames/Keys.xml index db9922a..9687994 100644 --- a/Altoholic/Frames/Keys.xml +++ b/Altoholic/Frames/Keys.xml @@ -221,7 +221,7 @@ - + @@ -317,6 +317,16 @@ + + diff --git a/Altoholic/Frames/Mails.lua b/Altoholic/Frames/Mails.lua index ab9401d..9578c64 100644 --- a/Altoholic/Frames/Mails.lua +++ b/Altoholic/Frames/Mails.lua @@ -81,7 +81,7 @@ function ns:BuildView(field, ascending) end function ns:Update() - local VisibleLines = 7 + local VisibleLines = 10 local frame = "AltoholicFrameMail" local entry = frame.."Entry" local player = addon:GetCurrentCharacter() diff --git a/Altoholic/Frames/Mails.xml b/Altoholic/Frames/Mails.xml index 2ba22ce..f72d190 100644 --- a/Altoholic/Frames/Mails.xml +++ b/Altoholic/Frames/Mails.xml @@ -84,7 +84,7 @@ - + @@ -190,6 +190,21 @@ + + + diff --git a/Altoholic/Frames/Pets.lua b/Altoholic/Frames/Pets.lua index 89f9b50..e48daf7 100644 --- a/Altoholic/Frames/Pets.lua +++ b/Altoholic/Frames/Pets.lua @@ -212,7 +212,7 @@ function ns:UpdatePets() end function ns:UpdatePetsAllInOne() - local VisibleLines = 8 + local VisibleLines = 10 local frame = "AltoholicFramePetsAllInOne" local entry = frame.."Entry" diff --git a/Altoholic/Frames/Pets.xml b/Altoholic/Frames/Pets.xml index ae8c97b..115f927 100644 --- a/Altoholic/Frames/Pets.xml +++ b/Altoholic/Frames/Pets.xml @@ -25,7 +25,7 @@ - + @@ -333,7 +333,7 @@ - + @@ -429,6 +429,16 @@ + + diff --git a/Altoholic/Frames/Quests.lua b/Altoholic/Frames/Quests.lua index c2246f8..e6c8c26 100644 --- a/Altoholic/Frames/Quests.lua +++ b/Altoholic/Frames/Quests.lua @@ -34,7 +34,7 @@ function ns:Update() local character = addon.Tabs.Characters:GetCurrent() - local VisibleLines = 14 + local VisibleLines = 20 local frame = "AltoholicFrameQuests" local entry = frame.."Entry" diff --git a/Altoholic/Frames/Quests.xml b/Altoholic/Frames/Quests.xml index 707715a..d73145c 100644 --- a/Altoholic/Frames/Quests.xml +++ b/Altoholic/Frames/Quests.xml @@ -106,7 +106,7 @@ - + @@ -232,6 +232,36 @@ + + + + + + diff --git a/Altoholic/Frames/Recipes.lua b/Altoholic/Frames/Recipes.lua index 493b075..37d27b5 100644 --- a/Altoholic/Frames/Recipes.lua +++ b/Altoholic/Frames/Recipes.lua @@ -218,7 +218,7 @@ end function ns:Update() local currentProfession = addon.TradeSkills.CurrentProfession - local VisibleLines = 14 + local VisibleLines = 20 local frame = "AltoholicFrameRecipes" local entry = frame.."Entry" diff --git a/Altoholic/Frames/Recipes.xml b/Altoholic/Frames/Recipes.xml index 2f1c0f4..466478d 100644 --- a/Altoholic/Frames/Recipes.xml +++ b/Altoholic/Frames/Recipes.xml @@ -196,7 +196,7 @@ - + @@ -459,6 +459,36 @@ + + + + + + diff --git a/Altoholic/Frames/Reputations.lua b/Altoholic/Frames/Reputations.lua index 556ffa1..e421b7b 100644 --- a/Altoholic/Frames/Reputations.lua +++ b/Altoholic/Frames/Reputations.lua @@ -365,7 +365,7 @@ local function Reputations_UpdateEx(self, offset, entry, desc) end local ReputationsScrollFrame_Desc = { - NumLines = 8, + NumLines = 10, LineHeight = 41, Frame = "AltoholicFrameReputations", GetSize = function() return #displayedFactions end, diff --git a/Altoholic/Frames/Reputations.xml b/Altoholic/Frames/Reputations.xml index b36c483..4e7bd9a 100644 --- a/Altoholic/Frames/Reputations.xml +++ b/Altoholic/Frames/Reputations.xml @@ -178,7 +178,7 @@ - + @@ -309,6 +309,16 @@ + + diff --git a/Altoholic/Frames/Search.lua b/Altoholic/Frames/Search.lua index d4c7405..78afba2 100644 --- a/Altoholic/Frames/Search.lua +++ b/Altoholic/Frames/Search.lua @@ -239,7 +239,7 @@ function ns:Realm_Update() end function ns:Loots_Update() - local VisibleLines = 7 + local VisibleLines = 10 local frame = "AltoholicFrameSearch" local entry = frame.."Entry" @@ -311,7 +311,7 @@ function ns:Loots_Update() end function ns:Upgrade_Update() - local VisibleLines = 7 + local VisibleLines = 10 local frame = "AltoholicFrameSearch" local entry = frame.."Entry" diff --git a/Altoholic/Frames/Search.xml b/Altoholic/Frames/Search.xml index f4c4ca8..1889133 100644 --- a/Altoholic/Frames/Search.xml +++ b/Altoholic/Frames/Search.xml @@ -240,7 +240,7 @@ - + @@ -331,6 +331,21 @@ + + + diff --git a/Altoholic/Frames/Skills.lua b/Altoholic/Frames/Skills.lua index 96e782c..b8c8a24 100644 --- a/Altoholic/Frames/Skills.lua +++ b/Altoholic/Frames/Skills.lua @@ -29,7 +29,7 @@ local size = 22 local inset = 2 function ns:Update() - local VisibleLines = 14 + local VisibleLines = 20 local frame = "AltoholicFrameSkills" local entry = frame.."Entry" diff --git a/Altoholic/Frames/Skills.xml b/Altoholic/Frames/Skills.xml index 1a9477f..c669b2b 100644 --- a/Altoholic/Frames/Skills.xml +++ b/Altoholic/Frames/Skills.xml @@ -194,7 +194,7 @@ - + @@ -320,6 +320,36 @@ + + + + + + diff --git a/Altoholic/Frames/TabCharacters.xml b/Altoholic/Frames/TabCharacters.xml index de17777..8cdfad4 100644 --- a/Altoholic/Frames/TabCharacters.xml +++ b/Altoholic/Frames/TabCharacters.xml @@ -55,7 +55,7 @@ - + @@ -245,8 +245,8 @@ diff --git a/Altoholic/Frames/TabGuildBank.xml b/Altoholic/Frames/TabGuildBank.xml index 70f8d8d..13e640a 100644 --- a/Altoholic/Frames/TabGuildBank.xml +++ b/Altoholic/Frames/TabGuildBank.xml @@ -18,7 +18,7 @@ - + diff --git a/Altoholic/Frames/TabSearch.xml b/Altoholic/Frames/TabSearch.xml index a97ed71..021d887 100644 --- a/Altoholic/Frames/TabSearch.xml +++ b/Altoholic/Frames/TabSearch.xml @@ -3,7 +3,7 @@ - + diff --git a/Altoholic/Frames/TabSummary.xml b/Altoholic/Frames/TabSummary.xml index f0255ff..ec41794 100644 --- a/Altoholic/Frames/TabSummary.xml +++ b/Altoholic/Frames/TabSummary.xml @@ -14,7 +14,7 @@ - + diff --git a/README.md b/README.md index 987c7b9..68d861b 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,8 @@ Altoholic: modified development for WotLK Ported for the Ascension CoA (Vol'jin) 3.3.5a client by the Exiles guild. Released as `*-coa.N` tags via Gitea Actions; see `Exiles/coa-altoholic`. +- **3.3.002b-coa.12** — Bigger main window (real size, not scale): `AltoholicFrame` 447→555px tall; AuctionFrame background art re-anchored with a middle filler; every scrolling tab shows more rows (18px tabs 14→20, 41px tabs 7/8→10) with matching `$parentEntryN` frames + grown scrollframes. Visual polish (art seam, scrollbar track length) may need a tweak after testing. +- **3.3.002b-coa.11** — Hotfix: Skills tab crash — `$parentSkill1` ButtonText global-name collision left `Skill1NormalText` nil; made it self-contained. - **3.3.002b-coa.10** — Three CoA data-coverage features: - **Reputation** is now data-driven: shows every faction a character actually has (grouped by in-game category), so CoA's custom factions (and future ones) appear automatically. The old hardcoded faction tree is kept only as an icon lookup. - **Class icons** for CoA custom classes (12–32) now render from a bundled CoA atlas (`Altoholic/images/coa-classes.blp`, texcoords from the CoA Details fork) instead of falling back to the Warrior glue icon. From 3663d44cd497545e00d2b434296180c6f577869f Mon Sep 17 00:00:00 2001 From: Florian Berthold Date: Fri, 29 May 2026 20:42:03 +0200 Subject: [PATCH 05/14] coa.21: title from Lua constant (updates on /reload, unlike cached TOC metadata) GetAddOnMetadata Version is cached at game launch and not refreshed by /reload, so the title showed a stale version after reloads ('still .18'). Use a Lua constant that re-evaluates each /reload as a truthful loaded-code indicator. --- Altoholic/Altoholic.lua | 6 ++++-- Altoholic/Altoholic.toc | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Altoholic/Altoholic.lua b/Altoholic/Altoholic.lua index 1babc6d..cbc3389 100644 --- a/Altoholic/Altoholic.lua +++ b/Altoholic/Altoholic.lua @@ -335,8 +335,10 @@ function addon:OnEnable() -- CoA: just "Altoholic " in the title bar (Exiles branding + author credit live in the .toc). -- Read the live .toc Version so it tracks each -coa.N release without editing this string. - local titleVersion = GetAddOnMetadata(addonName, "Version") or addon.Version - AltoholicFrameName:SetText("Altoholic |cFFFFFFFF".. titleVersion .."|r") + -- CoA: use a Lua constant, not GetAddOnMetadata — TOC metadata is cached at game launch + -- and does NOT refresh on /reload, so the .toc version looked stale ("still .18"). A Lua + -- constant re-evaluates on every /reload, giving a truthful loaded-code version. Bump with the .toc. + AltoholicFrameName:SetText("Altoholic |cFFFFFFFF3.3.002b-coa.21|r") local realm = GetRealmName() local player = UnitName("player") diff --git a/Altoholic/Altoholic.toc b/Altoholic/Altoholic.toc index 3227bf5..d9f51ca 100644 --- a/Altoholic/Altoholic.toc +++ b/Altoholic/Altoholic.toc @@ -13,7 +13,7 @@ ## Author: Thaoky, Telkar-RG ## X-Edited-By: Exiles (Sub-Net) — florian.berthold@sub-net.at -## Version: 3.3.002b-coa.20 +## Version: 3.3.002b-coa.21 ## X-Category: Inventory, Tradeskill, Mail ## X-Localizations: enUS, frFR, zhCN, zhTW, deDE, koKR, esES, esMX, ruRU ## X-Website: http://wow.curse.com/downloads/wow-addons/details/altoholic.aspx From d1616b4354db37ba9fca04d1d0a9d127f7d59f93 Mon Sep 17 00:00:00 2001 From: Florian Berthold Date: Fri, 29 May 2026 22:04:19 +0200 Subject: [PATCH 06/14] coa.22: Skills view as a vertical list (character header + one row per profession) Rewrote the Skills tab from the cramped multi-column per-character grid to a vertical list: each character is a header row, followed by one row per known primary profession (incl Woodcutting/Woodworking) + secondary skills (Cooking/First Aid/Fishing) + Riding, icon + name + rank/max, top to bottom. Simplified the column headers to match. --- Altoholic/Altoholic.lua | 2 +- Altoholic/Altoholic.toc | 2 +- Altoholic/Frames/Skills.lua | 468 ++++++-------------------------- Altoholic/Frames/TabSummary.lua | 19 +- 4 files changed, 93 insertions(+), 398 deletions(-) diff --git a/Altoholic/Altoholic.lua b/Altoholic/Altoholic.lua index cbc3389..17258b4 100644 --- a/Altoholic/Altoholic.lua +++ b/Altoholic/Altoholic.lua @@ -338,7 +338,7 @@ function addon:OnEnable() -- CoA: use a Lua constant, not GetAddOnMetadata — TOC metadata is cached at game launch -- and does NOT refresh on /reload, so the .toc version looked stale ("still .18"). A Lua -- constant re-evaluates on every /reload, giving a truthful loaded-code version. Bump with the .toc. - AltoholicFrameName:SetText("Altoholic |cFFFFFFFF3.3.002b-coa.21|r") + AltoholicFrameName:SetText("Altoholic |cFFFFFFFF3.3.002b-coa.22|r") local realm = GetRealmName() local player = UnitName("player") diff --git a/Altoholic/Altoholic.toc b/Altoholic/Altoholic.toc index d9f51ca..c3b60cc 100644 --- a/Altoholic/Altoholic.toc +++ b/Altoholic/Altoholic.toc @@ -13,7 +13,7 @@ ## Author: Thaoky, Telkar-RG ## X-Edited-By: Exiles (Sub-Net) — florian.berthold@sub-net.at -## Version: 3.3.002b-coa.21 +## Version: 3.3.002b-coa.22 ## X-Category: Inventory, Tradeskill, Mail ## X-Localizations: enUS, frFR, zhCN, zhTW, deDE, koKR, esES, esMX, ruRU ## X-Website: http://wow.curse.com/downloads/wow-addons/details/altoholic.aspx diff --git a/Altoholic/Frames/Skills.lua b/Altoholic/Frames/Skills.lua index b8c8a24..c9b8564 100644 --- a/Altoholic/Frames/Skills.lua +++ b/Altoholic/Frames/Skills.lua @@ -28,408 +28,111 @@ local Characters = addon.Characters local size = 22 local inset = 2 + function ns:Update() local VisibleLines = 20 local frame = "AltoholicFrameSkills" local entry = frame.."Entry" - - local DS = DataStore - - local offset = FauxScrollFrame_GetOffset( _G[ frame.."ScrollFrame" ] ); - local DisplayedCount = 0 - local VisibleCount = 0 - local DrawRealm - local i=1 - - for _, line in pairs(Characters:GetView()) do - local lineType = Characters:GetLineType(line) - - if (offset > 0) or (DisplayedCount >= VisibleLines) then -- if the line will not be visible - if lineType == INFO_REALM_LINE then -- then keep track of counters - if Characters:GetField(line, "isCollapsed") == false then - DrawRealm = true - else - DrawRealm = false + + -- CoA: vertical list. For each visible character a header row, then one row per known + -- profession / secondary skill (icon + name + rank/max), top to bottom (like the other detail views). + local SECONDARY = { 2550, 3273, 7733 } -- Cooking, First Aid, Fishing (spell id -> icon + GetSpellInfo name) + local items = {} + for _, viewLine in pairs(Characters:GetView()) do + if Characters:GetLineType(viewLine) == INFO_CHARACTER_LINE then + local character = DS:GetCharacter( Characters:GetInfo(viewLine) ) + items[#items + 1] = { kind = "header", viewLine = viewLine, character = character } + + local profs = Characters:GetField(viewLine, "professions") + if profs then + for _, p in ipairs(profs) do + items[#items + 1] = { kind = "skill", viewLine = viewLine, character = character, + spellID = p.spellID, name = p.name, rank = p.rank or 0, maxRank = p.maxRank or 0 } end - VisibleCount = VisibleCount + 1 - offset = offset - 1 -- no further control, nevermind if it goes negative - elseif DrawRealm then - VisibleCount = VisibleCount + 1 - offset = offset - 1 -- no further control, nevermind if it goes negative end - else -- line will be displayed - if lineType == INFO_REALM_LINE then - local _, realm, account = Characters:GetInfo(line) - - if Characters:GetField(line, "isCollapsed") == false then - _G[ entry..i.."Collapse" ]:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-Up"); - DrawRealm = true - else - _G[ entry..i.."Collapse" ]:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up"); - DrawRealm = false + for _, sid in ipairs(SECONDARY) do + local sName = GetSpellInfo(sid) + if sName then + local cur, max = DS:GetSkillInfo(character, sName) + if cur and cur > 0 then + items[#items + 1] = { kind = "skill", viewLine = viewLine, character = character, + spellID = sid, name = sName, rank = cur, maxRank = max or 0 } + end end - _G[entry..i.."Collapse"]:Show() - _G[entry..i.."Name"]:SetWidth(300) - _G[entry..i.."Name"]:SetPoint("TOPLEFT", 25, 0) - _G[entry..i.."NameNormalText"]:SetWidth(300) - if account == "Default" then -- saved as default, display as localized. - _G[entry..i.."NameNormalText"]:SetText(format("%s (%s".. L["Account"]..": %s%s|r)", realm, WHITE, GREEN, L["Default"])) - else - local last = addon:GetLastAccountSharingInfo(realm, account) - _G[entry..i.."NameNormalText"]:SetText(format("%s (%s".. L["Account"]..": %s%s %s%s|r)", realm, WHITE, GREEN, account, YELLOW, last or "")) - end - _G[entry..i.."Level"]:SetText("") - _G[entry..i.."Skill1NormalText"]:SetText("") - _G[entry..i.."CookingNormalText"]:SetText("") - _G[entry..i.."FirstAidNormalText"]:SetText("") - _G[entry..i.."FishingNormalText"]:SetText("") - _G[entry..i.."RidingNormalText"]:SetText("") - - _G[ entry..i ]:SetID(line) - _G[ entry..i ]:Show() - i = i + 1 - VisibleCount = VisibleCount + 1 - DisplayedCount = DisplayedCount + 1 - elseif DrawRealm then - if (lineType == INFO_CHARACTER_LINE) then - local character = DS:GetCharacter( Characters:GetInfo(line) ) - - local icon - if DS:GetCharacterFaction(character) == "Alliance" then - -- icon = addon:TextureToFontstring(ICON_FACTION_ALLIANCE, size, size) .. " " - icon = addon:TextureToFontstring2(ICON_FACTION_ALLIANCE, size, size, inset, inset, inset, inset) .. " " - else - -- icon = addon:TextureToFontstring(ICON_FACTION_HORDE, size, size) .. " " - icon = addon:TextureToFontstring2(ICON_FACTION_HORDE, size, size, inset, inset, inset, inset) .. " " - end - - _G[entry..i.."Collapse"]:Hide() - _G[entry..i.."Name"]:SetWidth(170) - _G[entry..i.."Name"]:SetPoint("TOPLEFT", 10, 0) - _G[entry..i.."NameNormalText"]:SetWidth(170) - addon:SetCharacterRowNameLevel(entry, i, icon, character) - - -- CoA: render ALL primary professions the character knows into the - -- single wide Professions cell, as a row of icon+rank segments. - -- The list is precomputed in Characters.lua (field "professions") - -- and may be empty (unscanned char) -> cell renders blank. Every - -- value is guarded with "or 0" before GetColor/concat. - local professions = Characters:GetField(line, "professions") - local profText = "" - if professions then - for idx, p in ipairs(professions) do - if idx > 6 then profText = profText .. YELLOW .. "+" .. (#professions - 6) .. "|r"; break end -- CoA: cap inline profs so the strip fits its 325px cell - local rank = p.rank or 0 - local profIcon = "" - if p.spellID then - profIcon = addon:TextureToFontstring2(addon:GetSpellIcon(p.spellID), size, size, inset, inset, inset, inset) .. " " - end - profText = profText .. profIcon .. ns:GetColor(rank) .. rank .. "|r " - end - end - _G[entry..i.."Skill1NormalText"]:SetText(profText) - - local field - -- cooking - -- icon = addon:TextureToFontstring(addon:GetSpellIcon(2550), size, size) .. " " - icon = addon:TextureToFontstring2(addon:GetSpellIcon(2550), size, size, inset, inset, inset, inset) .. " " - field = Characters:GetField(line, "cooking") or 0 - _G[entry..i.."CookingNormalText"]:SetText(icon .. ns:GetColor(field) .. field) - - -- first aid - -- icon = addon:TextureToFontstring(addon:GetSpellIcon(3273), size, size) .. " " - icon = addon:TextureToFontstring2(addon:GetSpellIcon(3273), size, size, inset, inset, inset, inset) .. " " - field = Characters:GetField(line, "firstaid") or 0 - _G[entry..i.."FirstAidNormalText"]:SetText(icon .. ns:GetColor(field) .. field) - - -- fishing - -- icon = addon:TextureToFontstring(addon:GetSpellIcon(7733), size, size) .. " " - icon = addon:TextureToFontstring2(addon:GetSpellIcon(7733), size, size, inset, inset, inset, inset) .. " " - field = Characters:GetField(line, "fishing") or 0 - _G[entry..i.."FishingNormalText"]:SetText(icon .. ns:GetColor(field) .. field) - - -- riding - field = Characters:GetField(line, "riding") or 0 - if field >= 300 then - -- icon = addon:TextureToFontstring("Interface\\Icons\\Ability_Mount_Gryphon_01", size, size) .. " " - icon = addon:TextureToFontstring2("Interface\\Icons\\ability_mount_drake_bronze", size, size, inset, inset, inset, inset) - - for _,spId in pairs({63956, 63963, 60024, 72808, 72807, 63796, 40192, 69395, 60021, 59976, 64927, 67336, 65439, 49193, 71810, 44317, 44744, 58615, 37015, 3363, 32345}) do - -- IsPetKnown(character, companionType, spellID) - if DS:IsPetKnown(character, "MOUNT", spId) then - icon = addon:TextureToFontstring2("Interface\\Icons\\inv_misc_enggizmos_03", size, size, inset, inset, inset, inset) - break - end - end - elseif field >= 225 then - icon = addon:TextureToFontstring2("Interface\\Icons\\ability_mount_goldengryphon", size, size, inset, inset, inset, inset) - elseif field >= 150 then - icon = addon:TextureToFontstring2("Interface\\Icons\\ability_mount_charger", size, size, inset, inset, inset, inset) - elseif field >= 75 then - icon = addon:TextureToFontstring2("Interface\\Icons\\spell_nature_swiftness", size, size, inset, inset, inset, inset) - else - icon = addon:TextureToFontstring2("Interface\\Icons\\inv_boots_03", size, size, inset, inset, inset, inset) - end - - if DS:IsSpellKnown(character, 54197) then -- KNOWS [Cold Weather Flying] - -- Interface\Icons\Spell_Frost_FrostShock - -- icon = addon:TextureToFontstring(addon:GetSpellIcon(54197), size, size) .. " " - -- TextureToFontstringHalfSquare(name, side, inset, isRight) - -- icon = addon:TextureToFontstringHalfSquare(addon:GetSpellIcon(54197), size, inset, true) .. " " - -- icon = icon .. addon:TextureToFontstringHalfSquare(addon:GetSpellIcon(54197), size, inset, 0.7, 1.0) .. " " - - -- TextureToFontstringCut(name, heightOrig, widthOrig, insetLeft, insetRight, insetTop, insetBottom) - -- local sTemp = size+2*inset - -- icon = icon .. addon:TextureToFontstringCut(addon:GetSpellIcon(54197), sTemp, sTemp, floor(0.7*sTemp), floor(0.1*sTemp), inset, inset) .. " " - icon = addon:TextureToFontstring(addon:GetSpellIcon(54197), size, size) .. " " .. icon .. " " - - else -- DOES NOT KNOW [Cold Weather Flying] - icon = format("|T%s:%s:%s:0:0:%s:%s:%s:%s:%s:%s|t", addon:GetSpellIcon(54197), size, size, size, size, 0, 0, 0, 0) .. " " .. icon .. " " - end - - _G[entry..i.."RidingNormalText"]:SetText(icon .. ns:GetColor(field, 300) .. field) - elseif (lineType == INFO_TOTAL_LINE) then - _G[entry..i.."Collapse"]:Hide() - _G[entry..i.."Name"]:SetWidth(200) - _G[entry..i.."Name"]:SetPoint("TOPLEFT", 15, 0) - _G[entry..i.."NameNormalText"]:SetWidth(200) - _G[entry..i.."NameNormalText"]:SetText(L["Totals"]) - _G[entry..i.."Level"]:SetText(Characters:GetField(line, "level")) - _G[entry..i.."Skill1NormalText"]:SetText("") - _G[entry..i.."CookingNormalText"]:SetText("") - _G[entry..i.."FirstAidNormalText"]:SetText("") - _G[entry..i.."FishingNormalText"]:SetText("") - _G[entry..i.."RidingNormalText"]:SetText("") - end - _G[ entry..i ]:SetID(line) - _G[ entry..i ]:Show() - i = i + 1 - VisibleCount = VisibleCount + 1 - DisplayedCount = DisplayedCount + 1 + end + local riding = Characters:GetField(viewLine, "riding") or 0 + if riding > 0 then + items[#items + 1] = { kind = "skill", viewLine = viewLine, character = character, + spellID = 33388, name = (L and L["Riding"]) or "Riding", rank = riding, maxRank = 300 } end end end - - while i <= VisibleLines do - _G[ entry..i ]:SetID(0) - _G[ entry..i ]:Hide() - i = i + 1 - end - FauxScrollFrame_Update( _G[ frame.."ScrollFrame" ], VisibleCount, VisibleLines, 18); -end + local offset = FauxScrollFrame_GetOffset( _G[ frame.."ScrollFrame" ] ) + for i = 1, VisibleLines do + local e = entry..i + local btn = _G[e] + local item = items[i + offset] + if item then + _G[e.."Collapse"]:Hide() + _G[e.."Level"]:SetText("") + _G[e.."Skill1NormalText"]:SetText("") + _G[e.."CookingNormalText"]:SetText("") + _G[e.."FirstAidNormalText"]:SetText("") + _G[e.."FishingNormalText"]:SetText("") + _G[e.."RidingNormalText"]:SetText("") + _G[e.."Name"]:SetWidth(680) + _G[e.."Name"]:SetPoint("TOPLEFT", 15, 0) + _G[e.."NameNormalText"]:SetWidth(680) + + if item.kind == "header" then + local _, class = DS:GetCharacterClass(item.character) + _G[e.."NameNormalText"]:SetText( (DS:GetColoredCharacterName(item.character) or "?") .. " " .. WHITE .. "(" .. (class or "") .. ")" ) + else + local iconEsc = "" + if item.spellID then + iconEsc = addon:TextureToFontstring2(addon:GetSpellIcon(item.spellID), size, size, inset, inset, inset, inset) .. " " + end + local cap = (item.maxRank > 0) and item.maxRank or 450 + _G[e.."NameNormalText"]:SetText( " " .. iconEsc .. WHITE .. item.name .. " " .. ns:GetColor(item.rank, cap) .. item.rank .. "/" .. item.maxRank .. "|r" ) + end + btn.coaItem = item + btn:SetID(item.viewLine or 0) + btn:Show() + else + btn.coaItem = nil + btn:SetID(0) + btn:Hide() + end + end + FauxScrollFrame_Update( _G[ frame.."ScrollFrame" ], #items, VisibleLines, 18 ) +end function ns:OnEnter(frame) - local line = frame:GetParent():GetID() - local lineType = Characters:GetLineType(line) - if lineType ~= INFO_CHARACTER_LINE then - return - end - - local id = frame:GetID() - local skillName, rank, suggestion - - local DS = DataStore - local character = DS:GetCharacter(Characters:GetInfo(line)) - - -- CoA: id 1 is now the combined "Professions" cell -> list every known primary - -- profession with rank/max and recipe counts in a single tooltip. - if id == 1 then - local professions = Characters:GetField(line, "professions") - AltoTooltip:ClearLines() - AltoTooltip:SetOwner(frame, "ANCHOR_RIGHT") - AltoTooltip:AddLine(L["Professions"] or "Professions", 1, 1, 1) - if not professions or #professions == 0 then - AltoTooltip:AddLine(L["No data"]) - AltoTooltip:Show() - return - end - for _, p in ipairs(professions) do - local pName = p.name - local curRank, maxRank = DS:GetSkillInfo(character, pName) - curRank, maxRank = curRank or 0, maxRank or 0 - local rankText = ns:GetColor(curRank) .. curRank .. "/" .. maxRank - local recipeText = "" - local prof = DS:GetProfession(character, pName) - if prof and DS:GetNumCraftLines(prof) > 0 then - local orange, yellow, green, grey = DS:GetNumRecipesByColor(prof) - recipeText = WHITE .. " (" .. (orange + yellow + green + grey) .. " " .. TRADESKILL_SERVICE_LEARN .. ")" - end - -- localized display name where possible - local displayName = pName - local spellID = DS:GetProfessionSpellID(pName) - if spellID then - displayName = GetSpellInfo(spellID) or pName - end - AltoTooltip:AddDoubleLine(WHITE .. displayName, rankText .. recipeText) - end - AltoTooltip:Show() - return - end - - if id == 3 then - skillName = GetSpellInfo(2550) -- cooking - elseif id == 4 then - skillName = GetSpellInfo(3273) -- First Aid - elseif id == 5 then - skillName = GetSpellInfo(24303) -- Fishing - elseif id == 6 then - skillName = L["Riding"] - end - - local curRank, maxRank = DS:GetSkillInfo(character, skillName) - curRank, maxRank = curRank or 0, maxRank or 0 -- CoA: getter returns no value for skills DataStore_Skills hasn't scanned - local profession = DS:GetProfession(character, skillName) - - if (id >= 3) and (id <= 6) then - if id == 6 then -- riding - rank = ns:GetColor(curRank, 300) .. curRank .. "/" .. maxRank - else - rank = ns:GetColor(curRank) .. curRank .. "/" .. maxRank - end - suggestion = addon:GetSuggestion(skillName, curRank) - elseif id == 7 then -- class - local _, class = DS:GetCharacterClass(character) - if class ~= "ROGUE" then - return - end - skillName = L["Rogue Proficiencies"] - - local curLock, maxLock = DS:GetSkillInfo(character, L["Lockpicking"]) - curLock, maxLock = curLock or 0, maxLock or 0 -- CoA: guard unscanned lockpicking - rank = TEAL .. L["Lockpicking"] .. " " .. curLock .. "/" .. maxLock - suggestion = addon:GetSuggestion(L["Lockpicking"], curLock) - end - - AltoTooltip:ClearLines(); - AltoTooltip:SetOwner(frame, "ANCHOR_RIGHT"); - AltoTooltip:AddLine(skillName,1,1,1); - AltoTooltip:AddLine(GREEN..rank,1,1,1); - - if (id == 3) or (id == 4) then -- crafting secondary skills (Cooking, First Aid); skips fishing/riding - if skillName ~= GetSpellInfo(13614) and skillName ~= GetSpellInfo(8613) then -- no display for herbalism & skinning - AltoTooltip:AddLine(" "); - - if not profession then - AltoTooltip:AddLine(L["No data"]); - AltoTooltip:Show(); - return - end - - if DS:GetNumCraftLines(profession) == 0 then - AltoTooltip:AddLine(L["No data"].. ": 0 " .. TRADESKILL_SERVICE_LEARN,1,1,1); - else - local orange, yellow, green, grey = DS:GetNumRecipesByColor(profession) - - AltoTooltip:AddLine(orange+yellow+green+grey .. " " .. TRADESKILL_SERVICE_LEARN,1,1,1); - AltoTooltip:AddLine(format(WHITE .. "%d " .. RECIPE_GREEN .. "Green|r /" - .. WHITE .. " %d " .. YELLOW .. "Yellow|r /" - .. WHITE .. " %d " .. RECIPE_ORANGE .. "Orange", - green, yellow, orange)) - end - end - end - - local skillCap = 450 - if id == 6 then - skillCap = 300 - end - - AltoTooltip:AddLine(" "); - AltoTooltip:AddLine(RECIPE_GREY .. L["Grey"] .. "|r " .. L["up to"] .. " " .. (floor(skillCap*0.25)-1),1,1,1); - AltoTooltip:AddLine(RED .. RED_GEM .. "|r " .. L["up to"] .. " " .. (floor(skillCap*0.50)-1),1,1,1); - AltoTooltip:AddLine(ORANGE .. BI["Orange"] .. "|r " .. L["up to"] .. " " .. (floor(skillCap*0.75)-1),1,1,1); - AltoTooltip:AddLine(YELLOW .. YELLOW_GEM .. "|r " .. L["up to"] .. " " .. (skillCap-1),1,1,1); - AltoTooltip:AddLine(GREEN .. BI["Green"] .. "|r " .. L["at"] .. " "..skillCap.." " .. L["and above"],1,1,1); - - if suggestion then - AltoTooltip:AddLine(" ",1,1,1); - AltoTooltip:AddLine(L["Suggestion"] .. ": ",1,1,1); - AltoTooltip:AddLine(TEAL .. suggestion,1,1,1); - end - - -- parse profession cooldowns - if id ~= 7 and profession then - DS:ClearExpiredCooldowns(profession) - local numCooldows = DS:GetNumActiveCooldowns(profession) - - if numCooldows == 0 then - AltoTooltip:AddLine(" ",1,1,1); - AltoTooltip:AddLine(L["All cooldowns are up"],1,1,1); - else - AltoTooltip:AddLine(" ",1,1,1); - for i = 1, numCooldows do - local craftName, expiresIn = DS:GetCraftCooldownInfo(profession, i) - AltoTooltip:AddDoubleLine(craftName, addon:GetTimeString(expiresIn)); - end - end - end - - AltoTooltip:Show(); + local item = frame:GetParent() and frame:GetParent().coaItem + if not item or item.kind ~= "skill" then return end + AltoTooltip:ClearLines() + AltoTooltip:SetOwner(frame, "ANCHOR_RIGHT") + AltoTooltip:AddLine(WHITE .. item.name, 1, 1, 1) + local cap = (item.maxRank > 0) and item.maxRank or 450 + AltoTooltip:AddLine( ns:GetColor(item.rank, cap) .. item.rank .. " / " .. item.maxRank, 1, 1, 1 ) + AltoTooltip:Show() end -local VIEW_MOUNTS = 8 - function ns:OnClick(frame, button) - local line = frame:GetParent():GetID() - local lineType = Characters:GetLineType(line) - if lineType ~= INFO_CHARACTER_LINE then - return - end - - local id = frame:GetID() - if id == 5 then return end -- fishing ? do nothing - - addon:SetCurrentCharacter( Characters:GetInfo(line) ) - - local skillName - if id == 1 then - -- CoA: id 1 is the combined Professions cell. A single click can't pick one - -- of several professions, so default to the first known primary profession - -- (opens its recipes / supplies its trade link on shift-click). - local professions = Characters:GetField(line, "professions") - if professions and professions[1] then - skillName = professions[1].name - end - elseif id == 3 then - skillName = GetSpellInfo(2550) -- cooking - elseif id == 4 then - skillName = GetSpellInfo(3273) -- First Aid - end - - local DS = DataStore - local character = DS:GetCharacter(Characters:GetInfo(line)) - local profession = DS:GetProfession(character, skillName) - - if skillName then - if not profession or DS:GetNumCraftLines(profession) == 0 then -- if profession hasn't been scanned (or scan failed), exit - return - end - end - - local charName, realm, account = addon:GetCurrentCharacter() - local chat = ChatEdit_GetLastActiveWindow() - - if chat:IsShown() and IsShiftKeyDown() and realm == GetRealmName() and id ~= 6 then - -- if shift-click, then display the profession link and exit - local link = profession.FullLink - if link and link:match("trade:") then - chat:Insert(link); - end - return - end - - addon.Tabs.Characters:SetCurrent(charName, realm, account) - addon.Tabs:OnClick(2) - - if id == 6 then - addon.Tabs.Characters:ViewCharInfo(VIEW_MOUNTS) - else - addon.Tabs.Characters:ViewRecipes(skillName) + -- CoA: clicking a profession row opens that character's profession recipe list, if available. + local item = frame:GetParent() and frame:GetParent().coaItem + if not item or item.kind ~= "skill" or not item.character then return end + if addon.Tabs and addon.Tabs.Characters and addon.Tabs.Characters.ViewCharInfo then + local name, realm, account = Characters:GetInfo(item.viewLine) + addon:SetCurrentCharacter(name, realm, account) + addon.Tabs.Characters:SetCurrent(name, realm, account) + addon.Tabs:OnClick(2) end end + local skillColors = { RECIPE_GREY, RED, ORANGE, YELLOW, GREEN } function ns:GetColor(rank, skillCap) @@ -443,3 +146,4 @@ function ns:GetColor(rank, skillCap) if index > #skillColors then index = #skillColors end return skillColors[index] end + diff --git a/Altoholic/Frames/TabSummary.lua b/Altoholic/Frames/TabSummary.lua index 4fff08f..70a2bc4 100644 --- a/Altoholic/Frames/TabSummary.lua +++ b/Altoholic/Frames/TabSummary.lua @@ -158,20 +158,11 @@ function ns:SetMode(mode) Columns:Add(L["free"], 50, function(self) addon.Characters:Sort(self, "GetNumFreeBankSlots") end) elseif currentMode == 3 then - Columns:Add(NAME, 100, function(self) addon.Characters:Sort(self, "GetCharacterName") end) - Columns:Add(LEVEL, 60, function(self) addon.Characters:Sort(self, "GetCharacterLevel") end) - -- CoA: a character can know ALL professions at once, so the old fixed - -- Prof. 1 / Prof. 2 columns are replaced by one wide "Professions" column - -- that lists every known primary profession (incl. the customs Woodcutting - -- and Woodworking). Width matches the widened Skill1 cell in Skills.xml. - Columns:Add(L["Professions"] or "Professions", 325, function(self) addon.Characters:Sort(self, "GetCharacterName") end) - title = GetSpellInfo(2550) -- cooking - Columns:Add(title, 65, function(self) addon.Characters:Sort(self, "GetCookingRank") end) - title = GetSpellInfo(3273) -- First Aid - Columns:Add(title, 65, function(self) addon.Characters:Sort(self, "GetFirstAidRank") end) - title = GetSpellInfo(24303) -- Fishing - Columns:Add(title, 65, function(self) addon.Characters:Sort(self, "GetFishingRank") end) - Columns:Add(L["Riding"], 65, function(self) addon.Characters:Sort(self, "GetRidingRank") end) + -- CoA: the Skills view is now a vertical list (character header, then one row per + -- known profession/secondary skill, top to bottom). A single wide column header + -- replaces the old per-skill columns, which no longer match the layout. + Columns:Add((L["Character"] or "Character") .. " / " .. (L["Professions"] or "Professions"), 460, function(self) addon.Characters:Sort(self, "GetCharacterName") end) + Columns:Add((SKILL or "Skill"), 220, function(self) addon.Characters:Sort(self, "GetCharacterName") end) elseif currentMode == 4 then Columns:Add(NAME, 100, function(self) addon.Characters:Sort(self, "GetCharacterName") end) From 996a11dd0a1badc5b0791954bb762425985dc065 Mon Sep 17 00:00:00 2001 From: Florian Berthold Date: Fri, 29 May 2026 22:27:53 +0200 Subject: [PATCH 07/14] coa.23: correct CoA class names (PROPHET->Venomancer etc.) + fix Skills rank/max - CoA renamed classes but UnitClass returns old tokens; added a token->name map (CoAClassColors.lua, from coa-omen) applied in the Skills header + the shared AddCharacterTooltipHeader/SetCharacterRowNameLevel helpers (fixes class names everywhere). - Skills vertical list now shows rank/max (precompute carries maxRank; was showing /0). --- Altoholic/Altoholic.lua | 10 +++++++--- Altoholic/Altoholic.toc | 2 +- Altoholic/Characters.lua | 1 + Altoholic/CoAClassColors.lua | 20 ++++++++++++++++++++ Altoholic/Frames/Skills.lua | 5 +++-- 5 files changed, 32 insertions(+), 6 deletions(-) diff --git a/Altoholic/Altoholic.lua b/Altoholic/Altoholic.lua index 17258b4..c497779 100644 --- a/Altoholic/Altoholic.lua +++ b/Altoholic/Altoholic.lua @@ -338,7 +338,7 @@ function addon:OnEnable() -- CoA: use a Lua constant, not GetAddOnMetadata — TOC metadata is cached at game launch -- and does NOT refresh on /reload, so the .toc version looked stale ("still .18"). A Lua -- constant re-evaluates on every /reload, giving a truthful loaded-code version. Bump with the .toc. - AltoholicFrameName:SetText("Altoholic |cFFFFFFFF3.3.002b-coa.22|r") + AltoholicFrameName:SetText("Altoholic |cFFFFFFFF3.3.002b-coa.23|r") local realm = GetRealmName() local player = UnitName("player") @@ -608,13 +608,17 @@ end -- Fresh alts have partial per-module data, so every field is guarded here once -- instead of being copy-pasted (and missed) across the frames. function Altoholic:AddCharacterTooltipHeader(character) + local locClass, engClass = DS:GetCharacterClass(character) + local className = Altoholic:GetCoAClassName(engClass) or locClass or "" -- CoA: current class name (PROPHET->Venomancer, …) AltoTooltip:AddDoubleLine(DS:GetColoredCharacterName(character) or "?", DS:GetColoredCharacterFaction(character) or "") AltoTooltip:AddLine(format("%s %s |r%s %s", L["Level"], - GREEN..(DS:GetCharacterLevel(character) or 0), DS:GetCharacterRace(character) or "", DS:GetCharacterClass(character) or ""), 1, 1, 1) + GREEN..(DS:GetCharacterLevel(character) or 0), DS:GetCharacterRace(character) or "", className), 1, 1, 1) end function Altoholic:SetCharacterRowNameLevel(entry, i, icon, character) - _G[entry..i.."NameNormalText"]:SetText(icon .. format("%s (%s)", DS:GetColoredCharacterName(character) or "?", DS:GetCharacterClass(character) or "")) + local locClass, engClass = DS:GetCharacterClass(character) + local className = Altoholic:GetCoAClassName(engClass) or locClass or "" -- CoA: current class name + _G[entry..i.."NameNormalText"]:SetText(icon .. format("%s (%s)", DS:GetColoredCharacterName(character) or "?", className)) _G[entry..i.."Level"]:SetText(GREEN .. (DS:GetCharacterLevel(character) or 0)) end diff --git a/Altoholic/Altoholic.toc b/Altoholic/Altoholic.toc index c3b60cc..5a1a2d4 100644 --- a/Altoholic/Altoholic.toc +++ b/Altoholic/Altoholic.toc @@ -13,7 +13,7 @@ ## Author: Thaoky, Telkar-RG ## X-Edited-By: Exiles (Sub-Net) — florian.berthold@sub-net.at -## Version: 3.3.002b-coa.22 +## Version: 3.3.002b-coa.23 ## X-Category: Inventory, Tradeskill, Mail ## X-Localizations: enUS, frFR, zhCN, zhTW, deDE, koKR, esES, esMX, ruRU ## X-Website: http://wow.curse.com/downloads/wow-addons/details/altoholic.aspx diff --git a/Altoholic/Characters.lua b/Altoholic/Characters.lua index 8a6d365..c2699b4 100644 --- a/Altoholic/Characters.lua +++ b/Altoholic/Characters.lua @@ -98,6 +98,7 @@ local function AddRealm(AccountName, RealmName) professions[#professions + 1] = { name = p.name, rank = p.rank or 0, + maxRank = p.maxRank or 0, -- CoA: needed for the "rank/max" display in the vertical Skills list spellID = DataStore:GetProfessionSpellID(p.name), } end diff --git a/Altoholic/CoAClassColors.lua b/Altoholic/CoAClassColors.lua index 29b8888..799b096 100644 --- a/Altoholic/CoAClassColors.lua +++ b/Altoholic/CoAClassColors.lua @@ -115,3 +115,23 @@ function Alto:GetCoAClassIcon(token) if not tc then return end return COA_CLASS_ICON_TEXTURE, tc[1], tc[2], tc[3], tc[4] end + +-- CoA renamed its classes, but UnitClass()/DataStore still return the OLD tokens +-- (PROPHET, MONK, …). Map them to the current display names. Source: coa-omen/README-CoA.md. +-- Tokens not listed here keep their normal localized name (returns nil). +local COA_CLASS_NAMES = { + HERO = "Hero", BARBARIAN = "Barbarian", WITCHDOCTOR = "Witch Doctor", + DEMONHUNTER = "Felsworn", WITCHHUNTER = "Witch Hunter", STORMBRINGER = "Stormbringer", + FLESHWARDEN = "Knight of Xoroth", GUARDIAN = "Guardian", MONK = "Templar", + SONOFARUGAL = "Bloodmage", RANGER = "Ranger", CHRONOMANCER = "Chronomancer", + NECROMANCER = "Necromancer", PYROMANCER = "Pyromancer", CULTIST = "Cultist", + STARCALLER = "Starcaller", SUNCLERIC = "Sun Cleric", TINKER = "Tinker", + PROPHET = "Venomancer", REAPER = "Reaper", WILDWALKER = "Primalist", + SPIRITMAGE = "Runemaster", +} + +-- Current CoA display name for a class token, or nil if unmapped (caller falls back). +function Alto:GetCoAClassName(token) + if type(token) ~= "string" then return end + return COA_CLASS_NAMES[token] +end diff --git a/Altoholic/Frames/Skills.lua b/Altoholic/Frames/Skills.lua index c9b8564..413a2d3 100644 --- a/Altoholic/Frames/Skills.lua +++ b/Altoholic/Frames/Skills.lua @@ -87,8 +87,9 @@ function ns:Update() _G[e.."NameNormalText"]:SetWidth(680) if item.kind == "header" then - local _, class = DS:GetCharacterClass(item.character) - _G[e.."NameNormalText"]:SetText( (DS:GetColoredCharacterName(item.character) or "?") .. " " .. WHITE .. "(" .. (class or "") .. ")" ) + local locClass, engClass = DS:GetCharacterClass(item.character) + local className = Altoholic:GetCoAClassName(engClass) or locClass or "" -- CoA: PROPHET->Venomancer, MONK->Templar, … + _G[e.."NameNormalText"]:SetText( (DS:GetColoredCharacterName(item.character) or "?") .. " " .. WHITE .. "(" .. className .. ")" ) else local iconEsc = "" if item.spellID then From 14dd30e9a9645073c504453d857eae30b72c37d1 Mon Sep 17 00:00:00 2001 From: Florian Berthold Date: Fri, 29 May 2026 22:50:04 +0200 Subject: [PATCH 08/14] coa.24: revert char-view profession grid to clean 2-slot original The relocated Prof1-8 block (coa.20) was jumbled below the dropdowns in the narrow char-view panel. Restored Prof1/Prof2 in the original bottom row (Cooking/First Aid/Prof1/Prof2); removed Prof3-8. Full profession list stays on the Skills tab. No crash (loop stops at Prof2). --- Altoholic/Altoholic.lua | 2 +- Altoholic/Altoholic.toc | 2 +- Altoholic/Frames/TabCharacters.xml | 48 ++---------------------------- 3 files changed, 4 insertions(+), 48 deletions(-) diff --git a/Altoholic/Altoholic.lua b/Altoholic/Altoholic.lua index c497779..012f338 100644 --- a/Altoholic/Altoholic.lua +++ b/Altoholic/Altoholic.lua @@ -338,7 +338,7 @@ function addon:OnEnable() -- CoA: use a Lua constant, not GetAddOnMetadata — TOC metadata is cached at game launch -- and does NOT refresh on /reload, so the .toc version looked stale ("still .18"). A Lua -- constant re-evaluates on every /reload, giving a truthful loaded-code version. Bump with the .toc. - AltoholicFrameName:SetText("Altoholic |cFFFFFFFF3.3.002b-coa.23|r") + AltoholicFrameName:SetText("Altoholic |cFFFFFFFF3.3.002b-coa.24|r") local realm = GetRealmName() local player = UnitName("player") diff --git a/Altoholic/Altoholic.toc b/Altoholic/Altoholic.toc index 5a1a2d4..ce64f22 100644 --- a/Altoholic/Altoholic.toc +++ b/Altoholic/Altoholic.toc @@ -13,7 +13,7 @@ ## Author: Thaoky, Telkar-RG ## X-Edited-By: Exiles (Sub-Net) — florian.berthold@sub-net.at -## Version: 3.3.002b-coa.23 +## Version: 3.3.002b-coa.24 ## X-Category: Inventory, Tradeskill, Mail ## X-Localizations: enUS, frFR, zhCN, zhTW, deDE, koKR, esES, esMX, ruRU ## X-Website: http://wow.curse.com/downloads/wow-addons/details/altoholic.aspx diff --git a/Altoholic/Frames/TabCharacters.xml b/Altoholic/Frames/TabCharacters.xml index 8cdfad4..0a7c85e 100644 --- a/Altoholic/Frames/TabCharacters.xml +++ b/Altoholic/Frames/TabCharacters.xml @@ -245,8 +245,8 @@ @@ -257,50 +257,6 @@ - - - - - - - + + + + + + + + + + +