PHP код:
local EventHandler = CreateFrame ("Frame", nil, UIParent)
EventHandler:SetScript("OnEvent", function(self, event, ...)
self[event](self, ...)
end)
EventHandler.Config = {
size = 40,
x = 0,
y = 0,
tex = "Interface\\AddOns\\PlatesGlow\\arrow"
};
EventHandler.nameplates = {}
EventHandler.isOnScreen = {}
EventHandler.names = {}
EventHandler.realPlate = {}
EventHandler.GUIDs = {}
EventHandler.plateGUIDs = {}
EventHandler.onShowHooks = {}
EventHandler.onHideHooks = {}
EventHandler.onUpdateHooks = {}
EventHandler.isOnUpdating = {}
local scanDelay = 1
local updateDelay = 1
local regionNames = { "threatGlow", "healthBorder", "castBorder", "castSheild", "spellIcon", "highlightTexture", "nameText", "levelText", "dangerSkull", "raidIcon", "eliteIcon" }
local regionIndex = {}
for i, name in pairs(regionNames) do
regionIndex[name] = i
end
function GetRegion(frame, name)
return select(regionIndex[name], frame:GetRegions())
end
function EventHandler:GetTargetNameplate()
if self.targeted and self.targeted:IsShown() then
return self.fakePlate[self.targeted] or self.targeted
end
end
local function RecycleNameplate(frame)
if EventHandler.plateGUIDs[frame] then
EventHandler.GUIDs[EventHandler.plateGUIDs[frame]] = false
end
local plateName = EventHandler:GetName(frame)
if plateName and EventHandler.names[plateName] then
EventHandler.names[plateName] = false
end
EventHandler.plateGUIDs[frame] = false
end
local function RemoveHexColor(inputString)
local find = inputString:find("|c")
if find then
inputString = inputString:sub(find+10)
end
inputString = inputString:gsub("|r", "")
return inputString
end
local function FoundPlateGUID(frame, GUID, unitID)
EventHandler.plateGUIDs[frame] = GUID
EventHandler.GUIDs[GUID] = frame
end
function EventHandler:GetName(frame)
local frame = self.realPlate[frame] or frame
local nameRegion = GetRegion(frame, "nameText")
if nameRegion and nameRegion.GetText then
return RemoveHexColor( nameRegion:GetText() )
end
return nil
end
function EventHandler:SetupNameplate(frame)
self.isOnScreen[frame] = true
local plateName = self:GetName(frame)
self.nameplates[frame] = plateName
self.names[plateName] = frame
frame.arrow = CreateFrame("Frame", nil, frame)
frame.arrow.focus = frame.arrow:CreateTexture("ARTWORK")
frame.arrow.target = frame.arrow:CreateTexture("ARTWORK")
frame.arrow:SetSize(self.Config.size,self.Config.size)
frame.arrow:SetPoint("BOTTOM", frame, "TOP", self.Config.x , self.Config.y)
frame.arrow.focus:SetAllPoints(frame.arrow)
frame.arrow.focus:SetTexture(self.Config.tex)
frame.arrow.focus:SetVertexColor(.2, .2, .8, 1)
frame.arrow.focus:Hide()
frame.arrow.target:SetAllPoints(frame.arrow)
frame.arrow.target:SetTexture(self.Config.tex)
frame.arrow.target:SetVertexColor(.8, .2, .2, 1)
frame.arrow.target:Hide()
frame.lnpCheckForTarget = true
end
local function isValidFrame(frame)
if frame:GetName() then return false end
if frame:GetID() ~= 0 then return false end
if frame:GetObjectType() ~= "Frame" then return false end
if frame:GetNumChildren() == 0 then return false end
if frame:GetNumRegions() == 0 then return false end
return true
end
function EventHandler.OnNameplateHide(frame, ...)
EventHandler.isOnScreen[frame] = false
EventHandler.isOnUpdating[frame] = false
RecycleNameplate(frame)
end
local function ourOnHide(...) return EventHandler.OnNameplateHide(...) end
function EventHandler.OnNameplateShow(frame, ...)
EventHandler:SetupNameplate(frame)
end
local function ourOnShow(...) return EventHandler.OnNameplateShow(...) end
function EventHandler.OnNameplateUpdate(frame, elapsed, ...)
EventHandler.isOnUpdating[frame] = true
if frame.lnpCheckForTarget then
frame.lnpCheckForTarget = false
if not EventHandler.plateGUIDs[frame] and frame:IsShown() and ((frame:GetAlpha() == 1) and UnitExists("target")) then
FoundPlateGUID(frame, UnitGUID("target"), "target")
end
end
end
local function ourOnUpdate(...) return EventHandler.OnNameplateUpdate(...) end
function EventHandler:HookNameplate(frame)
if frame:HasScript("OnHide") and not self.onHideHooks[frame] then
self.onHideHooks[frame] = true
frame:HookScript("OnHide", ourOnHide)
end
if frame:HasScript("OnShow") and not self.onShowHooks[frame] then
self.onShowHooks[frame] = true
frame:HookScript("OnShow", ourOnShow)
end
if frame:HasScript("OnUpdate") and not self.onUpdateHooks[frame] then
self.onUpdateHooks[frame] = true
frame:HookScript("OnUpdate", ourOnUpdate)
end
end
function EventHandler:IsTarget(frame)
local frame = self.realPlate[frame] or frame
return frame:IsShown() and frame:GetAlpha() == 1 and UnitExists("target") or false
end
function EventHandler:IsFocus(frame)
local frame = self.realPlate[frame] or frame
return frame:IsShown() and frame:GetAlpha() == 1 and UnitExists("target") or false
end
local function ScanWorldFrame(n, ...)
for i = 1, n do
local frame = select(i, ...)
if frame:IsShown() and isValidFrame(frame) then
if not EventHandler.nameplates[frame] then
EventHandler:HookNameplate(frame)
EventHandler:SetupNameplate(frame)
end
end
end
end
local lastChildren = 0
local function FindNameplates()
local curChildren = WorldFrame:GetNumChildren()
if curChildren ~= lastChildren then
lastChildren = curChildren
ScanWorldFrame(curChildren, WorldFrame:GetChildren())
end
end
local function OnEvent(frame, event, ...)
if event == "PLAYER_TARGET_CHANGED" then
for i = 1, WorldFrame:GetNumChildren() do
local frame = select(i, WorldFrame:GetChildren())
if frame:IsShown() and isValidFrame(frame) and frame.arrow then
frame.arrow.target:Hide()
end
end
if UnitExists("target") then
frame.checkTarget = true
else
EventHandler.targeted = nil
end
elseif event == "PLAYER_FOCUS_CHANGED" then
for i = 1, WorldFrame:GetNumChildren() do
local frame = select(i, WorldFrame:GetChildren())
if frame:IsShown() and isValidFrame(frame) and frame.arrow then
frame.arrow.focus:Hide()
end
end
if UnitExists("focus") then
frame.checkFocus = true
else
EventHandler.focused = nil
end
end
end
local function CheckForTargetGUID()
local unitID = "target"
local GUID
for frame in pairs(EventHandler.nameplates) do
if EventHandler:IsTarget(frame) then
EventHandler.targeted = frame
if not EventHandler.plateGUIDs[frame] then
FoundPlateGUID(frame, UnitGUID(unitID), unitID)
end
frame.arrow.target:Show()
return
end
end
end
local function CheckForFocusGUID()
local unitID = "focus"
local GUID
for frame in pairs(EventHandler.nameplates) do
if EventHandler:IsFocus(frame) then
EventHandler.focused = frame
if not EventHandler.plateGUIDs[frame] then
FoundPlateGUID(frame, UnitGUID(unitID), unitID)
end
frame.arrow.focus:Show()
return
end
end
end
local function OnUpdate(frame, elapsed)
if frame.checkTarget then
frame.checkTarget = false
CheckForTargetGUID()
end
if frame.checkFocus then
frame.checkFocus = false
CheckForFocusGUID()
end
FindNameplates()
frame.lastUpdate = frame.lastUpdate + elapsed
if frame.lastUpdate >= scanDelay then
frame.lastUpdate = 0
for frame, value in pairs(EventHandler.isOnScreen) do
if (value == true and not frame:IsShown()) then
EventHandler.onHideHooks[frame] = false
EventHandler.isOnScreen[frame] = false
EventHandler:HookNameplate(frame)
EventHandler.OnNameplateHide(frame)
elseif (value == false and frame:IsShown()) then
EventHandler.onShowHooks[frame] = false
EventHandler.isOnScreen[frame] = false
EventHandler:HookNameplate(frame)
EventHandler:SetupNameplate(frame, true)
end
end
for frame, value in pairs(EventHandler.isOnUpdating) do
if value == false and frame:IsShown() then
EventHandler.onUpdateHooks[frame] = false
EventHandler:HookNameplate(frame)
end
end
end
end
EventHandler.lastUpdate = 0
EventHandler.checkTarget = false
EventHandler.checkFocus = false
EventHandler:SetScript("OnUpdate", OnUpdate)
EventHandler:SetScript("OnEvent", OnEvent)
EventHandler:RegisterEvent('PLAYER_TARGET_CHANGED')
EventHandler:RegisterEvent('PLAYER_FOCUS_CHANGED')
EventHandler:RegisterEvent('PLAYER_ENTERING_WORLD')
PS копируем аккуратно , внутри может быть вуду , которое осталось от LibNamePlates