API UO FindType - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki

UO.FindType

Оглавление · Алфавитный указатель · Search

ClassicUO • Runtime API

Ищет среди уже загруженных клиентом предметов и персонажей. Можно искать по типу, цвету, контейнеру, расстоянию и дополнительным фильтрам. Результат — hex-строка serial выбранного объекта; пустая строка означает отсутствие совпадения. Команда сама не открывает контейнеры, не подбирает предмет и не атакует найденную цель.

Точный синтаксис

UO.FindType(type:Any) -> String
UO.FindType(type:Any, color:Any) -> String
UO.FindType(type:Any, color:Any, container:Any) -> String
UO.FindType(type:Any, color:Any, container:Any, range:Any) -> String
UO.FindType(type:Any, color:Any, container:Any, distance:Any, recursive:Any) -> String
UO.FindType(type:Any, color:Any, container:Any, distance:Any, notoriety:Any, nearest:Any) -> String
UO.FindType(type:Any, color:Any, container:Any, distance:Any, notoriety:Any, nearest:Any, maxZ:Any) -> String
UO.FindType(type:Any, color:Any, container:Any, distance:Any, notoriety:Any, nearest:Any, maxZ:Any, mobileOnly:Any) -> String
UO.FindType(type:Any, color:Any, container:Any, distance:Any, notoriety:Any, nearest:Any, maxZ:Any, mobileOnly:Any, itemOnly:Any) -> String
UO.FindType(type:Any, color:Any, container:Any, distance:Any, notoriety:Any, nearest:Any, maxZ:Any, mobileOnly:Any, itemOnly:Any, includeIgnored:Any) -> String
UO.FindType(type:Any, color:Any, container:Any, distance:Any, notoriety:Any, nearest:Any, maxZ:Any, mobileOnly:Any, itemOnly:Any, includeIgnored:Any, includeSelf:Any) -> String
UO.FindType(type:Any, color:Any, container:Any, distance:Any, notoriety:Any, nearest:Any, maxZ:Any, mobileOnly:Any, itemOnly:Any, includeIgnored:Any, includeSelf:Any, aliveOnly:Any) -> String
UO.FindType(type:Any, color:Any, container:Any, distance:Any, notoriety:Any, nearest:Any, maxZ:Any, mobileOnly:Any, itemOnly:Any, includeIgnored:Any, includeSelf:Any, aliveOnly:Any, visibleOnly:Any) -> String
UO.FindType(type:Any, color:Any, container:Any, distance:Any, notoriety:Any, nearest:Any, maxZ:Any, mobileOnly:Any, itemOnly:Any, includeIgnored:Any, includeSelf:Any, aliveOnly:Any, visibleOnly:Any, nameMask:Any) -> String

Выберите одну из зарегистрированных форм. Параметры передаются позиционно. Any означает значение BASIC с преобразованием внутри команды; Unit — отсутствие возвращаемого значения.

Параметры

  • type — Graphic предмета или body персонажа: целое число либо числовая строка, например 0x0EED для золота, 0x0190 для мужского персонажа. Отрицательное значение или 0xFFFF снимает фильтр типа.
  • color — Hue/цвет: целое число или числовая строка. -1 либо 0xFFFF означает любой цвет; 0 — конкретно hue 0. Особенность двухаргументной формы: строки "ground", "backpack", "my" на второй позиции выбирают область поиска вместо цвета. "my" включает обход загруженных подконтейнеров.
  • container — Область поиска: "ground" — мир, "backpack" — верхний уровень своего рюкзака, "my" — рюкзак с загруженными подконтейнерами в короткой форме; также можно передать serial контейнера или сохранённое имя объекта. Контейнеры не открываются автоматически. Расширенные формы 7–14 аргументов перебирают прямое содержимое заданного контейнера и не имеют флага recursive.
  • range — Четвёртый аргумент четырёхаргументной формы: расстояние в клетках. Отрицательное значение использует общую настройку FindDistance; 0 оставляет только совпадения на той же клетке. У предмета в контейнере учитывается положение контейнера в мире.
  • distance — Расстояние в клетках на позиции 4 в формах от пяти аргументов. -1 использует FindDistance; число 0 и выше задаёт явный предел. Это радиус поиска, а не длина проложенного маршрута.
  • recursive — ТОЛЬКО пятый аргумент формы из пяти аргументов: 1/TRUE — искать также в загруженных подконтейнерах, 0/FALSE — только верхний уровень. Это не notoriety. Переход к форме из шести аргументов меняет смысл позиции 5.
  • notoriety — Позиция 5 в формах 6–14 аргументов. Репутация персонажа: 0 unknown, 1 innocent, 2 ally, 3 attackable, 4 criminal, 5 enemy, 6 murderer, 7 invulnerable. Можно передать число, строку "3|6" или массив значений. -1, 0xFFFF либо "any" отключает фильтр. При активном фильтре предметы исключаются: у них нет notoriety.
  • nearest — Позиция 6: 1/TRUE — выбирать ближайшего подходящего персонажа, а в расширенной форме 7–14 — ближайшего кандидата любого разрешённого вида; при равной дистанции используется serial. 0/FALSE сохраняет порядок перебора. В форме из шести аргументов при переходе к поиску предметов используется обычный порядок поиска предметов.
  • maxZ — Позиция 7: максимальная абсолютная разница высоты Z с собственным персонажем. 0 — та же высота; -1 берёт FindVertical. Для предметов внутри контейнера проверяется высота контейнера. Это не номер этажа.
  • mobileOnly — Позиция 8: 1/TRUE — оставить только персонажей и мобов; 0/FALSE — разрешить также предметы. Если аргумент отсутствует, FALSE.
  • itemOnly — Позиция 9: 1/TRUE — оставить только предметы; 0/FALSE — разрешить также персонажей. Если отсутствует, FALSE. Одновременные mobileOnly=TRUE и itemOnly=TRUE дают пустой результат.
  • includeIgnored — Позиция 10: 1/TRUE — разрешить объекты из IgnoreList; 0/FALSE — исключить их. По умолчанию FALSE. Сам IgnoreList команда не изменяет.
  • includeSelf — Позиция 11: 1/TRUE — разрешить собственного персонажа среди кандидатов mobile; 0/FALSE — исключить. По умолчанию FALSE. На предметы не влияет.
  • aliveOnly — Позиция 12: 1/TRUE — исключить мёртвых персонажей; 0/FALSE — разрешить оба состояния. По умолчанию FALSE. Этот фильтр не проверяет здоровье предметов.
  • visibleOnly — Позиция 13: 1/TRUE — требовать положительную проверку IsVisible; 0/FALSE — не применять её. По умолчанию FALSE. Команда всё равно работает только с объектами, известными клиенту.
  • nameMask — Позиция 14: текстовая часть имени без учёта регистра. Строка "orc|troll" разрешает любое из двух совпадений; разделителями также могут быть запятая и точка с запятой. Пустая строка, "any" или "-1" снимает фильтр. Это поиск подстроки, не регулярное выражение и не маска с *. Если аргумент отсутствует, фильтр отключён.

Возвращает

String: например, "0x40001234". Если ничего не найдено — "". Проверяйте результат сравнением с пустой строкой. Не путайте его с количеством найденных объектов или числом шагов до них.

Поведение

  • Существуют формы с 1–14 аргументами, но это не одна длинная сигнатура с произвольно пропускаемыми параметрами. Выберите точную строку синтаксиса; аргументы передаются позиционно.
  • Формы 1–5 используют обычный поиск и обновляют FindItem / FindCount / список результатов. Для форм 6–14 используйте непосредственно возвращённую строку: фильтрация персонажей выполняется отдельным путём и не обещает обновления этих общих значений.
  • У коротких форм по умолчанию поиск идёт в мире, любой цвет, расстояние FindDistance, без рекурсии. Строка "my" — специальная сокращённая форма для рюкзака с подконтейнерами.
  • Форма из шести аргументов сначала ищет подходящего персонажа; при отсутствии фильтра notoriety и подходящего персонажа возможен поиск предметов. Формы 7–14 объединяют разрешённых кандидатов и применяют дополнительные фильтры.
  • Изменение количества аргументов с пяти на шесть особенно важно: recursive заменяется на notoriety, а nearest становится шестым аргументом. Значение 1 на позиции 5 тогда означает innocent, а не рекурсивный обход.

Примеры

Пример 1. Найти золото в верхнем уровне рюкзака и обработать отсутствие результата

# Найти золото в верхнем уровне рюкзака и обработать отсутствие результата
#
# Ищет среди уже загруженных клиентом предметов и персонажей. Можно искать по типу, цвету,
# контейнеру, расстоянию и дополнительным фильтрам. Результат — hex-строка serial выбранного
# объекта; пустая строка означает отсутствие совпадения. Команда сама не открывает контейнеры,
# не подбирает предмет и не атакует найденную цель.
#
# String: например, "0x40001234". Если ничего не найдено — "". Проверяйте результат сравнением с
# пустой строкой. Не путайте его с количеством найденных объектов или числом шагов до них.

SUB Main()
    # 1: type=0x0EED — ищем золото.
    # 2: color=-1 — любой hue.
    # 3: container="backpack" — только прямое содержимое своего рюкзака.
    # gold получает строку serial. Проверка gold="" отделяет отсутствие предмета от найденного
    # объекта. Info(gold) выводит информацию; золото не перемещается.

    VAR gold = UO.FindType(0x0EED, -1, 'backpack')
    IF gold = '' THEN
        UO.Print('Gold was not found in the loaded backpack')
    ELSE
        UO.Print('Gold serial: ' + gold)
        UO.Info(gold)
    END IF
END SUB

Разбор параметров и выполнения:

  • 1: type=0x0EED — ищем золото.
  • 2: color=-1 — любой hue.
  • 3: container="backpack" — только прямое содержимое своего рюкзака.
  • gold получает строку serial. Проверка gold="" отделяет отсутствие предмета от найденного объекта. Info(gold) выводит информацию; золото не перемещается.

Пример 2. Рекурсивно искать предмет в загруженных сумках рюкзака

# Рекурсивно искать предмет в загруженных сумках рюкзака
#
# Ищет среди уже загруженных клиентом предметов и персонажей. Можно искать по типу, цвету,
# контейнеру, расстоянию и дополнительным фильтрам. Результат — hex-строка serial выбранного
# объекта; пустая строка означает отсутствие совпадения. Команда сама не открывает контейнеры,
# не подбирает предмет и не атакует найденную цель.
#
# String: например, "0x40001234". Если ничего не найдено — "". Проверяйте результат сравнением с
# пустой строкой. Не путайте его с количеством найденных объектов или числом шагов до них.

SUB Main()
    # 1: wantedType содержит graphic 0x0EED.
    # 2: -1 снимает фильтр цвета.
    # 3: "backpack" выбирает корневой контейнер.
    # 4: -1 использует текущий FindDistance.
    # 5: recursive=1 включает обход подконтейнеров; это пятиаргументная форма. Содержимое закрытой
    # сумки, которое сервер ещё не прислал, так не загружается.
    # AddObject сохраняет найденный serial под именем found_gold только после проверки результата.

    VAR wantedType = 0x0EED
    VAR recursive = 1
    VAR found = UO.FindType(wantedType, -1, 'backpack', -1, recursive)
    IF found <> '' THEN
        UO.AddObject('found_gold', found)
        UO.Print('Saved object: ' + found)
    ELSE
        UO.Print('No matching item in loaded containers')
    END IF
END SUB

Разбор параметров и выполнения:

  • 1: wantedType содержит graphic 0x0EED.
  • 2: -1 снимает фильтр цвета.
  • 3: "backpack" выбирает корневой контейнер.
  • 4: -1 использует текущий FindDistance.
  • 5: recursive=1 включает обход подконтейнеров; это пятиаргументная форма. Содержимое закрытой сумки, которое сервер ещё не прислал, так не загружается.
  • AddObject сохраняет найденный serial под именем found_gold только после проверки результата.

Пример 3. Найти ближайшего персонажа с одной из двух репутаций

# Найти ближайшего персонажа с одной из двух репутаций
#
# Ищет среди уже загруженных клиентом предметов и персонажей. Можно искать по типу, цвету,
# контейнеру, расстоянию и дополнительным фильтрам. Результат — hex-строка serial выбранного
# объекта; пустая строка означает отсутствие совпадения. Команда сама не открывает контейнеры,
# не подбирает предмет и не атакует найденную цель.
#
# String: например, "0x40001234". Если ничего не найдено — "". Проверяйте результат сравнением с
# пустой строкой. Не путайте его с количеством найденных объектов или числом шагов до них.

SUB Main()
    # 1: body=-1 разрешает любой body.
    # 2: color=-1 разрешает любой цвет.
    # 3: "ground" означает загруженных мировых объектов.
    # 4: radius=10 ограничивает расстояние десятью клетками.
    # 5: reputation="3|6" — attackable или murderer. Это notoriety, не recursive.
    # 6: nearest=1 просит выбрать ближайшего. Фильтр репутации исключает предметы. Пример только
    # показывает информацию и не атакует цель.

    VAR body = -1
    VAR radius = 10
    VAR reputation = '3|6'
    VAR nearest = 1
    VAR found = UO.FindType(body, -1, 'ground', radius, reputation, nearest)
    IF found <> '' THEN
        UO.Print('Matching mobile: ' + found)
        UO.Info(found)
    ELSE
        UO.Print('No matching mobile within the radius')
    END IF
END SUB

Разбор параметров и выполнения:

  • 1: body=-1 разрешает любой body.
  • 2: color=-1 разрешает любой цвет.
  • 3: "ground" означает загруженных мировых объектов.
  • 4: radius=10 ограничивает расстояние десятью клетками.
  • 5: reputation="3|6" — attackable или murderer. Это notoriety, не recursive.
  • 6: nearest=1 просит выбрать ближайшего. Фильтр репутации исключает предметы. Пример только показывает информацию и не атакует цель.

Пример 4. Все четырнадцать параметров: живой видимый моб с подходящим именем

# Все четырнадцать параметров: живой видимый моб с подходящим именем
#
# Ищет среди уже загруженных клиентом предметов и персонажей. Можно искать по типу, цвету,
# контейнеру, расстоянию и дополнительным фильтрам. Результат — hex-строка serial выбранного
# объекта; пустая строка означает отсутствие совпадения. Команда сама не открывает контейнеры,
# не подбирает предмет и не атакует найденную цель.
#
# String: например, "0x40001234". Если ничего не найдено — "". Проверяйте результат сравнением с
# пустой строкой. Не путайте его с количеством найденных объектов или числом шагов до них.

SUB Main()
    # 1 body=-1 и 2 hue=-1 не ограничивают тип и цвет.
    # 3 scope="ground" — поиск в мире; 4 radius=5 — не дальше пяти клеток.
    # 5 reputation=-1 разрешает любую notoriety; 6 nearest=1 выбирает ближайшего.
    # 7 maxZ=16 допускает абсолютную разницу высоты до 16 единиц.
    # 8 mobileOnly=1 исключает предметы; 9 itemOnly=0 не запрещает мобов.
    # 10 includeIgnored=0 сохраняет действие IgnoreList.
    # 11 includeSelf=0 исключает своего персонажа.
    # 12 aliveOnly=1 и 13 visibleOnly=1 оставляют живых видимых кандидатов.
    # 14 names="orc|troll" требует подстроку orc либо troll в уже известном клиенту имени. Все
    # фильтры должны выполняться одновременно.

    VAR body = -1
    VAR hue = -1
    VAR scope = 'ground'
    VAR radius = 5
    VAR reputation = -1
    VAR nearest = 1
    VAR maxZ = 16
    VAR mobileOnly = 1
    VAR itemOnly = 0
    VAR includeIgnored = 0
    VAR includeSelf = 0
    VAR aliveOnly = 1
    VAR visibleOnly = 1
    VAR names = 'orc|troll'
    VAR found = UO.FindType(body, hue, scope, radius, reputation, nearest, maxZ, mobileOnly, itemOnly, includeIgnored, includeSelf, aliveOnly, visibleOnly, names)
    IF found = '' THEN
        UO.Print('No loaded mobile satisfies every filter')
    ELSE
        UO.Print('Selected serial: ' + found)
    END IF
END SUB

Разбор параметров и выполнения:

  • 1 body=-1 и 2 hue=-1 не ограничивают тип и цвет.
  • 3 scope="ground" — поиск в мире; 4 radius=5 — не дальше пяти клеток.
  • 5 reputation=-1 разрешает любую notoriety; 6 nearest=1 выбирает ближайшего.
  • 7 maxZ=16 допускает абсолютную разницу высоты до 16 единиц.
  • 8 mobileOnly=1 исключает предметы; 9 itemOnly=0 не запрещает мобов.
  • 10 includeIgnored=0 сохраняет действие IgnoreList.
  • 11 includeSelf=0 исключает своего персонажа.
  • 12 aliveOnly=1 и 13 visibleOnly=1 оставляют живых видимых кандидатов.
  • 14 names="orc|troll" требует подстроку orc либо troll в уже известном клиенту имени. Все фильтры должны выполняться одновременно.

Пример 5. Сокращённая форма поиска в рюкзаке

# Сокращённая форма поиска в рюкзаке
#
# Ищет среди уже загруженных клиентом предметов и персонажей. Можно искать по типу, цвету,
# контейнеру, расстоянию и дополнительным фильтрам. Результат — hex-строка serial выбранного
# объекта; пустая строка означает отсутствие совпадения. Команда сама не открывает контейнеры,
# не подбирает предмет и не атакует найденную цель.
#
# String: например, "0x40001234". Если ничего не найдено — "". Проверяйте результат сравнением с
# пустой строкой. Не путайте его с количеством найденных объектов или числом шагов до них.

SUB Main()
    # 1 wantedType=0x0EED — золото.
    # 2 "my" — специальная строка двухаргументной формы: выбирает рюкзак, включает рекурсию и любой
    # цвет. Здесь второй аргумент не является hue.
    # Для верхнего уровня вместо "my" передайте "backpack"; для мира — "ground". Число на второй
    # позиции, напротив, будет фильтром цвета.

    VAR wantedType = 0x0EED
    VAR found = UO.FindType(wantedType, 'my')
    IF found <> '' THEN
        UO.Print('Found in backpack or a loaded subcontainer: ' + found)
    ELSE
        UO.Print('Nothing found')
    END IF
END SUB

Разбор параметров и выполнения:

  • 1 wantedType=0x0EED — золото.
  • 2 "my" — специальная строка двухаргументной формы: выбирает рюкзак, включает рекурсию и любой цвет. Здесь второй аргумент не является hue.
  • Для верхнего уровня вместо "my" передайте "backpack"; для мира — "ground". Число на второй позиции, напротив, будет фильтром цвета.