Справочник › Справочник функций › Functions

Functions.trends.calculate

общедоступный

Как вызывать

Functions.trends.calculate(history, window, noheals, nodmg)

Запишите его как зависимость с именем Functions.trends.calculate (принятие автодополнения делает это само) и вызывайте по этому имени.

Что делает

Оценить знаковое изменение здоровья по взвешенной истории урона и исцеления. Урон даёт отрицательную скорость, исцеление — положительную. Если окно не передано, читается действующее окно профиля; используются действующие часы и старая служба округления, сохраняются прежнее взвешивание и расчёт округлённого возраста. Этот помощник не проверяет и не очищает историю, не ограничивает метки времени и не гарантирует конечный результат.

Аргументы

ИмяТипЧто делает
historytable | false | nilЗапись истории с массивами урона и исцеления из записей время/значение, новые первыми. При ложной истории возвращается только ноль без чтения часов.
windownumber | false | nilОкно взвешивания в секундах; при nil или false используется текущая настройка профиля damage_history.
nohealsboolean | nilИстинное значение пропускает поток исцеления, не читая его массив.
nodmgboolean | nilИстинное значение пропускает поток урона, не читая его массив.

Возвращает

1numberОбщая знаковая взвешенная скорость по исходной формуле; при некорректных или бесконечных входных данных сохраняется прежнее поведение ошибки/числа.
2number | nilБольший округлённый возраст потока в секундах — не число выборок и не доказательство непрерывного наблюдения. Опускается, если история ложна.

Издания

Встроенные помощники регистрируются во всех изданиях. Различается игровой API, который они читают; если нужного API нет, помощник использует запасной вариант или возвращает nil с причиной.

  • Недоступно в этом издании (причина — во всплывающей подсказке)
  • Только пока включены запасные реализации Blizzard для устаревших функций
Игровой APIClassic EraTBC AnniversaryClassic ProgressionForeverRetail
GetTimeClassic EraTBC AnniversaryClassic ProgressionForeverRetail

Пример

local guid = UnitGUID("target")
local history = guid and addon.damageHistory[guid]
if not history then return false end
local rate = Functions.trends.calculate(history, 5, true)
return rate < -1000

Исходный код

Functions/trends.lua, строка 75. В игре только для чтения; «Дублировать» создаёт редактируемую копию.

Functions.trends.calculate(history, window, noheals, nodmg)
    if not history then
        return 0
    end

    if not window then
        window = addon.db.profile.damage_history
    end

    local now = GetTime()
    local damage_total, damage_count, damage_seconds = 0, 0, 0
    local heal_total, heal_count, heal_seconds = 0, 0, 0

    local maxoffs, data = 0, {}
    if not nodmg then
        for _,v in ipairs(history.damage) do
            local diff = now - v.time
            local scale = window - diff
            maxoffs = addon.round(diff)
            if maxoffs > window then
                break
            end

            if v.value then
                data[maxoffs] = (data[maxoffs] or 0) + (v.value * scale)
            end
        end
        damage_seconds = maxoffs
        for i=0,maxoffs do
            damage_total = damage_total + (data[i] or 0)
            damage_count = damage_count + (window - i)
        end
    end

    if not noheals then
        maxoffs, data = 0, {}
        for _,v in ipairs(history.heals) do
            local diff = now - v.time
            local scale = window - diff
            maxoffs = addon.round(diff)
            if maxoffs > window then
                break
            end

            if v.value then
                data[maxoffs] = (data[maxoffs] or 0) + (v.value * scale)
            end
        end
        heal_seconds = maxoffs
        for i=0,maxoffs do
            heal_total = heal_total + (data[i] or 0)
            heal_count = heal_count + (window - i)
        end
    end

    return (((damage_count > 0) and (-damage_total / damage_count) or 0) +
           ((heal_count > 0) and (heal_total / heal_count) or 0)),
           (damage_seconds > heal_seconds and damage_seconds or heal_seconds)

Назад: Справочник функций