-
Notifications
You must be signed in to change notification settings - Fork 0
API 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 и проверка его результата; стены могут сделать реальный путь длиннее.
# Проверить дальность до цели
#
# Измеряет расстояние в клетках по максимуму разностей 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. Видимость и проходимость проверяются отдельно.
# Расстояние между двумя точками
#
# Измеряет расстояние в клетках по максимуму разностей 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.
# Начало из объекта и из своего персонажа
#
# Измеряет расстояние в клетках по максимуму разностей 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. Координаты должны оставаться в границах карты.
ClassicUO - Bad Newbie & Basic IDE Edition