Files
BlizzNameplatesPlus/modules/visualguard.lua
T
2026-09-12 12:09:13 +02:00

146 lines
4.9 KiB
Lua

BNP = BNP or {}
-- Safe one-shot native visual repair ---------------------------------------
-- UI texture patches can replace the files behind Blizzard's native
-- Nameplate-Border/Nameplate-Glow paths without changing the texture paths
-- returned by the client. Keep private copies of the original Vanilla assets
-- inside BNP so those patches cannot silently reskin or blank the plates.
--
-- Apply them only when a plate is initialized/shown. There is intentionally NO
-- heartbeat and no layout/parent/anchor enforcement here, so BNP never fights
-- WorldFrame movement while the player/camera is moving.
local BORDER_TEXTURE = "Interface\\AddOns\\BlizzNameplatesPlus\\media\\classic_nameplate_border.tga"
local GLOW_TEXTURE = "Interface\\AddOns\\BlizzNameplatesPlus\\media\\classic_nameplate_glow.tga"
local DARK_BORDER_R, DARK_BORDER_G, DARK_BORDER_B, DARK_BORDER_A = 0.3, 0.3, 0.3, 0.9
local function IsTotemIconOnly(plate)
return plate and plate.BNPTotemLastKey and
BNP.AreTotemIndicatorsEnabled and BNP:AreTotemIndicatorsEnabled()
end
local function RestoreBorder(plate)
local border = plate and plate.border
if not border then return end
if border.GetTexture and border.SetTexture and border:GetTexture() ~= BORDER_TEXTURE then
border:SetTexture(BORDER_TEXTURE)
end
if border.IsShown and border.Show and not border:IsShown() then
border:Show()
end
end
local function RestoreGlow(plate)
local glow = plate and plate.glow
if not glow then return end
-- Do not show the region here. Blizzard/BNP still controls its visibility
-- through the normal mouseover path; only its source art is protected.
if glow.GetTexture and glow.SetTexture and glow:GetTexture() ~= GLOW_TEXTURE then
glow:SetTexture(GLOW_TEXTURE)
end
end
local function SetBorderVertexColor(border, r, g, b, a)
if not border or not border.SetVertexColor then return end
if border.GetVertexColor then
local oldR, oldG, oldB, oldA = border:GetVertexColor()
if math.abs((oldR or 1) - r) < 0.001
and math.abs((oldG or 1) - g) < 0.001
and math.abs((oldB or 1) - b) < 0.001
and math.abs((oldA or 1) - a) < 0.001 then
return
end
end
border:SetVertexColor(r, g, b, a)
end
local function ApplyBorderStyle(plate)
local border = plate and plate.border
if not border then return end
if BNP.IsDarkNameplateBorderEnabled and BNP:IsDarkNameplateBorderEnabled() then
-- Match ShaguTweaks' default Darkened UI color, but touch only the native
-- nameplate border. Healthbars, glows, castbars and icons stay unchanged.
SetBorderVertexColor(border, DARK_BORDER_R, DARK_BORDER_G, DARK_BORDER_B, DARK_BORDER_A)
else
-- This option is authoritative for the nameplate border. In particular,
-- switching it off must restore the original gold even when ShaguTweaks'
-- global Darkened UI mode previously tinted this texture.
SetBorderVertexColor(border, 1, 1, 1, 1)
end
end
local function ApplyHealthbarBackground(plate)
local healthbar = plate and plate.healthbar
if not healthbar then return end
local enabled = BNP.IsBlackHealthbarBackgroundEnabled and
BNP:IsBlackHealthbarBackgroundEnabled()
local background = plate.BNPHealthbarBackground
-- Keep the default path allocation-free. The extra texture is created only
-- after the user enables the option, then reused whenever this plate is
-- recycled for another unit.
if not enabled then
if background and background.IsShown and background:IsShown() then
background:Hide()
end
return
end
if not background then
-- BORDER sits above BNP's target glow (BACKGROUND) but below the StatusBar
-- fill, so the unfilled portion stays truly black even on the target.
background = healthbar:CreateTexture(nil, "BORDER")
background:SetTexture(0, 0, 0, 1)
background:SetAllPoints(healthbar)
plate.BNPHealthbarBackground = background
end
if background.GetParent and background:GetParent() ~= healthbar then
background:SetParent(healthbar)
background:ClearAllPoints()
background:SetAllPoints(healthbar)
end
if background.IsShown and not background:IsShown() then background:Show() end
end
function BNP:RepairNativeNameplateVisuals(plate)
if not plate then return end
if IsTotemIconOnly(plate) then return end
RestoreBorder(plate)
RestoreGlow(plate)
ApplyBorderStyle(plate)
ApplyHealthbarBackground(plate)
end
function BNP:RefreshNameplateBorderStyle()
local plate
for plate in pairs(BNP.plates or {}) do
self:RepairNativeNameplateVisuals(plate)
end
end
function BNP:RefreshHealthbarBackground()
local plate
for plate in pairs(BNP.plates or {}) do
ApplyHealthbarBackground(plate)
end
end
if BNP.libnameplate then
table.insert(BNP.libnameplate.OnInit, function(plate)
BNP:RepairNativeNameplateVisuals(plate or this)
end)
table.insert(BNP.libnameplate.OnShow, function(plate)
BNP:RepairNativeNameplateVisuals(plate or this)
end)
end