diff --git a/Altoholic/Altoholic.lua b/Altoholic/Altoholic.lua index 24aeb14..14faa05 100644 --- a/Altoholic/Altoholic.lua +++ b/Altoholic/Altoholic.lua @@ -765,23 +765,23 @@ function Altoholic:DrawCharacterTooltip(self, charName) AltoTooltip:ClearLines(); AltoTooltip:AddDoubleLine(DS:GetColoredCharacterName(character), DS:GetColoredCharacterFaction(character)) - AltoTooltip:AddLine(format("%s %s |r%s %s", L["Level"], - GREEN..DS:GetCharacterLevel(character), DS:GetCharacterRace(character), DS:GetCharacterClass(character)),1,1,1) + AltoTooltip:AddLine(format("%s %s |r%s %s", L["Level"], + GREEN..(DS:GetCharacterLevel(character) or 0), DS:GetCharacterRace(character) or "", DS:GetCharacterClass(character) or ""),1,1,1) local zone, subZone = DS:GetLocation(character) - AltoTooltip:AddLine(format("%s: %s |r(%s|r)", L["Zone"], GOLD..zone, GOLD..subZone),1,1,1) - + AltoTooltip:AddLine(format("%s: %s |r(%s|r)", L["Zone"], GOLD..(zone or "?"), GOLD..(subZone or "")),1,1,1) + local restXP = DS:GetRestXP(character) if restXP and restXP > 0 then AltoTooltip:AddLine(format("%s: %s", L["Rest XP"], GREEN..restXP),1,1,1) end - - AltoTooltip:AddLine("Average iLevel: " .. GREEN .. format("%.1f", DS:GetAverageItemLevel(character)),1,1,1); + + AltoTooltip:AddLine("Average iLevel: " .. GREEN .. format("%.1f", DS:GetAverageItemLevel(character) or 0),1,1,1); if IsAddOnLoaded("DataStore_Achievements") then - if DS:GetNumCompletedAchievements(character) > 0 then - AltoTooltip:AddLine(ACHIEVEMENTS_COMPLETED ..": " .. GREEN .. DS:GetNumCompletedAchievements(character) .. "/"..DS:GetNumAchievements(character)) - AltoTooltip:AddLine(ACHIEVEMENT_TITLE ..": " .. GREEN .. DS:GetNumAchievementPoints(character)) + if (DS:GetNumCompletedAchievements(character) or 0) > 0 then + AltoTooltip:AddLine(ACHIEVEMENTS_COMPLETED ..": " .. GREEN .. DS:GetNumCompletedAchievements(character) .. "/"..(DS:GetNumAchievements(character) or 0)) + AltoTooltip:AddLine(ACHIEVEMENT_TITLE ..": " .. GREEN .. (DS:GetNumAchievementPoints(character) or 0)) end end diff --git a/Altoholic/Frames/AccountSummary.lua b/Altoholic/Frames/AccountSummary.lua index 9815fc0..41b378c 100644 --- a/Altoholic/Frames/AccountSummary.lua +++ b/Altoholic/Frames/AccountSummary.lua @@ -249,12 +249,14 @@ function ns:Update() _G[entry..i.."Name"]:SetWidth(170) _G[entry..i.."Name"]:SetPoint("TOPLEFT", 10, 0) _G[entry..i.."NameNormalText"]:SetWidth(170) - _G[entry..i.."NameNormalText"]:SetText(icon .. format("%s (%s)", DS:GetColoredCharacterName(character), DS:GetCharacterClass(character))) - _G[entry..i.."Level"]:SetText(GREEN .. DS:GetCharacterLevel(character)) + -- CoA: DataStore char-based getters return *no value* for any module that hasn't scanned this char + -- (DataStore.lua: "if not arg1.lastUpdate then return end"). Fresh alts have partial module data, so guard every result. + _G[entry..i.."NameNormalText"]:SetText(icon .. format("%s (%s)", DS:GetColoredCharacterName(character) or "?", DS:GetCharacterClass(character) or "")) + _G[entry..i.."Level"]:SetText(GREEN .. (DS:GetCharacterLevel(character) or 0)) - _G[entry..i.."Money"]:SetText(addon:GetMoneyString(DS:GetMoney(character))) - _G[entry..i.."Played"]:SetText(addon:GetTimeString(DS:GetPlayTime(character))) - _G[entry..i.."XP"]:SetText(GREEN .. DS:GetXPRate(character) .. "%") + _G[entry..i.."Money"]:SetText(addon:GetMoneyString(DS:GetMoney(character) or 0)) + _G[entry..i.."Played"]:SetText(addon:GetTimeString(DS:GetPlayTime(character) or 0)) + _G[entry..i.."XP"]:SetText(GREEN .. (DS:GetXPRate(character) or 0) .. "%") if DS:GetCharacterLevel(character) == MAX_PLAYER_LEVEL then _G[entry..i.."Rested"]:SetText(WHITE .. "0%") @@ -262,7 +264,7 @@ function ns:Update() _G[entry..i.."Rested"]:SetText( addon:GetRestedXP(character) ) end - _G[entry..i.."AvgILevelNormalText"]:SetText(YELLOW..format("%.1f", DS:GetAverageItemLevel(character))) + _G[entry..i.."AvgILevelNormalText"]:SetText(YELLOW..format("%.1f", DS:GetAverageItemLevel(character) or 0)) elseif (lineType == INFO_TOTAL_LINE) then _G[entry..i.."Collapse"]:Hide() @@ -343,22 +345,22 @@ function ns:Level_OnEnter(frame) AltoTooltip:SetOwner(frame, "ANCHOR_RIGHT"); AltoTooltip:AddDoubleLine(DS:GetColoredCharacterName(character), DS:GetColoredCharacterFaction(character)) - AltoTooltip:AddLine(format("%s %s |r%s %s", L["Level"], - GREEN..DS:GetCharacterLevel(character), DS:GetCharacterRace(character), DS:GetCharacterClass(character)),1,1,1) + AltoTooltip:AddLine(format("%s %s |r%s %s", L["Level"], + GREEN..(DS:GetCharacterLevel(character) or 0), DS:GetCharacterRace(character) or "", DS:GetCharacterClass(character) or ""),1,1,1) local zone, subZone = DS:GetLocation(character) - AltoTooltip:AddLine(format("%s: %s |r(%s|r)", L["Zone"], GOLD..zone, GOLD..subZone),1,1,1) - + AltoTooltip:AddLine(format("%s: %s |r(%s|r)", L["Zone"], GOLD..(zone or "?"), GOLD..(subZone or "")),1,1,1) + local guildName = DS:GetGuildInfo(character) if guildName then AltoTooltip:AddLine(format("%s: %s", GUILD, GREEN..guildName),1,1,1) end - - AltoTooltip:AddLine(EXPERIENCE_COLON .. " " - .. GREEN .. DS:GetXP(character) .. WHITE .. "/" - .. GREEN .. DS:GetXPMax(character) .. WHITE .. " (" - .. GREEN .. DS:GetXPRate(character) .. "%" - .. WHITE .. ")",1,1,1); + + AltoTooltip:AddLine(EXPERIENCE_COLON .. " " + .. GREEN .. (DS:GetXP(character) or 0) .. WHITE .. "/" + .. GREEN .. (DS:GetXPMax(character) or 0) .. WHITE .. " (" + .. GREEN .. (DS:GetXPRate(character) or 0) .. "%" + .. WHITE .. ")",1,1,1); local restXP = DS:GetRestXP(character) if restXP and restXP > 0 then @@ -448,7 +450,7 @@ function ns:AIL_OnEnter(frame) AltoTooltip:ClearLines(); AltoTooltip:SetOwner(frame, "ANCHOR_RIGHT"); AltoTooltip:AddLine(DS:GetColoredCharacterName(character),1,1,1); - AltoTooltip:AddLine(WHITE .. L["Average Item Level"] ..": " .. GREEN.. format("%.1f", DS:GetAverageItemLevel(character)),1,1,1); + AltoTooltip:AddLine(WHITE .. L["Average Item Level"] ..": " .. GREEN.. format("%.1f", DS:GetAverageItemLevel(character) or 0),1,1,1); addon:AiLTooltip() AltoTooltip:Show(); diff --git a/Altoholic/Frames/Activity.lua b/Altoholic/Frames/Activity.lua index f4c13cf..4cc634d 100644 --- a/Altoholic/Frames/Activity.lua +++ b/Altoholic/Frames/Activity.lua @@ -100,8 +100,8 @@ function ns:Update() _G[entry..i.."Name"]:SetWidth(170) _G[entry..i.."Name"]:SetPoint("TOPLEFT", 10, 0) _G[entry..i.."NameNormalText"]:SetWidth(170) - _G[entry..i.."NameNormalText"]:SetText(icon .. format("%s (%s)", DS:GetColoredCharacterName(character), DS:GetCharacterClass(character))) - _G[entry..i.."Level"]:SetText(GREEN .. DS:GetCharacterLevel(character)) + _G[entry..i.."NameNormalText"]:SetText(icon .. format("%s (%s)", DS:GetColoredCharacterName(character) or "?", DS:GetCharacterClass(character) or "")) + _G[entry..i.."Level"]:SetText(GREEN .. (DS:GetCharacterLevel(character) or 0)) local color local num = DS:GetNumMails(character) or 0 @@ -112,7 +112,7 @@ function ns:Update() color = GREEN -- green by default, red if at least one mail is about to expire local threshold = DataStore:GetOption("DataStore_Mails", "MailWarningThreshold") - if DS:GetNumExpiredMails(character, threshold) > 0 then + if (DS:GetNumExpiredMails(character, threshold) or 0) > 0 then color = RED end end @@ -182,17 +182,17 @@ function ns:OnEnter(self) AltoTooltip:SetOwner(self, "ANCHOR_RIGHT"); AltoTooltip:AddDoubleLine(DS:GetColoredCharacterName(character), DS:GetColoredCharacterFaction(character)) - AltoTooltip:AddLine(format("%s %s |r%s %s", L["Level"], - GREEN..DS:GetCharacterLevel(character), DS:GetCharacterRace(character), DS:GetCharacterClass(character)),1,1,1) + AltoTooltip:AddLine(format("%s %s |r%s %s", L["Level"], + GREEN..(DS:GetCharacterLevel(character) or 0), DS:GetCharacterRace(character) or "", DS:GetCharacterClass(character) or ""),1,1,1) local zone, subZone = DS:GetLocation(character) - AltoTooltip:AddLine(format("%s: %s |r(%s|r)", L["Zone"], GOLD..zone, GOLD..subZone),1,1,1) - - AltoTooltip:AddLine(EXPERIENCE_COLON .. " " - .. GREEN .. DS:GetXP(character) .. WHITE .. "/" - .. GREEN .. DS:GetXPMax(character) .. WHITE .. " (" - .. GREEN .. DS:GetXPRate(character) .. "%" - .. WHITE .. ")",1,1,1); + AltoTooltip:AddLine(format("%s: %s |r(%s|r)", L["Zone"], GOLD..(zone or "?"), GOLD..(subZone or "")),1,1,1) + + AltoTooltip:AddLine(EXPERIENCE_COLON .. " " + .. GREEN .. (DS:GetXP(character) or 0) .. WHITE .. "/" + .. GREEN .. (DS:GetXPMax(character) or 0) .. WHITE .. " (" + .. GREEN .. (DS:GetXPRate(character) or 0) .. "%" + .. WHITE .. ")",1,1,1); local restXP = DS:GetRestXP(character) if restXP and restXP > 0 then diff --git a/Altoholic/Frames/BagUsage.lua b/Altoholic/Frames/BagUsage.lua index e2ef491..67ef1ed 100644 --- a/Altoholic/Frames/BagUsage.lua +++ b/Altoholic/Frames/BagUsage.lua @@ -96,26 +96,26 @@ function ns:Update() _G[entry..i.."Name"]:SetWidth(170) _G[entry..i.."Name"]:SetPoint("TOPLEFT", 10, 0) _G[entry..i.."NameNormalText"]:SetWidth(170) - _G[entry..i.."NameNormalText"]:SetText(icon .. format("%s (%s)", DS:GetColoredCharacterName(character), DS:GetCharacterClass(character))) - _G[entry..i.."Level"]:SetText(GREEN .. DS:GetCharacterLevel(character)) - - _G[entry..i.."FreeBags"]:SetText(GREEN .. DS:GetNumFreeBagSlots(character)) - _G[entry..i.."FreeBank"]:SetText(GREEN .. DS:GetNumFreeBankSlots(character)) + _G[entry..i.."NameNormalText"]:SetText(icon .. format("%s (%s)", DS:GetColoredCharacterName(character) or "?", DS:GetCharacterClass(character) or "")) + _G[entry..i.."Level"]:SetText(GREEN .. (DS:GetCharacterLevel(character) or 0)) + + _G[entry..i.."FreeBags"]:SetText(GREEN .. (DS:GetNumFreeBagSlots(character) or 0)) + _G[entry..i.."FreeBank"]:SetText(GREEN .. (DS:GetNumFreeBankSlots(character) or 0)) _G[entry..i.."BagSlotsNormalText"]:SetJustifyH("LEFT") _G[entry..i.."BankSlotsNormalText"]:SetJustifyH("LEFT") -- Normal bags _G[entry..i.."BagSlotsNormalText"]:SetText(format("%s/%s|r/%s|r/%s|r/%s |r(%s|r)", - DS:GetContainerSize(character, 0), - WHITE .. DS:GetContainerSize(character, 1), - WHITE .. DS:GetContainerSize(character, 2), - WHITE .. DS:GetContainerSize(character, 3), - WHITE .. DS:GetContainerSize(character, 4), - CYAN .. DS:GetNumBagSlots(character))) - + DS:GetContainerSize(character, 0) or 0, + WHITE .. (DS:GetContainerSize(character, 1) or 0), + WHITE .. (DS:GetContainerSize(character, 2) or 0), + WHITE .. (DS:GetContainerSize(character, 3) or 0), + WHITE .. (DS:GetContainerSize(character, 4) or 0), + CYAN .. (DS:GetNumBagSlots(character) or 0))) + -- Bank bags - if DS:GetNumBankSlots(character) < 28 then + if (DS:GetNumBankSlots(character) or 0) < 28 then _G[entry..i.."BankSlotsNormalText"]:SetText(L["Bank not visited yet"]) else _G[entry..i.."BankSlotsNormalText"]:SetText(format("%s/%s|r/%s|r/%s|r/%s|r/%s|r/%s|r/%s |r(%s|r)", @@ -183,8 +183,8 @@ function ns:OnEnter(self) AltoTooltip:ClearLines(); AltoTooltip:SetOwner(self, "ANCHOR_RIGHT"); AltoTooltip:AddDoubleLine(DS:GetColoredCharacterName(character), DS:GetColoredCharacterFaction(character)) - AltoTooltip:AddLine(format("%s %s |r%s %s", L["Level"], - GREEN..DS:GetCharacterLevel(character), DS:GetCharacterRace(character), DS:GetCharacterClass(character)),1,1,1) + AltoTooltip:AddLine(format("%s %s |r%s %s", L["Level"], + GREEN..(DS:GetCharacterLevel(character) or 0), DS:GetCharacterRace(character) or "", DS:GetCharacterClass(character) or ""),1,1,1) AltoTooltip:AddLine(" ",1,1,1); local id = self:GetID() @@ -203,7 +203,7 @@ function ns:OnEnter(self) end numSlots = DS:GetNumBagSlots(character) numFree = DS:GetNumFreeBagSlots(character) - elseif DS:GetNumBankSlots(character) < 28 then + elseif (DS:GetNumBankSlots(character) or 0) < 28 then AltoTooltip:AddLine(L["Bank not visited yet"],1,1,1); AltoTooltip:Show(); return diff --git a/Altoholic/Frames/Quests.lua b/Altoholic/Frames/Quests.lua index 4c3f02f..c2246f8 100644 --- a/Altoholic/Frames/Quests.lua +++ b/Altoholic/Frames/Quests.lua @@ -40,7 +40,7 @@ function ns:Update() local DS = DataStore - if DS:GetQuestLogSize(character) == 0 then + if (DS:GetQuestLogSize(character) or 0) == 0 then AltoholicTabCharactersStatus:SetText(L["No quest found for "] .. addon:GetCurrentCharacter()) addon:ClearScrollFrame( _G[ frame.."ScrollFrame" ], entry, VisibleLines, 18) return diff --git a/Altoholic/Frames/Reputations.lua b/Altoholic/Frames/Reputations.lua index 71bac7c..5046711 100644 --- a/Altoholic/Frames/Reputations.lua +++ b/Altoholic/Frames/Reputations.lua @@ -310,7 +310,7 @@ function ns:OnEnter(frame) AltoTooltip:SetOwner(frame, "ANCHOR_LEFT"); AltoTooltip:ClearLines(); - AltoTooltip:AddLine(DS:GetColoredCharacterName(character) .. WHITE .. " @ " .. TEAL .. faction,1,1,1); + AltoTooltip:AddLine((DS:GetColoredCharacterName(character) or "?") .. WHITE .. " @ " .. TEAL .. faction,1,1,1); rate = format("%d", floor(rate)) .. "%" AltoTooltip:AddLine(format("%s: %d/%d (%s)", status, currentLevel, maxLevel, rate),1,1,1 ) diff --git a/Altoholic/Frames/TabCharacters.lua b/Altoholic/Frames/TabCharacters.lua index 83bf46a..0b2babe 100644 --- a/Altoholic/Frames/TabCharacters.lua +++ b/Altoholic/Frames/TabCharacters.lua @@ -228,7 +228,7 @@ function ns:UpdateViewIcons() AltoholicTabCharacters_FirstAid:Show() local i = 1 - for skillName, skill in pairs(DS:GetPrimaryProfessions(character)) do + for skillName, skill in pairs(DS:GetPrimaryProfessions(character) or {}) do -- CoA: getter returns no value for chars DataStore_Crafts hasn't scanned local itemName = "AltoholicTabCharacters_Prof" .. i local item = _G[itemName] local spellID = DataStore:GetProfessionSpellID(skillName) diff --git a/Altoholic/Tooltip.lua b/Altoholic/Tooltip.lua index 345b4a3..6726406 100644 --- a/Altoholic/Tooltip.lua +++ b/Altoholic/Tooltip.lua @@ -448,7 +448,7 @@ local function GetRecipeOwners(professionName, link, recipeLevel) table.insert(know, coloredName) else local currentLevel = DataStore:GetSkillInfo(character, professionName) - if currentLevel > 0 then + if currentLevel and currentLevel > 0 then -- CoA: getter returns no value for chars DataStore_Skills hasn't scanned if currentLevel < recipeLevel then table.insert(willLearn, format("%s |r(%d)", coloredName, currentLevel)) else