-
Notifications
You must be signed in to change notification settings - Fork 0
API OneHanded
Constants & Special Values · UO.ObjAtLayer · UO.ObjAtLayerEx
OneHanded — строковое обозначение слоя 1 (0x01): правая рука / одноручный слот. Это специальное значение BASIC, а не команда UO.
OneHanded -> String (чтение без скобок)
Значение читается без круглых скобок. Способы передачи в команды и отличие от числового ID описаны ниже.
Параметров нет.
String "OneHanded" при чтении без скобок. Соответствующий номер слоя — 1; это отдельное числовое значение. Чтение имени не возвращает ID предмета/контейнера.
- Обозначает слой 1 (0x01): правая рука / одноручный слот. Другие зарегистрированные имена этого слоя: Rhand, RightHand.
- Bare
OneHandedвозвращает строку "OneHanded", а НЕ Integer 1. Числовой номер и строковое имя нельзя подменять в произвольных командах. - UO.ObjAtLayer(OneHanded) принимает строковое имя и читает слой собственного персонажа. UO.ObjAtLayer(1) принимает номер. В текущей UO.ObjAtLayerEx первый параметр — номер: UO.ObjAtLayerEx(1, lasttarget). Передавать OneHanded в ObjAtLayerEx нельзя: там нет преобразования имени слоя в номер.
- UO.ObjAtLayer со строковым именем возвращает hex-строку serial при наличии предмета и Integer 0 при отсутствии. Числовая форма и UO.ObjAtLayerEx возвращают Integer serial/0. Это ID содержимого слота, не его graphic/type и не номер слоя.
- Чтение использует уже полученные клиентом данные. Оно не экипирует предмет, не открывает банк/магазин и не запрашивает содержимое контейнера. Ноль может означать пустой слот, неизвестного персонажа или ещё не загруженный слой.
Ниже описана реализация этого движка. Имена внутренних методов не являются дополнительными командами BASIC.
При регистрации создаётся чтение имени слоя как строки. Таблица отдельно связывает имена с числами.
Для OneHanded таблица содержит 1, но само bare-значение остаётся String.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция AddLayerValue / layerNameToNumber.
Строковая форма ObjAtLayer ищет имя в таблице без учёта регистра. Числовая форма использует номер непосредственно.
Bridge читает слот self. Строковая форма оформляет найденный serial как hex; пустой слот возвращает Integer 0.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция ObjAtLayer / ConvertLayer.
Получает числовой layer и mobileId. Проверяет диапазон 1..29 и ищет слой у загруженного Mobile.
Возвращает serial предмета либо 0. Никаких пакетов покупки, экипировки или открытия не отправляет.
Исходник проекта: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; функция ObjAtLayerEx.
Полный helper ReadLayer приведён в примерах обычных слоёв; для vendor-слоёв ниже приведены все строки обхода контейнера.
SUB Main()
# OneHanded — строковый селектор слоя 1: правая рука / одноручный слот.
VAR item = UO.ObjAtLayer(OneHanded)
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Разбор параметров и выполнения:
- OneHanded передаётся без скобок в параметр 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
# 1 — номер слоя; character — ID персонажа, не ID предмета.
VAR item = UO.ObjAtLayerEx(1, 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=1; PlayerID=lasttarget. ObjAtLayerEx всегда возвращает Integer serial/0.
- Команда не создаёт новый target. Если выбран предмет вместо mobile, слой не находится.
SUB Main()
# Число слоя хранится отдельно от его строкового имени.
VAR item = ReadLayer(1, 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 передано 1 и self. Нулевой слой helper отсекает до вызова API.
Проверка примеров: скрипты загружены и выполнены в тестовом окружении движка с известными объектами и без выбранной цели/слоя. Отдельно проверены границы расстояния и высоты. Это не тест торговли на игровом сервере.
ClassicUO - Bad Newbie & Basic IDE Edition