Files
ShaguTweaks-ClassicAPI/mods/xpbar-text.lua
T
2026-07-30 11:25:59 +02:00

68 lines
2.1 KiB
Lua

local _G = ShaguTweaks.GetGlobalEnv()
local T = ShaguTweaks.T
local module = ShaguTweaks:register({
title = T["XP Bar Text"],
description = T["Always shows current XP and rested bonus percentage directly on the experience bar."],
expansions = { ["vanilla"] = true, ["tbc"] = true },
category = T["Action Bar"],
enabled = true,
order = 70,
})
module.enable = function(self)
-- Create a separate overlay frame anchored to the XP bar,
-- same approach as actionbar-improved-expbar to avoid touching bar internals
local exp = CreateFrame("Frame", nil, UIParent)
exp:SetAllPoints(MainMenuExpBar)
exp:SetFrameStrata("HIGH")
exp.text = exp:CreateFontString(nil, "OVERLAY", "GameFontWhite")
exp.text:SetFont("Fonts\\ARIALN.TTF", 14, "OUTLINE")
exp.text:SetPoint("CENTER", MainMenuExpBar, "CENTER", 0, 1)
exp.text:SetJustifyH("CENTER")
exp.text:SetTextColor(1, 1, 1)
local function UpdateXPText()
local curr = UnitXP("player")
local max = UnitXPMax("player")
if not max or max == 0 then
exp.text:Hide()
return
end
local rest = GetXPExhaustion() or 0
local xpPct = math.floor(curr / max * 100)
local text
if rest > 0 then
-- Rested XP pool is 150% of max XP, not 100% (mécanique post-patch)
local restPct = math.floor(math.min(rest / (max * 1.5) * 100, 100))
text = "|cffffffff" .. xpPct .. "%|r |cffaaaaaa(|cffa78aca" .. restPct .. "%|cffaaaaaa)|r"
else
text = "|cffffffff" .. xpPct .. "%|r"
end
exp.text:SetText(text)
exp.text:Show()
end
local events = CreateFrame("Frame", nil, UIParent)
events:RegisterEvent("PLAYER_ENTERING_WORLD")
events:RegisterEvent("PLAYER_XP_UPDATE")
events:RegisterEvent("UPDATE_EXHAUSTION")
events:RegisterEvent("PLAYER_LEVEL_UP")
events:SetScript("OnEvent", function()
if event == "PLAYER_ENTERING_WORLD" then
if not this.loaded then
this.loaded = true
-- hide blizzard's default overlay that renders the original xp text
MainMenuBarOverlayFrame:Hide()
UpdateXPText()
end
else
UpdateXPText()
end
end)
end