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