Skip to content

API UO AddType

Codex edited this page Sep 22, 2026 · 5 revisions

UO.AddType

ClassicUO / Basic IDE

Home · Все команды · Каталоги

Сохраняет понятное имя для графического типа предмета или тела mobile. Например, после UO.AddType("bandage", 0x0E21) можно искать или использовать бинты через имя "bandage", не повторяя числовой type в каждой строке. Это настройка соответствия имя → Graphic, а не создание предмета и не запоминание одного конкретного ID.

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

UO.AddType(name:Any) -> Unit
UO.AddType(name:Any, type:Any) -> Unit

Выберите одну из зарегистрированных форм. Параметры передаются позиционно. Any означает значение BASIC с преобразованием внутри команды; Unit — отсутствие возвращаемого значения.

Параметры

  • name — Обязательная строка в кавычках — ваше имя типа. Пробелы по краям удаляются, регистр не важен: "Bandage" и "bandage" — одна запись. Пустая строка, числовое имя, слово any, символ | и управляющие символы запрещены. Это значение параметра, а не новая переменная или UO-команда: в последующих вызовах также нужны кавычки.
  • type — Необязательный Integer 0..65535: Graphic/type, например 0x0E21 или 3617. Допустима строка с десятичным/шестнадцатеричным числом либо имя уже сохранённого типа; последнее копирует его текущее число, не создаёт связь между именами. ID вида 0x40001001, отрицательное число, дробь и неизвестное имя не принимаются. Если аргумент отсутствует, появляется курсор выбора: щёлкните по загруженному предмету, в том числе внутри контейнера, или mobile. Сохраняется Graphic выбранного объекта; поверхность земли и статический тайл не подходят.

Возвращает

Unit — возвращаемого значения нет. Пишите отдельной строкой, без VAR result = и без сравнения с True/1. Команда не возвращает выбранный type, serial или признак успешного выбора. При отмене мышью старая запись сохраняется; если имени раньше не было, оно остаётся неопределённым. Следующая строка скрипта выполняется и после обычной отмены, поэтому не запускайте действие автоматически, предполагая, что пользователь обязательно выбрал новый предмет.

Поведение

  • Форма AddType(name, type) сохраняет число сразу, без курсора и без сетевого действия. Повтор с тем же именем заменяет его тип. Ошибочное значение не уничтожает прежнюю запись. Форма AddType(name) ждёт выбора; Esc, замена курсора другим действием или неподходящая цель оставляют запись без изменения. Принудительная остановка скрипта прерывает ожидание и освобождает только принадлежащий ему курсор.
  • Имена типов хранятся отдельно от AddObject: одинаковое слово может обозначать type в FindType и serial в UseObject. AddType("supply", 0x0E21) само по себе не делает UseObject("supply") допустимым. Для конкретного предмета применяйте AddObject/GetSerial; для семейства предметов — AddType и параметр type.
  • Имена разрешаются в параметрах type у FindType (все формы), FindTypeEx, FindTypesArrayEx, FindList, FindNotoriety, GetWorldItems, UseType, UseFromGround, Count, CountGround, CountEx, EquipT, WaitTargetType, WaitTargetGround и WaitTargetObjectType. В масках типов GetMobiles/FindAnyType/WaitTarget можно комбинировать имена через | или массив; правила notoriety остаются отдельными. Слова human/near и другие фильтры FindMobile не переопределяются.
  • Также поддерживаются графические параметры MassMove, MassPriceMove, AllPrice, MoveItems, AddIgnoreList/DeleteIgnoreList, SetBadObject, WaitTargetTile, полный Target, GetStaticArt и Morph. Это не замена любых числовых аргументов: количество, цена, цвет, слой, координаты, дистанция, serial и Basic GetType не читают эту таблицу. Wildcard -1 и 0xFFFF в поисковых командах сохраняют их собственный смысл; AddType не меняет условия поиска.
  • Сохраняется только Graphic, без цвета, количества, контейнера, имени предмета, слоя или свойств. Два предмета одного типа разных цветов требуют отдельного color в поиске. Запись не подтверждает, что предмет сейчас существует, доступен или что сервер разрешит действие.
  • В клиенте таблица относится к текущему состоянию Basic данного профиля и входит в обычное сохранение профиля. Новый чистый профиль не получает чужие имена. Имена доступны скриптам, использующим это состояние; словарь защищён при одновременном чтении и записи. Корректные старые записи AddType с числом переносятся автоматически; старая запись только с именем не содержала выбранного type и восстановить её нельзя.

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

Ниже описана реализация этого движка. Имена внутренних методов не являются дополнительными командами BASIC.

1. ExecuteLegacyManualAlias

Обрабатывает ровно одну или две позиции AddType и передаёт их в AddType.

Команда возвращает Unit; больше не складывает неиспользуемые строки в общий список.

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

2. AddType

Проверяет строку name. Во второй форме разрешает число/готовое имя; в первой запрашивает IApiTypeSelectionBridge.SelectType.

Сохраняет запись только после корректного значения или выбора. Отмена не стирает прежний Graphic.

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

3. SelectType

Использует SelectObject с принадлежащим запросу курсором. Читает Graphic выбранного живого объекта Entity на игровом потоке.

Возвращает nullable Integer: Graphic или отсутствие выбора. Это внутренний результат, не результат UO.AddType.

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

4. ResolveType

В конкретных параметрах type сначала ищет строковое имя в state.Types, иначе использует числовое преобразование.

Возвращает Graphic. Не изменяет общее преобразование чисел, serial и Basic-функций.

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

5. ParseTypeMask

Разрешает имена внутри строк с | и массивов, затем применяет существующий разбор маски.

Не смешивает таблицу типов с notoriety; неизвестная маска не превращается в поиск всех объектов.

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

Имена разрешаются в параметрах графики, затем действуют обычные правила соответствующей команды. Создание имени не выполняет игровое действие.

Примеры

Пример 1. Поднять одну найденную стопку золота

SUB Main()
    # Имя относится к типу всех таких стопок, а не к одной ID.
    UO.AddType("gold_stack", 0x0EED)
    VAR item = UO.FindType("gold_stack", -1, "ground", 2)
    IF item = "" THEN
        UO.Print("No loaded gold stack within 2 tiles")
        RETURN
    END IF
    # 0 означает всю стопку; результат поискаконкретный serial.
    VAR moved = UO.MoveItem(item, 0, "backpack")
    IF moved = 0 THEN
        UO.Print("Move request failed")
    END IF
END SUB

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

  • gold_stack — имя; 0x0EED — Graphic золота. FindType: -1 — любой цвет, ground — земля, 2 — радиус поиска. Возвращается строка serial или пустая строка.
  • MoveItem получает найденный serial, 0 для всей стопки и backpack как назначение. Это одна стопка, а не все стопки в радиусе. Доступность переноса и реальный результат зависят от сервера; определение типа само ничего не переносит.

Пример 2. Использовать бинт только при нехватке здоровья

SUB Main()
    UO.AddType("bandage", "0x0E21")
    IF UO.Life() >= UO.MaxHP() THEN
        RETURN
    END IF
    VAR bandage = UO.FindType("bandage", -1, "backpack", -1, TRUE)
    IF bandage = "" THEN
        UO.Print("No loaded bandages in backpack")
        RETURN
    END IF
    # Сначала очередь self, затем использование найденного предмета.
    UO.WaitTargetObject("self")
    UO.UseObject(bandage)
END SUB

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

  • Строковое число 0x0E21 сохраняется как Integer Graphic. Life/MaxHP сравнивают HP персонажа. FindType ищет любой цвет рекурсивно в рюкзаке; -1 в distance использует стандартное поведение поиска.
  • self — цель применения, bandage после FindType — переменная с serial. Очередь таргета готовится до использования предмета. Скрипт отправляет использование и не утверждает, что лечение уже завершилось; таймер/правила лечения зависят от сервера.

Пример 3. Назначить свой инструмент мышью, применять отдельной процедурой

SUB Main()
    # Здесь только настройка: щёлкните инструмент в контейнере.
    # Esc сохраняет прежнее назначение; автоматического действия нет.
    UO.AddType("my_tool")
END SUB

SUB UseSavedTool()
    # Запускайте отдельно после успешной настройки my_tool.
    VAR used = UO.UseType("my_tool", -1, "backpack")
    IF used = 0 THEN
        UO.Print("No matching loaded tool in backpack")
    END IF
END SUB

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

  • В Main указан только name, поэтому открывается курсор. Сохраняется тип инструмента, не его ID и не цвет. UseSavedTool — обычная отдельная процедура BASIC, а не встроенная команда.
  • UseType ищет экземпляр сохранённого типа любого цвета в рюкзаке и использует его; возвращает Integer serial или 0 при отсутствии. Если имя никогда не было определено, это ошибка аргумента, а не результат 0. После отмены назначения Main не вызывает UseSavedTool.

Clone this wiki locally