API UO Dist - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
UO.Dist
ClassicUO • Runtime API
Вычисляет расстояние в клетках между двумя мировыми точками: наибольшую из абсолютных разностей X и Y.
Точный синтаксис
UO.Dist(Xfrom:Any, Yfrom:Any, Xto:Any, Yto:Any) -> Integer
Параметры
Xfrom— Координата X исходной точки.Yfrom— Координата Y исходной точки.Xto— Координата X назначения.Yto— Координата Y назначения.
Возвращает
Integer — расстояние в клетках, неотрицательное для допустимых координат. 0 означает одинаковые XY, 1 — одну клетку. Это количество, а не признак успеха. Отдельное сравнение distance<=2 даёт 1/True либо 0/False.
Поведение
- Только вычисление координат: без пакетов, ожиданий, загрузки карты, проверки препятствий, Z и карты мира. Команда не ищет проходимый маршрут и не гарантирует достижение цели. Точки должны относиться к одной системе координат; обход препятствий может увеличить путь.
- Нужны все четыре параметра. Передавайте мировые координаты Integer в документированном диапазоне 0..65535. Any в сигнатуре обозначает универсальный адаптер, а не ID предмета. Значений по умолчанию, координат внутри сундука, пятого Z и перегрузки с одним объектом у этих команд нет.
- Формула: Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). При перестановке точек результат тот же. Это не евклидово расстояние, не сумма разностей и не число шагов при обходе препятствия.
Внутренние функции: от вызова до результата
Третий пример воспроизводит алгоритм обычной скриптовой функцией. Это учебный код, а не утверждение, что движок вызывает именно её.
1. ExecuteStealthCompatibility
Адаптер читает позиции 0..3 как целые в порядке Xfrom,Yfrom,Xto,Yto, затем вызывает вычислительный помощник.
Integer — расстояние в клетках, неотрицательное для допустимых координат. 0 означает одинаковые XY, 1 — одну клетку. Это количество, а не признак успеха. Отдельное сравнение distance<=2 даёт 1/True либо 0/False.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция ExecuteStealthCompatibility.
2. GetDistance
GetDistance(int,int,int,int): dx=Math.Abs(x1-x2); dy=Math.Abs(y1-y2); return Math.Max(dx,dy).
Формула: Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). При перестановке точек результат тот же. Это не евклидово расстояние, не сумма разностей и не число шагов при обходе препятствия.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция GetDistance.
Только вычисление координат: без пакетов, ожиданий, загрузки карты, проверки препятствий, Z и карты мира. Команда не ищет проходимый маршрут и не гарантирует достижение цели. Точки должны относиться к одной системе координат; обход препятствий может увеличить путь.
Примеры
Прямое вычисление
# Прямое вычисление
#
# Вычисляет расстояние в клетках между двумя мировыми точками: наибольшую из абсолютных
# разностей X и Y.
#
# Integer — расстояние в клетках, неотрицательное для допустимых координат. 0 означает
# одинаковые XY, 1 — одну клетку. Это количество, а не признак успеха. Отдельное сравнение
# distance<=2 даёт 1/True либо 0/False.
SUB Main()
# От (100,100) до (103,104): абсолютные разности равны 3 и 4, максимум — 4. Main возвращает
# Integer 4.
# Integer — расстояние в клетках, неотрицательное для допустимых координат. 0 означает
# одинаковые XY, 1 — одну клетку. Это количество, а не признак успеха. Отдельное сравнение
# distance<=2 даёт 1/True либо 0/False.
# Формула: Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). При перестановке точек результат тот же. Это не
# евклидово расстояние, не сумма разностей и не число шагов при обходе препятствия.
Return UO.Dist(100,100,103,104)
END SUB
Разбор параметров и выполнения:
- От (100,100) до (103,104): абсолютные разности равны 3 и 4, максимум — 4. Main возвращает Integer 4.
- Integer — расстояние в клетках, неотрицательное для допустимых координат. 0 означает одинаковые XY, 1 — одну клетку. Это количество, а не признак успеха. Отдельное сравнение distance<=2 даёт 1/True либо 0/False.
- Формула: Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). При перестановке точек результат тот же. Это не евклидово расстояние, не сумма разностей и не число шагов при обходе препятствия.
Правильная проверка результата
# Правильная проверка результата
#
# Вычисляет расстояние в клетках между двумя мировыми точками: наибольшую из абсолютных
# разностей X и Y.
#
# Integer — расстояние в клетках, неотрицательное для допустимых координат. 0 означает
# одинаковые XY, 1 — одну клетку. Это количество, а не признак успеха. Отдельное сравнение
# distance<=2 даёт 1/True либо 0/False.
SUB Main()
# От (100,100) до (101,99) расстояние равно 1. Отдельное сравнение distance<=2 даёт True=1. Main
# возвращает "1:1": первая единица — расстояние, вторая — логический результат сравнения.
# Integer — расстояние в клетках, неотрицательное для допустимых координат. 0 означает
# одинаковые XY, 1 — одну клетку. Это количество, а не признак успеха. Отдельное сравнение
# distance<=2 даёт 1/True либо 0/False.
# Формула: Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). При перестановке точек результат тот же. Это не
# евклидово расстояние, не сумма разностей и не число шагов при обходе препятствия.
Dim distance=UO.Dist(100,100,101,99)
Dim close=distance<=2
Return CStr(distance) & ":" & CStr(close)
END SUB
Разбор параметров и выполнения:
- От (100,100) до (101,99) расстояние равно 1. Отдельное сравнение distance<=2 даёт True=1. Main возвращает "1:1": первая единица — расстояние, вторая — логический результат сравнения.
- Integer — расстояние в клетках, неотрицательное для допустимых координат. 0 означает одинаковые XY, 1 — одну клетку. Это количество, а не признак успеха. Отдельное сравнение distance<=2 даёт 1/True либо 0/False.
- Формула: Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). При перестановке точек результат тот же. Это не евклидово расстояние, не сумма разностей и не число шагов при обходе препятствия.
Полный скриптовый разбор
# Полный скриптовый разбор
#
# Вычисляет расстояние в клетках между двумя мировыми точками: наибольшую из абсолютных
# разностей X и Y.
#
# Integer — расстояние в клетках, неотрицательное для допустимых координат. 0 означает
# одинаковые XY, 1 — одну клетку. Это количество, а не признак успеха. Отдельное сравнение
# distance<=2 даёт 1/True либо 0/False.
SUB Main()
# UO.Dist возвращает 4. RebuildTileDistance вычисляет разности через Abs, сравнивает их и
# возвращает большую, также 4. Main возвращает "4:4". Помощник полностью приведён в примере и не
# является ещё одной командой движка.
# Integer — расстояние в клетках, неотрицательное для допустимых координат. 0 означает
# одинаковые XY, 1 — одну клетку. Это количество, а не признак успеха. Отдельное сравнение
# distance<=2 даёт 1/True либо 0/False.
# Формула: Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). При перестановке точек результат тот же. Это не
# евклидово расстояние, не сумма разностей и не число шагов при обходе препятствия.
Dim actual=UO.Dist(100,100,103,104)
Dim rebuilt=RebuildTileDistance(100,100,103,104)
Return CStr(actual) & ":" & CStr(rebuilt)
END SUB
Function RebuildTileDistance(Xfrom, Yfrom, Xto, Yto) As Integer
Dim dx = Abs(Xto-Xfrom)
Dim dy = Abs(Yto-Yfrom)
If dx>dy Then
Return dx
End If
Return dy
End Function
Разбор параметров и выполнения:
- UO.Dist возвращает 4. RebuildTileDistance вычисляет разности через Abs, сравнивает их и возвращает большую, также 4. Main возвращает "4:4". Помощник полностью приведён в примере и не является ещё одной командой движка.
- Integer — расстояние в клетках, неотрицательное для допустимых координат. 0 означает одинаковые XY, 1 — одну клетку. Это количество, а не признак успеха. Отдельное сравнение distance<=2 даёт 1/True либо 0/False.
- Формула: Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). При перестановке точек результат тот же. Это не евклидово расстояние, не сумма разностей и не число шагов при обходе препятствия.