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

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

Показано с 1 по 1 из 1
  1. #1
    Инопланетянин
    Регистрация
    20.03.2012
    Сообщений
    4,192
    Поблагодарил(а)
    362
    Получено благодарностей: 1,439 (сообщений: 839).
    Репутация: 2399

    Модуль - отслеживания аур на игроке.

    Треды на счет трекера аур создаются наиболее часто , по этой причине с него и начну.

    Модуль работает следующим образом:

    1) Создается конфиг , т.е простой массив в который записываются категории и настройки для них
    2) При инициализации модуля создается якорь , от которого и будут появляться иконки его категории.
    3) При обработке событий перебираются все ауры игрока и создаются иконки для каждой категории относительно ее фильтра.
    4) Вывод иконок на экран.
    5) Скрытие неактивных иконок (время действия которых вышло).

    PHP код:
    local addonns = ...


    local p ns:NewModule("Procs")

    -- 
    массив с настройками
    local cfg 
    = {
        [
    "auras"] = { -- название типа проков
            
    ["size"] = 35, -- размер иконок этого типа проков
            
    ["Filter"] = { -- айди проков которые хотим отображать
                
    [67773] = true,
                [
    67708] = true,
            },
            [
    "point"] = {"CENTER""CENTER"080}, -- позиции относительно центра экрана
            
    ["cols"] = 10, -- количество иконок в ряду
            
    ["spacing"] = 2, -- промежутки между иконками
            
    ["num"] = 10, -- максимальное количество отображаемых иконок
            
    ['growth-x'] = "RIGHT", -- направление роста
            
    ["initialAnchor"] = "TOPRIGHT", -- начальная позиция иконок
            
    ["stackSize"] = 16, -- размер текста стаков
            
    ["spellSize"] = 14, -- размер названия спела (выключено но не стирать)
            [
    "timeSize"] = 14 -- размер таймера
        
    }
    }

    -- 
    немного луа апиговорят быстрее работает но хзхз
    local floor 
    math.floor
    local tinsert
    GetTime table.insertGetTime

    -- массив в котором храним созданные типы проков
    local headers 
    = {}

    -- 
    разумеется нужно создавать иконки
    local createAuraIcon 
    = function(iconsindex)
        
    local button CreateFrame("frame"nilicons)

        
    button:SetWidth(icons.size)
        
    button:SetHeight(icons.size)

        
    local icon button:CreateTexture(nil"BORDER")
        
    icon:SetAllPoints(button)
        
        
    local spell button:CreateFontString(nil"OVERLAY")
        
    spell:SetFont("Fonts\\FRIZQT__.TTF"icons.spellSize"OUTLINE")
        
    spell:SetPoint("TOP"button"BOTTOM"0, -icons.spellSize)
        
    spell:Hide()
        
        
    local timer button:CreateFontString(nil"OVERLAY")
        
    timer:SetFont("Fonts\\FRIZQT__.TTF"icons.timeSize"OUTLINE")
        
    timer:SetPoint("TOP"button"BOTTOM"0, -2)
        
        
    local count button:CreateFontString(nil"OVERLAY")
        
    count:SetFont("Fonts\\FRIZQT__.TTF"icons.stackSize"OUTLINE")
        
    count:SetPoint("BOTTOMRIGHT"button"BOTTOMRIGHT", -10)

        
    tinsert(iconsbutton)

        
    button.parent icons
        button
    .icon icon
        button
    .count count
        button
    .spell spell
        button
    .timer timer

        
    return button
    end

    -- таймер для вывода времени прока
    local OnUpdate
    do
        
    local format ns.FormatTime
        OnUpdate 
    = function(self)
            
    local endTime self.timeLeft GetTime()
            if 
    endTime 0 then -- нам не нужны отрицательные значения для таймера прока (пинг\низкий фпс и тд способствуют)
                
    self.timer:SetText(
                    
    format(self.timeLeft GetTime())
                )
            
    end
        end
    end

    -- обновление иконок 
    local updateIcon 
    = function(iconsindexoffsetfiltervisible)

        
    local nameranktexturecountdtypedurationtimeLeftcasterisStealableshouldConsolidatespellID UnitAura("player"indexfilter)

        if(
    namethen
            local n 
    visible offset 1
            local icon 
    icons[n]
            if(
    not iconthen
                icon 
    createAuraIcon(iconsn)
            
    end
            
            local show 
    icons.Filter[spellID] -- фильтр из конфига выше

            
    if(showthen

                
    if(duration and duration 0then
                    icon
    .timeLeft timeLeft
                    icon
    :SetScript("OnUpdate"OnUpdate)
                elseif 
    duration==0 then
                    icon
    :SetScript("OnUpdate"nil)
                
    end
                
                icon
    .spell:SetText(name)
                
    icon.icon:SetTexture(texture)
                
    icon.count:SetText((count and count))

                
    icon:Show()
                return 
    1
            
    else
                return 
    0
            end
        end
    end

    -- разделяем иконки на активные и не активныене активные прячем активные обновляем
    local filterIcons 
    = function(iconsfilterlimitoffsetdontHide)
        if(
    not offsetthen offset 0 end
        local index 
    1
        local visible 
    0
        
    while(visible limit) do
            
    local result updateIcon(iconsindexoffsetfiltervisible)
            if(
    not resultthen
                
    break
            elseif(
    result == 1then
                visible 
    visible 1
            end

            index 
    index 1
        end

        
    if(not dontHidethen
            
    for visible offset 1#icons do
                
    icons[i]:Hide()
            
    end
        end

        
    return visible
    end

    -- обработчик событий и формирование строк и столбцов
    local UNIT_AURA 
    = function(selfeventunit)
        if 
    unit and unit~="player" then return end -- незачем обрабатывать ауры игрока если измнение аур было для другого юнитапросто прерываем выполнение функции.
        for 
    nameheader in pairs(headers) do
            if 
    header then
                filterIcons
    (header'HELPFUL'header.num)
                
    local sizex header.size + (header['spacing-x'] or header.spacing or 0)
                
    local sizey header.size + (header['spacing-y'] or header.spacing or 0)
                
    local anchor header.initialAnchor or "BOTTOMLEFT"
                
    local growthx = (header["growth-x"] == "LEFT" and -1) or 1
                local growthy 
    = (header["growth-y"] == "DOWN" and -1) or 1
                local cols 
    floor(header.cols .5)

                for 
    1#header do
                    
    local button header[i]

                    if(
    not buttonthen break end
                    local col 
    = (1) % cols
                    local row 
    floor((1) / cols)

                    
    button:ClearAllPoints()
                    
    button:SetPoint(anchorheaderanchorcol sizex growthxrow sizey growthy)
                
    end
            end
        end
    end

    function p:Init()
        -- 
    инициализация создаем категории иконок по конфигу (который в самом начале кода)
        for 
    keyvalue in pairs(cfg) do
            
    local header CreateFrame("frame"UIParent)
            if 
    type(value)=="table" then
                
    for namecfg in pairs(value) do
                    
    header[name] = cfg
                end
                header
    :SetSize(header.sizeheader.size)
                
    header:SetPoint(header.point.aUIParentheader.point.bheader.point.xheader.point.y)
            
    end
            headers
    [key] = header
        end
        
        self
    :RegisterEvent("UNIT_AURA"UNIT_AURA)
        
    self:RegisterEvent("PLAYER_ENTERING_WORLD"UNIT_AURA)
    end 

    Таким образом дублируя эту часть
    PHP код:
        ["auras"] = { -- название типа проков
            
    ["size"] = 35, -- размер иконок этого типа проков
            
    ["Filter"] = { -- айди проков которые хотим отображать
                
    [67773] = true,
                [
    67708] = true,
            },
            [
    "point"] = {"CENTER""CENTER"080}, -- позиции относительно центра экрана
            
    ["cols"] = 10, -- количество иконок в ряду
            
    ["spacing"] = 2, -- промежутки между иконками
            
    ["num"] = 10, -- максимальное количество отображаемых иконок
            
    ['growth-x'] = "RIGHT", -- направление роста
            
    ["initialAnchor"] = "TOPRIGHT", -- начальная позиция иконок
            
    ["stackSize"] = 16, -- размер текста стаков
            
    ["spellSize"] = 14, -- размер названия спела (выключено но не стирать)
            [
    "timeSize"] = 14 -- размер таймера
        

    и изменяя ключ массива (в данном случае ["auras"] можно создавать практически нечем не ограниченное количество категорий для тайминга аур игрока.
    Последний раз редактировалось DreamlØlz; 22.05.2016 в 14:14.

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

    Arena_noTdie (02.07.2019),Foximys (21.05.2016)

Похожие темы

  1. Чмтеры на оке
    от White Queen в разделе Нарушители
    Ответов: 1
    Последнее сообщение: 18.02.2014, 10:51
  2. Самбас а так же Локе'нахак
    от Eugnes в разделе Корзина
    Ответов: 0
    Последнее сообщение: 30.07.2013, 00:08
  3. Локе'нахак
    от Rassen80 в разделе Корзина
    Ответов: 1
    Последнее сообщение: 09.03.2012, 17:18

Ваши права

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