API UO Dist zh tw - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki

UO.Dist

ClassicUO • Runtime API

以 X、Y 絕對差值中的較大者,計算兩點相隔的格數。

完整語法

UO.Dist(Xfrom:Any, Yfrom:Any, Xto:Any, Yto:Any) -> Integer

參數

  • Xfrom — 起點 X。
  • Yfrom — 起點 Y。
  • Xto — 終點 X。
  • Yto — 終點 Y。

傳回值

有效座標傳回非負 Integer 格數。0 表示 XY 相同,1 表示一格,不是成功旗標。另行比較 distance<=2 才會得到 1/True 或 0/False。

行為

  • 純計算,不傳封包、不等待、不載入地圖,也不檢查障礙、Z 或世界。不是尋找可行路徑,也不保證抵達。兩點需在同一座標系;繞路可能更長。
  • 四個參數都必填,請用文件範圍 0..65535 的 Integer 世界座標。Any 表示通用轉接器,並非物件 ID。沒有預設值、容器內座標、第五個 Z 或單一物件多載。
  • Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom))。交換兩點不改變結果。不是歐氏距離、兩差值相加或避障步數。

內部函式:從呼叫到結果

第三個範例用一般指令碼函式重建演算法;不表示引擎內部呼叫此範例函式。

1. ExecuteStealthCompatibility

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

有效座標傳回非負 Integer 格數。0 表示 XY 相同,1 表示一格,不是成功旗標。另行比較 distance<=2 才會得到 1/True 或 0/False。

專案原始碼: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; 函式 ExecuteStealthCompatibility.

2. GetDistance

GetDistance(int,int,int,int): dx=Math.Abs(x1-x2); dy=Math.Abs(y1-y2); return Math.Max(dx,dy).

Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom))。交換兩點不改變結果。不是歐氏距離、兩差值相加或避障步數。

專案原始碼: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; 函式 GetDistance.

純計算,不傳封包、不等待、不載入地圖,也不檢查障礙、Z 或世界。不是尋找可行路徑,也不保證抵達。兩點需在同一座標系;繞路可能更長。

範例

直接計算

# 直接計算
#
# 以 X、Y 絕對差值中的較大者,計算兩點相隔的格數。
#
# 有效座標傳回非負 Integer 格數。0 表示 XY 相同,1 表示一格,不是成功旗標。另行比較 distance<=2 才會得到 1/True 或 0/False。

SUB Main()
    # (100,100) 到 (103,104) 的絕對差值為 3、4。Main 傳回較大的 Integer 4。
    # 有效座標傳回非負 Integer 格數。0 表示 XY 相同,1 表示一格,不是成功旗標。另行比較 distance<=2 才會得到 1/True 或 0/False。
    # Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom))。交換兩點不改變結果。不是歐氏距離、兩差值相加或避障步數。

    Return UO.Dist(100,100,103,104)
END SUB

參數與執行說明:

  • (100,100) 到 (103,104) 的絕對差值為 3、4。Main 傳回較大的 Integer 4。
  • 有效座標傳回非負 Integer 格數。0 表示 XY 相同,1 表示一格,不是成功旗標。另行比較 distance<=2 才會得到 1/True 或 0/False。
  • Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom))。交換兩點不改變結果。不是歐氏距離、兩差值相加或避障步數。

正確解讀結果

# 正確解讀結果
#
# 以 X、Y 絕對差值中的較大者,計算兩點相隔的格數。
#
# 有效座標傳回非負 Integer 格數。0 表示 XY 相同,1 表示一格,不是成功旗標。另行比較 distance<=2 才會得到 1/True 或 0/False。

SUB Main()
    # (100,100) 到 (101,99) 的距離為 1;另行比較 distance<=2 得到 True=1。"1:1" 第一個 1 是距離,第二個才是邏輯結果。
    # 有效座標傳回非負 Integer 格數。0 表示 XY 相同,1 表示一格,不是成功旗標。另行比較 distance<=2 才會得到 1/True 或 0/False。
    # Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom))。交換兩點不改變結果。不是歐氏距離、兩差值相加或避障步數。

    Dim distance=UO.Dist(100,100,101,99)
    Dim close=distance<=2
    Return CStr(distance) & ":" & CStr(close)
END SUB

參數與執行說明:

  • (100,100) 到 (101,99) 的距離為 1;另行比較 distance<=2 得到 True=1。"1:1" 第一個 1 是距離,第二個才是邏輯結果。
  • 有效座標傳回非負 Integer 格數。0 表示 XY 相同,1 表示一格,不是成功旗標。另行比較 distance<=2 才會得到 1/True 或 0/False。
  • Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom))。交換兩點不改變結果。不是歐氏距離、兩差值相加或避障步數。

完整指令碼演算法

# 完整指令碼演算法
#
# 以 X、Y 絕對差值中的較大者,計算兩點相隔的格數。
#
# 有效座標傳回非負 Integer 格數。0 表示 XY 相同,1 表示一格,不是成功旗標。另行比較 distance<=2 才會得到 1/True 或 0/False。

SUB Main()
    # UO.Dist 與 RebuildTileDistance 都得到 4,Main 傳回 "4:4"。完整輔助函式計算 Abs 差值並傳回較大者;它是範例程式,不是新增 API 指令。
    # 有效座標傳回非負 Integer 格數。0 表示 XY 相同,1 表示一格,不是成功旗標。另行比較 distance<=2 才會得到 1/True 或 0/False。
    # Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom))。交換兩點不改變結果。不是歐氏距離、兩差值相加或避障步數。

    Dim actual=UO.Dist(100,100,103,104)
    Dim rebuilt=RebuildTileDistance(100,100,103,104)
    Return CStr(actual) & ":" & CStr(rebuilt)
END SUB

Function RebuildTileDistance(Xfrom, Yfrom, Xto, Yto) As Integer
    Dim dx = Abs(Xto-Xfrom)
    Dim dy = Abs(Yto-Yfrom)
    If dx>dy Then
        Return dx
    End If
    Return dy
End Function

參數與執行說明:

  • UO.Dist 與 RebuildTileDistance 都得到 4,Main 傳回 "4:4"。完整輔助函式計算 Abs 差值並傳回較大者;它是範例程式,不是新增 API 指令。
  • 有效座標傳回非負 Integer 格數。0 表示 XY 相同,1 表示一格,不是成功旗標。另行比較 distance<=2 才會得到 1/True 或 0/False。
  • Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom))。交換兩點不改變結果。不是歐氏距離、兩差值相加或避障步數。

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

Basic