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
Разбор параметров и выполнения:
- Разность показывает наклон земли. Этот пример ничего не перемещает и не считает маршрут.