Call as
Conditions.totem.findSpecific(value, cache, start, compareTime)
Record the dependency Conditions.totem.findSpecific, then call it by that name. A namespaced call does not pass self: use a colon call or pass the object yourself.
What it does
Searches the totem slots for an active totem matching value.spell, by spell ID or name (only the exact spell ID when value.ranked is set). With compareTime it also requires the totem's remaining time, rounded to 3 decimals, to pass value.operator and value.value; an unreadable slot makes a non-match unavailable.
Arguments
| Name | Type | What it does |
|---|---|---|
value | table | Condition settings: spell, ranked and, for timed checks, operator and value. |
cache | table | nil | Evaluation-pass cache passed to getCached, or nil to read directly. |
start | number | nil | Evaluation start time; nil uses GetTime(). |
compareTime | boolean | True to also compare the remaining time. |
Returns
| 1 | boolean | nil | True when a matching totem is found, false when none is, or nil when a slot could not be read. |
|---|---|---|
| 2 | string | nil | Reason for nil, such as totem-data-unavailable, totem-rank-unavailable or totem-identity-unavailable. |
Editions
Built In helpers are registered on every edition. What differs is the game API they read; where one is missing the helper falls back or returns nil with a reason.
It reads no game API directly.
How the addon calls it
- Specific Totem Present (evaluate)
return findSpecific(value,cache,start,false) - Specific Totem Time Remaining (evaluate)
return findSpecific(value,cache,start,true)
Dependencies
observe→Conditions.totem.observeplatform(builtin:Conditions/totem.lua:platform)remaining→Conditions.totem.remaining
Source
Conditions/totem.lua, line 102. Read only in game; Duplicate makes an editable copy.
Conditions.totem.findSpecific(value, cache, start, compareTime)
local target,reason=observe(cache,platform.GetSpellInfo,value.spell)
if not target then return nil,reason end
local count,why=observe(cache,platform.GetTotemSlotCount)
if not count then return nil,why end
local unavailable
for slot=1,count do
local record,problem=observe(cache,platform.GetTotemInfo,slot)
if not record then unavailable=unavailable or problem or "totem-data-unavailable"
elseif record.active and remaining(record,start)>0 then
local matches=false
if value.ranked then
if record.spellID then matches=record.spellID==value.spell
elseif record.name==target.name or record.name=="" then unavailable=unavailable or "totem-rank-unavailable" end
else
matches=record.spellID==value.spell or record.name==target.name
if not matches and record.name=="" then
local info,issue
if record.spellID then info,issue=observe(cache,platform.GetSpellInfo,record.spellID) end
if info then matches=info.name==target.name
else unavailable=unavailable or issue or "totem-identity-unavailable" end
end
end
if matches and (not compareTime or addon.compare(value.operator,addon.round(remaining(record,start),3),value.value)) then return true end
end
end
if unavailable then return nil,unavailable end
return false