Справочник › Справочник функций › Platform

Platform.actions.GetSpellRangeState

общедоступный

Как вызывать

addon.Platform:GetSpellRangeState(id, unit, bank)

Доступен напрямую через addon; зависимость не нужна.

Что делает

Прочитать дальность конкретного заклинания для юнита через подходящий API клиента или ячейку книги заклинаний. Заклинание без ограничения дальности возвращает applicable=false; иначе applicable=true, а inRange сообщает, находится ли юнит в зоне досягаемости. Неизвестные или недоступные наблюдения возвращают nil с причиной.

Аргументы

ИмяТипЧто делает
selfRMPlatformАдаптер платформы Rotation Master. При обращении через точку первым аргументом нужен addon.Platform; при вызове через двоеточие он передаётся неявно.
idnumberID заклинания, дальность которого нужно проверить.
unitstring | nilТокен юнита, например target; при nil используется target.
bankstringОбласть книги заклинаний: spell, pet или any.

Возвращает

1table | nilЗапись дальности с applicable и, если применимо, inRange; nil, если недоступно.
2string | nilПричина недоступности или ошибки проверки, если запись равна nil.

Издания

Встроенные помощники регистрируются во всех изданиях. Различается игровой API, который они читают; если нужного API нет, помощник использует запасной вариант или возвращает nil с причиной.

  • Недоступно в этом издании (причина — во всплывающей подсказке)
  • Только пока включены запасные реализации Blizzard для устаревших функций
Игровой APIClassic EraTBC AnniversaryClassic ProgressionForeverRetail
C_Spell.IsSpellInRangeClassic EraTBC AnniversaryClassic ProgressionForeverRetail
C_Spell.SpellHasRangeClassic EraTBC AnniversaryClassic ProgressionForeverRetail
IsSpellInRangeClassic EraTBC AnniversaryClassic ProgressionForeverRetail
SpellHasRangeClassic EraTBC AnniversaryClassic ProgressionForeverRetail

Секретные значения (Retail и Forever)

В Retail и Forever игра передаёт аддонам секретные значения. Этот помощник проверяет то, что читает (addon.Platform:CanReadValue), и вместо секретного значения, которое нельзя сравнить, возвращает nil с причиной, например restricted-value. Считайте nil недоступным значением, а не ложью.

Пример

local record = addon.Platform:GetSpellRangeState(value.spell, "target", "any")
if not record then return nil end
-- A spell with no range restriction can always reach the target.
return not record.applicable or record.inRange

Зависимости

Исходный код

Platform/actions.lua, строка 120. В игре только для чтения; «Дублировать» создаёт редактируемую копию.

Platform.actions.GetSpellRangeState(self, id, unit, bank)
    local valid,reason=spellID(id)
    if not valid then return nil,reason end
    if not self:CanReadValue(unit) or not self:CanReadValue(bank) then return nil,"restricted-value" end
    if unit~=nil and (type(unit)~="string" or unit=="") then return nil,"invalid-unit" end
    if bank~="spell" and bank~="pet" and bank~="any" then return nil,"invalid-spell-bank" end
    unit=unit or "target"
    local nativeRange=C_Spell and C_Spell.IsSpellInRange
    local nativeShape=C_Spell and C_Spell.SpellHasRange
    local slot,book,slotReason
    local hasRange,why,queriedShape
    if type(nativeShape)=="function" then
        queriedShape=true
        hasRange,why=call(nativeShape,id)
    elseif type(nativeRange)~="function" and type(SpellHasRange)=="function" then
        if not slot then slot,book,slotReason=findSlot(id,bank) end
        if not slot then return nil,slotReason end
        queriedShape=true
        hasRange,why=call(SpellHasRange,slot,book)
    end
    if why then return nil,why end
    if hasRange~=nil then
        if type(hasRange)~="boolean" then return nil,"invalid-api-result" end
        if not hasRange then return rangeNotApplicable end
    elseif queriedShape then return nil,"invalid-api-result" end
    local inRange
    if type(nativeRange)=="function" then
        inRange,why=call(nativeRange,id,unit)
        if why then return nil,why end
        if inRange~=nil and type(inRange)~="boolean" then return nil,"invalid-api-result" end
    else
        if type(IsSpellInRange)~="function" then return nil,"missing-api" end
        if not slot then slot,book,slotReason=findSlot(id,bank) end
        if not slot then return nil,slotReason end
        inRange,why=call(IsSpellInRange,slot,book,unit)
        if why then return nil,why end
        if inRange==0 then inRange=false elseif inRange==1 then inRange=true end
        if inRange~=nil and type(inRange)~="boolean" then return nil,"invalid-api-result" end
    end
    if inRange==nil then return nil,"invalid-range-check" end
    return inRange and rangeIn or rangeOut

Назад: Справочник функций