Compare commits

..

No commits in common. "master" and "3.3.002b-coa.22" have entirely different histories.

24 changed files with 80 additions and 114 deletions

View file

@ -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.30|r")
AltoholicFrameName:SetText("Altoholic |cFFFFFFFF3.3.002b-coa.22|r")
local realm = GetRealmName()
local player = UnitName("player")
@ -608,17 +608,13 @@ 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 "", className), 1, 1, 1)
GREEN..(DS:GetCharacterLevel(character) or 0), DS:GetCharacterRace(character) or "", DS:GetCharacterClass(character) or ""), 1, 1, 1)
end
function Altoholic:SetCharacterRowNameLevel(entry, i, icon, character)
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.."NameNormalText"]:SetText(icon .. format("%s (%s)", DS:GetColoredCharacterName(character) or "?", DS:GetCharacterClass(character) or ""))
_G[entry..i.."Level"]:SetText(GREEN .. (DS:GetCharacterLevel(character) or 0))
end

View file

@ -13,7 +13,7 @@
## Author: Thaoky, Telkar-RG
## X-Edited-By: Exiles (Sub-Net) — florian.berthold@sub-net.at
## Version: 3.3.002b-coa.30
## 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

View file

@ -98,7 +98,6 @@ 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

View file

@ -115,23 +115,3 @@ 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

View file

@ -168,7 +168,7 @@ end
function ns:Update()
local VisibleLines = 18
local VisibleLines = 20
local frame = "AltoholicFrameSummary"
local entry = frame.."Entry"

View file

@ -23,7 +23,7 @@ local ns = addon.Activity -- ns = namespace
local Characters = addon.Characters
function ns:Update()
local VisibleLines = 18
local VisibleLines = 20
local frame = "AltoholicFrameActivity"
local entry = frame.."Entry"

View file

@ -22,7 +22,7 @@ local ns = addon.BagUsage -- ns = namespace
local Characters = addon.Characters
function ns:Update()
local VisibleLines = 18
local VisibleLines = 20
local frame = "AltoholicFrameBagUsage"
local entry = frame.."Entry"

View file

@ -72,7 +72,7 @@ function ns:Update()
BuildView()
end
local VisibleLines = 18
local VisibleLines = 20
local frame = "AltoholicFrameGuildBankTabs"
local entry = frame.."Entry"

View file

@ -285,7 +285,7 @@ function ns:Update()
BuildView()
end
local VisibleLines = 17
local VisibleLines = 20
local frame = "AltoholicFrameGuildMembers"
local entry = frame.."Entry"

View file

@ -221,7 +221,7 @@ function ns:Update()
BuildView()
end
local VisibleLines = 18
local VisibleLines = 20
local frame = "AltoholicFrameGuildProfessions"
local entry = frame.."Entry"

View file

@ -34,7 +34,7 @@ function ns:Update()
local character = addon.Tabs.Characters:GetCurrent()
local VisibleLines = 18
local VisibleLines = 20
local frame = "AltoholicFrameQuests"
local entry = frame.."Entry"

View file

@ -218,7 +218,7 @@ end
function ns:Update()
local currentProfession = addon.TradeSkills.CurrentProfession
local VisibleLines = 18
local VisibleLines = 20
local frame = "AltoholicFrameRecipes"
local entry = frame.."Entry"

View file

@ -30,7 +30,7 @@ local inset = 2
function ns:Update()
local VisibleLines = 18
local VisibleLines = 20
local frame = "AltoholicFrameSkills"
local entry = frame.."Entry"
local DS = DataStore
@ -66,7 +66,6 @@ function ns:Update()
items[#items + 1] = { kind = "skill", viewLine = viewLine, character = character,
spellID = 33388, name = (L and L["Riding"]) or "Riding", rank = riding, maxRank = 300 }
end
items[#items + 1] = { kind = "spacer" } -- blank row between characters
end
end
@ -77,44 +76,26 @@ function ns:Update()
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 == "spacer" then
-- blank separator row between characters
_G[e.."Name"]:SetPoint("TOPLEFT", 15, 0)
_G[e.."NameNormalText"]:SetText("")
_G[e.."Level"]:SetText("")
elseif item.kind == "header" then
-- character header: gold "Name (Class)" across the row, no rank column
_G[e.."Name"]:SetPoint("TOPLEFT", 12, 0)
_G[e.."Name"]:SetWidth(420)
_G[e.."NameNormalText"]:SetWidth(420)
local cname = Characters:GetInfo(item.viewLine) or "?" -- name from the key, always present (scanned char.name can be nil)
local locClass, engClass = DS:GetCharacterClass(item.character)
local className = Altoholic:GetCoAClassName(engClass) or locClass or "" -- CoA: PROPHET->Venomancer, MONK->Templar, …
local classColor = DS:GetClassColor(item.character) or WHITE
_G[e.."NameNormalText"]:SetText( classColor .. cname .. "|r " .. WHITE .. "(" .. className .. ")" )
_G[e.."Level"]:SetText("")
if item.kind == "header" then
local _, class = DS:GetCharacterClass(item.character)
_G[e.."NameNormalText"]:SetText( (DS:GetColoredCharacterName(item.character) or "?") .. " " .. WHITE .. "(" .. (class or "") .. ")" )
else
-- profession row: [icon] name in the Name cell (indented), rank/max in its own column
local iconEsc = ""
if item.spellID then
iconEsc = addon:TextureToFontstring2(addon:GetSpellIcon(item.spellID), size, size, inset, inset, inset, inset) .. " "
end
_G[e.."Name"]:SetPoint("TOPLEFT", 34, 0)
_G[e.."Name"]:SetWidth(170)
_G[e.."NameNormalText"]:SetWidth(170)
_G[e.."NameNormalText"]:SetText( iconEsc .. WHITE .. item.name )
local cap = (item.maxRank > 0) and item.maxRank or 450
_G[e.."Level"]:SetPoint("TOPLEFT", 195, 0)
_G[e.."Level"]:SetWidth(120)
_G[e.."Level"]:SetJustifyH("LEFT")
_G[e.."Level"]:SetText( ns:GetColor(item.rank, cap) .. item.rank .. " / " .. item.maxRank )
_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)

View file

@ -34,7 +34,7 @@
<Button name="AltoSkillsTemplate" virtual="true">
<Size>
<AbsDimension x="615" y="22"/>
<AbsDimension x="745" y="22"/>
</Size>
<Layers>
<Layer level="BACKGROUND">
@ -194,7 +194,7 @@
<Frame name="AltoholicFrameSkills" parent="AltoholicTabSummary" hidden="true">
<Size>
<AbsDimension x="615" y="414"/>
<AbsDimension x="745" y="414"/>
</Size>
<Anchors>
<Anchor point="TOPRIGHT">

View file

@ -243,44 +243,63 @@
</Anchor>
</Anchors>
</Button>
<!-- CoA: a character can learn every profession. Lay the profession quick-icons out
as a wrapped 4-per-row grid in the open middle-left area (the taller window has room
below the Character dropdown). UpdateViewIcons fills/hides Prof1..12 dynamically. -->
<Button name="$parent_Prof1" inherits="AltoViewIconTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="AltoholicTabCharacters" relativePoint="TOPLEFT"><Offset x="30" y="-205" /></Anchor></Anchors>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="AltoholicTabCharacters" relativePoint="TOPLEFT" >
<Offset x="30" y="-235" />
</Anchor>
</Anchors>
</Button>
<Button name="$parent_Prof2" inherits="AltoViewIconTemplate">
<Anchors><Anchor point="BOTTOMLEFT" relativeTo="$parent_Prof1" relativePoint="BOTTOMRIGHT"><Offset x="5" y="0" /></Anchor></Anchors>
<Anchors>
<Anchor point="BOTTOMLEFT" relativeTo="$parent_Prof1" relativePoint="BOTTOMRIGHT" >
<Offset x="5" y="0" />
</Anchor>
</Anchors>
</Button>
<Button name="$parent_Prof3" inherits="AltoViewIconTemplate">
<Anchors><Anchor point="BOTTOMLEFT" relativeTo="$parent_Prof2" relativePoint="BOTTOMRIGHT"><Offset x="5" y="0" /></Anchor></Anchors>
<!-- CoA: characters can know many more than 2 primary professions. Extra slots;
UpdateViewIcons fills/hides them dynamically and stops at the last one. -->
<Button name="$parent_Prof3" inherits="AltoViewIconTemplate" hidden="true">
<Anchors>
<Anchor point="BOTTOMLEFT" relativeTo="$parent_Prof2" relativePoint="BOTTOMRIGHT" >
<Offset x="5" y="0" />
</Anchor>
</Anchors>
</Button>
<Button name="$parent_Prof4" inherits="AltoViewIconTemplate">
<Anchors><Anchor point="BOTTOMLEFT" relativeTo="$parent_Prof3" relativePoint="BOTTOMRIGHT"><Offset x="5" y="0" /></Anchor></Anchors>
<Button name="$parent_Prof4" inherits="AltoViewIconTemplate" hidden="true">
<Anchors>
<Anchor point="BOTTOMLEFT" relativeTo="$parent_Prof3" relativePoint="BOTTOMRIGHT" >
<Offset x="5" y="0" />
</Anchor>
</Anchors>
</Button>
<Button name="$parent_Prof5" inherits="AltoViewIconTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="$parent_Prof1" relativePoint="BOTTOMLEFT"><Offset x="0" y="-5" /></Anchor></Anchors>
<Button name="$parent_Prof5" inherits="AltoViewIconTemplate" hidden="true">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="$parent_Prof1" relativePoint="BOTTOMLEFT" >
<Offset x="5" y="0" />
</Anchor>
</Anchors>
</Button>
<Button name="$parent_Prof6" inherits="AltoViewIconTemplate">
<Anchors><Anchor point="BOTTOMLEFT" relativeTo="$parent_Prof5" relativePoint="BOTTOMRIGHT"><Offset x="5" y="0" /></Anchor></Anchors>
<Button name="$parent_Prof6" inherits="AltoViewIconTemplate" hidden="true">
<Anchors>
<Anchor point="BOTTOMLEFT" relativeTo="$parent_Prof5" relativePoint="BOTTOMRIGHT" >
<Offset x="5" y="0" />
</Anchor>
</Anchors>
</Button>
<Button name="$parent_Prof7" inherits="AltoViewIconTemplate">
<Anchors><Anchor point="BOTTOMLEFT" relativeTo="$parent_Prof6" relativePoint="BOTTOMRIGHT"><Offset x="5" y="0" /></Anchor></Anchors>
<Button name="$parent_Prof7" inherits="AltoViewIconTemplate" hidden="true">
<Anchors>
<Anchor point="BOTTOMLEFT" relativeTo="$parent_Prof6" relativePoint="BOTTOMRIGHT" >
<Offset x="5" y="0" />
</Anchor>
</Anchors>
</Button>
<Button name="$parent_Prof8" inherits="AltoViewIconTemplate">
<Anchors><Anchor point="BOTTOMLEFT" relativeTo="$parent_Prof7" relativePoint="BOTTOMRIGHT"><Offset x="5" y="0" /></Anchor></Anchors>
</Button>
<Button name="$parent_Prof9" inherits="AltoViewIconTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="$parent_Prof5" relativePoint="BOTTOMLEFT"><Offset x="0" y="-5" /></Anchor></Anchors>
</Button>
<Button name="$parent_Prof10" inherits="AltoViewIconTemplate">
<Anchors><Anchor point="BOTTOMLEFT" relativeTo="$parent_Prof9" relativePoint="BOTTOMRIGHT"><Offset x="5" y="0" /></Anchor></Anchors>
</Button>
<Button name="$parent_Prof11" inherits="AltoViewIconTemplate">
<Anchors><Anchor point="BOTTOMLEFT" relativeTo="$parent_Prof10" relativePoint="BOTTOMRIGHT"><Offset x="5" y="0" /></Anchor></Anchors>
</Button>
<Button name="$parent_Prof12" inherits="AltoViewIconTemplate">
<Anchors><Anchor point="BOTTOMLEFT" relativeTo="$parent_Prof11" relativePoint="BOTTOMRIGHT"><Offset x="5" y="0" /></Anchor></Anchors>
<Button name="$parent_Prof8" inherits="AltoViewIconTemplate" hidden="true">
<Anchors>
<Anchor point="BOTTOMLEFT" relativeTo="$parent_Prof7" relativePoint="BOTTOMRIGHT" >
<Offset x="5" y="0" />
</Anchor>
</Anchors>
</Button>
<Button name="$parent_Sort1" inherits="AltoSortButtonTemplate" id="1">

View file

@ -235,8 +235,7 @@ end
-- *** EVENT HANDLERS ***
function addon:PLAYER_ALIVE()
-- print("DataStore_Achievements.lua") -- DEBUG 2025 07 21
if addon.coaScannedThisSession then return end -- CoA: scan once at login (was ghost-gated, so data never saved on a normal login - the cause of "data not saved")
addon.coaScannedThisSession = true
if not UnitIsGhost("player") then return end -- only scan if player released spirit and went to graveyard
ScanAllAchievements()
ScanProgress()

View file

@ -546,8 +546,7 @@ end
-- *** Event Handlers ***
local function OnPlayerAlive()
-- print("DataStore_Crafts.lua") -- DEBUG 2025 07 21
if addon.coaScannedThisSession then return end -- CoA: scan once at login (was ghost-gated, so data never saved on a normal login - the cause of "data not saved")
addon.coaScannedThisSession = true
if not UnitIsGhost("player") then return end -- only scan if player released spirit and went to graveyard
ScanProfessionLinks()
end

View file

@ -46,8 +46,7 @@ end
-- *** Event Handlers ***
local function OnPlayerAlive()
-- print("DataStore_Pets.lua") -- DEBUG 2025 07 21
if addon.coaScannedThisSession then return end -- CoA: scan once at login (was ghost-gated, so data never saved on a normal login - the cause of "data not saved")
addon.coaScannedThisSession = true
if not UnitIsGhost("player") then return end -- only scan if player released spirit and went to graveyard
ScanCompanions("CRITTER")
ScanCompanions("MOUNT")

View file

@ -177,8 +177,7 @@ end
-- *** Event Handlers ***
local function OnPlayerAlive()
-- print("DataStore_Quests.lua") -- DEBUG 2025 07 21
if addon.coaScannedThisSession then return end -- CoA: scan once at login (was ghost-gated, so data never saved on a normal login - the cause of "data not saved")
addon.coaScannedThisSession = true
if not UnitIsGhost("player") then return end -- only scan if player released spirit and went to graveyard
ScanQuests()
end

View file

@ -177,8 +177,7 @@ end
-- *** EVENT HANDLERS ***
function addon:PLAYER_ALIVE()
-- print("DataStore_Reputations.lua") -- DEBUG 2025 07 21
if addon.coaScannedThisSession then return end -- CoA: scan once at login (was ghost-gated, so data never saved on a normal login - the cause of "data not saved")
addon.coaScannedThisSession = true
if not UnitIsGhost("player") then return end -- only scan if player released spirit and went to graveyard
ScanReputations()
end

View file

@ -239,8 +239,7 @@ end
-- *** EVENT HANDLERS ***
function addon:PLAYER_ALIVE()
-- print("DataStore_Skills.lua") -- DEBUG 2025 07 21
if addon.coaScannedThisSession then return end -- CoA: scan once at login (was ghost-gated, so data never saved on a normal login - the cause of "data not saved")
addon.coaScannedThisSession = true
if not UnitIsGhost("player") then return end -- only scan if player released spirit and went to graveyard
ScanSkills()
end

View file

@ -105,8 +105,7 @@ end
-- *** EVENT HANDLERS ***
function addon:PLAYER_ALIVE()
-- print("DataStore_Spells.lua") -- DEBUG 2025 07 21
if addon.coaScannedThisSession then return end -- CoA: scan once at login (was ghost-gated, so data never saved on a normal login - the cause of "data not saved")
addon.coaScannedThisSession = true
if not UnitIsGhost("player") then return end -- only scan if player released spirit and went to graveyard
ScanSpells()
end

View file

@ -156,8 +156,7 @@ end
-- *** EVENT HANDLERS ***
function addon:PLAYER_ALIVE()
-- print("DataStore_Stats.lua") -- DEBUG 2025 07 21
if addon.coaScannedThisSession then return end -- CoA: scan once at login (was ghost-gated, so data never saved on a normal login - the cause of "data not saved")
addon.coaScannedThisSession = true
if not UnitIsGhost("player") then return end -- only scan if player released spirit and went to graveyard
ScanStats()
end

View file

@ -419,8 +419,7 @@ end
-- *** EVENT HANDLERS ***
function addon:PLAYER_ALIVE()
-- print("DataStore_Talents.lua") -- DEBUG 2025 07 21
if addon.coaScannedThisSession then return end -- CoA: scan once at login (was ghost-gated, so data never saved on a normal login - the cause of "data not saved")
addon.coaScannedThisSession = true
if not UnitIsGhost("player") then return end -- only scan if player released spirit and went to graveyard
ScanTalents()
ScanTalentReference()