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.
- 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.
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).
- 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.
DataStore_Talents._GetTreeReference degrades to nil (was assert) when a custom class
(MONK, etc.) has no/partial talent reference data; Talents.lua skips background render
when GetTreeInfo returns no bg.
GetRestedXP did 'rate * coeff' on a nil DS:GetRestXPRate result (crashed Account
Summary). Guarded it, plus defensive nil->0 on the two common string helpers.
SetItemButtonTexture now guards a nil IconTexture (was crashing whenever a button
didn't exist). UpdateViewIcons profession loop stops at the last existing _ProfN
button instead of indexing a nil frame; added _Prof3..8 so CoA chars (which can know
many professions) show more than 2. This was blocking the character detail view from
rendering when you clicked a char in the Account Summary.
$parentSkill1 inherited AltoSkillButtonTemplate AND redefined a $parentNormalText
ButtonText -> duplicate global name left Skill1NormalText nil and crashed the Skills
tab on open. Made $parentSkill1 self-contained (own 325px ButtonText + scripts).
- Reputation view rebuilt data-driven from each char's scanned factions grouped
by in-game category; CoA custom factions (and future ones) appear automatically.
Old hardcoded tree kept only as an icon lookup.
- CoA custom-class icons (classes 12-32) render from bundled atlas
Altoholic/images/coa-classes.blp (texcoords from coa-details) instead of the
Warrior glue-icon fallback in ShowClassIcons.
- Skills tab shows ALL known professions (dynamic list incl Woodcutting/Woodworking),
not 2 fixed slots; DataStore_Skills scans on PLAYER_ENTERING_WORLD/SKILL_LINES_CHANGED
(fixes 'no profession data' that only scanned on ghost-release).
- Title bar: 'Altoholic <toc version>' (was 'Altoholic v.. by Thaoky (Edited by
Telkar-RG 1.04a)'); reads GetAddOnMetadata Version so it tracks releases. Drop
dead VERSION_STRING.
- Default UIScale 1.0 -> 1.4 (~AtlasLoot 1105x640). Apply scale in OnShow (was only
applied after visiting Options); one-time migration bumps old-default profiles.
Options reset/default slider -> 1.4.
GetColor() did floor(rank/..) with no nil-guard and riding did 'field >= 300';
skillRank1/2/cooking/firstaid/fishing/riding are nil for chars DataStore_Characters
hasn't scanned. GetColor now defaults rank to 0 and each field falls back to 0.
- Extract AddCharacterTooltipHeader() + SetCharacterRowNameLevel() (Altoholic.lua);
nil-guards centralized, callers in AccountSummary/Activity/BagUsage/Skills/tooltip.
- Fix sites the manual sweep missed: Skills.lua (row + skill ranks), Keys.lua x3,
ShowClassIcons sort (Altoholic.lua:705, getters bypass their own or-0 via the wrapper).
- Restore login scan: OnPlayerAlive was ghost-only (fdcb25a) so iLvl never populated;
now scans once per session. Removed dated DEBUG leftovers.
Title drops Telkar-RG's personal 1.04a; now 'Altoholic (Exiles)'.
Author keeps Thaoky/Telkar-RG credit. Bundles the frame partial-record
guards from the previous commit.
DataStore char-based getters return *no value* for any module that hasn't
scanned a given char (DataStore.lua: 'if not arg1.lastUpdate then return end').
Fresh CoA alts have partial per-module data, so the frames crashed feeding
'no value' into format()/concat/arithmetic/pairs. Guarded every such site:
AccountSummary, Activity, BagUsage, Quests, Reputations, TabCharacters,
DrawCharacterTooltip, recipe tooltip. No DataStore contract change.
GetXPRate / GetRestXPRate did raw arithmetic on character.XP / .XPMax /
.lastLogoutTimestamp, which are nil for own alts seen via guild comm but
never fully scanned. Crashed AccountSummary on Vol'jin - CoA Beta.
Re-sync after coa-ace3 9583952 backported WoWUIDev/Ace3 PR #10 which fixes
the AceDB-3.0 simple-value defaults metatable: previously falsy defaults
like ["*"] = false read back as nil because of `k2~=nil and v or nil`
short-circuiting. Now they round-trip correctly.
Re-sync after coa-ace3 3ec2009 added two CoA-compat patches:
- AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua: parent
falls back to UIParent when InterfaceOptionsFramePanelContainer is nil
- AceConfig-3.0/AceConfigDialog-3.0: Settings.* block guarded with
fallback to InterfaceOptions_AddCategory on WotLK-era clients
Without these, every addon registering a Blizzard Interface Options
panel via AceConfigDialog errors on load on the CoA client.
Re-sync after coa-ace3 d422ad3 which converted 42 numeric FileDataIDs in
Set*Texture() calls back to string paths. Upstream Ace3 uses FDIDs which
silently fail on WoW 3.3.5 / CoA, rendering color swatches, checkboxes
and window chrome as solid-red placeholders.
Altoholic's DataStore_Crafts hardcodes a ProfessionSpellID lookup so
the localized profession name received over guild comms can be
resolved back to a canonical English key (see GetProfessionID at
DataStore_Crafts.lua:95). Stock table covers the vanilla 15
professions only.
The Voljin/PTR realm adds two custom tradeskills:
* Woodcutting — base spell 13977860 (single-rank gathering skill,
parallels Mining/Herbalism shape)
* Woodworking — Apprentice 1005008, Journeyman 1005009,
Expert 1005010, Artisan 1005011 (matches the
vanilla 75/150/225/300 rank ladder)
Without this, the local TRADE_SKILL_SHOW data is still captured by
the runtime API path, but the cross-character / cross-locale sync
through GuildBroadcast falls through to the linear scan and never
finds a matching ID — guildmates' Woodcutting/Woodworking ranks
don't propagate.
IDs cross-referenced against coa-professionmenu/ProfessionMenu.lua
:200-206 (the in-house CoA profession panel which enumerates these
exact IDs) and verified against db.exil.es (/spell/13977860 →
"Woodcutting", /spell/1005011 → "Artisan Woodworking").
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.