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.