Files
ShaguTweaks-ClassicAPI/mods/unitframes-bighealth.lua
T

189 lines
7.3 KiB
Lua

local T = ShaguTweaks.T
local hooksecurefunc = hooksecurefunc or ShaguTweaks.hooksecurefunc
local playerModule = ShaguTweaks:register({
title = T["Unit Frame Big Health for Player"],
description = T["Enlarges the player health bar and colors it by class. Also applies the class color to the Personal Resource Display health bar when enabled."],
expansions = { ["vanilla"] = true },
category = T["Unit Frames"],
enabled = nil,
})
local targetModule = ShaguTweaks:register({
title = T["Unit Frame Big Health for Target"],
description = T["Increases the healthbar of the target unitframe."],
expansions = { ["vanilla"] = true },
category = T["Unit Frames"],
enabled = nil,
})
local addonpath
local tocs = { "", "-master", "-tbc", "-wotlk" }
for i = 1, table.getn(tocs) do
local current = string.format("ShaguTweaks%s", tocs[i])
local _, title = GetAddOnInfo(current)
if title then
addonpath = "Interface\\AddOns\\" .. current
break
end
end
addonpath = addonpath or "Interface\\AddOns\\ShaguTweaks"
local function Enable(player, target)
local normalTexture = addonpath .. "\\img\\UI-TargetingFrame"
local eliteTexture = addonpath .. "\\img\\UI-TargetingFrame-Elite"
local rareTexture = addonpath .. "\\img\\UI-TargetingFrame-Rare"
-- Darkened UI and Big Health can be enabled in either order because modules
-- are initialized from an unordered table. If Darkened UI ran first, Big
-- Health replaces the already-darkened textures with fresh bright ones.
-- Apply the configured dark tint directly to our replacement textures so the
-- result is deterministic without adding any permanent OnUpdate work.
local function ApplyDarkModeTextures()
-- Darkened UI or Golden UI publish their texture tint here, with the
-- /st overwrites already applied.
local color = ShaguTweaks.UITint
if not color then return end
local r = tonumber(color.r) or color.r
local g = tonumber(color.g) or color.g
local b = tonumber(color.b) or color.b
local a = tonumber(color.a) or color.a or 1
if player and PlayerFrameTexture then PlayerFrameTexture:SetVertexColor(r, g, b, a) end
if player and PlayerStatusTexture then PlayerStatusTexture:SetVertexColor(r, g, b, a) end
if target and TargetFrameTexture then TargetFrameTexture:SetVertexColor(r, g, b, a) end
end
-- Big Health is presentation-only. Numeric health/power values are owned by
-- the independent Real Health Numbers module.
if player then
PlayerFrameTexture:SetTexture(normalTexture)
PlayerFrameHealthBar:SetPoint("TOPLEFT", 106, -22)
PlayerFrameHealthBar:SetHeight(30)
PlayerStatusTexture:SetTexture(addonpath .. "\\img\\UI-Player-Status")
-- The additive status artwork contains both the portrait ring and bar edge.
-- Crop only the latter while resting, shrinking the displayed width by the
-- same ratio so the portrait ring keeps its original size and position.
-- Native status code continues to own visibility, tint, alpha and pulsing.
local statusCoords = {PlayerStatusTexture:GetTexCoord()}
local statusWidth = PlayerStatusTexture:GetWidth()
local portraitRight = 72 / 256 -- right edge of the portrait in UI-Player-Status
local restingCrop = false
local function UpdateRestingGlow()
local resting = IsResting()
and not UnitAffectingCombat("player")
local left, right = statusCoords[1], statusCoords[5]
if not left or not right or right <= left
or portraitRight <= left or portraitRight >= right then return end
if resting and not restingCrop then
PlayerStatusTexture:SetTexCoord(
left, portraitRight, statusCoords[2], statusCoords[4])
PlayerStatusTexture:SetWidth(
statusWidth * (portraitRight - left) / (right - left))
restingCrop = true
elseif not resting and restingCrop then
PlayerStatusTexture:SetTexCoord(
left, right, statusCoords[2], statusCoords[4])
PlayerStatusTexture:SetWidth(statusWidth)
restingCrop = false
end
end
hooksecurefunc("PlayerFrame_UpdateStatus", UpdateRestingGlow)
UpdateRestingGlow()
end
if target then
TargetFrameTexture:SetTexture(normalTexture)
TargetFrameHealthBar:SetPoint("TOPRIGHT", -106, -22)
TargetFrameHealthBar:SetHeight(30)
end
ApplyDarkModeTextures()
local world = CreateFrame("Frame")
world:RegisterEvent("PLAYER_ENTERING_WORLD")
world:SetScript("OnEvent", function()
ApplyDarkModeTextures()
this:UnregisterAllEvents()
end)
-- Delay hook installation by one frame so all enabled unit-frame modules have
-- finished their setup first. This keeps hooks attached to final handlers.
local deferred = CreateFrame("Frame")
deferred:SetScript("OnUpdate", function()
this:SetScript("OnUpdate", nil)
this:Hide()
local function UpdateTargetClassificationTexture()
local classification = UnitClassification("target")
if classification == "worldboss"
or classification == "rareelite"
or classification == "elite" then
TargetFrameTexture:SetTexture(eliteTexture)
elseif classification == "rare" then
TargetFrameTexture:SetTexture(rareTexture)
else
TargetFrameTexture:SetTexture(normalTexture)
end
ApplyDarkModeTextures()
end
if target then hooksecurefunc("TargetFrame_CheckClassification", UpdateTargetClassificationTexture) end
local playerSetStatusBarColor = PlayerFrameHealthBar.SetStatusBarColor
local targetSetStatusBarColor = TargetFrameHealthBar.SetStatusBarColor
local function ApplyPlayerHealthColor()
if not PlayerFrameNameBackground or not playerSetStatusBarColor then return end
local r, g, b = PlayerFrameNameBackground:GetVertexColor()
-- Resource hiding sets this color-source texture's alpha to zero. Its
-- visibility must not propagate to the actual health fill on updates.
playerSetStatusBarColor(PlayerFrameHealthBar, r, g, b, 1)
end
local function ApplyTargetHealthColor()
if not TargetFrameNameBackground or not targetSetStatusBarColor then return end
local r, g, b = TargetFrameNameBackground:GetVertexColor()
targetSetStatusBarColor(TargetFrameHealthBar, r, g, b, 1)
end
-- Keep the Big Health colors without replacing SetStatusBarColor with a
-- no-op. Other addons may still call the original method normally.
if player and PlayerFrameNameBackground then
hooksecurefunc(PlayerFrameHealthBar, "SetStatusBarColor", ApplyPlayerHealthColor)
hooksecurefunc(PlayerFrameNameBackground, "Show", function()
PlayerFrameNameBackground:Hide()
end)
PlayerFrameNameBackground:Hide()
ApplyPlayerHealthColor()
end
if target and TargetFrameNameBackground then
hooksecurefunc(TargetFrameHealthBar, "SetStatusBarColor", ApplyTargetHealthColor)
hooksecurefunc(TargetFrameNameBackground, "Show", function()
TargetFrameNameBackground:Hide()
end)
TargetFrameNameBackground:Hide()
ApplyTargetHealthColor()
end
if target then hooksecurefunc("TargetFrame_CheckFaction", ApplyTargetHealthColor) end
if target then
UpdateTargetClassificationTexture()
TargetFrame_CheckFaction()
end
end)
end
playerModule.enable = function() Enable(true, false) end
targetModule.enable = function() Enable(false, true) end