Skip to content

JA UO Topic movement

Codex edited this page Oct 11, 2026 · 3 revisions

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

動き

家 · 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? arg0);

引数

  • directions は、従来のリストに保存されている文字列です。値の意味と形式は、それを使用する互換性のあるスクリプトによって異なります。

戻り値

void。追記した内容は動作確認ではありません。

動作

  • 値は、現在の実行時状態のリスト AddDir に追加されます。呼び出し自体はモーション パケットを渡さず、キャラクターを動かしません。また、このリストを読み取るための文書化されたパブリック ゲッターもありません。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

コマンドは独立した文です。直前のメッセージは呼び出しの開始を示し、サーバーの動作完了を確認するものではありません。

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

1。キャラクターを移動せずに、方向をレガシー互換エントリとして保存します。 - 直接スクリプト

引数と実行の流れ:

  • キャラクターを移動せずに、方向をレガシー互換エントリとして保存します。
UO.AddDir("E");

2。変数の値を従来のリスト AddDir に渡します。 - スクリプト機能

引数と実行の流れ:

  • 変数の値を従来のリスト AddDir に渡します。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var directionEntry = "north-east";
    UO.AddDir(directionEntry);
    return null;
}

3。呼び出しごとに、ランタイム状態に別の文字列エントリが追加されます。 - スクリプトクラス

引数と実行の流れ:

  • 呼び出しごとに、ランタイム状態に別の文字列エントリが追加されます。
  • 補助プロシージャもモーション コマンドを送信しません。
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()
    {
        AddLegacyDirection("W");
        return null;
    }

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

UO.AddStep

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

C# のシグネチャ

void UO.AddStep(object? arg0);

引数

  • directions は、ランタイムがテキストに変換し、互換性リスト AddStep に追加する値です。方向自体は解釈できません。

戻り値

void。この呼び出しは値を返さず、移動を確認しません。

動作

  • 各呼び出しでは、引数の文字列表現が現在の実行状態のリスト AddStep に追加されます。このレガシー エントリはモーション コマンドを送信せず、現在の実装にはパブリック ゲッターがありません。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

コマンドは独立した文です。直前のメッセージは呼び出しの開始を示し、サーバーの動作完了を確認するものではありません。

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

1。値を従来のリストに書き込みます。キャラクターは動きません。 - 直接スクリプト

引数と実行の流れ:

  • 値を従来のリストに書き込みます。キャラクターは動きません。
UO.AddStep(2);

2。テキスト値を渡す: 指示として実行されるのではなく、レコードとして保存されます。 - スクリプト機能

引数と実行の流れ:

  • テキスト値を渡す: 指示として実行されるのではなく、レコードとして保存されます。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var legacyValue = "east";
    UO.AddStep(legacyValue);
    return null;
}

3。呼び出しごとに、現在のランタイムの AddStep に個別のエントリが追加されます。 - スクリプトクラス

引数と実行の流れ:

  • 呼び出しごとに、現在のランタイムの AddStep に個別のエントリが追加されます。
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.AddStep(1);
        UO.AddStep(2);
        return null;
    }
}

UO.AlwaysRun

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

C# のシグネチャ

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

現在の ClassicUO プロファイルの常時実行設定を読み取るか変更します。

引数

  • enabled - 0 は常時実行を無効にします。ゼロ以外の値を指定するとオンになります。

戻り値

引数のない形式は、設定が有効な場合は 1 を返し、そうでない場合は 0 を返します。引数形式は null を返します。

動作

  • 値は現在のプロファイルから読み取られます。設定が AlwaysRun に変更され、現在のプロファイルが保存されます。アクティブなプロファイルがない場合、ゲッターは 0 を返し、セッターはクライアント ログにエラーを報告し、設定を変更しません。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は 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 await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    UO.AlwaysRun(1);
    return null;
}

3。常時実行が現在有効になっている場合にのみ無効にします。 - スクリプトクラス

引数と実行の流れ:

  • 常時実行が現在有効になっている場合にのみ無効にします。
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()
    {
        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;
}

UO.CalcDir

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

C# のシグネチャ

int UO.CalcDir(object? arg0, object? arg1, object? arg2, object? arg3);

あるワールドポイントから別のワールドポイントへの方向を計算します。キャラクターは動きません。

引数

  • Xfrom — 開始点の X 座標。
  • Yfrom — 開始点の Y 座標。
  • Xto — X 割り当て座標。
  • Yto — Y 割り当て座標。

戻り値

int — 方向コード: 0=北、1=北東、2=東、3=南東、4=南、5=南西、6=西、 7=北西。マッチングポイントは100を与えます。それは bool ではありません。 0 は北を意味し、失敗ではありません。 1 は成功ではなく北東を意味します。 100 をステップコマンドに指示として渡さないでください。

動作

  • 座標のみを計算します。バッチなし、待機なし、マップ読み込みなし、障害物チェックなし、Z なし、世界地図なし。チームは通行可能なルートを探索するものではなく、目標の達成を保証するものではありません。点は同じ座標系に属している必要があります。障害物を避けると道が長くなる可能性があります。
  • 4 つのパラメータすべてが必要です。世界座標 int を文書化された範囲 0..65535 で送信します。 object?署名内の は、商品の ID ではなく、ユニバーサルアダプターを示します。これらのコマンドには、デフォルト値、胸部内の座標、5 番目の Z および 1 つのオブジェクトによるオーバーロードはありません。
  • 元の座標が目的の座標から減算され、差の符号がチェックされます。 Y を減らすと北、X を増やすと東になります。両方の座標が変化する場合、差の大きさに関係なく対角線が選択されます。両方の差がゼロの場合 - 100。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は 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)。 direct=100 は一致を意味するため、Main は string 「すでにそこにあります」を返します。異なる時点では、別のブランチが機能します。チェックされているのは、true ではなく、100 です。
  • int — 方向コード: 0=北、1=北東、2=東、3=南東、4=南、5=南西、6=西、 7=北西。マッチングポイントは100を与えます。それは bool ではありません。 0 は北を意味し、失敗ではありません。 1 は成功ではなく北東を意味します。 100 をステップコマンドに指示として渡さないでください。
  • 元の座標が目的の座標から減算され、差の符号がチェックされます。 Y を減らすと北、X を増やすと東になります。両方の座標が変化する場合、差の大きさに関係なく対角線が選択されます。両方の差がゼロの場合 - 100。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    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」を返します。 4 つのアシスタント パラメータはすべて同じ座標の意味を持ちます。
  • int — 方向コード: 0=北、1=北東、2=東、3=南東、4=南、5=南西、6=西、 7=北西。マッチングポイントは100を与えます。それは bool ではありません。 0 は北を意味し、失敗ではありません。 1 は成功ではなく北東を意味します。 100 をステップコマンドに指示として渡さないでください。
  • 元の座標が目的の座標から減算され、差の符号がチェックされます。 Y を減らすと北、X を増やすと東になります。両方の座標が変化する場合、差の大きさに関係なく対角線が選択されます。両方の差がゼロの場合 - 100。
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 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;
}

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 await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    UO.CancelMove();
    UO.MoveOn();
    return null;
}

3。接続なし時の保護停止 - スクリプト クラス

引数と実行の流れ:

  • 接続の切断は、後続のステップを禁止する条件として使用されます。
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()
    {
        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;
}

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 を返します。これは北を意味します。

動作

  • 受信済みのローカルデータを読み込みます。このリクエストはステータスをオープンせず、サーバーに更新の送信を強制しません。死亡、マップの遷移、またはオブジェクトの削除後、2 つの呼び出しの間で値が変化する可能性があります。
  • これらは読み取り関数です。結果を変数に代入すると、スナップショットが保存されます。キャラクターの特性は変わりません。名前では大文字と小文字が区別されません。必要な数の引数を指定して、示されている形式を正確に使用してください。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は bool に変換されません。配列の場合は要素数を表示します。

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

1。キャラクターの現在の値を表示 - 直接スクリプト

引数と実行の流れ:

  • 引数なしの呼び出しは、self を参照します。 value にはキャラクターの方向が格納されます。
  • Convert.ToString は出力する数値を変換するもので、結果の意味は変わりません。
var value = UO.Dir();
UO.Print("Dir: " + Convert.ToString(value));

2。アプリケーション検証での値の使用 - スクリプト関数

引数と実行の流れ:

  • 値は引数なしで 1 回読み取られます。キャラクターの方向は、表示される計算または条件に使用されます。
  • 数値しきい値はスクリプト条件の例であり、新しいクライアントの制限ではありません。このフィールドには、上記のサーバー単位と制限が格納されます。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    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。変化を 1 秒で監視する - スクリプト クラス

引数と実行の流れ:

  • 引数なしの両方の呼び出しは、現在の値を読み取ります。 UO.Wait(1000) はショット間にミリ秒単位の一時停止を与えます。
  • 比較した変更点: キャラクターの方向。例は世界を変えることはなく、無限に待つこともありません。この 1 秒以内のイベントは見逃される可能性があります。
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;
}

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 を返します。これは北を意味します。

動作

  • 受信済みのローカルデータを読み込みます。このリクエストはステータスをオープンせず、サーバーに更新の送信を強制しません。死亡、マップの遷移、またはオブジェクトの削除後、2 つの呼び出しの間で値が変化する可能性があります。
  • これらは読み取り関数です。結果を変数に代入すると、スナップショットが保存されます。キャラクターの特性は変わりません。名前では大文字と小文字が区別されません。必要な数の引数を指定して、示されている形式を正確に使用してください。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は bool に変換されません。配列の場合は要素数を表示します。

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

1。キャラクターの現在の値を表示 - 直接スクリプト

引数と実行の流れ:

  • 引数なしの呼び出しは、self を参照します。 value にはキャラクターの方向が格納されます。
  • Convert.ToString は出力する数値を変換するもので、結果の意味は変わりません。
var value = UO.Direction();
UO.Print("Direction: " + Convert.ToString(value));

2。アプリケーション検証での値の使用 - スクリプト関数

引数と実行の流れ:

  • 値は引数なしで 1 回読み取られます。キャラクターの方向は、表示される計算または条件に使用されます。
  • 数値しきい値はスクリプト条件の例であり、新しいクライアントの制限ではありません。このフィールドには、上記のサーバー単位と制限が格納されます。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    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。変化を 1 秒で監視する - スクリプト クラス

引数と実行の流れ:

  • 引数なしの両方の呼び出しは、現在の値を読み取ります。 UO.Wait(1000) はショット間にミリ秒単位の一時停止を与えます。
  • 比較した変更点: キャラクターの方向。例は世界を変えることはなく、無限に待つこともありません。この 1 秒以内のイベントは見逃される可能性があります。
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;
}

UO.FixWalk

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

C# のシグネチャ

void UO.FixWalk();

従来のネイティブ クライアント パッチ FixWalk が ClassicUO に必要ないという通知を出力します。

引数

パラメータはありません。

戻り値

void - 戻り値はありません。

動作

  • ExecuteLegacyManualAlias ブランチは SystemMessage のみを呼び出します。動き、音声、コンテナ、ネットワーク プロトコルは修正されません。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

コマンドは独立した文です。直前のメッセージは呼び出しの開始を示し、サーバーの動作完了を確認するものではありません。

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

1。互換性に関する通知 - ダイレクト スクリプト

引数と実行の流れ:

  • このメッセージには、古いパッチが必要ないことが説明されています。
UO.FixWalk();

2。プロシージャの呼び出し - スクリプト関数

引数と実行の流れ:

  • 互換性手順によってゲームの世界が変わるわけではありません。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    CompatibilityNotice();
    return null;
}

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

3。スクリプトの継続 - スクリプト クラス

引数と実行の流れ:

  • 診断メッセージの後、実行は続行されます。
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.FixWalk();
        UO.Print("continued");
        return null;
    }
}

UO.Follow

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

C# のシグネチャ

int UO.Follow();
int UO.Follow(object? arg0);
int UO.Follow(object? arg0, object? arg1);
int UO.Follow(object? arg0, object? arg1, object? arg2);
int UO.Follow(object? arg0, object? arg1, object? arg2, object? arg3);
int UO.Follow(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4);
int UO.Follow(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5);

ロードされたキャラクター/NPC のバックグラウンド追跡、またはポイント X、Y、Z への移動を有効にします。移動中、クライアントは送信された停止条件をチェックします。スクリプトは呼び出し直後に実行を継続します。

引数

  • target — 文字シリアル/NPC: int、16 進数/10 進数の文字列、lasttarget、またはAddObject 経由で以前に保存された名前。これらはgraphic/type や座標ではありません。自分自身やオブジェクトをフォローすることはできません。 0 はフォローを停止します。引数がない場合、Follow() も停止します。光景は現れない。
  • distance — セル内の X/Y 許容差: 最大 |dx|そして|dy|。文字 int 1..18 の場合、デフォルトは 1; Z 差は16 までは許容されます。ポイント int 0..18 の場合、引数が必要です。0 は正確な X/Y を必要とし、2 は 2 セル以内で停止できます。 Z は正確に一致する必要があります。無効な値は以前の動作を置き換えません。
  • running - bool と互換性のある値: true/1 - ランニング、false/0 - ウォーキング。デフォルトは true です。サーバーの速度制限、スタミナ、麻痺、障害物は残ります。このフラグはサーバーのステップを高速化しません。
  • stopConditions — 停止条件のオプションの配列: 4 番目の引数は文字、6 番目は座標。各要素は、正確に 3 つの値 [フィールド、比較、しきい値] の配列です。フィールドと比較は文字列、しきい値は int/double;フラグの場合は、true/false (1/0) が適しています。 ANY 条件のトリガーは 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) を使用します。結果のタイプは bool ではなく、int です。タイプ エラーや不明なオブジェクト名により、スクリプト エラーが発生する可能性があります。座標の場合、0 は無効な X/Y/Z または許容誤差も意味します。 1 は、バックグラウンド タスクのみを受け入れることを意味します。到着と今後の占有はまだ確認されていません。

動作

  • クライアントごとに 1 つのモード Follow: 文字または座標。呼び出しが成功すると、ターゲットとパラメータが再び置き換えられます。チャレンジが失敗しても、前の目標はキャンセルされません。キャラクターをフォローするには、そのキャラクターが ClientViewRange 内のロード済みモバイル リストに既に存在している必要があります。座標点はビューよりも遠い場合があります。
  • キャラクターの近くまで到達すると歩行は停止しますが、モードはオンのままで、ターゲットが遠ざかると動きを再開します。基準点の近くで、X/Y 公差と正確な Z が満たされていれば、タスクは完了します。このコマンドは、起動時にルートの到達可能性が保証されていることを報告しません。
  • Follow()、Follow(0)、MoverStop()、手動のマウス/矢印の移動、新しいスクリプト ルート、または標準クライアントのフォローにより、このモードが停止します。 TerminateAll/Terminate("all") も停止します。まだ実行中のオーナー スクリプトをキャンセルすると、Follow が停止します。
  • どちらのモードも、マップまたはキャラクターが変更されるか、プレイヤーが死亡するか、接続が切断されると終了します。ターゲットがメモリ/ビューから消えると、キャラクターの追跡も停止します。後でターゲットが出現してもモードは自動的にトリガーされません。新しい Follow が必要です。
  • IDE を閉じてもモードは停止しません。実行中のスクリプトが正常に終了すると、Follow は有効なままになります。スクリプトの一時停止自体は、そのクライアント モードの一時停止ではありません。一時停止する前に、動きを停止する必要がある場合は、Follow(0) を使用します。
  • パスファインダーは、ゲーム ストリーム上のチャンク単位でパスを計算します。不完全な検索は再開されません。 mobile の場合、通常のルート更新は 500 ミリ秒に制限されます。アプローチなしでルートが失敗または終了した後、最初の 3 回の再試行遅延は 1000 ミリ秒、次に 2000、4000 ミリ秒、最大 5000 ミリ秒になります。バウンスカウンターは、X/Y/Z プレイヤーまたはターゲットが変わるとリセットされます。ターゲットを変更すると、待機時間を最大 500 ミリ秒短縮できます。使用可能な mobile ターゲットの繰り返し回数に一般的な制限はありません。モードは移動せずにアクティブのままにすることができるため、経過時間を設定するか、明示的に停止します。パスが完全に失敗すると、調整タスクは終了します。
  • 距離/時間フィールド: 距離 — ターゲットまでの現在の距離 (セル単位) max(abs(dx),abs(dy));高さ — ワールド単位での絶対差 Z;経過 - この 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 では、演算子「=」と値 true を含むフィールド「self.paralyzed」のルールは、麻痺すると従うのを停止します。これはルール フィールドの文字列名であり、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 無実、2 味方、3 灰色、4 犯罪者、5 敵、6殺人者、7 無敵); target.body — ボディの数値graphic。これらはtypeの服ではありません。たとえば、target.notoriety != 2 は、味方ステータスが失われると追跡を停止します。
  • 呼び出されると、数値しきい値を含む条件のコピーがキャプチャされます。ソース配列/変数を変更してもモードは更新されません。新しいアレイで Follow を繰り返します。キャンセルされたモードは、条件が満たされなくなっても再開されません。
  • 条件は、移動中と、キャラクターがターゲットの近くに立っているときの両方でチェックされます。最大 64 要素の通常のリストが 1 ゲーム フレームでチェックされ、次のチェックは 250 ミリ秒後以降に行われます。より大きなリスト - フレームあたり 64 要素、その後一時停止 250 ミリ秒。経過フィールドは、チェック/フレームの継続時間のしきい値よりも遅く停止する場合があります。これは正確なタイマーではありません。
  • リスト全体の最初のチェックが完了するまで、新しいルートは開始されません。条件がすでに満たされている場合、Follow は受け入れられたリクエストに対して 1 を返し、最初のステップを行わずに更新で停止します。前の動作からのステップのパケットがすでに送信されている可能性があります。
  • 新しい条件では、ターゲット/プレイヤー/カード/リンクの喪失、プレイヤーの死亡、オーナーのキャンセル、Terminateすべておよび手動/その他の移動などの強制停止理由は無効になりません。スクリプト コードはゲーム スレッドでは実行されません。リストされたローカル値のみがチェックされます。
  • 座標形式: Follow(x,y,z, distance,running) および Follow(x,y,z, distance,running,stopConditions)。最初の 5 つの引数は必須です。 Follow(x,y,z) は座標の短縮形ではありません。3 つの引数は依然としてターゲット、距離、ランニングを意味します。
  • 座標モードでは、条件内の距離はポイントまでの残りの X/Y 距離を意味し、高さはその Z からの絶対差を意味します。時間が経過すると、すべての self.* は通常どおりに動作します。 target.* フィールドは無効です。ポイントには HP、本文、またはステータスがありません。これらを渡そうとすると、古いモードが置き換えられるまでスクリプト エラーが発生します。
  • 条件は、最初のルートの前、計算中、およびキャラクターの移動中にチェックされます。何らかの条件がトリガーされると、タスクが削除され、それに属するパスがキャンセルされます。大きなリストの頻度と処理は、文字を追跡する場合と同じです。すでにサーバーに送信されたステップは完了する可能性があります。
  • 座標タスクは、その点に到達するか、検索と移動が失敗するか、その点に到達せずに終了すると終了します。到達不可能なポイントへの無限の再試行はトリガーされません。障害物に対するパスファインダーの通常の内部再計算は保持されます。完了後にその場所を離れても、タスクは再開されません。
  • パスファインダーがすでに最後のステップを送信してパスを完了しているが、それらのステップがまだ実行中または確認を待機している場合、タスクは引き続き条件をチェックします。送信されたステップのキュー自体は消去されません。通常のサーバーの移動および確認メカニズムによって処理される必要があります。
  • リストは、DO ... ループの終わりまたは FOR で List.Add を介して組み立てられ、適切な形式の最後の引数として checks.ToArray() に一度渡されます。反復ごとに再度 Follow を呼び出す必要はありません。これによりモードが置き換えられ、経過時間がリセットされます。行数は少数に限定されませんが、サポートされるフィールドのセットは上記のフィールドに限定されます。
  • X/Y/Z を変更せずに2000 ミリ秒経過すると、プレイヤーmobile-Follow は静止ターゲットへのパスを再要求できます。チェックは、Player.Steps と Walker キューが解放された後、検索以外で次の期限が発生し、次のステップが許可された場合にのみ実行されます。ゆっくりとしたペースで移動して確認を待ってもコストはかかりません。送信した歩数は消去されません。座標 Follow は、そのような外部の無限の繰り返しを開始しません。そのパスの復元は、制限されたパスファインダーによって処理されます。
  • 一般的なパスファインダーは、対応するアクティブなリクエストの移動が拒否された場合に限り、2000 ミリ秒間の方向遷移 X/Y/Z の一時的な禁止を最大 8 まで保存します。ローテーション、未知のシーケンス、再同期、および古い/外部リクエストでは、そのような禁止は発生しません。新しい外部リクエストとマップ/プレイヤー コンテキストの損失により、それらはクリアされます。ロードされたジオメトリ検索は遷移をバイパスしようとします。サーバーの障害をすべて知っているわけではありません。プレーヤーの X/Y/Z を変更せずに、少なくとも 40 ミリ秒の一時停止を伴って、最大 8 の内部再計算が許可されます。完全なパスが存在しないか、この予算が使い果たされているため、ルートは終了します。調整タスクは、送信されたステップを処理した後に完了します。 mobile-Follow は遅延に基づいて再試行する場合があります。
  • コントローラーは、AutoWalking という事実ではなく、自身のモーション リクエストの数を比較します。つまり、パスの自然な終端は外部コマンドとみなされません。 StopOwnedPath は保存されている番号を StopAutoWalkIfRequestGeneration に転送します。新しい外部リクエストは古い Follow を終了します。それを停止しても、他の人の新しいルートはキャンセルされません。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は 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。 3 マス離れて歩いてから停止 - スクリプト関数

引数と実行の流れ:

  • 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 に含めることができます。 1 つは到着ではなく受け入れを意味します。
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 await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    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 ms タイムアウトでは、無期限の追跡は許可されません。 Follow を返しても、3 マスに達せずに受諾を意味します。
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()
    {
        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 ミリ秒後に停止します。空のステータスはループをスキップしますが、次の 2 つの条件は残ります。 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(リーダー、startedAt) ​​は、bool 互換の 1/0 を返します: 12 セルを超えるターゲット、または自身の HP <=30 または 30 秒が経過しました。 || を追加(別の条件); 2 つのチェックを必須で組み合わせるには、(conditionA &&conditionB) を使用します。不明な HP は 0 と読み取れます。その後、この例は開始を拒否します。スクリプトの実行中、およそ 250 ミリ秒ごとに式をチェックします。スクリプトを一時停止すると、これらのチェックも一時停止されます。最後に、通常の終了/エラー時に停止をディスパッチします。所有者のキャンセルはクライアントによってさらに追跡されます。ターゲットが消滅し、クライアントがすでに Follow を停止している場合、このループはタイムアウト チェックまでに自然に終了します。メソッドの終了後に作業するには、前の例と同様に 4 番目の引数を使用します。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    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。 Run to Exact X, Y, Z - Script Class

引数と実行の流れ:

  • 5 つの引数: X=1445、Y=1690、Z=0、許容誤差 X/Y=0、実行。戻り 1 は、到着が完了したことではなく、受諾を意味します。そこに到達すると、タスクは完全にオフになります。手動で早期に停止するには、UO.Follow(0) に電話してください。
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 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) の 2 X/Y セル以内、厳密には Z=0 で終了します。チェックは経路探索中と移動中の両方で継続されます。これは開始前に 1 回限りのチェックではありません。 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。要点に進みますが、エスコートを 3 セル前で終了するのはスクリプトの機能です

引数と実行の流れ:

  • 呼び出し内の distance=0 は正確な到着を指定しますが、 distance<=3 条件は、次のチェックでそのような距離が検出されたときにタスクをより早く終了します。 false は歩くことを意味します。 Z>16 または 20000 ミリ秒の差もタスクを停止します。方向は通行可能を保証するものではありません。オフセットをルート ポイントに置き換えます。

標準走行速度

最小ステップ間隔: ウォーキング - ウォーキング 400 ミリ秒、ランニング 200 ミリ秒。乗車 - ウォーキング 200 ミリ秒、ランニング 100 ミリ秒。

これらは標準的なクライアント制限であり、シャードに対して自動的に定義される設定ではありません。サーバーの速度とフライト モードは個別にカウントされます。スクリプト タイマーは動作を遅くする可能性がありますが、これらの制限は軽減されません。

ステップ、ルート、Follow、マウス/キー コントロール、マップはキャラクターの共有キューを使用します。サーバーによるルートの置き換え、方向転換、または位置の調整では、ステップ要求後の残りの一時停止はキャンセルされません。遅延の後は、ドロップされたフレームを補うための高速バーストはありません。確認を待っていたり、障害物があったり、コミュニケーションが不十分だったりすると、動きが遅くなる可能性があります。

return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    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;
}

UO.GetDir

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

C# のシグネチャ

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

クライアントモデルからキャラクターの方向を読み取ります。

引数

  • id — 指定された単一パラメータ形式の場合のみのオプションのオブジェクト: serial 数値/16 進文字列、「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 を返します。これは北を意味します。

動作

  • 受信済みのローカルデータを読み込みます。このリクエストはステータスをオープンせず、サーバーに更新の送信を強制しません。死亡、マップの遷移、またはオブジェクトの削除後、2 つの呼び出しの間で値が変化する可能性があります。
  • これらは読み取り関数です。結果を変数に代入すると、スナップショットが保存されます。キャラクターの特性は変わりません。名前では大文字と小文字が区別されません。必要な数の引数を指定して、示されている形式を正確に使用してください。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は bool に変換されません。配列の場合は要素数を表示します。

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

1。キャラクターの現在の値を表示 - 直接スクリプト

引数と実行の流れ:

  • 引数なしの呼び出しは、self を参照します。 value にはキャラクターの方向が格納されます。
  • Convert.ToString は出力する数値を変換するもので、結果の意味は変わりません。
var value = UO.GetDir();
UO.Print("GetDir: " + Convert.ToString(value));

2。アプリケーション検証での値の使用 - スクリプト関数

引数と実行の流れ:

  • 値は引数なしで 1 回読み取られます。キャラクターの方向は、表示される計算または条件に使用されます。
  • 数値しきい値はスクリプト条件の例であり、新しいクライアントの制限ではありません。このフィールドには、上記のサーバー単位と制限が格納されます。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    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 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()
    {
        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;
}

UO.GetDirection

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

C# のシグネチャ

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

クライアントモデルからキャラクターの方向を読み取ります。

引数

  • ObjID — 指定された単一パラメータ形式の場合のみのオプションのオブジェクト: serial 数値/16 進文字列、「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 を返します。これは北を意味します。

動作

  • 受信済みのローカルデータを読み込みます。このリクエストはステータスをオープンせず、サーバーに更新の送信を強制しません。死亡、マップの遷移、またはオブジェクトの削除後、2 つの呼び出しの間で値が変化する可能性があります。
  • これらは読み取り関数です。結果を変数に代入すると、スナップショットが保存されます。キャラクターの特性は変わりません。名前では大文字と小文字が区別されません。必要な数の引数を指定して、示されている形式を正確に使用してください。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は bool に変換されません。配列の場合は要素数を表示します。

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

1。キャラクターの現在の値を表示 - 直接スクリプト

引数と実行の流れ:

  • 引数なしの呼び出しは、self を参照します。 value にはキャラクターの方向が格納されます。
  • Convert.ToString は出力する数値を変換するもので、結果の意味は変わりません。
var value = UO.GetDirection();
UO.Print("GetDirection: " + Convert.ToString(value));

2。アプリケーション検証での値の使用 - スクリプト関数

引数と実行の流れ:

  • 値は引数なしで 1 回読み取られます。キャラクターの方向は、表示される計算または条件に使用されます。
  • 数値しきい値はスクリプト条件の例であり、新しいクライアントの制限ではありません。このフィールドには、上記のサーバー単位と制限が格納されます。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    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 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()
    {
        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;
}

UO.GetPathArray

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

C# のシグネチャ

dynamic UO.GetPathArray(object? arg0, object? arg1, object? arg2, object? arg3);

移動を実行せずに、キャラクターの現在位置から X/Y までのパスを返します。

引数

  • Xdst — 目的地の世界座標 X、0..65535。ここはserial やガンプ内の位置ではありません。
  • x — 目的地の世界座標 X、0..65535。ここはserial やガンプ内の位置ではありません。
  • Ydst — 目的地のワールド Y 座標、0..65535。
  • y — 目的地のワールド Y 座標、0..65535。
  • Optimized - true は斜めのトランジションを許可します。 false は、この互換性のある形式で 4 つの直線方向を残します。これは、MoveXY の Optimized の意味とは異なります。
  • Accuracy — セル内の X と Y の許容値: 両方の偏差がその範囲内に収まる必要があります。値は 0..20 の範囲に制限されます。 0 には正確な X/Y が必要です。

戻り値

[x,y,z] レコードの配列。各フィールドは int です。外側の配列の [0] が開始点です。最後のエントリは、指定されたターゲット許容値内にあります。空でない配列の場合のみ、ステップ数は ArrayLength(パス)-1 です。空の配列 [] は、完全な有効なパスが取得されていないことを意味します (到達不能なターゲット/マップ、制限または検索制限)。開始点がすでに適切である場合、1 つのレコードが返され、ステップ数は 0 になります。部分パスは返されません。

動作

  • チームはルートを計算するだけです。動き始めたり、ドアが開いたりすることはありません。実行するには、NewMoveXY/MoveXYZ を使用し、自身の結果を確認します。
  • 探索では、隣接する移動が等しいコストであるとみなして障害物を回避します。一定のマップ上で、ステップ数が最小のパスが検索されます。クライアントの対角線の高さと制限を含め、各肋骨の実際の開通性がチェックされます。
  • 開いているノードは 4096 まで、ステップは 4096 までです。長く複雑なパスがある場合でも、作業制限により空の配列が作成される可能性があります。長いルートをセクションに分割します。
  • クライアントでは、計算は最大 32 ノードの部分に分割され、ノード間で約 1 ミリ秒のバジェット チェックが行われます。キャンセルはサービングの間にチェックされます。カードの読み取りはゲーム スレッドに残ります。個々のディスクの固定読み取り時間を保証するものではありません。
  • 検証後にマップが変更される場合があります。キャラクターが移動したり、ドアが閉まり、サーバーが状況を修正したりします。結果として得られる配列は、使用可能なローカル データの計画であり、サーバーの確認ではありません。
  • SetBadLocation はセルを除外し、SetBadObject は適切に読み込まれたワールド オブジェクトの周囲の領域を除外します。リクエスト時のランタイム リストのスナップショットが使用されます。別の起動からの禁止は継承されません。開始セルが立っているかどうかはチェックされません。開始セルは呼び出しコードによって指定されます。壁内の任意の Z を有効な開始位置として使用することはできません。
  • 現在のカード、ソース X/Y/Z およびターゲット Z はキャラクターから取得されます。公差 Z=255。追加のモバイル/静的フィルターや、4 つの引数形式での非公開ドアの許可はありません。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は 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 - 東に 5 セル。 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 は対角線を除外します。 Accuracy=1 は、公差平方内の最も近いセルを解決します。
  • ポイント[0]/[1]/[2] - X/Y/Z。 graphic、serial、またはサーフェスタイプではありません。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    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。個々の移動コマンドの前にパスを確認する - スクリプト クラス

引数と実行の流れ:

  • 最初のチームはパスのみをカウントします。 2 つ目は、動作を再度確認/実行します (コールバック=0、タイムアウト=5000)。
  • 単に行く必要がある場合、予備の GetPathArray はオプションであり、作業が追加されます。
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 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;
}

UO.GetPathArray3D

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

C# のシグネチャ

dynamic UO.GetPathArray3D(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8, object? arg9);
dynamic UO.GetPathArray3D(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8, object? arg9, object? arg10);
dynamic UO.GetPathArray3D(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8, object? arg9, object? arg10, object? arg11);
dynamic UO.GetPathArray3D(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8, object? arg9, object? arg10, object? arg11, object? arg12);
dynamic UO.GetPathArray3D(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8, object? arg9, object? arg10, object? arg11, object? arg12, object? arg13);
dynamic UO.GetPathArray3D(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8, object? arg9, object? arg10, object? arg11, object? arg12, object? arg13, object? arg14);
dynamic UO.GetPathArray3D(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8, object? arg9, object? arg10, object? arg11, object? arg12, object? arg13, object? arg14, object? arg15);

高さ制御と追加のフィルターを使用して、世界の 2 点間の完全なパスの配列を計算します。

引数

  • 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())。もう 1 つのマップは、一致する X/Y/Z を含む空の配列を提供します。
  • accuracyXY — セル内の X と Y の許容値: 両方の偏差がその範囲内に収まる必要があります。値は 0..20 の範囲に制限されます。 0 には正確な X/Y が必要です。
  • accuracyZ — 高さの許容差: abs(実際の Z - 必要な Z)、0..255 によって制限されます。ゼロには正確な高度が必要です。 255 は、Z リミットを事実上無効にします。
  • run - 互換性のある実行フラグが必要です。リクエストは何も動きません。この形式では、最適化は常に true であるため、実行してもセルの順序やステップ数は変更されません。
  • maxSteps — 開始点のない、パス エッジの数に対するオプションの制限。 0/陰性/不在の場合は、一般制限値 4096 を使用します。ここでは、NewMoveXY で観察された変化とは対照的に、細胞について考察します。
  • maxDistance — ターゲットまでの初期距離 max(abs(dx),abs(dy)) のオプション制限。 0/不在はそれを無効にします。これは、トラバース中に許容される偏差ではなく、見つかったパスの長さでもありません。
  • avoidMobiles - true は、呼び出し開始時のスナップショットによって、self を除くX/Y のロードされた文字を除外します。このフィルターの高さは考慮されません。デフォルトはfalseです。通常のクライアント許可チェックは引き続き適用されます。
  • avoidStatics - true は、移動可能または異なる高さであっても、静的エントリを持つセルを除外します。デフォルトはfalseです。これは厳格なフィルターであり、単に通行できない壁を禁止するものではありません。
  • allowDoors - true は、閉じたドアが通常のチェックに合格しなかった場合でも、見つかったドア タイルを通過する暫定的なパスを許可します。デフォルトはfalseです。ドアは開きません。アクセス、Z、透磁率は実行中に再度チェックする必要があります。
  • allowDiagonal - true/なしでは、角度チェック付きで 8 方向が許可されます。 false - 前進方向は 4 つだけです。

戻り値

[x,y,z] レコードの配列。各フィールドは int です。外側の配列の [0] が開始点です。最後のエントリは、指定されたターゲット許容値内にあります。空でない配列の場合のみ、ステップ数は ArrayLength(パス)-1 です。空の配列 [] は、完全な有効なパスが取得されていないことを意味します (到達不能なターゲット/マップ、制限または検索制限)。開始点がすでに適切である場合、1 つのレコードが返され、ステップ数は 0 になります。部分パスは返されません。

動作

  • チームはルートを計算するだけです。動き始めたり、ドアが開いたりすることはありません。実行するには、NewMoveXY/MoveXYZ を使用し、自身の結果を確認します。
  • 探索では、隣接する移動が等しいコストであるとみなして障害物を回避します。一定のマップ上で、ステップ数が最小のパスが検索されます。クライアントの対角線の高さと制限を含め、各肋骨の実際の開通性がチェックされます。
  • 開いているノードは 4096 まで、ステップは 4096 までです。長く複雑なパスがある場合でも、作業制限により空の配列が作成される可能性があります。長いルートをセクションに分割します。
  • クライアントでは、計算は最大 32 ノードの部分に分割され、ノード間で約 1 ミリ秒のバジェット チェックが行われます。キャンセルはサービングの間にチェックされます。カードの読み取りはゲーム スレッドに残ります。個々のディスクの固定読み取り時間を保証するものではありません。
  • 検証後にマップが変更される場合があります。キャラクターが移動したり、ドアが閉まり、サーバーが状況を修正したりします。結果として得られる配列は、使用可能なローカル データの計画であり、サーバーの確認ではありません。
  • SetBadLocation はセルを除外し、SetBadObject は適切に読み込まれたワールド オブジェクトの周囲の領域を除外します。リクエスト時のランタイム リストのスナップショットが使用されます。別の起動からの禁止は継承されません。開始セルが立っているかどうかはチェックされません。開始セルは呼び出しコードによって指定されます。壁内の任意の Z を有効な開始位置として使用することはできません。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は 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。正確な許容差を備えた同じ高さのパス - 直接スクリプト

引数と実行の流れ:

  • 最初の 3 つの値は元の X/Y/Z です。次の 3 つが目的です。
  • 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 await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    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。
  • last は、キャラクターの現在の位置ではなく、プラン内の最後のエントリです。チームは彼を動かさない。
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 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;
}

UO.GetRun

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

C# のシグネチャ

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

最後に知られた方向 mobile の実行フラグをチェックします。

引数

  • id — 特定のオブジェクトの必須 serial/ID: int、16 進文字列またはエイリアス self、backpack、lasttarget、lastobject、lastcontainer、laststatus、finditem、lastcorpse、または名前はAddObject。これはgraphic/typeではありません。指定されていない名前は 0 に解決されます。このコマンドは新しいターゲットを開きません。 GetRun には、self の GetRun() という形式もあります。
  • ObjID — 特定のオブジェクトの必須 serial/ID: int、16 進文字列またはエイリアス self、backpack、lasttarget、lastobject、lastcontainer、laststatus、finditem、lastcorpse、または名前はAddObject。これはgraphic/typeではありません。指定されていない名前は 0 に解決されます。このコマンドは新しいターゲットを開きません。 GetRun には、self の GetRun() という形式もあります。
  • MobID — 特定のオブジェクトの必須 serial/ID: int、16 進文字列またはエイリアス self、backpack、lasttarget、lastobject、lastcontainer、laststatus、finditem、lastcorpse、または名前はAddObject。これはgraphic/typeではありません。指定されていない名前は 0 に解決されます。このコマンドは新しいターゲットを開きません。 GetRun には、self の GetRun() という形式もあります。

戻り値

int 1 - ロードされた mobile には Direction.Running 属性があります。 int 0 - 属性が欠落しています。オブジェクトは mobile ではないか、不明または削除されています。前回の走行フラグは停止後も保持されてもよい。これはルートのアクティビティではなく、速度や残りの歩数でもありません。 self を移動するには、Moving() も使用します。

コマンドの結果は数値フラグです。1 は条件が満たされたことを意味し、0 は条件が満たされていないことを意味します。 var result = command(...) の後、(result != 0) または (result == 0) を確認します。 1 回の呼び出しの結果を保存します。呼び出しを繰り返すと、アクションを再度実行したり、すでに変更された状態を読み取ることができます。

動作

  • ローカル クライアント モデルが読み取られます。サーバーへのリクエストはなく、待機や移動もありません。
  • 結果は読書の瞬間を指します。 UO.Wait またはその他のアクションの後、オブジェクトとそのフラグが変更される場合があります。
  • 前回の走行フラグは停止後も保持されてもよい。これはルートのアクティビティではなく、速度や残りの歩数でもありません。 self を移動するには、Moving() も使用します。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は 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 は、変化する lasttarget へのライブ参照ではなく、単一の serial を保存します。
  • 結果は、Direction.Running フィールドを参照します。データは、クライアントが適切な状態を受け取った後にのみ更新されます。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    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 がまだ存在するかどうかが別途確認されます。
  • 2 つの画像を比較します。中間の変更は見逃される可能性があり、これはサーバー イベントへの継続的なサブスクリプションではありません。
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;
}

UO.GetRunMountTimer

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

C# のシグネチャ

dynamic UO.GetRunMountTimer();

馬の 1 つの走行ステップの設定された間隔をミリ秒単位で表示します。モードを確認したり、タイミングを予測したり、一時的に減速する前に設定を保存したりするのに役立ちます。

引数

パラメータはありません。

戻り値

int から 100 から 2000 まで - ミリ秒単位で設定された間隔。デフォルトは100です。これは回数であり、true/false、ID、および通過したセルの数ではありません。

動作

  • 設定はライディングモードに適用されます。標準および最小許容値は 100 ミリ秒です。上限は 2000 ミリ秒です。他の 3 つのモードには個別の設定があります。
  • これはキャラクターのローカル移動間隔であり、ping、FPS、経路探索タイムアウト、または測定されたサーバー ステップ継続時間ではありません。数値を大きくすると動きが遅くなります。標準間隔より短くしても、パケットの送信速度は向上しません。
  • チーム自体は移動を開始せず、マウントに乗り、歩行/走行モードを変更しません。モードは運転中に選択されます。サーバーによって指定された速度モードとフライトは、クライアントによっても考慮されます。
  • この設定は、このクライアントの移動に一般的なものです。手動制御、マップ ルート、その他のスクリプトで使用できます。一時的に変更し、前の値を保持し、操作後に復元します。複数の手順から 1 つのモードを同時に変更しないでください。
  • ターンや逸脱ステップは通常の動きとは異なります。サーバーの確認や通信の遅延、障害などにより実際の時間が長くなる可能性があります。クライアントは、欠落したフレームを補うために一連の高速化されたステップを送信しません。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は 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。短距離ルートに対する遅延の寄与を推定 - シナリオ機能

引数と実行の流れ:

  • Steps=5 は評価するステップ数であり、コマンド パラメータではありません。乗算では、設定された遅延の寄与のみが得られます。到着時間やルートのタイムアウトを約束するものではありません。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var steps = 5;
    var delayMs = UO.GetRunMountTimer();
    var estimateMs = steps * delayMs;
    UO.Print("Step-delay budget, ms: " + Convert.ToString(estimateMs));
    return null;
}

3。以前に追加された速度低下を削除する - スクリプト クラス

引数と実行の流れ:

  • 以前は 100 ミリ秒と比較されます。標準間隔が設定され、他の 3 つのモードは保存されます。キャラクターはチャレンジ自体からはどこにも移動しません。
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 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;
}

UO.GetRunUnMountTimer

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

C# のシグネチャ

dynamic UO.GetRunUnMountTimer();

設定された 1 歩行ステップの間隔をミリ秒単位で表示します。モードを確認したり、タイミングを予測したり、一時的に減速する前に設定を保存したりするのに役立ちます。

引数

パラメータはありません。

戻り値

int から 200 から 2000 まで - ミリ秒単位で設定された間隔。デフォルトは200です。これは回数であり、true/false、ID、および通過したセルの数ではありません。

動作

  • この設定は歩行モードに適用されます。標準および最小許容値は 200 ミリ秒です。上限は 2000 ミリ秒です。他の 3 つのモードには個別の設定があります。
  • これはキャラクターのローカル移動間隔であり、ping、FPS、経路探索タイムアウト、または測定されたサーバー ステップ継続時間ではありません。数値を大きくすると動きが遅くなります。標準間隔より短くしても、パケットの送信速度は向上しません。
  • チーム自体は移動を開始せず、マウントに乗り、歩行/走行モードを変更しません。モードは運転中に選択されます。サーバーによって指定された速度モードとフライトは、クライアントによっても考慮されます。
  • この設定は、このクライアントの移動に一般的なものです。手動制御、マップ ルート、その他のスクリプトで使用できます。一時的に変更し、前の値を保持し、操作後に復元します。複数の手順から 1 つのモードを同時に変更しないでください。
  • ターンや逸脱ステップは通常の動きとは異なります。サーバーの確認や通信の遅延、障害などにより実際の時間が長くなる可能性があります。クライアントは、欠落したフレームを補うために一連の高速化されたステップを送信しません。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は 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。短距離ルートに対する遅延の寄与を推定 - シナリオ機能

引数と実行の流れ:

  • Steps=5 は評価するステップ数であり、コマンド パラメータではありません。乗算では、設定された遅延の寄与のみが得られます。到着時間やルートのタイムアウトを約束するものではありません。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var steps = 5;
    var delayMs = UO.GetRunUnMountTimer();
    var estimateMs = steps * delayMs;
    UO.Print("Step-delay budget, ms: " + Convert.ToString(estimateMs));
    return null;
}

3。以前に追加された速度低下を削除する - スクリプト クラス

引数と実行の流れ:

  • 以前は 200 ミリ秒と比較されます。標準間隔が設定され、他の 3 つのモードは保存されます。キャラクターはチャレンジ自体からはどこにも移動しません。
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 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;
}

UO.GetWalkMountTimer

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

C# のシグネチャ

dynamic UO.GetWalkMountTimer();

馬に乗って歩く 1 歩の設定された間隔をミリ秒単位で表示します。モードを確認したり、タイミングを予測したり、一時的に減速する前に設定を保存したりするのに役立ちます。

引数

パラメータはありません。

戻り値

int から 200 から 2000 まで - ミリ秒単位で設定された間隔。デフォルトは200です。これは回数であり、true/false、ID、および通過したセルの数ではありません。

動作

  • 設定はライディングモードに適用されます。標準および最小許容値は 200 ミリ秒です。上限は 2000 ミリ秒です。他の 3 つのモードには個別の設定があります。
  • これはキャラクターのローカル移動間隔であり、ping、FPS、経路探索タイムアウト、または測定されたサーバー ステップ継続時間ではありません。数値を大きくすると動きが遅くなります。標準間隔より短くしても、パケットの送信速度は向上しません。
  • チーム自体は移動を開始せず、マウントに乗り、歩行/走行モードを変更しません。モードは運転中に選択されます。サーバーによって指定された速度モードとフライトは、クライアントによっても考慮されます。
  • この設定は、このクライアントの移動に一般的なものです。手動制御、マップ ルート、その他のスクリプトで使用できます。一時的に変更し、前の値を保持し、操作後に復元します。複数の手順から 1 つのモードを同時に変更しないでください。
  • ターンや逸脱ステップは通常の動きとは異なります。サーバーの確認や通信の遅延、障害などにより実際の時間が長くなる可能性があります。クライアントは、欠落したフレームを補うために一連の高速化されたステップを送信しません。
  • 通常のクライアント ホストでは、この状態データは GetPersistentState マネージャーから取得され、同じワールド/プロファイルのスクリプト/チャット/マクロに共通であり、1 つのスクリプトに属しません。別のプロセス、または明らかに別個の InjectionRuntimeState の状態は異なります。プロファイルをロード/クリアすると、プロファイルを置き換えることができます。保存された serial はロードされたワールドに対して引き続きチェックされます。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は 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。短距離ルートに対する遅延の寄与を推定 - シナリオ機能

引数と実行の流れ:

  • Steps=5 は評価するステップ数であり、コマンド パラメータではありません。乗算では、設定された遅延の寄与のみが得られます。到着時間やルートのタイムアウトを約束するものではありません。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var steps = 5;
    var delayMs = UO.GetWalkMountTimer();
    var estimateMs = steps * delayMs;
    UO.Print("Step-delay budget, ms: " + Convert.ToString(estimateMs));
    return null;
}

3。以前に追加された速度低下を削除する - スクリプト クラス

引数と実行の流れ:

  • 以前は 200 ミリ秒と比較されます。標準間隔が設定され、他の 3 つのモードは保存されます。キャラクターはチャレンジ自体からはどこにも移動しません。
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 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;
}

UO.GetWalkUnmountTimer

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

C# のシグネチャ

dynamic UO.GetWalkUnmountTimer();

設定された 1 歩行ステップの間隔をミリ秒単位で表示します。モードを確認したり、タイミングを予測したり、一時的に減速する前に設定を保存したりするのに役立ちます。

引数

パラメータはありません。

戻り値

int から 400 から 2000 まで - ミリ秒単位で設定された間隔。デフォルトは400です。これは回数であり、true/false、ID、および通過したセルの数ではありません。

動作

  • この設定は歩行モードに適用されます。標準および最小許容値は 400 ミリ秒です。上限は 2000 ミリ秒です。他の 3 つのモードには個別の設定があります。
  • これはキャラクターのローカル移動間隔であり、ping、FPS、経路探索タイムアウト、または測定されたサーバー ステップ継続時間ではありません。数値を大きくすると動きが遅くなります。標準間隔より短くしても、パケットの送信速度は向上しません。
  • チーム自体は移動を開始せず、マウントに乗り、歩行/走行モードを変更しません。モードは運転中に選択されます。サーバーによって指定された速度モードとフライトは、クライアントによっても考慮されます。
  • この設定は、このクライアントの移動に一般的なものです。手動制御、マップ ルート、その他のスクリプトで使用できます。一時的に変更し、前の値を保持し、操作後に復元します。複数の手順から 1 つのモードを同時に変更しないでください。
  • ターンや逸脱ステップは通常の動きとは異なります。サーバーの確認や通信の遅延、障害などにより実際の時間が長くなる可能性があります。クライアントは、欠落したフレームを補うために一連の高速化されたステップを送信しません。
  • 通常のクライアント ホストでは、この状態データは GetPersistentState マネージャーから取得され、同じワールド/プロファイルのスクリプト/チャット/マクロに共通であり、1 つのスクリプトに属しません。別のプロセス、または明らかに別個の InjectionRuntimeState の状態は異なります。プロファイルをロード/クリアすると、プロファイルを置き換えることができます。保存された serial はロードされたワールドに対して引き続きチェックされます。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は 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。短距離ルートに対する遅延の寄与を推定 - シナリオ機能

引数と実行の流れ:

  • Steps=5 は評価するステップ数であり、コマンド パラメータではありません。乗算では、設定された遅延の寄与のみが得られます。到着時間やルートのタイムアウトを約束するものではありません。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var steps = 5;
    var delayMs = UO.GetWalkUnmountTimer();
    var estimateMs = steps * delayMs;
    UO.Print("Step-delay budget, ms: " + Convert.ToString(estimateMs));
    return null;
}

3。以前に追加された速度低下を削除する - スクリプト クラス

引数と実行の流れ:

  • 以前は 400 ミリ秒と比較されます。標準間隔が設定され、他の 3 つのモードは保存されます。キャラクターはチャレンジ自体からはどこにも移動しません。
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 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;
}

UO.IsMoving

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

C# のシグネチャ

int UO.IsMoving();

キャラクターの動きを確認します。

引数

パラメータはありません。

戻り値

int bool (1/0): 1 - 自動パスファインダーがアクティブであるか、キャラクターのキューにまだステップが存在します。 0 - 両方が欠落しているか、キャラクターがロードされていません。これは目標や歩数の達成を確認するものではありません。

コマンドの結果は数値フラグです。1 は条件が満たされたことを意味し、0 は条件が満たされていないことを意味します。 var result = command(...) の後、(result != 0) または (result == 0) を確認します。 1 回の呼び出しの結果を保存します。呼び出しを繰り返すと、アクションを再度実行したり、すでに変更された状態を読み取ることができます。

動作

  • 受信済みのローカルデータを読み込みます。このリクエストはステータスをオープンせず、サーバーに更新の送信を強制しません。死亡、マップの遷移、またはオブジェクトの削除後、2 つの呼び出しの間で値が変化する可能性があります。
  • これらは読み取り関数です。結果を変数に代入すると、スナップショットが保存されます。キャラクターの特性は変わりません。名前では大文字と小文字が区別されません。必要な数の引数を指定して、示されている形式を正確に使用してください。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は 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 await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    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。無期限に待機せずに状態変化を通知する - スクリプト クラス

引数と実行の流れ:

  • 引数なしの 2 つの呼び出しは self となります。 UO.Wait(500) - 0.5 秒間停止します。
  • 2 つのフラグのスナップショットが比較されます。ショット間のトランジションはスキップされる場合があります。すべてのサーバー イベントをサブスクリプションするわけではありません。
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;
}

UO.IsRunning

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

C# のシグネチャ

int UO.IsRunning(object? arg0);

最後に知られた方向 mobile の実行フラグをチェックします。

引数

  • id — 特定のオブジェクトの必須 serial/ID: int、16 進文字列またはエイリアス self、backpack、lasttarget、lastobject、lastcontainer、laststatus、finditem、lastcorpse または name AddObject。これはgraphic/typeではありません。指定されていない名前は 0 に解決されます。このコマンドは新しいターゲットを開きません。引数は必須です。あなた自身のために、self を渡してください。
  • ObjID — 特定のオブジェクトの必須 serial/ID: int、16 進文字列またはエイリアス self、backpack、lasttarget、lastobject、lastcontainer、laststatus、finditem、lastcorpse または name AddObject。これはgraphic/typeではありません。指定されていない名前は 0 に解決されます。このコマンドは新しいターゲットを開きません。引数は必須です。あなた自身のために、self を渡してください。
  • MobID — 特定のオブジェクトの必須 serial/ID: int、16 進文字列またはエイリアス self、backpack、lasttarget、lastobject、lastcontainer、laststatus、finditem、lastcorpse または name AddObject。これはgraphic/typeではありません。指定されていない名前は 0 に解決されます。このコマンドは新しいターゲットを開きません。引数は必須です。あなた自身のために、self を渡してください。

戻り値

int 1 - ロードされた mobile には Direction.Running 属性があります。 int 0 - 属性が欠落しています。オブジェクトは mobile ではないか、不明または削除されています。前回の走行フラグは停止後も保持されてもよい。これはルートのアクティビティではなく、速度や残りの歩数でもありません。 self を移動するには、Moving() も使用します。

コマンドの結果は数値フラグです。1 は条件が満たされたことを意味し、0 は条件が満たされていないことを意味します。 var result = command(...) の後、(result != 0) または (result == 0) を確認します。 1 回の呼び出しの結果を保存します。呼び出しを繰り返すと、アクションを再度実行したり、すでに変更された状態を読み取ることができます。

動作

  • ローカル クライアント モデルが読み取られます。サーバーへのリクエストはなく、待機や移動もありません。
  • 結果は読書の瞬間を指します。 UO.Wait またはその他のアクションの後、オブジェクトとそのフラグが変更される場合があります。
  • 前回の走行フラグは停止後も保持されてもよい。これはルートのアクティビティではなく、速度や残りの歩数でもありません。 self を移動するには、Moving() も使用します。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は 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 は、変化する lasttarget へのライブ参照ではなく、単一の serial を保存します。
  • 結果は、Direction.Running フィールドを参照します。データは、クライアントが適切な状態を受け取った後にのみ更新されます。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    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 がまだ存在するかどうかが別途確認されます。
  • 2 つの画像を比較します。中間の変更は見逃される可能性があり、これはサーバー イベントへの継続的なサブスクリプションではありません。
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;
}

UO.LastStepQUsedDoor

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

C# のシグネチャ

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

最後の StepQ コマンドのドア開放試行フラグを読み取るか、手動で変更します。

引数

  • value — オプションの整数。まさにこの数値が引数とともに保存されます。引数がない場合、読み取りが実行されます。

戻り値

int — 保存されたマーク。通常の StepQ はそれを 0 にリセットし、moveOpenDoor が有効な場合、TryOpenDoorForStep の結果を記録します。試行が検出された場合は 1、それ以外の場合は 0 です。手動フォームでは他の番号も使用できます。これはserial のドアやその開閉の確認ではありません。

動作

  • このチェックでは、サーバーからドアのステータスを読み取りません。フォールバック呼び出し OpenDoor はゼロマークを変更しません。
  • 接続/耐久により StepQ が早期に失敗した場合、リセットはまだ実行されていないため、以前の値が残る可能性があります。
  • 通常のクライアント ホストでは、この状態データは GetPersistentState マネージャーから取得され、同じワールド/プロファイルのスクリプト/チャット/マクロに共通であり、1 つのスクリプトに属しません。別のプロセス、または明らかに別個の InjectionRuntimeState の状態は異なります。プロファイルをロード/クリアすると、プロファイルを置き換えることができます。保存された serial はロードされたワールドに対して引き続きチェックされます。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は bool に変換されません。配列の場合は要素数を表示します。

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

1。既読マーク - 直接スクリプト

引数と実行の流れ:

  • 引数を指定しないと、保存されている数値が読み取られます。
  • UseObject に対して ID のように使用しないでください。
UO.Print(Convert.ToString(UO.LastStepQUsedDoor()));

2。ステップ - スクリプト関数を試行する前にリセットしてください

引数と実行の流れ:

  • value=0 は前のマークをクリアします。方向=2 — E;実行=false。
  • 結果StepQとドアマークは意味が異なります。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    UO.LastStepQUsedDoor(0);
    var status = UO.StepQ(2, false);
    UO.Print(Convert.ToString(UO.LastStepQUsedDoor()));
    return null;
}

3。マークの保存と復元 - スクリプト クラス

引数と実行の流れ:

  • 前 — 保存された値。
  • 手動回復では、ドアに対して何もアクションは実行されません。
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 previous = UO.LastStepQUsedDoor();
        UO.LastStepQUsedDoor(0);
        UO.Print(Convert.ToString(UO.LastStepQUsedDoor()));
        UO.LastStepQUsedDoor(previous);
        return null;
    }
}

UO.Move

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

C# のシグネチャ

int UO.Move();

まだ完了していない自動ルートまたはキャラクターステップがあるかどうかを読み取ります。

引数

パラメータはありません。

戻り値

int 1 — パスファインダーがアクティブであるか、ステップがキャラクター アニメーション キューに残っています。 0 - 両方が欠落しているか、キャラクターがロードされていません。これは、歩数、前の目標に到達した結果、またはマウスを保持している兆候ではありません。

コマンドの結果は数値フラグです。1 は条件が満たされたことを意味し、0 は条件が満たされていないことを意味します。 var result = command(...) の後、(result != 0) または (result == 0) を確認します。 1 回の呼び出しの結果を保存します。呼び出しを繰り返すと、アクションを再度実行したり、すでに変更された状態を読み取ることができます。

動作

  • このコマンドは状態を読み取るだけです。結果がゼロ以外の場合、互換性のあるタイマー TicksAnim が更新されます。マウス/キーによって要求されたステップも、キューに残っている間カウントされます。
  • 自動ルートを停止するには、MoverStop を使用します。 MoveOff はその他のキーボードステップを制御します。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は 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 は、おおよその制限値である 5 秒を設定した 50 ミリ秒以上待機します。
  • このチェックを実行しても、それ自体は動作を開始または停止しません。
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 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()
    {
        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;
}

UO.MoveOff

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

C# のシグネチャ

void UO.MoveOff();

互換性のある PMove キー ステップを無効にします。

引数

パラメータはありません。

戻り値

void - 戻り値はありません。別の回線で電話してください。 true/false や歩数ではありません。

動作

  • 実行時状態で MoveEnabled フラグを変更します。これはユニバーサル文字ロックではありません。NewMoveXY、MoveXYZ、Step、マウスはこのフラグによって制御されません。
  • MoveOff は、すでに実行中のパスファインダーを停止しません。 MoverStop が必要です。
  • 通常のクライアント ホストでは、この状態データは GetPersistentState マネージャーから取得され、同じワールド/プロファイルのスクリプト/チャット/マクロに共通であり、1 つのスクリプトに属しません。別のプロセス、または明らかに別個の 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 await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    UO.MoveOn();
    UO.PMove(UO.GetX() + 1, UO.GetY());
    UO.MoveOff();
    return null;
}

3。ステップをオフにして自動ルートを個別に削除する - スクリプト クラス

引数と実行の流れ:

  • 2 つのチームは異なる動作メカニズムを制御します。
  • Move() は自動ルートを読み取ります。 MoveEnabled のテストとは考えないでください。
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.MoveOff();
        UO.MoverStop();
        UO.Print(Convert.ToString(UO.Move()));
        return null;
    }
}

UO.MoveOn

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

C# のシグネチャ

void UO.MoveOn();

互換性のある PMove キー ステップを有効にします。

引数

パラメータはありません。

戻り値

void - 戻り値はありません。別の回線で電話してください。 true/false や歩数ではありません。

動作

  • 実行時状態で MoveEnabled フラグを変更します。これはユニバーサル文字ロックではありません。NewMoveXY、MoveXYZ、Step、マウスはこのフラグによって制御されません。
  • MoveOff は、すでに実行中のパスファインダーを停止しません。 MoverStop が必要です。
  • 通常のクライアント ホストでは、この状態データは GetPersistentState マネージャーから取得され、同じワールド/プロファイルのスクリプト/チャット/マクロに共通であり、1 つのスクリプトに属しません。別のプロセス、または明らかに別個の 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 await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    UO.MoveOn();
    UO.PMove(UO.GetX() + 1, UO.GetY());
    UO.MoveOff();
    return null;
}

3。 PMove の前にキーの移動を復元 - スクリプト クラス

引数と実行の流れ:

  • MoveOn は、互換性のある PMove キー ステップを有効にし、値を返しません。移動の結果は座標によってチェックされます。 MoveOn はすべての動作モードを制御するわけではありません。
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.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;
    }
}

UO.MoveXY

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

C# のシグネチャ

dynamic UO.MoveXY(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4);

5 つの必須パラメーターを使用してキャラクターを X/Y に移動し、結果を待ちます。

引数

  • Xdst — 目的地の世界座標 X、0..65535。ここはserial やガンプ内の位置ではありません。
  • x — 目的地の世界座標 X、0..65535。ここはserial やガンプ内の位置ではありません。
  • Ydst — 目的地のワールド Y 座標、0..65535。
  • y — 目的地のワールド 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 result = command(...) の後、(result != 0) または (result == 0) を確認します。 1 回の呼び出しの結果を保存します。呼び出しを繰り返すと、アクションを再度実行したり、すでに変更された状態を読み取ることができます。

動作

  • 完全な A* ルートは、最初のステップの前に、クライアント更新間の短い部分で構築されます。 Optimized=true の場合、パスの次の 4 セルがチェックされます。 false が最も近いステップの場合。これはすでに計算された経路のチェックであり、ルート全体の距離やマウスを動かしたときの迂回スライダーではありません。
  • サーバー障害 DenyWalk または新しい障害物により、ステップのキューを完了した後、現在の位置からの再計算が要求されます。繰り返しの数と再計算の頻度は制限されています。どのパスも 0 で移動を終了することはできません。
  • ルートは、それを開始したプロシージャに属します。その緊急停止により、残りの自動パスがキャンセルされます。別の実行またはユーザーがすでにルートを置き換えている場合、前の所有者をキャンセルしても新しいルートには影響しません。すでに送信されたステップは呼び出されません。
  • SetBadLocation と SetBadObject は、ルートの開始時に現在のランタイムの禁止事項のスナップショットとして使用されます。これらは内部の再計算中に保存されます。リストを変更またはクリアすると、すでに進行中のルートが上書きされるのではなく、次のルートに影響します。
  • リクエストを受け入れた後、呼び出しはスクリプト スレッドで待機します。初期検索と再計算はゲーム ストリーム上でチャンク単位で実行されます。最大 32 ノード拡張とチャンクあたり約 1 ミリ秒のソフト バジェットです。 1 回の複雑な細胞チェックやカード読み取りでは、この予算を超える場合があります。部分の間では、クライアントは更新を続けます。合計検索制限は 10000 ノードのままです。
  • タイムアウトはリクエストが受け入れられた後にカウントされ、その後の検索と再計算の部分が含まれます。 stopOnStuck は、実行中の検索を文字のスタックとはみなしません。計画が完了すると、位置の変更は再度考慮されません。最後の 1/0 は、パスの準備状況だけでなく、実際の座標をチェックします。
  • 結果にはクライアントのローカル位置が考慮されます。その後のサーバー修正はまだ可能です。異なるルーチンから競合する移動コマンドを実行すると、キャラクターの全体的なルートが変更されます。
  • 設定 moveCheckStamina、moveExitOnDisconnect、moveOpenDoor、moveThroughCorner、moveThroughNPC、moveHeuristicMult、moveTurnCost、moveBetweenTwoCorners はパフォーマンスに影響します。明示的な avoidMobiles/openDoors は、この呼び出しに対応する値をオーバーライドします。
  • 結果 0 は正確な原因を示していません。座標、接続、スタミナ、ログを確認します。 UO.Wait と試行回数制限なしで動きを際限なく繰り返さないでください。
  • ターゲット Z は呼び出されたときに取得されます (許容値 Z=255)。追加の制限については、NewMoveXY を使用します。高さを選択するには - MoveXYZ。
  • メイン ブリッジは、リクエスト番号、プレーヤー/パスファインダー/マップ インスタンス、およびマップ インデックスを記録します。新しいリクエスト、コンテキストの変更、または最終的な拒否では、0 が与えられます。座標と最後のコールバックを読み取った後、チェックが繰り返されます。タイムアウト、maxSteps、およびコールバック=0 は、保存されたリクエストを停止するだけであり、新しい外部ルートは停止しません。一時的にブロックされても、回復がまだアクティブである間は所有権を失うことはなく、待機は継続されます。 IApiMovementOwnershipBridge のない外部レガシー ブリッジの場合、以前の互換性のあるメカニズムが保持されます。
  • 一般的なパスファインダーは、対応するアクティブなリクエストの移動が拒否された場合に限り、2000 ミリ秒間の方向遷移 X/Y/Z の一時的な禁止を最大 8 まで保存します。ローテーション、未知のシーケンス、再同期、および古い/外部リクエストでは、そのような禁止は発生しません。新しい外部リクエストとマップ/プレイヤー コンテキストの損失により、それらはクリアされます。ロードされたジオメトリ検索は遷移をバイパスしようとします。サーバーの障害をすべて知っているわけではありません。プレーヤーの X/Y/Z を変更せずに、少なくとも 40 ミリ秒の一時停止を伴って、最大 8 の内部再計算が許可されます。完全なパスが存在しないか、この予算が使い果たされているため、ルートは終了します。調整タスクは、送信されたステップを処理した後に完了します。 mobile-Follow は遅延に基づいて再試行する場合があります。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は 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 - 東に 2 セル。 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 await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    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 を自分のものに置き換えます。耐久性のしきい値は、6 番目の MoveXY パラメーターではなく、別の設定によって設定されます。
  • 正常復帰後は元の値に戻ります。アボートが発生した場合、それ以降の行は実行されません。

標準走行速度

最小ステップ間隔: ウォーキング - ウォーキング 400 ミリ秒、ランニング 200 ミリ秒。乗車 - ウォーキング 200 ミリ秒、ランニング 100 ミリ秒。

これらは標準的なクライアント制限であり、シャードに対して自動的に定義される設定ではありません。サーバーの速度とフライト モードは個別にカウントされます。スクリプト タイマーは動作を遅くする可能性がありますが、これらの制限は軽減されません。

ステップ、ルート、Follow、マウス/キー コントロール、マップはキャラクターの共有キューを使用します。サーバーによるルートの置き換え、方向転換、または位置の調整では、ステップ要求後の残りの一時停止はキャンセルされません。遅延の後は、ドロップされたフレームを補うための高速バーストはありません。確認を待っていたり、障害物があったり、コミュニケーションが不十分だったりすると、動きが遅くなる可能性があります。

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 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;
    }
}

UO.MoveXYZ

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

C# のシグネチャ

int UO.MoveXYZ(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5);
int UO.MoveXYZ(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6);
int UO.MoveXYZ(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7);
int UO.MoveXYZ(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8);
int UO.MoveXYZ(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8, object? arg9);

別々の水平許容値と垂直許容値を使用して、キャラクターをワールド内の点に移動します。

引数

  • 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 result = command(...) の後、(result != 0) または (result == 0) を確認します。 1 回の呼び出しの結果を保存します。呼び出しを繰り返すと、アクションを再度実行したり、すでに変更された状態を読み取ることができます。

動作

  • 仕組み、ステップ 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 および 2 X=1278..1280、Y=539..541 が適しています。 Z=18..22。
  • 最小形式には 6 つの引数 UO.MoveXYZ(1279,540,20,1,2,true) が含まれます。追加の引数は、タイムアウト、maxSteps、avoidMobiles、openDoors の順序で右側に追加されます。 openDoors を指定するには、前の位置も渡す必要があります。カンマ間の空白はサポートされていません。
  • NewMoveXY との違い: MoveXYZ は 3 番目の引数としてターゲットの高さを受け取ります。 NewMoveXY の 3 番目の引数は Optimized です。そこで高度を移動することはできません。このランタイムでは、MoveXYZ にはコールバックがありません。
  • ルートは、それを開始したプロシージャに属します。その緊急停止により、残りの自動パスがキャンセルされます。別の実行またはユーザーがすでにルートを置き換えている場合、前の所有者をキャンセルしても新しいルートには影響しません。すでに送信されたステップは呼び出されません。
  • SetBadLocation と SetBadObject は、ルートの開始時に現在のランタイムの禁止事項のスナップショットとして使用されます。これらは内部の再計算中に保存されます。リストを変更またはクリアすると、すでに進行中のルートが上書きされるのではなく、次のルートに影響します。
  • リクエストを受け入れた後、呼び出しはスクリプト スレッドで待機します。初期検索と再計算はゲーム ストリーム上でチャンク単位で実行されます。最大 32 ノード拡張とチャンクあたり約 1 ミリ秒のソフト バジェットです。 1 回の複雑な細胞チェックやカード読み取りでは、この予算を超える場合があります。部分の間では、クライアントは更新を続けます。合計検索制限は 10000 ノードのままです。
  • タイムアウトはリクエストが受け入れられた後にカウントされ、その後の検索と再計算の部分が含まれます。 stopOnStuck は、実行中の検索を文字のスタックとはみなしません。計画が完了すると、位置の変更は再度考慮されません。最後の 1/0 は、パスの準備状況だけでなく、実際の座標をチェックします。
  • 結果にはクライアントのローカル位置が考慮されます。その後のサーバー修正はまだ可能です。異なるルーチンから競合する移動コマンドを実行すると、キャラクターの全体的なルートが変更されます。
  • 設定 moveCheckStamina、moveExitOnDisconnect、moveOpenDoor、moveThroughCorner、moveThroughNPC、moveHeuristicMult、moveTurnCost、moveBetweenTwoCorners はパフォーマンスに影響します。明示的な avoidMobiles/openDoors は、この呼び出しに対応する値をオーバーライドします。
  • 結果 0 は正確な原因を示していません。座標、接続、スタミナ、ログを確認します。 UO.Wait と試行回数制限なしで動きを際限なく繰り返さないでください。
  • メイン ブリッジは、リクエスト番号、プレーヤー/パスファインダー/マップ インスタンス、およびマップ インデックスを記録します。新しいリクエスト、コンテキストの変更、または最終的な拒否では、0 が与えられます。座標と最後のコールバックを読み取った後、チェックが繰り返されます。タイムアウト、maxSteps、およびコールバック=0 は、保存されたリクエストを停止するだけであり、新しい外部ルートは停止しません。一時的にブロックされても、回復がまだアクティブである間は所有権を失うことはなく、待機は継続されます。 IApiMovementOwnershipBridge のない外部レガシー ブリッジの場合、以前の互換性のあるメカニズムが保持されます。
  • 一般的なパスファインダーは、対応するアクティブなリクエストの移動が拒否された場合に限り、2000 ミリ秒間の方向遷移 X/Y/Z の一時的な禁止を最大 8 まで保存します。ローテーション、未知のシーケンス、再同期、および古い/外部リクエストでは、そのような禁止は発生しません。新しい外部リクエストとマップ/プレイヤー コンテキストの損失により、それらはクリアされます。ロードされたジオメトリ検索は遷移をバイパスしようとします。サーバーの障害をすべて知っているわけではありません。プレーヤーの X/Y/Z を変更せずに、少なくとも 40 ミリ秒の一時停止を伴って、最大 8 の内部再計算が許可されます。完全なパスが存在しないか、この予算が使い果たされているため、ルートは終了します。調整タスクは、送信されたステップを処理した後に完了します。 mobile-Follow は遅延に基づいて再試行する場合があります。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は 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 は 2 番目の引数、ターゲットの Y ワールド座標です。
  • 3。 destinationZ=20 — 3 番目の引数、高さ。チームは通路または階段を見つけなければなりません。値 20 自体はフロアに転送されません。
  • 4。 accuracyXY=1 を使用すると、各水平座標に沿って 1 つのセル内で終了できます。斜めに隣接するセルも適しています。
  • 5。 accuracyZ=2 では、18 から 22 までの高さを許可します。別のフロアでの X/Y マッチだけでは成功には十分ではありません。
  • 6。 running=true リクエストが実行中です。歩行の場合は、true を false に置き換えます。
  • 7。 timeout=8000 は、ルート開始後の待機を 8 秒に制限します。この時間が経過すると、まだ動作が進行中ですが、コマンドは動作を停止し、0 を返します。
  • 8。 maxSteps=100 は、観察される位置変化の数を制限します。これは、通過した正方形の正確な数ではありません。ポーリングの間に複数のステップが発生する場合があります。
  • 9。 avoidMobiles=true は、ルートの計算時に考慮される文字の通過を禁止します。
  • 10。 openDoors=true は、途中でドアを開ける試みを許可します。このフラグは、ロックされたドアやサーバーの制限を回避しません。
  • 通話終了後、到達した人は int 1 または 0 を受信します。 == 1 に達した場合は成功分岐を実行します。 else は、コマンドを際限なく繰り返すことなく、目標の達成に失敗した場合に処理します。
  • 最後の行は、確認のために現在の X/Y/Z を出力します。プロシージャが中止されると、この出力を含むそれ以降の行は実行されません。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    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 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 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 という両方の必要な部分が含まれています。

  • 6 つのパラメータ GoToPoint はすべて、変更せずに MoveXYZ に渡されます。関数内では、8000 ミリ秒、100 観測された位置変化、キャラクターの移動、およびドアの開きという 4 つの追加パラメーターが指定されます。
  • この目的には、1279/540/20、公差1/2 X=1278..1280、Y=539..541、Z=18..22が適しています。 18..22 を超える別の高度にあるポイントには到達したとみなされません。
  • これは実際のコマンドのラッパーであり、スクリプト内のパスファインディングの 2 番目の実装ではありません。追加の 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;

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 await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    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 ミリ秒により、クライアントは次のイベントを処理できます。
  • 停止後、座標は個別に読み取られます。この遅延によって、すべてのネットワーク確認応答が受信されることが保証されるわけではありません。
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)));
}

UO.Moving

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

C# のシグネチャ

int UO.Moving();

キャラクターの動きを確認します。

引数

パラメータはありません。

戻り値

int bool (1/0): 1 - 自動パスファインダーがアクティブであるか、キャラクターのキューにまだステップが存在します。 0 - 両方が欠落しているか、キャラクターがロードされていません。これは目標や歩数の達成を確認するものではありません。

コマンドの結果は数値フラグです。1 は条件が満たされたことを意味し、0 は条件が満たされていないことを意味します。 var result = command(...) の後、(result != 0) または (result == 0) を確認します。 1 回の呼び出しの結果を保存します。呼び出しを繰り返すと、アクションを再度実行したり、すでに変更された状態を読み取ることができます。

動作

  • 受信済みのローカルデータを読み込みます。このリクエストはステータスをオープンせず、サーバーに更新の送信を強制しません。死亡、マップの遷移、またはオブジェクトの削除後、2 つの呼び出しの間で値が変化する可能性があります。
  • これらは読み取り関数です。結果を変数に代入すると、スナップショットが保存されます。キャラクターの特性は変わりません。名前では大文字と小文字が区別されません。必要な数の引数を指定して、示されている形式を正確に使用してください。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は 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 await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    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。無期限に待機せずに状態変化を通知する - スクリプト クラス

引数と実行の流れ:

  • 引数なしの 2 つの呼び出しは self となります。 UO.Wait(500) - 0.5 秒間停止します。
  • 2 つのフラグのスナップショットが比較されます。ショット間のトランジションはスキップされる場合があります。すべてのサーバー イベントをサブスクリプションするわけではありません。
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;
}

UO.NewMoveXY

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

C# のシグネチャ

int UO.NewMoveXY(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4);
int UO.NewMoveXY(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5);
int UO.NewMoveXY(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6);
int UO.NewMoveXY(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7);
int UO.NewMoveXY(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8);
int UO.NewMoveXY(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8, object? arg9);
int UO.NewMoveXY(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8, object? arg9, object? arg10);
int UO.NewMoveXY(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8, object? arg9, object? arg10, object? arg11);
int UO.NewMoveXY(object? arg0, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8, object? arg9, object? arg10, object? arg11, object? arg12);

キャラクターを X/Y に移動し、終了を待って目標の達成を確認します。追加の制限とコールバックをサポートします。

引数

  • Xdst — 目的地の世界座標 X、0..65535。ここはserial やガンプ内の位置ではありません。
  • x — 目的地の世界座標 X、0..65535。ここはserial やガンプ内の位置ではありません。
  • Ydst — 目的地のワールド Y 座標、0..65535。
  • y — 目的地のワールド Y 座標、0..65535。
  • Optimized - true - 前方のパスを検索および確認する通常モード。 false - ヒューリスティックと最近接ステップのチェックを削減します。 false は障害物回避を無効にしません。
  • Accuracy — セル内の X と Y の許容値: 両方の偏差がその範囲内に収まる必要があります。値は 0..20 の範囲に制限されます。 0 には正確な X/Y が必要です。
  • Running - true/1 - リクエストの実行、false/0 - ステップ。サーバー動作の遅延は継続します。速度倍率ではありません。
  • timeout — ミリ秒単位のオプションの待機制限。引数 0 が欠落しており、負の値は、この追加制限がないことを示します。
  • maxSteps — ネットワークパケットではなく、観測された位置変化のオプションの制限。 0/陰性/不在 - この制限なし。ポーリング間にいくつかのステップが存在する可能性があるため、これは正確なセルカウンターではありません。
  • maxDistance — ターゲットまでの初期距離 max(abs(dx),abs(dy)) のオプション制限。 0/不在はそれを無効にします。これは、トラバース中に許容される偏差ではなく、見つかったパスの長さでもありません。
  • AccuracyZ — 高さの許容差: abs(実際の Z - 必要な Z)、0..255 によって制限されます。ゼロには正確な高度が必要です。 255 は基本的に Z リミットを無効にします。 NewMoveXY の場合、ターゲット Z は召喚時のキャラクターの Z と等しくなります。デフォルトの許容誤差は 255 です。
  • avoidMobiles — オプションのフラグ: true は、考慮される文字を通過することを禁止します。 false はその試みを許可します。引数なしでは、moveThroughNPC が使用されます。サーバーは依然としてアクセスを拒否する可能性があります。
  • openDoors — 途中でドアを開けるためのオプションのフラグ。引数なしでは、moveOpenDoor が使用されます。 true では、ロックされたドアにはアクセスできません。
  • stopOnStuck - true は、約 1000 ms の計画の後、X/Y/Z が変化していない場合、0 で移動を完了します。アクティブな検索と再計算部分はこのタイマーをリセットします。個別のタイムアウトは引き続き動作します。デフォルトはfalseです。

戻り値

int 1 - チェックの最後に、キャラクターは、チャレンジ前にすでにそこにいたときを含め、指定された許容範囲 X/Y/Z 内にあります。 int 0 - 無効な座標、発射失敗、未到達点、またはトリガーされた停止条件。歩数やserialではありません。緊急キャンセルの場合は、通常0に戻らず、手続きが中止されます。

コマンドの結果は数値フラグです。1 は条件が満たされたことを意味し、0 は条件が満たされていないことを意味します。 var result = command(...) の後、(result != 0) または (result == 0) を確認します。 1 回の呼び出しの結果を保存します。呼び出しを繰り返すと、アクションを再度実行したり、すでに変更された状態を読み取ることができます。

動作

  • 完全な A* ルートは、最初のステップの前に、クライアント更新間の短い部分で構築されます。 Optimized=true の場合、パスの次の 4 セルがチェックされます。 false が最も近いステップの場合。これはすでに計算された経路のチェックであり、ルート全体の距離やマウスを動かしたときの迂回スライダーではありません。
  • サーバー障害 DenyWalk または新しい障害物により、ステップのキューを完了した後、現在の位置からの再計算が要求されます。繰り返しの数と再計算の頻度は制限されています。どのパスも 0 で移動を終了することはできません。
  • ルートは、それを開始したプロシージャに属します。その緊急停止により、残りの自動パスがキャンセルされます。別の実行またはユーザーがすでにルートを置き換えている場合、前の所有者をキャンセルしても新しいルートには影響しません。すでに送信されたステップは呼び出されません。
  • SetBadLocation と SetBadObject は、ルートの開始時に現在のランタイムの禁止事項のスナップショットとして使用されます。これらは内部の再計算中に保存されます。リストを変更またはクリアすると、すでに進行中のルートが上書きされるのではなく、次のルートに影響します。
  • リクエストを受け入れた後、呼び出しはスクリプト スレッドで待機します。初期検索と再計算はゲーム ストリーム上でチャンク単位で実行されます。最大 32 ノード拡張とチャンクあたり約 1 ミリ秒のソフト バジェットです。 1 回の複雑な細胞チェックやカード読み取りでは、この予算を超える場合があります。部分の間では、クライアントは更新を続けます。合計検索制限は 10000 ノードのままです。
  • タイムアウトはリクエストが受け入れられた後にカウントされ、その後の検索と再計算の部分が含まれます。 stopOnStuck は、実行中の検索を文字のスタックとはみなしません。計画が完了すると、位置の変更は再度考慮されません。最後の 1/0 は、パスの準備状況だけでなく、実際の座標をチェックします。
  • 結果にはクライアントのローカル位置が考慮されます。その後のサーバー修正はまだ可能です。異なるルーチンから競合する移動コマンドを実行すると、キャラクターの全体的なルートが変更されます。
  • 設定 moveCheckStamina、moveExitOnDisconnect、moveOpenDoor、moveThroughCorner、moveThroughNPC、moveHeuristicMult、moveTurnCost、moveBetweenTwoCorners はパフォーマンスに影響します。明示的な avoidMobiles/openDoors は、この呼び出しに対応する値をオーバーライドします。
  • 結果 0 は正確な原因を示していません。座標、接続、スタミナ、ログを確認します。 UO.Wait と試行回数制限なしで動きを際限なく繰り返さないでください。
  • メイン ブリッジは、リクエスト番号、プレーヤー/パスファインダー/マップ インスタンス、およびマップ インデックスを記録します。新しいリクエスト、コンテキストの変更、または最終的な拒否では、0 が与えられます。座標と最後のコールバックを読み取った後、チェックが繰り返されます。タイムアウト、maxSteps、およびコールバック=0 は、保存されたリクエストを停止するだけであり、新しい外部ルートは停止しません。一時的にブロックされても、回復がまだアクティブである間は所有権を失うことはなく、待機は継続されます。 IApiMovementOwnershipBridge のない外部レガシー ブリッジの場合、以前の互換性のあるメカニズムが保持されます。
  • 一般的なパスファインダーは、対応するアクティブなリクエストの移動が拒否された場合に限り、2000 ミリ秒間の方向遷移 X/Y/Z の一時的な禁止を最大 8 まで保存します。ローテーション、未知のシーケンス、再同期、および古い/外部リクエストでは、そのような禁止は発生しません。新しい外部リクエストとマップ/プレイヤー コンテキストの損失により、それらはクリアされます。ロードされたジオメトリ検索は遷移をバイパスしようとします。サーバーの障害をすべて知っているわけではありません。プレーヤーの X/Y/Z を変更せずに、少なくとも 40 ミリ秒の一時停止を伴って、最大 8 の内部再計算が許可されます。完全なパスが存在しないか、この予算が使い果たされているため、ルートは終了します。調整タスクは、送信されたステップを処理した後に完了します。 mobile-Follow は遅延に基づいて再試行する場合があります。

C# のステップ コールバックは、RegisterStepCallback(name, Func<int,int,int,bool>) または Func<int,int,int,int> を介して明示的に登録されます。 x/y/z 座標は int として送信されます。 false/0 はルートを停止し、true/ゼロ以外の番号は継続します。登録は現在の実行では有効であり、それとともに解放されます。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は bool に変換されません。配列の場合は要素数を表示します。

var result = UO.NewMoveXY((UO.GetX() + 3), UO.GetY(), true, 0, false);
UO.Print("NewMoveXY: " + Convert.ToString(result));

1。次のポイントに到達し、結果を確認します - 直接スクリプト

引数と実行の流れ:

  • x/y — 世界ターゲット。 Optimized=true、Accuracy=0 は正確な X/Y を必要とし、Running=false は歩行を指定します。
  • ok - int 1 または 0、通過したセルの数ではありません。ターゲットは現在のマップ上で利用可能である必要があります。
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;

2。時間と距離を制限して走る - スクリプト機能

引数と実行の流れ:

  • 1445/1690 - 目標の例;精度=1 では、近くに駐車できます。走行中=true。 StepCallback=0 はコールバックを無効にします。
  • タイムアウト=5000ミリ秒; maxSteps=100 観察された動き。 maxDistance=30を原点からチェックします。
  • AccuracyZ=255 には床は必要ありません。 avoidMobiles=true、openDoors=true、stopOnStuck=true には、これらの条件が含まれます。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var ok = UO.NewMoveXY(1445, 1690, true, 1, true, 0, 5000, 100, 30, 255, true, true, true);
    UO.Print("Move result: " + Convert.ToString(ok));
    return null;
}

3。コールバックでの耐久性のテスト - スクリプト クラス

引数と実行の流れ:

  • StepCallback="AfterStep" は 3 つの座標を受け取ります。 RegisterStepCallback 登録により、名前が bool デリゲートに関連付けられます。 Stamina <= 10 の場合、false に戻り、動きを停止します。 true がルートを続行します。
  • timeout=5000ms は待機時間を制限します。コールバックは変更が通知された後に呼び出されますが、すべてのネットワーク ステップで保証されるわけではありません。長時間の待ち時間や新しいルートを設定しないでください。
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 stepRegistration = RegisterStepCallback("AfterStep", AfterStep);
        var ok = UO.NewMoveXY(UO.GetX() + 5, UO.GetY(), true, 0, false, "AfterStep", 5000);
        UO.Print("Move result: " + Convert.ToString(ok));
        return null;
    }

    bool AfterStep(int x, int y, int z)
    {
        UO.Print("Position: " + Convert.ToString(x) + "," + Convert.ToString(y) + "," + Convert.ToString(z));
        return UO.Stamina() > 10;
    }

    private IDisposable RegisterStepCallback(string name, Func<int, int, int, bool> handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterStepCallback(name, handler);
    private IDisposable RegisterStepCallback(string name, Func<int, int, int, int> handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterStepCallback(name, handler);
}

4。 GoToPoint: 完全なヘルパー関数コードと Main - 直接スクリプト

引数と実行の流れ:

  • GoToPoint は、この例専用のヘルパー関数です。その 4 つのパラメータ x/y/accuracy/running は関数宣言の上に記述されています。関数の完全な本体は、コピーされた同じブロック内にあります。
  • Main はターゲットを評価し、GoToPoint を呼び出します。これは、optimized=true、callback=0、timeout=8000、および maxSteps=100 を追加し、NewMoveXY を 1 回呼び出して、返された int を Main に返します。
  • NewMoveXY は組み込みのクライアント コマンドです。その A* 検索、パテンシー チェック、およびサーバー ステップの処理は、このスクリプトの追加の隠しプロシージャではなく、クライアントに実装されます。
  • この例では、コールバックが無効になっています。別の例でコールバック名を指定するか、追加のスクリプト関数を呼び出す場合は、その定義も完全に指定する必要があります。
  • C# で (到達!= 0) かどうかを確認します。数値結果 0 は失敗を示します。 int と bool を直接比較することは認められません。緊急キャンセルは実行を中断するため、false を返す必要はありません。
var x = UO.GetX() + 3;
var y = UO.GetY();
var reached = GoToPoint(x, y, 0, true);
if (Truth(Truth(reached) == true))
{
    UO.Print("Destination reached");
}
else
{
    UO.Print("Destination not reached");
}

dynamic GoToPoint(dynamic x, dynamic y, dynamic accuracy, dynamic running)
{
    dynamic optimized = true;
    var callback = 0;
    var timeout = 8000;
    var maxSteps = 100;
    var reached = UO.NewMoveXY(x, y, optimized, accuracy, running, callback, timeout, maxSteps);
    return reached;
}

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

UO.OpenDoor

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

C# のシグネチャ

void UO.OpenDoor();

キャラクターにドアを開けるよう要求します。

引数

パラメータはありません。

戻り値

void - 値がありません。別の回線で電話してください。完了してもサーバーのアクションは確認されません。

動作

  • OpenDoor は Invoke 経由で GameActions.OpenDoor を呼び出します。シリアルドアは受け入れられません。検索ルールと検出ルールは GameActions/server に属します。
  • 例では、UO.Wait はスクリプトの一時停止のみを指定します。一時停止が終了しても、サーバーがリクエストを完了したことは証明されません。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

コマンドは独立した文です。直前のメッセージは呼び出しの開始を示し、サーバーの動作完了を確認するものではありません。

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

1。直接呼び出し - 直接スクリプト

引数と実行の流れ:

  • キャラクターにドアを開けるよう要求します。
UO.OpenDoor();

2。明示的なオプション - スクリプト関数

引数と実行の流れ:

  • OpenDoor は Invoke 経由で GameActions.OpenDoor を呼び出します。シリアルドアは受け入れられません。検索ルールと検出ルールは GameActions/server に属します。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    if (Truth(UO.IsOnline()))
    {
        UO.OpenDoor();
    }

    return null;
}

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

3。完全なヘルパー関数 - スクリプト クラス

引数と実行の流れ:

  • 例では、UO.Wait はスクリプトの一時停止のみを指定します。一時停止が終了しても、サーバーがリクエストを完了したことは証明されません。
return 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.OpenDoor();
        UO.Wait(250);
        UO.Print("Door request sent");
        return null;
    }
}

UO.PMove

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

C# のシグネチャ

void UO.PMove(object? arg0, object? arg1);
void UO.PMove(object? arg0, object? arg1, object? arg2);

30 秒の制限付きで、個別のキーステップを介した X/Y への互換性のある移動コマンド。

引数

  • targetX — ターゲットワールド X。
  • x — ターゲットワールド X。
  • targetY — ターゲットワールド Y。
  • y — ターゲットワールド Y。
  • z — 互換性のある 3 番目の引数は受け入れられますが、無視されます。高さを制御するには、MoveXYZ を使用します。

戻り値

void - 戻り値はありません。別の回線で電話してください。 true/false や歩数ではありません。

動作

  • これは、迂回路を完全に探索することなく、試行間に 75 ミリ秒の一時停止を挟んでターゲットに向かう単純な動きです。障害物のある新しいシナリオの場合は、NewMoveXY を使用します。
  • 30 秒以内に正確な X/Y に到達しない場合、メッセージが表示されます。結果 void からは成功を得ることができません。座標を比較します。
  • MoveOff はこのコマンドの主要なステップを無効にし、MoveOn は再び有効にします。 PMove はモーションをオフにしても、制限まで待つことができます。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

コマンドは独立した文です。直前のメッセージは呼び出しの開始を示し、サーバーの動作完了を確認するものではありません。

UO.Print("Calling UO.PMove");
UO.PMove((UO.GetX() + 1), UO.GetY());

1。次のセルを渡す - 直接スクリプト

引数と実行の流れ:

  • x/y は宛先を指定します。 MoveOn は主要なステップを有効にします。
  • PMove は数値を返しません。位置は個別に読み取られます。
var x = UO.GetX() + 1;
var y = UO.GetY();
UO.MoveOn();
UO.PMove(x, y);
UO.Print("X=" + Convert.ToString(UO.GetX()));

2。座標による結果の確認 - スクリプト関数

引数と実行の流れ:

  • 1445/1690 をアクセス可能なポイントに置き換えます。
  • チェックでは両方の座標が比較されます。ユニットはUO.PMove(...)の場合には適していません。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var x = 1445;
    var y = 1690;
    UO.PMove(x, y);
    if (Truth(UO.GetX() == x) && Truth(UO.GetY() == y))
    {
        UO.Print("Exact XY reached");
    }

    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=20 は無視され、最上階には上がりません。このためには、実際の階段ポイントを備えた MoveXYZ が必要です。

標準走行速度

最小ステップ間隔: ウォーキング - ウォーキング 400 ミリ秒、ランニング 200 ミリ秒。乗車 - ウォーキング 200 ミリ秒、ランニング 100 ミリ秒。

これらは標準的なクライアント制限であり、シャードに対して自動的に定義される設定ではありません。サーバーの速度とフライト モードは個別にカウントされます。スクリプト タイマーは動作を遅くする可能性がありますが、これらの制限は軽減されません。

ステップ、ルート、Follow、マウス/キー コントロール、マップはキャラクターの共有キューを使用します。サーバーによるルートの置き換え、方向転換、または位置の調整では、ステップ要求後の残りの一時停止はキャンセルされません。遅延の後は、ドロップされたフレームを補うための高速バーストはありません。確認を待っていたり、障害物があったり、コミュニケーションが不十分だったりすると、動きが遅くなる可能性があります。

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.PMove(UO.GetX(), UO.GetY(), 20);
        UO.Print("Actual Z=" + Convert.ToString(UO.GetZ()));
        return null;
    }
}

UO.PredictedDirection

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

C# のシグネチャ

int UO.PredictedDirection();

キャラクターがすでにキューに入れられたステップの後に、予測された方向側を読み取ります。

引数

パラメータはありません。

戻り値

int 方向 0..7、ランビットなし。 0 - 北またはキャラクターの不在。

動作

  • 構文に示されている関数のみ、引数なしの UO です。ターゲット、serial、type、ターゲット、距離、タイムアウトのパラメータはありません。 bool、ID、またはタイル表記: 1 ではない数字は、目標を達成することを意味しません。
  • GetEndPosition は、最後に追加された Mobile.Step の X/Y/Z/方向を読み取ります。キューが空の場合、キャラクターの現在の位置/方向を読み取ります。これは O(1) ​​読み取りです。ステップは取得されず、モーションとパケットは送信されず、ルートは計算されず、コマンドは達成を待機しません。
  • 世界の方向: 0 北、1 北東、2 東、3 南東、4 南、5 南西、6 西、7 北西。画面はアイソメトリックです。 Direction.Mask は実行中のフラグを削除します。スピードが戻らない。
  • これは現地の予報であり、到着が確認されたものではありません。新規/完了したステップ、サーバー障害、キューのクリア、またはテレポートによって変更される可能性があります。個々のコンポーネントの呼び出しはアトミックではありません。 X の一致は、Y/Z の一致やサーバーの確認を証明するものではありません。
  • Invoke はゲーム スレッドで読み取りを実行します。ワーカー スレッドは、マネージャーがリクエストを処理するのを待っています。スクリプトをキャンセルすると待機が中断されます。一時停止や追加のネットワーク リクエストは追加されません。
  • IPredictedMovementBridge を使用しない IApiBridge の外部実装は、現在の座標/方向のフォールバック読み取り値を保持します。クラシック UO はキュー対応インターフェイスを実装しています。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は bool に変換されません。配列の場合は要素数を表示します。

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

1。 1 つのコンポーネントを読み取る - 直接スクリプト

引数と実行の流れ:

  • 予測により、引数なしで 1 回の呼び出しが節約されます。 Convert.ToString はログの数値をフォーマットします。
var predicted = UO.PredictedDirection();
UO.Print("Predicted: " + Convert.ToString(predicted));

2。予測変化の監視 - スクリプト関数

引数と実行の流れ:

  • UO.Wait(100) は、例を 100 ミリ秒間一時停止します。中間の動きでも前後が一致することがあります。これらの測定値は動きを開始するものではありません。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.PredictedDirection();
    await Delay(100);
    var after = UO.PredictedDirection();
    if (Truth(before != after))
    {
        UO.Print("Prediction changed: " + Convert.ToString(before) + " -> " + 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;

3。完全比較関数 - スクリプトクラス

引数と実行の流れ:

  • 期待される - 座標/高さ/方向の例であり、ネイティブ コマンドへの引数ではありません。 PredictionEquals は UO.Self() をチェックし、値を 1 回読み取り、等しい場合は 1 (条件が満たされた) を返し、そうでない場合は 0 (条件が満たされていない) を返します。関数コード全体を Main の下に示します。 1 つの要素の偶然の一致は、到着を意味しません。
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()
    {
        if (Truth(Truth(PredictionEquals(4)) == true))
        {
            UO.Print("Queued endpoint matches this component");
        }
        else
        {
            UO.Print("Different component or no player");
        }

        return null;
    }

    dynamic PredictionEquals(dynamic expected)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var predicted = UO.PredictedDirection();
        return Truth(predicted == expected);
    }

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

UO.PredictedX

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

C# のシグネチャ

int UO.PredictedX();

キャラクターがすでにキューに入れられたステップの後に、予測された X 座標を読み取ります。

引数

パラメータはありません。

戻り値

マップセル内の int X。 0 - 有効な座標または文字がありません。

動作

  • 構文に示されている関数のみ、引数なしの UO です。ターゲット、serial、type、ターゲット、距離、タイムアウトのパラメータはありません。 bool、ID、またはタイル表記: 1 ではない数字は、目標を達成することを意味しません。
  • GetEndPosition は、最後に追加された Mobile.Step の X/Y/Z/方向を読み取ります。キューが空の場合、キャラクターの現在の位置/方向を読み取ります。これは O(1) ​​読み取りです。ステップは取得されず、モーションとパケットは送信されず、ルートは計算されず、コマンドは達成を待機しません。
  • X と Y はワールド/マップ座標であり、コンテナ ガンプ ピクセルではありません。 Z - 階数ではなく、高さです。配列やルート全体の最終目的地ではなく、単一のコンポーネントが返されます。
  • これは現地の予報であり、到着が確認されたものではありません。新規/完了したステップ、サーバー障害、キューのクリア、またはテレポートによって変更される可能性があります。個々のコンポーネントの呼び出しはアトミックではありません。 X の一致は、Y/Z の一致やサーバーの確認を証明するものではありません。
  • Invoke はゲーム スレッドで読み取りを実行します。ワーカー スレッドは、マネージャーがリクエストを処理するのを待っています。スクリプトをキャンセルすると待機が中断されます。一時停止や追加のネットワーク リクエストは追加されません。
  • IPredictedMovementBridge を使用しない IApiBridge の外部実装は、現在の座標/方向のフォールバック読み取り値を保持します。クラシック UO はキュー対応インターフェイスを実装しています。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は bool に変換されません。配列の場合は要素数を表示します。

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

1。 1 つのコンポーネントを読み取る - 直接スクリプト

引数と実行の流れ:

  • 予測により、引数なしで 1 回の呼び出しが節約されます。 Convert.ToString はログの数値をフォーマットします。
var predicted = UO.PredictedX();
UO.Print("Predicted: " + Convert.ToString(predicted));

2。予測変化の監視 - スクリプト関数

引数と実行の流れ:

  • UO.Wait(100) は、例を 100 ミリ秒間一時停止します。中間の動きでも前後が一致することがあります。これらの測定値は動きを開始するものではありません。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.PredictedX();
    await Delay(100);
    var after = UO.PredictedX();
    if (Truth(before != after))
    {
        UO.Print("Prediction changed: " + Convert.ToString(before) + " -> " + 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;

3。完全比較関数 - スクリプトクラス

引数と実行の流れ:

  • 期待される - 座標/高さ/方向の例であり、ネイティブ コマンドへの引数ではありません。 PredictionEquals は UO.Self() をチェックし、値を 1 回読み取り、等しい場合は 1 (条件が満たされた) を返し、そうでない場合は 0 (条件が満たされていない) を返します。関数コード全体を Main の下に示します。 1 つの要素の偶然の一致は、到着を意味しません。
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()
    {
        if (Truth(Truth(PredictionEquals(1445)) == true))
        {
            UO.Print("Queued endpoint matches this component");
        }
        else
        {
            UO.Print("Different component or no player");
        }

        return null;
    }

    dynamic PredictionEquals(dynamic expected)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var predicted = UO.PredictedX();
        return Truth(predicted == expected);
    }

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

UO.PredictedY

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

C# のシグネチャ

int UO.PredictedY();

キャラクターがすでにキューに入れられたステップの後に、予測された Y 座標を読み取ります。

引数

パラメータはありません。

戻り値

マップセル内の int Y。 0 - 有効な座標または文字がありません。

動作

  • 構文に示されている関数のみ、引数なしの UO です。ターゲット、serial、type、ターゲット、距離、タイムアウトのパラメータはありません。 bool、ID、またはタイル表記: 1 ではない数字は、目標を達成することを意味しません。
  • GetEndPosition は、最後に追加された Mobile.Step の X/Y/Z/方向を読み取ります。キューが空の場合、キャラクターの現在の位置/方向を読み取ります。これは O(1) ​​読み取りです。ステップは取得されず、モーションとパケットは送信されず、ルートは計算されず、コマンドは達成を待機しません。
  • X と Y はワールド/マップ座標であり、コンテナ ガンプ ピクセルではありません。 Z - 階数ではなく、高さです。配列やルート全体の最終目的地ではなく、単一のコンポーネントが返されます。
  • これは現地の予報であり、到着が確認されたものではありません。新規/完了したステップ、サーバー障害、キューのクリア、またはテレポートによって変更される可能性があります。個々のコンポーネントの呼び出しはアトミックではありません。 X の一致は、Y/Z の一致やサーバーの確認を証明するものではありません。
  • Invoke はゲーム スレッドで読み取りを実行します。ワーカー スレッドは、マネージャーがリクエストを処理するのを待っています。スクリプトをキャンセルすると待機が中断されます。一時停止や追加のネットワーク リクエストは追加されません。
  • IPredictedMovementBridge を使用しない IApiBridge の外部実装は、現在の座標/方向のフォールバック読み取り値を保持します。クラシック UO はキュー対応インターフェイスを実装しています。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は bool に変換されません。配列の場合は要素数を表示します。

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

1。 1 つのコンポーネントを読み取る - 直接スクリプト

引数と実行の流れ:

  • 予測により、引数なしで 1 回の呼び出しが節約されます。 Convert.ToString はログの数値をフォーマットします。
var predicted = UO.PredictedY();
UO.Print("Predicted: " + Convert.ToString(predicted));

2。予測変化の監視 - スクリプト関数

引数と実行の流れ:

  • UO.Wait(100) は、例を 100 ミリ秒間一時停止します。中間の動きでも前後が一致することがあります。これらの測定値は動きを開始するものではありません。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.PredictedY();
    await Delay(100);
    var after = UO.PredictedY();
    if (Truth(before != after))
    {
        UO.Print("Prediction changed: " + Convert.ToString(before) + " -> " + 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;

3。完全比較関数 - スクリプトクラス

引数と実行の流れ:

  • 期待される - 座標/高さ/方向の例であり、ネイティブ コマンドへの引数ではありません。 PredictionEquals は UO.Self() をチェックし、値を 1 回読み取り、等しい場合は 1 (条件が満たされた) を返し、そうでない場合は 0 (条件が満たされていない) を返します。関数コード全体を Main の下に示します。 1 つの要素の偶然の一致は、到着を意味しません。
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()
    {
        if (Truth(Truth(PredictionEquals(1690)) == true))
        {
            UO.Print("Queued endpoint matches this component");
        }
        else
        {
            UO.Print("Different component or no player");
        }

        return null;
    }

    dynamic PredictionEquals(dynamic expected)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var predicted = UO.PredictedY();
        return Truth(predicted == expected);
    }

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

UO.PredictedZ

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

C# のシグネチャ

int UO.PredictedZ();

キャラクターがすでにキューに入れられたステップの後に、予測される Z 高さを読み取ります。

引数

パラメータはありません。

戻り値

int Z、符号付き高さ -128..127;負の値は保持されます。 0 - キャラクターの許容可能な高さまたは不在。

動作

  • 構文に示されている関数のみ、引数なしの UO です。ターゲット、serial、type、ターゲット、距離、タイムアウトのパラメータはありません。 bool、ID、またはタイル表記: 1 ではない数字は、目標を達成することを意味しません。
  • GetEndPosition は、最後に追加された Mobile.Step の X/Y/Z/方向を読み取ります。キューが空の場合、キャラクターの現在の位置/方向を読み取ります。これは O(1) ​​読み取りです。ステップは取得されず、モーションとパケットは送信されず、ルートは計算されず、コマンドは達成を待機しません。
  • X と Y はワールド/マップ座標であり、コンテナ ガンプ ピクセルではありません。 Z - 階数ではなく、高さです。配列やルート全体の最終目的地ではなく、単一のコンポーネントが返されます。
  • これは現地の予報であり、到着が確認されたものではありません。新規/完了したステップ、サーバー障害、キューのクリア、またはテレポートによって変更される可能性があります。個々のコンポーネントの呼び出しはアトミックではありません。 X の一致は、Y/Z の一致やサーバーの確認を証明するものではありません。
  • Invoke はゲーム スレッドで読み取りを実行します。ワーカー スレッドは、マネージャーがリクエストを処理するのを待っています。スクリプトをキャンセルすると待機が中断されます。一時停止や追加のネットワーク リクエストは追加されません。
  • IPredictedMovementBridge を使用しない IApiBridge の外部実装は、現在の座標/方向のフォールバック読み取り値を保持します。クラシック UO はキュー対応インターフェイスを実装しています。

単独で実行できる C# スクリプト

各サンプルは個別のファイル .csx として保存し、IDE で実行できます。 UO オブジェクトと待機関数は、現在のゲーム セッションのホストを提供します。デモの serial の名前、座標、アドレスを自分のものに置き換えます。

簡単な例

このコードを独立した .csx ファイルとして実行します。引数は呼び出しに直接記載されています。例の名前、serial、アドレスを自分の値に置き換えてください。

1 回の呼び出し結果をジャーナルに表示します。数値は bool に変換されません。配列の場合は要素数を表示します。

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

1。 1 つのコンポーネントを読み取る - 直接スクリプト

引数と実行の流れ:

  • 予測により、引数なしで 1 回の呼び出しが節約されます。 Convert.ToString はログの数値をフォーマットします。
var predicted = UO.PredictedZ();
UO.Print("Predicted: " + Convert.ToString(predicted));

2。予測変化の監視 - スクリプト関数

引数と実行の流れ:

  • UO.Wait(100) は、例を 100 ミリ秒間一時停止します。中間の動きでも前後が一致することがあります。これらの測定値は動きを開始するものではありません。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.PredictedZ();
    await Delay(100);
    var after = UO.PredictedZ();
    if (Truth(before != after))
    {
        UO.Print("Prediction changed: " + Convert.ToString(before) + " -> " + 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;

3。完全比較関数 - スクリプトクラス

引数と実行の流れ:

  • 期待される - 座標/高さ/方向の例であり、ネイティブ コマンドへの引数ではありません。 PredictionEquals は UO.Self() をチェックし、値を 1 回読み取り、等しい場合は 1 (条件が満たされた) を返し、そうでない場合は 0 (条件が満たされていない) を返します。関数コード全体を Main の下に示します。 1 つの要素の偶然の一致は、到着を意味しません。
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()
    {
        if (Truth(Truth(PredictionEquals(-4)) == true))
        {
            UO.Print("Queued endpoint matches this component");
        }
        else
        {
            UO.Print("Different component or no player");
        }

        return null;
    }

    dynamic PredictionEquals(dynamic expected)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var predicted = UO.PredictedZ();
        return Truth(predicted == expected);
    }

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

Clone this wiki locally