-- ExpBar.lua local _; local min = math.min; local IsResting = IsResting; local UnitXP, UnitXPMax, GetXPExhaustion = UnitXP, UnitXPMax, GetXPExhaustion; local CTimerAfter = C_Timer.After; local width = 300; local running = false; local frame = CreateFrame("Frame", "OmaArtifactBar", UIParent); local function expBar() frame:SetPoint("BOTTOM", UIParent, "BOTTOM", 0, 8); frame:SetWidth(width); frame:SetHeight(8); frame.base = frame:CreateTexture(nil, "BACKGROUND"); frame.base:SetAllPoints(); frame.base:SetColorTexture(0, 0, 0, 0.5); frame.bar = frame:CreateTexture(nil, "BORDER"); frame.bar:SetPoint("TOPLEFT", frame.base, "TOPLEFT"); frame.bar:SetPoint("BOTTOMLEFT", frame.base, "BOTTOMLEFT"); frame.bar:SetColorTexture(1, 1, 1); frame.rest = frame:CreateTexture(nil, "BORDER"); frame.rest:SetPoint("TOPLEFT", frame.bar, "TOPRIGHT"); frame.rest:SetPoint("BOTTOMLEFT", frame.bar, "BOTTOMRIGHT"); frame.rest:SetColorTexture(0, 0.3, 1, 0.7); frame.text = frame:CreateFontString(nil, "ARTWORK", "GameFontHighlight"); frame.text:SetPoint("BOTTOM"); frame.text:Hide(); local function updateXP() local xp, xpmax = UnitXP("player"), UnitXPMax("player"); local rested = GetXPExhaustion(); local current = xp/xpmax*width; local space = width - current; frame.bar:SetWidth(current); if rested then local restw = rested/xpmax*width; frame.rest:SetWidth(min(space, restw)); frame.rest:Show(); frame.text:SetFormattedText("%d / %d (+%d)", xp, xpmax, rested/2); frame.bar:SetVertexColor(0, 0.5, 1, 0.9); else frame.rest:Hide(); frame.text:SetFormattedText("%d / %d", xp, xpmax); frame.bar:SetVertexColor(0.6, 0.2, 1, 0.9); end end local function updater() updateXP(); if running then CTimerAfter(10, updater) end end updateXP(); frame:SetScript("OnEvent", function(self, event) if event == "PLAYER_XP_UPDATE" or event == "PLAYER_LEVEL_UP" then updateXP(); elseif event == "PLAYER_UPDATE_RESTING" or event == "PLAYER_ENTERING_WORLD" then if IsResting() then running = true; CTimerAfter(6, updater); else running = false; end end end); frame:UnregisterAllEvents(); frame:RegisterEvent("PLAYER_XP_UPDATE"); frame:RegisterEvent("PLAYER_LEVEL_UP"); frame:RegisterEvent("PLAYER_UPDATE_RESTING"); frame:RegisterEvent("PLAYER_ENTERING_WORLD"); -- from FrameXML/MainMenuBar.lua frame:SetScript("OnEnter", function(frame) frame.text:Show(); end); frame:SetScript("OnLeave", function(frame) frame.text:Hide(); end); end frame:SetScript("OnEvent", function(self, event) if UnitLevel("player") < 60 and not IsXPUserDisabled() then return expBar(); end end); frame:RegisterEvent("PLAYER_LOGIN");