-
Notifications
You must be signed in to change notification settings - Fork 0
API 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.
Общая форма преобразует type, ищет его в backpack и преобразует имя/номер layer.
Вызов завершает Unit; результат bridge.Equip не передаётся скрипту.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция EquipT.
Форма Integer/Integer выполняет тот же поиск и возвращает результат bridge.Equip.
Нет предмета — 0; найденный serial сам результатом этой команды не является.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция ExecuteLegacyManualAlias / equipt.
Проверяет wearable, слой вещи, затем поднимает и отправляет экипировку.
1 означает принятое локальное действие, а не подтверждённый ответ сервера.
Исходник проекта: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; функция Equip.
Ниже полная пользовательская функция с ограниченным ожиданием. Это пример скрипта, не отдельная встроенная команда.
SUB Main()
IF UO.Connected() THEN
# Rhand — слой 1. 0x0F51 — graphic кинжала в рюкзаке.
# Строковая форма возвращает Unit: вызов отдельной строкой.
UO.EquipT("Rhand", 0x0F51)
END IF
END SUBРазбор параметров и выполнения:
- Строка Rhand выбирает слой правой руки. Кинжал должен быть доступен в загруженном рюкзаке. Цвет любой; количество аргументов всегда два.
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 мс — короткое ожидание примера; отсутствие вещи после него не доказывает окончательный отказ сервера.
# Полная функция: надеть и дождаться нужного 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 принятие запроса.
ClassicUO
Bad Newbie & Basic IDE
Найти в справочнике
Клиент и скрипты
Каталоги значений
Разработка и помощь