WoW Weakaruas отслеживает несколько вражеских юнитов

В World of Warcraft я некоторое время работал над Weakaura, который будет отслеживать, сколько вражеских юнитов живы, которые игрок повредил. Одна из основных проблем, с которыми это сталкивается, заключается в том, что в группе COMBAT_LOG_EVENT_UNFILTERED заставляет ауру срабатывать каждый раз, когда кто-то в вашей группе выполняет действие, которое может вызвать много пропущенных кадров. Единственный другой вариант, который мне удалось найти, это COMBAT_LOG_EVENTОднако это не сработает, когда враг умер, и поэтому не будет удален из списка.

Мои вопросы: есть ли способ собрать эти данные в потоке, отличном от потока пользовательского интерфейса, чтобы предотвратить пропущенные кадры? Собирая эти данные в другом потоке, смогут ли эти данные использоваться для отображения информации пользователю?

Ниже приведены используемые в настоящее время триггеры (все они работают как положено)

Триггер 1

Тип - Пользовательский

Тип события - Событие

Событие (я) - COMBAT_LOG_EVENT_UNFILTERED

Пользовательский триггер:

function(...)
    ADDS = ADDS or {}; -- Where enemy units are stored

    local _, _, event, _, src, _, _, _, dest, _, _, _ = select(1, ...);
    local player = UnitGUID("player");

    -- Attempts to only read data coming from the player casting harmful abilities
    if ((event == "SPELL_DAMAGE") and (src == player)) then

        -- Checks if the enemy unit is already being tracked and that it is NOT
        -- a part of your group (prevents friendly fire events from adding a friendly
        -- unit to this list)
        if ((not tContains(ADDS, dest)) and (not tContains(GROUP, dest))) then
            table.insert(ADDS, dest);
        end
    elseif event=="UNIT_DIED" then -- Remove a unit if it has died
        for i = #ADDS, 1, -1 do
            if ADDS[i] == dest then
                table.remove(ADDS, i);
            end
        end
    end

    return true;
end

Приведенный выше блок кода является причиной потери кадров. Следующий триггер - просто средство для сброса списка, когда бой начинается или заканчивается (почти наверняка, ничто в этом блоке не вызывает пропущенные кадры, но хотел включить его на всякий случай).

Триггер 2

Тип - Пользовательский

Тип события - Событие

Событие (я) - PLAYER_REGEN_DISABLED, PLAYER_REGEN_ENABLED

function(...)
    GROUP = GROUP or {};

    local size = GetNumGroupMembers();

    if (size == 0) then
        GROUP = {};
    end

    if (size ~= #GROUP and size ~= 0) then
        for i = 1, size do
            local name = GetRaidRosterInfo(i);

            if (name ~= nil) then
                local guid = UnitGUID(name);

                if (not tContains(GROUP, guid)) then
                    table.insert(GROUP, guid);
                end
            end
        end
    end

    ADDS = {};
    return true;
end

0 ответов

Другие вопросы по тегам