PHP код:
--//Думаем наперед и оздаем фрейму с любым название, чуть позже она будет обновлять наши нейм плейты]]--
local NamePlates = CreateFrame("Frame", nil, UIParent)
NamePlates:SetScript("OnEvent", function(self, event, ...) self[event](self, ...) end)
--//НАСТРОЙКИ НАЧАЛО\\--
--//Для удобства выннес настройки на верх]]
local cfg = {
--//Полосы здоровья и касты]]--
HPheight = 15 ,--высота
HPwidth = 200 ,--ширина
CBheight = 15 , --Высота каст бара
CBtieFont = 10 , --Размер шрифта каст бар
border = 3 , --размер бортика
--//рейдовая иконка]]--
rheight = 15 ,-- размер (например 15 означает , что размер иконки будет высотой 15 и шириной 15 пикселей)
Rpoint = "RIGHT" , --чем цепляем
RrelativePoint = "LEFT" , --куда цепляем
Rx = 0 , --координата Х (по ширине)
Ry = -4 , --координата У (по высоте)
--//Уровень]]--
LvLFontSize = 14 , --размер букв
LvLpoint = "RIGHT" , --чем цепляем
LvLrelativePoint = "LEFT" ,--куда цепляем
LvLx = -2 , --координата Х (по ширине)
LvLy = 0 , --координата У (по высоте)
--//Имя]]--
NameFontSize = 14 , --размер букв имени
Npoint = "BOTTOM" , --чем цепляем
NrelativePoint = "TOP" ,--куда цепляем
Nx = 0 , --координата Х (по ширине)
Ny = 3 , --координата У (по высоте))
--//Цвета]]
hostileunit = {r=0.69, g=0.31, b=0.31}, --цвет враждебного инита
friendlyunit = {r=0.33, g=0.59, b=0.33}, --цвет дружественного юнита
friendlyplayer = {r=0.31, g=0.45, b=0.63}, --цвет дружественного игрока
neutralunit = {r=0.65, g=0.63, b=0.35}, --цвет нейтрального юнита
}
--//Так же для удобства редактирования выношу сюда же и текстурки со шрифтами]]
local media = {
["font"] = [=[Fonts\FRIZQT__.TTF]=],
["normTex"] = [[Interface\Buttons\WHITE8x8]],
["glowTex"] = [[Interface\Buttons\WHITE8x8]],
["back"] = [[Interface\Buttons\WHITE8x8]],
}
local backdrop = {
edgeFile = media.glowTex, edgeSize = cfg.border,
insets = {left = cfg.border, right = cfg.border, top = cfg.border, bottom = cfg.border}
}
--\\!!!НАСТРОЙКИ КОНЕЦ!!! НЕ ЗНАЯ БРОДУ НЕ ПиХАТЬ КЛЕШНЯМИ!!!//--
--//Функция для поиска нейм плейтов]]
local function IsNamePlate(frame)
local overlayTexture = [=[Interface\Tooltips\Nameplate-Border]=]
if frame:GetName() then
return
end
overlayRegion = select(2, frame:GetRegions())
return overlayRegion and overlayRegion:GetObjectType() == "Texture" and overlayRegion:GetTexture() == overlayTexture
end
--//Обновление времени каста ]]--
local function UpdateCastTime(self, curValue)
local minValue, maxValue = self:GetMinMaxValues()
if self.channeling then
self.time:SetFormattedText("%.1f ", curValue)
else
self.time:SetFormattedText("%.1f ", maxValue - curValue)
end
end
--//Обновление неймплейтов]]
local function UpdateNamePlates(self, elapsed)
--Свои цвета--
local r, g, b = self.healthBar:GetStatusBarColor()
if g + b == 0 then
self.r, self.g, self.b = cfg.hostileunit.r, cfg.hostileunit.g, cfg.hostileunit.b
self.healthBar:SetStatusBarColor(cfg.hostileunit.r, cfg.hostileunit.g, cfg.hostileunit.b)
elseif r + b == 0 then
self.r, self.g, self.b = cfg.friendlyunit.r, cfg.friendlyunit.g, cfg.friendlyunit.b
self.healthBar:SetStatusBarColor(cfg.friendlyunit.r, cfg.friendlyunit.g, cfg.friendlyunit.b)
elseif r + g == 0 then
self.r, self.g, self.b = cfg.friendlyplayer.r, cfg.friendlyplayer.g, cfg.friendlyplayer.b
self.healthBar:SetStatusBarColor(cfg.friendlyplayer.r, cfg.friendlyplayer.g, cfg.friendlyplayer.b)
elseif 2 - (r + g) < 0.05 and b == 0 then
self.r, self.g, self.b = cfg.neutralunit.r, cfg.neutralunit.g, cfg.neutralunit.b
self.healthBar:SetStatusBarColor(cfg.neutralunit.r, cfg.neutralunit.g, cfg.neutralunit.b)
else
self.r, self.g, self.b = r, g, b
end
--Обновление цвета бортика если цель сагрилась на игрока--
if not self.oldglow:IsShown() then
self.healthBar.hpBorder:SetBackdropBorderColor(0, 0, 0)
else
local r, g, b = self.oldglow:GetVertexColor()
if g + b == 0 then
self.healthBar.hpBorder:SetBackdropBorderColor(1, 0, 0)
else
self.healthBar.hpBorder:SetBackdropBorderColor(1, 1, 0)
end
end
self.healthBar:SetStatusBarColor(self.r, self.g, self.b)
--Размеры и позиции полосок здоровья--
self.healthBar:ClearAllPoints()
self.healthBar:SetPoint("CENTER", self.healthBar:GetParent())
self.healthBar:SetHeight(cfg.HPheight)
self.healthBar:SetWidth(cfg.HPwidth)
--Задний фон полосы здоровья-- !!! Цвет фона делаю по цвету нейм плейта но темнее , к примеру цвет равен 1,1,1 - т.е белый , я же получаю 1*0.2, 1*0.2, 1*0.2 т.е темно серый!!!
self.healthBar.hpBackground:SetVertexColor(self.r * 0.25, self.g * 0.25, self.b * 0.25)
--Позиция и размер кастбаров--
self.castBar:ClearAllPoints()
self.castBar:SetPoint("TOP", self.healthBar, "BOTTOM", 0, -4)
self.castBar:SetHeight(cfg.CBheight)
self.castBar:SetWidth(cfg.HPwidth)
self.highlight:ClearAllPoints()
self.highlight:SetAllPoints(self.healthBar)
--текст имени--
local nameString = self.oldname:GetText()
--!!! 1 буква это примерно 5 пикселей !!!-- Получаем ширину полоски хп и делим ее на 5 , как результат - длинна текста будет меняться в результате изменения ширины нейм плейта--
if string.len(nameString) < cfg.HPwidth/5 then
self.name:SetText(nameString)
else
self.name:SetFormattedText(nameString:sub(0, cfg.HPwidth/5))
end
--добавляем мусор для Элиты и Босса в виде E и B (Elite or Boss)
self.level:ClearAllPoints()
self.level:SetPoint(cfg.LvLpoint, self.healthBar, cfg.LvLrelativePoint, cfg.LvLx, cfg.LvLy)
if self.boss:IsShown() then
self.level:SetText("БОС")
self.level:SetTextColor(0.8, 0.05, 0)
self.level:Show()
end
end
--Что бы не вылазил шлак от стандартных нейм плейтов при касте--
local function HideOverlay(self)
self.castbarOverlay:Hide()
self:SetHeight(cfg.CBheight)
self:ClearAllPoints()
self:SetPoint("TOP", self.healthBar, "BOTTOM", 0, -4)
end
--Цвета полоски кастов , если каст защишенный тогда цвет 0.8, 0.05, 0 , в проивном случае цвет дефолт
local function CastBarColor(self, shielded)
if shielded then
self:SetStatusBarColor(0.8, 0.05, 0)
self.CbBorder:SetBackdropBorderColor(0.75, 0.75, 0.75)
self.IcBorder:SetBackdropBorderColor(0.75, 0.75, 0.75)
else
self.CbBorder:SetBackdropBorderColor(0, 0, 0)
self.IcBorder:SetBackdropBorderColor(0, 0, 0)
end
end
--Флажок для каст бара , продолжаю прятать мусор который как сука вылазит и вылазит при кастах :D
local function onSizeChanged(self)
self.HideOverlay = true
end
local function onValueChanged(self, curValue)
UpdateCastTime(self, curValue)
if self.HideOverlay then
HideOverlay(self)
self.HideOverlay = nil
end
end
local function onShow(self)
self.channeling = UnitChannelInfo("target")
HideOverlay(self)
CastBarColor(self, self.shieldedRegion:IsShown())
end
local function onHide(self)
self.highlight:Hide()
self.healthBar.hpBorder:SetBackdropBorderColor(0, 0, 0)
end
--Вцет смена цвета если каст не сбиваемый
local function onEvent(self, event, unit)
if unit == "target" then
if self:IsShown() then
CastBarColor(self, event == "UNIT_SPELLCAST_NOT_INTERRUPTIBLE")
end
end
end
--Ну теперь осталось дело за мылм , все АПИ можно увидить на wowwiki.com о которых я писал в постах ранее
local CreateNamePlates = function(self)
if self.done then
return
end
self.nameplate = true
self.healthBar, self.castBar = self:GetChildren()
local healthBar, castBar = self.healthBar, self.castBar
local glowRegion, overlayRegion, castbarOverlay, shieldedRegion, spellIconRegion, highlightRegion, nameTextRegion, levelTextRegion, bossIconRegion, raidIconRegion, stateIconRegion = self:GetRegions()
--Прячем старую строчку имени и создаем новую
self.oldname = nameTextRegion
nameTextRegion:Hide()
local CreateName = self:CreateFontString()
CreateName:SetPoint(cfg.Npoint, healthBar, cfg.NrelativePoint, cfg.Nx, cfg.Ny)
CreateName:SetFont(media.font, cfg.NameFontSize, "OUTLINE")
CreateName:SetTextColor(0.84, 0.75, 0.65)
CreateName:SetShadowOffset(1, -1)
self.name = CreateName
--Редактируем уровень
self.level = levelTextRegion
levelTextRegion:SetFont(media.font, cfg.LvLFontSize, "OUTLINE")
levelTextRegion:SetShadowOffset(1, -1)
--Редактируем полоску хп
healthBar:SetStatusBarTexture(media.normTex)
healthBar.hpBackground = healthBar:CreateTexture(nil, "BORDER")
healthBar.hpBackground:SetAllPoints(healthBar)
healthBar.hpBackground:SetTexture(media.back)
healthBar.hpBackground:SetVertexColor(0.15, 0.15, 0.15)
healthBar.hpBorder = CreateFrame("Frame", nil, healthBar)
healthBar.hpBorder:SetFrameLevel(healthBar:GetFrameLevel() -1 > 0 and healthBar:GetFrameLevel() -1 or 0)
healthBar.hpBorder:SetPoint("TOPLEFT", healthBar, "TOPLEFT", -cfg.border, cfg.border)
healthBar.hpBorder:SetPoint("BOTTOMRIGHT", healthBar, "BOTTOMRIGHT", cfg.border, -cfg.border)
healthBar.hpBorder:SetBackdrop(backdrop)
healthBar.hpBorder:SetBackdropColor(0, 0, 0)
healthBar.hpBorder:SetBackdropBorderColor(0, 0, 0)
--редактируем полоску каста
castBar.castbarOverlay = castbarOverlay
castBar.healthBar = healthBar
castBar.shieldedRegion = shieldedRegion
castBar:SetStatusBarTexture(media.normTex)
--!!! фикс мусора и изменение цвета каст баров!!!--
castBar:HookScript("OnShow", onShow)
castBar:HookScript("OnSizeChanged", onSizeChanged)
castBar:HookScript("OnValueChanged", onValueChanged)
castBar:HookScript("OnEvent", onEvent)
castBar:RegisterEvent("UNIT_SPELLCAST_INTERRUPTIBLE")
castBar:RegisterEvent("UNIT_SPELLCAST_NOT_INTERRUPTIBLE")
--время произнесения заклинания
castBar.time = castBar:CreateFontString(nil, "ARTWORK")
castBar.time:SetPoint("RIGHT", castBar, "LEFT", -2, 0)
castBar.time:SetFont(media.font, cfg.CBtieFont, "OUTLINE")
castBar.time:SetTextColor(0.84, 0.75, 0.65)
castBar.time:SetShadowOffset(1, -1)
--задний фон каст бара
castBar.cbBackground = castBar:CreateTexture(nil, "BACKGROUND")
castBar.cbBackground:SetAllPoints(castBar)
castBar.cbBackground:SetTexture(media.back)
castBar.cbBackground:SetVertexColor(0.15, 0.15, 0.15)
castBar.CbBorder = CreateFrame("Frame", nil, castBar)
castBar.CbBorder:SetFrameLevel(castBar:GetFrameLevel() -1 > 0 and castBar:GetFrameLevel() -1 or 0)
castBar.CbBorder:SetPoint("TOPLEFT", castBar, "TOPLEFT", -3, 3)
castBar.CbBorder:SetPoint("BOTTOMRIGHT", castBar, "BOTTOMRIGHT", 3, -3)
castBar.CbBorder:SetBackdrop(backdrop)
castBar.CbBorder:SetBackdropColor(0.25, 0.25, 0.25, 0)
castBar.CbBorder:SetBackdropBorderColor(0, 0, 0)
castBar.Holder = CreateFrame("Frame", nil, castBar)
castBar.Holder:SetFrameLevel(castBar.Holder:GetFrameLevel() + 1)
castBar.Holder:SetAllPoints()
--!!!возможно нужен фикс!!!--иконка спела , который кастует юнит--
spellIconRegion:ClearAllPoints()
spellIconRegion:SetParent(castBar)
spellIconRegion:SetTexCoord(.08, .92, .08, .92)
spellIconRegion:SetPoint("BOTTOMLEFT", castBar, "BOTTOMRIGHT", cfg.CBheight, 0)
spellIconRegion:SetSize(cfg.CBheight, cfg.CBheight)
spellIconRegion.IconBackdrop = CreateFrame("Frame", nil, castBar)
spellIconRegion.IconBackdrop:SetPoint("TOPLEFT", spellIconRegion, "TOPLEFT", -3, 3)
spellIconRegion.IconBackdrop:SetPoint("BOTTOMRIGHT", spellIconRegion, "BOTTOMRIGHT", 3, -3)
spellIconRegion.IconBackdrop:SetBackdrop(backdrop)
spellIconRegion.IconBackdrop:SetBackdropColor(0, 0, 0)
spellIconRegion.IconBackdrop:SetBackdropBorderColor(0, 0, 0)
highlightRegion:SetTexture(media.normTex)
highlightRegion:SetVertexColor(0.25, 0.25, 0.25)
self.highlight = highlightRegion
--настройка иконок рейда--
raidIconRegion:ClearAllPoints()
raidIconRegion:SetPoint(cfg.Rpoint, healthBar, cfg.RrelativePoint, cfg.Rx, cfg.Ry)
raidIconRegion:SetTexture("Interface\\AddOns\\nameplates\\media\\textures\\raidicons.blp")
raidIconRegion:SetSize(cfg.rheight, cfg.rheight)
self.oldglow = glowRegion
self.elite = stateIconRegion
self.boss = bossIconRegion
castBar.IcBorder = spellIconRegion.IconBackdrop
self.done = true
glowRegion:SetTexture(nil)
overlayRegion:SetTexture(nil)
shieldedRegion:SetTexture(nil)
castbarOverlay:SetTexture(nil)
stateIconRegion:SetTexture(nil)
bossIconRegion:SetTexture(nil)
self:SetScript("OnHide", onHide)
self:SetScript("OnUpdate", UpdateNamePlates)
self:SetScript("OnShow", UpdateNamePlates)
end
local NumChild = 0
NamePlates:SetScript("OnUpdate", function(this, ...)
local NewNumChild = WorldFrame:GetNumChildren()
if NewNumChild ~= NumChild then
for i = NumChild + 1, NewNumChild do
local frame = select(i, WorldFrame:GetChildren())
if IsNamePlate(frame) then
CreateNamePlates(frame)
end
end
NumChild = NewNumChild
end
end)