Aufruf als
addon:GetConditionHealthForecast(unit, healthTarget, percentage, mode, cache)
Direkt über addon verfügbar; keine Abhängigkeit nötig.
Was sie bewirkt
Zeit bis zur ausgewählten Gesundheit schätzen. Vollständige native Identitäts- und verzögerte Skalarbeobachtungen werden pro Auswertungsdurchlauf zwischengespeichert, während Anbieter, Verlauf, Fenster, Uhr und Prognose live bleiben. Exakte Gleichheit mit dem Zielwert ergibt null vor jeder Verlaufsarbeit. Bewusste Ergebnisse false (keine Schätzung) und initialisierte Null bei null oder entgegengesetzten Raten bleiben erhalten; erforderliche ungültige Fakten, Überlauf oder Erschöpfung des Arbeitsbudgets von 4096 Einheiten ergeben „nicht verfügbar“. Der Verlauf wird nie verändert und keine Teilschätzung erfunden.
Argumente
| Name | Typ | Was sie bewirkt |
|---|---|---|
self | RMAddon | Addon-Instanz von Rotation Master (bei Doppelpunktaufrufen implizit). |
unit | string | Ausgewählte Einheitenkennung, in Beobachtungen unverändert. |
healthTarget | number | Absolutes Gesundheitsziel (negativ bedeutet Defizit) oder Prozentwert als Bruchteil. |
percentage | boolean | True wählt ein prozentuales Ziel und optionale frische Anbieterfakten. |
mode | any | noheals wählt nur Schaden; nodmg wählt nur Heilung; andere lesbare Werte wählen beides. |
cache | table | nil | Nativer Beobachtungs-Cache des Auswertungsdurchlaufs; nil fragt neu ab. |
Rückgabewerte
| 1 | number | boolean | nil | Endliche voraussichtliche Restzeit einschließlich null, false bei bekannter Abwesenheit/keiner Schätzung oder nil, wenn nicht verfügbar. |
|---|---|---|
| 2 | string | nil | Verfügbarkeitsgrund aus Beobachtung, Verlauf, Arbeitslimit oder Arithmetik. |
Editionen
Integrierte Hilfsfunktionen werden auf jeder Edition registriert. Unterschiedlich ist die Spiel-API, die sie lesen; fehlt eine, weicht die Hilfsfunktion aus oder gibt nil mit einem Grund zurück.
Sie liest keine Spiel-API direkt.
Geheime Werte (Retail und Forever)
Auf Retail und Forever übergibt das Spiel Addons geheime Werte. Diese Hilfsfunktion prüft, was sie liest (addon.Platform:CanReadValue), und gibt statt eines geheimen Werts, den sie nicht vergleichen kann, nil mit einem Grund wie restricted-value zurück. Behandeln Sie nil als nicht verfügbar, nicht als false.
Wie das Addon sie aufruft
- Zeit bis Gesundheit (evaluate)
local eta,reason=addon:GetConditionHealthForecast(value.unit,value.health,false,value.mode,cache) - Zeit bis Gesundheit in Prozent (evaluate)
local eta,reason=addon:GetConditionHealthForecast(value.unit,value.health,true,value.mode,cache)
Abhängigkeiten
finite→Core.health_forecast_conditions.finitenativeValue→Core.health_forecast_conditions.nativeValuereadField→Core.health_forecast_conditions.readField
Quelle
Core/health_forecast_conditions.lua, Zeile 78. Im Spiel schreibgeschützt; Duplizieren erstellt eine bearbeitbare Kopie.
Core.health_forecast_conditions.GetConditionHealthForecast(self, unit, healthTarget, percentage, mode, cache)
local platform=self.Platform
local policy=platform:GetCombatDataPolicy()
if policy~='probe' and policy~='restricted' then return nil,'unsupported-policy' end
if not platform:CanReadValue(unit) or not platform:CanReadValue(percentage) or not platform:CanReadValue(cache) then return nil,'restricted-value' end
if type(unit)~='string' or unit=='' or type(percentage)~='boolean' then return nil,'invalid-health-forecast-query' end
if cache~=nil and type(cache)~='table' then return nil,'invalid-health-forecast-cache' end
if type(platform.GetHealthForecastIdentityObservation)~='function' then return nil,'missing-api' end
local guid,identityReason=addon.Functions.cache.getCached(cache,platform.GetHealthForecastIdentityObservation,platform,unit)
if not platform:CanReadValue(guid) then return nil,'restricted-value' end
if guid==nil then return nil,identityReason or 'unit-guid-unavailable' end
if guid==false then return false end
if type(guid)~='string' or guid=='' then return nil,'invalid-health-forecast-identity' end
local current,maximum
if percentage then
if type(platform.GetHealthForecastProviderObservation)~='function' then return nil,'missing-api' end
local provider,why=platform:GetHealthForecastProviderObservation(unit)
if not platform:CanReadValue(provider) then return nil,'restricted-value' end
if provider==nil then return nil,why or 'health-provider-unavailable' end
current,why=readField(platform,provider,'current')
if why then return nil,why end
maximum,why=readField(platform,provider,'maximum')
if why then return nil,why end
if current==nil or current==false then current,why=nativeValue(self,unit,'current',cache);if current==nil then return nil,why end end
if maximum==nil or maximum==false then maximum,why=nativeValue(self,unit,'maximum',cache);if maximum==nil then return nil,why end end
else
local why;current,why=nativeValue(self,unit,'current',cache)
if current==nil then return nil,why end
end
local valid,reason=finite(platform,current)
if not valid then return nil,reason end
if current<0 then return nil,'invalid-health-forecast-number' end
valid,reason=finite(platform,healthTarget)
if not valid then return nil,reason end
local target=healthTarget
if percentage then
valid,reason=finite(platform,maximum)
if not valid then return nil,reason end
if maximum<0 then return nil,'invalid-health-forecast-number' end
target=maximum*healthTarget
elseif healthTarget<0 then
local why;maximum,why=nativeValue(self,unit,'maximum',cache)
if maximum==nil then return nil,why end
target=target+maximum
end
valid,reason=finite(platform,target)
if not valid then return nil,reason end
if current==target then return 0 end
local history,why=readField(platform,self.damageHistory,guid)
if why then return nil,why end
if history==nil or history==false then return false end
if type(history)~='table' then return nil,'invalid-forecast-history' end
if not platform:CanReadValue(mode) then return nil,'restricted-value' end
local noheals,nodmg=mode=='noheals',mode=='nodmg'
local profile,profileReason=readField(platform,self.db,'profile')
if profileReason then return nil,profileReason end
local window,windowReason=readField(platform,profile,'damage_history')
if windowReason then return nil,windowReason end
valid,reason=finite(platform,window)
if not valid then return nil,reason end
if type(platform.GetHealthForecastTimeObservation)~='function' then return nil,'missing-api' end
local now,timeReason=platform:GetHealthForecastTimeObservation()
if not platform:CanReadValue(now) then return nil,'restricted-value' end
if now==nil then return nil,timeReason or 'forecast-time-unavailable' end
valid,reason=finite(platform,now)
if not valid then return nil,reason end
local functions=self.Functions.forecast
if type(functions)~='table' or type(functions.calculate)~='function' then return nil,'forecast-kernel-unavailable' end
local ok,rate,seconds,forecastReason=pcall(functions.calculate,platform,history,window,noheals,nodmg,now)
if not ok then return nil,'forecast-kernel-error' end
if not platform:CanReadValue(forecastReason) then return nil,'restricted-value' end
if forecastReason~=nil then return nil,forecastReason end
if not platform:CanReadValue(rate) then return nil,'restricted-value' end
if rate==nil or rate==false then return false end
valid,reason=finite(platform,rate)
if not valid then return nil,reason end
valid,reason=finite(platform,seconds)
if not valid then return nil,reason end
if seconds<=2 then return false end
local eta=0
local distance,divisor
if rate<0 and target<current then distance=current-target;divisor=-rate
elseif rate>0 and target>current then distance=target-current;divisor=rate end
if distance~=nil then
valid,reason=finite(platform,distance)
if not valid then return nil,reason end
eta=distance/divisor
end
valid,reason=finite(platform,eta)
if not valid then return nil,reason end
return eta