Skip to content

API Shirt

Codex edited this page Sep 21, 2026 · 5 revisions

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.

1. AddLayerValue

При регистрации создаётся чтение имени слоя как строки. Таблица layerNameToNumber отдельно связывает имена с числами.

Для Shirt таблица содержит 5, но само 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()
    # 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.

Пример 2. Прочитать слой выбранного персонажа по номеру

SUB Main()
    # Сначала выберите персонажа игровым target.
    VAR character = lasttarget
    IF character = 0 THEN
        UO.Print("Character not selected")
        RETURN
    END IF
    # 5номер слоя; characterID персонажа, не 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, слой не находится.

Пример 3. Полная функция чтения слоя с проверкой

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.

Проверка примеров: скрипты загружены и выполнены в тестовом окружении движка с известными объектами и без выбранной цели/слоя. Отдельно проверены границы расстояния и высоты. Это не тест торговли на игровом сервере.

Clone this wiki locally