API UO CalcDir - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
UO.CalcDir
ClassicUO • Runtime API
Вычисляет направление от одной мировой точки к другой. Персонаж при этом не передвигается.
Точный синтаксис
UO.CalcDir(Xfrom:Any, Yfrom:Any, Xto:Any, Yto:Any) -> Integer
Параметры
Xfrom— Координата X исходной точки.Yfrom— Координата Y исходной точки.Xto— Координата X назначения.Yto— Координата Y назначения.
Возвращает
Integer — код направления: 0=север, 1=северо-восток, 2=восток, 3=юго-восток, 4=юг, 5=юго-запад, 6=запад, 7=северо-запад. Совпавшие точки дают 100. Это не Boolean: 0 означает север, а не неудачу; 1 означает северо-восток, а не успех. Не передавайте 100 команде шага как направление.
Поведение
- Только вычисление координат: без пакетов, ожиданий, загрузки карты, проверки препятствий, Z и карты мира. Команда не ищет проходимый маршрут и не гарантирует достижение цели. Точки должны относиться к одной системе координат; обход препятствий может увеличить путь.
- Нужны все четыре параметра. Передавайте мировые координаты Integer в документированном диапазоне 0..65535. Any в сигнатуре обозначает универсальный адаптер, а не ID предмета. Значений по умолчанию, координат внутри сундука, пятого Z и перегрузки с одним объектом у этих команд нет.
- Из координат назначения вычитаются исходные, затем проверяются знаки разностей. Уменьшение Y — север, увеличение X — восток. Если меняются обе координаты, выбирается диагональ независимо от величины разностей. Если обе разности нулевые — 100.
Внутренние функции: от вызова до результата
Третий пример воспроизводит алгоритм обычной скриптовой функцией. Это учебный код, а не утверждение, что движок вызывает именно её.
1. ExecuteStealthCompatibility
Адаптер читает позиции 0..3 как целые в порядке Xfrom,Yfrom,Xto,Yto, затем вызывает вычислительный помощник.
Integer — код направления: 0=север, 1=северо-восток, 2=восток, 3=юго-восток, 4=юг, 5=юго-запад, 6=запад, 7=северо-запад. Совпавшие точки дают 100. Это не Boolean: 0 означает север, а не неудачу; 1 означает северо-восток, а не успех. Не передавайте 100 команде шага как направление.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция ExecuteStealthCompatibility.
2. CalculateDirection
CalculateDirection: dx=Math.Sign(toX-fromX); dy=Math.Sign(toY-fromY); identical ->100; axis/sign branches ->0..7.
Из координат назначения вычитаются исходные, затем проверяются знаки разностей. Уменьшение Y — север, увеличение X — восток. Если меняются обе координаты, выбирается диагональ независимо от величины разностей. Если обе разности нулевые — 100.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция CalculateDirection.
Только вычисление координат: без пакетов, ожиданий, загрузки карты, проверки препятствий, Z и карты мира. Команда не ищет проходимый маршрут и не гарантирует достижение цели. Точки должны относиться к одной системе координат; обход препятствий может увеличить путь.
Примеры
Прямое вычисление
# Прямое вычисление
#
# Вычисляет направление от одной мировой точки к другой. Персонаж при этом не передвигается.
#
# Integer — код направления: 0=север, 1=северо-восток, 2=восток, 3=юго-восток, 4=юг,
# 5=юго-запад, 6=запад, 7=северо-запад. Совпавшие точки дают 100. Это не Boolean: 0 означает
# север, а не неудачу; 1 означает северо-восток, а не успех. Не передавайте 100 команде шага как
# направление.
SUB Main()
# Исходная точка (100,100), назначение (101,100): X увеличивается, Y не меняется. Main
# возвращает Integer 2 — восток. Команда передвижения не вызывается.
# Integer — код направления: 0=север, 1=северо-восток, 2=восток, 3=юго-восток, 4=юг,
# 5=юго-запад, 6=запад, 7=северо-запад. Совпавшие точки дают 100. Это не Boolean: 0 означает
# север, а не неудачу; 1 означает северо-восток, а не успех. Не передавайте 100 команде шага как
# направление.
# Из координат назначения вычитаются исходные, затем проверяются знаки разностей. Уменьшение Y —
# север, увеличение X — восток. Если меняются обе координаты, выбирается диагональ независимо от
# величины разностей. Если обе разности нулевые — 100.
Return UO.CalcDir(100,100,101,100)
END SUB
Разбор параметров и выполнения:
- Исходная точка (100,100), назначение (101,100): X увеличивается, Y не меняется. Main возвращает Integer 2 — восток. Команда передвижения не вызывается.
- Integer — код направления: 0=север, 1=северо-восток, 2=восток, 3=юго-восток, 4=юг, 5=юго-запад, 6=запад, 7=северо-запад. Совпавшие точки дают 100. Это не Boolean: 0 означает север, а не неудачу; 1 означает северо-восток, а не успех. Не передавайте 100 команде шага как направление.
- Из координат назначения вычитаются исходные, затем проверяются знаки разностей. Уменьшение Y — север, увеличение X — восток. Если меняются обе координаты, выбирается диагональ независимо от величины разностей. Если обе разности нулевые — 100.
Правильная проверка результата
# Правильная проверка результата
#
# Вычисляет направление от одной мировой точки к другой. Персонаж при этом не передвигается.
#
# Integer — код направления: 0=север, 1=северо-восток, 2=восток, 3=юго-восток, 4=юг,
# 5=юго-запад, 6=запад, 7=северо-запад. Совпавшие точки дают 100. Это не Boolean: 0 означает
# север, а не неудачу; 1 означает северо-восток, а не успех. Не передавайте 100 команде шага как
# направление.
SUB Main()
# Обе точки равны (100,100). direction=100 означает совпадение, поэтому Main возвращает String
# "already there". При разных точках сработает другая ветка. Проверяется именно 100, а не True.
# Integer — код направления: 0=север, 1=северо-восток, 2=восток, 3=юго-восток, 4=юг,
# 5=юго-запад, 6=запад, 7=северо-запад. Совпавшие точки дают 100. Это не Boolean: 0 означает
# север, а не неудачу; 1 означает северо-восток, а не успех. Не передавайте 100 команде шага как
# направление.
# Из координат назначения вычитаются исходные, затем проверяются знаки разностей. Уменьшение Y —
# север, увеличение X — восток. Если меняются обе координаты, выбирается диагональ независимо от
# величины разностей. Если обе разности нулевые — 100.
Dim direction=UO.CalcDir(100,100,100,100)
If direction=100 Then
Return "already there"
End If
Return "different point"
END SUB
Разбор параметров и выполнения:
- Обе точки равны (100,100). direction=100 означает совпадение, поэтому Main возвращает String "already there". При разных точках сработает другая ветка. Проверяется именно 100, а не True.
- Integer — код направления: 0=север, 1=северо-восток, 2=восток, 3=юго-восток, 4=юг, 5=юго-запад, 6=запад, 7=северо-запад. Совпавшие точки дают 100. Это не Boolean: 0 означает север, а не неудачу; 1 означает северо-восток, а не успех. Не передавайте 100 команде шага как направление.
- Из координат назначения вычитаются исходные, затем проверяются знаки разностей. Уменьшение Y — север, увеличение X — восток. Если меняются обе координаты, выбирается диагональ независимо от величины разностей. Если обе разности нулевые — 100.
Полный скриптовый разбор
# Полный скриптовый разбор
#
# Вычисляет направление от одной мировой точки к другой. Персонаж при этом не передвигается.
#
# Integer — код направления: 0=север, 1=северо-восток, 2=восток, 3=юго-восток, 4=юг,
# 5=юго-запад, 6=запад, 7=северо-запад. Совпавшие точки дают 100. Это не Boolean: 0 означает
# север, а не неудачу; 1 означает северо-восток, а не успех. Не передавайте 100 команде шага как
# направление.
SUB Main()
# При переходе от (20,20) к (19,21) X уменьшается, Y увеличивается: UO.CalcDir возвращает 5.
# RebuildDirection показывает все ветви этого алгоритма и тоже даёт 5. Main возвращает "5:5".
# Все четыре параметра помощника имеют тот же смысл координат.
# Integer — код направления: 0=север, 1=северо-восток, 2=восток, 3=юго-восток, 4=юг,
# 5=юго-запад, 6=запад, 7=северо-запад. Совпавшие точки дают 100. Это не Boolean: 0 означает
# север, а не неудачу; 1 означает северо-восток, а не успех. Не передавайте 100 команде шага как
# направление.
# Из координат назначения вычитаются исходные, затем проверяются знаки разностей. Уменьшение Y —
# север, увеличение X — восток. Если меняются обе координаты, выбирается диагональ независимо от
# величины разностей. Если обе разности нулевые — 100.
Dim actual=UO.CalcDir(20,20,19,21)
Dim rebuilt=RebuildDirection(20,20,19,21)
Return CStr(actual) & ":" & CStr(rebuilt)
END SUB
Function RebuildDirection(Xfrom, Yfrom, Xto, Yto) As Integer
Dim dx = Xto-Xfrom
Dim dy = Yto-Yfrom
If dx=0 AndAlso dy=0 Then
Return 100
End If
If dx=0 Then
If dy<0 Then
Return 0
End If
Return 4
End If
If dy=0 Then
If dx>0 Then
Return 2
End If
Return 6
End If
If dx>0 Then
If dy<0 Then
Return 1
End If
Return 3
End If
If dy>0 Then
Return 5
End If
Return 7
End Function
Разбор параметров и выполнения:
- При переходе от (20,20) к (19,21) X уменьшается, Y увеличивается: UO.CalcDir возвращает 5. RebuildDirection показывает все ветви этого алгоритма и тоже даёт 5. Main возвращает "5:5". Все четыре параметра помощника имеют тот же смысл координат.
- Integer — код направления: 0=север, 1=северо-восток, 2=восток, 3=юго-восток, 4=юг, 5=юго-запад, 6=запад, 7=северо-запад. Совпавшие точки дают 100. Это не Boolean: 0 означает север, а не неудачу; 1 означает северо-восток, а не успех. Не передавайте 100 команде шага как направление.
- Из координат назначения вычитаются исходные, затем проверяются знаки разностей. Уменьшение Y — север, увеличение X — восток. Если меняются обе координаты, выбирается диагональ независимо от величины разностей. Если обе разности нулевые — 100.