diff --git a/libs/libnameplate.lua b/libs/libnameplate.lua index b97ab84..026556b 100644 --- a/libs/libnameplate.lua +++ b/libs/libnameplate.lua @@ -1,6 +1,6 @@ local _G = ShaguTweaks.GetGlobalEnv() local GetExpansion = ShaguTweaks.GetExpansion -local GetUnitData = ShaguTweaks.GetUnitData +local API = ShaguTweaks.API or {} local NAMEPLATE_OBJECTORDER = { "border", "glow", "name", "level", "levelicon", "raidicon" } local NAMEPLATE_TYPE = "Button" @@ -10,8 +10,8 @@ if GetExpansion() == "tbc" then end local function IsNamePlate(frame) - if frame:GetObjectType() ~= NAMEPLATE_TYPE then return nil end - regions = frame:GetRegions() + 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 @@ -22,54 +22,82 @@ local function IsNamePlate(frame) end local registry = {} -local initialized = 0 -local parentcount, childs, plate ShaguTweaks.libnameplate = CreateFrame("Frame", nil, UIParent) ShaguTweaks.libnameplate.OnInit = {} ShaguTweaks.libnameplate.OnShow = {} ShaguTweaks.libnameplate.OnUpdate = {} -ShaguTweaks.libnameplate:SetScript("OnUpdate", function() - parentcount = WorldFrame:GetNumChildren() - if initialized < parentcount then - childs = { WorldFrame:GetChildren() } - for i = initialized + 1, parentcount do - plate = childs[i] - if IsNamePlate(plate) and not registry[plate] then - 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 +local function InitializePlate(plate) + if not IsNamePlate(plate) or registry[plate] then return end + + plate.healthbar = plate:GetChildren() + for i, object in pairs({plate:GetRegions()}) do + if NAMEPLATE_OBJECTORDER[i] then + plate[NAMEPLATE_OBJECTORDER[i]] = object + end + end + + -- run OnInit functions + for id, func in pairs(ShaguTweaks.libnameplate.OnInit) do + func(plate) + end + + -- preserve the plate's existing scripts and append ShaguTweaks callbacks + local oldUpdate = plate:GetScript("OnUpdate") + plate:SetScript("OnUpdate", function(self, elapsed) + if oldUpdate then oldUpdate(self, elapsed) end + for id, 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 id, func in pairs(ShaguTweaks.libnameplate.OnShow) do + func(self) + end + end) + + registry[plate] = true +end + +-- ClassicAPI exposes real nameplate lifecycle events and nameplateN unit +-- tokens. Prefer those so ShaguTweaks no longer scans every WorldFrame child +-- on every rendered frame. +if API.nameplates and _G.C_NamePlate and _G.C_NamePlate.GetNamePlates then + ShaguTweaks.libnameplate:RegisterEvent("NAME_PLATE_CREATED") + ShaguTweaks.libnameplate:RegisterEvent("NAME_PLATE_UNIT_ADDED") + ShaguTweaks.libnameplate:RegisterEvent("PLAYER_ENTERING_WORLD") + + ShaguTweaks.libnameplate:SetScript("OnEvent", function() + if event == "NAME_PLATE_CREATED" then + InitializePlate(arg1) + elseif event == "NAME_PLATE_UNIT_ADDED" then + InitializePlate(API.GetNamePlateForUnit(arg1)) + elseif event == "PLAYER_ENTERING_WORLD" then + local plates = _G.C_NamePlate.GetNamePlates() + if plates then + for _, plate in pairs(plates) do + InitializePlate(plate) end - - -- run OnInit functions - for id, func in pairs(ShaguTweaks.libnameplate.OnInit) do - func(plate) - end - - -- register OnUpdate functions - local oldUpdate = plate:GetScript("OnUpdate") - plate:SetScript("OnUpdate", function(self, elapsed) - if oldUpdate then oldUpdate(self, elapsed) end - for id, func in pairs(ShaguTweaks.libnameplate.OnUpdate) do - func(self, elapsed) - end - end) - - -- register OnShow functions - local oldShow = plate:GetScript("OnShow") - plate:SetScript("OnShow", function(self) - if oldShow then oldShow(self) end - for id, func in pairs(ShaguTweaks.libnameplate.OnShow) do - func(self) - end - end) - - registry[plate] = plate end end + end) +else + -- Compatibility fallback for clients without the ClassicAPI nameplate API. + local initialized = 0 + local parentcount, childs, plate - initialized = parentcount - end -end) + 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