Harden Altoholic frames against partial alt records (no-value char getters)
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.
This commit is contained in:
@@ -766,22 +766,22 @@ function Altoholic:DrawCharacterTooltip(self, charName)
|
|||||||
AltoTooltip:AddDoubleLine(DS:GetColoredCharacterName(character), DS:GetColoredCharacterFaction(character))
|
AltoTooltip:AddDoubleLine(DS:GetColoredCharacterName(character), DS:GetColoredCharacterFaction(character))
|
||||||
|
|
||||||
AltoTooltip:AddLine(format("%s %s |r%s %s", L["Level"],
|
AltoTooltip:AddLine(format("%s %s |r%s %s", L["Level"],
|
||||||
GREEN..DS:GetCharacterLevel(character), DS:GetCharacterRace(character), DS:GetCharacterClass(character)),1,1,1)
|
GREEN..(DS:GetCharacterLevel(character) or 0), DS:GetCharacterRace(character) or "", DS:GetCharacterClass(character) or ""),1,1,1)
|
||||||
|
|
||||||
local zone, subZone = DS:GetLocation(character)
|
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)
|
local restXP = DS:GetRestXP(character)
|
||||||
if restXP and restXP > 0 then
|
if restXP and restXP > 0 then
|
||||||
AltoTooltip:AddLine(format("%s: %s", L["Rest XP"], GREEN..restXP),1,1,1)
|
AltoTooltip:AddLine(format("%s: %s", L["Rest XP"], GREEN..restXP),1,1,1)
|
||||||
end
|
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 IsAddOnLoaded("DataStore_Achievements") then
|
||||||
if DS:GetNumCompletedAchievements(character) > 0 then
|
if (DS:GetNumCompletedAchievements(character) or 0) > 0 then
|
||||||
AltoTooltip:AddLine(ACHIEVEMENTS_COMPLETED ..": " .. GREEN .. DS:GetNumCompletedAchievements(character) .. "/"..DS:GetNumAchievements(character))
|
AltoTooltip:AddLine(ACHIEVEMENTS_COMPLETED ..": " .. GREEN .. DS:GetNumCompletedAchievements(character) .. "/"..(DS:GetNumAchievements(character) or 0))
|
||||||
AltoTooltip:AddLine(ACHIEVEMENT_TITLE ..": " .. GREEN .. DS:GetNumAchievementPoints(character))
|
AltoTooltip:AddLine(ACHIEVEMENT_TITLE ..": " .. GREEN .. (DS:GetNumAchievementPoints(character) or 0))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -249,12 +249,14 @@ function ns:Update()
|
|||||||
_G[entry..i.."Name"]:SetWidth(170)
|
_G[entry..i.."Name"]:SetWidth(170)
|
||||||
_G[entry..i.."Name"]:SetPoint("TOPLEFT", 10, 0)
|
_G[entry..i.."Name"]:SetPoint("TOPLEFT", 10, 0)
|
||||||
_G[entry..i.."NameNormalText"]:SetWidth(170)
|
_G[entry..i.."NameNormalText"]:SetWidth(170)
|
||||||
_G[entry..i.."NameNormalText"]:SetText(icon .. format("%s (%s)", DS:GetColoredCharacterName(character), DS:GetCharacterClass(character)))
|
-- CoA: DataStore char-based getters return *no value* for any module that hasn't scanned this char
|
||||||
_G[entry..i.."Level"]:SetText(GREEN .. DS:GetCharacterLevel(character))
|
-- (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.."Money"]:SetText(addon:GetMoneyString(DS:GetMoney(character) or 0))
|
||||||
_G[entry..i.."Played"]:SetText(addon:GetTimeString(DS:GetPlayTime(character)))
|
_G[entry..i.."Played"]:SetText(addon:GetTimeString(DS:GetPlayTime(character) or 0))
|
||||||
_G[entry..i.."XP"]:SetText(GREEN .. DS:GetXPRate(character) .. "%")
|
_G[entry..i.."XP"]:SetText(GREEN .. (DS:GetXPRate(character) or 0) .. "%")
|
||||||
|
|
||||||
if DS:GetCharacterLevel(character) == MAX_PLAYER_LEVEL then
|
if DS:GetCharacterLevel(character) == MAX_PLAYER_LEVEL then
|
||||||
_G[entry..i.."Rested"]:SetText(WHITE .. "0%")
|
_G[entry..i.."Rested"]:SetText(WHITE .. "0%")
|
||||||
@@ -262,7 +264,7 @@ function ns:Update()
|
|||||||
_G[entry..i.."Rested"]:SetText( addon:GetRestedXP(character) )
|
_G[entry..i.."Rested"]:SetText( addon:GetRestedXP(character) )
|
||||||
end
|
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
|
elseif (lineType == INFO_TOTAL_LINE) then
|
||||||
_G[entry..i.."Collapse"]:Hide()
|
_G[entry..i.."Collapse"]:Hide()
|
||||||
@@ -344,10 +346,10 @@ function ns:Level_OnEnter(frame)
|
|||||||
|
|
||||||
AltoTooltip:AddDoubleLine(DS:GetColoredCharacterName(character), DS:GetColoredCharacterFaction(character))
|
AltoTooltip:AddDoubleLine(DS:GetColoredCharacterName(character), DS:GetColoredCharacterFaction(character))
|
||||||
AltoTooltip:AddLine(format("%s %s |r%s %s", L["Level"],
|
AltoTooltip:AddLine(format("%s %s |r%s %s", L["Level"],
|
||||||
GREEN..DS:GetCharacterLevel(character), DS:GetCharacterRace(character), DS:GetCharacterClass(character)),1,1,1)
|
GREEN..(DS:GetCharacterLevel(character) or 0), DS:GetCharacterRace(character) or "", DS:GetCharacterClass(character) or ""),1,1,1)
|
||||||
|
|
||||||
local zone, subZone = DS:GetLocation(character)
|
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)
|
local guildName = DS:GetGuildInfo(character)
|
||||||
if guildName then
|
if guildName then
|
||||||
@@ -355,9 +357,9 @@ function ns:Level_OnEnter(frame)
|
|||||||
end
|
end
|
||||||
|
|
||||||
AltoTooltip:AddLine(EXPERIENCE_COLON .. " "
|
AltoTooltip:AddLine(EXPERIENCE_COLON .. " "
|
||||||
.. GREEN .. DS:GetXP(character) .. WHITE .. "/"
|
.. GREEN .. (DS:GetXP(character) or 0) .. WHITE .. "/"
|
||||||
.. GREEN .. DS:GetXPMax(character) .. WHITE .. " ("
|
.. GREEN .. (DS:GetXPMax(character) or 0) .. WHITE .. " ("
|
||||||
.. GREEN .. DS:GetXPRate(character) .. "%"
|
.. GREEN .. (DS:GetXPRate(character) or 0) .. "%"
|
||||||
.. WHITE .. ")",1,1,1);
|
.. WHITE .. ")",1,1,1);
|
||||||
|
|
||||||
local restXP = DS:GetRestXP(character)
|
local restXP = DS:GetRestXP(character)
|
||||||
@@ -448,7 +450,7 @@ function ns:AIL_OnEnter(frame)
|
|||||||
AltoTooltip:ClearLines();
|
AltoTooltip:ClearLines();
|
||||||
AltoTooltip:SetOwner(frame, "ANCHOR_RIGHT");
|
AltoTooltip:SetOwner(frame, "ANCHOR_RIGHT");
|
||||||
AltoTooltip:AddLine(DS:GetColoredCharacterName(character),1,1,1);
|
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()
|
addon:AiLTooltip()
|
||||||
AltoTooltip:Show();
|
AltoTooltip:Show();
|
||||||
|
|||||||
@@ -100,8 +100,8 @@ function ns:Update()
|
|||||||
_G[entry..i.."Name"]:SetWidth(170)
|
_G[entry..i.."Name"]:SetWidth(170)
|
||||||
_G[entry..i.."Name"]:SetPoint("TOPLEFT", 10, 0)
|
_G[entry..i.."Name"]:SetPoint("TOPLEFT", 10, 0)
|
||||||
_G[entry..i.."NameNormalText"]:SetWidth(170)
|
_G[entry..i.."NameNormalText"]:SetWidth(170)
|
||||||
_G[entry..i.."NameNormalText"]:SetText(icon .. format("%s (%s)", DS:GetColoredCharacterName(character), DS:GetCharacterClass(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))
|
_G[entry..i.."Level"]:SetText(GREEN .. (DS:GetCharacterLevel(character) or 0))
|
||||||
|
|
||||||
local color
|
local color
|
||||||
local num = DS:GetNumMails(character) or 0
|
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
|
color = GREEN -- green by default, red if at least one mail is about to expire
|
||||||
|
|
||||||
local threshold = DataStore:GetOption("DataStore_Mails", "MailWarningThreshold")
|
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
|
color = RED
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -183,15 +183,15 @@ function ns:OnEnter(self)
|
|||||||
|
|
||||||
AltoTooltip:AddDoubleLine(DS:GetColoredCharacterName(character), DS:GetColoredCharacterFaction(character))
|
AltoTooltip:AddDoubleLine(DS:GetColoredCharacterName(character), DS:GetColoredCharacterFaction(character))
|
||||||
AltoTooltip:AddLine(format("%s %s |r%s %s", L["Level"],
|
AltoTooltip:AddLine(format("%s %s |r%s %s", L["Level"],
|
||||||
GREEN..DS:GetCharacterLevel(character), DS:GetCharacterRace(character), DS:GetCharacterClass(character)),1,1,1)
|
GREEN..(DS:GetCharacterLevel(character) or 0), DS:GetCharacterRace(character) or "", DS:GetCharacterClass(character) or ""),1,1,1)
|
||||||
|
|
||||||
local zone, subZone = DS:GetLocation(character)
|
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)
|
||||||
|
|
||||||
AltoTooltip:AddLine(EXPERIENCE_COLON .. " "
|
AltoTooltip:AddLine(EXPERIENCE_COLON .. " "
|
||||||
.. GREEN .. DS:GetXP(character) .. WHITE .. "/"
|
.. GREEN .. (DS:GetXP(character) or 0) .. WHITE .. "/"
|
||||||
.. GREEN .. DS:GetXPMax(character) .. WHITE .. " ("
|
.. GREEN .. (DS:GetXPMax(character) or 0) .. WHITE .. " ("
|
||||||
.. GREEN .. DS:GetXPRate(character) .. "%"
|
.. GREEN .. (DS:GetXPRate(character) or 0) .. "%"
|
||||||
.. WHITE .. ")",1,1,1);
|
.. WHITE .. ")",1,1,1);
|
||||||
|
|
||||||
local restXP = DS:GetRestXP(character)
|
local restXP = DS:GetRestXP(character)
|
||||||
|
|||||||
@@ -96,26 +96,26 @@ function ns:Update()
|
|||||||
_G[entry..i.."Name"]:SetWidth(170)
|
_G[entry..i.."Name"]:SetWidth(170)
|
||||||
_G[entry..i.."Name"]:SetPoint("TOPLEFT", 10, 0)
|
_G[entry..i.."Name"]:SetPoint("TOPLEFT", 10, 0)
|
||||||
_G[entry..i.."NameNormalText"]:SetWidth(170)
|
_G[entry..i.."NameNormalText"]:SetWidth(170)
|
||||||
_G[entry..i.."NameNormalText"]:SetText(icon .. format("%s (%s)", DS:GetColoredCharacterName(character), DS:GetCharacterClass(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))
|
_G[entry..i.."Level"]:SetText(GREEN .. (DS:GetCharacterLevel(character) or 0))
|
||||||
|
|
||||||
_G[entry..i.."FreeBags"]:SetText(GREEN .. DS:GetNumFreeBagSlots(character))
|
_G[entry..i.."FreeBags"]:SetText(GREEN .. (DS:GetNumFreeBagSlots(character) or 0))
|
||||||
_G[entry..i.."FreeBank"]:SetText(GREEN .. DS:GetNumFreeBankSlots(character))
|
_G[entry..i.."FreeBank"]:SetText(GREEN .. (DS:GetNumFreeBankSlots(character) or 0))
|
||||||
|
|
||||||
_G[entry..i.."BagSlotsNormalText"]:SetJustifyH("LEFT")
|
_G[entry..i.."BagSlotsNormalText"]:SetJustifyH("LEFT")
|
||||||
_G[entry..i.."BankSlotsNormalText"]:SetJustifyH("LEFT")
|
_G[entry..i.."BankSlotsNormalText"]:SetJustifyH("LEFT")
|
||||||
|
|
||||||
-- Normal bags
|
-- Normal bags
|
||||||
_G[entry..i.."BagSlotsNormalText"]:SetText(format("%s/%s|r/%s|r/%s|r/%s |r(%s|r)",
|
_G[entry..i.."BagSlotsNormalText"]:SetText(format("%s/%s|r/%s|r/%s|r/%s |r(%s|r)",
|
||||||
DS:GetContainerSize(character, 0),
|
DS:GetContainerSize(character, 0) or 0,
|
||||||
WHITE .. DS:GetContainerSize(character, 1),
|
WHITE .. (DS:GetContainerSize(character, 1) or 0),
|
||||||
WHITE .. DS:GetContainerSize(character, 2),
|
WHITE .. (DS:GetContainerSize(character, 2) or 0),
|
||||||
WHITE .. DS:GetContainerSize(character, 3),
|
WHITE .. (DS:GetContainerSize(character, 3) or 0),
|
||||||
WHITE .. DS:GetContainerSize(character, 4),
|
WHITE .. (DS:GetContainerSize(character, 4) or 0),
|
||||||
CYAN .. DS:GetNumBagSlots(character)))
|
CYAN .. (DS:GetNumBagSlots(character) or 0)))
|
||||||
|
|
||||||
-- Bank bags
|
-- 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"])
|
_G[entry..i.."BankSlotsNormalText"]:SetText(L["Bank not visited yet"])
|
||||||
else
|
else
|
||||||
_G[entry..i.."BankSlotsNormalText"]:SetText(format("%s/%s|r/%s|r/%s|r/%s|r/%s|r/%s|r/%s |r(%s|r)",
|
_G[entry..i.."BankSlotsNormalText"]:SetText(format("%s/%s|r/%s|r/%s|r/%s|r/%s|r/%s|r/%s |r(%s|r)",
|
||||||
@@ -184,7 +184,7 @@ function ns:OnEnter(self)
|
|||||||
AltoTooltip:SetOwner(self, "ANCHOR_RIGHT");
|
AltoTooltip:SetOwner(self, "ANCHOR_RIGHT");
|
||||||
AltoTooltip:AddDoubleLine(DS:GetColoredCharacterName(character), DS:GetColoredCharacterFaction(character))
|
AltoTooltip:AddDoubleLine(DS:GetColoredCharacterName(character), DS:GetColoredCharacterFaction(character))
|
||||||
AltoTooltip:AddLine(format("%s %s |r%s %s", L["Level"],
|
AltoTooltip:AddLine(format("%s %s |r%s %s", L["Level"],
|
||||||
GREEN..DS:GetCharacterLevel(character), DS:GetCharacterRace(character), DS:GetCharacterClass(character)),1,1,1)
|
GREEN..(DS:GetCharacterLevel(character) or 0), DS:GetCharacterRace(character) or "", DS:GetCharacterClass(character) or ""),1,1,1)
|
||||||
AltoTooltip:AddLine(" ",1,1,1);
|
AltoTooltip:AddLine(" ",1,1,1);
|
||||||
|
|
||||||
local id = self:GetID()
|
local id = self:GetID()
|
||||||
@@ -203,7 +203,7 @@ function ns:OnEnter(self)
|
|||||||
end
|
end
|
||||||
numSlots = DS:GetNumBagSlots(character)
|
numSlots = DS:GetNumBagSlots(character)
|
||||||
numFree = DS:GetNumFreeBagSlots(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:AddLine(L["Bank not visited yet"],1,1,1);
|
||||||
AltoTooltip:Show();
|
AltoTooltip:Show();
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ function ns:Update()
|
|||||||
|
|
||||||
local DS = DataStore
|
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())
|
AltoholicTabCharactersStatus:SetText(L["No quest found for "] .. addon:GetCurrentCharacter())
|
||||||
addon:ClearScrollFrame( _G[ frame.."ScrollFrame" ], entry, VisibleLines, 18)
|
addon:ClearScrollFrame( _G[ frame.."ScrollFrame" ], entry, VisibleLines, 18)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -310,7 +310,7 @@ function ns:OnEnter(frame)
|
|||||||
|
|
||||||
AltoTooltip:SetOwner(frame, "ANCHOR_LEFT");
|
AltoTooltip:SetOwner(frame, "ANCHOR_LEFT");
|
||||||
AltoTooltip:ClearLines();
|
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)) .. "%"
|
rate = format("%d", floor(rate)) .. "%"
|
||||||
AltoTooltip:AddLine(format("%s: %d/%d (%s)", status, currentLevel, maxLevel, rate),1,1,1 )
|
AltoTooltip:AddLine(format("%s: %d/%d (%s)", status, currentLevel, maxLevel, rate),1,1,1 )
|
||||||
|
|||||||
@@ -228,7 +228,7 @@ function ns:UpdateViewIcons()
|
|||||||
AltoholicTabCharacters_FirstAid:Show()
|
AltoholicTabCharacters_FirstAid:Show()
|
||||||
|
|
||||||
local i = 1
|
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 itemName = "AltoholicTabCharacters_Prof" .. i
|
||||||
local item = _G[itemName]
|
local item = _G[itemName]
|
||||||
local spellID = DataStore:GetProfessionSpellID(skillName)
|
local spellID = DataStore:GetProfessionSpellID(skillName)
|
||||||
|
|||||||
@@ -448,7 +448,7 @@ local function GetRecipeOwners(professionName, link, recipeLevel)
|
|||||||
table.insert(know, coloredName)
|
table.insert(know, coloredName)
|
||||||
else
|
else
|
||||||
local currentLevel = DataStore:GetSkillInfo(character, professionName)
|
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
|
if currentLevel < recipeLevel then
|
||||||
table.insert(willLearn, format("%s |r(%d)", coloredName, currentLevel))
|
table.insert(willLearn, format("%s |r(%d)", coloredName, currentLevel))
|
||||||
else
|
else
|
||||||
|
|||||||
Reference in New Issue
Block a user