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

UO.GetMapCell

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

ClassicUO • Runtime API

Читает graphic, высоту и флаги земли в одной клетке карты.

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

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

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

Параметры

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

Возвращает

Array из трёх Integer: [0] graphic/type земли, [1] мировая Z основания land, [2] младшие 32 бита флагов tiledata. Недоступная клетка или другая карта дают пустой Array. Это не serial, Boolean или Pascal record; не используйте поля .Tile/.Z. Для количества полей вызывайте GetArrayLength(cell).

Поведение

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

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

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

1. ExecuteStealthCompatibility

Ветка GetMapCell принимает три аргумента X/Y/WorldNum и преобразует их в Integer.

Копирует int[] из bridge.GetLandscapeTile в Array значений скрипта, сохраняя порядок всех трёх полей.

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

2. GetLandscapeTile

Получает X/Y/карту через Invoke на игровом потоке. При несовпадении карты возвращает пустой int[]; иначе ищет Land в списке клетки.

Возвращает [graphic, Z, flags32] либо пустой массив. Z — основание land, flags32 — младшие 32 бита tiledata. GetSurfaceZ отдельно читает AverageZ.

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

3. GetChunk2

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

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

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

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

Примеры

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

# Прочитать землю под персонажем
#
# Читает graphic, высоту и флаги земли в одной клетке карты.
#
# Array из трёх Integer: [0] graphic/type земли, [1] мировая Z основания land, [2] младшие 32
# бита флагов tiledata. Недоступная клетка или другая карта дают пустой Array. Это не serial,
# Boolean или Pascal record; не используйте поля .Tile/.Z. Для количества полей вызывайте
# GetArrayLength(cell).

SUB Main()
    # X/Y берутся у self, WorldNum — текущая карта. cell сохраняет все поля одного вызова.
    # Индексы начинаются с 0. cell[1] — высота, а не признак успешного поиска; пустой массив
    # проверяется до индексации.

    VAR cell = UO.GetMapCell(UO.GetX(), UO.GetY(), UO.WorldNum())
    IF GetArrayLength(cell) = 3 THEN
        UO.Print('Type: ' + CStr(cell[0]))
        UO.Print('Land Z: ' + CStr(cell[1]))
        UO.Print('Flags: ' + CStr(cell[2]))
    ELSE
        UO.Print('Map cell unavailable')
    END IF
END SUB

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

  • X/Y берутся у self, WorldNum — текущая карта. cell сохраняет все поля одного вызова.
  • Индексы начинаются с 0. cell[1] — высота, а не признак успешного поиска; пустой массив проверяется до индексации.

Пример 2. Сравнить две соседние клетки

# Сравнить две соседние клетки
#
# Читает graphic, высоту и флаги земли в одной клетке карты.
#
# Array из трёх Integer: [0] graphic/type земли, [1] мировая Z основания land, [2] младшие 32
# бита флагов tiledata. Недоступная клетка или другая карта дают пустой Array. Это не serial,
# Boolean или Pascal record; не используйте поля .Tile/.Z. Для количества полей вызывайте
# GetArrayLength(cell).

SUB Main()
    # Второй вызов читает клетку восточнее, оба используют одну карту.
    # Разность высот земли не доказывает проходимость: стены, статики и другие объекты проверяются
    # отдельно.

    VAR x = UO.GetX()
    VAR y = UO.GetY()
    VAR map = UO.WorldNum()
    VAR here = UO.GetMapCell(x, y, map)
    VAR east = UO.GetMapCell(x + 1, y, map)
    IF GetArrayLength(here) = 3 AND GetArrayLength(east) = 3 THEN
        UO.Print('Land difference: ' + CStr(east[1] - here[1]))
    END IF
END SUB

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

  • Второй вызов читает клетку восточнее, оба используют одну карту.
  • Разность высот земли не доказывает проходимость: стены, статики и другие объекты проверяются отдельно.

Пример 3. Сравнить основание земли со средней поверхностью

# Сравнить основание земли со средней поверхностью
#
# Читает graphic, высоту и флаги земли в одной клетке карты.
#
# Array из трёх Integer: [0] graphic/type земли, [1] мировая Z основания land, [2] младшие 32
# бита флагов tiledata. Недоступная клетка или другая карта дают пустой Array. Это не serial,
# Boolean или Pascal record; не используйте поля .Tile/.Z. Для количества полей вызывайте
# GetArrayLength(cell).

SUB Main()
    # GetMapCell читает Land.Z; GetSurfaceZ читает Land.AverageZ.
    # Оба значения являются высотой. На наклонной земле они могут различаться; это не высота пола
    # дома.

    VAR x = UO.GetX()
    VAR y = UO.GetY()
    VAR map = UO.WorldNum()
    VAR cell = UO.GetMapCell(x, y, map)
    IF GetArrayLength(cell) = 3 THEN
        VAR average = UO.GetSurfaceZ(x, y, map)
        UO.Print('Base: ' + CStr(cell[1]) + ', average: ' + CStr(average))
    END IF
END SUB

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

  • GetMapCell читает Land.Z; GetSurfaceZ читает Land.AverageZ.
  • Оба значения являются высотой. На наклонной земле они могут различаться; это не высота пола дома.