ZH TW UO Topic movement - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

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

移動

UO.LimitMove — 移動距離上限.

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

角色移動、路徑建置、閘、障礙物和步驟延遲。移動物品的命令位於項目 → Moving 項目中。

部分

主題 命令與解釋
Follow UO.Follow - 背景跟隨、距離與停止。
Move UO.Move
MoveXY UO.MoveXY
MoveXYZ UO.MoveXYZ
NewMoveXY UO.NewMoveXY
Step UO.Step
StepQ UO.StepQ
PMove UO.PMove
Direction UO.Direction
CalcDir UO.CalcDir
AlwaysRun UO.AlwaysRun
尋路 UO.GetPathArray · UO.GetPathArray3D ​​· UO.NewMoveXY
GetPathArray UO.GetPathArray
GetPathArray3D UO.GetPathArray3D
ClientPath UO.ClientPath - 客戶端資料夾路徑,不是遊戲路徑;請參閱設定檔和設定。
Doors UO.OpenDoor · UO.LastStepQUsedDoor · UO.moveOpenDoor
Obstacles UO.IsWorldCellPassable · UO.SetBadLocation · UO.moveThroughNPC · UO.moveThroughCorner
運動設定 UO.moveCheckStamina · UO.moveExitOnDisconnect · UO.moveHeuristicMult · UO.moveTurnCost · UO.moveBetweenTwoCorners
Predicted X / Y / Z UO.PredictedX · UO.PredictedY · UO.PredictedZ
運動計時器 UO.GetRunMountTimer · UO.GetRunUnMountTimer · UO.GetWalkMountTimer · UO.GetWalkUnmountTimer · UO.SetRunMountTimer · UO.SetRunUnmountTimer · UO.SetWalkMountTimer · UO.SetWalkUnmountTimer

所有主題命令

移動

UO.Move · UO.MoveXY · UO.MoveXYZ · UO.NewMoveXY · UO.Step · UO.StepQ · UO.PMove · UO.MoveOn · UO.MoveOff · UO.MoverStop · UO.CancelMove · UO.Moving · UO.IsMoving · UO.GetRun · UO.IsRunning · UO.AlwaysRun · UO.FixWalk

Direction

UO.Dir · UO.Direction · UO.GetDir · UO.GetDirection · UO.CalcDir · UO.PredictedDirection

尋路

UO.GetPathArray · UO.GetPathArray3D · UO.AddStep · UO.AddDir

門

UO.OpenDoor · UO.LastStepQUsedDoor

運動設定

UO.moveBetweenTwoCorners · UO.moveCheckStamina · UO.moveExitOnDisconnect · UO.moveHeuristicMult · UO.moveOpenDoor · UO.moveThroughCorner · UO.moveThroughNPC · UO.moveTurnCost

預測 X / Y / Z

UO.PredictedX · UO.PredictedY · UO.PredictedZ

運動計時器

UO.GetRunMountTimer · UO.GetRunUnMountTimer · UO.GetWalkMountTimer · UO.GetWalkUnmountTimer · UO.SetRunMountTimer · UO.SetRunUnmountTimer · UO.SetWalkMountTimer · UO.SetWalkUnmountTimer

關於該主題的範例

每個命令卡都有幾個獨立的場景:直接程式碼、函數和類別。以下是精選的簡短場景;限制和全面分析是有可能的。

UO.NewMoveXY

參數、結果及所有場景

var x = UO.GetX() + 3;
var y = UO.GetY();
var ok = UO.NewMoveXY(x, y, true, 0, false);
if (Truth(ok))
{
    UO.Print("Destination reached");
}
else
{
    UO.Print("Destination not reached");
}

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

UO.GetPathArray3D

參數、結果及所有場景

var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
var path = UO.GetPathArray3D(x, y, z, x + 4, y, z, UO.WorldNum(), 0, 0, false);
if (Truth(ArrayLength(path) > 0))
{
    UO.Print("Steps: " + Convert.ToString(ArrayLength(path) - 1));
}

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;

參考章節

1 · 2

完整指令說明


UO.AddDir

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

C# 簽章

void UO.AddDir(object? directions);

參數

  • directions是保存在legacy清單中的字串。該值的含義和格式取決於使用它的兼容腳本。

傳回值

void。新增的條目並不是對變動的確認。

行為

  • 該值被加入到目前運行時狀態的清單AddDir中。呼叫本身不傳遞運動資料包,不移動角色,也沒有用於讀取此列表的已記錄的公共 getter。

獨立的 C# 腳本

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

簡單範例

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

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

UO.Print("Calling UO.AddDir");
UO.AddDir("E");

1。將方向儲存為相容舊版的條目,而無需移動角色。 - 直接腳本

參數與執行流程:

  • 將方向儲存為相容舊版的條目,而無需移動角色。
UO.AddDir("E");

2。將變數中的值傳遞到舊列表AddDir。 - 腳本功能

參數與執行流程:

  • 將變數中的值傳遞到舊列表AddDir。
return  RunScenario();
 object? RunScenario()
{
    var directionEntry = "north-east";
    UO.AddDir(directionEntry);
    return null;
}

3。每次呼叫都會向運行時狀態新增另一個字串條目。 - 腳本類

參數與執行流程:

  • 每次呼叫都會向運行時狀態新增另一個字串條目。
  • 輔助程序也不發送運動命令。
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()
    {
        AddLegacyDirection("W");
        return null;
    }

    void AddLegacyDirection(dynamic entry)
    {
        UO.AddDir(entry);
    }
}

命令實作

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

UO.AddDir(directions) — UO.AddDir(Any)

參數: directions (Any)

結果: void / Unit.

呼叫時:

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

case "adddir":

                case "addfindlist":

                case "addgate":

                case "addrecall":

                case "addstep":

                    LegacyList(name).Add(string.Join("|", arguments.Select(value => value.ToString())));

                    break;

UO.AddStep

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

C# 簽章

void UO.AddStep(object? directions);

參數

  • directions 是運行時轉換為文字並新增至相容性清單AddStep 的值。方向本身是不可解釋的。

傳回值

void。該呼叫不傳回值,也不確認移動。

行為

  • 每次呼叫都會將參數的字串表示形式加入到目前運行時狀態的清單 AddStep 中。此遺留條目不發送運動命令,並且在當前實作中沒有公共 getter。

獨立的 C# 腳本

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

簡單範例

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

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

UO.Print("Calling UO.AddStep");
UO.AddStep(2);

1。將值寫入遺留清單;角色不動。 - 直接腳本

參數與執行流程:

  • 將值寫入遺留清單;角色不動。
UO.AddStep(2);

2。傳遞文字值:它儲存為記錄而不是作為指令執行。 - 腳本功能

參數與執行流程:

  • 傳遞文字值:它儲存為記錄而不是作為指令執行。
return  RunScenario();
 object? RunScenario()
{
    var legacyValue = "east";
    UO.AddStep(legacyValue);
    return null;
}

3。每個呼叫都會在目前運行時的AddStep新增一個單獨的條目。 - 腳本類

參數與執行流程:

  • 每個呼叫都會在目前運行時的AddStep新增一個單獨的條目。
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.AddStep(1);
        UO.AddStep(2);
        return null;
    }
}

命令實作

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

UO.AddStep(directions) — UO.AddStep(Any)

參數: directions (Any)

結果: void / Unit.

呼叫時:

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

case "adddir":

                case "addfindlist":

                case "addgate":

                case "addrecall":

                case "addstep":

                    LegacyList(name).Add(string.Join("|", arguments.Select(value => value.ToString())));

                    break;

UO.AlwaysRun

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

C# 簽章

int UO.AlwaysRun();
void UO.AlwaysRun(object? enabled);

讀取或變更目前 ClassicUO 設定檔的持續運作設定。

參數

  • enabled - 0 禁止持續運轉;任何非零值都會開啟。

傳回值

如果啟用該設置,則無參數形式返回1,否則返回0。參數形式回傳null。

行為

  • 該值是從目前設定檔中讀取的。設定變更 AlwaysRun 並儲存目前設定檔。如果沒有活動的設定文件,getter 將傳回 0,並且 setter 會向用戶端日誌報告錯誤,並且不會變更設定。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。讀取設定; 1 表示恆速運轉有效。 - 直接腳本

參數與執行流程:

  • 讀取設定; 1 表示持續運行已啟用。
var isAlwaysRunning = UO.AlwaysRun();
UO.Print(Convert.ToString(isAlwaysRunning));

2。啟用持續運行並儲存目前設定檔設定。 - 腳本功能

參數與執行流程:

  • 啟用持續運行並儲存目前設定檔設定。
return  RunScenario();
 object? RunScenario()
{
    UO.AlwaysRun(1);
    return null;
}

3。僅在當前啟用時才停用持續運行。 - 腳本類

參數與執行流程:

  • 僅在當前啟用時才停用持續運行。
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(UO.AlwaysRun() != 0))
        {
            UO.AlwaysRun(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;
}

命令實作

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

UO.AlwaysRun() — UO.AlwaysRun()

參數: 沒有參數。

結果: int / Integer.

呼叫時:

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

public int AlwaysRun() => bridge.AlwaysRun();

UO.AlwaysRun(enabled) — UO.AlwaysRun(Integer)

參數: enabled (Integer)

結果: void / Unit.

呼叫時:

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

public void AlwaysRun(int enabled) => bridge.AlwaysRun(enabled);

UO.CalcDir

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

C# 簽章

int UO.CalcDir(object? xfrom, object? yfrom, object? xto, object? yto);

計算從一個世界點到另一個世界點的方向。角色不動。

參數

  • xfrom — 起點的 X 座標。
  • yfrom — 起點的 Y 座標。
  • xto — X 分配座標。
  • yto — Y 分配座標。

傳回值

int — 方向代碼: 0=北, 1=東北, 2=東, 3=東南, 4=南, 5=西南, 6=西, 7=西北。匹配點給出 100。這不是 bool: 0 意味著北方,而不是失敗; 1 意味著東北,而不是成功。不要傳遞它 100 步驟命令作為方向。

行為

  • 僅計算座標:沒有批次,沒有等待,沒有地圖加載,沒有障礙物檢查,沒有Z,也沒有世界地圖。團隊不尋找可行的路線,也不保證目標的實現。這些點必須屬於同一座標系;避開障礙物可以延長道路。
  • 所有四個參數都是必需的。發送記錄範圍 0..65535 內的世界座標 int。 object?簽名中的 表示通用適配器,而不是該商品的ID。這些指令沒有預設值、箱子內的座標、第五個Z和一個物件的重載。
  • 從目標座標中減去原始座標,然後檢查差異的符號。減少 Y 為北,增加 X 為東。如果兩個座標都發生變化,則無論差異大小如何,都會選擇對角線。如果兩個差值都為零 - 100。

獨立的 C# 腳本

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

簡單範例

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

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

var result = UO.CalcDir(100, 100, 101, 100);
UO.Print("CalcDir: " + Convert.ToString(result));

1。直接計算-直接腳本

參數與執行流程:

  • 出發地(100,100),目的地(101,100):X增加,Y不變。主要往返 int 2 - 东。未調用移動命令。
  • int — 方向代碼: 0=北, 1=東北, 2=東, 3=東南, 4=南, 5=西南, 6=西, 7=西北。匹配點給出 100。這不是 bool: 0 意味著北方,而不是失敗; 1 意味著東北,而不是成功。不要傳遞它 100 步驟命令作為方向。
  • 從目標座標中減去原始座標,然後檢查差異的符號。減少 Y 為北,增加 X 為東。如果兩個座標都發生變化,則無論差異大小如何,都會選擇對角線。如果兩個差值都為零 - 100。
return UO.CalcDir(100,100,101,100);

2。正確檢查結果是腳本的功能

參數與執行流程:

  • 兩點相等 (100,100)。 Direction=100 表示匹配,因此 Main 返回 string「已經在那裡」。在不同的時間點,另一個分支將會起作用。檢查的是100,而不是true。
  • int — 方向代碼: 0=北, 1=東北, 2=東, 3=東南, 4=南, 5=西南, 6=西, 7=西北。匹配點給出 100。這不是 bool: 0 意味著北方,而不是失敗; 1 意味著東北,而不是成功。不要傳遞它 100 步驟命令作為方向。
  • 從目標座標中減去原始座標,然後檢查差異的符號。減少 Y 為北,增加 X 為東。如果兩個座標都發生變化,則無論差異大小如何,都會選擇對角線。如果兩個差值都為零 - 100。
return  RunScenario();
 object? RunScenario()
{
    var direction = UO.CalcDir(100, 100, 100, 100);
    if (Truth(direction == 100))
    {
        return "already there";
    }

    return "different point";
    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。完整腳本解析-腳本類

參數與執行流程:

  • 當由(20,20)到(19,21)時,X減少,Y增加:UO.CalcDir返回5。 RebuildDirection 顯示了該演算法的所有分支,並給出了 5。主要返回“5:5”。四個輔助參數的座標意義相同。
  • int — 方向代碼: 0=北, 1=東北, 2=東, 3=東南, 4=南, 5=西南, 6=西, 7=西北。匹配點給出 100。這不是 bool: 0 意味著北方,而不是失敗; 1 意味著東北,而不是成功。不要傳遞它 100 步驟命令作為方向。
  • 從目標座標中減去原始座標,然後檢查差異的符號。減少 Y 為北,增加 X 為東。如果兩個座標都發生變化,則無論差異大小如何,都會選擇對角線。如果兩個差值都為零 - 100。
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 actual = UO.CalcDir(20, 20, 19, 21);
        var rebuilt = RebuildDirection(20, 20, 19, 21);
        return Convert.ToString(actual) + ":" + Convert.ToString(rebuilt);
        return null;
    }

    dynamic RebuildDirection(dynamic Xfrom, dynamic Yfrom, dynamic Xto, dynamic Yto)
    {
        var dx = Xto - Xfrom;
        var dy = Yto - Yfrom;
        if (Truth(dx == 0) && Truth(dy == 0))
        {
            return 100;
        }

        if (Truth(dx == 0))
        {
            if (Truth(dy < 0))
            {
                return 0;
            }

            return 4;
        }

        if (Truth(dy == 0))
        {
            if (Truth(dx > 0))
            {
                return 2;
            }

            return 6;
        }

        if (Truth(dx > 0))
        {
            if (Truth(dy < 0))
            {
                return 1;
            }

            return 3;
        }

        if (Truth(dy > 0))
        {
            return 5;
        }

        return 7;
    }

    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.CalcDir(xfrom, yfrom, xto, yto) — UO.CalcDir(Any,Any,Any,Any)

參數: xfrom (Any), yfrom (Any), xto (Any), yto (Any)

結果: int / Integer.

呼叫時:

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

case "calcdir": return new InjectionValue(CalculateDirection(Arg(0), Arg(1), Arg(2), Arg(3)));

UO.CancelMove

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

C# 簽章

void UO.CancelMove();

禁止腳本透過 MoveOff 進一步移動。

參數

沒有參數。

傳回值

void - 無回傳值。

行為

  • 呼叫 MoveOff,這會將運行時/管理器置於 MoveEnabled=false 狀態。要再次啟用移動,需要MoveOn。該指令不會回滾已傳送的步驟。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。拒絕移動 - 直接腳本

參數與執行流程:

  • 以下運動命令遵循關閉的解析度。
UO.CancelMove();

2。再次允許移動 - 腳本功能

參數與執行流程:

  • MoveOn 明確恢復解析度。
return  RunScenario();
 object? RunScenario()
{
    UO.CancelMove();
    UO.MoveOn();
    return null;
}

3。無連線時保護性停止 - 腳本類

參數與執行流程:

  • 連線中斷作為禁止後續步驟的條件。
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(UO.Connected())))
        {
            UO.CancelMove();
        }

        return null;
    }

    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.CancelMove() — UO.CancelMove()

參數: 沒有參數。

結果: void / Unit.

呼叫時:

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

case "cancelmove": MoveOff(); break;

UO.Dir

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

C# 簽章

int UO.Dir();

從客戶端模型讀取字元方向。

參數

沒有參數。

傳回值

int - 方向 mobile 沒有運行位: 0=N, 1=NE, 2=E, 3=SE, 4=S, 5=SW, 6=W, 7=NW。對於未知的 mobile 回報 0,這也意味著北方。

行為

  • 讀取已經接收到的本地資料。該請求不會開啟狀態,也不會強制伺服器發送更新。死亡、地圖轉換或物件刪除後,兩次呼叫之間的值可能會改變。
  • C# 區分大小寫。請使用正確的 UO 名稱。數值旗標應與 0 比較;只有回傳型別為 bool 時才使用 bool。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。顯示你的角色的目前值 - 直接腳本

參數與執行流程:

  • 不帶參數的呼叫指的是 self。角色的方向儲存在值中。
  • Convert.ToString 轉換要輸出的數字,不改變結果的意義。
var value = UO.Dir();
UO.Print("Dir: " + Convert.ToString(value));

2。在應用程式驗證中使用值 - 腳本函數

參數與執行流程:

  • 該值在沒有任何參數的情況下被讀取一次。角色的方向用於所示的計算或條件。
  • 數字閾值是腳本條件的範例,而不是新的客戶端限制。此欄位儲存上述伺服器單元和限制。
return  RunScenario();
 object? RunScenario()
{
    var value = UO.Dir();
    if (Truth(value == 2))
    {
        UO.Print("Facing east");
    }

    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(1000) 在兩次拍攝之間提供以毫秒為單位的暫停。
  • 變化比較:人物方向。榜樣不會改變世界上的任何事情,也不會無止盡地等待。這一秒鐘內的事件可能會被錯過。
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
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;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.Dir();
        await Delay(1000);
        var after = UO.Dir();
        if (Truth(before != after))
        {
            UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        }

        return null;
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    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.Dir() — UO.Dir()

參數: 沒有參數。

結果: int / Integer.

呼叫時:

呼叫時執行已儲存的處理函式 delegate。註冊方法在建立 API 時建立此 delegate。

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

() => bridge.GetDir(bridge.Self)

建立 API: 這些函式負責註冊 API,不會在每次命令呼叫時重新執行。


UO.Direction

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

C# 簽章

int UO.Direction();

從客戶端模型讀取字元方向。

參數

沒有參數。

傳回值

int - 方向 mobile 沒有運行位: 0=N, 1=NE, 2=E, 3=SE, 4=S, 5=SW, 6=W, 7=NW。對於未知的 mobile 回報 0,這也意味著北方。

行為

  • 讀取已經接收到的本地資料。該請求不會開啟狀態,也不會強制伺服器發送更新。死亡、地圖轉換或物件刪除後,兩次呼叫之間的值可能會改變。
  • C# 區分大小寫。請使用正確的 UO 名稱。數值旗標應與 0 比較;只有回傳型別為 bool 時才使用 bool。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。顯示你的角色的目前值 - 直接腳本

參數與執行流程:

  • 不帶參數的呼叫指的是 self。角色的方向儲存在值中。
  • Convert.ToString 轉換要輸出的數字,不改變結果的意義。
var value = UO.Direction();
UO.Print("Direction: " + Convert.ToString(value));

2。在應用程式驗證中使用值 - 腳本函數

參數與執行流程:

  • 該值在沒有任何參數的情況下被讀取一次。角色的方向用於所示的計算或條件。
  • 數字閾值是腳本條件的範例,而不是新的客戶端限制。此欄位儲存上述伺服器單元和限制。
return  RunScenario();
 object? RunScenario()
{
    var value = UO.Direction();
    if (Truth(value == 2))
    {
        UO.Print("Facing east");
    }

    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(1000) 在兩次拍攝之間提供以毫秒為單位的暫停。
  • 變化比較:人物方向。榜樣不會改變世界上的任何事情,也不會無止盡地等待。這一秒鐘內的事件可能會被錯過。
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
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;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.Direction();
        await Delay(1000);
        var after = UO.Direction();
        if (Truth(before != after))
        {
            UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        }

        return null;
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    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.Direction() — UO.Direction()

參數: 沒有參數。

結果: int / Integer.

呼叫時:

呼叫時執行已儲存的處理函式 delegate。註冊方法在建立 API 時建立此 delegate。

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

() => bridge.GetDir(bridge.Self)

建立 API: 這些函式負責註冊 API,不會在每次命令呼叫時重新執行。


UO.FixWalk

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

C# 簽章

void UO.FixWalk();

列印通知,表示 ClassicUO 不需要舊版機用戶端補丁 FixWalk。

參數

沒有參數。

傳回值

void - 無回傳值。

行為

  • ExecuteLegacyManualAlias分支僅呼叫SystemMessage。它不糾正運動、語音、容器或網路協定。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。相容性聲明 - 直接腳本

參數與執行流程:

  • 該訊息描述了不需要舊補丁。
UO.FixWalk();

2。呼叫過程-腳本函數

參數與執行流程:

  • 相容性程式不會改變遊戲世界。
return  RunScenario();
 object? RunScenario()
{
    CompatibilityNotice();
    return null;
}

void CompatibilityNotice()
{
    UO.FixWalk();
}

3。腳本延續 - 腳本類

參數與執行流程:

  • 診斷訊息出現後,繼續執行。
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.FixWalk();
        UO.Print("continued");
        return null;
    }
}

命令實作

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

UO.FixWalk() — UO.FixWalk()

參數: 沒有參數。

結果: void / Unit.

呼叫時:

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

case "boxhack":

                case "fixtalk":

                case "fixwalk":

                    SystemMessage($"{name}: obsolete native-client patch; ClassicUO does not require it.");

                    break;

UO.Follow

Follow 套用 UO.LimitMove、moveCheckStamina、moveOpenDoor、moveThroughCorner、moveThroughNPC、moveHeuristicMult、moveTurnCost、moveExitOnDisconnect、moveBetweenTwoCorners,以及 SetBadLocation/SetBadObject 快照。角色的接近距離也允許為 0,這與 UO.LimitMove 的目的地距離不同。

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

C# 簽章

int UO.Follow();
int UO.Follow(object? target);
int UO.Follow(object? target, object? distance);
int UO.Follow(object? target, object? distance, object? running);
int UO.Follow(object? target, object? distance, object? running, object? stopConditions);
int UO.Follow(object? x, object? y, object? z, object? distance, object? running);
int UO.Follow(object? x, object? y, object? z, object? distance, object? running, object? stopConditions);

啟用已載入角色的背景追蹤/NPC 或移動到 X、Y、Z 點。移動時,客戶端檢查傳輸的停止條件;腳本在呼叫後立即繼續執行。

參數

  • target — 字元序列/NPC:int,十六進位/十進位字串,lasttarget 或先前透過AddObject 儲存的名稱。這些不是 graphic/type 或座標。你無法跟隨自己或物體。 0 停止跟隨。如果沒有參數,Follow()也會停止它;景象沒有出現。
  • distance — 公差根據 X/Y 在單元格中:最大 |dx| 和 |dy|。對於性格 int 0..18, 預設情況下 1;不同之處 Z 到 16 可以接受。為了一點 int 0..18,參數是必需的: 0 需要精確的 X/Y, 2 允許在兩個單元格內停止; Z 應該完全匹配。無效值不會取代先前的行為。
  • running - bool 相容值:true/1 - 跑步,false/0 - 步行;預設為true。伺服器速度限制、耐力、癱瘓和障礙仍然存在。該標誌不會加快伺服器步驟。
  • stopConditions — 可選的停止條件數組:第四個參數代表字符,第六個參數代表座標。每個元素都是一個恰好包含三個值的陣列[字段、比較、閾值]。字段和比較都是字串,閾值是int/double;對於標誌 true/false (1/0) 是適當的。觸發任何條件都會終止Follow (OR)。空數組不新增條件。元素數量不限於固定的3/5/10項,而是受記憶體限制;大型列表會分塊檢查。下面列出了允許的欄位和單位;在取代前一個Follow之前,未知欄位、運算子或無效陣列形式會導致錯誤。
  • x - 僅有 5/6 參數的表單:目前地圖上的整數世界座標,0..65535 以及載入的地圖邊界內。這些不是窗口/甘蔗座標或serial。沒有轉帳到另一張卡。
  • y - 僅有 5/6 參數的表單:目前地圖上的整數世界座標,0..65535 以及載入的地圖邊界內。這些不是窗口/甘蔗座標或serial。沒有轉帳到另一張卡。
  • z — 僅具有 5/6 參數的形式:整數世界高度 -128..127。完成時需要此高度,因此請指定所需地板的可用表面的 Z。沒有單獨的“任何 Z”值或自動高度選擇。

傳回值

int 1 (true) — 以下模式已被客戶端接受,或停止請求已完成; int 0 (false) - 沒有適當的角色、玩家不可用/死亡、目標在視線之外、不支援團隊。這不是到達的結果,不是serial,也不是步數。在 C# 中使用 if (result != 0) 或 if (result == 1);結果的型別為int,而非bool。類型錯誤/未知的物件名稱可能會導致腳本錯誤。對於座標,0也意味著無效的X/Y/Z或容差。 1表示只接受後台任務;抵達和未來入住尚未確定。

行為

  • 每個客戶端只有一種模式Follow:字元或座標。成功的呼叫會再次取代目標和參數。挑戰不成功並不會取消先前的目標。要關注某個角色,他必須已位於ClientViewRange內已載入的手機清單中;座標點可能比視圖更遠。
  • 當到達角色附近的距離時,行走會停止,但該模式保持開啟狀態,並在目標移開時恢復移動。在基準點附近,如果滿足 X/Y 公差和精確的 Z 值,則任務完成。該命令在啟動時不會報告路由的保證可達性。
  • Follow()、Follow(0)、MoverStop()、手動滑鼠/箭頭移動、新的腳本路線或標準客戶端跟隨將停止此模式。 TerminateAll/Terminate("all") 也会停止它。取消仍在運行的所有者腳本會停止它Follow。
  • 當地圖或角色發生變化、玩家死亡或連線中斷時,兩種模式都會結束。當目標從記憶/視圖中消失時,跟隨角色也會停止。稍後出現目標不會自動觸發該模式:需要一個新的Follow。
  • 關閉 IDE 不會停止該模式。正在執行的腳本的正常終止會使 Follow 啟用。腳本暫停本身並不是該客戶端模式的暫停;而是暫停。暫停前,當運動需要停止時,使用Follow(0)。
  • Pathfinder 在遊戲流上以區塊的形式計算路徑;不完整的搜尋不會重新開始。對於mobile,正常路由更新僅限於500 毫秒。在未進場的航路失敗或終止後,前三次重試延遲為 1000 毫秒,然後是 2000、4000 以及最多 5000 毫秒。當X/Y/Z玩家或目標發生變化時,反彈計數器會重設;更改目標可以將等待時間減少最多 500 毫秒。對於可用的mobile目標,重複次數沒有一般限制:該模式可以保持活動狀態而不移動,因此將其設定為已過去或明確停止它。當路徑完全失效時,座標任務結束。
  • 距離/時間字段:距離 — 到單元格中目標的當前距離 max(abs(dx),abs(dy));高度 — 世界單位的絕對差 Z;elapsed - 自接受此 Follow 以來的毫秒數。距離 > 12 當移動超過 12 個單元格時停止,經過 >= 30000 - 30 秒後。重複成功Follow再次開始倒數計時。
  • 你的角色狀態:self.hp / self.mana / self.stam - 目前值; self.hppercent / self.manapercent / self.stampercent - 相對於對應最大值的百分比 0..100。未知最大值(<=0)表示未知值:此特性的條件未觸發,而非接收虛構的0。
  • 您角色的逻辑字段:self.poisoned(中毒)、self.paralyzed(瘫痪)、self.hidden(隐藏)。值1/0。在条件数组Follow中,字段“self.paralyzed”的规则(带有运算符“=”和值true)在瘫痪时停止遵循。这是规则字段的字符串名称,而不是C#变量self。
  • 目標欄位:target.dead - 死亡mobile,target.hidden - 隱藏,target.visible - 對客戶端可見(不是CheckLOS),target.hp / target.hppercent - 載入HP/百分比。若HP max 未知,則HP 條件失敗。伺服器可以傳送別人角色的相對比例HP,所以hppercent 比較方便。
  • 其他目標欄位:target.notoriety - 狀態 0..7 (0 未知, 1 Innocent, 2 Ally, 3 Gray, 4 Criminal, 5 Enemy, 6 Murderer, 7 Invulnerable); target.body - 數字 graphic 屍體。這不是 type 衣服。例如 target.notoriety != 2 失去盟友身分後終止支援。
  • 呼叫時會捕獲條件的副本,包括數字閾值。更改來源數組/變數不會更新模式;使用新數組重複Follow。當條件不再滿足時,取消的模式本身就不會恢復。
  • 在移動期間和角色已經站在目標附近時都會檢查條件。在一個遊戲幀中檢查最多64個元素的常規列表,下一次檢查不早於250毫秒之後。更大的清單 - 每幀 64 元素,然後暫停 250 毫秒。經過的字段可能會晚於檢查/幀持續時間的閾值停止:它不是一個準確的計時器。
  • 在完成整個清單的第一次檢查之前,不會開始新的路線。如果條件已經滿足,Follow 會為接受的請求回傳1,然後停止更新,不再執行第一步。先前運動的步驟資料包可能已經發送。
  • 新條件不會停用強制停止原因:目標/玩家/卡片/連結遺失、玩家死亡、擁有者取消、Terminate所有和手動/其他移動。腳本程式碼不在遊戲執行緒上執行;僅檢查列出的本地值。
  • 座標形式:Follow(x,y,z,distance,running)和Follow(x,y,z,distance,running,stopConditions)。前五個參數是必需的。 Follow(x,y,z) 不是座標的簡寫符號:三個參數仍表示目標、距離、跑步。
  • 在座標模式下,條件中的距離是指沿X/Y到該點的剩餘距離,高度是與其Z的絕對差;時間過去了,所有 self.* 都照常工作。 target.* 字段无效:该点没有 HP、正文或状态。尝试传递它们会导致脚本错误,直到替换旧模式为止。
  • 在第一條路線之前、計算期間以及角色移動時都會檢查條件。觸發任何條件都會刪除任務並取消屬於它的路徑。大型清單的頻率和處理與追蹤字元相同;已傳送至伺服器的步驟可能會完成。
  • 當到達該點或搜尋和移動失敗/未到達該點就結束時,座標任務結束。不會觸發無法到達的點的無限重試。探路者對障礙物的正常內部重新計算被保留。完成後,離開該位置不會恢復任務。
  • 如果 Pathfinder 已發送最後的步驟並完成路徑,但這些步驟仍在執行/等待確認,則任務將繼續檢查條件。發送步驟的佇列本身不會被刪除:它必須由正常的伺服器移動和確認機制來處理。
  • 可以透過 List.Add 在 DO ... 循環結束或 FOR 組裝列表,然後將其傳遞給checks.ToArray() 作為適當形式的最後一個參數。無需在每次迭代時再次呼叫 Follow:這會取代模式並重置已過的時間。行數不限於少量,但支援的欄位集僅限於上面列出的欄位。
  • 在2000毫秒後,在不改變X/Y/Z的情況下,玩家mobile-Follow可以重新請求到固定目標的路徑。僅當下一個截止時間出現時、在搜尋之外、在 Player.Steps 和 Walker 佇列被釋放之後以及允許下一步時執行檢查。緩慢行動並等待確認沒有任何成本;發送的步驟不會被刪除。座標Follow不會發起這樣的外部無限重複:其路徑的恢復由有限探路者處理。
  • 僅當相應活動請求被拒絕時,通用探路者最多可儲存 8 2000 毫秒的暫時 X/Y/Z 方向禁止。輪換、未知順序、重新同步和舊/外來請求不會產生此類禁止。新的外部請求和地圖/玩家上下文的遺失會清除它們。載入的幾何搜尋嘗試繞過過渡;它不知道所有伺服器障礙。在不更改玩家 X/Y/Z 的情況下,允許最多 8 內部重新計算,並暫停至少 40 毫秒。沒有完整的路徑或預算已用完 - 路線結束。處理完提交的步驟後,協調任務完成; mobile-Follow 可能會因延遲而重試。
  • 控制器比較自己的運動請求的數量,而不是事實AutoWalking:路徑的自然結束不被視為外部命令。 StopOwnedPath 將儲存的號碼傳送至StopAutoWalkIfRequestGeneration。新的外部請求終止舊的Follow;停止它並不會取消其他人的新路線。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。在最後一個目標之後運行 - 直接腳本

參數與執行流程:

  • 領導者 — 最後一個目標的serial。該單位確認接受該制度,而不是到達。方法結束後,該模式繼續工作,直到目標停止/丟失。
var leader = UO.GetSerial("lasttarget");
var accepted = UO.Follow(leader);
if (Truth(Truth(accepted) == true))
{
    UO.Print("Following is enabled; script continues");
}
else
{
    UO.Print("Select a loaded nearby character");
}

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

2。走三個方塊,然後停止 - 腳本函數

參數與執行流程:

  • UO.Wait 以毫秒為單位。 Follow(0) ​​關閉普通跟隨模式;目標的後續移動不再導致移動。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var leader = UO.GetSerial("lasttarget");
    if (Truth(UO.Follow(leader, 3, false) == 1))
    {
        await Delay(10000);
        UO.Follow(0);
        UO.Print("Following stopped");
    }

    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3。限制出行時間並保證關閉-場景類

參數與執行流程:

  • 距離=2,跑步=true;超過 500 毫秒的最大20 期望。 Exists 檢查物件是否存在,但不檢查路徑的可及性。 finally 正常退出/錯誤時停止模式;緊急業主取消由客戶額外處理。
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
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;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var leader = UO.GetSerial("leader");
        if (Truth(UO.Follow(leader, 2, true) == 0))
        {
            UO.Print("Cannot start following");
            return null;
        }

        try
        {
            var attempts = 0;
            while (Truth(attempts < 20) && Truth(UO.Exists(leader)))
            {
                await Delay(500);
                attempts = attempts + 1;
            }
        }
        finally
        {
            UO.Follow();
        }

        return null;
    }

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

4。按距離、您的 HP 或時間停止 - 直接腳本

參數與執行流程:

  • 因任何條件而停止:目標距離12個單元格或我們的HP不超過40%或30秒已經過去。這不是AND。 StopWhen 已完整給出,可以包含在 Include 中。一意味著接受,而不是到達。
var leader = UO.GetSerial("lasttarget");
dynamic[] conditions = new dynamic[checked((int)(2) + 1)];
conditions[0] = StopWhen("distance", ">", 12);
conditions[1] = StopWhen("self.hppercent", "<=", 40);
conditions[2] = StopWhen("elapsed", ">=", 30000);
var accepted = UO.Follow(leader, 2, true, conditions);
if (Truth(accepted == 0))
{
    UO.Print("Cannot follow this target");
}

dynamic StopWhen(dynamic field, dynamic comparison, dynamic threshold)
{
    dynamic[] rule = new dynamic[checked((int)(2) + 1)];
    rule[0] = field;
    rule[1] = comparison;
    rule[2] = threshold;
    return rule;
}

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

5。透過沒有預先定義大小的清單新增條件 - 腳本功能

參數與執行流程:

  • 如果目標消失/死亡/不再是盟友,剩餘耐力不超過5,或Z的差異超過16,我們就會停止。 false 是步行的意思。 ToArray 傳遞條件行列表;尺寸未事先指定。如果目標不再是盟友,移動就不會開始。
return  RunScenario();
 object? RunScenario()
{
    var checks = new List<object?>();
    checks.Add(StopWhen("target.hidden", "=", true));
    checks.Add(StopWhen("target.dead", "=", true));
    checks.Add(StopWhen("target.notoriety", "<>", 2));
    checks.Add(StopWhen("self.stam", "<=", 5));
    checks.Add(StopWhen("height", ">", 16));
    var leader = UO.GetSerial("lasttarget");
    var conditions = checks.ToArray();
    UO.Follow(leader, 2, false, conditions);
    return null;
}

dynamic StopWhen(dynamic field, dynamic comparison, dynamic threshold)
{
    dynamic[] rule = new dynamic[checked((int)(2) + 1)];
    rule[0] = field;
    rule[1] = comparison;
    rule[2] = threshold;
    return rule;
}

6。跟隨直至接近,然後完全關閉模式 - 場景類

參數與執行流程:

  • 保持距離1,停止條件<=3;每250毫秒檢查一次可能會發現延遲的成就。 15000 毫秒超時不允許無限期追蹤。返回Follow仍表示接受,未達三格。
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()
    {
        dynamic[] conditions = new dynamic[checked((int)(1) + 1)];
        conditions[0] = StopWhen("distance", "<=", 3);
        conditions[1] = StopWhen("elapsed", ">=", 15000);
        UO.Follow(UO.GetSerial("lasttarget"), 1, true, conditions);
        return null;
    }

    dynamic StopWhen(dynamic field, dynamic comparison, dynamic threshold)
    {
        dynamic[] rule = new dynamic[checked((int)(2) + 1)];
        rule[0] = field;
        rule[1] = comparison;
        rule[2] = threshold;
        return rule;
    }
}

7。收集DO中的條件...循環結束:停止在狀態5或6 - 直接腳本

參數與執行流程:

  • while 為每個狀態元素收集單獨的條件。在狀態5或6停止,擁有HP<=40%或30000毫秒後。空狀態將跳過循環,但接下來的兩個條件將保留。新增行直至Follow;對清單的後續變更不會更改已安裝的副本。對於背景檢查,不需要重複循環體。
var statuses = new List<object?>();
statuses.Add(5);
statuses.Add(6);
var checks = new List<object?>();
var index = 0;
while (index < statuses.Count)
{
checks.Add(StopWhen("target.notoriety", "=", statuses[index]));
index += 1;
}
checks.Add(StopWhen("self.hppercent", "<=", 40));
checks.Add(StopWhen("elapsed", ">=", 30000));
var accepted = UO.Follow(UO.GetSerial("lasttarget"), 2, true, checks.ToArray());
if (Truth(accepted == 0))
{
    UO.Print("Select a loaded nearby character");
}

dynamic StopWhen(dynamic field, dynamic comparison, dynamic threshold)
{
    dynamic[] rule = new dynamic[checked((int)(2) + 1)];
    rule[0] = field;
    rule[1] = comparison;
    rule[2] = threshold;
    return rule;
}

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

8。循環末尾的自己的表達式UNTIL以及在Finally處強制停止 - 腳本函數

參數與執行流程:

  • StopEscort(leader, startedAt) 返回 bool-相容的 1/0: 目標更遠 12 細胞或你的 HP <=30 或透過 30 秒添加 || (另一個條件);對於兩個檢查的強制組合,請使用 (conditionA && conditionB)。未知 HP 可以讀作 0;然後該範例拒絕啟動。當腳本運行時,它大約每隔一段時間檢查一次表達式 250 多發性硬化症;暫停腳本會暫停這些檢查。最後在正常退出/錯誤時調度停止;客戶也會追蹤所有者取消的情況。如果目標消失且用戶端已經停止 Follow,本次循環將根據其條件結束,最晚不晚於超時檢查。要在方法結束後工作,請使用第四個參數,如前面的範例所示。
return  RunScenario();
 object? RunScenario()
{
    var leader = UO.GetSerial("lasttarget");
    var startedAt = Now();
    if (Truth(leader == "0x00000000") || Truth(StopEscort(leader, startedAt)))
    {
        return null;
    }

    if (Truth(UO.Follow(leader, 2, true) == 0))
    {
        return null;
    }

    try
    {
        do
        {
            UO.Wait(250);
        }
        while (!StopEscort(leader, startedAt));
    }
    finally
    {
        UO.Follow(0);
    }

    return null;
}

dynamic StopEscort(dynamic leader, dynamic startedAt)
{
    return (UO.GetDistance(leader) > 12) || (UO.GetHP("self") <= 30) || (Now() - startedAt >= 30000);
}

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

9。運行到精確的 X、Y、Z - 腳本類

參數與執行流程:

  • 五個參數:X=1445,Y=1690,Z=0,公差 X/Y=0,運行。退貨1表示已接受,而非已完成到貨。一旦到達那裡,任務將完全關閉。若要手動提前停止,請致電UO.Follow(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 accepted = UO.Follow(1445, 1690, 0, 0, true);
        if (Truth(accepted == 0))
        {
            UO.Print("Coordinate task was not accepted");
        }

        return null;
    }

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

10。根據您的 HP、麻痺或時間到達某個停止點 - 直接腳本

參數與執行流程:

  • 在HP<=40%,癱瘓,或在30秒後,客戶端停止其當前路徑。否則,任務將在 (1445,1690) 的兩個 X/Y 單元格內結束,嚴格在 Z=0 處。在尋路和移動過程中都會繼續進行檢查;這不是開始前的一次性檢查。 target.* 不適用於此處。
var checks = new List<object?>();
checks.Add(StopWhen("self.hppercent", "<=", 40));
checks.Add(StopWhen("self.paralyzed", "=", true));
checks.Add(StopWhen("elapsed", ">=", 30000));
UO.Follow(1445, 1690, 0, 2, true, checks.ToArray());

dynamic StopWhen(dynamic field, dynamic comparison, dynamic threshold)
{
    dynamic[] rule = new dynamic[checked((int)(2) + 1)];
    rule[0] = field;
    rule[1] = comparison;
    rule[2] = threshold;
    return rule;
}

11。進入正題,但在它之前結束護送三個單元格是腳本的功能

參數與執行流程:

  • 呼叫中的 distance=0 指定精確到達,但當下一次檢查注意到這樣的距離時,距離 <=3 條件會提前終止任務。 false 表示步行。 Z>16 或 20000 ms 的差異也會停止任務。方向並不保證通行;將偏移量替換為您的路線點。

標準行駛速度

最小步數間隔:步行-步行400毫秒,跑步200毫秒;騎乘-步行200毫秒,跑步100毫秒。

這些是標準客戶端限制,而不是為您的分片自動定義的設定。伺服器速度和飛行模式是分開計算的。腳本計時器可以減慢移動速度,但不會減少這些限制。

步骤、路线、Follow、鼠标/按键控制和地图使用角色的共享队列。伺服器替換路線、轉彎或調整位置不會取消步驟請求後剩餘的暫停。延遲之後,沒有快速突發來補償遺失的幀。等待確認、障礙和溝通不良可能會減慢行動速度。

return  RunScenario();
 object? RunScenario()
{
    var checks = new List<object?>();
    checks.Add(StopWhen("distance", "<=", 3));
    checks.Add(StopWhen("height", ">", 16));
    checks.Add(StopWhen("elapsed", ">=", 20000));
    var x = UO.GetX("self") + 10;
    var y = UO.GetY("self");
    var z = UO.GetZ("self");
    UO.Follow(x, y, z, 0, false, checks.ToArray());
    return null;
}

dynamic StopWhen(dynamic field, dynamic comparison, dynamic threshold)
{
    dynamic[] rule = new dynamic[checked((int)(2) + 1)];
    rule[0] = field;
    rule[1] = comparison;
    rule[2] = threshold;
    return rule;
}

命令實作

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

UO.Follow() — UO.Follow()

參數: 沒有參數。

結果: int / Integer.

呼叫時:

呼叫時執行已儲存的處理函式 delegate。註冊方法在建立 API 時建立此 delegate。

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

values => new InjectionValue(bridge is IApiFollowBridge follow

                        ? follow.Follow(count == 0 ? 0 : GetObject(values[0]),

                            count < 2 ? 1 : NumberConversions.ToInt(values[1]),

                            count < 3 || NumberConversions.ToInt(values[2]) != 0) : 0)

UO.Follow(target) — UO.Follow(Any)

參數: target (Any)

結果: int / Integer.

呼叫時:

呼叫時執行已儲存的處理函式 delegate。註冊方法在建立 API 時建立此 delegate。

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

values => new InjectionValue(bridge is IApiFollowBridge follow

                        ? follow.Follow(count == 0 ? 0 : GetObject(values[0]),

                            count < 2 ? 1 : NumberConversions.ToInt(values[1]),

                            count < 3 || NumberConversions.ToInt(values[2]) != 0) : 0)

UO.Follow(target, distance) — UO.Follow(Any,Any)

參數: target (Any), distance (Any)

結果: int / Integer.

呼叫時:

呼叫時執行已儲存的處理函式 delegate。註冊方法在建立 API 時建立此 delegate。

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

values => new InjectionValue(bridge is IApiFollowBridge follow

                        ? follow.Follow(count == 0 ? 0 : GetObject(values[0]),

                            count < 2 ? 1 : NumberConversions.ToInt(values[1]),

                            count < 3 || NumberConversions.ToInt(values[2]) != 0) : 0)

UO.Follow(target, distance, running) — UO.Follow(Any,Any,Any)

參數: target (Any), distance (Any), running (Any)

結果: int / Integer.

呼叫時:

呼叫時執行已儲存的處理函式 delegate。註冊方法在建立 API 時建立此 delegate。

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

values => new InjectionValue(bridge is IApiFollowBridge follow

                        ? follow.Follow(count == 0 ? 0 : GetObject(values[0]),

                            count < 2 ? 1 : NumberConversions.ToInt(values[1]),

                            count < 3 || NumberConversions.ToInt(values[2]) != 0) : 0)

UO.Follow(target, distance, running, stopConditions) — UO.Follow(Any,Any,Any,Any)

參數: target (Any), distance (Any), running (Any), stopConditions (Any)

結果: int / Integer.

呼叫時:

呼叫時執行已儲存的處理函式 delegate。註冊方法在建立 API 時建立此 delegate。

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

values =>

                {

                    FollowStopCondition[] conditions = FollowStopCondition.Parse(values[3]);

                    return new InjectionValue(bridge is IApiConditionalFollowBridge follow

                        ? follow.Follow(GetObject(values[0]), NumberConversions.ToInt(values[1]), ToBoolean(values[2]), conditions) : 0);

                }

UO.Follow(x, y, z, distance, running) — UO.Follow(Any,Any,Any,Any,Any)

參數: x (Any), y (Any), z (Any), distance (Any), running (Any)

結果: int / Integer.

呼叫時:

呼叫時執行已儲存的處理函式 delegate。註冊方法在建立 API 時建立此 delegate。

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

values =>

                    {

                        FollowStopCondition[] conditions = count == 6

                            ? FollowStopCondition.Parse(values[5], coordinateGoal: true) : Array.Empty<FollowStopCondition>();

                        return new InjectionValue(bridge is IApiCoordinateFollowBridge follow

                            ? follow.FollowPoint(NumberConversions.ToInt(values[0]), NumberConversions.ToInt(values[1]),

                                NumberConversions.ToInt(values[2]), NumberConversions.ToInt(values[3]), ToBoolean(values[4]), conditions) : 0);

                    }

UO.Follow(x, y, z, distance, running, stopConditions) — UO.Follow(Any,Any,Any,Any,Any,Any)

參數: x (Any), y (Any), z (Any), distance (Any), running (Any), stopConditions (Any)

結果: int / Integer.

呼叫時:

呼叫時執行已儲存的處理函式 delegate。註冊方法在建立 API 時建立此 delegate。

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

values =>

                    {

                        FollowStopCondition[] conditions = count == 6

                            ? FollowStopCondition.Parse(values[5], coordinateGoal: true) : Array.Empty<FollowStopCondition>();

                        return new InjectionValue(bridge is IApiCoordinateFollowBridge follow

                            ? follow.FollowPoint(NumberConversions.ToInt(values[0]), NumberConversions.ToInt(values[1]),

                                NumberConversions.ToInt(values[2]), NumberConversions.ToInt(values[3]), ToBoolean(values[4]), conditions) : 0);

                    }

UO.GetDir

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

C# 簽章

int UO.GetDir();
int UO.GetDir(object? id);

從客戶端模型讀取字元方向。

參數

  • id — 僅在指定單參數形式中的可選物件:serial 數字/十六進位字串、「self」、「lasttarget」或名稱 AddObject。這不是graphic/type。不爭論,就讀出了自己的性格。在讀取另一個物件之前,檢查UO.Exists;未知的名稱不會開啟範圍。

傳回值

int - 方向 mobile 沒有運行位: 0=N, 1=NE, 2=E, 3=SE, 4=S, 5=SW, 6=W, 7=NW。對於未知的 mobile 回報 0,這也意味著北方。

行為

  • 讀取已經接收到的本地資料。該請求不會開啟狀態,也不會強制伺服器發送更新。死亡、地圖轉換或物件刪除後,兩次呼叫之間的值可能會改變。
  • C# 區分大小寫。請使用正確的 UO 名稱。數值旗標應與 0 比較;只有回傳型別為 bool 時才使用 bool。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。顯示你的角色的目前值 - 直接腳本

參數與執行流程:

  • 不帶參數的呼叫指的是 self。角色的方向儲存在值中。
  • Convert.ToString 轉換要輸出的數字,不改變結果的意義。
var value = UO.GetDir();
UO.Print("GetDir: " + Convert.ToString(value));

2。在應用程式驗證中使用值 - 腳本函數

參數與執行流程:

  • 該值在沒有任何參數的情況下被讀取一次。角色的方向用於所示的計算或條件。
  • 數字閾值是腳本條件的範例,而不是新的客戶端限制。此欄位儲存上述伺服器單元和限制。
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetDir();
    if (Truth(value == 2))
    {
        UO.Print("Facing east");
    }

    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。讀取所選物件的屬性 - 腳本類

參數與執行流程:

  • 單一參數選擇物件lasttarget;其serial必須為客戶所知。圖文/type這裡就不轉了。
  • 即使Exists為正,另一個物件的資料也可能是未知的。對於包中物品的座標,獲取的是容器的位置,而不是世界點。
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(UO.Exists("lasttarget")))
        {
            var targetValue = UO.GetDir("lasttarget");
            UO.Print("Selected value: " + Convert.ToString(targetValue));
        }
        else
        {
            UO.Print("Target is not loaded");
        }

        return null;
    }

    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.GetDir() — UO.GetDir()

參數: 沒有參數。

結果: int / Integer.

呼叫時:

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

public int GetDir() => GetDir("self");

UO.GetDir(id) — UO.GetDir(Integer)

參數: id (Integer/String)

結果: int / Integer.

呼叫時:

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

public int GetDir(int id) => bridge.GetDir(id);

UO.GetDir(id) — UO.GetDir(String)

參數: id (Integer/String)

結果: int / Integer.

呼叫時:

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

public int GetDir(string id) => GetDir(GetObject(id));

UO.GetDirection

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

C# 簽章

int UO.GetDirection();
dynamic UO.GetDirection(object? objID);

從客戶端模型讀取字元方向。

參數

  • objID — 僅在指定單參數形式中的可選物件:serial 數字/十六進位字串、「self」、「lasttarget」或名稱 AddObject。這不是graphic/type。不爭論,就讀出了自己的性格。在讀取另一個物件之前,檢查UO.Exists;未知的名稱不會開啟範圍。

傳回值

int - 方向 mobile 沒有運行位: 0=N, 1=NE, 2=E, 3=SE, 4=S, 5=SW, 6=W, 7=NW。對於未知的 mobile 回報 0,這也意味著北方。

行為

  • 讀取已經接收到的本地資料。該請求不會開啟狀態,也不會強制伺服器發送更新。死亡、地圖轉換或物件刪除後,兩次呼叫之間的值可能會改變。
  • C# 區分大小寫。請使用正確的 UO 名稱。數值旗標應與 0 比較;只有回傳型別為 bool 時才使用 bool。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。顯示你的角色的目前值 - 直接腳本

參數與執行流程:

  • 不帶參數的呼叫指的是 self。角色的方向儲存在值中。
  • Convert.ToString 轉換要輸出的數字,不改變結果的意義。
var value = UO.GetDirection();
UO.Print("GetDirection: " + Convert.ToString(value));

2。在應用程式驗證中使用值 - 腳本函數

參數與執行流程:

  • 該值在沒有任何參數的情況下被讀取一次。角色的方向用於所示的計算或條件。
  • 數字閾值是腳本條件的範例,而不是新的客戶端限制。此欄位儲存上述伺服器單元和限制。
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetDirection();
    if (Truth(value == 2))
    {
        UO.Print("Facing east");
    }

    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。讀取所選物件的屬性 - 腳本類

參數與執行流程:

  • 單一參數選擇物件lasttarget;其serial必須為客戶所知。圖文/type這裡就不轉了。
  • 即使Exists為正,另一個物件的資料也可能是未知的。對於包中物品的座標,獲取的是容器的位置,而不是世界點。
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(UO.Exists("lasttarget")))
        {
            var targetValue = UO.GetDirection("lasttarget");
            UO.Print("Selected value: " + Convert.ToString(targetValue));
        }
        else
        {
            UO.Print("Target is not loaded");
        }

        return null;
    }

    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.GetDirection() — UO.GetDirection()

參數: 沒有參數。

結果: int / Integer.

呼叫時:

呼叫時執行已儲存的處理函式 delegate。註冊方法在建立 API 時建立此 delegate。

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

() => bridge.GetDir(bridge.Self)

建立 API: 這些函式負責註冊 API,不會在每次命令呼叫時重新執行。

UO.GetDirection(objID) — UO.GetDirection(Any)

參數: objID (Any)

結果: dynamic / Any.

呼叫時:

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

case "getdirection": return new InjectionValue(bridge.GetDir(Arg(0)));

UO.GetPathArray

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

C# 簽章

dynamic UO.GetPathArray(object? xdst, object? ydst, object? optimized, object? accuracy);

返回從角色目前位置到 X/Y 的路徑,而不執行移動。

參數

  • xdst — 目的地世界座標X,0..65535。這不是 serial 或阿甘內的位置。
  • ydst — 目的地的世界 Y 座標,0..65535。
  • optimized - true 允許對角過渡; false 在這種相容形式中留下四個直線方向。這和MoveXY中的Optimized的意思不同。
  • accuracy — 單元格中 X 和 Y 的公差:兩個偏差都必須在其中。值限制在0..20範圍內; 0 需要精確的 X/Y。

傳回值

記錄數組[x,y,z],每個欄位為int。外層數組的[0]為起點;最後一個條目在指定的目標容差範圍內。僅非空數組,步數為ArrayLength(path)-1。空數組[]意味著未獲得完整的有效路徑(無法到達的目標/地圖、限製或搜尋限制)。如果起點已經合適,則傳回一筆記錄,步數為0。不返回部分路徑。

行為

  • 團隊只計算路線;它不會開始移動或打開門。要執行,請使用NewMoveXY/MoveXYZ 並檢查它們自己的結果。
  • 搜尋透過考慮相鄰移動具有相同的成本來避免障礙;在恆定地圖上,尋找步數最少的路徑。檢查每根肋骨的實際通暢情況,包括客戶對角線的高度和限制。
  • UO.LimitMove 控制目的地距離:預設 2000,0 無限制。沒有隱藏的 4096 步/節點或 10000 節點上限。工作分批執行並可停止。GetPathArray 會套用 moveThroughNPC 的體力門檻與 moveOpenDoor。
  • 在客戶端中,計算分為最多 32 個節點的部分,節點之間的預算檢查約為 1 毫秒。兩次服務之間會檢查取消情況。讀取卡片仍保留在遊戲線程中;它不承諾固定的單一磁碟讀取時間。
  • 驗證後地圖可能會發生變化:角色移動、門關閉、伺服器修正情況。產生的陣列是可用本地資料的計劃,而不是伺服器確認。
  • SetBadLocation 排除单元格,SetBadObject 排除合适加载的世界对象周围的区域。使用请求时运行时列表的快照;其他发射的禁令不会被继承。不檢查起始單元格的狀態:它由呼叫程式碼指定。您不能使用牆內的任意 Z 作為有效的起始位置。
  • 目前地圖與起始 X/Y/Z 來自角色,Z 容許誤差為 255。moveThroughNPC 提供體力門檻,moveOpenDoor 允許規劃通過門的路線。GetPathArray 不會開門或移動角色。

獨立的 C# 腳本

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

簡單範例

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

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

object? result = UO.GetPathArray(UO.GetX() + 5, UO.GetY(), true, 0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1。找出步數 - 直接腳本

參數與執行流程:

  • Xdst - 東邊五個單元格; Ydst 前者;優化=true;準確度=0。
  • 計數包括起點。僅在檢查非空數組後才執行減法 1。
var path = UO.GetPathArray(UO.GetX() + 5, UO.GetY(), true, 0);
var count = ArrayLength(path);
if (Truth(count > 0))
{
    UO.Print("Steps: " + Convert.ToString(count - 1));
}
else
{
    UO.Print("Complete path is unavailable");
}

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;

2。枚舉路線座標 - 腳本函數

參數與執行流程:

  • 目標1445/1690; Optimized=false 排除對角線;精度 =1 解析公差方塊中最接近的單元格。
  • 點[0]/[1]/[2] - X/Y/Z。它不是 graphic、serial 或表面類型。
return  RunScenario();
 object? RunScenario()
{
    var path = UO.GetPathArray(1445, 1690, false, 1);
    var i = 0;
    while (Truth(i < ArrayLength(path)))
    {
        var point = path[i];
        UO.Print(Convert.ToString(point[0]) + "," + Convert.ToString(point[1]) + "," + Convert.ToString(point[2]));
        i = i + 1;
    }

    return null;
}

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;

3。在單一移動命令之前檢查路徑 - 腳本類

參數與執行流程:

  • 第一隊只計算路徑。第二個再檢查/執行動作,回呼=0,超時=5000。
  • 如果你只是需要走,初步的GetPathArray是可選的,並且增加了工作量。
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 x = UO.GetX() + 3;
        var y = UO.GetY();
        var path = UO.GetPathArray(x, y, true, 0);
        if (Truth(ArrayLength(path) > 0))
        {
            var ok = UO.NewMoveXY(x, y, true, 0, false, 0, 5000);
            UO.Print("Movement result: " + Convert.ToString(ok));
        }

        return null;
    }

    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.GetPathArray(xdst, ydst, optimized, accuracy) — UO.GetPathArray(Any,Any,Any,Any)

參數: xdst (Any), ydst (Any), optimized (Any), accuracy (Any)

結果: dynamic / Any.

呼叫時:

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

case "getpatharray":

                    return BuildPortablePath(bridge.GetX(bridge.Self), bridge.GetY(bridge.Self), bridge.GetZ(bridge.Self),

                        Arg(0), Arg(1), bridge.GetZ(bridge.Self), bridge.WorldNumber, Arg(3), 255, Arg(2) != 0, false);

UO.GetPathArray3D

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

C# 簽章

dynamic UO.GetPathArray3D(object? startX, object? startY, object? startZ, object? finishX, object? finishY, object? finishZ, object? map, object? accuracyXY, object? accuracyZ, object? run);
dynamic UO.GetPathArray3D(object? startX, object? startY, object? startZ, object? finishX, object? finishY, object? finishZ, object? map, object? accuracyXY, object? accuracyZ, object? run, object? maxSteps);
dynamic UO.GetPathArray3D(object? startX, object? startY, object? startZ, object? finishX, object? finishY, object? finishZ, object? map, object? accuracyXY, object? accuracyZ, object? run, object? maxSteps, object? maxDistance);
dynamic UO.GetPathArray3D(object? startX, object? startY, object? startZ, object? finishX, object? finishY, object? finishZ, object? map, object? accuracyXY, object? accuracyZ, object? run, object? maxSteps, object? maxDistance, object? avoidMobiles);
dynamic UO.GetPathArray3D(object? startX, object? startY, object? startZ, object? finishX, object? finishY, object? finishZ, object? map, object? accuracyXY, object? accuracyZ, object? run, object? maxSteps, object? maxDistance, object? avoidMobiles, object? avoidStatics);
dynamic UO.GetPathArray3D(object? startX, object? startY, object? startZ, object? finishX, object? finishY, object? finishZ, object? map, object? accuracyXY, object? accuracyZ, object? run, object? maxSteps, object? maxDistance, object? avoidMobiles, object? avoidStatics, object? allowDoors);
dynamic UO.GetPathArray3D(object? startX, object? startY, object? startZ, object? finishX, object? finishY, object? finishZ, object? map, object? accuracyXY, object? accuracyZ, object? run, object? maxSteps, object? maxDistance, object? avoidMobiles, object? avoidStatics, object? allowDoors, object? allowDiagonal);

使用高度控制和附加濾波器計算世界上兩點之間的完整路徑的陣列。

參數

  • startX — 初始世界 X, 0..65535.
  • startY — 初始世界 Y, 0..65535.
  • startZ — 初始高度 -128..127。
  • finishX — 目標世界 X,0..65535。
  • finishY — 目標世界 Y,0..65535。
  • finishZ — 目標高度 —128..127.
  • map — 目前載入的卡片的編號,例如UO.WorldNum()。另一個地圖給出一個空數組,包括匹配的 X/Y/Z。
  • accuracyXY — 單元格中 X 和 Y 的公差:兩個偏差都必須在其中。值限制在0..20範圍內; 0 需要精確的 X/Y。
  • accuracyZ — 高度公差:abs(實際 Z - 要求 Z),有限 0..255。零需要精確的高度; 255 實際上禁用 Z 限制。
  • run - 必需的相容運行標誌。該請求不會移動任何東西;在這種形式中,Optimized 始終是true,因此運行不會改變單元格的順序或步驟數。
  • UO.LimitMove 控制目的地距離:預設 2000,0 無限制。沒有隱藏的 4096 步/節點或 10000 節點上限。工作分批執行並可停止。GetPathArray 會套用 moveThroughNPC 的體力門檻與 moveOpenDoor。
  • maxSteps — 選填的路線邊數,不含起點。maxSteps > 0 設定上限;0、負數或省略表示不限制步數。UO.LimitMove 另行檢查目的地距離。
  • maxDistance — 到目標的初始距離 max(abs(dx),abs(dy)) 的可選限制。 0/缺席會禁用它。這不是遍歷過程中允許的偏差,也不是找到的路徑的長度。
  • avoidMobiles - true 排除 X/Y 載入的字符,self 除外,透過呼叫開始時的快照;不考慮該過濾器的高度。預設為false。正常的客戶許可檢查仍然適用。
  • avoidStatics - true 排除具有任何靜態條目的單元格,即使是可遍歷的或處於不同高度的單元格。預設為false。這是嚴格的過濾,而不僅僅是禁止不可逾越的圍牆。
  • allowDoors - true 允許透過找到的門磚進行試探性路徑,即使關閉的門未通過正常檢查。預設為false。門打不開;執行期間必須再次檢查訪問、Z 和磁導率。
  • allowDiagonal - true/缺席允許八個方向進行角度檢查; false - 只有四個前進方向。

傳回值

記錄數組[x,y,z],每個欄位為int。外層數組的[0]為起點;最後一個條目在指定的目標容差範圍內。僅非空數組,步數為ArrayLength(path)-1。空數組[]意味著未獲得完整的有效路徑(無法到達的目標/地圖、限製或搜尋限制)。如果起點已經合適,則傳回一筆記錄,步數為0。不返回部分路徑。

行為

  • 團隊只計算路線;它不會開始移動或打開門。要執行,請使用NewMoveXY/MoveXYZ 並檢查它們自己的結果。
  • 搜尋透過考慮相鄰移動具有相同的成本來避免障礙;在恆定地圖上,尋找步數最少的路徑。檢查每根肋骨的實際通暢情況,包括客戶對角線的高度和限制。
  • UO.LimitMove 控制目的地距離:預設 2000,0 無限制。沒有隱藏的 4096 步/節點或 10000 節點上限。工作分批執行並可停止。GetPathArray 會套用 moveThroughNPC 的體力門檻與 moveOpenDoor。
  • 在客戶端中,計算分為最多 32 個節點的部分,節點之間的預算檢查約為 1 毫秒。兩次服務之間會檢查取消情況。讀取卡片仍保留在遊戲線程中;它不承諾固定的單一磁碟讀取時間。
  • 驗證後地圖可能會發生變化:角色移動、門關閉、伺服器修正情況。產生的陣列是可用本地資料的計劃,而不是伺服器確認。
  • SetBadLocation 排除单元格,SetBadObject 排除合适加载的世界对象周围的区域。使用请求时运行时列表的快照;其他发射的禁令不会被继承。不檢查起始單元格的狀態:它由呼叫程式碼指定。您不能使用牆內的任意 Z 作為有效的起始位置。

獨立的 C# 腳本

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

簡單範例

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

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

object? result = UO.GetPathArray3D(UO.GetX(), UO.GetY(), UO.GetZ(), UO.GetX() + 4, UO.GetY(), UO.GetZ(), UO.WorldNum(), 0, 0, false);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1。具有精確公差的相同高度路徑 - 直接腳本

參數與執行流程:

  • 前三個值是原來的X/Y/Z;接下來的三個是目的。
  • map=WorldNum(), accuracyXY=0, accuracyZ=0 需要精確位置。 run=false 不會觸發步行。
var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
var path = UO.GetPathArray3D(x, y, z, x + 4, y, z, UO.WorldNum(), 0, 0, false);
if (Truth(ArrayLength(path) > 0))
{
    UO.Print("Steps: " + Convert.ToString(ArrayLength(path) - 1));
}

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;

2。所有帶有過濾器的參數都是腳本函數

參數與執行流程:

  • 目標 1445/1690/20;accuracyXY=1,accuracyZ=2; run=true 仍然是相容性標誌。
  • maxSteps=80, maxDistance=30; avoidMobiles=true, avoidStatics=false, allowDoors=true, allowDiagonal=false。數組可能為空。
  • 門間隙是一個規劃假設;不保證開放和通過。
return  RunScenario();
 object? RunScenario()
{
    var path = UO.GetPathArray3D(UO.GetX(), UO.GetY(), UO.GetZ(), 1445, 1690, 20, UO.WorldNum(), 1, 2, true, 80, 30, true, false, true, false);
    UO.Print("Points: " + Convert.ToString(ArrayLength(path)));
    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

3。閱讀達到的最後一點 - 腳本類

參數與執行流程:

  • accuracyXY=2/accuracyZ=5解析最近的合適點; maxSteps=100。
  • 最後是計劃中的最後一個條目,而不是角色的當前位置。球隊沒有動他。
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 path = UO.GetPathArray3D(UO.GetX(), UO.GetY(), UO.GetZ(), 1445, 1690, 0, UO.WorldNum(), 2, 5, false, 100);
        var count = ArrayLength(path);
        if (Truth(count > 0))
        {
            var last = path[count - 1];
            UO.Print("X=" + Convert.ToString(last[0]) + " Y=" + Convert.ToString(last[1]) + " Z=" + Convert.ToString(last[2]));
        }

        return null;
    }

    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.GetPathArray3D(startX, startY, startZ, finishX, finishY, finishZ, map, accuracyXY, accuracyZ, run) — UO.GetPathArray3D(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

參數: startX (Any), startY (Any), startZ (Any), finishX (Any), finishY (Any), finishZ (Any), map (Any), accuracyXY (Any), accuracyZ (Any), run (Any)

結果: dynamic / Array.

呼叫時:

呼叫時執行已儲存的處理函式 delegate。註冊方法在建立 API 時建立此 delegate。

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

values => CompactGetPathArray3D(values)

UO.GetPathArray3D(startX, startY, startZ, finishX, finishY, finishZ, map, accuracyXY, accuracyZ, run, maxSteps) — UO.GetPathArray3D(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

參數: startX (Any), startY (Any), startZ (Any), finishX (Any), finishY (Any), finishZ (Any), map (Any), accuracyXY (Any), accuracyZ (Any), run (Any), maxSteps (Any)

結果: dynamic / Array.

呼叫時:

呼叫時執行已儲存的處理函式 delegate。註冊方法在建立 API 時建立此 delegate。

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

values => CompactGetPathArray3D(values)

UO.GetPathArray3D(startX, startY, startZ, finishX, finishY, finishZ, map, accuracyXY, accuracyZ, run, maxSteps, maxDistance) — UO.GetPathArray3D(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

參數: startX (Any), startY (Any), startZ (Any), finishX (Any), finishY (Any), finishZ (Any), map (Any), accuracyXY (Any), accuracyZ (Any), run (Any), maxSteps (Any), maxDistance (Any)

結果: dynamic / Array.

呼叫時:

呼叫時執行已儲存的處理函式 delegate。註冊方法在建立 API 時建立此 delegate。

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

values => CompactGetPathArray3D(values)

UO.GetPathArray3D(startX, startY, startZ, finishX, finishY, finishZ, map, accuracyXY, accuracyZ, run, maxSteps, maxDistance, avoidMobiles) — UO.GetPathArray3D(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

參數: startX (Any), startY (Any), startZ (Any), finishX (Any), finishY (Any), finishZ (Any), map (Any), accuracyXY (Any), accuracyZ (Any), run (Any), maxSteps (Any), maxDistance (Any), avoidMobiles (Any)

結果: dynamic / Array.

呼叫時:

呼叫時執行已儲存的處理函式 delegate。註冊方法在建立 API 時建立此 delegate。

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

values => CompactGetPathArray3D(values)

UO.GetPathArray3D(startX, startY, startZ, finishX, finishY, finishZ, map, accuracyXY, accuracyZ, run, maxSteps, maxDistance, avoidMobiles, avoidStatics) — UO.GetPathArray3D(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

參數: startX (Any), startY (Any), startZ (Any), finishX (Any), finishY (Any), finishZ (Any), map (Any), accuracyXY (Any), accuracyZ (Any), run (Any), maxSteps (Any), maxDistance (Any), avoidMobiles (Any), avoidStatics (Any)

結果: dynamic / Array.

呼叫時:

呼叫時執行已儲存的處理函式 delegate。註冊方法在建立 API 時建立此 delegate。

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

values => CompactGetPathArray3D(values)

UO.GetPathArray3D(startX, startY, startZ, finishX, finishY, finishZ, map, accuracyXY, accuracyZ, run, maxSteps, maxDistance, avoidMobiles, avoidStatics, allowDoors) — UO.GetPathArray3D(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

參數: startX (Any), startY (Any), startZ (Any), finishX (Any), finishY (Any), finishZ (Any), map (Any), accuracyXY (Any), accuracyZ (Any), run (Any), maxSteps (Any), maxDistance (Any), avoidMobiles (Any), avoidStatics (Any), allowDoors (Any)

結果: dynamic / Array.

呼叫時:

呼叫時執行已儲存的處理函式 delegate。註冊方法在建立 API 時建立此 delegate。

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

values => CompactGetPathArray3D(values)

UO.GetPathArray3D(startX, startY, startZ, finishX, finishY, finishZ, map, accuracyXY, accuracyZ, run, maxSteps, maxDistance, avoidMobiles, avoidStatics, allowDoors, allowDiagonal) — UO.GetPathArray3D(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

參數: startX (Any), startY (Any), startZ (Any), finishX (Any), finishY (Any), finishZ (Any), map (Any), accuracyXY (Any), accuracyZ (Any), run (Any), maxSteps (Any), maxDistance (Any), avoidMobiles (Any), avoidStatics (Any), allowDoors (Any), allowDiagonal (Any)

結果: dynamic / Array.

呼叫時:

呼叫時執行已儲存的處理函式 delegate。註冊方法在建立 API 時建立此 delegate。

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

values => CompactGetPathArray3D(values)

UO.GetRun

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

C# 簽章

int UO.GetRun();
int UO.GetRun(object? id);

檢查最後已知方向 mobile 上的運行標誌。

參數

  • id - 必需的 serial/ID 具體對象: int、十六進位字串或別名 self, backpack, lasttarget, lastobject, lastcontainer、laststatus、finitem、lastcorpse 或名稱 AddObject。這不是 graphic/type。未指定的名稱被解析為 0;該指令不會開啟任何新目標。 U GetRun 還有一個表格 GetRun() 為了 self.

傳回值

int 1 - 加载的mobile具有Direction.Running属性。 int 0 - 属性丢失,对象不是 mobile、未知或已删除。停止後可以保留最後運行的標誌。這不是路線的活動,也不是速度或剩餘步數。要移動self,也請使用Moving()。

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

行為

  • 讀取本機用戶端模型;無需向伺服器發出請求,無需等待或移動。
  • 結果指的是閱讀的那一刻。在UO.Wait或其他操作之後,物件及其標誌可能會發生變化。
  • 停止後可以保留最後運行的標誌。這不是路線的活動,也不是速度或剩餘步數。要移動 self 也可以使用 Moving()。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。檢查自己的狀態-直接腳本

參數與執行流程:

  • self 參數明確選擇其字元。狀態 - 僅1/0。
  • 停止後可以保留最後運行的標誌。這不是路線的活動,也不是速度或剩餘步數。要移動 self 也可以使用 Moving()。
var state = UO.GetRun("self");
var moving = UO.Moving();
UO.Print("Running flag: " + Convert.ToString(state));
UO.Print("Self movement active: " + Convert.ToString(moving));

2。檢查選定的mobile - 腳本功能

參數與執行流程:

  • IsNpc 排除主體和未知客體。 target 儲存單一serial,而不是對不斷變化的lasttarget 的即時引用。
  • 結果引用 Direction.Running 欄位。僅在客戶端收到適當的狀態後才會更新資料。
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.GetRun(target);
        UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    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(500) — 以毫秒為單位暫停。之後,單獨檢查mobile是否仍然存在。
  • 比較兩個影像。可能會錯過中間的更改,並且這不是對伺服器事件的連續訂閱。
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
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;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var target = UO.GetSerial("lasttarget");
        if (Truth(UO.IsNPC(target)))
        {
            var before = UO.GetRun(target);
            await Delay(500);
            if (Truth(UO.IsNPC(target)))
            {
                var after = UO.GetRun(target);
                if (Truth(before != after))
                {
                    UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
                }
            }
            else
            {
                UO.Print("Mobile left the local world");
            }
        }

        return null;
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    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.GetRun() — UO.GetRun()

參數: 沒有參數。

結果: int / Integer.

呼叫時:

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

public int GetRun() => bridge.GetRun(bridge.Self);

UO.GetRun(id) — UO.GetRun(Any)

參數: id (Any)

結果: int / Integer.

呼叫時:

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

public int GetRun(InjectionValue id) => bridge.GetRun(GetObject(id));

UO.GetRunMountTimer

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

C# 簽章

dynamic UO.GetRunMountTimer();

顯示一匹馬跑步的配置間隔(以毫秒為單位)。對於在暫時放慢速度之前檢查模式、估計時間和保存設定很有用。

參數

沒有參數。

傳回值

int 從 100 到 2000(含) - 配置的時間間隔以毫秒為單位。默认为100。這是次數,不是true/false,不是ID,也不是通過的單元格數量。

行為

  • 此設定適用於騎乘模式。標準和最小允許值為100 ms;上限為2000毫秒。其他三種模式有單獨的設定。
  • 這是角色的本地移動間隔,而不是 ping、FPS、尋路超時或測量的伺服器步驟持續時間。增加數量會減慢移動速度;低於標準間隔不會加快資料包的發送速度。
  • 隊伍本身不會開始移動,不會登上坐騎,也不會改變步行/跑步模式。駕駛時選擇模式;客戶端也會考慮伺服器指定的速度模式和航班。
  • 此設定對於該客戶端的移動是通用的:可以透過手動控制、地圖路線和其他腳本來使用。暫時更改,保留先前的值,操作結束後恢復;不要同時從多個程式更改一種模式。
  • 轉身和斜步與正常動作不同。伺服器確認、通訊延遲和障礙可能會增加實際時間。客戶端不會發送一系列加速步驟來彌補遺失的幀。

獨立的 C# 腳本

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

簡單範例

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

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

object? result = UO.GetRunMountTimer();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1。檢查目前間隔 - 直接腳本

參數與執行流程:

  • UO.GetRunMountTimer() 的呼叫不帶參數。 delayMs-騎馬奔跑的間隔;其他模式這裡不進行測量。
var delayMs = UO.GetRunMountTimer();
UO.Print("Movement delay, ms: " + Convert.ToString(delayMs));

2。估計延誤對短程路線的影響 - 場景函數

參數與執行流程:

  • 步驟=5是要評估的步驟數,而不是指令參數。乘法僅給出配置延遲的貢獻;它不是到達時間或路線超時的承諾。
return  RunScenario();
 object? RunScenario()
{
    var steps = 5;
    var delayMs = UO.GetRunMountTimer();
    var estimateMs = steps * delayMs;
    UO.Print("Step-delay budget, ms: " + Convert.ToString(estimateMs));
    return null;
}

3。刪除先前新增的減速 - 腳本類

參數與執行流程:

  • 前一個與 100 毫秒進行比較。标准间隔设置完毕,其他三种模式被保存。角色不会从挑战本身移动到任何地方。
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 previous = UO.GetRunMountTimer();
        if (Truth(previous > 100))
        {
            UO.SetRunMountTimer(100);
        }

        return null;
    }

    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.GetRunMountTimer() — UO.GetRunMountTimer()

參數: 沒有參數。

結果: dynamic / Any.

呼叫時:

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

case "getrunmounttimer": return new InjectionValue(state.RunMountTimer);

UO.GetRunUnMountTimer

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

C# 簽章

dynamic UO.GetRunUnMountTimer();

顯示配置的一步步行間隔(以毫秒為單位)。對於在暫時放慢速度之前檢查模式、估計時間和保存設定很有用。

參數

沒有參數。

傳回值

int 從 200 到 2000(含) - 配置的時間間隔以毫秒為單位。默认为200。這是次數,不是true/false,不是ID,也不是通過的單元格數量。

行為

  • 此設定適用於步行模式。標準和最小允許值為200 ms;上限為2000毫秒。其他三種模式有單獨的設定。
  • 這是角色的本地移動間隔,而不是 ping、FPS、尋路超時或測量的伺服器步驟持續時間。增加數量會減慢移動速度;低於標準間隔不會加快資料包的發送速度。
  • 隊伍本身不會開始移動,不會登上坐騎,也不會改變步行/跑步模式。駕駛時選擇模式;客戶端也會考慮伺服器指定的速度模式和航班。
  • 此設定對於該客戶端的移動是通用的:可以透過手動控制、地圖路線和其他腳本來使用。暫時更改,保留先前的值,操作結束後恢復;不要同時從多個程式更改一種模式。
  • 轉身和斜步與正常動作不同。伺服器確認、通訊延遲和障礙可能會增加實際時間。客戶端不會發送一系列加速步驟來彌補遺失的幀。

獨立的 C# 腳本

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

簡單範例

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

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

object? result = UO.GetRunUnMountTimer();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1。檢查目前間隔 - 直接腳本

參數與執行流程:

  • UO.GetRunUnmountTimer() 的呼叫不帶參數。 delayMs-步行跑步的間隔;其他模式這裡不進行測量。
var delayMs = UO.GetRunUnMountTimer();
UO.Print("Movement delay, ms: " + Convert.ToString(delayMs));

2。估計延誤對短程路線的影響 - 場景函數

參數與執行流程:

  • 步驟=5是要評估的步驟數,而不是指令參數。乘法僅給出配置延遲的貢獻;它不是到達時間或路線超時的承諾。
return  RunScenario();
 object? RunScenario()
{
    var steps = 5;
    var delayMs = UO.GetRunUnMountTimer();
    var estimateMs = steps * delayMs;
    UO.Print("Step-delay budget, ms: " + Convert.ToString(estimateMs));
    return null;
}

3。刪除先前新增的減速 - 腳本類

參數與執行流程:

  • 前一個與 200 毫秒進行比較。标准间隔设置完毕,其他三种模式被保存。角色不会从挑战本身移动到任何地方。
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 previous = UO.GetRunUnMountTimer();
        if (Truth(previous > 200))
        {
            UO.SetRunUnmountTimer(200);
        }

        return null;
    }

    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.GetRunUnMountTimer() — UO.GetRunUnMountTimer()

參數: 沒有參數。

結果: dynamic / Any.

呼叫時:

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

case "getrununmounttimer": return new InjectionValue(state.RunUnmountTimer);

UO.GetWalkMountTimer

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

C# 簽章

dynamic UO.GetWalkMountTimer();

顯示配置的騎馬一步的間隔(以毫秒為單位)。對於在暫時放慢速度之前檢查模式、估計時間和保存設定很有用。

參數

沒有參數。

傳回值

int 從 200 到 2000(含) - 配置的時間間隔以毫秒為單位。默认为200。這是次數,不是true/false,不是ID,也不是通過的單元格數量。

行為

  • 此設定適用於騎乘模式。標準和最小允許值為200 ms;上限為2000毫秒。其他三種模式有單獨的設定。
  • 這是角色的本地移動間隔,而不是 ping、FPS、尋路超時或測量的伺服器步驟持續時間。增加數量會減慢移動速度;低於標準間隔不會加快資料包的發送速度。
  • 隊伍本身不會開始移動,不會登上坐騎,也不會改變步行/跑步模式。駕駛時選擇模式;客戶端也會考慮伺服器指定的速度模式和航班。
  • 此設定對於該客戶端的移動是通用的:可以透過手動控制、地圖路線和其他腳本來使用。暫時更改,保留先前的值,操作結束後恢復;不要同時從多個程式更改一種模式。
  • 轉身和斜步與正常動作不同。伺服器確認、通訊延遲和障礙可能會增加實際時間。客戶端不會發送一系列加速步驟來彌補遺失的幀。
  • 在常規用戶端主機中,此狀態資料取自GetPersistentState管理器,並且對於同一世界/設定檔的腳本/聊天/巨集是通用的,且不屬於一個腳本。另一個進程或明顯獨立的InjectionRuntimeState具有不同的狀態。載入/清除設定檔可以取代它;已儲存的serial仍然會根據載入的世界進行檢查。

獨立的 C# 腳本

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

簡單範例

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

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

object? result = UO.GetWalkMountTimer();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1。檢查目前間隔 - 直接腳本

參數與執行流程:

  • UO.GetWalkMountTimer() 的呼叫不帶參數。 delayMs-騎馬行走的間隔;其他模式這裡不進行測量。
var delayMs = UO.GetWalkMountTimer();
UO.Print("Movement delay, ms: " + Convert.ToString(delayMs));

2。估計延誤對短程路線的影響 - 場景函數

參數與執行流程:

  • 步驟=5是要評估的步驟數,而不是指令參數。乘法僅給出配置延遲的貢獻;它不是到達時間或路線超時的承諾。
return  RunScenario();
 object? RunScenario()
{
    var steps = 5;
    var delayMs = UO.GetWalkMountTimer();
    var estimateMs = steps * delayMs;
    UO.Print("Step-delay budget, ms: " + Convert.ToString(estimateMs));
    return null;
}

3。刪除先前新增的減速 - 腳本類

參數與執行流程:

  • 前一個與 200 毫秒進行比較。标准间隔设置完毕,其他三种模式被保存。角色不会从挑战本身移动到任何地方。
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 previous = UO.GetWalkMountTimer();
        if (Truth(previous > 200))
        {
            UO.SetWalkMountTimer(200);
        }

        return null;
    }

    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.GetWalkMountTimer() — UO.GetWalkMountTimer()

參數: 沒有參數。

結果: dynamic / Any.

呼叫時:

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

case "getwalkmounttimer": return new InjectionValue(state.WalkMountTimer);

UO.GetWalkUnmountTimer

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

C# 簽章

dynamic UO.GetWalkUnmountTimer();

顯示配置的一步步行間隔(以毫秒為單位)。對於在暫時放慢速度之前檢查模式、估計時間和保存設定很有用。

參數

沒有參數。

傳回值

int 從 400 到 2000(含) - 配置的時間間隔以毫秒為單位。默认为400。這是次數,不是true/false,不是ID,也不是通過的單元格數量。

行為

  • 此設定適用於步行模式。標準和最小允許值為400 ms;上限為2000毫秒。其他三種模式有單獨的設定。
  • 這是角色的本地移動間隔,而不是 ping、FPS、尋路超時或測量的伺服器步驟持續時間。增加數量會減慢移動速度;低於標準間隔不會加快資料包的發送速度。
  • 隊伍本身不會開始移動,不會登上坐騎,也不會改變步行/跑步模式。駕駛時選擇模式;客戶端也會考慮伺服器指定的速度模式和航班。
  • 此設定對於該客戶端的移動是通用的:可以透過手動控制、地圖路線和其他腳本來使用。暫時更改,保留先前的值,操作結束後恢復;不要同時從多個程式更改一種模式。
  • 轉身和斜步與正常動作不同。伺服器確認、通訊延遲和障礙可能會增加實際時間。客戶端不會發送一系列加速步驟來彌補遺失的幀。
  • 在常規用戶端主機中,此狀態資料取自GetPersistentState管理器,並且對於同一世界/設定檔的腳本/聊天/巨集是通用的,且不屬於一個腳本。另一個進程或明顯獨立的InjectionRuntimeState具有不同的狀態。載入/清除設定檔可以取代它;已儲存的serial仍然會根據載入的世界進行檢查。

獨立的 C# 腳本

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

簡單範例

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

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

object? result = UO.GetWalkUnmountTimer();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1。檢查目前間隔 - 直接腳本

參數與執行流程:

  • UO.GetWalkUnmountTimer() 的呼叫不帶參數。 delayMs——步行間隔;其他模式這裡不進行測量。
var delayMs = UO.GetWalkUnmountTimer();
UO.Print("Movement delay, ms: " + Convert.ToString(delayMs));

2。估計延誤對短程路線的影響 - 場景函數

參數與執行流程:

  • 步驟=5是要評估的步驟數,而不是指令參數。乘法僅給出配置延遲的貢獻;它不是到達時間或路線超時的承諾。
return  RunScenario();
 object? RunScenario()
{
    var steps = 5;
    var delayMs = UO.GetWalkUnmountTimer();
    var estimateMs = steps * delayMs;
    UO.Print("Step-delay budget, ms: " + Convert.ToString(estimateMs));
    return null;
}

3。刪除先前新增的減速 - 腳本類

參數與執行流程:

  • 前一個與 400 毫秒進行比較。标准间隔设置完毕,其他三种模式被保存。角色不会从挑战本身移动到任何地方。
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 previous = UO.GetWalkUnmountTimer();
        if (Truth(previous > 400))
        {
            UO.SetWalkUnmountTimer(400);
        }

        return null;
    }

    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.GetWalkUnmountTimer() — UO.GetWalkUnmountTimer()

參數: 沒有參數。

結果: dynamic / Any.

呼叫時:

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

case "getwalkunmounttimer": return new InjectionValue(state.WalkUnmountTimer);

UO.IsMoving

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

C# 簽章

int UO.IsMoving();

檢查角色的動作。

參數

沒有參數。

傳回值

int bool (1/0): 1 - 自動探路器處於活動狀態或角色佇列中仍有步驟; 0 - 兩者皆缺失或角色未載入。這並不是對實現目標或步驟數量的確認。

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

行為

  • 讀取已經接收到的本地資料。該請求不會開啟狀態,也不會強制伺服器發送更新。死亡、地圖轉換或物件刪除後,兩次呼叫之間的值可能會改變。
  • C# 區分大小寫。請使用正確的 UO 名稱。數值旗標應與 0 比較;只有回傳型別為 bool 時才使用 bool。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。檢查自己的狀態-直接腳本

參數與執行流程:

  • 空括號讀作 self。活動 — 編號 1 或 0;訊息文字用作分支處理的範例。
  • 1 - 自動探路器處於活動狀態或角色佇列中仍有步驟; 0 - 兩者皆缺失或角色未載入。這並不是對實現目標或步驟數量的確認。
var active = UO.IsMoving();
if (Truth(active))
{
    UO.Print("State is active");
}
else
{
    UO.Print("State is inactive or unavailable");
}

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

2。检查字符是否存在是脚本的一个功能

參數與執行流程:

  • 這個指令沒有物件參數:即使在 Exists(self) 之後,它也只會讀取自己的狀態。
  • Exists(self) 與請求的標誌分開檢查玩家的負載。世界可能會在支票之間發生變化。
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("self")))
    {
        var state = UO.IsMoving();
        UO.Print("State 1/0: " + Convert.ToString(state));
    }

    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。通知狀態變更而無需無限期等待 - 腳本類

參數與執行流程:

  • 兩個不帶參數的呼叫讀取self; UO.Wait(500) - 暫停半秒。
  • 比較兩個標誌快照。镜头之间的过渡可能会被跳过;它不是对所有服务器事件的订阅。
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
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;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.IsMoving();
        await Delay(500);
        var after = UO.IsMoving();
        if (Truth(before != after))
        {
            UO.Print("State changed from " + Convert.ToString(before) + " to " + Convert.ToString(after));
        }

        return null;
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    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.IsMoving() — UO.IsMoving()

參數: 沒有參數。

結果: int / Integer.

呼叫時:

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

public int IsMoving() => bridge.IsMoving();

UO.IsRunning

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

C# 簽章

int UO.IsRunning(object? objID);

檢查最後已知方向 mobile 上的運行標誌。

參數

  • objID - 必需的 serial/ID 具體對象: int、十六進位字串或別名 self, backpack, lasttarget, lastobject, lastcontainer、laststatus、finitem、lastcorpse 或名稱 AddObject。這不是 graphic/type。未指定的名稱被解析為 0;該指令不會開啟任何新目標。參數是必需的;為自己傳遞 self.

傳回值

int 1 - 加载的mobile具有Direction.Running属性。 int 0 - 属性丢失,对象不是 mobile、未知或已删除。停止後可以保留最後運行的標誌。這不是路線的活動,也不是速度或剩餘步數。要移動self,也請使用Moving()。

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

行為

  • 讀取本機用戶端模型;無需向伺服器發出請求,無需等待或移動。
  • 結果指的是閱讀的那一刻。在UO.Wait或其他操作之後,物件及其標誌可能會發生變化。
  • 停止後可以保留最後運行的標誌。這不是路線的活動,也不是速度或剩餘步數。要移動 self 也可以使用 Moving()。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。檢查自己的狀態-直接腳本

參數與執行流程:

  • self 參數明確選擇其字元。狀態 - 僅1/0。
  • 停止後可以保留最後運行的標誌。這不是路線的活動,也不是速度或剩餘步數。要移動 self 也可以使用 Moving()。
var state = UO.IsRunning("self");
var moving = UO.Moving();
UO.Print("Running flag: " + Convert.ToString(state));
UO.Print("Self movement active: " + Convert.ToString(moving));

2。檢查選定的mobile - 腳本功能

參數與執行流程:

  • IsNpc 排除主體和未知客體。 target 儲存單一serial,而不是對不斷變化的lasttarget 的即時引用。
  • 結果引用 Direction.Running 欄位。僅在客戶端收到適當的狀態後才會更新資料。
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.IsRunning(target);
        UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    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(500) — 以毫秒為單位暫停。之後,單獨檢查mobile是否仍然存在。
  • 比較兩個影像。可能會錯過中間的更改,並且這不是對伺服器事件的連續訂閱。
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
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;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var target = UO.GetSerial("lasttarget");
        if (Truth(UO.IsNPC(target)))
        {
            var before = UO.IsRunning(target);
            await Delay(500);
            if (Truth(UO.IsNPC(target)))
            {
                var after = UO.IsRunning(target);
                if (Truth(before != after))
                {
                    UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
                }
            }
            else
            {
                UO.Print("Mobile left the local world");
            }
        }

        return null;
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    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.IsRunning(objID) — UO.IsRunning(Any)

參數: objID (Any)

結果: int / Integer.

呼叫時:

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

case "isrunning": return new InjectionValue(bridge.GetRun(Arg(0, bridge.Self)));

UO.LastStepQUsedDoor

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

C# 簽章

dynamic UO.LastStepQUsedDoor();
dynamic UO.LastStepQUsedDoor(object? value);

讀取或手動更改最後一個 StepQ 指令的開門嘗試標誌。

參數

  • value — 可選整數。這個數字與參數一起儲存;如果沒有參數,則執行讀取。

傳回值

int — 已儲存標記。通常的StepQ將其重設為0,並且當啟用moveOpenDoor時,記錄TryOpenDoorForStep的結果:如果檢測到嘗試,則記錄1,否則記錄0。手動表格允許其他數字。這不是serial門或對其打開的確認。

行為

  • 檢查不會從伺服器讀取門狀態。回退呼叫 OpenDoor 不會更改零標記。
  • 如果 StepQ 由於連接/耐用性而提前失敗,則尚未執行重置,因此可能會保留先前的值。
  • 在常規用戶端主機中,此狀態資料取自GetPersistentState管理器,並且對於同一世界/設定檔的腳本/聊天/巨集是通用的,且不屬於一個腳本。另一個進程或明顯獨立的InjectionRuntimeState具有不同的狀態。載入/清除設定檔可以取代它;已儲存的serial仍然會根據載入的世界進行檢查。

獨立的 C# 腳本

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

簡單範例

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

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

object? result = UO.LastStepQUsedDoor();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1。閱讀標記-直接腳本

參數與執行流程:

  • 如果沒有參數,則讀取儲存的數字。
  • 不要像 ID 那樣使用 UseObject。
UO.Print(Convert.ToString(UO.LastStepQUsedDoor()));

2。在嘗試步驟之前重置 - 腳本功能

參數與執行流程:

  • value=0 清除之前的標記。方向=2 — E;運行=false。
  • 結果StepQ和門標記有不同的意義。
return  RunScenario();
 object? RunScenario()
{
    UO.LastStepQUsedDoor(0);
    var status = UO.StepQ(2, false);
    UO.Print(Convert.ToString(UO.LastStepQUsedDoor()));
    return null;
}

3。儲存和恢復標記 - 腳本類

參數與執行流程:

  • 上一個 — 已儲存的值。
  • 手動恢復不會對門執行任何操作。
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 previous = UO.LastStepQUsedDoor();
        UO.LastStepQUsedDoor(0);
        UO.Print(Convert.ToString(UO.LastStepQUsedDoor()));
        UO.LastStepQUsedDoor(previous);
        return null;
    }
}

命令實作

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

UO.LastStepQUsedDoor() — UO.LastStepQUsedDoor()

參數: 沒有參數。

結果: dynamic / Any.

呼叫時:

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

case "laststepquseddoor":

                    if (arguments.Length > 0) state.LastStepUsedDoor = Arg(0);

                    return new InjectionValue(state.LastStepUsedDoor);

UO.LastStepQUsedDoor(value) — UO.LastStepQUsedDoor(Any)

參數: value (Any)

結果: dynamic / Any.

呼叫時:

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

case "laststepquseddoor":

                    if (arguments.Length > 0) state.LastStepUsedDoor = Arg(0);

                    return new InjectionValue(state.LastStepUsedDoor);

UO.Move

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

C# 簽章

int UO.Move();

讀取是否有尚未完成的自動路線或角色步驟。

參數

沒有參數。

傳回值

int 1 — 探路者處於活動狀態或步驟保留在角色動畫佇列中; 0 - 兩者皆缺失或角色未載入。這不是步數、達到先前目標的結果,也不是按住滑鼠的標誌。

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

行為

  • 此命令僅讀取狀態。如果結果非零,則更新相容定時器TicksAnim。滑鼠/按鍵請求的步數在保留在佇列中時也會被計數。
  • 若要停止自動路線,請使用MoverStop。 MoveOff 控制其他鍵盤步驟。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。顯示狀態 - 直接腳本

參數與執行流程:

  • 沒有爭論。
  • 0並不能證明目標已經達成:路線本來可以取消。
UO.Print("Movement active or queued: " + Convert.ToString(UO.Move()));

2。有界等待停止 - 腳本函數

參數與執行流程:

  • 100 等待50 毫秒,設定約5 秒的限制。
  • 執行此檢查本身不會啟動或停止運動。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var attempts = 0;
    while (Truth(UO.Move()) && Truth(attempts < 100))
    {
        await Delay(50);
        attempts = attempts + 1;
    }

    UO.Print("Still moving: " + Convert.ToString(UO.Move()));
    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3。停止活動路由 - 腳本類

參數與執行流程:

  • Move() 檢查活動,MoverStop() 刪除路線。
  • 已經發送的資料包仍然可以被伺服器確認。
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(UO.Move()))
        {
            UO.MoverStop();
        }

        return null;
    }

    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.Move() — UO.Move()

參數: 沒有參數。

結果: int / Integer.

呼叫時:

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

public int Move()

        {

            int result = bridge.Move();

            if (result != 0)

                ticksAnim = Timer();

            return result;

        }

UO.MoveOff

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

C# 簽章

void UO.MoveOff();

停用相容的 PMove 關鍵步驟。

參數

沒有參數。

傳回值

void - 無回傳值。使用單獨的線路撥打電話;它不是 true/false 或步數。

行為

  • 更改運行時狀態中的MoveEnabled標誌。這不是通用字元鎖定:NewMoveXY、MoveXYZ、Step 和滑鼠不受此標誌控制。
  • MoveOff 不會停止已經運作的探路者;它需要MoverStop。
  • 在常規用戶端主機中,此狀態資料取自GetPersistentState管理器,並且對於同一世界/設定檔的腳本/聊天/巨集是通用的,且不屬於一個腳本。另一個進程或明顯獨立的InjectionRuntimeState具有不同的狀態。載入/清除設定檔可以取代它;已儲存的serial仍然會根據載入的世界進行檢查。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。更改關鍵步驟解決方案 - 直接腳本

參數與執行流程:

  • 沒有爭論。
  • PMove 標誌已更改,沒有傳回值。
UO.MoveOff();

2。明確允許下一個 PMove - 腳本函數

參數與執行流程:

  • MoveOn包含PMove之前的關鍵步驟; MoveOff正常完成後關閉。
  • 這些是順序命令;禁用標誌並不意味著所有程式都緊急停止。
return  RunScenario();
 object? RunScenario()
{
    UO.MoveOn();
    UO.PMove(UO.GetX() + 1, UO.GetY());
    UO.MoveOff();
    return null;
}

3。單獨關閉步驟並移除自動路線-腳本類

參數與執行流程:

  • 兩隊控制著不同的運動機制。
  • Move()讀取自動路線;不要視為MoveEnabled的測試。
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.MoveOff();
        UO.MoverStop();
        UO.Print(Convert.ToString(UO.Move()));
        return null;
    }
}

命令實作

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

UO.MoveOff() — UO.MoveOff()

參數: 沒有參數。

結果: void / Unit.

呼叫時:

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

public void MoveOff() => bridge.EnableMove(false);

UO.MoveOn

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

C# 簽章

void UO.MoveOn();

啟用相容的 PMove 關鍵步驟。

參數

沒有參數。

傳回值

void - 無回傳值。使用單獨的線路撥打電話;它不是 true/false 或步數。

行為

  • 更改運行時狀態中的MoveEnabled標誌。這不是通用字元鎖定:NewMoveXY、MoveXYZ、Step 和滑鼠不受此標誌控制。
  • MoveOff 不會停止已經運作的探路者;它需要MoverStop。
  • 在常規用戶端主機中,此狀態資料取自GetPersistentState管理器,並且對於同一世界/設定檔的腳本/聊天/巨集是通用的,且不屬於一個腳本。另一個進程或明顯獨立的InjectionRuntimeState具有不同的狀態。載入/清除設定檔可以取代它;已儲存的serial仍然會根據載入的世界進行檢查。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。更改關鍵步驟解決方案 - 直接腳本

參數與執行流程:

  • 沒有爭論。
  • PMove 標誌已更改,沒有傳回值。
UO.MoveOn();

2。明確允許下一個 PMove - 腳本函數

參數與執行流程:

  • MoveOn包含PMove之前的關鍵步驟; MoveOff正常完成後關閉。
  • 這些是順序命令;禁用標誌並不意味著所有程式都緊急停止。
return  RunScenario();
 object? RunScenario()
{
    UO.MoveOn();
    UO.PMove(UO.GetX() + 1, UO.GetY());
    UO.MoveOff();
    return null;
}

3。恢復 PMove 之前的關鍵移動 - 腳本類

參數與執行流程:

  • MoveOn 啟用相容的 PMove 關鍵步驟,且不傳回值。透過座標檢查運動結果; MoveOn 不控制所有運動模式。
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.MoveOn();
        int destinationX = UO.GetX() + 1;
        int destinationY = UO.GetY();
        UO.PMove(destinationX, destinationY);
        UO.Print($"Reached requested tile: {UO.GetX() == destinationX && UO.GetY() == destinationY}");
        return null;
    }
}

命令實作

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

UO.MoveOn() — UO.MoveOn()

參數: 沒有參數。

結果: void / Unit.

呼叫時:

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

public void MoveOn() => bridge.EnableMove(true);

UO.MoveXY

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

C# 簽章

dynamic UO.MoveXY(object? xdst, object? ydst, object? optimized, object? accuracy, object? running);

使用五個必需參數將字元移到 X/Y 並等待結果。

參數

  • xdst — 目的地世界座標X,0..65535。這不是 serial 或阿甘內的位置。
  • ydst — 目的地的世界 Y 座標,0..65535。
  • optimized - true - 搜尋和檢查前進路徑的普通模式; false - 減少啟發式和最近步驟檢查。 false 不会禁用避障功能。
  • accuracy — 單元格中 X 和 Y 的公差:兩個偏差都必須在其中。值限制在0..20範圍內; 0 需要精確的 X/Y。
  • running - true/1 - 運行請求,false/0 - 步驟。伺服器運動延遲仍然存在;這不是速度倍增器。

傳回值

int 1 - 在檢查結束時,角色處於給定容差 X/Y/Z 內,包括當他在挑戰之前已經在那裡時。 int 0 - 座標無效、發射失敗、未到達點或觸發停止條件。不是步數或serial;如果緊急取消,程序將中止而不是正常返回0。

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

行為

  • 完整的 A* 路線是在第一步之前建立的,在客戶端更新之間的一小部分中建構。當Optimized=true時,檢查路徑的下一個4單元格;當false是最近的步驟時。這是對已經計算出的路徑的檢查,而不是整個路線的距離,也不是移動滑鼠時的繞行滑塊。
  • 伺服器故障DenyWalk或新的障礙物要求在完成步驟佇列後從目前位置重新計算。重複次數和重新計算頻率受到限制;沒有路徑可以以0結束運動。
  • 路線屬於啟動它的程序:其緊急停止會取消剩餘的自動路徑。如果另一個跑步或用戶已經替換了該路線,則取消前所有者不會影響新路線。已發送的步驟不會被撤銷。
  • SetBadLocation和SetBadObject用作路徑啟動時當前運行時間禁止的快照。它們在內部重新計算期間被保存。更改或清除清單會影響下一條路線,而不是覆蓋已經在進行中的路線。
  • UO.LimitMove 控制目的地距離:預設 2000,0 無限制。沒有隱藏的 4096 步/節點或 10000 節點上限。工作分批執行並可停止。GetPathArray 會套用 moveThroughNPC 的體力門檻與 moveOpenDoor。
  • 超時在請求被接受後計算,包括搜尋和重新計算的後續部分。 stopOnStuck 不認為正在運行的搜尋是字元卡住的;規劃完成後,不再考慮位置變化。最後的1/0檢查實際座標,而不僅僅是路徑的準備。
  • 結果考慮了客戶的本地位置;後續伺服器修正仍然是可能的。從不同的例程運行競爭的運動命令會改變角色的整體路線。
  • 設定moveCheckStamina、moveExitOnDisconnect、moveOpenDoor、moveThroughCorner、moveThroughNPC、moveHeuristicMult、moveTurnCost 和 moveBetweenTwoCorners 會影響性能。顯式的avoidMobiles/openDoors會覆寫本次呼叫的對應值。
  • 結果0並不能顯示確切的原因。檢查座標、連結、體力和日誌;不要在沒有 UO.Wait 和嘗試次數限制的情況下無休止地重複該動作。
  • 呼叫時取目標Z,公差Z=255。其他限制,請使用NewMoveXY;選擇高度 - MoveXYZ。
  • 主橋記錄請求編號、玩家/探路者/地圖實例和地圖索引。新請求、上下文變更或最終拒絕都會給予 0;在讀取座標和最後一次回調後重複檢查。超時、maxSteps和callback=0僅停止已儲存的請求,而不是新的外部路由。臨時封鎖,雖然恢復仍然有效,但不會失去控球權:等待繼續。對於沒有IApiMovementOwnershipBridge的外部legacy-bridge,保留先前的相容機制。
  • 僅當相應活動請求被拒絕時,通用探路者最多可儲存 8 2000 毫秒的暫時 X/Y/Z 方向禁止。輪換、未知順序、重新同步和舊/外來請求不會產生此類禁止。新的外部請求和地圖/玩家上下文的遺失會清除它們。載入的幾何搜尋嘗試繞過過渡;它不知道所有伺服器障礙。在不更改玩家 X/Y/Z 的情況下,允許最多 8 內部重新計算,並暫停至少 40 毫秒。沒有完整的路徑或預算已用完 - 路線結束。處理完提交的步驟後,協調任務完成; mobile-Follow 可能會因延遲而重試。

獨立的 C# 腳本

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

簡單範例

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

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

object? result = UO.MoveXY(UO.GetX() + 2, UO.GetY(), true, 0, false);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1。步行精确点 - 直接脚本

參數與執行流程:

  • Xdst - 東邊兩個單元格; Ydst 不變。
  • 最佳化=true,準確度=0,運行=false。呼叫完成後傳回結果。
var ok = UO.MoveXY(UO.GetX() + 2, UO.GetY(), true, 0, false);
UO.Print(Convert.ToString(ok));

2。方法物件-腳本函數

參數與執行流程:

  • Xdst/Ydst 是從所選對象讀取的;它必須是世界的一個對象,而不是容器內的對象。
  • 準確度=1讓你可以接近;跑步=true。高度不限於此挑戰。
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("lasttarget")))
    {
        var ok = UO.MoveXY(UO.GetX("lasttarget"), UO.GetY("lasttarget"), true, 1, true);
        UO.Print("Approach result: " + Convert.ToString(ok));
    }

    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。臨時設定最低耐力 - 場景類別

參數與執行流程:

  • 將目標 1445/1690 替換為您自己的目標。耐久性閾值由單獨的設定設置,而不是第六個 MoveXY 參數。
  • 正常返回後,又恢復原來的值。如果發生中止,則不再執行任何行。

標準行駛速度

最小步數間隔:步行-步行400毫秒,跑步200毫秒;騎乘-步行200毫秒,跑步100毫秒。

這些是標準客戶端限制,而不是為您的分片自動定義的設定。伺服器速度和飛行模式是分開計算的。腳本計時器可以減慢移動速度,但不會減少這些限制。

步骤、路线、Follow、鼠标/按键控制和地图使用角色的共享队列。伺服器替換路線、轉彎或調整位置不會取消步驟請求後剩餘的暫停。延遲之後,沒有快速突發來補償遺失的幀。等待確認、障礙和溝通不良可能會減慢行動速度。

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 previous = UO.moveCheckStamina();
        UO.moveCheckStamina(15);
        var ok = UO.MoveXY(1445, 1690, true, 0, false);
        UO.moveCheckStamina(previous);
        UO.Print(Convert.ToString(ok));
        return null;
    }
}

命令實作

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

UO.MoveXY(xdst, ydst, optimized, accuracy, running) — UO.MoveXY(Any,Any,Any,Any,Any)

參數: xdst (Any), ydst (Any), optimized (Any), accuracy (Any), running (Any)

結果: dynamic / Any.

呼叫時:

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

case "movexy":

                    return new InjectionValue(MoveTo(Arg(0), Arg(1), bridge.GetZ(bridge.Self), Arg(3), Arg(4) != 0, 255, Arg(2) != 0));

UO.MoveXYZ

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

C# 簽章

int UO.MoveXYZ(object? x, object? y, object? z, object? accuracyXY, object? accuracyZ, object? running);
int UO.MoveXYZ(object? x, object? y, object? z, object? accuracyXY, object? accuracyZ, object? running, object? timeout);
int UO.MoveXYZ(object? x, object? y, object? z, object? accuracyXY, object? accuracyZ, object? running, object? timeout, object? maxSteps);
int UO.MoveXYZ(object? x, object? y, object? z, object? accuracyXY, object? accuracyZ, object? running, object? timeout, object? maxSteps, object? avoidMobiles);
int UO.MoveXYZ(object? x, object? y, object? z, object? accuracyXY, object? accuracyZ, object? running, object? timeout, object? maxSteps, object? avoidMobiles, object? openDoors);

將角色移動到世界上具有單獨水平和垂直容差的點。

參數

  • x — 必需的 int:目前地圖上目的地0..65535 的世界 X 座標。不是阿甘座標。
  • y — 必需的 int:當前地圖上目的地0..65535 的世界 Y 座標。
  • z - 強制 int:目標世界海拔 -128..127。這是表面高度,而不是樓層數。
  • accuracyXY - 強制int。單元格中X和Y的公差:兩個偏差都必須在其範圍內。該值限制在0..20範圍內;0需要精確的X/Y。
  • accuracyZ - 強制int。高度公差:abs(實際Z - 要求Z),僅限於0..255。零需要精確的高度; 255實際上解除了Z的限制。
  • running — 強制布爾標誌。 true/1 — 運行請求,false/0 — 步驟。伺服器運動延遲仍然存在;這不是速度倍增器。
  • timeout — 可選的等待限制(以毫秒為單位);缺少參數 0 和負值表示不存在此附加限制。路線被接受執行後開始倒數計時;這並不是對整個呼叫的持續時間以及路線準備的硬性限制。
  • maxSteps — 觀察到的位置變化的可選限制,而不是網路封包。 0/負/缺席 - 無此限制。輪詢之間可能有幾個步驟,因此這不是準確的細胞計數器。
  • avoidMobiles — 可選標誌:true 禁止通過正在考慮的字元; false 允許嘗試。如果沒有參數,則使用 moveThroughNPC。伺服器可能仍會拒絕存取。
  • openDoors — 用於沿途開門的選購標誌。如果沒有參數,則使用moveOpenDoor; true 不提供進入上鎖的門的通道。

傳回值

int 1 - 在檢查結束時,角色處於給定容差 X/Y/Z 內,包括當他在挑戰之前已經在那裡時。 int 0 - 座標無效、發射失敗、未到達點或觸發停止條件。不是步數或serial;如果緊急取消,程序將中止而不是正常返回0。

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

行為

  • 工作原理,步驟1:檢查座標、配置的連接和耐久性條件。如果角色已經在accuracyXY和accuracyZ之內,則立即返回1,而不需要新的路線。
  • 步 2:在目前地圖上建立路線,考慮表面高度、障礙物和選定的通行條件。最佳化模式在此處的命令中啟用;無需將此類參數傳遞給 MoveXYZ。
  • 步驟3:開始沿著路線行走或跑步,並等待目前程序的結果。呼叫後的行在完成後執行;客戶端介面繼續工作。
  • 步驟4:如果步驟失敗或出現新的障礙物,客戶端可以從目前位置重新計算路線。嘗試是有限的。當發生超時或達到超出目標的可觀察運動限制時,運動將停止並出現 0。
  • 步驟5:運動結束後,將客戶的實際X/Y/Z與目標進行比較。需要有abs(X-x)<=accuracyXY、abs(Y-y)<=accuracyXY和abs(Z-z)<=accuracyZ。例如,對於1279/540/20,公差為1和2X=1278..1280是適當的, Y=539..541,Z=18..22。
  • 最小形式包含六個參數:UO.MoveXYZ(1279,540,20,1,2,true)。其他參數依超時順序加到右側,maxSteps、avoidMobiles、openDoors。要指定openDoors,先前的位置也必須通過;不支援逗號之間的空格。
  • 與NewMoveXY的區別:MoveXYZ將目標高度作為第三個參數。 NewMoveXY 有第三個參數 Optimized;你不能在那裡轉移高度。此運行時中沒有MoveXYZ的回呼。
  • 路線屬於啟動它的程序:其緊急停止會取消剩餘的自動路徑。如果另一個跑步或用戶已經替換了該路線,則取消前所有者不會影響新路線。已發送的步驟不會被撤銷。
  • SetBadLocation和SetBadObject用作路徑啟動時當前運行時間禁止的快照。它們在內部重新計算期間被保存。更改或清除清單會影響下一條路線,而不是覆蓋已經在進行中的路線。
  • UO.LimitMove 控制目的地距離:預設 2000,0 無限制。沒有隱藏的 4096 步/節點或 10000 節點上限。工作分批執行並可停止。GetPathArray 會套用 moveThroughNPC 的體力門檻與 moveOpenDoor。
  • 超時在請求被接受後計算,包括搜尋和重新計算的後續部分。 stopOnStuck 不認為正在運行的搜尋是字元卡住的;規劃完成後,不再考慮位置變化。最後的1/0檢查實際座標,而不僅僅是路徑的準備。
  • 結果考慮了客戶的本地位置;後續伺服器修正仍然是可能的。從不同的例程運行競爭的運動命令會改變角色的整體路線。
  • 設定moveCheckStamina、moveExitOnDisconnect、moveOpenDoor、moveThroughCorner、moveThroughNPC、moveHeuristicMult、moveTurnCost 和 moveBetweenTwoCorners 會影響性能。顯式的avoidMobiles/openDoors會覆寫本次呼叫的對應值。
  • 結果0並不能顯示確切的原因。檢查座標、連結、體力和日誌;不要在沒有 UO.Wait 和嘗試次數限制的情況下無休止地重複該動作。
  • 主橋記錄請求編號、玩家/探路者/地圖實例和地圖索引。新請求、上下文變更或最終拒絕都會給予 0;在讀取座標和最後一次回調後重複檢查。超時、maxSteps和callback=0僅停止已儲存的請求,而不是新的外部路由。臨時封鎖,雖然恢復仍然有效,但不會失去控球權:等待繼續。對於沒有IApiMovementOwnershipBridge的外部legacy-bridge,保留先前的相容機制。
  • 僅當相應活動請求被拒絕時,通用探路者最多可儲存 8 2000 毫秒的暫時 X/Y/Z 方向禁止。輪換、未知順序、重新同步和舊/外來請求不會產生此類禁止。新的外部請求和地圖/玩家上下文的遺失會清除它們。載入的幾何搜尋嘗試繞過過渡;它不知道所有伺服器障礙。在不更改玩家 X/Y/Z 的情況下,允許最多 8 內部重新計算,並暫停至少 40 毫秒。沒有完整的路徑或預算已用完 - 路線結束。處理完提交的步驟後,協調任務完成; mobile-Follow 可能會因延遲而重試。

獨立的 C# 腳本

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

簡單範例

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

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

var result = UO.MoveXYZ(UO.GetX() + 1, UO.GetY(), UO.GetZ(), 0, 0, false);
UO.Print("MoveXYZ: " + Convert.ToString(result));

1。相同高度的相鄰單元格 - 直接腳本

參數與執行流程:

  • x/y/z 是目標點。 accuracyXY=0和accuracyZ=0需要精確的位置。
  • running = false - 步行。如果相邻表面具有不同的高度,则结果可能是0。
var ok = UO.MoveXYZ(UO.GetX() + 1, UO.GetY(), UO.GetZ(), 0, 0, false);
UO.Print(Convert.ToString(ok));

2。接近所需高度的點並檢查結果 - 腳本函數

參數與執行流程:

  • 準備:角色必須在遊戲中,並且該點必須存在於當前地圖上。 1279/540/20 是訓練座標:將它們替換為您可用的點,包括表面的實際高度。
  • 1。 destinationX=1279 是第一個參數,目標的 X 世界座標。
  • 2。 destinationY=540是第二個參數,目標的世界座標Y。
  • 3。 destinationZ=20 — 第三個參數,高度。隊伍必須找到通道或樓梯;值20本身不會轉移到樓層。
  • 4。 accuracyXY=1 允許您在沿著每個水平座標的一個單元格內完成。對角相鄰的單元格也適用。
  • 5。 accuracyZ=2 允許高度從 18 到 22(含)。在另一層進行 X/Y 配對不足以取得成功。
  • 6。 running=true 請求運行。對於步行,將 true 替換為 false。
  • 7。 timeout=8000 將路由開始後的等待時間限制為八秒。此後,當運動仍在進行時,命令會停止運動並返回 0。
  • 8。 maxSteps=100 限制觀察到的位置變化的數量。這並不是經過的確切的方格數;而是經過的方格數。民意調查之間可能會發生多個步驟。
  • 9。 avoidMobiles=true 禁止傳遞計算路線時考慮的字元。
  • 10。 openDoors=true 允許嘗試沿途打開門。此標誌不會繞過上鎖的門或伺服器限制。
  • 通話結束後,reached 收到int 1 或0。如果到達 == 1 執行成功分支; else 處理未能實現目標的情況,而無需無休止地重複命令。
  • 最後一行列印目前的 X/Y/Z 以供檢查。如果過程中止,則不再執行任何行(包括此輸出)。
return  RunScenario();
 object? RunScenario()
{
    var destinationX = 1279;
    var destinationY = 540;
    var destinationZ = 20;
    var accuracyXY = 1;
    var accuracyZ = 2;
    dynamic running = true;
    var timeout = 8000;
    var maxSteps = 100;
    dynamic avoidMobiles = true;
    dynamic openDoors = true;
    var reached = UO.MoveXYZ(destinationX, destinationY, destinationZ, accuracyXY, accuracyZ, running, timeout, maxSteps, avoidMobiles, openDoors);
    if (Truth(reached == 1))
    {
        UO.Print("Destination reached");
    }
    else
    {
        UO.Print("Destination not reached; check the path and limits");
    }

    UO.Print("Position: " + Convert.ToString(UO.GetX()) + "," + Convert.ToString(UO.GetY()) + "," + Convert.ToString(UO.GetZ()));
    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。限制運行並禁止開門 - 場景類

參數與執行流程:

  • x/y/z=1445/1690/0; accuracyXY=1, accuracyZ=3; running=true.
  • 觀察到的運動超時=5000、maxSteps=60、avoidMobiles=true 且openDoors=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()
    {
        var ok = UO.MoveXYZ(1445, 1690, 0, 1, 3, true, 5000, 60, true, false);
        UO.Print("Result: " + Convert.ToString(ok));
        return null;
    }
}

4。腳本內有註解的現成函數 - 直接腳本

參數與執行流程:

  • 帶#的行是C#註解:複製時儲存,不執行。此範例包含兩個必要部分:函數 GoToPoint 和可運行過程 Main。
  • 所有六個參數 GoToPoint 不加修改地傳輸到 MoveXYZ。函數內部指定了四個附加參數: 8000 多發性硬化症, 100 觀察位置的變化、角色走動、門的打開。
  • 為了目的 1279/540/20 有公差 1/2 合身 X=1278..1280, Y=539..541, Z=18..22。外部不同高度的點 18..22 不被視為已實現。
  • 這是真實命令的包裝,而不是腳本中尋路的第二次實現。它不會呼叫額外的GetPathArray,也不會觸發無休止的重試。如果沒有實現,呼叫過程接收0並選擇進一步的操作。

標準行駛速度

最小步數間隔:步行-步行400毫秒,跑步200毫秒;騎乘-步行200毫秒,跑步100毫秒。

這些是標準客戶端限制,而不是為您的分片自動定義的設定。伺服器速度和飛行模式是分開計算的。腳本計時器可以減慢移動速度,但不會減少這些限制。

步骤、路线、Follow、鼠标/按键控制和地图使用角色的共享队列。伺服器替換路線、轉彎或調整位置不會取消步驟請求後剩餘的暫停。延遲之後,沒有快速突發來補償遺失的幀。等待確認、障礙和溝通不良可能會減慢行動速度。

var reached = GoToPoint(1279, 540, 20, 1, 2, true);
if (Truth(Truth(reached) == true))
{
    UO.Print("Destination reached");
}
else
{
    UO.Print("Destination not reached");
}

dynamic GoToPoint(dynamic x, dynamic y, dynamic z, dynamic accuracyXY, dynamic accuracyZ, dynamic running)
{
    var timeout = 8000;
    var maxSteps = 100;
    dynamic avoidMobiles = true;
    dynamic openDoors = true;
    var reached = UO.MoveXYZ(x, y, z, accuracyXY, accuracyZ, running, timeout, maxSteps, avoidMobiles, openDoors);
    return reached;
}

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.MoveXYZ(x, y, z, accuracyXY, accuracyZ, running) — UO.MoveXYZ(Any,Any,Any,Any,Any,Any)

參數: x (Any), y (Any), z (Any), accuracyXY (Any), accuracyZ (Any), running (Any)

結果: int / Integer.

呼叫時:

呼叫時執行已儲存的處理函式 delegate。註冊方法在建立 API 時建立此 delegate。

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

values => new InjectionValue(CompactMoveXYZ(values))

UO.MoveXYZ(x, y, z, accuracyXY, accuracyZ, running, timeout) — UO.MoveXYZ(Any,Any,Any,Any,Any,Any,Any)

參數: x (Any), y (Any), z (Any), accuracyXY (Any), accuracyZ (Any), running (Any), timeout (Any)

結果: int / Integer.

呼叫時:

呼叫時執行已儲存的處理函式 delegate。註冊方法在建立 API 時建立此 delegate。

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

values => new InjectionValue(CompactMoveXYZ(values))

UO.MoveXYZ(x, y, z, accuracyXY, accuracyZ, running, timeout, maxSteps) — UO.MoveXYZ(Any,Any,Any,Any,Any,Any,Any,Any)

參數: x (Any), y (Any), z (Any), accuracyXY (Any), accuracyZ (Any), running (Any), timeout (Any), maxSteps (Any)

結果: int / Integer.

呼叫時:

呼叫時執行已儲存的處理函式 delegate。註冊方法在建立 API 時建立此 delegate。

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

values => new InjectionValue(CompactMoveXYZ(values))

UO.MoveXYZ(x, y, z, accuracyXY, accuracyZ, running, timeout, maxSteps, avoidMobiles) — UO.MoveXYZ(Any,Any,Any,Any,Any,Any,Any,Any,Any)

參數: x (Any), y (Any), z (Any), accuracyXY (Any), accuracyZ (Any), running (Any), timeout (Any), maxSteps (Any), avoidMobiles (Any)

結果: int / Integer.

呼叫時:

呼叫時執行已儲存的處理函式 delegate。註冊方法在建立 API 時建立此 delegate。

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

values => new InjectionValue(CompactMoveXYZ(values))

UO.MoveXYZ(x, y, z, accuracyXY, accuracyZ, running, timeout, maxSteps, avoidMobiles, openDoors) — UO.MoveXYZ(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

參數: x (Any), y (Any), z (Any), accuracyXY (Any), accuracyZ (Any), running (Any), timeout (Any), maxSteps (Any), avoidMobiles (Any), openDoors (Any)

結果: int / Integer.

呼叫時:

呼叫時執行已儲存的處理函式 delegate。註冊方法在建立 API 時建立此 delegate。

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

values => new InjectionValue(CompactMoveXYZ(values))

UO.MoverStop

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

C# 簽章

void UO.MoverStop();

停止探路者的自動路線。

參數

沒有參數。

傳回值

void - 無回傳值。使用單獨的線路撥打電話;它不是 true/false 或步數。

行為

  • 刪除本機自動移動。已發送的步驟和伺服器確認訊息不會被撤回。
  • 這不是 TerminateAll:繼續執行剩餘的腳本行和其他過程。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。刪除路由 - 直接腳本

參數與執行流程:

  • 沒有爭論。
  • 該命令不返回成功代碼。
UO.MoverStop();

2。僅當路線處於活動狀態時停止 - 腳本功能

參數與執行流程:

  • Move()讀取自動移動。
  • Print-本機腳本訊息;這不是伺服器確認。
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Move()))
    {
        UO.MoverStop();
        UO.Print("Route stopped");
    }

    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=100 ms 允許客戶端處理接下來的事件。
  • 停止後,單獨讀取座標;延遲並不能保證收到所有網路確認。
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
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;
    }

    async public Task<object?> RunScenarioAsync()
    {
        UO.MoverStop();
        await Delay(100);
        UO.Print(Convert.ToString(UO.GetX()) + "," + Convert.ToString(UO.GetY()));
        return null;
    }

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

命令實作

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

UO.MoverStop() — UO.MoverStop()

參數: 沒有參數。

結果: void / Unit.

呼叫時:

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

case "moverstop": bridge.StopMoving(); return InjectionValue.Unit;

UO.Moving

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

C# 簽章

int UO.Moving();

檢查角色的動作。

參數

沒有參數。

傳回值

int bool (1/0): 1 - 自動探路器處於活動狀態或角色佇列中仍有步驟; 0 - 兩者皆缺失或角色未載入。這並不是對實現目標或步驟數量的確認。

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

行為

  • 讀取已經接收到的本地資料。該請求不會開啟狀態,也不會強制伺服器發送更新。死亡、地圖轉換或物件刪除後,兩次呼叫之間的值可能會改變。
  • C# 區分大小寫。請使用正確的 UO 名稱。數值旗標應與 0 比較;只有回傳型別為 bool 時才使用 bool。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。檢查自己的狀態-直接腳本

參數與執行流程:

  • 空括號讀作 self。活動 — 編號 1 或 0;訊息文字用作分支處理的範例。
  • 1 - 自動探路器處於活動狀態或角色佇列中仍有步驟; 0 - 兩者皆缺失或角色未載入。這並不是對實現目標或步驟數量的確認。
var active = UO.Moving();
if (Truth(active))
{
    UO.Print("State is active");
}
else
{
    UO.Print("State is inactive or unavailable");
}

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

2。检查字符是否存在是脚本的一个功能

參數與執行流程:

  • 這個指令沒有物件參數:即使在 Exists(self) 之後,它也只會讀取自己的狀態。
  • Exists(self) 與請求的標誌分開檢查玩家的負載。世界可能會在支票之間發生變化。
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("self")))
    {
        var state = UO.Moving();
        UO.Print("State 1/0: " + Convert.ToString(state));
    }

    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。通知狀態變更而無需無限期等待 - 腳本類

參數與執行流程:

  • 兩個不帶參數的呼叫讀取self; UO.Wait(500) - 暫停半秒。
  • 比較兩個標誌快照。镜头之间的过渡可能会被跳过;它不是对所有服务器事件的订阅。
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
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;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.Moving();
        await Delay(500);
        var after = UO.Moving();
        if (Truth(before != after))
        {
            UO.Print("State changed from " + Convert.ToString(before) + " to " + Convert.ToString(after));
        }

        return null;
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    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.Moving() — UO.Moving()

參數: 沒有參數。

結果: int / Integer.

呼叫時:

呼叫時執行已儲存的處理函式 delegate。註冊方法在建立 API 時建立此 delegate。

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

() => bridge.IsMoving()

建立 API: 這些函式負責註冊 API,不會在每次命令呼叫時重新執行。

UO.LimitMove — 移動距離上限. UO.LimitMove 控制目的地距離:預設 2000,0 無限制。沒有隱藏的 4096 步/節點或 10000 節點上限。工作分批執行並可停止。GetPathArray 會套用 moveThroughNPC 的體力門檻與 moveOpenDoor。

⚠️ **GitHub.com Fallback** ⚠️