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

UO.GetSurfaceZ

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

ClassicUO • Runtime API

Читает среднюю высоту поверхности земли в клетке.

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

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

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

Параметры

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

Возвращает

Integer — Land.AverageZ, в том числе отрицательная высота и 0. При отсутствии карты/земли либо несовпадении карты возвращается 0, поэтому это значение не отличает отсутствие данных от настоящей высоты 0. Это не Boolean, этаж или высота ближайшей статики.

Поведение

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

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

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

1. ExecuteStealthCompatibility

Ветка GetSurfaceZ принимает X/Y/WorldNum.

Возвращает Integer из одноимённого bridge-метода.

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

2. GetSurfaceZ

Переносит чтение на игровой поток, проверяет текущую карту и ищет Land через Map.GetTile.

Возвращает AverageZ первой земли; при недоступных данных 0. Высоты Item/Multi/Static здесь не выбираются.

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

3. GetChunk2

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

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

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

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

Примеры

Пример 1. Средняя высота под персонажем

# Средняя высота под персонажем
#
# Читает среднюю высоту поверхности земли в клетке.
#
# Integer — Land.AverageZ, в том числе отрицательная высота и 0. При отсутствии карты/земли либо
# несовпадении карты возвращается 0, поэтому это значение не отличает отсутствие данных от
# настоящей высоты 0. Это не Boolean, этаж или высота ближайшей статики.

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

    VAR x = UO.GetX()
    VAR y = UO.GetY()
    VAR map = UO.WorldNum()
    VAR z = UO.GetSurfaceZ(x, y, map)
    UO.Print('Average land Z: ' + CStr(z))
END SUB

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

  • Все три параметра относятся к текущей клетке карты. z — числовая высота, не результат движения.

Пример 2. Проверить доступность земли до чтения

# Проверить доступность земли до чтения
#
# Читает среднюю высоту поверхности земли в клетке.
#
# Integer — Land.AverageZ, в том числе отрицательная высота и 0. При отсутствии карты/земли либо
# несовпадении карты возвращается 0, поэтому это значение не отличает отсутствие данных от
# настоящей высоты 0. Это не Boolean, этаж или высота ближайшей статики.

SUB Main()
    # GetMapCell нужен, чтобы отличить отсутствующие данные от высоты 0. Между двумя вызовами карта
    # всё равно может измениться.

    VAR x = UO.GetX() + 1
    VAR y = UO.GetY()
    VAR map = UO.WorldNum()
    VAR cell = UO.GetMapCell(x, y, map)
    IF GetArrayLength(cell) = 3 THEN
        UO.Print('Average: ' + CStr(UO.GetSurfaceZ(x, y, map)))
    ELSE
        UO.Print('No land data')
    END IF
END SUB

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

  • GetMapCell нужен, чтобы отличить отсутствующие данные от высоты 0. Между двумя вызовами карта всё равно может измениться.

Пример 3. Показать изменение средней высоты к востоку

# Показать изменение средней высоты к востоку
#
# Читает среднюю высоту поверхности земли в клетке.
#
# Integer — Land.AverageZ, в том числе отрицательная высота и 0. При отсутствии карты/земли либо
# несовпадении карты возвращается 0, поэтому это значение не отличает отсутствие данных от
# настоящей высоты 0. Это не Boolean, этаж или высота ближайшей статики.

SUB Main()
    # Разность показывает наклон земли. Этот пример ничего не перемещает и не считает маршрут.

    VAR x = UO.GetX()
    VAR y = UO.GetY()
    VAR map = UO.WorldNum()
    VAR a = UO.GetMapCell(x, y, map)
    VAR b = UO.GetMapCell(x + 1, y, map)
    IF GetArrayLength(a) = 3 AND GetArrayLength(b) = 3 THEN
        VAR difference = UO.GetSurfaceZ(x + 1, y, map) - UO.GetSurfaceZ(x, y, map)
        UO.Print('Average difference: ' + CStr(difference))
    END IF
END SUB

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

  • Разность показывает наклон земли. Этот пример ничего не перемещает и не считает маршрут.