-
Notifications
You must be signed in to change notification settings - Fork 0
API UO IsWorldCellPassable
Оглавление · Алфавитный указатель · World & Geometry
ClassicUO • Runtime API
Проверяет один переход в соседнюю мировую клетку и возвращает флаг проходимости вместе с высотой.
UO.IsWorldCellPassable(CurrX:Any, CurrY:Any, CurrZ:Any, DestX:Any, DestY:Any, DestZ:Any, WorldNum:Any) -> Array
Выберите одну из зарегистрированных форм. Параметры передаются позиционно. Any означает значение BASIC с преобразованием внутри команды; Unit — отсутствие возвращаемого значения.
-
CurrX— Обязательная мировая координата X исходной клетки. Целое 0..65535 в пределах загруженной карты; это не координата гампа. -
CurrY— Обязательная мировая координата Y исходной клетки. Целое 0..65535 в пределах загруженной карты; это не координата гампа. -
CurrZ— Обязательная исходная высота −128..127. Это высота мира, не номер этажа. Недопустимая высота отклоняется, не обрезается. -
DestX— Обязательная мировая координата X целевой клетки. Целое 0..65535 в пределах загруженной карты; это не координата гампа. -
DestY— Обязательная мировая координата Y целевой клетки. Целое 0..65535 в пределах загруженной карты; это не координата гампа. -
DestZ— Обязательный входной запасной Z, обычно CurrZ. Это не var: переменная не меняется и не задаёт требуемый этаж. Рассчитанную высоту читайте из результата [1]. Этот bridge всегда возвращает свою высоту; аргумент нужен для совместимости с формой Pascal. -
WorldNum— Обязательный номер карты: UO.WorldNum(). Проверяется только текущая карта с известными размерами; другая карта не загружается.
Array из двух Integer: [0] — проходимость, 1 = TRUE, 0 = FALSE; [1] — рассчитанная Z. Только первый элемент логический. Сам массив нельзя сравнивать с TRUE. Высота 0/отрицательная допустима; при [0]=0 высота не доказывает достижимость. Отклонение аргументов возвращает [0, CurrZ].
- Нет движения, открытия дверей, прицела или сетевых пакетов. Читается имеющаяся локальная геометрия; сервер может позднее отклонить шаг. Два запроса могут увидеть разное состояние.
- Принимается соседняя клетка (разница X/Y не больше 1). Более далёкая цель, выход за карту, отсутствие персонажа/карты и IsDestroyed дают отказ до расчёта. Для полноценного маршрута используйте GetPathArray или NewMoveXY.
- Одинаковые допустимые X/Y дают [1, CurrZ] без проверки коллизий: шаг не нужен. Это не проверка возможности уйти с клетки. Состояние персонажа и действующие правила Pathfinder влияют на соседний шаг; без загруженной геометрии он может быть отклонён.
Ниже реальные внутренние C#-этапы. IsCellOpen — полностью определённая вспомогательная функция примера, а не скрытая встроенная команда.
Выбирает ветку совместимости, читает семь аргументов как Integer. DestZ используется только если альтернативный bridge не вернул высоту. Возвращает массив, не изменяет аргумент.
Array из двух Integer: [0] — проходимость, 1 = TRUE, 0 = FALSE; [1] — рассчитанная Z. Только первый элемент логический. Сам массив нельзя сравнивать с TRUE. Высота 0/отрицательная допустима; при [0]=0 высота не доказывает достижимость. Отклонение аргументов возвращает [0, CurrZ].
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция ExecuteClientApiCompatibility.
Через Invoke проверяет персонажа, карту, размеры, X/Y, Z и соседство до вычитания координат. Выбирает направление. На успех дополнительно требует точные целевые X/Y после CanWalkForQuery.
Array из двух Integer: [0] — проходимость, 1 = TRUE, 0 = FALSE; [1] — рассчитанная Z. Только первый элемент логический. Сам массив нельзя сравнивать с TRUE. Высота 0/отрицательная допустима; при [0]=0 высота не доказывает достижимость. Отклонение аргументов возвращает [0, CurrZ].
Исходник проекта: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; функция CheckWorldStep.
Временно убирает чужой предикат запрещённых клеток активного маршрута и восстанавливает его в finally. Вызывает CanWalk; сам запрос не начинает маршрут.
Нет движения, открытия дверей, прицела или сетевых пакетов. Читается имеющаяся локальная геометрия; сервер может позднее отклонить шаг. Два запроса могут увидеть разное состояние.
Исходник проекта: src/ClassicUO.Client/Game/Pathfinder.cs; функция CanWalkForQuery.
Проверяет основной шаг и боковые клетки диагонали. Возвращает bool и изменяет координаты ref только для принятого шага; обход на боковую клетку ещё не является достижением запрошенной цели.
CanWalk проверяет основной шаг и, при диагонали, боковые клетки. CalculateNewZ подбирает поверхность и свободное место с учётом состояния персонажа. CalculateMinMaxZ получает диапазон высоты исходной клетки через CreateItemList; последний собирает уже загруженные Land/Static/Multi/Item/Mobile и правила столкновений. Диагональная запасная сторона не считается достижением требуемой клетки.
Исходник проекта: src/ClassicUO.Client/Game/Pathfinder.cs; функция CanWalk.
Получает целевые X/Y, исходную Z по ref и направление. Выбирает поверхность с достаточным свободным пространством и учётом состояния персонажа. bool означает локальную проходимость; z хранит выбранную высоту.
CanWalk проверяет основной шаг и, при диагонали, боковые клетки. CalculateNewZ подбирает поверхность и свободное место с учётом состояния персонажа. CalculateMinMaxZ получает диапазон высоты исходной клетки через CreateItemList; последний собирает уже загруженные Land/Static/Multi/Item/Mobile и правила столкновений. Диагональная запасная сторона не считается достижением требуемой клетки.
Исходник проекта: src/ClassicUO.Client/Game/Pathfinder.cs; функция CalculateNewZ.
Получает новую клетку, текущую Z, направление и режим персонажа. Через CreateItemList получает исходную геометрию и вычисляет minZ/maxZ по ref для проверки подъёма и свободного пространства.
CanWalk проверяет основной шаг и, при диагонали, боковые клетки. CalculateNewZ подбирает поверхность и свободное место с учётом состояния персонажа. CalculateMinMaxZ получает диапазон высоты исходной клетки через CreateItemList; последний собирает уже загруженные Land/Static/Multi/Item/Mobile и правила столкновений. Диагональная запасная сторона не считается достижением требуемой клетки.
Исходник проекта: src/ClassicUO.Client/Game/Pathfinder.cs; функция CalculateMinMaxZ.
Получает список, X/Y и режим персонажа. Собирает загруженные объекты клетки и правила столкновений; bool сообщает, доступна ли геометрия. Map.GetTile вызывается с load=false, новые блоки не читаются.
CanWalk проверяет основной шаг и, при диагонали, боковые клетки. CalculateNewZ подбирает поверхность и свободное место с учётом состояния персонажа. CalculateMinMaxZ получает диапазон высоты исходной клетки через CreateItemList; последний собирает уже загруженные Land/Static/Multi/Item/Mobile и правила столкновений. Диагональная запасная сторона не считается достижением требуемой клетки.
Исходник проекта: src/ClassicUO.Client/Game/Pathfinder.cs; функция CreateItemList.
Нет движения, открытия дверей, прицела или сетевых пакетов. Читается имеющаяся локальная геометрия; сервер может позднее отклонить шаг. Два запроса могут увидеть разное состояние.
# Проверить клетку к востоку
#
# Проверяет один переход в соседнюю мировую клетку и возвращает флаг проходимости вместе с
# высотой.
#
# Array из двух Integer: [0] — проходимость, 1 = TRUE, 0 = FALSE; [1] — рассчитанная Z. Только
# первый элемент логический. Сам массив нельзя сравнивать с TRUE. Высота 0/отрицательная
# допустима; при [0]=0 высота не доказывает достижимость. Отклонение аргументов возвращает [0,
# CurrZ].
SUB Main()
# x/y/z — исходная позиция, x+1/y — соседняя клетка, шестой параметр z — запасной Z, последний —
# текущая карта. result[0] проверяется до использования result[1].
VAR x = UO.GetX()
VAR y = UO.GetY()
VAR z = UO.GetZ()
VAR result = UO.IsWorldCellPassable(x,y,z,x+1,y,z,UO.WorldNum())
IF result[0] = TRUE THEN
UO.Print('Passable, Z=' + CStr(result[1]))
ELSE
UO.Print('Blocked')
END IF
END SUBРазбор параметров и выполнения:
- x/y/z — исходная позиция, x+1/y — соседняя клетка, шестой параметр z — запасной Z, последний — текущая карта. result[0] проверяется до использования result[1].
# Прочитать Z без изменения входного аргумента
#
# Проверяет один переход в соседнюю мировую клетку и возвращает флаг проходимости вместе с
# высотой.
#
# Array из двух Integer: [0] — проходимость, 1 = TRUE, 0 = FALSE; [1] — рассчитанная Z. Только
# первый элемент логический. Сам массив нельзя сравнивать с TRUE. Высота 0/отрицательная
# допустима; при [0]=0 высота не доказывает достижимость. Отклонение аргументов возвращает [0,
# CurrZ].
SUB Main()
# proposedZ остаётся 0 после вызова. targetZ берётся из result[1], а не из аргумента. При отказе
# пример не делает выводов о высоте.
VAR x = UO.GetX()
VAR y = UO.GetY()
VAR z = UO.GetZ()
VAR proposedZ = 0
VAR result = UO.IsWorldCellPassable(x,y,z,x,y+1,proposedZ,UO.WorldNum())
IF result[0] = 1 THEN
VAR targetZ = result[1]
UO.Print('Input=' + CStr(proposedZ) + '; result=' + CStr(targetZ))
END IF
END SUBРазбор параметров и выполнения:
- proposedZ остаётся 0 после вызова. targetZ берётся из result[1], а не из аргумента. При отказе пример не делает выводов о высоте.
# Полная функция IsCellOpen
#
# Проверяет один переход в соседнюю мировую клетку и возвращает флаг проходимости вместе с
# высотой.
#
# Array из двух Integer: [0] — проходимость, 1 = TRUE, 0 = FALSE; [1] — рассчитанная Z. Только
# первый элемент логический. Сам массив нельзя сравнивать с TRUE. Высота 0/отрицательная
# допустима; при [0]=0 высота не доказывает достижимость. Отклонение аргументов возвращает [0,
# CurrZ].
SUB Main()
# Полный помощник ниже Main принимает исходные X/Y/Z, целевые X/Y и карту. Он добавляет
# обязательный шестой аргумент и возвращает только Integer 1/0, а не массив. Поэтому результат
# IsCellOpen можно сравнивать с TRUE. Код не двигает персонажа.
VAR x = UO.GetX()
VAR y = UO.GetY()
VAR openCell = IsCellOpen(x,y,UO.GetZ(),x+1,y+1,UO.WorldNum())
IF openCell = TRUE THEN
UO.Print('Diagonal cell is locally passable')
END IF
END SUB
SUB IsCellOpen(x,y,z,toX,toY,map)
VAR cellResult = UO.IsWorldCellPassable(x,y,z,toX,toY,z,map)
IF GetArrayLength(cellResult) <> 2 THEN
RETURN 0
END IF
RETURN cellResult[0]
END SUBРазбор параметров и выполнения:
- Полный помощник ниже Main принимает исходные X/Y/Z, целевые X/Y и карту. Он добавляет обязательный шестой аргумент и возвращает только Integer 1/0, а не массив. Поэтому результат IsCellOpen можно сравнивать с TRUE. Код не двигает персонажа.
ClassicUO
Bad Newbie & Basic IDE
Найти в справочнике
Клиент и скрипты
Каталоги значений
Разработка и помощь