Приветствуем вас на форуме проекта WoW Circle. Если вы читаете это, значит не зарегистрировались у нас. Для того, чтобы получить доступ к расширенным возможностям нашего форума нажмите сюда и пройди регистрацию, которая не займет у вас много времени. После регистрации будут доступны новые, более расширенные, возможности.
Нейм плейты

Упомянутые в теме пользователи:

Показано с 1 по 2 из 2
  1. #1
    Инопланетянин
    Регистрация
    20.03.2012
    Сообщений
    4,208
    Поблагодарил(а)
    362
    Получено благодарностей: 1,441 (сообщений: 840).
    Репутация: 2401

    Нейм плейты

    Немного теории и бреда маразматика:

    1) Что такое нейм плейта? - Это полоска здоровья над головой , включить выключить можно нажав CTRL+V.

    2) ФТВ как ее менять, ведь она не имеет не имени не четкого местоположения? - Да были такие соображения , эта подлая фрейма (точнее эти подлые статусбары) не имеет названия и четкой позиции. Но это еще не значит , что они могут просто так гулять по нашему монитору , при этом быть замеченными нами и что бы с ними ничего нельзя было сделать.



    Теперь набираемся самоуверенности от своих слов и переходим к поиску (что бы с ними чонить сделать ,нужно сразу найти) :

    Как же изменять то , у чего нет имени? - Нет ИМИНИ ??? Ну да и мр.Х с ним Изменять можно и без глобального имени. На самом деле нужно не совсем искать , а скорее отсеивать , хотя некоторые скажут "тупой критин эта жи адно и тоже".

    Ну вот теперь я излил свои мысли и можно начать рассказывать как это делать

    1) Для начала нужно знать , родительскую фрейму неймплейтов. Это либо WorldFrame либо UIParent. А теперь , куда близы их присабачили?

    Скорее всего это UIParent , но у меня сомнения. Не беда , тыкаем CTRL+V , ОНИ появляются , а теперь UIParent:Hide(), в теории , если намеплате висят на UIParent , то они должны исчезнуть вместе со всем интерфейсом. Увы но они оказались на WorldFrame. На самом деле я это знал, но решил пазадрачивать читателя нафигачив пабольше текста :p

    Теперь когда есть инфа об их родительском обьекте , можно пойти следующим путем - спамить WorldFrame:GetChildren().
    Тестим :
    PHP код:
    print(WorldFrame:GetChildren()) 
    Получаем гору мусора, которая явно не является намеплате , в этом можно убедиться сделав так print(WorldFrame:GetChildren():GetName())

    2) Теперь нужно отсеивать все обьекты , которые не являются намеплате. Отсеивать будем сразу по имени и по текстуре. Для этого нужно написать функцию , которая будет :
    a) Возвращать дырку от бублика , если у найденной фреймы есть имя.
    б) У оставшихся фреймов будем ловить текстурки, если текстурка совпадает с текстуркой нейм плейта (по названию текстурки не сложно понять , что она принадлежит намеплате) - тогда возвращаем регион (дада это и есть неймплейта, не совсем конечно нейм плейта но что то уже есть хД ).

    Выглядеть это будет примерно так:

    PHP код:
    local overlayTexture = [=[Interface\Tooltips\Nameplate-Border]=]
    local function IsNamePlate(frame)
        if 
    frame:GetName() then
            
    return
        
    end
        overlayRegion 
    = select(2, frame:GetRegions())
        return 
    overlayRegion and overlayRegion:GetObjectType() == "Texture" and overlayRegion:GetTexture() == overlayTexture
    end 
    Хотел бы я сказать что на этом все бб , но нет, теперь нужно менять текстурки , высоту ширину , выводить имя , кастбар и тд.

    Теперь когда есть теория о том как это работает - я просто выложу код с комментариями ниже т.к. когда получили регионы - дальнейшие действиея такие же как и с обычными фреймами .


    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
    ) 

    Ну и наверное стоит залить сюда результат:

    Конечный вывод памяти - ~20 килобайт , количество OnUpdate Handles = 2, внешние текстуры = 0. ФПС практически не просаживает.




    PS Возможно добавлю некоторые бафы\дебафы над ними, каст бары не зависимо от цели и внутреигровый конфиги
    Последний раз редактировалось DreamlØlz; 21.12.2014 в 05:47.

  2. 4 пользователей сказали cпасибо DreamlØlz за это полезное сообщение:

    Cosmic Psychо (29.07.2020),j.Foxy (15.02.2015),Tombstalker (22.05.2019),Юрий. (17.03.2015)

  3. #2
    Инопланетянин
    Регистрация
    20.03.2012
    Сообщений
    4,208
    Поблагодарил(а)
    362
    Получено благодарностей: 1,441 (сообщений: 840).
    Репутация: 2401
    Наверное финальная версия , кастбары отображаются для всех юнитов. Комментировать весь код не особо охота , больно уж я завелся. По этому довольствуемся комментами для конфига :p

    PHP код:
    --//НАСТРОЙКИ НАЧАЛО\\--
    --//Для удобства выннес настройки на верх]]
    local cfg = {

            --
    //Полосы здоровья и касты]]--
            
    HPheight = 15 ,--высота
            HPwidth 
    = 155 ,--ширина
            
            
            CBheight 
    = 10 , --Высота каст бара
            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 numChildren = -1
    local frames 
    = {}


    local function Castbar_OnEvent(self, event, ...)
        
    local arg1 = ...
        
    local unit = arg1
        
    if(arg1 ~= unit and arg1 == "player") then
            
    return
        
    end
           
        local name 
    = string.gsub(select(7, self:GetParent():GetRegions()):GetText(), "%s%(%*%)","")
        if 
    not(name == UnitName(unit) and self:GetParent():GetChildren():GetValue() == UnitHealth(unit)) then
            
    return
        
    end
           
        
    if(event == "UNIT_SPELLCAST_START") then
            local name
    , nameSubtext, text, texture, startTime, endTime, isTradeSkill, castID, notInterruptible = UnitCastingInfo(unit)
            if(
    not name or (not self.showTradeSkills and isTradeSkill)) then
                self
    :Hide()
                return
            
    end
                   
            self
    :SetStatusBarColor(1.0, 0.7, 0.0)
            
    self.duration = GetTime() - (startTime/1000)
            
    self.max = (endTime - startTime) / 1000
                   
            self
    :SetValue(0)
            
    self:SetMinMaxValues(0, self.max)
            
    self:SetAlpha(1.0)
                   
            if(
    self.Icon) then
                self
    .Icon:SetTexture(texture)
            
    end
                   
            self
    :SetAlpha(1.0)
            
    self.holdTime = 0
            self
    .casting = 1
            self
    .castID = castID
            self
    .delay = 0
            self
    .channeling = nil
            self
    .fadeOut = nil
                   
            
    if(self.Shield) then
                
    if(self.showShield and notInterruptible) then
                    self
    .Shield:Show()
                    if(
    self.Border) then
                        self
    .Border:Hide()
                    
    end
                    
    else
                    
    self.Shield:Hide()
                    if(
    self.Border) then
                        self
    .Border:Show()
                    
    end
                end
             end
                   
        self
    :Show()
        elseif(
    event == "UNIT_SPELLCAST_STOP" or event == "UNIT_SPELLCAST_CHANNEL_STOP") then
            
    if((self.casting and event == "UNIT_SPELLCAST_STOP" and select(4, ...) == self.castID) or (self.channeling and event == "UNIT_SPELLCAST_CHANNEL_STOP")) then
                self
    :SetValue(self.max)
                           
                if(
    event == "UNIT_SPELLCAST_STOP") then
                    self
    .casting = nil
                    self
    :SetStatusBarColor(0.0, 1.0, 0.0)
                    else
                        
    self.channeling = nil
                end
                           
                        self
    .flash = 1
                        self
    .fadeOut = 1
                        self
    .holdTime = 0
            end
                
    elseif(event == "UNIT_SPELLCAST_FAILED" or event == "UNIT_SPELLCAST_INTERRUPTED") then
                    
    if(self:IsShown() and (self.casting and select(4, ...) == self.castID) and not self.fadeOut) then
                            self
    :SetValue(self.max)
                            
    self:SetStatusBarColor(1.0, 0.0, 0.0)
                           
                            
    self.casting = nil
                            self
    .channeling = nil
                            self
    .fadeOut = 1
                            self
    .holdTime = GetTime() + CASTING_BAR_HOLD_TIME
                    end
            
    elseif(event == "UNIT_SPELLCAST_DELAYED") then
                    local castbar 
    = self
                    
    if(castbar:IsShown()) then
                            local name
    , nameSubtext, text, texture, startTime, endTime, isTradeSkill = UnitCastingInfo(unit)
                            if(
    not name or (not self.showTradeSkills and isTradeSkill)) then
                                    self
    :Hide()
                                    return
                            
    end
                           
                            local duration 
    = GetTime() - (startTime / 1000)
                            if(
    duration < 0) then duration = 0 end
                            castbar
    .delay = castbar.delay + castbar.duration - duration
                            castbar
    .duration = duration
                           
                            castbar
    :SetValue(duration)
                           
                            if(
    not castbar.casting) then
                                    castbar
    :SetStatusBarColor(1.0, 0.7, 0.0)
                                   
                                    
    castbar.casting = 1
                                    castbar
    .channeling = nil
                                    castbar
    .fadeOut = 0
                            end
                    end
            
    elseif(event == "UNIT_SPELLCAST_CHANNEL_START") then
                    local name
    , nameSubtext, text, texture, startTime, endTime, isTradeSkill, notInterruptible = UnitChannelInfo(unit)
                    if(
    not name or (not self.showTradeSkills and isTradeSkill)) then
                            self
    :Hide()
                            return
                    
    end
                   
                    self
    :SetStatusBarColor(0.0, 1.0, 0.0)
                    
    self.duration = ((endTime / 1000) - GetTime())
                    
    self.max = (endTime - startTime) / 1000
                    self
    .delay = 0
                    self
    :SetMinMaxValues(0, self.max)
                    
    self:SetValue(self.duration)
                   
                    if(
    self.Icon) then
                            self
    .Icon:SetTexture(texture)
                    
    end
                   
                    self
    :SetAlpha(1.0)
                    
    self.holdTime = 0
                    self
    .casting = nil
                    self
    .channeling = 1
                    self
    .fadeOut = nil
                   
                    
    if(self.Shield) then
                            
    if(self.showShield and notInterruptible) then
                                    self
    .Shield:Show()
                                    if(
    self.Border) then
                                            self
    .Border:Hide()
                                    
    end
                            
    else
                                    
    self.Shield:Hide()
                                    if(
    self.Border) then
                                            self
    .Border:Show()
                                    
    end
                            end
                    end
                   
                    self
    :Show()
            elseif(
    event == "UNIT_SPELLCAST_CHANNEL_UPDATE") then
                    local castbar 
    = self
                    
    if(castbar:IsShown()) then
                            local name
    , nameSubtext, text, texture, startTime, endTime, isTradeSkill = UnitChannelInfo(unit)
                            if(
    not name or (not self.showTradeSkills and isTradeSkill)) then
                                    self
    :Hide()
                                    return
                            
    end
                           
                            local duration 
    = ((endTime / 1000) - GetTime())
                            
    castbar.delay = castbar.delay + castbar.duration - duration
                            castbar
    .duration = duration
                            castbar
    .max = (endTime - startTime) / 1000
                           
                            castbar
    :SetMinMaxValues(0, castbar.max)
                            
    castbar:SetValue(duration)
                    
    end
            
    elseif(event == "UNIT_SPELLCAST_INTERRUPTIBLE") then
                    
    if(self.Shield) then
                            self
    .Shield:Hide()
                            if(
    self.Border) then
                                    self
    .Border:Show()
                            
    end
                    end
            
    elseif(event == "UNIT_SPELLCAST_NOT_INTERRUPTIBLE") then
                    
    if(self.Shield) then
                            self
    .Shield:Show()
                            if(
    self.Border) then
                                    self
    .Border:Hide()
                            
    end
                    end
            end
    end
     
    local 
    function Castbar_OnUpdate(self, elapsed)
        if(
    self.casting) then
            local duration 
    = self.duration + elapsed
            
    if(duration >= self.max) then
                self
    :SetValue(self.max)
                
    self:SetStatusBarColor(0.0, 1.0, 0.0)
                
    self.holdTime = 0
                self
    .fadeOut = 0
                self
    .casting = nil
                
    return
            
    end
                   
            self
    .duration = duration
            self
    :SetValue(duration)
        elseif(
    self.channeling) then
                local duration 
    = self.duration - elapsed
            
    if(duration <= 0) then
                self
    :SetStatusBarColor(0.0, 1.0, 0.0)
                
    self.fadeOut = 0
                self
    .channeling = nil
                self
    .holdTime = 0
                
    return
            
    end
                self
    .duration = duration
                self
    :SetValue(duration)
            elseif(
    GetTime() < self.holdTime) then
                
    return
            elseif(
    self.fadeOut) then
                local alpha 
    = self:GetAlpha() - CASTING_BAR_ALPHA_STEP
            
    if(alpha > 0.05) then
                self
    :SetAlpha(alpha)
            else
                
    self.fadeOut = nil
                self
    :Hide()
            
    end
        end
    end

    local 
    function UpdateCastTime(self, curValue)
        
    local minValue, maxValue = self:GetMinMaxValues()
        if 
    self.channeling then
            local casttime 
    = string.format("%.1f", curValue)
            
    local castcur = string.format("\n%.1f", maxValue)
            
    self.time:SetText(casttime..castcur)
        else
            
    local casttime = string.format("%.1f", (maxValue-curValue))
            
    local castcur = string.format("\n%.1f", maxValue)
            
    self.time:SetText(casttime..castcur)
        
    end
    end



    local 
    function Healthbar_OnUpdate(self)

        
    local r, g, b = self:GetStatusBarColor()
        if 
    g + b == 0 then
            self
    .r, self.g, self.b = cfg.hostileunit.r, cfg.hostileunit.g, cfg.hostileunit.b
            self
    :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
    :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
    :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
    :SetStatusBarColor(cfg.neutralunit.r, cfg.neutralunit.g, cfg.neutralunit.b)
        else
            
    self.r, self.g, self.b = r, g, b
        end

        frame 
    = self:GetParent()
        if 
    not frame.oldglow:IsShown() then
            self
    .hpBorder:SetBackdropBorderColor(0, 0, 0)
        else
            
    local r, g, b = frame.oldglow:GetVertexColor()
            if 
    g + b == 0 then
                self
    .hpBorder:SetBackdropBorderColor(1, 0, 0)
            else
                
    self.hpBorder:SetBackdropBorderColor(1, 1, 0)
            
    end
        end
            self
    :SetStatusBarColor(self.r, self.g, self.b)

        
    self:ClearAllPoints()
        
    self:SetPoint("CENTER", self:GetParent(), 0, 10)
        
    self:SetHeight(cfg.HPheight)
        
    self:SetWidth(cfg.HPwidth)
        
        
    self.hpBackground:SetVertexColor(self.r * 0.25, self.g * 0.25, self.b * 0.25)
        
        
    local nameString = frame.oldname:GetText()
        if 
    string.len(nameString) < cfg.HPwidth/5 then
            frame
    .name:SetText(nameString)
        else
            
    frame.name:SetFormattedText(nameString:sub(0, cfg.HPwidth/5).."...")
        
    end
        
        frame
    .level:ClearAllPoints()
        
    frame.level:SetPoint(cfg.LvLpoint, frame.healthBar, cfg.LvLrelativePoint, cfg.LvLx, cfg.LvLy)
        if 
    frame.boss:IsShown() then
            frame
    .level:SetText("БОС")
            
    frame.level:SetTextColor(0.8, 0.05, 0)
            
    frame.level:Show()
        
    end
        frame
    .highlight:SetAllPoints(self)
    end

    local 
    function onHide(self)
        
    self.highlight:Hide()
    end
     
    local 
    function SkinObjects(frame)
        
        
    frame.healthBar, frame.castBar = frame:GetChildren()
        
    local healthBar, castBar = frame.healthBar, frame.castBar
        local glowRegion
    , overlayRegion, castbarOverlay, shieldedRegion, spellIconRegion, highlightRegion, nameTextRegion, levelTextRegion, bossIconRegion, raidIconRegion, stateIconRegion = frame:GetRegions()
        
        
    frame.oldname = nameTextRegion
        nameTextRegion
    :Hide()
        
    nameTextRegion.Show = function() end
        
        frame
    .name = frame:CreateFontString()
        
    frame.name:SetPoint(cfg.Npoint, healthBar, cfg.NrelativePoint, cfg.Nx, cfg.Ny)
        
    frame.name:SetFont(media.font, cfg.NameFontSize, "OUTLINE")
        
    frame.name:SetTextColor(0.84, 0.75, 0.65)
        
    frame.name:SetShadowOffset(1, -1)
        
        
    frame.level = levelTextRegion
        levelTextRegion
    :SetFont(media.font, cfg.LvLFontSize, "OUTLINE")
        
    levelTextRegion:SetShadowOffset(1, -1)
        
    frame.boss = bossIconRegion
        
        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)
        
    healthBar:SetScript('OnUpdate', Healthbar_OnUpdate)
        
        
    highlightRegion:SetTexture(media.normTex)
        
    highlightRegion:SetVertexColor(0.25, 0.25, 0.25)
        
    frame.highlight = highlightRegion
            
        local castbar 
    = CreateFrame("StatusBar", nil, frame)
        
    castbar:SetHeight(cfg.CBheight)
        
    castbar:SetWidth(cfg.HPwidth-(cfg.CBheight+8))
        
    castbar:SetStatusBarTexture(media.normTex)
        
    castbar:GetStatusBarTexture():SetHorizTile(false)
        
    castbar:GetStatusBarTexture():SetVertTile(false)
        
    castbar:SetPoint("TOPRIGHT", healthBar, "BOTTOMRIGHT", 0, -8)
           
        
    castbar.showTradeSkills = true
        castbar
    .showShield = true
        castbar
    .casting = true
        castbar
    .channeling = true
        castbar
    .holdTime = 0
              
        castbar
    .Border = castbar:CreateTexture(nil, "BACKGROUND")
        
    castbar.Border:SetSize(castbarOverlay:GetSize())
        
    castbar.Border:SetAllPoints(castbar)
        
    castbar.Border:SetTexture(media.back)
        
    castbar.Border:SetVertexColor(0,0,0, 0.8)
           
        -- 
    castbar.Shield = castbar:CreateTexture(nil, "ARTWORK")
        -- 
    castbar.Shield:SetSize(shieldedRegion:GetSize())
        -- 
    castbar.Shield:SetPoint(shieldedRegion:GetPoint())
        -- 
    castbar.Shield:SetTexture(shieldedRegion:GetTexture())
        -- 
    castbar.Shield:SetTexCoord(shieldedRegion:GetTexCoord())
           
        
    castbar.Icon = castbar:CreateTexture(nil, "ARTWORK")
        
    castbar.Icon:SetSize(spellIconRegion:GetSize())
        
    castbar.Icon:SetPoint('RIGHT', castbar, 'LEFT', -2, 0)
        
    castbar.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
        
        
    castbar.time = castbar:CreateFontString(nil, "ARTWORK")
        
    castbar.time:SetPoint("RIGHT", castbar.Icon, "LEFT", -4, 0)
        
    castbar.time:SetFont(media.font, cfg.CBtieFont, "OUTLINE")
        
    castbar.time:SetTextColor(0.84, 0.75, 0.65)
        
    castbar.time:SetShadowOffset(1, -1)
           
         --  print(
    shielded)

        
    castbar:Hide()
           
        
    castbar:RegisterEvent("UNIT_SPELLCAST_START")
        
    castbar:RegisterEvent("UNIT_SPELLCAST_FAILED")
        
    castbar:RegisterEvent("UNIT_SPELLCAST_STOP")
        
    castbar:RegisterEvent("UNIT_SPELLCAST_INTERRUPTED")
        
    castbar:RegisterEvent("UNIT_SPELLCAST_INTERRUPTIBLE")
        
    castbar:RegisterEvent("UNIT_SPELLCAST_NOT_INTERRUPTIBLE")
        
    castbar:RegisterEvent("UNIT_SPELLCAST_DELAYED")
        
    castbar:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START")
        
    castbar:RegisterEvent("UNIT_SPELLCAST_CHANNEL_UPDATE")
        
    castbar:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP")
        
    castbar:SetScript("OnEvent", Castbar_OnEvent)
        
    castbar:SetScript("OnUpdate", Castbar_OnUpdate)
        
    castbar:HookScript("OnValueChanged", UpdateCastTime)
           
        
    frame.oldglow = glowRegion
        frame
    :SetScript('OnHide', onHide)
        
        
    frames[frame] = true
            
        glowRegion
    :SetTexture(nil)
        
    overlayRegion:SetTexture(nil)
        
    shieldedRegion:SetTexture(nil)
        
    castbarOverlay:SetTexture(nil)
        
    stateIconRegion:SetTexture(nil)
        
    bossIconRegion:SetTexture(nil)
        
    end
     
    local select 
    = select
    local 
    function HookFrames(...)
        for 
    index = 1, select("#", ...) do
            
    local frame = select(index, ...)
            
    local region = frame:GetRegions()
            if(
    not frames[frame] and not frame:GetName() and region and region:GetObjectType() == "Texture" and region:GetTexture() == [=[Interface\TargetingFrame\UI-TargetingFrame-Flash]=]) then
                SkinObjects
    (frame)
            
    end
        end
    end
     
    local t 
    = .1
    CreateFrame
    ("Frame"):SetScript("OnUpdate", function(self, elapsed)
        if(
    WorldFrame:GetNumChildren() ~= numChildren) then
            numChildren 
    = WorldFrame:GetNumChildren()
            
    HookFrames(WorldFrame:GetChildren())
        
    end
    end
    ) 
    Последний раз редактировалось DreamlØlz; 21.12.2014 в 23:22.

  4. 10 пользователей сказали cпасибо DreamlØlz за это полезное сообщение:

    (Станислав) (20.01.2020),Arena_noTdie (02.07.2019),Cosmic Psychо (29.07.2020),greensun (13.03.2015),HiBerni (19.01.2019),j.Foxy (15.02.2015),Lophophora (03.08.2015),Tombstalker (22.05.2019),Юрий. (17.03.2015),аффтор (14.01.2016)

Похожие темы

  1. ОР, Флейм
    от Grandhades в разделе Корзина
    Ответов: 6
    Последнее сообщение: 26.06.2015, 08:46
  2. Фрейм босса
    от RIKODOU в разделе Аддоны
    Ответов: 4
    Последнее сообщение: 03.03.2015, 20:52
  3. Прозьба к Гейм мастерам.
    от Rainhart в разделе Архив
    Ответов: 1
    Последнее сообщение: 04.01.2014, 22:42
  4. Мат ,флейм.
    от -Agrael- в разделе Заявки на бан
    Ответов: 2
    Последнее сообщение: 06.11.2013, 19:22
  5. Ув. Гейм мастера
    от boss110986 в разделе Архив
    Ответов: 7
    Последнее сообщение: 07.11.2012, 23:21

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •