API UO GetLayerCount - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki

UO.GetLayerCount

Оглавление · Алфавитный указатель · World & Geometry

ClassicUO • Runtime API

Считает записи неземельной геометрии в одной клетке.

Точный синтаксис

UO.GetLayerCount(X:Any, Y:Any, WorldNum:Any) -> Any

Выберите одну из зарегистрированных форм. Параметры передаются позиционно. Any означает значение BASIC с преобразованием внутри команды; Unit — отсутствие возвращаемого значения.

Параметры

  • X — Мировая координата X клетки текущей карты, не положение в гампе.
  • Y — Мировая координата Y клетки текущей карты.
  • WorldNum — Номер карты/фасета; используйте UO.WorldNum(). Читается только текущая загруженная карта.

Возвращает

Integer — количество троек graphic/Z/hue, полученных GetStaticTiles. В текущем клиенте учитываются Static, Multi и Item: несколько записей одной высоты считаются отдельно. Пустая клетка/другая карта дают 0. Это не номер слоя экипировки, не число этажей, не количество уникальных высот и не Boolean.

Поведение

  • Команда читает локальную карту и не запускает движение или target. Клетка за пределами размеров карты не подменяется клеткой соседнего столбца.
  • Высота Z, graphic/type, цвет hue, флаги и слой экипировки имеют разный смысл. Нулевой graphic или Z=0 могут быть допустимыми данными; проверяйте форму результата.
  • Состав соответствует ReadStaticsXY, а не GetLayer или ObjAtLayer. Этот клиент включает динамические предметы и части Multi; исходный справочник Stealth описывает счётчик статик.

Внутренние функции: от вызова до результата

Это цепочка настоящих C#-методов клиента. Имена внутренних методов не являются дополнительными UO-командами. Запускаемый код и все вспомогательные процедуры приведены ниже.

1. ExecuteStealthCompatibility

Ветка GetLayerCount передаёт X/Y/WorldNum в GetStaticTiles.

Делит длину плоского int[] на 3 и возвращает Integer.

Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция ExecuteStealthCompatibility.

2. GetStaticTiles

Получает X/Y/карту на игровом потоке, затем перебирает список объектов клетки через Map.GetTile.

Возвращает плоские тройки graphic/Z/hue для Static, Multi и Item. Это расширение текущего клиента: выборка включает загруженные части домов и предметы на земле, но не Land и не Mobile. Несовпадение карты даёт пустой массив.

Исходник проекта: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; функция GetStaticTiles.

3. GetChunk2

Получает X/Y блока карты и флаг load. Проверяет обе оси до вычисления линейного индекса; отрицательные и слишком большие координаты дают null.

Возвращает загруженный/переиспользуемый Chunk или null. При load=true может прочитать блок из ресурсов; холодное чтение не имеет жёсткой гарантии времени.

Исходник проекта: src/ClassicUO.Client/Game/Map/Map.cs; функция GetChunk2.

Чтение не перемещает персонажа и не отправляет команды серверу. Геометрия меняется между запросами; полученный массив — результат этого чтения, а не подписка на изменения.

Примеры

Пример 1. Посчитать записи под персонажем

# Посчитать записи под персонажем
#
# Считает записи неземельной геометрии в одной клетке.
#
# Integer — количество троек graphic/Z/hue, полученных GetStaticTiles. В текущем клиенте
# учитываются Static, Multi и Item: несколько записей одной высоты считаются отдельно. Пустая
# клетка/другая карта дают 0. Это не номер слоя экипировки, не число этажей, не количество
# уникальных высот и не Boolean.

SUB Main()
    # count — число записей клетки; 1 означает одну запись, а не логический успех.

    VAR count = UO.GetLayerCount(UO.GetX(), UO.GetY(), UO.WorldNum())
    UO.Print('Tile records: ' + CStr(count))
END SUB

Разбор параметров и выполнения:

  • count — число записей клетки; 1 означает одну запись, а не логический успех.

Пример 2. Прочитать тройки и посчитать из одного снимка

# Прочитать тройки и посчитать из одного снимка
#
# Считает записи неземельной геометрии в одной клетке.
#
# Integer — количество троек graphic/Z/hue, полученных GetStaticTiles. В текущем клиенте
# учитываются Static, Multi и Item: несколько записей одной высоты считаются отдельно. Пустая
# клетка/другая карта дают 0. Это не номер слоя экипировки, не число этажей, не количество
# уникальных высот и не Boolean.

SUB Main()
    # ReadStaticsXY возвращает плоский Array: graphic, Z, hue, затем следующая тройка.
    # Деление длины на 3 считает записи одного снимка. Отдельный GetLayerCount позже может дать
    # другое число, если мир изменился.

    VAR tiles = UO.ReadStaticsXY(UO.GetX(), UO.GetY(), UO.WorldNum())
    VAR count = CInt(GetArrayLength(tiles) / 3)
    UO.Print('Records in this snapshot: ' + CStr(count))
END SUB

Разбор параметров и выполнения:

  • ReadStaticsXY возвращает плоский Array: graphic, Z, hue, затем следующая тройка.
  • Деление длины на 3 считает записи одного снимка. Отдельный GetLayerCount позже может дать другое число, если мир изменился.

Пример 3. Проверить соседнюю клетку

# Проверить соседнюю клетку
#
# Считает записи неземельной геометрии в одной клетке.
#
# Integer — количество троек graphic/Z/hue, полученных GetStaticTiles. В текущем клиенте
# учитываются Static, Multi и Item: несколько записей одной высоты считаются отдельно. Пустая
# клетка/другая карта дают 0. Это не номер слоя экипировки, не число этажей, не количество
# уникальных высот и не Boolean.

SUB Main()
    # Отсутствие записей не доказывает проходимость земли. Наличие записи тоже не доказывает, что
    # она является стеной.

    VAR x = UO.GetX() + 1
    VAR y = UO.GetY()
    VAR count = UO.GetLayerCount(x, y, UO.WorldNum())
    IF count > 0 THEN
        UO.Print('Non-land geometry exists: ' + CStr(count))
    ELSE
        UO.Print('No loaded non-land records')
    END IF
END SUB

Разбор параметров и выполнения:

  • Отсутствие записей не доказывает проходимость земли. Наличие записи тоже не доказывает, что она является стеной.