coa.17: comprehensive partial-data hardening + DataStore_Characters login scan + Skills strip cap
release / release (push) Successful in 5s

- 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.
This commit is contained in:
2026-05-29 19:53:03 +02:00
parent b8d619c3bb
commit 0a56cbe560
12 changed files with 68 additions and 50 deletions
@@ -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)