Skip to content

API UO EquipT

Codex edited this page Sep 22, 2026 · 6 revisions

UO.EquipT

ClassicUO / Basic IDE

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

Находит вещь указанного graphic/type в рюкзаке и пытается надеть её на заданный слой персонажа. Например, позволяет вооружиться кинжалом без сохранённого serial. Команда не выбирает тело персонажа: 0x0190/0x0191 здесь не подходят как примеры оружия.

Имена и номера слоёв

Номер Допустимые строковые имена
0 Invalid
1 Rhand, RightHand, OneHanded
2 Lhand, LeftHand, TwoHanded
3 Shoes
4 Pants
5 Shirt
6 Hat, Helmet
7 Gloves
8 Ring
9 Talisman
10 Neck, Necklace
11 Hair
12 Waist
13 Torso
14 Brace, Bracelet
15 Face
16 Beard
17 Tunic
18 Ear, Earrings
19 Arms
20 Cloak
21 Bpack, Backpack, BackpackLayer
22 Robe
23 Skirt
24 Legs
25 Mount
26 Rstk, ShopBuyRestock
27 NRstk, ShopBuy
28 Sell, ShopSell
29 Bank

Распознаваемое имя не делает слой пригодным для надевания произвольной вещи. Invalid (0) отклоняется; слои магазина, банка, волос и маунта не являются обычными слотами оружия. Для экипировки вещь должна иметь подходящие данные wearable/layer.

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

UO.EquipT(layer:Any, type:Any) -> Unit
UO.EquipT(layer:Integer, type:Integer) -> Integer

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

Параметры

  • layer — Слой экипировки. Строка "Rhand" — правая рука (1), "Lhand" — левая рука (2); числовой номер также допустим. Все распознаваемые имена приведены в таблице слоёв. Строка "1" не заменяет число 1: неизвестное строковое имя вызывает ошибку. Выбирайте реальный слой самой вещи: команда не меняет её допустимый слот.
  • type — Один graphic предмета, например 0x0F51 — кинжал. Это не serial конкретной вещи и не graphic тела mobile. Число или числовая hex-строка. Цвет не задаётся: ищется любой hue; поиск рекурсивно включает загруженные вложенные контейнеры рюкзака. -1/0xFFFF как wildcard поиска здесь практически бесполезны для выбора оружия: будет взята первая вещь, которая может не соответствовать слою.

Возвращает

Результат зависит от видов аргументов. Два точных Integer (например, 1, 0x0F51) выбирают форму Equipt и возвращают Integer 1/TRUE, если клиент принял действие экипировки, иначе 0/FALSE. При строковом layer или type используется общая форма EquipT с результатом Unit: значения нет, не присваивайте вызов переменной. Регистр букв команды форму не переключает. Ни одна форма не ждёт подтверждения сервера; проверить уже надетую вещь можно через ObjAtLayer и GetType.

Поведение

  • Оба аргумента обязательны. Сначала FindType ищет вещь в рюкзаке, затем Equip проверяет её пригодность. Поиск обновляет общие результаты FindItem/FindCount/GetFoundItems. При нескольких совпадениях выбирается первая подходящая для поиска вещь; отдельного выбора по качеству, hue или имени нет.
  • Клиент проверяет wearable-флаг, фактический слой вещи (1..29) и возможность поднять её. Предмет должен быть загружен. Сервер дополнительно решает, разрешено ли его надеть; принятый локальный запрос не доказывает успех.
  • При отсутствии вещи форма Unit выводит сообщение No item found; числовая форма возвращает 0. При необходимости подобрать конкретную вещь по цвету/serial используйте отдельные FindType и Equip. UO.Equip принимает ID найденной вещи.
  • В ожидании ответа не запускайте одновременно другой перенос предметов. Проверяйте изменение слоя, а не повторяйте действие бесконечно.

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

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

1. EquipT

Общая форма преобразует type, ищет его в backpack и преобразует имя/номер layer.

Вызов завершает Unit; результат bridge.Equip не передаётся скрипту.

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

2. ExecuteLegacyManualAlias / equipt

Форма Integer/Integer выполняет тот же поиск и возвращает результат bridge.Equip.

Нет предмета — 0; найденный serial сам результатом этой команды не является.

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

3. Equip

Проверяет wearable, слой вещи, затем поднимает и отправляет экипировку.

1 означает принятое локальное действие, а не подтверждённый ответ сервера.

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

Ниже полная пользовательская функция с ограниченным ожиданием. Это пример скрипта, не отдельная встроенная команда.

Примеры

Пример 1. Надеть кинжал по строковому имени слоя

SUB Main()
    IF UO.Connected() THEN
        # Rhandслой 1. 0x0F51graphic кинжала в рюкзаке.
        # Строковая форма возвращает Unit: вызов отдельной строкой.
        UO.EquipT("Rhand", 0x0F51)
    END IF
END SUB

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

  • Строка Rhand выбирает слой правой руки. Кинжал должен быть доступен в загруженном рюкзаке. Цвет любой; количество аргументов всегда два.

Пример 2. Обработать отказ числовой формы

SUB Main()
    # Оба аргумента Integer: доступен результат 1/0.
    VAR accepted = UO.Equipt(1, 0x0F51)
    IF accepted = FALSE THEN
        UO.Print("Dagger equip request was not accepted")
        RETURN
    END IF
    # Сервер может прислать подтверждение позже.
    WAIT(300)
    VAR worn = UO.ObjAtLayer(1)
    IF worn <> 0 AndAlso UO.GetType(worn) = 0x0F51 THEN
        UO.AddObject("equipped_dagger", worn)
    END IF
END SUB

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

  • 1 — слой, 0x0F51 — type. FALSE эквивалентно 0 только для числовой формы результата. 300 мс — короткое ожидание примера; отсутствие вещи после него не доказывает окончательный отказ сервера.

Пример 3. Полная функция: надеть и дождаться нужного type

# Полная функция: надеть и дождаться нужного type
#
# Находит вещь указанного graphic/type в рюкзаке и пытается надеть её на заданный слой
# персонажа. Например, позволяет вооружиться кинжалом без сохранённого serial. Команда не
# выбирает тело персонажа: 0x0190/0x0191 здесь не подходят как примеры оружия.
#
# ## Имена и номера слоёв
#
# | Номер | Допустимые строковые имена |
# | ---: | --- |
# | 0 | `Invalid` |
# | 1 | `Rhand`, `RightHand`, `OneHanded` |
# | 2 | `Lhand`, `LeftHand`, `TwoHanded` |
# | 3 | `Shoes` |
# | 4 | `Pants` |
# | 5 | `Shirt` |
# | 6 | `Hat`, `Helmet` |
# | 7 | `Gloves` |
# | 8 | `Ring` |
# | 9 | `Talisman` |
# | 10 | `Neck`, `Necklace` |
# | 11 | `Hair` |
# | 12 | `Waist` |
# | 13 | `Torso` |
# | 14 | `Brace`, `Bracelet` |
# | 15 | `Face` |
# | 16 | `Beard` |
# | 17 | `Tunic` |
# | 18 | `Ear`, `Earrings` |
# | 19 | `Arms` |
# | 20 | `Cloak` |
# | 21 | `Bpack`, `Backpack`, `BackpackLayer` |
# | 22 | `Robe` |
# | 23 | `Skirt` |
# | 24 | `Legs` |
# | 25 | `Mount` |
# | 26 | `Rstk`, `ShopBuyRestock` |
# | 27 | `NRstk`, `ShopBuy` |
# | 28 | `Sell`, `ShopSell` |
# | 29 | `Bank` |
#
# Распознаваемое имя не делает слой пригодным для надевания произвольной вещи. Invalid (0)
# отклоняется; слои магазина, банка, волос и маунта не являются обычными слотами оружия. Для
# экипировки вещь должна иметь подходящие данные wearable/layer.
#
# Результат зависит от видов аргументов. Два точных Integer (например, 1, 0x0F51) выбирают форму
# Equipt и возвращают Integer 1/TRUE, если клиент принял действие экипировки, иначе 0/FALSE. При
# строковом layer или type используется общая форма EquipT с результатом Unit: значения нет, не
# присваивайте вызов переменной. Регистр букв команды форму не переключает. Ни одна форма не
# ждёт подтверждения сервера; проверить уже надетую вещь можно через ObjAtLayer и GetType.

FUNCTION EnsureDagger(timeoutMs)
    VAR worn = UO.ObjAtLayer(1)
    IF worn <> 0 AndAlso UO.GetType(worn) = 0x0F51 THEN
        RETURN TRUE
    END IF
    IF NOT UO.Equipt(1, 0x0F51) THEN
        RETURN FALSE
    END IF
    VAR started = Now()
    WHILE Now() - started < timeoutMs
        WAIT(50)
        worn = UO.ObjAtLayer(1)
        IF worn <> 0 AndAlso UO.GetType(worn) = 0x0F51 THEN
            RETURN TRUE
        END IF
    WEND
    RETURN FALSE
END FUNCTION

SUB Main()
    # timeoutMs=2000 задаёт максимум ожидания в миллисекундах. Проверка каждые 50 мс не отправляет
    # повторную экипировку. TRUE этой пользовательской функции означает, что клиент уже видит нужный
    # type на слое; это более сильная проверка, чем возвращаемое Equipt принятие запроса.

    IF UO.Connected() AndAlso NOT EnsureDagger(2000) THEN
        UO.Print("Dagger was not confirmed within the timeout")
    END IF
END SUB

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

  • timeoutMs=2000 задаёт максимум ожидания в миллисекундах. Проверка каждые 50 мс не отправляет повторную экипировку. TRUE этой пользовательской функции означает, что клиент уже видит нужный type на слое; это более сильная проверка, чем возвращаемое Equipt принятие запроса.

Clone this wiki locally