API UO FindMobile - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
UO.FindMobile
UO API · Все команды · Constants & Special Values
Находит одного ближайшего загруженного персонажа/существо по совместным строковым фильтрам. Самого игрока исключает.
Точный синтаксис
UO.FindMobile() -> Integer
UO.FindMobile(stateFilter:Any) -> Integer
UO.FindMobile(stateFilter:Any, rangeFilter:Any) -> Integer
UO.FindMobile(stateFilter:Any, rangeFilter:Any, verticalFilter:Any) -> Integer
UO.FindMobile(stateFilter:Any, rangeFilter:Any, verticalFilter:Any, directionOrKind:Any) -> Integer
UO.FindMobile(stateFilter:Any, rangeFilter:Any, verticalFilter:Any, directionFilter:Any, kindFilter:Any) -> Integer
Выберите одну из зарегистрированных форм. Параметры передаются позиционно. Any означает значение BASIC с преобразованием внутри команды; Unit — отсутствие возвращаемого значения.
Параметры
stateFilter— Обычно all / alive / dead; необязателен. Все аргументы в реализации являются строками фильтров, поэтому допустимо объединить несколько слов в одном аргументе.rangeFilter— Обычно all / near (0..4) / medium (5..9) / far (от 10 до общего радиуса). Числовой радиус в этой позиции не принимается; общий предел меняется через UO.FindDistance(value).verticalFilter— all / above / below. above: candidate.Z > self.Z, below: candidate.Z < self.Z. Это не этаж и не числовой допуск Z.directionOrKind— Четвёртая позиция формы с четырьмя аргументами: all, north/south/east/west или human/npc/mob. Может быть составной строкой.directionFilter— Четвёртая позиция формы с пятью аргументами: all или сравнение X/Y north/south/east/west. Это расположение относительно self, а не направление взгляда.kindFilter— Пятая позиция: all / human / npc / mob. human определяется списком graphic тела; npc — IsNpc и human; mob — IsNpc и НЕ human. Слово monster не принимается.
Возвращает
Integer: serial одного mobile, либо 0, если совпадений нет. Это не количество, не массив, не type и не Boolean. Проверка found <> 0 означает наличие результата; сравнение found = TRUE сравнивало бы ID с 1 и здесь неверно.
Поведение
- Применяется в UO.FindMobile: от 0 до 5 аргументов. Пропущенные хвостовые аргументы равны all. Каждый аргумент может содержать одно слово или несколько слов, разделённых пробелом, табуляцией, запятой, точкой с запятой, | или +. Все условия объединяются через AND; символ | здесь не означает OR.
- Поиск просматривает только загруженные mobiles, исключает self и ограничивает расстояние величиной max(1, UO.FindDistance()). Расстояние измеряется по правилу max(abs(dx), abs(dy)); диагональная клетка считается одной. Для движущихся объектов дистанция может учитывать очередь шагов, а сравнения X/Y/Z читают текущие координаты.
- Из подходящих выбирается ближайший; при равной дистанции — меньший serial. Возвращается Integer serial или 0, а не true/false, количество или массив.
- UO.FindMobile не меняет FindItem/FindCount/GetFoundItems, не применяет Ignore и UO.FindVertical, не проверяет видимость, проходимость или линию обзора. Он не выполняет перемещение, выбор target либо загрузку удалённых объектов.
- Числовые радиусы/Z/направления, слова monster, northeast, northwest, southeast, southwest не являются фильтрами. Неизвестное слово вызывает ошибку при проверке кандидата; если кандидатов нет, этот участок может не выполниться. Для диагональной области объединяйте north east и т. п.; для числовой проверки используйте свойства найденных объектов или UO.GetMobiles().
Как это выполняется внутри
Ниже описана реализация этого движка. Имена внутренних методов не являются дополнительными командами BASIC.
1. AddFilterValue
Регистрирует чтение bare-имени без скобок.
Возвращает String с написанием имени в нижнем регистре. Это строка-селектор, а не запускаемая процедура.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция AddFilterValue.
2. FindMobile
Дополняет отсутствующие аргументы значением all; получает список mobiles, координаты self и FindDistance.
Исключает self и кандидатов за горизонтальной границей.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция FindMobile.
3. ExpandMobileFilters / MatchesMobileFilters
Разбивает строки на отдельные слова и проверяет состояние, дистанцию, Z, X/Y и вид тела.
Каждый кандидат должен удовлетворить всем словам. above/below сравнивают высоты строго, near/medium/far имеют фиксированные границы.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция ExpandMobileFilters / MatchesMobileFilters.
4. OrderBy / ThenBy / FirstOrDefault
Сортирует прошедших по расстоянию, затем serial.
Первый serial становится результатом. Пустая выборка даёт Integer 0.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция OrderBy / ThenBy / FirstOrDefault.
Последовательность поиска можно увидеть в полностью приведённом помощнике FindAndDescribe ниже. Это пользовательская обёртка над реальной командой, а не обещание доступа ко всем внутренним методам.
Примеры
Пример 1. Поиск и проверка результата
SUB Main()
# Высота объекта строго больше Z персонажа. Равная Z не подходит.
VAR found = UO.FindMobile(all, all, above)
IF found = 0 THEN
UO.Print("No matching mobile")
RETURN
END IF
# found — ID, а не graphic/type и не логическое значение.
UO.Print("ID: " + CStr(found) + " | Name: " + UO.GetName(found))
UO.Print("Z: " + CStr(UO.GetZ(found)) + " | Self Z: " + CStr(UO.GetZ(self)))
END SUB
Разбор параметров и выполнения:
- Передано all, all, above: Высота объекта строго больше Z персонажа. Равная Z не подходит.
- 0 обрабатывается до чтения свойств. Print показывает ID, имя и высоты; никакое игровое действие не запускается.
Пример 2. Сочетание условий с временным радиусом
SUB Main()
# Радиус общий для FindMobile; сохраняем настройку скрипта.
VAR previous = UO.FindDistance()
TRY
UO.FindDistance(18)
VAR found = UO.FindMobile(alive, near, all, all, mob)
IF found <> 0 THEN
UO.Print("Match: " + CStr(found))
UO.Print("Distance: " + CStr(UO.GetDistance(found)))
ELSE
UO.Print("No match in the loaded area")
END IF
FINALLY
UO.FindDistance(previous)
END TRY
END SUB
Разбор параметров и выполнения:
- 18 — внешний предел; alive, near, all, all, mob задаёт совместные условия. near остаётся диапазоном до 4, medium — 5..9, far — от 10.
- Finally возвращает прежний радиус при обычном завершении или обрабатываемой ошибке. Скрипт не расширяет загрузку мира.
Пример 3. Полная функция для составного фильтра
SUB Main()
# Пробел объединяет условия через AND.
VAR id = FindAndDescribe("north east")
UO.Print("Returned ID: " + CStr(id))
END SUB
FUNCTION FindAndDescribe(filters)
# filters — строка, например "north east".
VAR id = UO.FindMobile(filters)
IF id = 0 THEN
UO.Print("Nothing matched: " + filters)
RETURN 0
END IF
UO.Print(UO.GetName(id) + " | " + CStr(id))
RETURN id
END FUNCTION
Разбор параметров и выполнения:
- В helper передаётся строка "north east". Это несколько условий одного запроса, а не последовательный поиск разных целей.
- FindAndDescribe объявлена целиком. Она возвращает ID/0, не меняя target или персонажа.
Пример 4. Найти существо и отдельно проверить точную дистанцию
SUB Main()
# Этот вызов ищет ближайшего живого нечеловеческого NPC.
VAR found = UO.FindMobile(alive, all, all, all, mob)
IF found = 0 THEN
UO.Print("No loaded creature")
RETURN
END IF
# Число 2 — условие BASIC, а не строковый фильтр FindMobile.
IF UO.GetDistance(found) <= 2 THEN
UO.Print("Creature within two tiles: " + CStr(found))
ELSE
UO.Print("Nearest creature is farther away")
END IF
END SUB
Разбор параметров и выполнения:
- alive/all/all/all/mob — пять поддерживаемых позиций. Дистанция 2 проверяется после получения ближайшего результата.
- Такой скрипт не проверяет путь до существа и не начинает движение.
Проверка примеров: скрипты загружены и выполнены в тестовом окружении движка с известными объектами и без выбранной цели/слоя. Отдельно проверены границы расстояния и высоты. Это не тест торговли на игровом сервере.