И как получить этот GUID?
Вид для печати
И как получить этот GUID?
Ок , я ее тоже позаимствовал)Цитата:
Я у тебя текстурку стрелочки позаимствую))
Что то получилось )))
И где же это что то?)
Можно и такой вариант http://rghost.ru/75rRlwp5J , правда для мобов не совсем корректно работает :D, но я думаю это для пвп. Обновляет раз в сек, можно поставить и быстрее, но я думаю достаточно.
П.с Отличии от предыдущего варианта, без фокуса не грузит цп.
Так понял я один сделал в ~300 строчек?)))
PS в отличии от прошлых вариантов не грузит цп и работает на любых мобах и игроках, даже с одинаковыми именами.
https://www.youtube.com/watch?v=OvaO...ature=youtu.be
- - - Updated - - -
Мда код получился бульдозерным :D щас чуть поправлю и выложу))
- - - Updated - - -
PS копируем аккуратно , внутри может быть вуду , которое осталось от LibNamePlates :DPHP код:
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')
Сколько кода столько и багов :D Если скрыть и показать, то фокус будет на ком попало, так же и багается таргет.
http://mepic.ru/up/pic_b/00e8a8b149d...2062bd67c9.jpg (заменена только текстура)
П.с И цп нагружает раз в 10 больше чем мой выше :)
В смысле идеальные?
П.с Так по лучше будет :D http://youtu.be/D_goa3ps2ZU