coa.3: guard XP getters in DataStore_Characters for partial records
release / release (push) Successful in 5s
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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user