API UO FindAtCoord - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki

UO.FindAtCoord

ClassicUO • Runtime API

Ищет загруженные объекты мира на одной точной клетке X/Y текущей карты.

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

UO.FindAtCoord(X:Any, Y:Any) -> Integer

Параметры

  • X — мировая координата по горизонтали, Integer 0..65535. Обязательна; это не пиксели окна контейнера.
  • Y — мировая координата по вертикали, Integer 0..65535. Обязательна. Дополнительных параметров Z, карты, type или радиуса нет.

Возвращает

Integer — serial первого подходящего объекта в списке результатов этого клиента. 0: совпадений нет, персонаж отсутствует/удалён либо координаты вне 0..65535. Это ID объекта, не type, количество или Boolean. Сохраняются все 32 бита; проверяйте <> 0, не = TRUE и не > 0. Тот же ID записывается в FindItem().

Поведение

  • Проверяет неудалённые Item на земле и Mobile, включая самого персонажа на этой клетке. Содержимое контейнеров и надетые вещи исключены: их X/Y нельзя считать координатами мира. Serial из списка Ignore исключаются.
  • Подходят все высоты Z на заданных X/Y. FindDistance и FindVertical не ограничивают этот поиск точной клетки. Видны только загруженные объекты текущего мира; ландшафт, статика и другая карта не загружаются. Пакеты не отправляются, target не открывается, предметы не перемещаются.
  • Каждый вызов сначала очищает предыдущий поиск. FindCount() считает объекты, FindFullQuantity() суммирует единицы в стопках (Mobile добавляет одну), GetFoundItems() возвращает найденные serial. Сначала обходятся Item, затем Mobile; внутри коллекций действует текущий порядок перечисления. Сохраните список до следующего поиска, который заменит результаты.
  • Источник: Stealth FindAtCoord. Порядок выбора и фильтры выше описывают реализацию этого клиента.

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

Это реальные внутренние этапы. CountGraphicAt — полностью описанная функция скрипта, а не ещё одна встроенная команда.

1. ExecuteStealthCompatibility

Два позиционных или именованных аргумента X/Y преобразуются зарегистрированным маршрутом; Integer от bridge становится результатом.

Integer — serial первого подходящего объекта в списке результатов этого клиента. 0: совпадений нет, персонаж отсутствует/удалён либо координаты вне 0..65535. Это ID объекта, не type, количество или Boolean. Сохраняются все 32 бита; проверяйте <> 0, не = TRUE и не > 0. Тот же ID записывается в FindItem().

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

2. FindAtCoord

На игровом потоке очищаются предыдущие результаты, проверяются персонаж и диапазон координат. Затем проверяются только подходящие наземные предметы и Mobile с заданными X/Y; содержимое контейнеров не подходит.

Проверяет неудалённые Item на земле и Mobile, включая самого персонажа на этой клетке. Содержимое контейнеров и надетые вещи исключены: их X/Y нельзя считать координатами мира. Serial из списка Ignore исключаются.

Исходник проекта: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; функция FindAtCoord.

3. RegisterFound

Каждое совпадение увеличивает счётчик и добавляет serial. Первый serial остаётся в FindItem; Item.Amount добавляет как минимум одну единицу, Mobile — одну.

Каждый вызов сначала очищает предыдущий поиск. FindCount() считает объекты, FindFullQuantity() суммирует единицы в стопках (Mobile добавляет одну), GetFoundItems() возвращает найденные serial. Сначала обходятся Item, затем Mobile; внутри коллекций действует текущий порядок перечисления. Сохраните список до следующего поиска, который заменит результаты.

Исходник проекта: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; функция RegisterFound.

Подходят все высоты Z на заданных X/Y. FindDistance и FindVertical не ограничивают этот поиск точной клетки. Видны только загруженные объекты текущего мира; ландшафт, статика и другая карта не загружаются. Пакеты не отправляются, target не открывается, предметы не перемещаются.

Примеры

Получить один ID

# Получить один ID
#
# Ищет загруженные объекты мира на одной точной клетке X/Y текущей карты.
#
# Integer — serial первого подходящего объекта в списке результатов этого клиента. 0: совпадений
# нет, персонаж отсутствует/удалён либо координаты вне 0..65535. Это ID объекта, не type,
# количество или Boolean. Сохраняются все 32 бита; проверяйте <> 0, не = TRUE и не > 0. Тот же
# ID записывается в FindItem().

SUB Main()
    # 1445 и 1690 — пример мировых X/Y: замените их своей клеткой. id сохраняет один serial; HEX
    # выводит его в шестнадцатеричном виде. <> 0 проверяет наличие результата, не количество.

    VAR id = UO.FindAtCoord(1445, 1690)
    IF id <> 0 THEN
        UO.Print(HEX(id))
    ELSE
        UO.Print('No loaded object')
    END IF
END SUB

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

  • 1445 и 1690 — пример мировых X/Y: замените их своей клеткой. id сохраняет один serial; HEX выводит его в шестнадцатеричном виде. <> 0 проверяет наличие результата, не количество.

Просмотреть все объекты на клетке персонажа

# Просмотреть все объекты на клетке персонажа
#
# Ищет загруженные объекты мира на одной точной клетке X/Y текущей карты.
#
# Integer — serial первого подходящего объекта в списке результатов этого клиента. 0: совпадений
# нет, персонаж отсутствует/удалён либо координаты вне 0..65535. Это ID объекта, не type,
# количество или Boolean. Сохраняются все 32 бита; проверяйте <> 0, не = TRUE и не > 0. Тот же
# ID записывается в FindItem().

SUB Main()
    # x/y читаются у персонажа; ids сохраняет список текущего поиска. Каждый id обозначает один
    # объект, включая целую стопку. GetType(id) читает graphic/body. Предметы не выбираются и не
    # используются.

    VAR x = UO.GetX('self')
    VAR y = UO.GetY('self')
    UO.FindAtCoord(x, y)
    VAR ids = UO.GetFoundItems()
    FOR EACH id IN ids
        UO.Print(HEX(id) + ' type=' + HEX(UO.GetType(id)))
    NEXT
END SUB

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

  • x/y читаются у персонажа; ids сохраняет список текущего поиска. Каждый id обозначает один объект, включая целую стопку. GetType(id) читает graphic/body. Предметы не выбираются и не используются.

Полная функция CountGraphicAt

# Полная функция CountGraphicAt
#
# Ищет загруженные объекты мира на одной точной клетке X/Y текущей карты.
#
# Integer — serial первого подходящего объекта в списке результатов этого клиента. 0: совпадений
# нет, персонаж отсутствует/удалён либо координаты вне 0..65535. Это ID объекта, не type,
# количество или Boolean. Сохраняются все 32 бита; проверяйте <> 0, не = TRUE и не > 0. Тот же
# ID записывается в FindItem().

SUB Main()
    # CountGraphicAt(x, y, graphic) один раз ищет клетку, перебирает сохранённые ID и считает
    # объекты с нужной графикой. graphic=0x0EED — золото. Возвращается число объектов/стопок, не
    # сумма единиц и не true/false; одна стопка даёт один. Функция полностью определена после Main.

    VAR count = CountGraphicAt(1445, 1690, 0x0EED)
    UO.Print('Objects/stacks: ' + CStr(count))
END SUB

FUNCTION CountGraphicAt(x, y, graphic)
    UO.FindAtCoord(x, y)
    VAR ids = UO.GetFoundItems()
    VAR count = 0
    FOR EACH id IN ids
        IF UO.GetType(id) = graphic THEN
            count += 1
        END IF
    NEXT
    RETURN count
END FUNCTION

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

  • CountGraphicAt(x, y, graphic) один раз ищет клетку, перебирает сохранённые ID и считает объекты с нужной графикой. graphic=0x0EED — золото. Возвращается число объектов/стопок, не сумма единиц и не true/false; одна стопка даёт один. Функция полностью определена после Main.

en · ru · uk · fr · de · it · es · zh-tw · ja · ko

Basic