-
Notifications
You must be signed in to change notification settings - Fork 0
API Shirt
Constants & Special Values · UO.ObjAtLayer · UO.ObjAtLayerEx
Shirt — строковое обозначение слоя 5 (0x05): рубашка. Это специальное значение BASIC, а не команда UO.
Shirt -> String (чтение без скобок)
Значение читается без круглых скобок. Способы передачи в команды и отличие от числового ID описаны ниже.
Параметров нет.
String "Shirt" при чтении без скобок. Соответствующий номер слоя — 5; это отдельное числовое значение. Чтение имени не возвращает ID предмета/контейнера.
- Обозначает слой 5 (0x05): рубашка. Других bare-алиасов этого слоя нет.
- Bare
Shirtвозвращает строку "Shirt", а НЕ Integer 5. Числовой номер и строковое имя нельзя подменять в произвольных командах. - UO.ObjAtLayer(Shirt) принимает строковое имя и читает слой собственного персонажа. UO.ObjAtLayer(5) принимает номер. В текущей UO.ObjAtLayerEx первый параметр — номер: UO.ObjAtLayerEx(5, lasttarget). Передавать Shirt в ObjAtLayerEx нельзя: там нет преобразования имени слоя в номер.
- UO.ObjAtLayer со строковым именем возвращает hex-строку serial при наличии предмета и Integer 0 при отсутствии. Числовая форма и UO.ObjAtLayerEx возвращают Integer serial/0. Это ID содержимого слота, не его graphic/type и не номер слоя.
- Чтение использует уже полученные клиентом данные. Оно не экипирует предмет, не открывает банк/магазин и не запрашивает содержимое контейнера. Ноль может означать пустой слот, неизвестного персонажа или ещё не загруженный слой.
Ниже описана реализация этого движка. Имена внутренних методов не являются дополнительными командами BASIC.
При регистрации создаётся чтение имени слоя как строки. Таблица layerNameToNumber отдельно связывает имена с числами.
Для Shirt таблица содержит 5, но само bare-значение остаётся String.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция AddLayerValue.
Строковая форма ищет имя в таблице без учёта регистра.
Возвращает числовой номер слоя или ошибку для неизвестного имени.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция ConvertLayer.
Для строки вызывает ConvertLayer, затем читает слот self через bridge. Числовая форма в диспетчере использует номер непосредственно.
Строковая форма оформляет найденный serial как hex; пустой слот возвращает Integer 0.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция ObjAtLayer.
Получает числовой layer и mobileId. Проверяет диапазон 1..29 и ищет слой у загруженного Mobile.
Возвращает serial предмета либо 0. Никаких пакетов покупки, экипировки или открытия не отправляет.
Исходник проекта: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; функция ObjAtLayerEx.
Полный helper ReadLayer приведён в примерах обычных слоёв; для vendor-слоёв ниже приведены все строки обхода контейнера.
SUB Main()
# Shirt — строковый селектор слоя 5: рубашка.
VAR item = UO.ObjAtLayer(Shirt)
IF item = 0 THEN
UO.Print("Layer is empty or not loaded")
RETURN
END IF
UO.Print("Item ID: " + CStr(item))
# GetType читает graphic этого предмета, не номер слоя.
UO.Print("Graphic: " + CStr(UO.GetType(item)))
END SUBРазбор параметров и выполнения:
- Shirt передаётся без скобок в параметр layer команды ObjAtLayer. Слой читается у self.
- item проверяется на 0. При наличии предмета выводится ID и отдельно graphic.
SUB Main()
# Сначала выберите персонажа игровым target.
VAR character = lasttarget
IF character = 0 THEN
UO.Print("Character not selected")
RETURN
END IF
# 5 — номер слоя; character — ID персонажа, не ID предмета.
VAR item = UO.ObjAtLayerEx(5, character)
IF item = 0 THEN
UO.Print("Layer is empty or not loaded")
RETURN
END IF
UO.Print("Selected character layer ID: " + CStr(item))
END SUBРазбор параметров и выполнения:
- LayerType=5; PlayerID=lasttarget. ObjAtLayerEx всегда возвращает Integer serial/0.
- Команда не создаёт новый target. Если выбран предмет вместо mobile, слой не находится.
SUB Main()
# Число слоя хранится отдельно от его строкового имени.
VAR item = ReadLayer(5, self)
UO.Print("Own layer ID: " + CStr(item))
END SUB
FUNCTION ReadLayer(layerNumber, character)
# Доступны реальные слои 1..29; 0 означает Invalid.
IF layerNumber < 1 OR layerNumber > 29 OR character = 0 THEN
RETURN 0
END IF
VAR item = UO.ObjAtLayerEx(layerNumber, character)
IF item = 0 THEN
UO.Print("No loaded item on layer " + CStr(layerNumber))
END IF
RETURN item
END FUNCTIONРазбор параметров и выполнения:
- ReadLayer объявлена целиком. layerNumber — номер 1..29; character — serial; результат — Integer serial/0.
- В Main передано 5 и self. Нулевой слой helper отсекает до вызова API.
Проверка примеров: скрипты загружены и выполнены в тестовом окружении движка с известными объектами и без выбранной цели/слоя. Отдельно проверены границы расстояния и высоты. Это не тест торговли на игровом сервере.
ClassicUO - Bad Newbie & Basic IDE Edition