Skip to content

API UO FindMan

Codex edited this page Sep 22, 2026 · 6 revisions

UO.FindMan

ClassicUO / Basic IDE

Home · Все команды · Константы и значения

Находит один serial по notoriety, расстоянию, высоте, телу и hue. Применяется для предварительного выбора цели без автоматической атаки.

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

UO.FindMan() -> Unit
UO.FindMan(notoriety:Any) -> Any
UO.FindMan(notoriety:Any, distance:Any) -> Any
UO.FindMan(notoriety:Any, distance:Any, nearest:Any) -> Any
UO.FindMan(notoriety:Any, distance:Any, nearest:Any, maxZ:Any) -> Any
UO.FindMan(notoriety:Any, distance:Any, nearest:Any, maxZ:Any, body:Any) -> Any
UO.FindMan(notoriety:Any, distance:Any, nearest:Any, maxZ:Any, body:Any, color:Any) -> Any
UO.FindMan(notoriety:Any, distance:Any, nearest:Any, maxZ:Any, body:Any, color:Any, includeSelf:Any) -> Any

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

Параметры

  • notoriety — Статус отношения к персонажу, полученный от сервера: 0 — неизвестный, 1 — Innocent, 2 — Ally, 3 — Gray, 4 — Criminal, 5 — Enemy, 6 — Murderer, 7 — Invulnerable. Число означает один статус; "5|6" или массив чисел — любой из перечисленных. Это не цвет одежды и не класс. Отрицательное число (обычно -1), 0xFFFF, "any", пустая строка или пустой массив отдельно отключают этот фильтр. Некорректная строка без допустимых чисел не находит никого. Порядок статусов приоритет не задаёт. Фильтр 5 выбирает Enemy, а не автоматически любого NPC/монстра; реальные значения зависят от сервера.
  • distance — Горизонтальный радиус в клетках включительно: 5 допускает расстояние 0..5. Расстояние — max(abs(dx),abs(dy)), поэтому соседняя диагональ тоже 1. По умолчанию или при отрицательном числе берётся UO.FindDistance(), а не безлимитный поиск. 0 оставляет ту же клетку X/Y. Не длина маршрута; препятствия и этажи этим параметром не проверяются.
  • nearest — true/1 по умолчанию — ближайший, при равной дистанции меньший serial; false/0 — первый в списке клиента, не самый дальний.
  • maxZ — Максимум abs(Z цели - Z своего персонажа) включительно, в единицах Z мира. Это не число этажей и не клетки X/Y. maxZ=4 при Z игрока 10 допускает Z цели 6..14; 0 требует ровно одинаковую высоту. По умолчанию/при отрицательном числе берётся UO.FindVertical(). На лестнице равная Z может исключить нужную цель. Даже малая разность Z не доказывает доступность этажа.
  • body — Graphic тела персонажа/NPC, не ID конкретного персонажа и не type надетой брони. Число, hex-строка, строка "0x0190|0x0191" или массив чисел. 0x0190 (400) — мужчина-человек; 0x0191 (401) — женщина-человек. Маска объединяет оба тела. Список не включает автоматически другие расы, призраков или превращения; таблица стандартных тел. Отрицательное число (-1 по умолчанию), 0xFFFF, "any", пустая строка или пустой массив отдельно — любое тело. Неизвестный текст без допустимого числа даёт пустой результат.
  • color — Hue самого mobile: Integer или числовая/hex-строка. Отрицательное число (-1 по умолчанию) и 0xFFFF — любой hue; 0 — именно hue 0, а не любое значение. Не цвет полоски notoriety и не оттенок одежды. Цвет надетой вещи этот параметр не проверяет.
  • includeSelf — true/1 разрешает self при соблюдении остальных фильтров; false/0 по умолчанию исключает. Ignore действует и для self.

Возвращает

Integer serial, либо 0 без результата. Проверяйте id <> 0; это не Boolean и не количество. Не изменяет FindItem/FindCount/GetFoundItems и не начинает атаку.

Поведение

  • Поиск локальный: только уже загруженные mobiles. Учитывается Ignore; self исключён, кроме явного includeSelf=true в поддерживающих его командах. Контейнеры и предметы не являются mobiles.
  • Условия применяются вместе (AND). Допустимые альтернативы внутри body/notoriety объединены через OR. Поиск не меняет FindItem, FindCount и GetFoundItems.
  • В body/notoriety маска с допустимыми числами использует именно их: "any|5" всё равно ограничивает значением 5. Пустые/неверные элементы рядом с допустимыми числами игнорируются. Для отсутствия ограничения передайте -1 отдельно. Не переносите это правило на classMask: неизвестное имя класса отклоняет весь список.
  • Команды не открывают область мира, не бегут к цели и не проверяют проходимость маршрута. Между выбором и обработкой сервером состояние мира может измениться.
  • Передача true и 1 равнозначна для флагов, false и 0 также. Другие ненулевые числа тоже преобразуются в true, но 8/9 не являются отдельными режимами; используйте понятные true/false.
  • Точный порядок: notoriety, distance, nearest, maxZ, body, color, includeSelf. Отличается от AttackNearest и GetMobiles.
  • Нет параметров classMask, aliveOnly или visibleOnly. При необходимости проверяйте найденный ID отдельно; для выбора среди всех живых/видимых используйте GetMobiles, чтобы мёртвый ближайший не заслонял остальных.

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

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

1. CompactFindMan

Разбирает 1..7 аргументов.

Применяет общие фильтры через FilterMobiles.

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

2. FilterMobiles

Возвращает подходящие mobiles.

При nearest=true затем сортировка по расстоянию и serial; FirstOrDefault возвращает ID/0.

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

Поиск не имеет побочного эффекта атаки.

Примеры

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

SUB Main()
    # Поиск ничего не атакует: сохраняем результат для следующего действия.
    VAR ally = UO.FindMan(2, 12)
    IF ally = 0 THEN
        RETURN
    END IF
    UO.AddObject("ally_nearby", ally)
END SUB

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

  • 2 — Ally, 12 — радиус. Остальное: nearest=true, maxZ=FindVertical(), любое body/hue, self исключён. Команда только сохраняет цель, не атакует.

Пример 2. Указать каждое условие перед дальнейшим действием

SUB Main()
    # Здесь nearest идёт третьим: порядок отличается от AttackNearest.
    VAR status = 5
    VAR radius = 8
    VAR nearest = true
    VAR height = 4
    VAR bodies = "0x0190|0x0191"
    VAR bodyHue = -1
    VAR includeMe = false
    VAR enemy = UO.FindMan(status, radius, nearest, height, bodies, bodyHue, includeMe)
    IF enemy <> 0 THEN
        IF UO.IsDead(enemy) = 0 THEN
            UO.Attack(enemy)
        END IF
    END IF
END SUB

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

  • Проверка IsDead выполнена отдельно. body задаёт тела; bodyHue=-1 не ограничивает их hue. По одежде эта команда не классифицирует.

Пример 3. Найти первый mobile с конкретным hue

SUB Main()
    VAR chosenHue = 0x0455 # Пример hue ТЕЛА; замените нужным значением.
    VAR mobile = UO.FindMan(-1, 10, false, 8, -1, chosenHue, false)
    IF mobile = 0 THEN
        RETURN
    END IF
    # Сохраняем для осмотра/дальнейшего скрипта, атаки нет.
    UO.AddObject("body_hue_match", mobile)
END SUB

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

  • Первый -1 отключает notoriety, второй -1 отключает body. false в третьей позиции выключает сортировку; последний false исключает self. Hue одежды не проверяется.

Clone this wiki locally