Skip to content

API UO FindList

Codex edited this page Sep 22, 2026 · 5 revisions

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.

1. CompactFindList

Разрешает именованный список или разбирает типы, подставляет defaults; преобразует контейнер и маску notoriety.

Передаёт отдельные массивы type/hue и все ограничения в bridge.FindList; serial превращает в hex-строку.

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

2. ParseIntMask

Собирает разрешённые коды; invalid-only маска получает специальный отрицательный маркер.

Этот маркер должен означать отсутствие совпадений, а не поиск без ограничений.

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

3. FindList

Сбрасывает предыдущие результаты, проверяет type/hue, контейнер, Ignore, дистанцию, Z и notoriety.

Отбирает только загруженные объекты; invalid-only маска сразу оставляет пустой результат.

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

4. MatchesFindContainer

Различает корень собственного инвентаря, землю и прямое содержимое указанного контейнера.

Радиус применяется в режиме ground.

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

5. RegisterFound

После сортировки записывает совпавшие serial и количество единиц в общий результат.

Первый serial определяет возвращаемое значение; дубликаты объектов не добавляются.

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

BASIC-помощник ниже показывает настройку и использование результата; обход внутренних коллекций мира остаётся внутри клиента.

Примеры

Пример 1. Выбрать ресурс по приоритету и перенести одну стопку

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 не означает подтверждение сервером всего перемещения.

Пример 2. Сохранить ближайшего mobile из двух notoriety

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, игнорированные исключены. Здесь только выбор и сохранение; атакующий скрипт должен отдельно проверить подходящие условия.

Пример 3. Посчитать запасы нескольких типов из массива

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 ограничен прямым содержимым; вложенные сумки сюда не входят.

Clone this wiki locally