Skip to content

API UO GetMobiles

Codex edited this page Sep 21, 2026 · 5 revisions

UO.GetMobiles

UO API · Все команды

Получает массив ID подходящих загруженных персонажей/NPC. Нужен, когда скрипту надо проверить несколько целей, выбрать свою, посчитать окружение или добавить собственное условие перед действием.

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

UO.GetMobiles() -> Any
UO.GetMobiles(distance:Any) -> Any
UO.GetMobiles(distance:Any, notoriety:Any) -> Any
UO.GetMobiles(distance:Any, notoriety:Any, body:Any) -> Any
UO.GetMobiles(distance:Any, notoriety:Any, body:Any, maxZ:Any) -> Any
UO.GetMobiles(distance:Any, notoriety:Any, body:Any, maxZ:Any, nearest:Any) -> Any
UO.GetMobiles(distance:Any, notoriety:Any, body:Any, maxZ:Any, nearest:Any, includeSelf:Any) -> Any
UO.GetMobiles(distance:Any, notoriety:Any, body:Any, maxZ:Any, nearest:Any, includeSelf:Any, aliveOnly:Any) -> Any
UO.GetMobiles(distance:Any, notoriety:Any, body:Any, maxZ:Any, nearest:Any, includeSelf:Any, aliveOnly:Any, visibleOnly:Any) -> Any

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

Параметры

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

Возвращает

Array — serial mobiles. Пустой массив означает отсутствие совпадений; проверяйте GetArrayLength перед targets[0]. Не body/type, не суммарные HP, не 1/0. Форма без аргументов всё равно применяет FindDistance/FindVertical/Ignore и исключает self.

Поведение

  • Поиск локальный: только уже загруженные 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.
  • Поддерживаются 0..8 позиционных аргументов. classMask и color в этой команде отсутствуют; не переносите сюда порядок аргументов AttackNearest.
  • Массив — снимок ID. Цель может исчезнуть позднее; повторно проверьте Exists, если между поиском и действием было ожидание. Ничего не атакует самостоятельно.

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

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

1. CompactGetMobiles

Разбирает 0..8 аргументов; nearest по умолчанию false.

Передаёт фильтры без параметров classMask и color.

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

2. FilterMobiles

Перебирает загруженные mobiles и применяет условия.

Не строит маршрут и не отправляет атаку.

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

3. CompactGetMobiles

При nearest=true сортирует по дистанции и serial, затем создаёт массив значений Integer.

Пустой поиск возвращает массив длины 0.

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

Это локальный список объектов, не серверный запрос полного населения карты.

Примеры

Пример 1. Выбрать ближайшего союзника и включить следование

SUB Main()
    VAR radius = 12
    VAR allyStatus = 2    # Ally; назначается сервером.
    VAR anyBody = -1
    VAR maxHeight = 8
    VAR nearestFirst = true
    VAR includeMe = false
    VAR livingOnly = true
    VAR visibleOnly = true
    VAR allies = UO.GetMobiles(radius, allyStatus, anyBody, maxHeight, nearestFirst, includeMe, livingOnly, visibleOnly)
    IF GetArrayLength(allies) = 0 THEN
        RETURN
    END IF
    UO.AddObject("leader", allies[0])
    # Дистанция Follow=2отдельная настройка от radius=12 поиска.
    UO.Follow(allies[0], 2, false)
END SUB

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

  • nearestFirst=true делает allies[0] ближайшим союзником. Follow включает фоновую ходьбу; останавливается UO.Follow(0). Название/класс союзника не определяются этой командой.

Пример 2. Посчитать опасные цели и выбрать действие по их числу

SUB Main()
    # Статусы 5/6, радиус 5, любое тело, перепад Z до 4, без сортировки/self.
    VAR enemies = UO.GetMobiles(5, "5|6", -1, 4, false, false, true, true)
    VAR count = GetArrayLength(enemies)
    IF count = 1 THEN
        UO.Attack(enemies[0])
    ELSEIF count > 1 THEN
        # При нескольких целях этот сценарий атаку не начинает.
        UO.Alarm()
    END IF
END SUB

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

  • Здесь nearest=false уместен: важен счётчик. GetArrayLength — число mobiles, не количество предметов в стопке. Alarm печатает уведомление в журнал.

Пример 3. Список на той же клетке и высоте с включением себя

SUB Main()
    # Ограничиваем и X/Y, и Z, после чего считаем остальных персонажей.
    VAR sameCell = UO.GetMobiles(0, -1, "0x0190|0x0191", 0, false, true, true, false)
    VAR i = 0
    VAR others = 0
    WHILE i < GetArrayLength(sameCell)
        IF sameCell[i] <> UO.GetSerial("self") THEN
            others += 1
        END IF
        i += 1
    WEND
    IF others > 0 THEN
        UO.Alarm()
    END IF
END SUB

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

  • distance=0 — одинаковые X/Y, maxZ=0 — одинаковый Z. body ограничен двумя graphic. includeSelf=true разрешает self, но он по-прежнему должен подходить по body и aliveOnly. Пример сообщает о других персонажах на той же клетке.

Clone this wiki locally