Referencia › Referencia de funciones › Functions

Functions.trends.calculate

pública

Llamar como

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

Regístrala como dependencia con el nombre Functions.trends.calculate (aceptar la sugerencia de autocompletado lo hace por ti) y luego llámala con ese nombre.

Qué hace

Estima el cambio de salud con signo a partir del historial ponderado de daño y sanación. El daño aporta un ritmo negativo y la sanación uno positivo. Lee la ventana del perfil en vivo cuando no se proporciona ninguna, usa el reloj en vivo y el servicio de redondeo antiguo, y conserva la ponderación existente y el cálculo de edad redondeada. Esta función auxiliar no valida ni depura el historial, no recorta las marcas de tiempo ni garantiza resultados finitos.

Argumentos

NombreTipoQué hace
historytable | false | nilRegistro de historial con matrices de daño y sanación, de la más reciente a la más antigua, con entradas de tiempo/valor. Un historial falso devuelve solo cero sin leer el reloj.
windownumber | false | nilVentana de ponderación en segundos; nil o false usan el ajuste damage_history del perfil actual.
nohealsboolean | nilUn valor verdadero omite el flujo de sanación sin leer su matriz.
nodmgboolean | nilUn valor verdadero omite el flujo de daño sin leer su matriz.

Retornos

1numberRitmo ponderado combinado con signo de la fórmula original; las entradas mal formadas o no finitas mantienen el comportamiento antiguo de error/numérico.
2number | nilMayor edad redondeada del flujo en segundos; no es un número de muestras ni prueba de observación continua. Se omite cuando el historial es falso.

Ediciones

Las funciones auxiliares integradas se registran en todas las ediciones. Lo que cambia es la API del juego que leen; donde falta alguna, la función auxiliar recurre a una alternativa o devuelve nil con un motivo.

  • No disponible en esa edición (el motivo aparece en la información emergente)
  • Solo mientras estén activas las alternativas de Blizzard para API obsoletas
API del juegoClassic EraTBC AnniversaryClassic ProgressionForeverRetail
GetTimeClassic EraTBC AnniversaryClassic ProgressionForeverRetail

Ejemplo

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 fuente

Functions/trends.lua, línea 75. Solo lectura en el juego; Duplicar crea una copia editable.

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)

Volver a Referencia de funciones