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

UO.FindTypeEx

ClassicUO • Runtime API

在容器或地面搜尋指定圖形及色調,傳回一個符合條件的 ID。

完整語法

UO.FindTypeEx(ObjType:Any, Color:Any, Container:Any, InSub:Any) -> Integer

參數

  • ObjType — Graphic/body,不是物件 serial。0..65534 指定圖形;-1 或 0xFFFF 表示任何圖形。其他負 Integer 也會取消此篩選。
  • Color — Hue,不是數量。0 表示未染色;-1 或 0xFFFF 接受任何色調。其他負 Integer 也會取消色調篩選。
  • Container — 地面:UO.Ground()、0、-1、0xFFFFFFFF 或字串 ground。背包:字串 backpack 或背包 serial。接受十進位/hex serial 及 AddObject 名稱。my 選擇角色擁有的全部物品,包括裝備和巢狀袋子。未知名稱會產生腳本錯誤。傳入解析出的 serial 前請檢查:明確的 0 會選擇地面。不同 API 的數值慣例不同,建議使用 ground/backpack 名稱。
  • InSub — 必要的 TRUE/FALSE(1/0)。FALSE 只搜尋指定容器的直接內容;TRUE 也搜尋已載入的巢狀袋子。對地面沒有影響。my 原本就包含角色擁有的全部物品。

傳回值

Integer:本機走訪順序中的第一個符合 serial,沒有符合項時為 0。不是圖形、數量、陣列或 Boolean。使用 result <> 0,不要用 result = TRUE 或 result = 1。每疊物品算一個物件;Mobile 算一個物件及一個單位。順序不表示距離最近,也不保證每次固定。

行為

  • 四個位置參數全部必要,不能省略。
  • 地面使用此腳本的 FindDistance/FindVertical,排除 self,包含符合的 Item 和 Mobile。指定容器不套用這些距離/高度限制。兩種範圍都排除 Ignore 清單及已銷毀物件。
  • 走訪前清空 FindItem、FindCount、FindFullQuantity 和 GetFoundItems。搜尋無結果時保留零值及空陣列。FindFullQuantity 對 Item 加總 max(1, Amount),每個 Mobile 加 1。FindQuantity 讀取 FindItem 目前的數量。後續搜尋會取代結果,需要舊清單時先儲存 GetFoundItems。
  • Bridge 走訪已載入的 Item 一次;選擇地面時再走訪 Mobile。類型、色調和至少一個容器都必須符合。每個物件只登記一次,不會為每個組合重新掃描整個世界。
  • 只讀取客戶端已收到的資料,不開啟容器、不載入地圖格、不搬物品。空結果不能證明伺服器上的箱子是空的。需要有效連線時檢查 Connected;搜尋本身讀取本機狀態。
  • Stealth FindTypeEx. 參考文件描述最後一個 ID,以及無效容器時改用背包。本客戶端保留第一個本機結果,未知名稱不改用背包。Ground 也接受 0;本機 FindDistance 預設 18、最大 255。

內部函式:從呼叫到結果

以下為實際實作步驟,不是額外公開指令。FindGoldNearSelf 和 SearchTypesIn 是下方完整定義的腳本函式。

1. ExecuteStealthCompatibility

Runtime 轉換數值篩選並個別解析容器名稱;地面選擇值轉成 bridge 的內部世界範圍。

四個位置參數全部必要,不能省略。

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

2. ConvertStealthSearchContainer

地面:UO.Ground()、0、-1、0xFFFFFFFF 或字串 ground。背包:字串 backpack 或背包 serial。接受十進位/hex serial 及 AddObject 名稱。my 選擇角色擁有的全部物品,包括裝備和巢狀袋子。未知名稱會產生腳本錯誤。傳入解析出的 serial 前請檢查:明確的 0 會選擇地面。不同 API 的數值慣例不同,建議使用 ground/backpack 名稱。

Runtime 轉換數值篩選並個別解析容器名稱;地面選擇值轉成 bridge 的內部世界範圍。

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

3. ResetFindResults

走訪前清空 FindItem、FindCount、FindFullQuantity 和 GetFoundItems。搜尋無結果時保留零值及空陣列。FindFullQuantity 對 Item 加總 max(1, Amount),每個 Mobile 加 1。FindQuantity 讀取 FindItem 目前的數量。後續搜尋會取代結果,需要舊清單時先儲存 GetFoundItems。

Integer:本機走訪順序中的第一個符合 serial,沒有符合項時為 0。不是圖形、數量、陣列或 Boolean。使用 result <> 0,不要用 result = TRUE 或 result = 1。每疊物品算一個物件;Mobile 算一個物件及一個單位。順序不表示距離最近,也不保證每次固定。

專案原始碼: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; 函式 ResetFindResults.

4. FindType

Bridge 走訪已載入的 Item 一次;選擇地面時再走訪 Mobile。類型、色調和至少一個容器都必須符合。每個物件只登記一次,不會為每個組合重新掃描整個世界。

地面使用此腳本的 FindDistance/FindVertical,排除 self,包含符合的 Item 和 Mobile。指定容器不套用這些距離/高度限制。兩種範圍都排除 Ignore 清單及已銷毀物件。

專案原始碼: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; 函式 FindType.

5. MatchesFindIdentity

Graphic/body,不是物件 serial。0..65534 指定圖形;-1 或 0xFFFF 表示任何圖形。其他負 Integer 也會取消此篩選。 Hue,不是數量。0 表示未染色;-1 或 0xFFFF 接受任何色調。其他負 Integer 也會取消色調篩選。

Bridge 走訪已載入的 Item 一次;選擇地面時再走訪 Mobile。類型、色調和至少一個容器都必須符合。每個物件只登記一次,不會為每個組合重新掃描整個世界。

專案原始碼: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; 函式 MatchesFindIdentity.

6. MatchesFindContainer

必要的 TRUE/FALSE(1/0)。FALSE 只搜尋指定容器的直接內容;TRUE 也搜尋已載入的巢狀袋子。對地面沒有影響。my 原本就包含角色擁有的全部物品。

地面使用此腳本的 FindDistance/FindVertical,排除 self,包含符合的 Item 和 Mobile。指定容器不套用這些距離/高度限制。兩種範圍都排除 Ignore 清單及已銷毀物件。

專案原始碼: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; 函式 MatchesFindContainer.

7. RegisterFound

走訪前清空 FindItem、FindCount、FindFullQuantity 和 GetFoundItems。搜尋無結果時保留零值及空陣列。FindFullQuantity 對 Item 加總 max(1, Amount),每個 Mobile 加 1。FindQuantity 讀取 FindItem 目前的數量。後續搜尋會取代結果,需要舊清單時先儲存 GetFoundItems。

Integer:本機走訪順序中的第一個符合 serial,沒有符合項時為 0。不是圖形、數量、陣列或 Boolean。使用 result <> 0,不要用 result = TRUE 或 result = 1。每疊物品算一個物件;Mobile 算一個物件及一個單位。順序不表示距離最近,也不保證每次固定。

專案原始碼: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; 函式 RegisterFound.

只讀取客戶端已收到的資料,不開啟容器、不載入地圖格、不搬物品。空結果不能證明伺服器上的箱子是空的。需要有效連線時檢查 Connected;搜尋本身讀取本機狀態。

範例

背包的直接內容

# 背包的直接內容
#
# 在容器或地面搜尋指定圖形及色調,傳回一個符合條件的 ID。
#
# Integer:本機走訪順序中的第一個符合 serial,沒有符合項時為 0。不是圖形、數量、陣列或 Boolean。使用 result <> 0,不要用 result = TRUE 或
# result = 1。每疊物品算一個物件;Mobile 算一個物件及一個單位。順序不表示距離最近,也不保證每次固定。

SUB Main()
    # 0x0EED 是金幣;-1 接受任何 hue;backpack/FALSE 排除巢狀袋子。輸出第一個 hex ID(不含 0x)、物件數、單位總數。20 和 50 兩疊得到 2 個物件及
    # 70 個單位。

    VAR item = UO.FindTypeEx(0x0EED, -1, 'backpack', FALSE)
    UO.Print(Hex(item))
    UO.Print(STR(UO.FindCount()))
    UO.Print(STR(UO.FindFullQuantity()))
END SUB

參數與執行說明:

  • 0x0EED 是金幣;-1 接受任何 hue;backpack/FALSE 排除巢狀袋子。輸出第一個 hex ID(不含 0x)、物件數、單位總數。20 和 50 兩疊得到 2 個物件及 70 個單位。

完整的暫時地面搜尋函式

# 完整的暫時地面搜尋函式
#
# 在容器或地面搜尋指定圖形及色調,傳回一個符合條件的 ID。
#
# Integer:本機走訪順序中的第一個符合 serial,沒有符合項時為 0。不是圖形、數量、陣列或 Boolean。使用 result <> 0,不要用 result = TRUE 或
# result = 1。每疊物品算一個物件;Mobile 算一個物件及一個單位。順序不表示距離最近,也不保證每次固定。

SUB Main()
    # radius=5、height=10 在 FindGoldNearSelf 內暫時使用。Finally 在 Return 或錯誤時也還原兩個限制。函式傳回金幣 serial 或
    # 0;Main 以 <> 0 檢查後顯示。

    VAR item = FindGoldNearSelf(5, 10)
    IF item <> 0 THEN
        UO.Print(Hex(item))
    ELSE
        UO.Print('Empty')
    END IF
END SUB

FUNCTION FindGoldNearSelf(radius, height)
    VAR oldDistance = UO.FindDistance()
    VAR oldVertical = UO.FindVertical()
    TRY
        UO.FindDistance(radius)
        UO.FindVertical(height)
        RETURN UO.FindTypeEx(0x0EED, -1, UO.Ground(), FALSE)
    FINALLY
        UO.FindDistance(oldDistance)
        UO.FindVertical(oldVertical)
    END TRY
END FUNCTION

參數與執行說明:

  • radius=5、height=10 在 FindGoldNearSelf 內暫時使用。Finally 在 Return 或錯誤時也還原兩個限制。函式傳回金幣 serial 或 0;Main 以 <> 0 檢查後顯示。

命名容器與巢狀袋子

# 命名容器與巢狀袋子
#
# 在容器或地面搜尋指定圖形及色調,傳回一個符合條件的 ID。
#
# Integer:本機走訪順序中的第一個符合 serial,沒有符合項時為 0。不是圖形、數量、陣列或 Boolean。使用 result <> 0,不要用 result = TRUE 或
# result = 1。每疊物品算一個物件;Mobile 算一個物件及一個單位。順序不表示距離最近,也不保證每次固定。

SUB Main()
    # GetSerial 解析 backpack;零值檢查避免誤選地面。AddObject 儲存 search_bag;TRUE 包含巢狀袋子。GetFoundItems
    # 複製清單,IsObjectExists 再次檢查每個 ID。

    VAR bag = UO.GetSerial('backpack')
    IF bag <> 0 THEN
        UO.AddObject('search_bag', bag)
        UO.FindTypeEx(0x0EED, -1, 'search_bag', TRUE)
        VAR items = UO.GetFoundItems()
        FOR EACH item IN items
            IF UO.IsObjectExists(item) THEN
                UO.Print(Hex(item))
            END IF
        NEXT
    END IF
END SUB

參數與執行說明:

  • GetSerial 解析 backpack;零值檢查避免誤選地面。AddObject 儲存 search_bag;TRUE 包含巢狀袋子。GetFoundItems 複製清單,IsObjectExists 再次檢查每個 ID。

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

Basic