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

UO.GetDistance

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

ClassicUO • Runtime API

Измеряет расстояние в клетках по максимуму разностей X/Y. Это геометрическая оценка без поиска пути.

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

UO.GetDistance(id:String) -> Integer
UO.GetDistance(id:Integer) -> Integer
UO.GetDistance(ObjID:Any) -> Any
UO.GetDistance(x:Integer, y:Integer) -> Integer
UO.GetDistance(id1:Any, x2:Any, y2:Any) -> Integer
UO.GetDistance(x1:Integer, y1:Integer, x2:Integer, y2:Integer) -> Integer

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

Параметры

  • id / ObjID — Один аргумент: serial или алиас загруженного объекта, расстояние до которого нужно получить.
  • x, y — Два аргумента: мировая точка назначения. Началом служат GetX(self), GetY(self).
  • id1 — В форме с тремя аргументами — serial/алиас объекта, координаты которого служат началом.
  • x1, y1 — В форме с четырьмя аргументами — координаты начала. Никакой объект для этой формы не нужен.
  • x2, y2 — В формах с тремя/четырьмя аргументами — координаты конца. Не путайте их с serial второго объекта.

Возвращает

Integer — max(abs(x2-x1), abs(y2-y1)): горизонталь, вертикаль и диагональ на соседнюю клетку имеют расстояние 1. Высота Z и препятствия не учитываются. Для неизвестного serial форма с одним аргументом возвращает 0; для существующего объекта при отсутствии персонажа — 65535. Для неизвестного id1 форма с тремя аргументами использует (0,0), поэтому сначала проверяйте Exists(id1).

Поведение

  • Форма с одним объектом использует текущий центр расчёта дальности World.RangeSize и последнюю позицию из очереди шагов движущегося моба. Во время движения результат может отличаться от расчёта через GetX/GetY.
  • Координатные формы работают с переданными числами. Для игровых координат используйте диапазон 0..65535; экстремальные значения Integer и переполнение разности не являются поддерживаемыми координатами.
  • Команда не обещает достижимость цели. Для движения нужен MoveXY/NewMoveXY и проверка его результата; стены могут сделать реальный путь длиннее.

Примеры

Пример 1. Проверить дальность до цели

# Проверить дальность до цели
#
# Измеряет расстояние в клетках по максимуму разностей X/Y. Это геометрическая оценка без поиска
# пути.
#
# Integer — max(abs(x2-x1), abs(y2-y1)): горизонталь, вертикаль и диагональ на соседнюю клетку
# имеют расстояние 1. Высота Z и препятствия не учитываются. Для неизвестного serial форма с
# одним аргументом возвращает 0; для существующего объекта при отсутствии персонажа — 65535. Для
# неизвестного id1 форма с тремя аргументами использует (0,0), поэтому сначала проверяйте
# Exists(id1).

SUB Main()
    # target — serial, не type. Проверка Exists не позволяет принять ноль неизвестного объекта за
    # близкую цель.
    # distance<=2 проверяет дальность по X/Y. Видимость и проходимость проверяются отдельно.

    VAR target = UO.GetSerial('lasttarget')
    IF UO.Exists(target) THEN
        VAR distance = UO.GetDistance(target)
        IF distance <= 2 THEN
            UO.Print('Target is within two tiles')
        END IF
    END IF
END SUB

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

  • target — serial, не type. Проверка Exists не позволяет принять ноль неизвестного объекта за близкую цель.
  • distance<=2 проверяет дальность по X/Y. Видимость и проходимость проверяются отдельно.

Пример 2. Расстояние между двумя точками

# Расстояние между двумя точками
#
# Измеряет расстояние в клетках по максимуму разностей X/Y. Это геометрическая оценка без поиска
# пути.
#
# Integer — max(abs(x2-x1), abs(y2-y1)): горизонталь, вертикаль и диагональ на соседнюю клетку
# имеют расстояние 1. Высота Z и препятствия не учитываются. Для неизвестного serial форма с
# одним аргументом возвращает 0; для существующего объекта при отсутствии персонажа — 65535. Для
# неизвестного id1 форма с тремя аргументами использует (0,0), поэтому сначала проверяйте
# Exists(id1).

SUB Main()
    # x1=100, y1=200, x2=103, y2=204. Разности равны 3 и 4.
    # Результат равен 4, а не 7 и не евклидовым 5.

    VAR distance = UO.GetDistance(100, 200, 103, 204)
    UO.Print(STR(distance))
END SUB

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

  • x1=100, y1=200, x2=103, y2=204. Разности равны 3 и 4.
  • Результат равен 4, а не 7 и не евклидовым 5.

Пример 3. Начало из объекта и из своего персонажа

# Начало из объекта и из своего персонажа
#
# Измеряет расстояние в клетках по максимуму разностей X/Y. Это геометрическая оценка без поиска
# пути.
#
# Integer — max(abs(x2-x1), abs(y2-y1)): горизонталь, вертикаль и диагональ на соседнюю клетку
# имеют расстояние 1. Высота Z и препятствия не учитываются. Для неизвестного serial форма с
# одним аргументом возвращает 0; для существующего объекта при отсутствии персонажа — 65535. Для
# неизвестного id1 форма с тремя аргументами использует (0,0), поэтому сначала проверяйте
# Exists(id1).

SUB Main()
    # Два аргумента x/y используют текущую позицию self. Три аргумента id1/x2/y2 позволяют явно
    # задать объект начала.
    # При неизменной позиции обе величины равны 3. Координаты должны оставаться в границах карты.

    VAR x = UO.GetX() + 3
    VAR y = UO.GetY() + 1
    VAR fromSelf = UO.GetDistance(x, y)
    VAR fromObject = UO.GetDistance('self', x, y)
    UO.Print(STR(fromSelf) + ' / ' + STR(fromObject))
END SUB

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

  • Два аргумента x/y используют текущую позицию self. Три аргумента id1/x2/y2 позволяют явно задать объект начала.
  • При неизменной позиции обе величины равны 3. Координаты должны оставаться в границах карты.