API UO CalcDir ja - 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、ワールドの検査を行わない純粋な計算です。通行可能な経路の探索や到着保証ではありません。同じ座標系の点を使ってください。迂回路は長くなり得ます。
  • 四つとも必須です。仕様範囲 0..65535 の Integer ワールド座標を渡してください。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 だけ増えます。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 だけ増えます。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 は "already there" を返します。異なる点では別の分岐です。True ではなく 100
    # と比較します。
    # 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 は "already there" を返します。異なる点では別の分岐です。True ではなく 100 と比較します。
  • 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 と完全な 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 と完全な 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