Немного много текста вышло , такой метод наиболее производительный будет.
OnUpdate идет только проверка num ~= lastChildren , т.е 1 if , 1 фрейму обрабатывает только 1 раз, после того как плейта обработана обновление текста будет только при появлении плейты на экране и обновлении значения статус бара (при получении обьектом урона).
PHP код:
local __plates, __hooks = {}, {["OnShow"] = {}, ["OnValueChanged"] = {}}
local Update
do
local select, f = select, format
Update = function(obj)
if obj.__text and obj.__owner:IsShown() then obj.__text:Update() end
if obj.__text then return end
local __text = obj:CreateFontString()
__text:SetFont("Fonts\\ARIALN.TTF", 10, "OUTLINEMONOCHROME")
__text:SetPoint("CENTER", obj)
__text.__owner = obj
function __text:Update()
local __owner = self.__owner
local min, max = __owner:GetValue(), select(2, __owner:GetMinMaxValues())
self:SetFormattedText("%s - %d%s",(min>999999 and f("%.1fm", min/1e6)) or (min>999 and f("%.1fk", min/1e3)) or f("%d", min), min/max*100, "%")
end
obj.__text = __text
end
end
local SetHooks
do
local pairs = pairs
local frame
SetHooks = function(obj)
frame = obj:GetChildren() or false
frame.__owner = obj
for hook, table in pairs(__hooks) do
if frame and frame:HasScript(hook) and not __hooks[hook][frame] then
frame:HookScript(hook, Update)
Update(frame)
__hooks[hook][frame] = true
end
end
end
end
local IsNamePlate
do
local Overlay = [=[Interface\Tooltips\Nameplate-Border]=]
IsNamePlate = function(obj)
local Name = obj:GetName()
local _, OverlayRegion = obj:GetRegions()
if(Name)then return end
return OverlayRegion and OverlayRegion:GetObjectType() == "Texture" and OverlayRegion:GetTexture() == Overlay
end
end
local FindPlates
do
local select, rawget, rawset, lastChildren = select, rawget, rawset, 0
FindPlates = function(self)
local num = self:GetNumChildren()
if num ~= lastChildren then
for i = 1, num do
local obj = select(i, self:GetChildren())
if IsNamePlate(obj) and not rawget(__plates, obj) then
SetHooks(obj)
rawset(__plates, obj, true)
end
end
lastChildren = num
end
end
end
WorldFrame:HookScript("OnUpdate", FindPlates)