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

UO.GetPathArray

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

ClassicUO • Runtime API

Возвращает путь от текущего положения персонажа к X/Y без выполнения движения.

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

UO.GetPathArray(Xdst:Any, Ydst:Any, Optimized:Any, Accuracy:Any) -> Any

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

Параметры

  • Xdst / x — Мировая координата X назначения, 0..65535. Это не serial и не позиция внутри гампа.
  • Ydst / y — Мировая координата Y назначения, 0..65535.
  • Optimized — TRUE разрешает диагональные переходы; FALSE оставляет четыре прямых направления в этой совместимой форме. Это отличается от смысла Optimized у MoveXY.
  • Accuracy — Допуск по X и Y в клетках: оба отклонения должны укладываться в него. Значение ограничивается диапазоном 0..20; 0 требует точных X/Y.

Возвращает

Array из записей [x,y,z], каждое поле — Integer. [0] внешнего массива — начальная точка; последняя запись находится в заданном допуске цели. Количество шагов равно GetArrayLength(path)-1 только для непустого массива. Пустой массив [] означает, что полный допустимый путь не получен (недоступная цель/карта, ограничения или предел поиска). Если начальная точка уже подходит, возвращается одна запись и число шагов равно 0. Частичный путь не возвращается.

Поведение

  • Команда только рассчитывает маршрут; она не запускает движение и не открывает двери. Для исполнения используйте NewMoveXY/MoveXYZ и проверяйте их собственный результат.
  • Поиск обходит препятствия, считая соседние перемещения одинаковыми по стоимости; на неизменной карте ищется путь с наименьшим числом шагов. Проверяется реальная проходимость каждого ребра, включая высоту и ограничения диагоналей клиента.
  • Не более 4096 раскрытых узлов и не более 4096 шагов. Лимит работы может дать пустой массив даже при наличии далёкого сложного пути; делите длинные маршруты на участки.
  • В клиенте расчёт разбивается на порции до 32 узлов с проверкой бюджета около 1 мс между узлами. Отмена проверяется между порциями. Чтение карты остаётся на игровом потоке; это не обещание фиксированного времени отдельного чтения диска.
  • Карта может измениться после проверки: персонажи перемещаются, двери закрываются, сервер исправляет положение. Полученный массив — план по доступным локальным данным, не подтверждение сервера.
  • SetBadLocation исключает клетки, SetBadObject — зоны вокруг подходящих загруженных предметов мира. Используется снимок списков своего runtime на момент запроса; запреты другого запуска не наследуются. Начальная клетка не проверяется на возможность стоять: она задаётся вызывающим кодом. Нельзя использовать произвольный Z внутри стены как достоверную исходную позицию.
  • Текущая карта, исходные X/Y/Z и целевой Z берутся у персонажа. Допуск Z=255. Дополнительных фильтров mobiles/statics и разрешения закрытых дверей в четырёхаргументной форме нет.

Примеры

Пример 1. Узнать число шагов

# Узнать число шагов
#
# Возвращает путь от текущего положения персонажа к X/Y без выполнения движения.
#
# Array из записей `[x,y,z]`, каждое поле — Integer. `[0]` внешнего массива — начальная точка;
# последняя запись находится в заданном допуске цели. Количество шагов равно
# GetArrayLength(path)-1 только для непустого массива. Пустой массив `[]` означает, что полный
# допустимый путь не получен (недоступная цель/карта, ограничения или предел поиска). Если
# начальная точка уже подходит, возвращается одна запись и число шагов равно 0. Частичный путь
# не возвращается.

SUB Main()
    # Xdst — пять клеток восточнее; Ydst прежний; Optimized=TRUE; Accuracy=0.
    # count включает начальную точку. Вычитание 1 выполняется только после проверки непустого
    # массива.

    VAR path = UO.GetPathArray(UO.GetX() + 5, UO.GetY(), TRUE, 0)
    VAR count = GetArrayLength(path)
    IF count > 0 THEN
        UO.Print('Steps: ' + STR(count - 1))
    ELSE
        UO.Print('Complete path is unavailable')
    END IF
END SUB

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

  • Xdst — пять клеток восточнее; Ydst прежний; Optimized=TRUE; Accuracy=0.
  • count включает начальную точку. Вычитание 1 выполняется только после проверки непустого массива.

Пример 2. Перебрать координаты маршрута

# Перебрать координаты маршрута
#
# Возвращает путь от текущего положения персонажа к X/Y без выполнения движения.
#
# Array из записей `[x,y,z]`, каждое поле — Integer. `[0]` внешнего массива — начальная точка;
# последняя запись находится в заданном допуске цели. Количество шагов равно
# GetArrayLength(path)-1 только для непустого массива. Пустой массив `[]` означает, что полный
# допустимый путь не получен (недоступная цель/карта, ограничения или предел поиска). Если
# начальная точка уже подходит, возвращается одна запись и число шагов равно 0. Частичный путь
# не возвращается.

SUB Main()
    # Цель 1445/1690; Optimized=FALSE исключает диагонали; Accuracy=1 разрешает ближайшую клетку в
    # квадрате допуска.
    # point[0]/[1]/[2] — X/Y/Z. Это не graphic, serial или тип поверхности.

    VAR path = UO.GetPathArray(1445, 1690, FALSE, 1)
    VAR i = 0
    WHILE i < GetArrayLength(path)
        VAR point = path[i]
        UO.Print(STR(point[0]) + ',' + STR(point[1]) + ',' + STR(point[2]))
        i = i + 1
    WEND
END SUB

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

  • Цель 1445/1690; Optimized=FALSE исключает диагонали; Accuracy=1 разрешает ближайшую клетку в квадрате допуска.
  • point[0]/[1]/[2] — X/Y/Z. Это не graphic, serial или тип поверхности.

Пример 3. Проверить путь перед отдельной командой движения

# Проверить путь перед отдельной командой движения
#
# Возвращает путь от текущего положения персонажа к X/Y без выполнения движения.
#
# Array из записей `[x,y,z]`, каждое поле — Integer. `[0]` внешнего массива — начальная точка;
# последняя запись находится в заданном допуске цели. Количество шагов равно
# GetArrayLength(path)-1 только для непустого массива. Пустой массив `[]` означает, что полный
# допустимый путь не получен (недоступная цель/карта, ограничения или предел поиска). Если
# начальная точка уже подходит, возвращается одна запись и число шагов равно 0. Частичный путь
# не возвращается.

SUB Main()
    # Первая команда только считает путь. Вторая заново проверяет/исполняет движение, callback=0,
    # timeout=5000.
    # Если нужно просто идти, предварительный GetPathArray не обязателен и добавляет работу.

    VAR x = UO.GetX() + 3
    VAR y = UO.GetY()
    VAR path = UO.GetPathArray(x, y, TRUE, 0)
    IF GetArrayLength(path) > 0 THEN
        VAR ok = UO.NewMoveXY(x, y, TRUE, 0, FALSE, 0, 5000)
        UO.Print('Movement result: ' + STR(ok))
    END IF
END SUB

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

  • Первая команда только считает путь. Вторая заново проверяет/исполняет движение, callback=0, timeout=5000.
  • Если нужно просто идти, предварительный GetPathArray не обязателен и добавляет работу.