-
Notifications
You must be signed in to change notification settings - Fork 0
API UO GetMobiles
Получает массив 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.
Разбирает 0..8 аргументов; nearest по умолчанию false.
Передаёт фильтры без параметров classMask и color.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция CompactGetMobiles.
Перебирает загруженные mobiles и применяет условия.
Не строит маршрут и не отправляет атаку.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция FilterMobiles.
При nearest=true сортирует по дистанции и serial, затем создаёт массив значений Integer.
Пустой поиск возвращает массив длины 0.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция CompactGetMobiles.
Это локальный список объектов, не серверный запрос полного населения карты.
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). Название/класс союзника не определяются этой командой.
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 печатает уведомление в журнал.
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. Пример сообщает о других персонажах на той же клетке.
ClassicUO - Bad Newbie & Basic IDE Edition