f53f3e3f0f
Vanilla Altoholic hardcodes a 10-entry ChatColor table keyed by the
englishClass tokens MAGE/WARRIOR/.../DEATHKNIGHT. On the CoA Voljin/PTR
realm UnitClass / GetGuildRosterInfo return tokens like BARBARIAN,
WITCHDOCTOR, CHRONOMANCER, … so the lookup falls through:
* Altoholic:GetClassColor (Altoholic.lua:580) returns WHITE for all
21 CoA classes via the `or WHITE` fallback — guild/character/
profession panes lose their per-class colours.
* DataStore_Characters._GetColoredCharacterName had no fallback at
all — `ClassColors[englishClass] .. character.name` hard-crashed
on nil-concat for any CoA-class character.
* Altoholic.lua:710 read CLASS_ICON_TCOORDS[class] for the character
portrait without a fallback; CoA classes aren't in the vanilla
sprite sheet's coord table, so the next line `tc[1]` crashed.
Fix follows the established Exiles addon-port pattern (see
coa-omen/CoAClassColors.lua, coa-shadowedunitframes/.../CoAClassColors.lua,
coa-kui-nameplates/.../CoAClassColors.lua): mirror _G.RAID_CLASS_COLORS
into the addon's private table at load. The CoA client itself ships
the realm-authoritative 32-token palette (10 vanilla + HERO + 21 CoA)
in Interface/SharedXML/SharedConstants.lua inside patch-B.MPQ, which
populates RAID_CLASS_COLORS at FrameXML load time — see
db.exil.es /coa/dev for the full table.
- Altoholic/CoAClassColors.lua: new file, mirrors source palette into
Altoholic.ClassInfo as "|cFFRRGGBB" ChatColor escapes. Never
overwrites — preserves the addon's vanilla defaults and any future
user overrides.
- Altoholic/Altoholic.xml: loads CoAClassColors.lua after Altoholic.lua
so Altoholic.ClassInfo exists.
- Altoholic/Altoholic.lua: defensive CLASS_ICON_TCOORDS lookup with
WARRIOR fallback (wrong icon beats crash; CoA character creation
uses its own sprite sheet which doesn't extend the vanilla table).
- DataStore_Characters/DataStore_Characters.lua: inline mirror after
the local ClassColors table (can't be touched from a sibling file
because the table is file-local), plus `or WHITE` defensive fallback
in _GetColoredCharacterName and _GetClassColor.
Does not touch DataStore_Talents — CoA's MoA system uses
C_CharacterAdvancement, not GetNumTalentTabs/GetTalentInfo, so that
module needs a full API rewrite rather than a data patch.
48 lines
1.8 KiB
Lua
48 lines
1.8 KiB
Lua
-- CoAClassColors.lua
|
|
--
|
|
-- Mirrors the live client's RAID_CLASS_COLORS palette into
|
|
-- Altoholic.ClassInfo so the guild/character/profession panes render
|
|
-- the 21 Conquest-of-Azeroth custom classes (plus HERO) instead of
|
|
-- defaulting to WHITE via the `or WHITE` fallback at
|
|
-- Altoholic.lua:581.
|
|
--
|
|
-- Background
|
|
-- ----------
|
|
-- Altoholic ships a hardcoded ChatColor table keyed by the 10 vanilla
|
|
-- englishClass tokens (Altoholic.lua:23-32). On the CoA Voljin/PTR
|
|
-- realm, UnitClass / GetGuildRosterInfo return tokens like BARBARIAN,
|
|
-- WITCHDOCTOR, CHRONOMANCER, … which fall through the table.
|
|
--
|
|
-- The realm-authoritative palette is shipped by the client itself in
|
|
-- _G.RAID_CLASS_COLORS (Interface/SharedXML/SharedConstants.lua inside
|
|
-- patch-B.MPQ — 10 vanilla + HERO + 21 CoA = 32 entries on Voljin).
|
|
-- Other Exiles addon ports follow the same mirror pattern
|
|
-- (coa-omen/CoAClassColors.lua → CUSTOM_CLASS_COLORS,
|
|
-- coa-shadowedunitframes/.../CoAClassColors.lua → SUF profile,
|
|
-- coa-kui-nameplates/.../CoAClassColors.lua → !ClassColors).
|
|
--
|
|
-- Source of truth: db.exil.es /coa/dev for the full palette;
|
|
-- _G.RAID_CLASS_COLORS at FrameXML load time for the running client.
|
|
|
|
local AC = _G.Altoholic and _G.Altoholic.ClassInfo
|
|
if type(AC) ~= "table" then return end
|
|
|
|
local source = _G.RAID_CLASS_COLORS
|
|
if type(source) ~= "table" then return end
|
|
|
|
local function unpackColor(c)
|
|
if type(c) ~= "table" then return end
|
|
if c.GetRGB then return c:GetRGB() end
|
|
return c.r, c.g, c.b
|
|
end
|
|
|
|
for token, color in pairs(source) do
|
|
if AC[token] == nil then
|
|
local r, g, b = unpackColor(color)
|
|
if r and g and b then
|
|
AC[token] = string.format("|cFF%02X%02X%02X",
|
|
r * 255 + 0.5, g * 255 + 0.5, b * 255 + 0.5)
|
|
end
|
|
end
|
|
end
|