API UO GetPathArray3D - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
UO.GetPathArray3D
Оглавление · Алфавитный указатель · Movement
ClassicUO • Runtime API
Рассчитывает массив полного пути между двумя точками мира с контролем высоты и дополнительными фильтрами.
Точный синтаксис
UO.GetPathArray3D(startX:Any, startY:Any, startZ:Any, finishX:Any, finishY:Any, finishZ:Any, map:Any, accuracyXY:Any, accuracyZ:Any, run:Any) -> Array
UO.GetPathArray3D(startX:Any, startY:Any, startZ:Any, finishX:Any, finishY:Any, finishZ:Any, map:Any, accuracyXY:Any, accuracyZ:Any, run:Any, maxSteps:Any) -> Array
UO.GetPathArray3D(startX:Any, startY:Any, startZ:Any, finishX:Any, finishY:Any, finishZ:Any, map:Any, accuracyXY:Any, accuracyZ:Any, run:Any, maxSteps:Any, maxDistance:Any) -> Array
UO.GetPathArray3D(startX:Any, startY:Any, startZ:Any, finishX:Any, finishY:Any, finishZ:Any, map:Any, accuracyXY:Any, accuracyZ:Any, run:Any, maxSteps:Any, maxDistance:Any, avoidMobiles:Any) -> Array
UO.GetPathArray3D(startX:Any, startY:Any, startZ:Any, finishX:Any, finishY:Any, finishZ:Any, map:Any, accuracyXY:Any, accuracyZ:Any, run:Any, maxSteps:Any, maxDistance:Any, avoidMobiles:Any, avoidStatics:Any) -> Array
UO.GetPathArray3D(startX:Any, startY:Any, startZ:Any, finishX:Any, finishY:Any, finishZ:Any, map:Any, accuracyXY:Any, accuracyZ:Any, run:Any, maxSteps:Any, maxDistance:Any, avoidMobiles:Any, avoidStatics:Any, allowDoors:Any) -> Array
UO.GetPathArray3D(startX:Any, startY:Any, startZ:Any, finishX:Any, finishY:Any, finishZ:Any, map:Any, accuracyXY:Any, accuracyZ:Any, run:Any, maxSteps:Any, maxDistance:Any, avoidMobiles:Any, avoidStatics:Any, allowDoors:Any, allowDiagonal:Any) -> Array
Выберите одну из зарегистрированных форм. Параметры передаются позиционно. Any означает значение BASIC с преобразованием внутри команды; Unit — отсутствие возвращаемого значения.
Параметры
startX— Исходный мировой X, 0..65535.startY— Исходный мировой Y, 0..65535.startZ— Исходная высота -128..127.finishX— Целевой мировой X, 0..65535.finishY— Целевой мировой Y, 0..65535.finishZ— Целевая высота -128..127.map— Номер текущей загруженной карты, например UO.WorldNum(). Другая карта даёт пустой массив, включая совпадающие X/Y/Z.accuracyXY— Допуск по X и Y в клетках: оба отклонения должны укладываться в него. Значение ограничивается диапазоном 0..20; 0 требует точных X/Y.accuracyZ— Допуск высоты: abs(фактическая Z - требуемая Z), ограничивается 0..255. Ноль требует точной высоты; 255 практически отключает ограничение Z.run— Обязательный совместимый флаг бега. Запрос ничего не двигает; в этой форме Optimized всегда TRUE, поэтому run не меняет последовательность клеток или число шагов.maxSteps— Необязательный предел числа рёбер пути, без начальной точки. 0/отрицательное/отсутствие используют общий предел 4096. Здесь считаются клетки, в отличие от наблюдаемых изменений у NewMoveXY.maxDistance— Необязательный предел исходного расстояния max(abs(dx),abs(dy)) до цели. 0/отсутствие отключают его. Это не разрешённое отклонение при обходе и не длина найденного пути.avoidMobiles— TRUE исключает X/Y загруженных персонажей, кроме self, по снимку в начале вызова; высота этого фильтра не учитывается. По умолчанию FALSE. Обычная проверка проходимости клиента всё равно действует.avoidStatics— TRUE исключает клетку с любой записью static, даже проходимой или на другой высоте. По умолчанию FALSE. Это строгий фильтр, а не только запрет непроходимых стен.allowDoors— TRUE допускает предварительный путь через клетку найденной двери, даже если закрытая дверь не пропускает обычную проверку. По умолчанию FALSE. Дверь не открывается; доступ, Z и проходимость при исполнении надо проверять заново.allowDiagonal— TRUE/отсутствие разрешает восемь направлений с проверкой углов; FALSE — только четыре прямых направления.
Возвращает
Array из записей [x,y,z], каждое поле — Integer. [0] внешнего массива — начальная точка; последняя запись находится в заданном допуске цели. Количество шагов равно GetArrayLength(path)-1 только для непустого массива. Пустой массив [] означает, что полный допустимый путь не получен (недоступная цель/карта, ограничения или предел поиска). Если начальная точка уже подходит, возвращается одна запись и число шагов равно 0. Частичный путь не возвращается.
Поведение
- Команда только рассчитывает маршрут; она не запускает движение и не открывает двери. Для исполнения используйте NewMoveXY/MoveXYZ и проверяйте их собственный результат.
- Поиск обходит препятствия, считая соседние перемещения одинаковыми по стоимости; на неизменной карте ищется путь с наименьшим числом шагов. Проверяется реальная проходимость каждого ребра, включая высоту и ограничения диагоналей клиента.
- Не более 4096 раскрытых узлов и не более 4096 шагов. Лимит работы может дать пустой массив даже при наличии далёкого сложного пути; делите длинные маршруты на участки.
- В клиенте расчёт разбивается на порции до 32 узлов с проверкой бюджета около 1 мс между узлами. Отмена проверяется между порциями. Чтение карты остаётся на игровом потоке; это не обещание фиксированного времени отдельного чтения диска.
- Карта может измениться после проверки: персонажи перемещаются, двери закрываются, сервер исправляет положение. Полученный массив — план по доступным локальным данным, не подтверждение сервера.
- SetBadLocation исключает клетки, SetBadObject — зоны вокруг подходящих загруженных предметов мира. Используется снимок списков своего runtime на момент запроса; запреты другого запуска не наследуются. Начальная клетка не проверяется на возможность стоять: она задаётся вызывающим кодом. Нельзя использовать произвольный Z внутри стены как достоверную исходную позицию.
Примеры
Пример 1. Путь на той же высоте с точным допуском
# Путь на той же высоте с точным допуском
#
# Рассчитывает массив полного пути между двумя точками мира с контролем высоты и дополнительными
# фильтрами.
#
# Array из записей `[x,y,z]`, каждое поле — Integer. `[0]` внешнего массива — начальная точка;
# последняя запись находится в заданном допуске цели. Количество шагов равно
# GetArrayLength(path)-1 только для непустого массива. Пустой массив `[]` означает, что полный
# допустимый путь не получен (недоступная цель/карта, ограничения или предел поиска). Если
# начальная точка уже подходит, возвращается одна запись и число шагов равно 0. Частичный путь
# не возвращается.
SUB Main()
# Первые три значения — исходные X/Y/Z; следующие три — назначение.
# map=WorldNum(), accuracyXY=0, accuracyZ=0 требуют точной позиции. run=FALSE не запускает
# ходьбу.
VAR x = UO.GetX()
VAR y = UO.GetY()
VAR z = UO.GetZ()
VAR path = UO.GetPathArray3D(x, y, z, x + 4, y, z, UO.WorldNum(), 0, 0, FALSE)
IF GetArrayLength(path) > 0 THEN
UO.Print('Steps: ' + STR(GetArrayLength(path) - 1))
END IF
END SUB
Разбор параметров и выполнения:
- Первые три значения — исходные X/Y/Z; следующие три — назначение.
- map=WorldNum(), accuracyXY=0, accuracyZ=0 требуют точной позиции. run=FALSE не запускает ходьбу.
Пример 2. Все параметры с фильтрами
# Все параметры с фильтрами
#
# Рассчитывает массив полного пути между двумя точками мира с контролем высоты и дополнительными
# фильтрами.
#
# Array из записей `[x,y,z]`, каждое поле — Integer. `[0]` внешнего массива — начальная точка;
# последняя запись находится в заданном допуске цели. Количество шагов равно
# GetArrayLength(path)-1 только для непустого массива. Пустой массив `[]` означает, что полный
# допустимый путь не получен (недоступная цель/карта, ограничения или предел поиска). Если
# начальная точка уже подходит, возвращается одна запись и число шагов равно 0. Частичный путь
# не возвращается.
SUB Main()
# Цель 1445/1690/20; accuracyXY=1, accuracyZ=2; run=TRUE остаётся флагом совместимости.
# maxSteps=80, maxDistance=30; avoidMobiles=TRUE, avoidStatics=FALSE, allowDoors=TRUE,
# allowDiagonal=FALSE. Массив может быть пустым.
# Разрешение дверей является предположением для планирования; гарантии открытия и прохождения
# нет.
VAR path = UO.GetPathArray3D(UO.GetX(), UO.GetY(), UO.GetZ(), 1445, 1690, 20, UO.WorldNum(), 1, 2, TRUE, 80, 30, TRUE, FALSE, TRUE, FALSE)
UO.Print('Points: ' + STR(GetArrayLength(path)))
END SUB
Разбор параметров и выполнения:
- Цель 1445/1690/20; accuracyXY=1, accuracyZ=2; run=TRUE остаётся флагом совместимости.
- maxSteps=80, maxDistance=30; avoidMobiles=TRUE, avoidStatics=FALSE, allowDoors=TRUE, allowDiagonal=FALSE. Массив может быть пустым.
- Разрешение дверей является предположением для планирования; гарантии открытия и прохождения нет.
Пример 3. Прочитать последнюю достигнутую точку
# Прочитать последнюю достигнутую точку
#
# Рассчитывает массив полного пути между двумя точками мира с контролем высоты и дополнительными
# фильтрами.
#
# Array из записей `[x,y,z]`, каждое поле — Integer. `[0]` внешнего массива — начальная точка;
# последняя запись находится в заданном допуске цели. Количество шагов равно
# GetArrayLength(path)-1 только для непустого массива. Пустой массив `[]` означает, что полный
# допустимый путь не получен (недоступная цель/карта, ограничения или предел поиска). Если
# начальная точка уже подходит, возвращается одна запись и число шагов равно 0. Частичный путь
# не возвращается.
SUB Main()
# accuracyXY=2/accuracyZ=5 разрешают ближайшую подходящую точку; maxSteps=100.
# last — последняя запись плана, а не текущее положение персонажа. Команда не перемещает его.
VAR path = UO.GetPathArray3D(UO.GetX(), UO.GetY(), UO.GetZ(), 1445, 1690, 0, UO.WorldNum(), 2, 5, FALSE, 100)
VAR count = GetArrayLength(path)
IF count > 0 THEN
VAR last = path[count - 1]
UO.Print('X=' + STR(last[0]) + ' Y=' + STR(last[1]) + ' Z=' + STR(last[2]))
END IF
END SUB
Разбор параметров и выполнения:
- accuracyXY=2/accuracyZ=5 разрешают ближайшую подходящую точку; maxSteps=100.
- last — последняя запись плана, а не текущее положение персонажа. Команда не перемещает его.