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

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 — полностью определённая вспомогательная функция примера, а не скрытая встроенная команда.

1. ExecuteStealthCompatibility

Выбирает ветку совместимости, читает семь аргументов как 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; функция ExecuteStealthCompatibility.

2. CheckWorldStep

Через 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.

3. CanWalkForQuery

Временно убирает чужой предикат запрещённых клеток активного маршрута и восстанавливает его в finally. Вызывает CanWalk; сам запрос не начинает маршрут.

Нет движения, открытия дверей, прицела или сетевых пакетов. Читается имеющаяся локальная геометрия; сервер может позднее отклонить шаг. Два запроса могут увидеть разное состояние.

Исходник проекта: src/ClassicUO.Client/Game/Pathfinder.cs; функция CanWalkForQuery.

4. CanWalk

Проверяет основной шаг и боковые клетки диагонали. Возвращает bool и изменяет координаты ref только для принятого шага; обход на боковую клетку ещё не является достижением запрошенной цели.

CanWalk проверяет основной шаг и, при диагонали, боковые клетки. CalculateNewZ подбирает поверхность и свободное место с учётом состояния персонажа. CalculateMinMaxZ получает диапазон высоты исходной клетки через CreateItemList; последний собирает уже загруженные Land/Static/Multi/Item/Mobile и правила столкновений. Диагональная запасная сторона не считается достижением требуемой клетки.

Исходник проекта: src/ClassicUO.Client/Game/Pathfinder.cs; функция CanWalk.

5. CalculateNewZ

Получает целевые X/Y, исходную Z по ref и направление. Выбирает поверхность с достаточным свободным пространством и учётом состояния персонажа. bool означает локальную проходимость; z хранит выбранную высоту.

CanWalk проверяет основной шаг и, при диагонали, боковые клетки. CalculateNewZ подбирает поверхность и свободное место с учётом состояния персонажа. CalculateMinMaxZ получает диапазон высоты исходной клетки через CreateItemList; последний собирает уже загруженные Land/Static/Multi/Item/Mobile и правила столкновений. Диагональная запасная сторона не считается достижением требуемой клетки.

Исходник проекта: src/ClassicUO.Client/Game/Pathfinder.cs; функция CalculateNewZ.

6. CalculateMinMaxZ

Получает новую клетку, текущую Z, направление и режим персонажа. Через CreateItemList получает исходную геометрию и вычисляет minZ/maxZ по ref для проверки подъёма и свободного пространства.

CanWalk проверяет основной шаг и, при диагонали, боковые клетки. CalculateNewZ подбирает поверхность и свободное место с учётом состояния персонажа. CalculateMinMaxZ получает диапазон высоты исходной клетки через CreateItemList; последний собирает уже загруженные Land/Static/Multi/Item/Mobile и правила столкновений. Диагональная запасная сторона не считается достижением требуемой клетки.

Исходник проекта: src/ClassicUO.Client/Game/Pathfinder.cs; функция CalculateMinMaxZ.

7. CreateItemList

Получает список, X/Y и режим персонажа. Собирает загруженные объекты клетки и правила столкновений; bool сообщает, доступна ли геометрия. Map.GetTile вызывается с load=false, новые блоки не читаются.

CanWalk проверяет основной шаг и, при диагонали, боковые клетки. CalculateNewZ подбирает поверхность и свободное место с учётом состояния персонажа. CalculateMinMaxZ получает диапазон высоты исходной клетки через CreateItemList; последний собирает уже загруженные Land/Static/Multi/Item/Mobile и правила столкновений. Диагональная запасная сторона не считается достижением требуемой клетки.

Исходник проекта: src/ClassicUO.Client/Game/Pathfinder.cs; функция CreateItemList.

Нет движения, открытия дверей, прицела или сетевых пакетов. Читается имеющаяся локальная геометрия; сервер может позднее отклонить шаг. Два запроса могут увидеть разное состояние.

Примеры

Пример 1. Проверить клетку к востоку

# Проверить клетку к востоку
#
# Проверяет один переход в соседнюю мировую клетку и возвращает флаг проходимости вместе с
# высотой.
#
# 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].

Пример 2. Прочитать Z без изменения входного аргумента

# Прочитать 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], а не из аргумента. При отказе пример не делает выводов о высоте.

Пример 3. Полная функция IsCellOpen

# Полная функция 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. Код не двигает персонажа.