API Pants - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
Pants
Constants & Special Values · UO.ObjAtLayer · UO.ObjAtLayerEx
Pants — строковое обозначение слоя 4 (0x04): штаны. Это специальное значение BASIC, а не команда UO.
Точный синтаксис
Pants -> String (чтение без скобок)
Значение читается без круглых скобок. Способы передачи в команды и отличие от числового ID описаны ниже.
Параметры
Параметров нет.
Возвращает
String "Pants" при чтении без скобок. Соответствующий номер слоя — 4; это отдельное числовое значение. Чтение имени не возвращает ID предмета/контейнера.
Поведение
- Обозначает слой 4 (0x04): штаны. Других bare-алиасов этого слоя нет.
- Bare
Pantsвозвращает строку "Pants", а НЕ Integer 4. Числовой номер и строковое имя нельзя подменять в произвольных командах. - UO.ObjAtLayer(Pants) принимает строковое имя и читает слой собственного персонажа. UO.ObjAtLayer(4) принимает номер. В текущей UO.ObjAtLayerEx первый параметр — номер: UO.ObjAtLayerEx(4, lasttarget). Передавать Pants в ObjAtLayerEx нельзя: там нет преобразования имени слоя в номер.
- UO.ObjAtLayer со строковым именем возвращает hex-строку serial при наличии предмета и Integer 0 при отсутствии. Числовая форма и UO.ObjAtLayerEx возвращают Integer serial/0. Это ID содержимого слота, не его graphic/type и не номер слоя.
- Чтение использует уже полученные клиентом данные. Оно не экипирует предмет, не открывает банк/магазин и не запрашивает содержимое контейнера. Ноль может означать пустой слот, неизвестного персонажа или ещё не загруженный слой.
Внутренние функции: последовательность выполнения
Ниже описана реализация этого движка. Имена внутренних методов не являются дополнительными командами BASIC.
1. AddLayerValue
При регистрации создаётся чтение имени слоя как строки. Таблица layerNameToNumber отдельно связывает имена с числами.
Для Pants таблица содержит 4, но само bare-значение остаётся String.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция AddLayerValue.
2. ConvertLayer
Строковая форма ищет имя в таблице без учёта регистра.
Возвращает числовой номер слоя или ошибку для неизвестного имени.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция ConvertLayer.
3. ObjAtLayer
Для строки вызывает ConvertLayer, затем читает слот self через bridge. Числовая форма в диспетчере использует номер непосредственно.
Строковая форма оформляет найденный serial как hex; пустой слот возвращает Integer 0.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция ObjAtLayer.
4. ObjAtLayerEx
Получает числовой layer и mobileId. Проверяет диапазон 1..29 и ищет слой у загруженного Mobile.
Возвращает serial предмета либо 0. Никаких пакетов покупки, экипировки или открытия не отправляет.
Исходник проекта: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; функция ObjAtLayerEx.
Полный helper ReadLayer приведён в примерах обычных слоёв; для vendor-слоёв ниже приведены все строки обхода контейнера.
Примеры
Пример 1. Прочитать свой слой по имени
SUB Main()
# Pants — строковый селектор слоя 4: штаны.
VAR item = UO.ObjAtLayer(Pants)
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
Разбор параметров и выполнения:
- Pants передаётся без скобок в параметр layer команды ObjAtLayer. Слой читается у self.
- item проверяется на 0. При наличии предмета выводится ID и отдельно graphic.
Пример 2. Прочитать слой выбранного персонажа по номеру
SUB Main()
# Сначала выберите персонажа игровым target.
VAR character = lasttarget
IF character = 0 THEN
UO.Print("Character not selected")
RETURN
END IF
# 4 — номер слоя; character — ID персонажа, не ID предмета.
VAR item = UO.ObjAtLayerEx(4, 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=4; PlayerID=lasttarget. ObjAtLayerEx всегда возвращает Integer serial/0.
- Команда не создаёт новый target. Если выбран предмет вместо mobile, слой не находится.
Пример 3. Полная функция чтения слоя с проверкой
SUB Main()
# Число слоя хранится отдельно от его строкового имени.
VAR item = ReadLayer(4, 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 передано 4 и self. Нулевой слой helper отсекает до вызова API.
Проверка примеров: скрипты загружены и выполнены в тестовом окружении движка с известными объектами и без выбранной цели/слоя. Отдельно проверены границы расстояния и высоты. Это не тест торговли на игровом сервере.