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.

en · ru · uk · fr · de · it · es · zh-tw · ja · ko

Basic