API UO FindTypesArrayEx - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
ClassicUO • Runtime API
За один обход ищет разные графики, цвета и контейнеры и возвращает один найденный ID. Полный список читается через GetFoundItems.
UO.FindTypesArrayEx(ObjTypes:Any, Colors:Any, Containers:Any, InSub:Any) -> Integer
-
ObjTypes— Graphic/body, не serial предмета. 0..65534 — конкретная графика; -1 или 0xFFFF — любая. Другие отрицательные Integer в этом клиенте также снимают фильтр. -
Colors— Hue, не количество предметов. 0 — неокрашенный предмет; -1 или 0xFFFF — любой hue. Другие отрицательные Integer тоже снимают фильтр цвета. -
Containers— Земля: UO.Ground(), 0, -1, 0xFFFFFFFF либо строка ground. Рюкзак: строка backpack или его serial. Принимаются десятичный/hex serial и имя AddObject. my выбирает весь инвентарь своего персонажа, включая экипировку и вложенные сумки. Неизвестное имя вызывает ошибку скрипта. Проверяйте полученный serial: явный 0 выбирает землю. Имена ground/backpack понятнее числовых обозначений, которые различаются между семействами команд. -
InSub— Обязательный TRUE/FALSE (1/0). FALSE — прямое содержимое конкретного контейнера; TRUE — также загруженные вложенные сумки. Для земли рекурсия ничего не меняет. my уже выбирает весь принадлежащий персонажу инвентарь.
Integer: serial первого совпадения в локальном порядке обхода; 0, если совпадений нет. Не graphic, количество, массив или Boolean. Проверяйте result <> 0, а не result = TRUE либо result = 1. Стопка считается одним объектом; Mobile — одним объектом и одной единицей. Порядок не означает близость и не гарантирован между поисками.
- Передаётся Array; отдельное значение тоже принимается как массив из одного элемента. DIM values[1] создаёт индексы 0 и 1: заполните каждый. Типы и цвета — независимые варианты, а не пары по индексу. Маска «любой» в любой позиции либо пустой массив типов/цветов снимают этот фильтр. Пустой массив контейнеров выбирает инвентарь персонажа. Повторы и пересечения контейнеров не дублируют ID.
- Нужны все четыре позиционных аргумента. Необязательных аргументов нет.
- Земля использует FindDistance и FindVertical этого скрипта, исключает self и включает подходящие Item и Mobile. Поиск в конкретном контейнере эти пределы расстояния/высоты не применяет. В обоих случаях исключаются Ignore и уничтоженные объекты.
- До обхода очищаются FindItem, FindCount, FindFullQuantity и GetFoundItems. Затем они относятся к этому поиску; пустой поиск оставляет нули и пустой массив. FindFullQuantity суммирует max(1, Amount) предметов и по 1 для Mobile. FindQuantity читает текущее количество FindItem. Сохраните GetFoundItems, если после другого поиска прежний список ещё нужен.
- Bridge один раз обходит загруженные предметы, затем Mobile, если выбрана земля. Должны совпасть тип, цвет и хотя бы один контейнер. Один объект учитывается один раз, даже если подходит нескольким условиям. Повторного полного обхода мира для каждой комбинации нет.
- Читаются только данные, полученные клиентом. Контейнеры не открываются, клетки карты не загружаются, переноса нет. Пустой результат не доказывает пустоту сундука на сервере. Если нужна активная связь, проверяйте Connected: сам поиск читает локальное состояние.
- Stealth FindTypesArrayEx. Первоисточник описывает последний ID и запасной поиск в рюкзаке при ошибочном контейнере. Здесь сохраняется первое локальное совпадение; неизвестное имя не переключает поиск на рюкзак. Ground также принимает 0; свой FindDistance по умолчанию 18, максимум 255. Это особенности данного клиента.
Это реальные этапы реализации, не дополнительные публичные команды. FindGoldNearSelf и SearchTypesIn ниже — полностью приведённые функции скрипта.
Runtime преобразует числовые фильтры и отдельно разрешает имена контейнеров; обозначение земли переводится во внутреннюю область мира bridge.
Нужны все четыре позиционных аргумента. Необязательных аргументов нет.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция ExecuteStealthCompatibility.
Земля: UO.Ground(), 0, -1, 0xFFFFFFFF либо строка ground. Рюкзак: строка backpack или его serial. Принимаются десятичный/hex serial и имя AddObject. my выбирает весь инвентарь своего персонажа, включая экипировку и вложенные сумки. Неизвестное имя вызывает ошибку скрипта. Проверяйте полученный serial: явный 0 выбирает землю. Имена ground/backpack понятнее числовых обозначений, которые различаются между семействами команд.
Runtime преобразует числовые фильтры и отдельно разрешает имена контейнеров; обозначение земли переводится во внутреннюю область мира bridge.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция ConvertStealthSearchContainer.
До обхода очищаются FindItem, FindCount, FindFullQuantity и GetFoundItems. Затем они относятся к этому поиску; пустой поиск оставляет нули и пустой массив. FindFullQuantity суммирует max(1, Amount) предметов и по 1 для Mobile. FindQuantity читает текущее количество FindItem. Сохраните GetFoundItems, если после другого поиска прежний список ещё нужен.
Integer: serial первого совпадения в локальном порядке обхода; 0, если совпадений нет. Не graphic, количество, массив или Boolean. Проверяйте result <> 0, а не result = TRUE либо result = 1. Стопка считается одним объектом; Mobile — одним объектом и одной единицей. Порядок не означает близость и не гарантирован между поисками.
Исходник проекта: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; функция ResetFindResults.
Передаётся Array; отдельное значение тоже принимается как массив из одного элемента. DIM values[1] создаёт индексы 0 и 1: заполните каждый. Типы и цвета — независимые варианты, а не пары по индексу. Маска «любой» в любой позиции либо пустой массив типов/цветов снимают этот фильтр. Пустой массив контейнеров выбирает инвентарь персонажа. Повторы и пересечения контейнеров не дублируют ID.
Bridge один раз обходит загруженные предметы, затем Mobile, если выбрана земля. Должны совпасть тип, цвет и хотя бы один контейнер. Один объект учитывается один раз, даже если подходит нескольким условиям. Повторного полного обхода мира для каждой комбинации нет.
Исходник проекта: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; функция BuildFindIdentityMask.
Bridge один раз обходит загруженные предметы, затем Mobile, если выбрана земля. Должны совпасть тип, цвет и хотя бы один контейнер. Один объект учитывается один раз, даже если подходит нескольким условиям. Повторного полного обхода мира для каждой комбинации нет.
Земля использует FindDistance и FindVertical этого скрипта, исключает self и включает подходящие Item и Mobile. Поиск в конкретном контейнере эти пределы расстояния/высоты не применяет. В обоих случаях исключаются Ignore и уничтоженные объекты.
Исходник проекта: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; функция FindTypes.
Graphic/body, не serial предмета. 0..65534 — конкретная графика; -1 или 0xFFFF — любая. Другие отрицательные Integer в этом клиенте также снимают фильтр. Hue, не количество предметов. 0 — неокрашенный предмет; -1 или 0xFFFF — любой hue. Другие отрицательные Integer тоже снимают фильтр цвета.
Bridge один раз обходит загруженные предметы, затем Mobile, если выбрана земля. Должны совпасть тип, цвет и хотя бы один контейнер. Один объект учитывается один раз, даже если подходит нескольким условиям. Повторного полного обхода мира для каждой комбинации нет.
Исходник проекта: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; функция MatchesFindIdentity.
Обязательный TRUE/FALSE (1/0). FALSE — прямое содержимое конкретного контейнера; TRUE — также загруженные вложенные сумки. Для земли рекурсия ничего не меняет. my уже выбирает весь принадлежащий персонажу инвентарь.
Земля использует FindDistance и FindVertical этого скрипта, исключает self и включает подходящие Item и Mobile. Поиск в конкретном контейнере эти пределы расстояния/высоты не применяет. В обоих случаях исключаются Ignore и уничтоженные объекты.
Исходник проекта: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; функция MatchesFindContainer.
До обхода очищаются FindItem, FindCount, FindFullQuantity и GetFoundItems. Затем они относятся к этому поиску; пустой поиск оставляет нули и пустой массив. FindFullQuantity суммирует max(1, Amount) предметов и по 1 для Mobile. FindQuantity читает текущее количество FindItem. Сохраните GetFoundItems, если после другого поиска прежний список ещё нужен.
Integer: serial первого совпадения в локальном порядке обхода; 0, если совпадений нет. Не graphic, количество, массив или Boolean. Проверяйте result <> 0, а не result = TRUE либо result = 1. Стопка считается одним объектом; Mobile — одним объектом и одной единицей. Порядок не означает близость и не гарантирован между поисками.
Исходник проекта: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; функция RegisterFound.
Читаются только данные, полученные клиентом. Контейнеры не открываются, клетки карты не загружаются, переноса нет. Пустой результат не доказывает пустоту сундука на сервере. Если нужна активная связь, проверяйте Connected: сам поиск читает локальное состояние.
# Две графики на земле
#
# За один обход ищет разные графики, цвета и контейнеры и возвращает один найденный ID. Полный
# список читается через GetFoundItems.
#
# Integer: serial первого совпадения в локальном порядке обхода; 0, если совпадений нет. Не
# graphic, количество, массив или Boolean. Проверяйте result <> 0, а не result = TRUE либо
# result = 1. Стопка считается одним объектом; Mobile — одним объектом и одной единицей. Порядок
# не означает близость и не гарантирован между поисками.
SUB Main()
# types содержит золото 0x0EED и чёрный жемчуг 0x0F7A; один color=-1 — любой hue, один Ground —
# земля. FALSE на земле ничего не меняет. Действуют текущие пределы поиска. Выводятся ID, число
# объектов и сумма единиц.
DIM types[1]
types[0] = 0x0EED
types[1] = 0x0F7A
DIM colors[0]
colors[0] = -1
DIM containers[0]
containers[0] = UO.Ground()
VAR first = UO.FindTypesArrayEx(types, colors, containers, FALSE)
UO.Print(Hex(first))
UO.Print(STR(UO.FindCount()))
UO.Print(STR(UO.FindFullQuantity()))
END SUBРазбор параметров и выполнения:
- types содержит золото 0x0EED и чёрный жемчуг 0x0F7A; один color=-1 — любой hue, один Ground — земля. FALSE на земле ничего не меняет. Действуют текущие пределы поиска. Выводятся ID, число объектов и сумма единиц.
# Золото в рюкзаке и на земле
#
# За один обход ищет разные графики, цвета и контейнеры и возвращает один найденный ID. Полный
# список читается через GetFoundItems.
#
# Integer: serial первого совпадения в локальном порядке обхода; 0, если совпадений нет. Не
# graphic, количество, массив или Boolean. Проверяйте result <> 0, а не result = TRUE либо
# result = 1. Стопка считается одним объектом; Mobile — одним объектом и одной единицей. Порядок
# не означает близость и не гарантирован между поисками.
SUB Main()
# types — только золото; colors — любой hue. Containers — backpack и земля; TRUE включает
# вложенные сумки. Выводятся объекты/стопки и единицы из обеих областей, каждый объект
# учитывается один раз.
DIM types[0]
types[0] = 0x0EED
DIM colors[0]
colors[0] = -1
DIM containers[1]
containers[0] = 'backpack'
containers[1] = UO.Ground()
UO.FindTypesArrayEx(types, colors, containers, TRUE)
UO.Print(STR(UO.FindCount()))
UO.Print(STR(UO.FindFullQuantity()))
END SUBРазбор параметров и выполнения:
- types — только золото; colors — любой hue. Containers — backpack и земля; TRUE включает вложенные сумки. Выводятся объекты/стопки и единицы из обеих областей, каждый объект учитывается один раз.
# Полная функция со списком результата
#
# За один обход ищет разные графики, цвета и контейнеры и возвращает один найденный ID. Полный
# список читается через GetFoundItems.
#
# Integer: serial первого совпадения в локальном порядке обхода; 0, если совпадений нет. Не
# graphic, количество, массив или Boolean. Проверяйте result <> 0, а не result = TRUE либо
# result = 1. Стопка считается одним объектом; Mobile — одним объектом и одной единицей. Порядок
# не означает близость и не гарантирован между поисками.
SUB Main()
# SearchTypesIn(container,firstType,secondType) возвращает Array<Integer>, тогда как встроенная
# команда возвращает один Integer ID. Полностью приведённая функция заполняет массивы, ищет
# рекурсивно и сразу копирует GetFoundItems. Main проверяет каждый сохранённый ID и выводит его.
VAR items = SearchTypesIn('backpack', 0x0EED, 0x0F7A)
FOR EACH item IN items
IF UO.IsObjectExists(item) THEN
UO.Print(Hex(item))
END IF
NEXT
END SUB
FUNCTION SearchTypesIn(container, firstType, secondType)
DIM types[1]
types[0] = firstType
types[1] = secondType
DIM colors[0]
colors[0] = -1
DIM containers[0]
containers[0] = container
UO.FindTypesArrayEx(types, colors, containers, TRUE)
RETURN UO.GetFoundItems()
END FUNCTIONРазбор параметров и выполнения:
- SearchTypesIn(container,firstType,secondType) возвращает Array, тогда как встроенная команда возвращает один Integer ID. Полностью приведённая функция заполняет массивы, ищет рекурсивно и сразу копирует GetFoundItems. Main проверяет каждый сохранённый ID и выводит его.