coa.3: guard XP getters in DataStore_Characters for partial records
release / release (push) Successful in 5s

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.
This commit is contained in:
2026-05-28 22:40:04 +02:00
parent 961290d9bd
commit b332499098
4 changed files with 10 additions and 5 deletions
@@ -206,7 +206,9 @@ local function _GetXP(character)
end
local function _GetXPRate(character)
return floor((character.XP / character.XPMax) * 100)
local xpMax = character.XPMax or 0 -- CoA: comm-seeded / max-level / unscanned char has no XP data (also avoids /0)
if xpMax == 0 then return 0 end
return floor(((character.XP or 0) / xpMax) * 100)
end
local function _GetXPMax(character)
@@ -234,7 +236,7 @@ local function _GetRestXPRate(character)
-- divide rest xp by this value 20400 / 204 = 100 ==> rest xp rate
local rate = 0
if character.RestXP then
if character.RestXP and character.XPMax and character.XPMax > 0 then -- CoA: guard nil/zero XPMax
rate = (character.RestXP / ((character.XPMax / 100) * 1.5))
end
@@ -242,7 +244,7 @@ local function _GetRestXPRate(character)
-- (elapsed time / 3600) * 0.625 * (2/3) simplifies to elapsed time / 8640
-- 0.625 comes from 8 hours rested = 5% of a level, *2/3 because 100% rested = 150% of xp (1.5 level)
if character.lastLogoutTimestamp ~= 0 then -- time since last logout, 0 for current char, <> for all others
if character.lastLogoutTimestamp and character.lastLogoutTimestamp ~= 0 then -- time since last logout, 0 for current char, <> for all others (CoA: nil for comm-seeded chars => "nil ~= 0" is true and crashed)
if character.isResting then
rate = rate + ((time() - character.lastLogoutTimestamp) / 8640)
else