Skip to content

API UO GetPathArray3D

Codex edited this page Sep 19, 2026 · 5 revisions

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 — последняя запись плана, а не текущее положение персонажа. Команда не перемещает его.

Clone this wiki locally