Files
ShaguTweaks-ClassicAPI/libs/libnameplate.lua
T

98 lines
3.2 KiB
Lua

local _G = ShaguTweaks.GetGlobalEnv()
local GetExpansion = ShaguTweaks.GetExpansion
local API = ShaguTweaks.API
local NAMEPLATE_OBJECTORDER = { "border", "glow", "name", "level", "levelicon", "raidicon" }
local NAMEPLATE_TYPE = "Button"
if GetExpansion() == "tbc" then
NAMEPLATE_OBJECTORDER = { "border", "castborder", "casticon", "glow", "name", "level", "levelicon", "raidicon" }
NAMEPLATE_TYPE = "Frame"
end
local function IsNamePlate(frame)
if not frame or frame:GetObjectType() ~= NAMEPLATE_TYPE then return nil end
local regions = frame:GetRegions()
if not regions then return nil end
if not regions.GetObjectType then return nil end
if not regions.GetTexture then return nil end
if regions:GetObjectType() ~= "Texture" then return nil end
return regions:GetTexture() == "Interface\\Tooltips\\Nameplate-Border" or nil
end
local registry = {}
ShaguTweaks.libnameplate = CreateFrame("Frame", nil, UIParent)
ShaguTweaks.libnameplate.OnInit = {}
ShaguTweaks.libnameplate.OnShow = {}
ShaguTweaks.libnameplate.OnUpdate = {}
local function InitializePlate(plate)
if not plate or registry[plate] or not IsNamePlate(plate) then return end
plate.healthbar = plate:GetChildren()
for i, object in pairs({plate:GetRegions()}) do
if plate and NAMEPLATE_OBJECTORDER[i] then
plate[NAMEPLATE_OBJECTORDER[i]] = object
end
end
-- Run one-time decorators after the native plate objects are exposed.
for _, func in pairs(ShaguTweaks.libnameplate.OnInit) do
func(plate)
end
-- Keep the historical callback surface for modules that genuinely need
-- per-frame plate work. ClassicAPI only replaces plate discovery below.
local oldUpdate = plate:GetScript("OnUpdate")
plate:SetScript("OnUpdate", function(self, elapsed)
if oldUpdate then oldUpdate(self, elapsed) end
for _, func in pairs(ShaguTweaks.libnameplate.OnUpdate) do
func(self, elapsed)
end
end)
local oldShow = plate:GetScript("OnShow")
plate:SetScript("OnShow", function(self)
if oldShow then oldShow(self) end
for _, func in pairs(ShaguTweaks.libnameplate.OnShow) do
func(self)
end
end)
registry[plate] = plate
end
-- ClassicAPI exposes the native nameplate lifecycle directly. Prefer its
-- NAME_PLATE_CREATED event so Lua no longer walks every WorldFrame child on
-- every rendered frame just to discover newly allocated nameplates.
local useCreatedEvent = API and API.eventutils and _G.C_EventUtils
and _G.C_EventUtils.IsEventValid("NAME_PLATE_CREATED")
if useCreatedEvent then
ShaguTweaks.libnameplate:RegisterEvent("NAME_PLATE_CREATED")
ShaguTweaks.libnameplate:SetScript("OnEvent", function()
if event == "NAME_PLATE_CREATED" then
InitializePlate(arg1)
end
end)
else
-- Legacy fallback for plain 1.12 / older ClassicAPI builds. Preserve the
-- original WorldFrame scan exactly where no lifecycle event exists.
local initialized = 0
local parentcount, childs, plate
ShaguTweaks.libnameplate:SetScript("OnUpdate", function()
parentcount = WorldFrame:GetNumChildren()
if initialized < parentcount then
childs = { WorldFrame:GetChildren() }
for i = initialized + 1, parentcount do
plate = childs[i]
InitializePlate(plate)
end
initialized = parentcount
end
end)
end