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 не обязателен и добавляет работу.