You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
3.9 KiB
114 lines
3.9 KiB
|
1 year ago
|
local XP_Calculation = {}
|
||
|
|
|
||
|
|
local XP_Table = _G.XP_Table
|
||
|
|
local xpBonusItemIDs
|
||
|
|
|
||
|
|
function XP_Calculation:Initialize(xpBonusIDs)
|
||
|
|
xpBonusItemIDs = xpBonusIDs
|
||
|
|
end
|
||
|
|
|
||
|
|
function XP_Calculation:GetRequiredXP(level)
|
||
|
|
for _, data in ipairs(XP_Table) do
|
||
|
|
if data.Lvl == level then
|
||
|
|
return data.RequiredXP
|
||
|
|
end
|
||
|
|
end
|
||
|
|
return nil
|
||
|
|
end
|
||
|
|
|
||
|
|
function XP_Calculation:GetXpTokens(level)
|
||
|
|
for _, data in ipairs(XP_Table) do
|
||
|
|
if data.Lvl == level then
|
||
|
|
return data.BlueXPToken, data.EpicXPToken
|
||
|
|
end
|
||
|
|
end
|
||
|
|
return 0, 0
|
||
|
|
end
|
||
|
|
|
||
|
|
function XP_Calculation:CountXpBonusItemsInMail()
|
||
|
|
local xpCounts = { Normal = 0, Heroic = 0, Raid = 0 }
|
||
|
|
local numItems = GetInboxNumItems()
|
||
|
|
|
||
|
|
for mailIndex = 1, numItems do
|
||
|
|
for attachmentIndex = 1, ATTACHMENTS_MAX_RECEIVE do
|
||
|
|
local itemLink = GetInboxItemLink(mailIndex, attachmentIndex)
|
||
|
|
if itemLink then
|
||
|
|
local itemID = select(2, strsplit(":", itemLink))
|
||
|
|
itemID = tonumber(itemID)
|
||
|
|
local quality = xpBonusItemIDs[itemID]
|
||
|
|
if quality then
|
||
|
|
xpCounts[quality] = xpCounts[quality] + 1
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
return xpCounts
|
||
|
|
end
|
||
|
|
|
||
|
|
function XP_Calculation:GetCloakBonusXP()
|
||
|
|
local cloakBonusXP = 0
|
||
|
|
for i = 1, 40 do
|
||
|
|
local buffData = C_UnitAuras.GetBuffDataByIndex("player", i, "HELPFUL")
|
||
|
|
if not buffData then break end
|
||
|
|
if buffData.spellId == 440393 then
|
||
|
|
cloakBonusXP = tonumber(buffData.points[10]) or 0
|
||
|
|
break
|
||
|
|
end
|
||
|
|
end
|
||
|
|
return cloakBonusXP
|
||
|
|
end
|
||
|
|
|
||
|
|
function XP_Calculation:CalculateTokens(currentLevel, currentXP, xpTokensInMail, cloakBonusXP)
|
||
|
|
local requiredDungeonTokens = 0
|
||
|
|
local requiredRaidTokens = 0
|
||
|
|
local requiredRaidTokensUnder25 = 0
|
||
|
|
local currentLevelBlueXPToken = 0
|
||
|
|
local currentLevelEpicXPToken = 0
|
||
|
|
|
||
|
|
for i, v in ipairs(XP_Table) do
|
||
|
|
if v.Lvl >= currentLevel then
|
||
|
|
requiredDungeonTokens = requiredDungeonTokens + (v.RequiredXP / (v.BlueXPToken + v.BlueXPToken * cloakBonusXP / 100))
|
||
|
|
|
||
|
|
if v.EpicXPToken ~= 0 then
|
||
|
|
requiredRaidTokens = requiredRaidTokens + (v.RequiredXP / (v.EpicXPToken + v.EpicXPToken * cloakBonusXP / 100))
|
||
|
|
end
|
||
|
|
|
||
|
|
if v.Lvl < 25 then
|
||
|
|
requiredRaidTokensUnder25 = requiredRaidTokensUnder25 + (v.RequiredXP / (v.BlueXPToken + v.BlueXPToken * cloakBonusXP / 100))
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if v.Lvl == currentLevel then
|
||
|
|
currentLevelBlueXPToken = v.RequiredXP / (v.BlueXPToken + v.BlueXPToken * cloakBonusXP / 100)
|
||
|
|
if v.EpicXPToken ~= 0 then
|
||
|
|
currentLevelEpicXPToken = v.RequiredXP / (v.EpicXPToken + v.EpicXPToken * cloakBonusXP / 100)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
requiredRaidTokens = requiredRaidTokens + requiredRaidTokensUnder25 * 0.625
|
||
|
|
|
||
|
|
local xpBarPercentage = currentXP / UnitXPMax("player")
|
||
|
|
local missingDungeonTokens = requiredDungeonTokens - (xpTokensInMail.Normal + xpTokensInMail.Heroic + xpBarPercentage * (1 + cloakBonusXP / 100))
|
||
|
|
local missingRaidTokens = requiredRaidTokens - (xpTokensInMail.Normal * 0.625 + xpTokensInMail.Heroic * 0.625 + xpTokensInMail.Raid + xpBarPercentage * (1 + cloakBonusXP / 100))
|
||
|
|
|
||
|
|
return requiredDungeonTokens, missingDungeonTokens, requiredRaidTokens, missingRaidTokens, currentLevelBlueXPToken, currentLevelEpicXPToken
|
||
|
|
end
|
||
|
|
|
||
|
|
function XP_Calculation:CalculateOverflowXP(currentLevel, missingTokens, tokenType, cloakBonusXP)
|
||
|
|
local level69RequiredXP = 0
|
||
|
|
for _, data in ipairs(XP_Table) do
|
||
|
|
if data.Lvl == 69 then
|
||
|
|
level69RequiredXP = data[tokenType]
|
||
|
|
break
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local overflowXP = level69RequiredXP * (missingTokens * -1) * (1 + cloakBonusXP / 100)
|
||
|
|
return overflowXP
|
||
|
|
end
|
||
|
|
|
||
|
|
_G.XP_Calculation = XP_Calculation
|
||
|
|
return XP_Calculation
|