Skip to content

API UO FindAnyType

Codex edited this page Sep 22, 2026 · 5 revisions

UO.FindAnyType

ClassicUO / Basic IDE

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

Находит ближайшего загруженного mobile с одним из заданных graphic тела. Применяется для поиска определённого вида существа. Предметы в сундуке или на земле эта команда не ищет: для них нужны FindType/FindList.

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

UO.FindAnyType(distance:Any, type:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any, type7:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any, type7:Any, type8:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any, type7:Any, type8:Any, type9:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any, type7:Any, type8:Any, type9:Any, type10:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any, type7:Any, type8:Any, type9:Any, type10:Any, type11:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any, type7:Any, type8:Any, type9:Any, type10:Any, type11:Any, type12:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any, type7:Any, type8:Any, type9:Any, type10:Any, type11:Any, type12:Any, type13:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any, type7:Any, type8:Any, type9:Any, type10:Any, type11:Any, type12:Any, type13:Any, type14:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any, type7:Any, type8:Any, type9:Any, type10:Any, type11:Any, type12:Any, type13:Any, type14:Any, type15:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any, type7:Any, type8:Any, type9:Any, type10:Any, type11:Any, type12:Any, type13:Any, type14:Any, type15:Any, type16:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any, type7:Any, type8:Any, type9:Any, type10:Any, type11:Any, type12:Any, type13:Any, type14:Any, type15:Any, type16:Any, type17:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any, type7:Any, type8:Any, type9:Any, type10:Any, type11:Any, type12:Any, type13:Any, type14:Any, type15:Any, type16:Any, type17:Any, type18:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any, type7:Any, type8:Any, type9:Any, type10:Any, type11:Any, type12:Any, type13:Any, type14:Any, type15:Any, type16:Any, type17:Any, type18:Any, type19:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any, type7:Any, type8:Any, type9:Any, type10:Any, type11:Any, type12:Any, type13:Any, type14:Any, type15:Any, type16:Any, type17:Any, type18:Any, type19:Any, type20:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any, type7:Any, type8:Any, type9:Any, type10:Any, type11:Any, type12:Any, type13:Any, type14:Any, type15:Any, type16:Any, type17:Any, type18:Any, type19:Any, type20:Any, type21:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any, type7:Any, type8:Any, type9:Any, type10:Any, type11:Any, type12:Any, type13:Any, type14:Any, type15:Any, type16:Any, type17:Any, type18:Any, type19:Any, type20:Any, type21:Any, type22:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any, type7:Any, type8:Any, type9:Any, type10:Any, type11:Any, type12:Any, type13:Any, type14:Any, type15:Any, type16:Any, type17:Any, type18:Any, type19:Any, type20:Any, type21:Any, type22:Any, type23:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any, type7:Any, type8:Any, type9:Any, type10:Any, type11:Any, type12:Any, type13:Any, type14:Any, type15:Any, type16:Any, type17:Any, type18:Any, type19:Any, type20:Any, type21:Any, type22:Any, type23:Any, type24:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any, type7:Any, type8:Any, type9:Any, type10:Any, type11:Any, type12:Any, type13:Any, type14:Any, type15:Any, type16:Any, type17:Any, type18:Any, type19:Any, type20:Any, type21:Any, type22:Any, type23:Any, type24:Any, type25:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any, type7:Any, type8:Any, type9:Any, type10:Any, type11:Any, type12:Any, type13:Any, type14:Any, type15:Any, type16:Any, type17:Any, type18:Any, type19:Any, type20:Any, type21:Any, type22:Any, type23:Any, type24:Any, type25:Any, type26:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any, type7:Any, type8:Any, type9:Any, type10:Any, type11:Any, type12:Any, type13:Any, type14:Any, type15:Any, type16:Any, type17:Any, type18:Any, type19:Any, type20:Any, type21:Any, type22:Any, type23:Any, type24:Any, type25:Any, type26:Any, type27:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any, type7:Any, type8:Any, type9:Any, type10:Any, type11:Any, type12:Any, type13:Any, type14:Any, type15:Any, type16:Any, type17:Any, type18:Any, type19:Any, type20:Any, type21:Any, type22:Any, type23:Any, type24:Any, type25:Any, type26:Any, type27:Any, type28:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any, type7:Any, type8:Any, type9:Any, type10:Any, type11:Any, type12:Any, type13:Any, type14:Any, type15:Any, type16:Any, type17:Any, type18:Any, type19:Any, type20:Any, type21:Any, type22:Any, type23:Any, type24:Any, type25:Any, type26:Any, type27:Any, type28:Any, type29:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any, type7:Any, type8:Any, type9:Any, type10:Any, type11:Any, type12:Any, type13:Any, type14:Any, type15:Any, type16:Any, type17:Any, type18:Any, type19:Any, type20:Any, type21:Any, type22:Any, type23:Any, type24:Any, type25:Any, type26:Any, type27:Any, type28:Any, type29:Any, type30:Any) -> Integer
UO.FindAnyType(distance:Any, type:Any, type2:Any, type3:Any, type4:Any, type5:Any, type6:Any, type7:Any, type8:Any, type9:Any, type10:Any, type11:Any, type12:Any, type13:Any, type14:Any, type15:Any, type16:Any, type17:Any, type18:Any, type19:Any, type20:Any, type21:Any, type22:Any, type23:Any, type24:Any, type25:Any, type26:Any, type27:Any, type28:Any, type29:Any, type30:Any, type31:Any) -> Integer

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

Параметры

  • distance — Горизонтальный радиус в клетках включительно: 5 допускает расстояние 0..5. Расстояние — max(abs(dx),abs(dy)), поэтому соседняя диагональ тоже 1. По умолчанию или при отрицательном числе берётся UO.FindDistance(), а не безлимитный поиск. 0 оставляет ту же клетку X/Y. Не длина маршрута; препятствия и этажи этим параметром не проверяются.
  • type — Graphic тела mobile, не serial и не graphic предмета. Число 0..65534 или hex-строка, например 0x003B. Несколько значений объединяются как OR: число 5, строка "5|6" либо плоский массив чисел/числовых строк. Можно смешать плоский массив и отдельные аргументы. Порядок значений приоритет не задаёт. Нечисловые токены исключаются; полностью ошибочная маска не находит ничего. Вложенные массивы не являются числами и игнорируются как ошибочные элементы; многомерные маски не поддерживаются.
  • type2 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type3 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type4 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type5 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type6 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type7 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type8 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type9 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type10 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type11 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type12 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type13 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type14 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type15 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type16 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type17 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type18 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type19 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type20 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type21 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type22 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type23 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type24 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type25 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type26 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type27 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type28 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type29 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type30 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.
  • type31 — Необязательная дополнительная маска type; те же формы, что у type. Объединяется с предыдущими через OR, не задаёт отдельный радиус, hue, Z или приоритет.

Возвращает

Integer — serial выбранного mobile или 0, если подходящего нет. Это ID, а не graphic/type, число найденных объектов или TRUE/FALSE: используйте IF found <> 0 THEN, не found = TRUE. Найденный ID можно передать UO.AddObject, UO.Attack или UO.Follow, но каждое игровое действие вызывается отдельно.

Поведение

  • Поиск читает только mobiles, уже загруженные клиентом; уничтоженные записи и Ignore исключены. Сам вызов не открывает target, не атакует, не идёт к цели и не запрашивает у сервера удалённые объекты.
  • Расстояние — геометрическое max(abs(dx),abs(dy)), не длина маршрута. Близость не гарантирует отсутствие стены или доступность другого этажа. Состояние может измениться после возврата.
  • Жизнь, скрытность и линия обзора автоматически не проверяются. Если они важны, используйте GetMobiles с aliveOnly/visibleOnly либо свои проверки. Наличие у сервера статуса Enemy не делает любого NPC подходящим.
  • Не изменяет FindItem, FindCount или GetFoundItems. Эти поля могут содержать результаты предыдущей другой команды: используйте непосредственно возвращённый ID.
  • От 2 до 32 аргументов: distance и до 31 маски type. Плоский массив позволяет передать больше значений. Каждое следующее значение после type — ещё body/type, не hue или notoriety.
  • В этой команде нет фильтра Z, notoriety, расы игрока или класса по одежде. Self НЕ исключается: если собственный graphic входит в маску и self не в Ignore, можно получить свой serial на расстоянии 0.
  • Выбирает ближайшего; одинаковое расстояние разрешается меньшим serial. -1/any/0xFFFF/пустая маска без конкретных типов дают 0: команда требует хотя бы один явный type. Рядом с конкретными type wildcard игнорируется.

Внутренние функции: последовательность выполнения

Ниже описана реализация этого движка. Имена внутренних методов не являются дополнительными командами BASIC.

1. RegisterCompactSearchApi

Регистрирует точное число аргументов и имена параметров.

Параметры не превращаются в параметры другой команды с похожим названием.

Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция RegisterCompactSearchApi.

2. FindAnyType

Подготавливает маску и ограничения запроса.

Возвращает первый подходящий serial или Integer 0.

Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция FindAnyType.

3. ParseIntMask

Преобразует скаляры и элементы плоской маски в множество целых чисел.

Полностью ошибочная маска получает маркер отсутствия совпадений; вложенный массив не превращается в 0.

Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция ParseIntMask.

4. CombineMask

Разворачивает отдельные плоские маски в один массив значений.

Не строит пары body/hue; количество аргументов ограничено регистрацией.

Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция CombineMask.

5. GetMobiles

Возвращает serial загруженных неудалённых mobiles, включая self.

FindAnyType проверяет Ignore, радиус и graphic, затем сортирует по расстоянию и serial.

Исходник проекта: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; функция GetMobiles.

Примеры показывают готовые процедуры и полные пользовательские функции; внутренние C#-методы отдельно из BASIC не вызываются.

Примеры

Пример 1. Сохранить ближайшее существо нужного вида

SUB Main()
    # Замените 0x003B на graphic тела существа своего сервера.
    VAR creature = UO.FindAnyType(10, 0x003B)
    IF creature <> 0 THEN
        UO.AddObject("creature", creature)
        UO.Print("Distance: " + CStr(UO.GetDistance(creature)))
    END IF
END SUB

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

  • 0x003B — body, не ID. Возврат creature — ID конкретного найденного mobile. Команда не проверяет Z, здоровье или агрессивность.

Пример 2. Массив видов и дополнительный вид

SUB Main()
    DIM bodies[0]
    bodies[0] = 0x003B
    VAR creature = UO.FindAnyType(18, bodies, 0x000C)
    # Защита от собственного ID, если маску потом изменят.
    IF creature <> 0 AndAlso creature <> ASC(UO.GetSerial("self"), 0) THEN
        UO.AddObject("observed_creature", creature)
    END IF
END SUB

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

  • bodies и отдельный 0x000C объединены. Если найден self, этот пример просто пропустит действие; он не ищет следующего кандидата. Для исключения self в самом запросе используйте соответствующий фильтр GetMobiles.

Пример 3. Вернуть расстояние до ближайшего нужного вида

SUB Main()
    VAR distance = DistanceToBody(0x003B, 8)
    # -1 здесь придуман помощником, а не является возвратом FindAnyType.
    IF distance >= 0 AndAlso distance <= 3 THEN
        UO.Print("Creature is within three cells")
    END IF
END SUB

FUNCTION DistanceToBody(body, radius)
    VAR found = UO.FindAnyType(radius, body)
    IF found = 0 THEN
        RETURN -1
    END IF
    RETURN UO.GetDistance(found)
END FUNCTION

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

  • body — graphic, radius — предел поиска X/Y. Помощник возвращает расстояние или собственный код -1; сама UO.FindAnyType возвращает serial или 0.

Clone this wiki locally