-
Notifications
You must be signed in to change notification settings - Fork 0
API Mount
Constants & Special Values · UO.ObjAtLayer · UO.ObjAtLayerEx
Mount — строковое обозначение слоя 25 (0x19): верховое животное / mounted item. Это специальное значение BASIC, а не команда UO.
Mount -> String (чтение без скобок)
Значение читается без круглых скобок. Способы передачи в команды и отличие от числового ID описаны ниже.
Параметров нет.
String "Mount" при чтении без скобок. Соответствующий номер слоя — 25; это отдельное числовое значение. Чтение имени не возвращает ID предмета/контейнера.
- Обозначает слой 25 (0x19): верховое животное / mounted item. Других bare-алиасов этого слоя нет.
- Bare
Mountвозвращает строку "Mount", а НЕ Integer 25. Числовой номер и строковое имя нельзя подменять в произвольных командах. - UO.ObjAtLayer(Mount) принимает строковое имя и читает слой собственного персонажа. UO.ObjAtLayer(25) принимает номер. В текущей UO.ObjAtLayerEx первый параметр — номер: UO.ObjAtLayerEx(25, lasttarget). Передавать Mount в ObjAtLayerEx нельзя: там нет преобразования имени слоя в номер.
- UO.ObjAtLayer со строковым именем возвращает hex-строку serial при наличии предмета и Integer 0 при отсутствии. Числовая форма и UO.ObjAtLayerEx возвращают Integer serial/0. Это ID содержимого слота, не его graphic/type и не номер слоя.
- Чтение использует уже полученные клиентом данные. Оно не экипирует предмет, не открывает банк/магазин и не запрашивает содержимое контейнера. Ноль может означать пустой слот, неизвестного персонажа или ещё не загруженный слой.
- Чтение Mount не выполняет UO.Mount или UO.Dismount. Наличие предмета на слое 25 само по себе не проверяет, каким способом сервер разрешает посадку.
Ниже описана реализация этого движка. Имена внутренних методов не являются дополнительными командами BASIC.
При регистрации создаётся чтение имени слоя как строки. Таблица отдельно связывает имена с числами.
Для Mount таблица содержит 25, но само 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()
# Mount — строковый селектор слоя 25: верховое животное / mounted item.
VAR item = UO.ObjAtLayer(Mount)
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Разбор параметров и выполнения:
- Mount передаётся без скобок в параметр 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
# 25 — номер слоя; character — ID персонажа, не ID предмета.
VAR item = UO.ObjAtLayerEx(25, 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=25; PlayerID=lasttarget. ObjAtLayerEx всегда возвращает Integer serial/0.
- Команда не создаёт новый target. Если выбран предмет вместо mobile, слой не находится.
SUB Main()
# Число слоя хранится отдельно от его строкового имени.
VAR item = ReadLayer(25, 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 передано 25 и self. Нулевой слой helper отсекает до вызова API.
Проверка примеров: скрипты загружены и выполнены в тестовом окружении движка с известными объектами и без выбранной цели/слоя. Отдельно проверены границы расстояния и высоты. Это не тест торговли на игровом сервере.
ClassicUO - Bad Newbie & Basic IDE Edition