ElvUI/Modules/DataBars/Experience.lua

221 lines
7.8 KiB
Lua

local E, L, V, P, G = unpack(select(2, ...)); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
local DB = E:GetModule('DataBars')
local LSM = E.Libs.LSM
local _G = _G
local min, format = min, format
local CreateFrame = CreateFrame
local GetXPExhaustion = GetXPExhaustion
local IsXPUserDisabled = IsXPUserDisabled
local GetQuestLogRewardXP = GetQuestLogRewardXP
local IsPlayerAtEffectiveMaxLevel = IsPlayerAtEffectiveMaxLevel
local C_QuestLog_GetNumQuestLogEntries = C_QuestLog.GetNumQuestLogEntries
local C_QuestLog_GetQuestIDForLogIndex = C_QuestLog.GetQuestIDForLogIndex
local C_QuestLog_ReadyForTurnIn = C_QuestLog.ReadyForTurnIn
local C_QuestLog_GetInfo = C_QuestLog.GetInfo
local UnitXP, UnitXPMax = UnitXP, UnitXPMax
local CurrentXP, XPToLevel, RestedXP, PercentRested
local PercentXP, RemainXP, RemainTotal, RemainBars
local QuestLogXP = 0
function DB:ExperienceBar_CheckQuests(questID, completedOnly)
if not questID then return end
local isCompleted = C_QuestLog_ReadyForTurnIn(questID)
if not completedOnly or isCompleted then
QuestLogXP = QuestLogXP + GetQuestLogRewardXP(questID)
end
end
function DB:ExperienceBar_ShouldBeVisible()
return not IsPlayerAtEffectiveMaxLevel() and not IsXPUserDisabled()
end
function DB:ExperienceBar_Update()
local bar = DB.StatusBars.Experience
DB:SetVisibility(bar)
if not bar.db.enable or bar:ShouldHide() then return end
CurrentXP, XPToLevel, RestedXP = UnitXP('player'), UnitXPMax('player'), GetXPExhaustion()
if XPToLevel <= 0 then XPToLevel = 1 end
local remainXP = XPToLevel - CurrentXP
local remainPercent = remainXP / XPToLevel
RemainTotal, RemainBars = remainPercent * 100, remainPercent * 20
PercentXP, RemainXP = (CurrentXP / XPToLevel) * 100, E:ShortValue(remainXP)
local expColor, restedColor = DB.db.colors.experience, DB.db.colors.rested
bar:SetStatusBarColor(expColor.r, expColor.g, expColor.b, expColor.a)
bar.Rested:SetStatusBarColor(restedColor.r, restedColor.g, restedColor.b, restedColor.a)
local displayString, textFormat = '', DB.db.experience.textFormat
if not DB:ExperienceBar_ShouldBeVisible() then
bar:SetMinMaxValues(0, 1)
bar:SetValue(1)
if textFormat ~= 'NONE' then
displayString = IsXPUserDisabled() and L["Disabled"] or L["Max Level"]
end
else
bar:SetMinMaxValues(0, XPToLevel)
bar:SetValue(CurrentXP)
if textFormat == 'PERCENT' then
displayString = format('%.2f%%', PercentXP)
elseif textFormat == 'CURMAX' then
displayString = format('%s - %s', E:ShortValue(CurrentXP), E:ShortValue(XPToLevel))
elseif textFormat == 'CURPERC' then
displayString = format('%s - %.2f%%', E:ShortValue(CurrentXP), PercentXP)
elseif textFormat == 'CUR' then
displayString = format('%s', E:ShortValue(CurrentXP))
elseif textFormat == 'REM' then
displayString = format('%s', RemainXP)
elseif textFormat == 'CURREM' then
displayString = format('%s - %s', E:ShortValue(CurrentXP), RemainXP)
elseif textFormat == 'CURPERCREM' then
displayString = format('%s - %.2f%% (%s)', E:ShortValue(CurrentXP), PercentXP, RemainXP)
end
local isRested = RestedXP and RestedXP > 0
if isRested then
bar.Rested:SetMinMaxValues(0, XPToLevel)
bar.Rested:SetValue(min(CurrentXP + RestedXP, XPToLevel))
PercentRested = (RestedXP / XPToLevel) * 100
if textFormat == 'PERCENT' then
displayString = format('%s R:%.2f%%', displayString, PercentRested)
elseif textFormat == 'CURPERC' then
displayString = format('%s R:%s [%.2f%%]', displayString, E:ShortValue(RestedXP), PercentRested)
elseif textFormat ~= 'NONE' then
displayString = format('%s R:%s', displayString, E:ShortValue(RestedXP))
end
end
if bar.db.showLevel then
displayString = format('%s %s : %s', L['Level'], E.mylevel, displayString)
end
bar.Rested:SetShown(isRested)
end
bar.text:SetText(displayString)
end
function DB:ExperienceBar_QuestXP()
if not DB:ExperienceBar_ShouldBeVisible() then return end
local bar = DB.StatusBars.Experience
QuestLogXP = 0
for i = 1, C_QuestLog_GetNumQuestLogEntries() do
local info = C_QuestLog_GetInfo(i)
if info and (not info.isHidden) and (bar.db.questCurrentZoneOnly and info.isOnMap or not bar.db.questCurrentZoneOnly) then
DB:ExperienceBar_CheckQuests(C_QuestLog_GetQuestIDForLogIndex(i), bar.db.questCompletedOnly)
end
end
if QuestLogXP > 0 then
bar.Quest:SetMinMaxValues(0, XPToLevel)
bar.Quest:SetValue(min(CurrentXP + QuestLogXP, XPToLevel))
bar.Quest:SetStatusBarColor(DB.db.colors.quest.r, DB.db.colors.quest.g, DB.db.colors.quest.b, DB.db.colors.quest.a)
bar.Quest:Show()
else
bar.Quest:Hide()
end
end
function DB:ExperienceBar_OnEnter()
if self.db.mouseover then
E:UIFrameFadeIn(self, 0.4, self:GetAlpha(), 1)
end
if _G.GameTooltip:IsForbidden() or not DB:ExperienceBar_ShouldBeVisible() then return end
_G.GameTooltip:ClearLines()
_G.GameTooltip:SetOwner(self, 'ANCHOR_CURSOR')
_G.GameTooltip:AddLine(L["Experience"])
_G.GameTooltip:AddLine(' ')
_G.GameTooltip:AddDoubleLine(L["XP:"], format(' %d / %d (%.2f%%)', CurrentXP, XPToLevel, PercentXP), 1, 1, 1)
_G.GameTooltip:AddDoubleLine(L["Remaining:"], format(' %s (%.2f%% - %d '..L["Bars"]..')', RemainXP, RemainTotal, RemainBars), 1, 1, 1)
_G.GameTooltip:AddDoubleLine(L["Quest Log XP:"], QuestLogXP, 1, 1, 1)
if RestedXP and RestedXP > 0 then
_G.GameTooltip:AddDoubleLine(L["Rested:"], format('+%d (%.2f%%)', RestedXP, PercentRested), 1, 1, 1)
end
_G.GameTooltip:Show()
end
function DB:ExperienceBar_OnClick() end
function DB:ExperienceBar_Toggle()
local bar = DB.StatusBars.Experience
bar.db = DB.db.experience
if bar.db.enable then
E:EnableMover(bar.holder.mover:GetName())
else
E:DisableMover(bar.holder.mover:GetName())
end
if bar.db.enable and not bar:ShouldHide() then
DB:RegisterEvent('PLAYER_XP_UPDATE', 'ExperienceBar_Update')
DB:RegisterEvent('DISABLE_XP_GAIN', 'ExperienceBar_Update')
DB:RegisterEvent('ENABLE_XP_GAIN', 'ExperienceBar_Update')
DB:RegisterEvent('UPDATE_EXHAUSTION', 'ExperienceBar_Update')
DB:RegisterEvent('QUEST_LOG_UPDATE', 'ExperienceBar_QuestXP')
DB:RegisterEvent('ZONE_CHANGED', 'ExperienceBar_QuestXP')
DB:RegisterEvent('ZONE_CHANGED_NEW_AREA', 'ExperienceBar_QuestXP')
DB:UnregisterEvent('UPDATE_EXPANSION_LEVEL')
DB:ExperienceBar_Update()
else
DB:UnregisterEvent('PLAYER_XP_UPDATE')
DB:UnregisterEvent('DISABLE_XP_GAIN')
DB:UnregisterEvent('ENABLE_XP_GAIN')
DB:UnregisterEvent('UPDATE_EXHAUSTION')
DB:UnregisterEvent('QUEST_LOG_UPDATE')
DB:UnregisterEvent('ZONE_CHANGED')
DB:UnregisterEvent('ZONE_CHANGED_NEW_AREA')
DB:RegisterEvent('UPDATE_EXPANSION_LEVEL', 'ExperienceBar_Toggle')
end
end
function DB:ExperienceBar()
local Experience = DB:CreateBar('ElvUI_ExperienceBar', 'Experience', DB.ExperienceBar_Update, DB.ExperienceBar_OnEnter, DB.ExperienceBar_OnClick, {'BOTTOM', E.UIParent, 'BOTTOM', 0, 43})
Experience.barTexture:SetDrawLayer('ARTWORK', 4)
DB:CreateBarBubbles(Experience)
Experience.ShouldHide = function()
return DB.db.experience.hideAtMaxLevel and not DB:ExperienceBar_ShouldBeVisible()
end
local Rested = CreateFrame('StatusBar', 'ElvUI_ExperienceBar_Rested', Experience.holder)
Rested:SetStatusBarTexture(DB.db.customTexture and LSM:Fetch('statusbar', DB.db.statusbar) or E.media.normTex)
Rested:EnableMouse(false)
Rested:SetInside()
Rested:Hide()
Rested.barTexture = Rested:GetStatusBarTexture()
Rested.barTexture:SetDrawLayer('ARTWORK', 2)
Experience.Rested = Rested
local Quest = CreateFrame('StatusBar', 'ElvUI_ExperienceBar_Quest', Experience.holder)
Quest:SetStatusBarTexture(DB.db.customTexture and LSM:Fetch('statusbar', DB.db.statusbar) or E.media.normTex)
Quest:EnableMouse(false)
Quest:SetInside()
Quest:Hide()
Quest.barTexture = Quest:GetStatusBarTexture()
Quest.barTexture:SetDrawLayer('ARTWORK', 3)
Experience.Quest = Quest
E:CreateMover(Experience.holder, 'ExperienceBarMover', L["Experience Bar"], nil, nil, nil, nil, nil, 'databars,experience')
DB:ExperienceBar_Toggle()
end