-
Notifications
You must be signed in to change notification settings - Fork 0
API 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.
Регистрирует чтение bare-имени без скобок.
Возвращает String с написанием имени в нижнем регистре. Это строка-селектор, а не запускаемая процедура.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция AddFilterValue.
Дополняет отсутствующие аргументы значением all; получает список mobiles, координаты self и FindDistance.
Исключает self и кандидатов за горизонтальной границей.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция FindMobile.
Разбивает строки на отдельные слова и проверяет состояние, дистанцию, Z, X/Y и вид тела.
Каждый кандидат должен удовлетворить всем словам. above/below сравнивают высоты строго, near/medium/far имеют фиксированные границы.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция ExpandMobileFilters / MatchesMobileFilters.
Сортирует прошедших по расстоянию, затем serial.
Первый serial становится результатом. Пустая выборка даёт Integer 0.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция OrderBy / ThenBy / FirstOrDefault.
Последовательность поиска можно увидеть в полностью приведённом помощнике FindAndDescribe ниже. Это пользовательская обёртка над реальной командой, а не обещание доступа ко всем внутренним методам.
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, имя и высоты; никакое игровое действие не запускается.
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 возвращает прежний радиус при обычном завершении или обрабатываемой ошибке. Скрипт не расширяет загрузку мира.
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 или персонажа.
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 проверяется после получения ближайшего результата.
- Такой скрипт не проверяет путь до существа и не начинает движение.
Проверка примеров: скрипты загружены и выполнены в тестовом окружении движка с известными объектами и без выбранной цели/слоя. Отдельно проверены границы расстояния и высоты. Это не тест торговли на игровом сервере.
ClassicUO - Bad Newbie & Basic IDE Edition