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