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. Координаты должны оставаться в границах карты.