-
Notifications
You must be signed in to change notification settings - Fork 0
API UO FindList
ClassicUO / Basic IDE
Оглавление · Алфавитный указатель · Search
Ищет загруженные предметы или mobiles по нескольким type/hue. Возвращает первый serial строкой и сохраняет весь упорядоченный результат для FindItem, FindCount и GetFoundItems.
UO.FindList(list:Any) -> String
UO.FindList(list:Any, container:Any) -> String
UO.FindList(list:Any, container:Any, distance:Any) -> String
UO.FindList(list:Any, container:Any, distance:Any, notoriety:Any) -> String
UO.FindList(list:Any, container:Any, distance:Any, notoriety:Any, nearest:Any) -> String
UO.FindList(list:Any, container:Any, distance:Any, notoriety:Any, nearest:Any, maxZ:Any) -> String
UO.FindList(list:Any, container:Any, distance:Any, notoriety:Any, nearest:Any, maxZ:Any, includeIgnored:Any) -> String
Выберите одну из зарегистрированных форм. Параметры передаются позиционно. Any означает значение BASIC с преобразованием внутри команды; Unit — отсутствие возвращаемого значения.
-
list— Имя непустого набора AddFindList; либо плоский массив числовых type; либо строка типов с разделителями |, запятая, точка с запятой или пробел, например "0x0EED|0x0F7A". Массив/строка типов используют любой hue. Пары [type,hue] внутри массива не поддерживаются; для hue создайте именованный набор. Порядок записей задаёт приоритет. Graphic/type предмета либо body mobile, а не его serial. Обычно Integer 0..65535, включая 0x0EED; -1 или 0xFFFF означают любой type при поиске. Указывайте одно значение на запись. Несколько типов добавляются отдельными вызовами. -
container— По умолчанию -1: вещи, чей корневой контейнер — персонаж (в том числе вложенные сумки и экипировка). "my" = -1. ground, "ground", UO.Ground(), числовые 0 или 1 выбирают мир: предметы на земле и mobiles, кроме self. "backpack" или serial контейнера >1 ищут только прямое содержимое, без рекурсии. Объектный алиас разрешается как serial; неверный алиас может дать 0, поэтому проверьте его через GetSerial заранее. -
distance— Неотрицательный радиус клеток по max(abs(dx),abs(dy)); диагональ — одна клетка. Действует на поиск ground; прямое содержимое контейнера по расстоянию не ограничивается. По умолчанию и при отрицательном аргументе берётся UO.FindDistance(). 0 — те же X/Y. -
notoriety— По умолчанию -1, любой код. Одно число, строка "5|6" или плоский массив чисел задают разрешённые коды mobiles; при таком фильтре Items исключены. Коды: 0 неизвестно, 1 innocent, 2 ally, 3 gray, 4 criminal, 5 enemy, 6 murderer, 7 invulnerable; смысл отношений задаёт сервер. Пустая маска/any/-1 без конкретных кодов не ограничивает. При смешивании wildcard и кодов конкретные коды остаются ограничением. Нечисловые токены игнорируются рядом с корректными; маска только из ошибочных токенов не находит ничего. -
nearest— По умолчанию FALSE. FALSE/0: сначала приоритет записи list, затем меньший serial. TRUE/1: сначала расстояние, затем приоритет записи, затем serial. Это порядок, а не дополнительный фильтр. -
maxZ— Допустимое абсолютное отличие Z от персонажа включительно. По умолчанию или при отрицательном аргументе используется UO.FindVertical(); 0 допускает только одинаковую Z. Для явного serial контейнера >1 берётся Z загруженного контейнера (если его нет — Z вещи); для остальных режимов — Z кандидата. Координаты вещи в gump не являются высотой мира. -
includeIgnored— По умолчанию FALSE: serial из Ignore данного runtime исключаются. TRUE/1 включает их только в этот поиск и не очищает Ignore.
String: hex-serial первого результата (например "0x40000011") или пустая строка "" при отсутствии совпадений. Это ID, не type, количество и не Boolean: проверяйте result <> "", а не result = TRUE. При нормальном непустом запросе FindItem хранит тот же ID числом, FindCount() — число distinct объектов, GetFoundItems() — массив их числовых serial.
- От 1 до 7 позиционных аргументов; пропускать можно только хвост. Чтобы задать maxZ, явно передайте предшествующие аргументы. Поиск синхронный по локально загруженному состоянию: не открывает контейнер, не подгружает содержимое, не проверяет линию обзора/доступность и не атакует.
- Каждый объект включается один раз, даже если совпал с несколькими правилами. Его приоритет — первая совпавшая запись. Неизвестное имя пытается разбираться как строка типов; нечитаемый type/hue вызывает ошибку преобразования.
- Непустой запрос очищает предыдущие FindItem/FindCount/GetFoundItems до отбора; отсутствие совпадений оставляет пустые результаты. Исключение: пустой массив или пустая строка list возвращают "" ДО обращения к поиску и сохраняют прежние результаты. Не считайте FindCount после такого вызова новым результатом.
- Изменение определений AddFindList/ClearFindList/DeleteFindList не меняет уже найденный набор. Другой поиск в этом runtime заменяет FindItem и общий массив, поэтому сохраняйте GetFoundItems перед вложенным поиском.
- Определения находятся в состоянии данного скриптового runtime. Самостоятельный другой runtime имеет свой набор; закрытие окна IDE не является очисткой этих правил. Это не файл настроек и не список глобальных объектов игры.
- AddFindList дописывает запись в конец; повторения не удаляются. Для повторной подготовки своего набора сначала вызывайте ClearFindList("имя"). Изменение определений не очищает уже полученные FindItem/FindCount/GetFoundItems.
- Запись хранит текстовые поля. Числовой литерал 0x0EED сохраняется как "3821", строка "0x0EED" — как "0x0EED". Поиск преобразует оба варианта в число, а DeleteFindList сравнивает именно сохранённый текст. Используйте одинаковую форму при добавлении и удалении.
- Неизвестное имя в FindList не является пустым зарегистрированным набором: движок пытается разобрать его как список числовых типов. Нечисловое имя вызывает ошибку преобразования. После удаления последней записи создайте новый набор до поиска по этому имени.
Ниже описана реализация этого движка. Имена внутренних методов не являются дополнительными командами BASIC.
Разрешает именованный список или разбирает типы, подставляет defaults; преобразует контейнер и маску notoriety.
Передаёт отдельные массивы type/hue и все ограничения в bridge.FindList; serial превращает в hex-строку.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция CompactFindList.
Собирает разрешённые коды; invalid-only маска получает специальный отрицательный маркер.
Этот маркер должен означать отсутствие совпадений, а не поиск без ограничений.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция ParseIntMask.
Сбрасывает предыдущие результаты, проверяет type/hue, контейнер, Ignore, дистанцию, Z и notoriety.
Отбирает только загруженные объекты; invalid-only маска сразу оставляет пустой результат.
Исходник проекта: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; функция FindList.
Различает корень собственного инвентаря, землю и прямое содержимое указанного контейнера.
Радиус применяется в режиме ground.
Исходник проекта: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; функция MatchesFindContainer.
После сортировки записывает совпавшие serial и количество единиц в общий результат.
Первый serial определяет возвращаемое значение; дубликаты объектов не добавляются.
Исходник проекта: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; функция RegisterFound.
BASIC-помощник ниже показывает настройку и использование результата; обход внутренних коллекций мира остаётся внутри клиента.
SUB BuildLoot()
# Очистка только нашего набора предотвращает дубликаты при повторном вызове.
UO.ClearFindList("loot")
UO.AddFindList("loot", 0x0EED, -1)
UO.AddFindList("loot", 0x0F7A, -1)
END SUB
SUB Main()
BuildLoot()
VAR item = UO.FindList("loot", ground, 2, -1, FALSE, 5)
IF item = "" THEN
RETURN
END IF
# count=0: вся выбранная стопка. Сервер проверяет возможность переноса.
VAR accepted = UO.MoveItem(item, 0, "backpack")
IF accepted = 0 THEN
UO.Print("Move was not accepted")
END IF
END SUBРазбор параметров и выполнения:
- При FALSE золото имеет приоритет над вторым type даже при большей дистанции. Радиус 2 и maxZ=5 ограничивают кандидатов; они не гарантируют право поднять вещь.
- Это реальное игровое действие: переносится только первый найденный объект. Результат MoveItem не означает подтверждение сервером всего перемещения.
SUB Main()
# Строка типов без именованного списка, любой hue.
VAR target = UO.FindList("0x0190|0x0191", ground, 12, "5|6", TRUE, 10, FALSE)
IF target <> "" THEN
UO.AddObject("candidate", target)
UO.Print("Candidate: " + UO.GetName(target))
END IF
END SUBРазбор параметров и выполнения:
- Семь параметров: два body, мир, радиус 12, коды 5 или 6, ближайший первым, разница Z не больше 10, игнорированные исключены. Здесь только выбор и сохранение; атакующий скрипт должен отдельно проверить подходящие условия.
SUB Main()
DIM types[1]
types[0] = 0x0EED
types[1] = 0x0F7A
VAR first = UO.FindList(types, "backpack")
VAR total = 0
IF first <> "" THEN
VAR items = UO.GetFoundItems()
FOR EACH item IN items
# ID -> количество именно этой стопки.
total += UO.FindCount(item)
NEXT
END IF
IF total < 100 THEN
UO.Print("Stock below limit: " + CStr(total))
END IF
END SUBРазбор параметров и выполнения:
- DIM types[1] создаёт индексы 0 и 1 в этом движке. Суммируются единицы двух видов, а не число стопок. backpack ограничен прямым содержимым; вложенные сумки сюда не входят.
ClassicUO
Bad Newbie & Basic IDE
Найти в справочнике
Клиент и скрипты
Каталоги значений
Разработка и помощь