Страница 1 из 1

Входящий урон за последние 5 секунд (+гайд)

Добавлено: 22 май 2024, 11:58
noname123
Было бы не плохо добавить возможность проверять сколько было получено урона игроком за последние 5 секунд.

Вариантов использования довольно прилично. Для более грамотного прожатия сейва заранее (не когда уже лицо на полу будет), определения сколько стакать меха у друида чтобы можно было начать сливать рагу на дамаг, определения сколько дополнительно хильнёт DS у блад дк (про DS у блад дк чуть позже выложу у бладов в сборках).

Покажу на примере блада как это будет выглядеть.

Вставляем в пользовательский код в боте внизу.

Код: Выделить всё

frame = CreateFrame("FRAME")
frame:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
local damageTable = {}
local updatedamageInterval = 0.1
local eventIndex = 0
frame:SetScript("OnEvent", function(self, event, ...)
    if event == "COMBAT_LOG_EVENT_UNFILTERED" then
        local timestamp, cleuEvent, hideCaster, sourceGUID, sourceName, sourceFlags, sourceRaidFlags, destGUID, destName, destFlags, destRaidFlags, spellId, spellName, spellSchool, param15, param16, param17, param18, param19, param20;
        eventIndex = eventIndex + 1
        local t = time()   
        if checkVersionOld(1,3) then
            timestamp, cleuEvent, sourceGUID, sourceName, sourceFlags, destGUID, destName, destFlags, spellId, spellName, spellSchool, param15, param16, param17, param18, param19, param20 = ...;
        elseif checkVersionOld(4,7) then
            timestamp, cleuEvent, hideCaster, sourceGUID, sourceName, sourceFlags, sourceRaidFlags, destGUID, destName, destFlags, destRaidFlags, spellId, spellName, spellSchool, param15, param16, param17, param18, param19, param20 = ...;
        else
            timestamp, cleuEvent, hideCaster, sourceGUID, sourceName, sourceFlags, sourceRaidFlags, destGUID, destName, destFlags, destRaidFlags, spellId, spellName, spellSchool, param15, param16, param17, param18, param19, param20 = CombatLogGetCurrentEventInfo();
        end
        if cleuEvent == "SWING_DAMAGE" and isPlayer(destGUID) then
            local _, _, _, _, _, _, _, _, _, _, _, amount = CombatLogGetCurrentEventInfo()
            damageTable[eventIndex] = {t, amount}
        elseif (cleuEvent == "SPELL_DAMAGE" or cleuEvent == "SPELL_PERIODIC_DAMAGE" or cleuEvent == "RANGE_DAMAGE") and isPlayer(destGUID) then
            local _, _, _, _, _, _, _, _, _, _, _, _, _, _, amount = CombatLogGetCurrentEventInfo()
            damageTable[eventIndex] = {t, amount}
        end
    end
end)
local totalTime = 0
local totalDamage = 0
local damageInLast5Seconds = 0
frame:SetScript("OnUpdate", function(self, elapsed)
    totalTime = totalTime + elapsed
    if totalTime >= updatedamageInterval then
        local t = time() - 5
        for k, v in pairs(damageTable) do
            if v[1] < t then
                damageTable[k] = nil
            else
                totalDamage = totalDamage + v[2]
            end
        end
        damageInLast5Seconds = totalDamage
        totalDamage = 0
        totalTime = 0
    end
end)
Теперь можно в своих блоках использовать условие пользовательского кода "damageInLast5Seconds" которое будет возвращать полученный вами урон в течении 5 последних секунд.
Если планируется использовать полученные данные для своевременного прожатия сейва, то нужно будет это значение сравнить с конкретным процентом вашего максимального количества хп. Сделать это можно также через пользовательский код. Например если нужно получить число равное 50% от вашего максимального значения хп, то в пользовательском коде это будет выглядеть как

Код: Выделить всё

MyUnitHealthMax("player")*0.5
В конечном итоге должно получиться вот так
damageInLast5Seconds.png
damageInLast5Seconds.png (50.75 КБ) 4549 просмотров

Re: Входящий урон за последние 5 секунд (+гайд)

Добавлено: 24 май 2024, 01:06
lilaa
Интересно, спасибо