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 です。