호출 방법
addon:GetConditionHealthForecast(unit, healthTarget, percentage, mode, cache)
addon을 통해 바로 쓸 수 있으며, 의존성이 필요 없습니다.
하는 일
선택한 생명력에 도달할 때까지의 시간을 추정합니다. 완전한 기본 식별 관찰과 지연 스칼라 관찰은 평가 패스마다 캐시하고, 제공자, 기록, 구간, 시각, 예측은 실시간으로 유지합니다. 목표와 정확히 같으면 기록을 처리하기 전에 0을 반환합니다. 변화율이 0이거나 반대 방향일 때의 의도된 추정 없음(false)과 초기화된 0 결과는 유지하며, 필수 정보가 잘못되었거나 오버플로가 나거나 4096단위 작업 예산을 다 쓰면 사용할 수 없습니다. 기록을 바꾸거나 부분 추정을 만들어 내지 않습니다.
인수
| 이름 | 유형 | 하는 일 |
|---|---|---|
self | RMAddon | Rotation Master 애드온 인스턴스 (콜론 호출에서는 암묵적). |
unit | string | 관찰에 그대로 쓰이는 선택한 유닛 토큰. |
healthTarget | number | 절대 생명력 목표(음수는 손실량) 또는 비율 값. |
percentage | boolean | true면 비율 목표와 선택적인 새 제공자 정보를 선택합니다. |
mode | any | noheals는 피해만, nodmg는 치유만 선택하며, 그 외 읽을 수 있는 값은 둘 다 선택합니다. |
cache | table | nil | 평가 패스의 기본 관찰 캐시. nil이면 새로 조회합니다. |
반환값
| 1 | number | boolean | nil | 0을 포함한 유한한 예상 시간, 없음 또는 추정 불가로 알려지면 false, 사용할 수 없으면 nil. |
|---|---|---|
| 2 | string | nil | 관찰, 기록, 작업 한도 또는 산술의 사용 불가 이유. |
버전
기본 제공 도우미는 모든 버전에 등록됩니다. 다른 점은 읽는 게임 API이며, API가 없으면 도우미는 대체 동작을 하거나 이유와 함께 nil을 반환합니다.
게임 API를 직접 읽지 않습니다.
비공개 값 (Retail과 Forever)
Retail과 Forever에서는 게임이 애드온에 비공개 값을 넘깁니다. 이 도우미는 읽는 값을 확인하고(addon.Platform:CanReadValue), 비교할 수 없는 비공개 값 대신 restricted-value 같은 이유와 함께 nil을 반환합니다. nil은 거짓이 아니라 사용할 수 없음으로 취급하세요.
애드온에서 호출하는 방식
- 생명력 도달까지 남은 시간 (evaluate)
local eta,reason=addon:GetConditionHealthForecast(value.unit,value.health,false,value.mode,cache) - 생명력 비율 도달까지 남은 시간 (evaluate)
local eta,reason=addon:GetConditionHealthForecast(value.unit,value.health,true,value.mode,cache)
의존성
finite→Core.health_forecast_conditions.finitenativeValue→Core.health_forecast_conditions.nativeValuereadField→Core.health_forecast_conditions.readField
소스
Core/health_forecast_conditions.lua, 78번째 줄. 게임에서는 읽기 전용이며, 복제하면 편집 가능한 사본이 생깁니다.
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