API UO CalcDir zh tw - 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

轉接器按 Xfrom,Yfrom,Xto,Yto 順序將位置 0..3 讀為整數,再呼叫純計算函式。

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"。不同點走另一分支;請比較 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 傳回 "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 與完整 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