ZH TW UO Topic character Part 5 - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

特點 — 5

家 · C# · IDE · UO API · A–Z · 範例 · Languages

參考章節

1 · 2 · 3 · 4 · 5

完整指令說明


UO.Undress

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C# 簽章

int UO.Undress();

從3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24層移除衣服和盔甲。手、頭髮、鬍鬚、背包、坐騎和銀行不受影響。

參數

沒有參數。

傳回值

數字標誌int:1(滿足條件)- 接受本地操作,0(不滿足條件)- 拒絕。這不是伺服器確認,不是ID,也不是數量。稍後伺服器可能會發生故障;接聽後檢查實際設備。

該命令的結果是一個數字標誌: 1 表示滿足條件, 0 - 未實現。後 var 結果=命令(...)檢查是否(結果!= 0) 或 if (結果 == 0)。儲存一次呼叫的結果:重複呼叫可以再次執行該操作或讀取已經變更的狀態。

行為

  • 需要裝載物品並徒手拖曳。取下后,需要实际背包self:不使用备用背包GrabBag。未知、損壞和不合適的物品將被拒絕。其他人的物品無法透過UnequipItems移除。集合不是原子事務。
  • EquipItems/UnequipItems 在接受操作之後、下一個元素之前應用DressSpeed; Disarm/Undress - 在每個佔用層之後。當提款被接受時,提款仍遵守DropDelay。其他運行時的相同設定不變;加速不會超越伺服器限制。
  • 不正確的呼叫形式、未知的圖層名稱或不可轉換為數字的值可能會導致腳本錯誤,而不是0。設備快照僅包含已經載入的資料。在助手中,ChangeAndConfirm層=1是右手:對於另一件事,通過它的真實層。
  • 對於數組,1表示接受所有列出的操作;如果拒絕,0將被退回。剩餘的元素仍然被處理,沒有回滾。空數組會產生 1 且不執行任何操作。當所需層已為空時,Disarm/Undress也給出1;部分失敗給出0。
  • UO.EquipItems · UO.UnequipItems · UO.DressSpeed · UO.DropDelay · UO.ObjAtLayerEx

獨立的 C# 腳本

每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。

簡單範例

將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。

將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。

var result = UO.Undress();
UO.Print("Undress: " + Convert.ToString(result));

1。 Undress - 一個選定的項目或圖層 - 直接腳本

參數與執行流程:

  • 首先,在遊戲中選擇適當的項目:lasttarget - 它的ID。在Equip/WearItem範例中,1層需要副手武器。 Unequip(1) 移除右手; Disarm/Undress 使用自己的固定圖層。拒绝后不会自动重播。
return UO.Undress();

2。 Undress - 兩個項目並保存ID - 腳本功能

參數與執行流程:

  • 裝備方面,0x0F5E是劍的例子,0x1B76是盾的例子。 FindType在背包裝載的物品中尋找它們,ASC轉換返回的十六進制-ID。為了刪除,讀取自己的目前層。如果所需的項目不可用,則腳本結束。陣列儲存兩個ID;每個項目都被完全轉移。
return  RunScenario();
 object? RunScenario()
{
    var first = UO.ObjAtLayerEx(5, UO.Self());
    var second = UO.ObjAtLayerEx(4, UO.Self());
    if (Truth(first == 0) || Truth(second == 0))
    {
        return 0;
    }

    UO.AddObject("saved_first", first);
    UO.AddObject("saved_second", second);
    return UO.Undress();
    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3。 Undress - 功能齊全,等待有限 - 腳本類

參數與執行流程:

  • ChangeAndConfirm 執行一次指令。然後檢查實際狀態最多20次,暫停100毫秒。 1 - 檢查看到預期狀態,0 - 失敗或過期等待。這是我們的助手的結果,而不是新的內建指令。呼叫操作本身也可能需要時間。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        return ChangeAndConfirm();
        return null;
    }

    dynamic ChangeAndConfirm()
    {
        if (!(Truth(UO.Undress())))
        {
            return 0;
        }

        dynamic[] layers = new dynamic[checked((int)(16) + 1)];
        layers[0] = 3;
        layers[1] = 4;
        layers[2] = 5;
        layers[3] = 6;
        layers[4] = 7;
        layers[5] = 8;
        layers[6] = 10;
        layers[7] = 12;
        layers[8] = 13;
        layers[9] = 14;
        layers[10] = 17;
        layers[11] = 18;
        layers[12] = 19;
        layers[13] = 20;
        layers[14] = 22;
        layers[15] = 23;
        layers[16] = 24;
        for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
        {
            dynamic empty = true;
            for (int i = (int)(0); i <= ArrayLength(layers) - 1; i += (int)(1))
            {
                if (Truth(UO.ObjAtLayerEx(layers[i], UO.Self()) != 0))
                {
                    empty = false;
                }
            }

            if (Truth(empty))
            {
                return 1;
            }

            UO.Wait(100);
        }

        return 0;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

命令實作

C# 區分大小寫。請使用正確的 UO 名稱。數值旗標應與 0 比較;只有回傳型別為 bool 時才使用 bool。

UO.Undress() — UO.Undress()

參數: 沒有參數。

結果: int / Integer.

呼叫時:

內部實作程式碼,不能作為獨立腳本執行。

public int Undress()

            => Unequip(dressLayers, "Clothing removed.");

UO.Unequip

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C# 簽章

int UO.Unequip(object? layer);

將他的物品從指定層移除到他自己的背包中。

參數

  • layer - 層數,例如 1 - 右手,2 - 左手。 Equip和Unequip也接受圖層名稱,例如「Rhand」。 WearItem 使用數字層。該層必須與物品的可穿戴層相符;它不是graphic,也不是ID。

傳回值

數字標誌int:1(滿足條件)- 接受本地操作,0(不滿足條件)- 拒絕。這不是伺服器確認,不是ID,也不是數量。稍後伺服器可能會發生故障;接聽後檢查實際設備。

該命令的結果是一個數字標誌: 1 表示滿足條件, 0 - 未實現。後 var 結果=命令(...)檢查是否(結果!= 0) 或 if (結果 == 0)。儲存一次呼叫的結果:重複呼叫可以再次執行該操作或讀取已經變更的狀態。

行為

  • 需要裝載物品並徒手拖曳。取下后,需要实际背包self:不使用备用背包GrabBag。未知、損壞和不合適的物品將被拒絕。其他人的物品無法透過UnequipItems移除。集合不是原子事務。
  • EquipItems/UnequipItems 在接受操作之後、下一個元素之前應用DressSpeed; Disarm/Undress - 在每個佔用層之後。當提款被接受時,提款仍遵守DropDelay。其他運行時的相同設定不變;加速不會超越伺服器限制。
  • 不正確的呼叫形式、未知的圖層名稱或不可轉換為數字的值可能會導致腳本錯誤,而不是0。設備快照僅包含已經載入的資料。在助手中,ChangeAndConfirm層=1是右手:對於另一件事,通過它的真實層。
  • UO.EquipItems · UO.UnequipItems · UO.DressSpeed · UO.DropDelay · UO.ObjAtLayerEx

獨立的 C# 腳本

每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。

簡單範例

將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。

將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。

var result = UO.Unequip(1);
UO.Print("Unequip: " + Convert.ToString(result));

1。 Unequip - 一個選定的項目或圖層 - 直接腳本

參數與執行流程:

  • 首先,在遊戲中選擇適當的項目:lasttarget - 它的ID。在Equip/WearItem範例中,1層需要副手武器。 Unequip(1) 移除右手; Disarm/Undress 使用自己的固定圖層。拒绝后不会自动重播。
return UO.Unequip(1);

2。 Unequip - 兩個項目並保存ID - 腳本功能

參數與執行流程:

  • 裝備方面,0x0F5E是劍的例子,0x1B76是盾的例子。 FindType在背包裝載的物品中尋找它們,ASC轉換返回的十六進制-ID。為了刪除,讀取自己的目前層。如果所需的項目不可用,則腳本結束。陣列儲存兩個ID;每個項目都被完全轉移。
return  RunScenario();
 object? RunScenario()
{
    var first = UO.ObjAtLayerEx(1, UO.Self());
    var second = UO.ObjAtLayerEx(2, UO.Self());
    if (Truth(first == 0) || Truth(second == 0))
    {
        return 0;
    }

    UO.AddObject("saved_first", first);
    UO.AddObject("saved_second", second);
    var firstOk = UO.Unequip(1);
    var secondOk = UO.Unequip(2);
    return firstOk != 0 && secondOk != 0;
    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3。 Unequip - 功能齊全,等待有限 - 腳本類

參數與執行流程:

  • ChangeAndConfirm 執行一次指令。然後檢查實際狀態最多20次,暫停100毫秒。 1 - 檢查看到預期狀態,0 - 失敗或過期等待。這是我們的助手的結果,而不是新的內建指令。呼叫操作本身也可能需要時間。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var item = UO.ObjAtLayerEx(1, UO.Self());
        return ChangeAndConfirm(1, item);
        return null;
    }

    dynamic ChangeAndConfirm(dynamic layer, dynamic item)
    {
        if (Truth(item == 0))
        {
            return 0;
        }

        if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) != item))
        {
            return 0;
        }

        if (!(Truth(UO.Unequip(layer))))
        {
            return 0;
        }

        for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
        {
            if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == 0))
            {
                return 1;
            }

            UO.Wait(100);
        }

        return 0;
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

命令實作

C# 區分大小寫。請使用正確的 UO 名稱。數值旗標應與 0 比較;只有回傳型別為 bool 時才使用 bool。

UO.Unequip(layer) — UO.Unequip(Any)

參數: layer (Any/String)

結果: int / Any.

呼叫時:

內部實作程式碼,不能作為獨立腳本執行。

case "unequip":

                    return new InjectionValue(arguments[0].Kind == InjectionValueKind.String ? Unequip(Text(0)) : bridge.Unequip(Arg(0)));

UO.Unequip(layer) — UO.Unequip(String)

參數: layer (Any/String)

結果: int / Integer.

呼叫時:

內部實作程式碼,不能作為獨立腳本執行。

public int Unequip(string layer) => bridge.Unequip(ConvertLayer(layer));

UO.UnequipItems

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C# 簽章

dynamic UO.UnequipItems(object? items);

將列出的個人物品放入背包中。別人的物品的ID不會從同一層中刪除你的物品。

參數

  • items - 必需的ID 或項目陣列ID。數組元素是數字或數字十六進位字串。單一參數也接受“lasttarget”/名稱AddObject。對於數組,對索引 0 和 1 處的兩個元素使用變數宣告 items[1]。事物被傳輸,不是層數,也不是type。

傳回值

數字標誌int:1(滿足條件)- 接受本地操作,0(不滿足條件)- 拒絕。這不是伺服器確認,不是ID,也不是數量。稍後伺服器可能會發生故障;接聽後檢查實際設備。

該命令的結果是一個數字標誌: 1 表示滿足條件, 0 - 未實現。後 var 結果=命令(...)檢查是否(結果!= 0) 或 if (結果 == 0)。儲存一次呼叫的結果:重複呼叫可以再次執行該操作或讀取已經變更的狀態。

行為

  • 需要裝載物品並徒手拖曳。取下后,需要实际背包self:不使用备用背包GrabBag。未知、損壞和不合適的物品將被拒絕。其他人的物品無法透過UnequipItems移除。集合不是原子事務。
  • EquipItems/UnequipItems 在接受操作之後、下一個元素之前應用DressSpeed; Disarm/Undress - 在每個佔用層之後。當提款被接受時,提款仍遵守DropDelay。其他運行時的相同設定不變;加速不會超越伺服器限制。
  • 不正確的呼叫形式、未知的圖層名稱或不可轉換為數字的值可能會導致腳本錯誤,而不是0。設備快照僅包含已經載入的資料。在助手中,ChangeAndConfirm層=1是右手:對於另一件事,通過它的真實層。
  • 對於數組,1表示接受所有列出的操作;如果拒絕,0將被退回。剩餘的元素仍然被處理,沒有回滾。空數組會產生 1 且不執行任何操作。當所需層已為空時,Disarm/Undress也給出1;部分失敗給出0。
  • UO.EquipItems · UO.UnequipItems · UO.DressSpeed · UO.DropDelay · UO.ObjAtLayerEx

獨立的 C# 腳本

每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。

簡單範例

將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。

將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。

object? result = UO.UnequipItems(UO.ObjAtLayerEx(1, "self"));
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1。 UnequipItems - 一個選定的項目或圖層 - 直接腳本

參數與執行流程:

  • 首先,在遊戲中選擇適當的項目:lasttarget - 它的ID。在Equip/WearItem範例中,1層需要副手武器。 Unequip(1) 移除右手; Disarm/Undress 使用自己的固定圖層。拒绝后不会自动重播。
var item = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(item == 0))
{
    return 0;
}
return UO.UnequipItems(item);

int Asc(object? value, int fallback = 0) { string text = Convert.ToString(value) ?? ""; if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback; return int.TryParse(text, out int number) ? number : fallback; }
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2。 UnequipItems - 兩個項目並儲存 ID - 腳本函數

參數與執行流程:

  • 裝備方面,0x0F5E是劍的例子,0x1B76是盾的例子。 FindType在背包裝載的物品中尋找它們,ASC轉換返回的十六進制-ID。為了刪除,讀取自己的目前層。如果所需的項目不可用,則腳本結束。陣列儲存兩個ID;每個項目都被完全轉移。
return  RunScenario();
 object? RunScenario()
{
    var first = UO.ObjAtLayerEx(1, UO.Self());
    var second = UO.ObjAtLayerEx(2, UO.Self());
    if (Truth(first == 0) || Truth(second == 0))
    {
        return 0;
    }

    UO.AddObject("saved_first", first);
    UO.AddObject("saved_second", second);
    dynamic[] items = new dynamic[checked((int)(1) + 1)];
    items[0] = first;
    items[1] = second;
    return UO.UnequipItems(items);
    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3。 UnequipItems - 功能齊全,等待有限 - 腳本類

參數與執行流程:

  • ChangeAndConfirm 執行一次指令。然後檢查實際狀態最多20次,暫停100毫秒。 1 - 檢查看到預期狀態,0 - 失敗或過期等待。這是我們的助手的結果,而不是新的內建指令。呼叫操作本身也可能需要時間。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var item = Asc(UO.GetSerial("lasttarget"), 0);
        if (Truth(item == 0))
        {
            return 0;
        }

        return ChangeAndConfirm(1, item);
        return null;
    }

    dynamic ChangeAndConfirm(dynamic layer, dynamic item)
    {
        if (Truth(item == 0))
        {
            return 0;
        }

        if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) != item))
        {
            return 0;
        }

        if (!(Truth(UO.UnequipItems(item))))
        {
            return 0;
        }

        for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
        {
            if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == 0))
            {
                return 1;
            }

            UO.Wait(100);
        }

        return 0;
    }

    int Asc(object? value, int fallback = 0)
    {
        string text = Convert.ToString(value) ?? "";
        if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
            return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
        return int.TryParse(text, out int number) ? number : fallback;
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

命令實作

C# 區分大小寫。請使用正確的 UO 名稱。數值旗標應與 0 比較;只有回傳型別為 bool 時才使用 bool。

UO.UnequipItems(items) — UO.UnequipItems(Any)

參數: items (Any)

結果: dynamic / Any.

呼叫時:

內部實作程式碼,不能作為獨立腳本執行。

case "unequipitems":

                    return new InjectionValue(ChangeEquipmentItems(ArrayArg(0), false));

UO.UnsetArm

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C# 簽章

void UO.UnsetArm(object? name);

刪除指定武器組的條目而不解除角色的武裝。

參數

  • name — 集合的字串名稱,例如「旅行」或「戰鬥」。名稱不區分大小寫。服裝和武器套裝分開存放:兩者允許使用相同的名稱。這不是 ID 的東西或檔名。只有SetDress允許沒有名稱:然後為DressSavedSet/EquipDressSet記錄一個單獨的集合。

傳回值

void - 无值。使用單獨的線路撥打電話;不要分配結果或將其與true進行比較。儲存和刪除會更改條目,而不是設備。

行為

  • 服裝:層數3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24。武器:僅限1和2。頭髮、鬍鬚、背包、動物和銀行不包含在這些套裝中。
  • 具體的serial已經加載的東西都記錄在自己的層中。再次儲存相同的名稱會取代該條目。空層也有意義:當恢復時,相應的佔用層將被釋放到自己的背包中。因此,已儲存的完全空集會從其圖層中刪除內容。
  • 此集合儲存在運行時狀態中。呼叫本身不會建立文件,也不保證該集將被傳輸到另一個設定檔或新的運行時。首先,將所需的集合儲存為其使用狀態。載入/保存客戶端的一般狀態是一個單獨的機制。
  • 刪除僅影響所選名稱的條目。物品保留在角色上,其他名稱和其他類型的套裝不受影響。重新刪除遺失的條目是可以接受的。 UnsetDress 和 UnsetArm 需要一個名稱。
  • UO.SetDress · UO.Dress · UO.DressSavedSet · UO.SetArm · UO.Arm · UO.DressSpeed
  • 在常規用戶端主機中,此狀態資料取自GetPersistentState管理器,並且對於同一世界/設定檔的腳本/聊天/巨集是通用的,且不屬於一個腳本。另一個進程或明顯獨立的InjectionRuntimeState具有不同的狀態。載入/清除設定檔可以取代它;已儲存的serial仍然會根據載入的世界進行檢查。

獨立的 C# 腳本

每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。

簡單範例

將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。

指令是獨立的陳述式。前面的訊息表示呼叫開始,並非伺服器已完成動作的確認。

UO.Print("Calling UO.UnsetArm");
UO.UnsetArm("battle");

1。直接使用-直接腳本

參數與執行流程:

  • 僅刪除指定的條目。衣服/武器無法脫下。
UO.UnsetArm("battle");

2。名稱和查詢模式 - 腳本功能

參數與執行流程:

  • 旅行和戰鬥這兩個名字分別刪除了。不同類型的集合的相同名稱將被保留。
return  RunScenario();
 object? RunScenario()
{
    UO.UnsetArm("travel");
    UO.UnsetArm("battle");
    return null;
}

3。完整的幫助程序腳本 - 腳本類

參數與執行流程:

  • CleanupSets 是一個完全聲明的過程,用於清理兩個專有名稱。 prefix 產生條目名稱,而不是檔案路徑。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        CleanupSets("mine_");
        return null;
    }

    void CleanupSets(dynamic prefix)
    {
        UO.UnsetArm(prefix + "travel");
        UO.UnsetArm(prefix + "battle");
    }
}

命令實作

C# 區分大小寫。請使用正確的 UO 名稱。數值旗標應與 0 比較;只有回傳型別為 bool 時才使用 bool。

UO.UnsetArm(name) — UO.UnsetArm(String)

參數: name (String)

結果: void / Unit.

呼叫時:

內部實作程式碼,不能作為獨立腳本執行。

public void UnsetArm(string name)

        {

            armSets.Remove(name);

            SystemMessage("Arm set removed.");

        }

UO.UnsetDress

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C# 簽章

void UO.UnsetDress(object? name);

刪除一組指定衣服的條目而不刪除該項目。

參數

  • name — 集合的字串名稱,例如「旅行」或「戰鬥」。名稱不區分大小寫。服裝和武器套裝分開存放:兩者允許使用相同的名稱。這不是 ID 的東西或檔名。只有SetDress允許沒有名稱:然後為DressSavedSet/EquipDressSet記錄一個單獨的集合。

傳回值

void - 无值。使用單獨的線路撥打電話;不要分配結果或將其與true進行比較。儲存和刪除會更改條目,而不是設備。

行為

  • 服裝:層數3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24。武器:僅限1和2。頭髮、鬍鬚、背包、動物和銀行不包含在這些套裝中。
  • 具體的serial已經加載的東西都記錄在自己的層中。再次儲存相同的名稱會取代該條目。空層也有意義:當恢復時,相應的佔用層將被釋放到自己的背包中。因此,已儲存的完全空集會從其圖層中刪除內容。
  • 此集合儲存在運行時狀態中。呼叫本身不會建立文件,也不保證該集將被傳輸到另一個設定檔或新的運行時。首先,將所需的集合儲存為其使用狀態。載入/保存客戶端的一般狀態是一個單獨的機制。
  • 刪除僅影響所選名稱的條目。物品保留在角色上,其他名稱和其他類型的套裝不受影響。重新刪除遺失的條目是可以接受的。 UnsetDress 和 UnsetArm 需要一個名稱。
  • UO.SetDress · UO.Dress · UO.DressSavedSet · UO.SetArm · UO.Arm · UO.DressSpeed
  • 在常規用戶端主機中,此狀態資料取自GetPersistentState管理器,並且對於同一世界/設定檔的腳本/聊天/巨集是通用的,且不屬於一個腳本。另一個進程或明顯獨立的InjectionRuntimeState具有不同的狀態。載入/清除設定檔可以取代它;已儲存的serial仍然會根據載入的世界進行檢查。

獨立的 C# 腳本

每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。

簡單範例

將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。

指令是獨立的陳述式。前面的訊息表示呼叫開始,並非伺服器已完成動作的確認。

UO.Print("Calling UO.UnsetDress");
UO.UnsetDress("travel");

1。直接使用-直接腳本

參數與執行流程:

  • 僅刪除指定的條目。衣服/武器無法脫下。
UO.UnsetDress("travel");

2。名稱和查詢模式 - 腳本功能

參數與執行流程:

  • 旅行和戰鬥這兩個名字分別刪除了。不同類型的集合的相同名稱將被保留。
return  RunScenario();
 object? RunScenario()
{
    UO.UnsetDress("travel");
    UO.UnsetDress("battle");
    return null;
}

3。完整的幫助程序腳本 - 腳本類

參數與執行流程:

  • CleanupSets 是一個完全聲明的過程,用於清理兩個專有名稱。 prefix 產生條目名稱,而不是檔案路徑。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        CleanupSets("mine_");
        return null;
    }

    void CleanupSets(dynamic prefix)
    {
        UO.UnsetDress(prefix + "travel");
        UO.UnsetDress(prefix + "battle");
    }
}

命令實作

C# 區分大小寫。請使用正確的 UO 名稱。數值旗標應與 0 比較;只有回傳型別為 bool 時才使用 bool。

UO.UnsetDress(name) — UO.UnsetDress(String)

參數: name (String)

結果: void / Unit.

呼叫時:

內部實作程式碼,不能作為獨立腳本執行。

public void UnsetDress(string name)

        {

            dressSets.Remove(name);

            SystemMessage("Dress set removed.");

        }

UO.UseOtherPaperdollScroll

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C# 簽章

void UO.UseOtherPaperdollScroll(object? objID);

透過橋使用指定的serial。 UseObject,通常會打開角色的紙娃娃。

參數

  • objID — 序列/ID 物件:int,數字/十六進位字串或已建立的別名,例如「lasttarget」。這不是graphic/type。在採取行動之前檢查裝載的物體。

傳回值

void - 沒有值。使用單獨的線路撥打電話;完成並不確認伺服器的操作。

行為

  • ObjID 指的是字符,而不是ID 滾動按鈕。該呼叫不會讀取 paperdoll 結構,也不會等待它開啟。
  • Bridge 在遊戲串流上發送請求。伺服器規則適用;沒有內建的等待確認。

獨立的 C# 腳本

每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。

簡單範例

將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。

指令是獨立的陳述式。前面的訊息表示呼叫開始,並非伺服器已完成動作的確認。

UO.Print("Calling UO.UseOtherPaperdollScroll");
UO.UseOtherPaperdollScroll(UO.GetSerial("lasttarget"));

1。直接呼叫-直接腳本

參數與執行流程:

  • 透過橋使用指定的serial。 UseObject,通常會打開角色的紙娃娃。
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
    UO.UseOtherPaperdollScroll(id);
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2。明確選項 - 腳本函數

參數與執行流程:

  • ObjID 指的是字符,而不是ID 滾動按鈕。該呼叫不會讀取 paperdoll 結構,也不會等待它開啟。
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("self");
    if (Truth(UO.Exists(id)))
    {
        UO.UseOtherPaperdollScroll(id);
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3。完整的輔助函數 - 腳本類

參數與執行流程:

  • Bridge 在遊戲串流上發送請求。伺服器規則適用;沒有內建的等待確認。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        ApplyToLoaded(UO.GetSerial("lasttarget"));
        return null;
    }

    void ApplyToLoaded(dynamic id)
    {
        if (Truth(UO.Exists(id)))
        {
            UO.UseOtherPaperdollScroll(id);
        }
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

命令實作

C# 區分大小寫。請使用正確的 UO 名稱。數值旗標應與 0 比較;只有回傳型別為 bool 時才使用 bool。

UO.UseOtherPaperdollScroll(objID) — UO.UseOtherPaperdollScroll(Any)

參數: objID (Any)

結果: void / Unit.

呼叫時:

內部實作程式碼,不能作為獨立腳本執行。

case "useotherpaperdollscroll": bridge.UseObject(Arg(0)); return InjectionValue.Unit;

UO.UseSelfPaperdollScroll

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C# 簽章

void UO.UseSelfPaperdollScroll();

使用當前角色,通常會打開紙娃娃。

參數

沒有參數。

傳回值

void - 沒有值。使用單獨的線路撥打電話;完成並不確認伺服器的操作。

行為

  • ExecuteClientApiCompatibility 呼叫網橋。 UseObject(網橋。Self)。沒有單獨讀取或點擊 paperdoll 元素;這是self的正常請求UseObject。
  • 在範例中,UO.Wait僅指定腳本暫停;暫停的結束並不能證明伺服器已經完成了請求。

獨立的 C# 腳本

每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。

簡單範例

將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。

指令是獨立的陳述式。前面的訊息表示呼叫開始,並非伺服器已完成動作的確認。

UO.Print("Calling UO.UseSelfPaperdollScroll");
UO.UseSelfPaperdollScroll();

1。直接呼叫-直接腳本

參數與執行流程:

  • 使用當前角色,通常會打開紙娃娃。
UO.UseSelfPaperdollScroll();

2。明確選項 - 腳本函數

參數與執行流程:

  • ExecuteClientApiCompatibility 呼叫網橋。 UseObject(網橋。Self)。沒有單獨讀取或點擊 paperdoll 元素;這是self的正常請求UseObject。
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Self() != 0))
    {
        UO.UseSelfPaperdollScroll();
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3。完整的輔助函數 - 腳本類

參數與執行流程:

  • 在範例中,UO.Wait僅指定腳本暫停;暫停的結束並不能證明伺服器已經完成了請求。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.UseSelfPaperdollScroll();
        UO.Wait(500);
        UO.Print(UO.Name());
        return null;
    }
}

命令實作

C# 區分大小寫。請使用正確的 UO 名稱。數值旗標應與 0 比較;只有回傳型別為 bool 時才使用 bool。

UO.UseSelfPaperdollScroll() — UO.UseSelfPaperdollScroll()

參數: 沒有參數。

結果: void / Unit.

呼叫時:

內部實作程式碼,不能作為獨立腳本執行。

case "useselfpaperdollscroll": bridge.UseObject(bridge.Self); return InjectionValue.Unit;

UO.WearItem

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C# 簽章

dynamic UO.WearItem(object? layer, object? objID);

將所選項目裝備到角色的編號圖層。

參數

  • layer - 層數,例如 1 - 右手,2 - 左手。 Equip和Unequip也接受圖層名稱,例如「Rhand」。 WearItem 使用數字層。該層必須與物品的可穿戴層相符;它不是graphic,也不是ID。
  • 載入的特定事物的id - ID:整數、十六進位字串、「lasttarget」或名稱AddObject。這不是type。例如0x0F5E先尋找graphic的劍並透過ID得到它。
  • 載入的特定事物的ObjID - ID:整數、十六進位字串、「lasttarget」或名稱AddObject。這不是type。例如0x0F5E先尋找graphic的劍並透過ID得到它。

傳回值

數字標誌int:1(滿足條件)- 接受本地操作,0(不滿足條件)- 拒絕。這不是伺服器確認,不是ID,也不是數量。稍後伺服器可能會發生故障;接聽後檢查實際設備。

該命令的結果是一個數字標誌: 1 表示滿足條件, 0 - 未實現。後 var 結果=命令(...)檢查是否(結果!= 0) 或 if (結果 == 0)。儲存一次呼叫的結果:重複呼叫可以再次執行該操作或讀取已經變更的狀態。

行為

  • 需要裝載物品並徒手拖曳。取下后,需要实际背包self:不使用备用背包GrabBag。未知、損壞和不合適的物品將被拒絕。其他人的物品無法透過UnequipItems移除。集合不是原子事務。
  • EquipItems/UnequipItems 在接受操作之後、下一個元素之前應用DressSpeed; Disarm/Undress - 在每個佔用層之後。當提款被接受時,提款仍遵守DropDelay。其他運行時的相同設定不變;加速不會超越伺服器限制。
  • 不正確的呼叫形式、未知的圖層名稱或不可轉換為數字的值可能會導致腳本錯誤,而不是0。設備快照僅包含已經載入的資料。在助手中,ChangeAndConfirm層=1是右手:對於另一件事,通過它的真實層。
  • UO.EquipItems · UO.UnequipItems · UO.DressSpeed · UO.DropDelay · UO.ObjAtLayerEx

獨立的 C# 腳本

每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。

簡單範例

將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。

int item = UO.LastTarget();
if (item != 0)
    UO.Print("Accepted flag: " + Convert.ToString(UO.WearItem(1, item)));

1。 WearItem - 一個選定的項目或圖層 - 直接腳本

參數與執行流程:

  • 首先,在遊戲中選擇適當的項目:lasttarget - 它的ID。在Equip/WearItem範例中,1層需要副手武器。 Unequip(1) 移除右手; Disarm/Undress 使用自己的固定圖層。拒绝后不会自动重播。
var item = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(item == 0))
{
    return 0;
}
return UO.WearItem(1, item);

int Asc(object? value, int fallback = 0) { string text = Convert.ToString(value) ?? ""; if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback; return int.TryParse(text, out int number) ? number : fallback; }
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2。 WearItem - 兩個項目並儲存 ID - 腳本函數

參數與執行流程:

  • 裝備方面,0x0F5E是劍的例子,0x1B76是盾的例子。 FindType在背包裝載的物品中尋找它們,ASC轉換返回的十六進制-ID。為了刪除,讀取自己的目前層。如果所需的項目不可用,則腳本結束。陣列儲存兩個ID;每個項目都被完全轉移。
return  RunScenario();
 object? RunScenario()
{
    var first = Asc(UO.FindType(0x0F5E, -1, "backpack"), 0);
    var second = Asc(UO.FindType(0x1B76, -1, "backpack"), 0);
    if (Truth(first == 0) || Truth(second == 0))
    {
        return 0;
    }

    UO.AddObject("saved_first", first);
    UO.AddObject("saved_second", second);
    var firstOk = UO.WearItem(1, first);
    var secondOk = UO.WearItem(2, second);
    return firstOk != 0 && secondOk != 0;
    return null;
}

int Asc(object? value, int fallback = 0)
{
    string text = Convert.ToString(value) ?? "";
    if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
        return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
    return int.TryParse(text, out int number) ? number : fallback;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3。 WearItem - 功能齊全,等待有限 - 腳本類

參數與執行流程:

  • ChangeAndConfirm 執行一次指令。然後檢查實際狀態最多20次,暫停100毫秒。 1 - 檢查看到預期狀態,0 - 失敗或過期等待。這是我們的助手的結果,而不是新的內建指令。呼叫操作本身也可能需要時間。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var item = Asc(UO.GetSerial("lasttarget"), 0);
        if (Truth(item == 0))
        {
            return 0;
        }

        return ChangeAndConfirm(1, item);
        return null;
    }

    dynamic ChangeAndConfirm(dynamic layer, dynamic item)
    {
        if (Truth(item == 0))
        {
            return 0;
        }

        if (!(Truth(UO.WearItem(layer, item))))
        {
            return 0;
        }

        for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
        {
            if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == item))
            {
                return 1;
            }

            UO.Wait(100);
        }

        return 0;
    }

    int Asc(object? value, int fallback = 0)
    {
        string text = Convert.ToString(value) ?? "";
        if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
            return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
        return int.TryParse(text, out int number) ? number : fallback;
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

命令實作

C# 區分大小寫。請使用正確的 UO 名稱。數值旗標應與 0 比較;只有回傳型別為 bool 時才使用 bool。

UO.WearItem(layer, objID) — UO.WearItem(Any,Any)

參數: layer (Any), objID (Any)

結果: dynamic / Any.

呼叫時:

內部實作程式碼,不能作為獨立腳本執行。

case "wearitem": return new InjectionValue(bridge.Equip(Arg(0), Arg(1)));

UO.Weight

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C# 簽章

int UO.Weight();

讀取角色的狀態計數器:目前的石頭重量。

參數

沒有參數。

傳回值

int — 當前石頭重量,0..65535 在客戶端模型中。 0 可以是真實值、無資料或遺失/損壞的播放器。這是一個數量,不是bool、ID或type:1表示一個單位,而不是成功。該指令不會迭代對象,也不傳回數組。

行為

  • 此指令不帶參數。使用上面的確切簽名。
  • 如果目前Player存在且尚未被銷毀,則在遊戲執行緒上讀取需要Player.Weight;否則0。設備不排序,獎金不重新計算,狀態不要求,並且沒有等待更新。存在的鬼魂不等於被摧毀的玩家。
  • Weight 讀取伺服器報告的總重量(以石頭為單位)。身體、設備和隨附行李的重量包含在數量中是由分片的規則決定的。團隊不會遍歷貨櫃、累加物品重量或更新封閉的袋子。這不是單一項目的 Weight 屬性,也不是項目的數量。
  • CharacterStatus 在更新之前檢查所需的主體。 Weight 可用其自己的擴展狀態,插槽 - 與 type 3, Luck - 和 type 4, 伺服器 WeightMax - 和 type 5。沒有可選計數器的緊湊/舊包會留下其先前的快取。新玩家從頭開始;該通話並未證明收到新狀態。
  • 這些函式負責註冊 API,不會在每次命令呼叫時重新執行。 C# 區分大小寫。請使用正確的 UO 名稱。數值旗標應與 0 比較;只有回傳型別為 bool 時才使用 bool。
  • 每次呼叫都會重新讀取本地資料。變數儲存快照;各個讀取可能會收到不同的伺服器更新。非零結果不會測試連線。零可以是一個值,也可以沒有資料。

獨立的 C# 腳本

每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。

簡單範例

將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。

將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。

var result = UO.Weight();
UO.Print("Weight: " + Convert.ToString(result));

1。顯示已儲存的計數器 - 直接腳本

參數與執行流程:

  • value 儲存對其自身字元的一次無參數呼叫; Convert.ToString 格式化日誌中的數字而不改變其意義。
var value = UO.Weight();
UO.Print("Weight: " + Convert.ToString(value));

2。觀察變化 - 腳本函數

參數與執行流程:

  • UO.Wait(500)前後間隔500毫秒。差值可以是正數、零或負數;暫時更新和角色變更可能會被跳過。暫停就是一個例子。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.Weight();
    await Delay(500);
    var after = UO.Weight();
    var difference = after - before;
    UO.Print("Counter change: " + Convert.ToString(difference));
    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));

3。完整的輔助函數 - 腳本類

參數與執行流程:

  • CanCarry(額外)獲得額外的石頭重量; 10是一個例子,不是堆疊的數量。拒絕負額外、無玩家或最大值 <= 0,讀取當前重量和限制,然後按額外 <= 最大值 - 目前返回 bool: true 或 false。減法避免了當前+額外的溢出。過載時,即使額外=0,結果也是false。這是本地評估,不是伺服器解析;讀取不是原子的,並且零權重可能是未知的。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(Truth(CanCarry(10)) == true))
        {
            UO.Print("Local check passed");
        }
        else
        {
            UO.Print("Local check failed or data unavailable");
        }

        return null;
    }

    dynamic CanCarry(dynamic extra)
    {
        if (Truth(extra < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.Weight();
        var maximum = UO.MaxWeight();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extra <= maximum - current;
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

命令實作

C# 區分大小寫。請使用正確的 UO 名稱。數值旗標應與 0 比較;只有回傳型別為 bool 時才使用 bool。

UO.Weight() — UO.Weight()

參數: 沒有參數。

結果: int / Integer.

呼叫時:

內部實作程式碼,不能作為獨立腳本執行。

case "weight": return new InjectionValue(bridge.Weight);
⚠️ **GitHub.com Fallback** ⚠️