API above - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki

above

Constants & Special Values · Search / Position Keywords · UO.FindMobile

above — специальное строковое значение для отбора в UO.FindMobile. Высота объекта строго больше Z персонажа. Равная Z не подходит.

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

above -> String (чтение без скобок)

Значение читается без круглых скобок. Способы передачи в команды и отличие от числового ID описаны ниже.

Параметры

Параметров нет.

Возвращает

При чтении above без скобок: String "above". Само значение ничего не ищет. Вызов UO.FindMobile(...) возвращает Integer — serial найденного mobile или 0 при отсутствии результата.

Поведение

  • Высота объекта строго больше Z персонажа. Равная Z не подходит.
  • Применяется в 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

Разбивает строки по поддерживаемым разделителям.

Пустая строка заменяется на all. Выдаёт последовательность слов для проверки одного кандидата.

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

4. MatchesMobileFilters

Проверяет состояние, дистанцию, Z, X/Y и вид тела.

Каждый кандидат должен удовлетворить всем словам. above/below сравнивают высоты строго, near/medium/far имеют фиксированные границы.

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

5. OrderBy

FindMobile использует стандартную сортировку LINQ по расстоянию и ThenBy по serial.

FirstOrDefault берёт первый serial. Пустая выборка даёт Integer 0. Это стандартные операции C#, не команды BASIC.

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

Последовательность поиска можно увидеть в полностью приведённом помощнике 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, above)
        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, above задаёт совместные условия. near остаётся диапазоном до 4, medium — 5..9, far — от 10.
  • Finally возвращает прежний радиус при обычном завершении или обрабатываемой ошибке. Скрипт не расширяет загрузку мира.

Пример 3. Полная функция для составного фильтра

SUB Main()
    # Пробел объединяет условия через AND.
    VAR id = FindAndDescribe("above east")
    UO.Print("Returned ID: " + CStr(id))
END SUB

FUNCTION FindAndDescribe(filters)
    # filters — строка, например "above 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 передаётся строка "above east". Это несколько условий одного запроса, а не последовательный поиск разных целей.
  • FindAndDescribe объявлена целиком. Она возвращает ID/0, не меняя target или персонажа.

Проверка примеров: скрипты загружены и выполнены в тестовом окружении движка с известными объектами и без выбранной цели/слоя. Отдельно проверены границы расстояния и высоты. Это не тест торговли на игровом сервере.