Referência › Referência de funções › Functions

Functions.trends.calculate

pública

Chame como

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

Registre-a como uma dependência chamada Functions.trends.calculate (aceitar o preenchimento automático faz isso) e depois chame-a por esse nome.

O que faz

Estima a variação de vida com sinal a partir do histórico ponderado de dano e cura. O dano contribui com uma taxa negativa e a cura com uma positiva. Lê a janela do perfil ao vivo quando nenhuma janela é fornecida, usa o relógio ao vivo e o serviço de arredondamento antigo, e preserva a ponderação existente e o cálculo de idade arredondada. Esta função auxiliar não valida nem higieniza o histórico, não limita marcas de tempo nem garante resultados finitos.

Argumentos

NomeTipoO que faz
historytable | false | nilRegistro de histórico com arrays de dano e cura, do mais recente ao mais antigo, com entradas de tempo/valor. Um histórico falso retorna apenas zero sem ler o relógio.
windownumber | false | nilJanela de ponderação em segundos; nil ou false usam a configuração damage_history do perfil atual.
nohealsboolean | nilUm valor verdadeiro ignora o fluxo de cura sem ler o array dele.
nodmgboolean | nilUm valor verdadeiro ignora o fluxo de dano sem ler o array dele.

Retornos

1numberTaxa ponderada combinada com sinal da fórmula original; entradas malformadas ou não finitas mantêm o comportamento antigo de erro/numérico.
2number | nilMaior idade arredondada do fluxo em segundos; não é uma contagem de amostras nem prova de observação contínua. Omitida quando o histórico é falso.

Edições

As funções auxiliares integradas são registradas em todas as edições. O que muda é a API do jogo que elas leem; quando uma está ausente, a função auxiliar recorre a uma alternativa ou retorna nil com um motivo.

  • Indisponível nessa edição (o motivo está na dica)
  • Só enquanto as alternativas da Blizzard para APIs obsoletas estiverem ativas
API do jogoClassic EraTBC AnniversaryClassic ProgressionForeverRetail
GetTimeClassic EraTBC AnniversaryClassic ProgressionForeverRetail

Exemplo

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

Código-fonte

Functions/trends.lua, linha 75. Somente leitura no jogo; Duplicar cria uma cópia editável.

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)

Voltar para Referência de funções