Skip to content

JA UO Topic scripts runtime

Codex edited this page Oct 12, 2026 · 4 revisions

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

スクリプトとランタイム

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

スクリプトとプロシージャ、インスタンス情報、イベントを開始、一時停止、停止し、待機します。 Terminate と StopScript は異なる実行レベルで動作します。

セクション

トピック コマンドと説明
StartScript UO.StartScript
StopScript UO.StopScript
StopAllScripts UO.StopAllScripts
PauseResumeScript UO.PauseResumeScript
Script State UO.GetScriptState
Script List UO.GetScriptsList · UO.GetScriptsCount
Script Name UO.GetScriptName · UO.SetScriptName
Script Path UO.GetScriptPath
CallSub UO.CallSub
SubExists UO.SubExists
Events UO.SetEvent · UO.SetEventProc
Timers UO.Timer · UO.Wait
Disconnect Behaviour UO.GetPauseScriptOnDisconnectStatus · UO.SetPauseScriptOnDisconnectStatus

すべてのテーマコマンド

スクリプトのライフサイクル

UO.StartScript · UO.StopScript · UO.StopAllScripts · UO.PauseResumeScript · UO.GetScriptName · UO.SetScriptName · UO.GetScriptPath · UO.GetScriptsCount · UO.GetScriptsList · UO.GetScriptState · UO.Exec · UO.Launch

手続き・イベント

UO.CallSub · UO.SubExists · UO.FunRunning · UO.Terminate · UO.TerminateAll · UO.SetEvent · UO.SetEventProc

タイマー / Waiting

UO.Wait · UO.Waiting · UO.Timer · UO.Time · UO.Date

Disconnect 動作

UO.GetPauseScriptOnDisconnectStatus · UO.SetPauseScriptOnDisconnectStatus

このトピックに関する例

各コマンド カードには、直接コード、関数、クラスなどのいくつかの独立したシナリオがあります。以下は厳選された短いシナリオです。制限と完全な分析がカードに含まれています。

UO.GetScriptsList

パラメータ、結果、およびすべてのシナリオ

var indices = UO.GetScriptsList();
foreach (var index in indices)
{
    UO.Print(Convert.ToString(index) + ": " + UO.GetScriptName(index));
}

UO.TerminateAll

パラメータ、結果、およびすべてのシナリオ

for (int cycle = (int)(1); cycle <= 10; cycle += (int)(1))
{
    if (Truth(UO.Dead()))
    {
        UO.Print("Character is dead: stopping all C# scripts");
        UO.TerminateAll();
    }
    await Delay(250);
}

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.CallSub

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

C# のシグネチャ

void UO.CallSub(object? subrutineName);

RegisterRoutine(名前、ハンドラー) を介して、現在の実行に以前に登録された C# デリゲートを起動します。この呼び出しは、ヘルパーが完了する前に制御を返します。登録された 1 つのタスクをそれ自体に課すことはできません。

引数

  • subrutineName は、RegisterRoutine によって指定された文字列名です。端の周りの空白は削除されます。登録名の検索では大文字と小文字は区別されません。

戻り値

void - 結果なし。不明な名前 CallSub はエラーを引き起こし、すでにアクティブな名前の再実行はスキップされます。

動作

UO.FunRunning(name) == 0 は、取り消しを要求した直後にも返されます。前の callback の finally ブロックが終了したことを意味しません。前のワーカーが実際に終了するまで、同じローカル名の別の CallSub または Exec はスキップされます。

  • 登録とタスクは同じ実行に属します。別のキャラクター、プロファイル、またはその後の実行には独自のレジストリがあります。
  • RegisterRoutine は、Action、Func<Task>、またはExec への文字列引数の配列を持つデリゲートを受け入れます。登録を削除するとコードは実行されず、名前をそれ以上検索できなくなります。
  • メイン スクリプトは、そのヘルパーが必要な間、アクティブなままにしておく必要があります。完了後、タスクはキャンセルされ、登録とサブスクリプションが解放されます。
  • FunRunning はマネージャーインデックスではありません。 GetScriptsList と GetScriptState は独立したファイルの起動について説明します。ローカル コールバックは別のインデックスを受け取りません。
  • コールバック エラーは、次回のチェック時にメイン スクリプトに渡されます。 WaitAsync、UO.Wait、およびインストルメント化されたC# ループは、一時停止、キャンセル、およびイベント キューの処理をサポートします。

アップロードされたC#-ファイル

ローカルのデリゲートに加えて、現在のマネージャーは、Child.csx::Main のようなキーを持つ明示的に読み込まれた C# エントリをサポートしています。 SubExists と FunRunning はそのようなキーを受け入れます。 CallSub は Args なしでファイルを実行し、Exec("exec Child.csx::Main 'north Gate' 42") は Args を渡します。スペースを含むキーは、Exec 内で引用符で囲まれます。一意の短い名前は許容されますが、あいまいな名前ではランダムなファイルが選択されません。ローカル登録が優先されます。ファイルの起動は、現在のワールド/マネージャー内で独自のコンテキストと有効期間を取得します。ローカル デリゲートは、それらを登録した実行に属します。

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

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

簡単な例

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

RegisterRoutine("Hello", () => UO.Print("Hello from a routine"));
UO.CallSub("Hello");
while (UO.FunRunning("Hello") != 0) await WaitAsync(25);

1。オブザーバーを開始してメインを続行 - 直接スクリプト

引数と実行の流れ:

  • WeightWatch は以下のプロシージャの名前です。 Main は 3 つのサンプルを待たずに 77 を返します。 77 は、CallSub ではなく、Main の結果です。
  • 例を別のファイルとして保存し、IDE/manager にロードして Main を実行すると、残りのプロシージャがこのディレクトリに保存されます。 WeightWatch/ManaWatch - ここで完全に定義されたトレーニング手順: UO.Wait(1000) の間隔で 3 回のウェイト/マナ測定、つまり 1000 ミリ秒、ワールドに入るときにのみ出力されます。これは継続的な監視ではありません。一時停止すると時間が長くなる可能性があります。 2 つのタスクを含む例では、プロシージャの同時起動を許可する必要があります。
var registrationWeightWatch = RegisterRoutine("WeightWatch", WeightWatch);
UO.CallSub("WeightWatch");
while (UO.FunRunning("WeightWatch") != 0) await WaitAsync(25);
return 77;

void WeightWatch()
{
    dynamic sample = 0;
    for (sample = (int)(1); sample <= 3; sample += (int)(1))
    {
        if (Truth(UO.Connected()))
        {
            UO.Print("Weight: " + Convert.ToString(UO.Weight()));
        }
        UO.Wait(1000);
    }
}

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

2。アクティブまたは一時停止されたタスクを再開しない - スクリプト関数

引数と実行の流れ:

  • StartIfIdle は最初に定義をチェックし、次にアクティビティをチェックします。 false は、リクエストが送信されなかったことを意味します。 true は、リクエスト CallSub のみが送信されたことを意味し、開始または完了の確認は送信されません。
  • 例を別のファイルとして保存し、IDE/manager にロードして Main を実行すると、残りのプロシージャがこのディレクトリに保存されます。 WeightWatch/ManaWatch - ここで完全に定義されたトレーニング手順: UO.Wait(1000) の間隔で 3 回のウェイト/マナ測定、つまり 1000 ミリ秒、ワールドに入るときにのみ出力されます。これは継続的な監視ではありません。一時停止すると時間が長くなる可能性があります。 2 つのタスクを含む例では、プロシージャの同時起動を許可する必要があります。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var registrationWeightWatch = RegisterRoutine("WeightWatch", WeightWatch);
    var launched = StartIfIdle("WeightWatch");
    while (UO.FunRunning("WeightWatch") != 0)
        await WaitAsync(25);
    return launched;
    return null;
}

dynamic StartIfIdle(dynamic name)
{
    if (!(Truth(UO.SubExists(name))))
    {
        return false;
    }

    if (Truth(UO.FunRunning(name)))
    {
        return false;
    }

    UO.CallSub(name);
    return true;
}

void WeightWatch()
{
    dynamic sample = 0;
    for (sample = (int)(1); sample <= 3; sample += (int)(1))
    {
        if (Truth(UO.Connected()))
        {
            UO.Print("Weight: " + Convert.ToString(UO.Weight()));
        }

        UO.Wait(1000);
    }
}

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

3。 2 人の独立したオブザーバー - シナリオ クラス

引数と実行の流れ:

  • 最初の CallSub は WeightWatch を開始し、2 番目の - ManaWatch を開始します。実行は独立しており、ローカル変数を交換しません。出力の順序は保証されません。
  • 例を別のファイルとして保存し、IDE/manager にロードして Main を実行すると、残りのプロシージャがこのディレクトリに保存されます。 WeightWatch/ManaWatch - ここで完全に定義されたトレーニング手順: UO.Wait(1000) の間隔で 3 回のウェイト/マナ測定、つまり 1000 ミリ秒、ワールドに入るときにのみ出力されます。これは継続的な監視ではありません。一時停止すると時間が長くなる可能性があります。 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 registrationWeightWatch = RegisterRoutine("WeightWatch", WeightWatch);
        var registrationManaWatch = RegisterRoutine("ManaWatch", ManaWatch);
        UO.CallSub("WeightWatch");
        UO.CallSub("ManaWatch");
        while (UO.FunRunning("WeightWatch") != 0 || UO.FunRunning("ManaWatch") != 0)
            await WaitAsync(25);
        return null;
    }

    void WeightWatch()
    {
        dynamic sample = 0;
        for (sample = (int)(1); sample <= 3; sample += (int)(1))
        {
            if (Truth(UO.Connected()))
            {
                UO.Print("Weight: " + Convert.ToString(UO.Weight()));
            }

            UO.Wait(1000);
        }
    }

    void ManaWatch()
    {
        dynamic sample = 0;
        for (sample = (int)(1); sample <= 3; sample += (int)(1))
        {
            if (Truth(UO.Connected()))
            {
                UO.Print("Mana: " + Convert.ToString(UO.Mana()));
            }

            UO.Wait(1000);
        }
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
    private IDisposable RegisterRoutine(string name, Action handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterRoutine(name, handler);
    private IDisposable RegisterRoutine(string name, Func<Task> handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterRoutine(name, handler);
    private IDisposable RegisterRoutine(string name, Action<string[]> handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterRoutine(name, handler);
    private IDisposable RegisterRoutine(string name, Func<string[], Task> handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterRoutine(name, handler);
}

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.CallSub(subrutineName) — UO.CallSub(String)

引数: subrutineName (String)

結果: void / Unit.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

case "CallSub":
                string called = Convert.ToString(arguments[0]) ?? "";
                if (Exists(called)) Start(called);
                else if (events is ICSharpScriptHost host && host.HasCSharpScript(called)) host.ExecuteCSharpScript("exec \"" + called + "\"");
                else throw new ArgumentException($"Register the C# routine or load a C# script entry named '{called}' before calling it.");
                return true;

内部実装のコードです。単独のスクリプトとして実行できません。

public void CallSub(string subrutineName) => bridge.Exec(subrutineName);

UO.Date

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

C# のシグネチャ

int UO.Date();

コンピューターのローカルカレンダーの日付をYYMMDDという数値で読み取ります。毎日の一連のアクティビティに名前を付けたり、日付の変更を検出したりするのに役立ちます。

引数

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

戻り値

int YYMMDD: 2026-09-30 -> 260930。区切り文字や先頭のゼロは保存されません。これは期間でも、Unix 時間でも、true/false でもありません。

動作

  • パラメータや引数を含むフォームはありません。空の括弧は時間を読み取るだけです。呼び出しは待機したり、タイマーを開始したり、ゲームにパケットを送信したりしません。
  • RealTimeSource.Now は DateTime.Now と読み取られます。UTC、シャード時間、ゲーム クロックではなく、コンピューターのローカル日付/時間です。タイムゾーン、夏時間、手動による時計の変更は結果に影響します。通話ごとに異なる瞬間が捉えられます。
  • 西暦の下 2 桁のみが保持されます。2000-01-01 と 2100-01-01 は両方とも 101 となります。世紀が違っても例外ではありません。個々のコール Date と Time は、真夜中の反対側に着信する場合があります。
  • 遅延を計算するためにカレンダー コードを減算しないでください。 Timer() と 1 回の実行の 2 つのマークを使用します。カレンダーの時計が戻る可能性があります。

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

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

簡単な例

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

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

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

1。毎日のリソース収集シリーズに名前を付けます - 直接スクリプト

引数と実行の流れ:

  • パラメータを指定しない呼び出しの結果は一度保存されます。 sessionLabel は、harvest-260930 のような文字列です。 Print は名前のみを表示します。ファイルは作成されず、リソースの収集は開始されません。
var dateStamp = UO.Date();
var sessionLabel = "harvest-" + Convert.ToString(dateStamp);
UO.Print(sessionLabel);

2。現地の日が変わるとシリーズを終了 - スクリプト機能

引数と実行の流れ:

  • originalDate には元の日付が保存されます。 Timer は観測を 60 秒に制限し、UO.Wait(1000) は 1 秒に約 1 回チェックします。日付変更でメイン終了。この例では、午前 0 時を無期限に待機することはなく、サーバー上で日付が変わったことも主張しません。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var originalDate = UO.Date();
    var started = Environment.TickCount;
    while (Truth(Environment.TickCount - started < 60.0))
    {
        if (Truth(UO.Date() != originalDate))
        {
            UO.Print("Local date changed; end this batch");
            return null;
        }

        await Delay(1000);
    }

    UO.Print("No date change observed within one minute");
    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。年、月、日の選択 - スクリプト クラス

引数と実行の流れ:

  • MonthPart(スタンプ)は小数点以下切り捨て、MOD100は月を抽出した全体が表示されます。日 - 下 2 桁。 shortYear — 未完了の年。 260930 の場合、26、9、30 が得られます。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var stamp = UO.Date();
        var month = MonthPart(stamp);
        var day = stamp % 100;
        var shortYear = stamp / 10000;
        UO.Print(Convert.ToString(shortYear) + "/" + Convert.ToString(month) + "/" + Convert.ToString(day));
        return null;
    }

    dynamic MonthPart(dynamic stamp)
    {
        return stamp / 100 % 100;
    }
}

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.Date() — UO.Date()

引数: 引数はありません。

結果: int / Integer.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

public int Date()

        {

            var now = timeSource.Now;

            return (now.Year % 100) * 10000 + now.Month * 100 + now.Day;

        }

UO.Exec

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

C# のシグネチャ

void UO.Exec(object? parameters);

テキスト ゲーム コマンドを実行するか、登録された C# デリゲートまたはロードされた C# ファイルを実行します。

引数

  • parameters - コマンド文字列: たとえば、「useskill Hiding」、「exec Worker 42」、または「exec Child.csx::Main 'north Gate' 42」。文字列内の 2+3 のような式 C# は、自動的には評価されません。

戻り値

void: 結果なし。制御を返すことは、サーバーによるゲームの起動やアクションの確認が終了することを意味するものではありません。

動作

UO.FunRunning(name) == 0 は、取り消しを要求した直後にも返されます。前の callback の finally ブロックが終了したことを意味しません。前のワーカーが実際に終了するまで、同じローカル名の別の CallSub または Exec はスキップされます。

  • ローカル レジストリ RegisterRoutine が最初にチェックされます。 「Name args」、「exec Name args」、および「_exec Name args」がサポートされています。デリゲートは string[] を受け取ります。引数 42 は文字列 "42" のままで、'00123' は先頭のゼロを保持します。一重引用符または二重引用符は、引数とスペースを連結します。 '' は空の文字列を指定します。引用符が閉じられていないとエラーが発生します。このルートでは、バックスラッシュは文字通りそのまま維持されます。事前に作成されたコマンド テキスト内で C# エスケープ構文を使用しないでください。
  • ローカル デリゲートは非同期で実行されます。完了するまで待つには、FunRunning と WaitAsync を使用します。アクティブな名前を再起動してもコピーは作成されず、一時停止は解除されません。ヘルパー エラーはチェックポイントでメイン スクリプトに渡されます。
  • 明示的にロードされたファイルエントリは、独自の Args と有効期間を持つ現在のマネージャーによって開始されます。起動リクエストを受け入れただけでは、ファイルの作業が完了したことにはなりません。
  • 通常のゲーム コマンドはネイティブ ディスパッチャーに渡されます。対応する UO コマンドのパラメーター コントラクトはそこに保存されます。 Print/Msg/Say/ConsolePrint/TextPrint 行の残りの部分をテキストに結合します。正確な C# 型と式については、UO.UseSkill("Hiding") のような直接呼び出しを使用します。不明なコマンド、無効な引数、または引用符により、try/catch によって例外がキャッチされる可能性があります。
  • コンソールのエイリアス:sayu → Say、closeuo → CloseHandle、CountOnGround → CountGround、clearignorelist → IgnoreReset、canceltarget → CancelTarget、cancelmove → MoveOff。

アップロードされたC#-ファイル

ローカルのデリゲートに加えて、現在のマネージャーは、Child.csx::Main のようなキーを持つ明示的に読み込まれた C# エントリをサポートしています。 SubExists と FunRunning はそのようなキーを受け入れます。 CallSub は Args なしでファイルを実行し、Exec("exec Child.csx::Main 'north Gate' 42") は Args を渡します。スペースを含むキーは、Exec 内で引用符で囲まれます。一意の短い名前は許容されますが、あいまいな名前ではランダムなファイルが選択されません。ローカル登録が優先されます。ファイルの起動は、現在のワールド/マネージャー内で独自のコンテキストと有効期間を取得します。ローカル デリゲートは、それらを登録した実行に属します。

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

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

簡単な例

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

RegisterRoutine("Hello", () => UO.Print("Hello from a routine"));
UO.Exec("exec Hello");
while (UO.FunRunning("Hello") != 0) await WaitAsync(25);

1。選択したスキルを使用する - 直接スクリプト

引数と実行の流れ:

  • UseSkill に対する唯一の引数は非表示です。ワールドに入ると、クライアントはスキルを使用するリクエストを送信します。非表示が成功するかどうかはサーバーによって決まります。直接呼び出しでも同様の操作: UO.UseSkill("Hiding")。
UO.Exec("useskill Hiding");

2。文字列ラベルをローカル プロシージャに渡す - スクリプト関数

引数と実行の流れ:

  • SelectSavedRoute は以下で定義され、選択されたルートの名前を記録します。 00123 を囲む引用符では、先行ゼロが保持されます。 Exec は、登録されたデリゲートを非同期的に実行します。 FunRunning と WaitAsync を含むループは、終了するまで明示的に待機し、スクリプトは文字列 00123 を返します。これはトレーニング名の保存であり、移動コマンドではありません。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var registration = RegisterRoutine("SelectSavedRoute", (Action<string[]>)(arguments =>
    {
        if (arguments.Length == 1)
            SelectSavedRoute(arguments[0]);
    }));
    UO.Exec("SelectSavedRoute '00123'");
    while (UO.FunRunning("SelectSavedRoute") != 0)
        await WaitAsync(25);
    return UO.GetGlobal("manual", "savedRoute");
    return null;
}

void SelectSavedRoute(dynamic name)
{
    UO.SetGlobal("manual", "savedRoute", name);
}

3。別個のオブザーバーの実行 - スクリプト クラス

引数と実行の流れ:

  • この C# スクリプトを実行します。 RegisterRoutine は、名前 WeightWatch を現在の実行で宣言された関数に関連付けます。 exec WeightWatch は 1000 ミリ秒の間隔で 3 つの重量測定を開始し、完了を待ちません。メイン スクリプトは、ローカル アシスタントの実行中もアクティブなままです。アシスタントには個別のマネージャー インデックスがありません。タスクがすでに一時停止されている場合、Exec はタスクを再開しません。
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 registrationWeightWatch = RegisterRoutine("WeightWatch", WeightWatch);
        UO.Exec("exec WeightWatch");
        while (UO.FunRunning("WeightWatch") != 0)
            await WaitAsync(25);
        return null;
    }

    void WeightWatch()
    {
        dynamic sample = 0;
        for (sample = (int)(1); sample <= 3; sample += (int)(1))
        {
            if (Truth(UO.Connected()))
            {
                UO.Print("Weight: " + Convert.ToString(UO.Weight()));
            }

            UO.Wait(1000);
        }
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
    private IDisposable RegisterRoutine(string name, Action handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterRoutine(name, handler);
    private IDisposable RegisterRoutine(string name, Func<Task> handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterRoutine(name, handler);
    private IDisposable RegisterRoutine(string name, Action<string[]> handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterRoutine(name, handler);
    private IDisposable RegisterRoutine(string name, Func<string[], Task> handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterRoutine(name, handler);
}

4。スペースを含むフォルダーからスクリプトをロード - 直接スクリプト

引数と実行の流れ:

  • Main プロシージャを使用して、パスを既存の C# ファイルに置き換えます。 startscript はファイルをロードし、Main に実行を依頼します。引用符はテキスト コマンドに属します。パスのバックスラッシュは保持されます。 Exec は確認応答を返さないため、起動エラーについては IDE を参照してください。
UO.Exec("startscript 'C:\\UO Scripts\\Gather.csx'");

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.Exec(parameters) — UO.Exec(String)

引数: parameters (String)

結果: void / Unit.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

case "Exec":
                var words = CommandWords(Convert.ToString(arguments[0]) ?? "");
                if (words.Length == 0) return false;
                int offset = words[0].Equals("exec", StringComparison.OrdinalIgnoreCase) || words[0].Equals("_exec", StringComparison.OrdinalIgnoreCase) ? 1 : 0;
                if (words.Length > offset && Exists(words[offset]))
                { Start(words[offset], words.Skip(offset + 1).ToArray()); return true; }
                if (words.Length > offset && events is ICSharpScriptHost scriptHost
                    && (offset == 1 || scriptHost.HasCSharpScript(words[offset])))
                {
                    string command = Convert.ToString(arguments[0]) ?? "";
                    if (words[0].Equals("_exec", StringComparison.OrdinalIgnoreCase)) command = "exec" + command.TrimStart()[5..];
                    scriptHost.ExecuteCSharpScript(command); return true;
                }
                return false;

内部実装のコードです。単独のスクリプトとして実行できません。

public void Exec(string parameters)
        {
            ConsoleToken[] parts = Tokenize(parameters).ToArray();
            if (parts.Length == 0)
                return;

            string command = parts[0].Text;
            if (command.Equals("exec", StringComparison.OrdinalIgnoreCase))
            {
                if (parts.Length != 2 || string.IsNullOrWhiteSpace(parts[1].Text))
                    throw new NativeSubrutineException("Usage: exec script_function");
                bridge.Exec(parts[1].Text);
                return;
            }

            ConsoleToken[] arguments = parts.Skip(1).ToArray();
            string[] rawArguments = arguments.Select(token => token.Text).ToArray();
            if (TryHandleLegacyConsoleCommand(command, rawArguments))
                return;

            command = NormalizeConsoleAlias(command);
            if (IsRemainderTextCommand(command) && rawArguments.Length > 0)
                arguments = new[] { new ConsoleToken(string.Join(" ", rawArguments), true) };
            else if (command.Equals("ColorPrint", StringComparison.OrdinalIgnoreCase) && rawArguments.Length > 1)
                arguments = new[] { arguments[0], new ConsoleToken(string.Join(" ", rawArguments.Skip(1)), true) };
            else if (command.Equals("CharPrint", StringComparison.OrdinalIgnoreCase) && rawArguments.Length > 2)
                arguments = new[] { arguments[0], arguments[1], new ConsoleToken(string.Join(" ", rawArguments.Skip(2)), true) };

            InjectionValue[] args = arguments.Select(token => token.Quoted
                ? new InjectionValue(token.Text) : ToConsoleValue(token.Text)).ToArray();
            CallNativeSubrutine(command, args);
        }

UO.FunRunning

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

C# のシグネチャ

int UO.FunRunning(object? subrutineName);

指定された名前で登録されたC#-コールバックが実行されるかどうかを確認します。結果 1 は手動一時停止を有効にします。完了またはキャンセルされたタスクには 0 が与えられます。

引数

  • subrutineName は、RegisterRoutine によって指定された文字列名です。端の周りの空白は削除されます。登録名の検索では大文字と小文字は区別されません。

戻り値

int: 1 - 条件が満たされています。0 - 条件が満たされていません。複数のチェックで必要な場合は、1 つの呼び出しの結果を保存します。

動作

UO.FunRunning(name) == 0 は、取り消しを要求した直後にも返されます。前の callback の finally ブロックが終了したことを意味しません。前のワーカーが実際に終了するまで、同じローカル名の別の CallSub または Exec はスキップされます。

  • 登録とタスクは同じ実行に属します。別のキャラクター、プロファイル、またはその後の実行には独自のレジストリがあります。
  • RegisterRoutine は、Action、Func<Task>、またはExec への文字列引数の配列を持つデリゲートを受け入れます。登録を削除するとコードは実行されず、名前をそれ以上検索できなくなります。
  • メイン スクリプトは、そのヘルパーが必要な間、アクティブなままにしておく必要があります。完了後、タスクはキャンセルされ、登録とサブスクリプションが解放されます。
  • FunRunning はマネージャーインデックスではありません。 GetScriptsList と GetScriptState は独立したファイルの起動について説明します。ローカル コールバックは別のインデックスを受け取りません。
  • コールバック エラーは、次回のチェック時にメイン スクリプトに渡されます。 WaitAsync、UO.Wait、およびインストルメント化されたC# ループは、一時停止、キャンセル、およびイベント キューの処理をサポートします。

アップロードされたC#-ファイル

ローカルのデリゲートに加えて、現在のマネージャーは、Child.csx::Main のようなキーを持つ明示的に読み込まれた C# エントリをサポートしています。 SubExists と FunRunning はそのようなキーを受け入れます。 CallSub は Args なしでファイルを実行し、Exec("exec Child.csx::Main 'north Gate' 42") は Args を渡します。スペースを含むキーは、Exec 内で引用符で囲まれます。一意の短い名前は許容されますが、あいまいな名前ではランダムなファイルが選択されません。ローカル登録が優先されます。ファイルの起動は、現在のワールド/マネージャー内で独自のコンテキストと有効期間を取得します。ローカル デリゲートは、それらを登録した実行に属します。

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

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

簡単な例

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

RegisterRoutine("Hello", async () => await WaitAsync(100));
UO.CallSub("Hello");
UO.Print("Running flag: " + UO.FunRunning("Hello"));
while (UO.FunRunning("Hello") != 0) await WaitAsync(25);

1。登録されたオブザーバーをオーバーレイなしで実行 - 直接スクリプト

引数と実行の流れ:

  • まず、RegisterRoutine は名前を C# 関数に関連付けます。 FunRunning は、一時停止を含む、この実行のタスクをチェックします。メイン スクリプトは、ヘルパーが完了するまでアクティブなままです。
var registration = RegisterRoutine("WeightWatch", WatchWeight);
if (UO.FunRunning("WeightWatch") == 0) UO.CallSub("WeightWatch");
while (UO.FunRunning("WeightWatch") != 0) await WaitAsync(25);

async Task WatchWeight()
{
    for (int sample = 0; sample < 3; sample++)
    {
        UO.Print($"Weight: {UO.Weight()}");
        await WaitAsync(250);
    }
}

2。完了を待ってバックグラウンド作業の結果を読み取る - スクリプト関数

引数と実行の流れ:

  • 非同期デリゲートは、Interlocked を介して共有カウンターを変更します。 FunRunning=0 の後、結果は Volatile を通じて読み取られます。これはローカル コールバックです。個別のインデックス GetScriptsList はありません。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    int completed = 0;
    var registration = RegisterRoutine("Worker", async () =>
    {
        await WaitAsync(150);
        Interlocked.Exchange(ref completed, 1);
    });
    UO.CallSub("Worker");
    UO.Print($"Worker active: {UO.FunRunning("Worker") != 0}");
    while (UO.FunRunning("Worker") != 0)
        await WaitAsync(25);
    return Volatile.Read(ref completed) == 1;
    return null;
}

3。登録された非同期ヘルパーのキャンセル - スクリプト クラス

引数と実行の流れ:

  • Terminate は、現在の実行の登録済みタスクを選択します。 WaitAsync がキャンセル トークンを使用するのを待っています。 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()
    {
        int cleanupDone = 0;
        var registration = RegisterRoutine("Worker", async () =>
        {
            try
            {
                await WaitAsync(5000);
            }
            finally
            {
                Interlocked.Exchange(ref cleanupDone, 1);
            }
        });
        UO.CallSub("Worker");
        await WaitAsync(100);
        if (UO.FunRunning("Worker") != 0)
            UO.Terminate("Worker");
        while (UO.FunRunning("Worker") != 0)
            await WaitAsync(25);
        while (Volatile.Read(ref cleanupDone) == 0)
            await WaitAsync(25);
        return true;
        return null;
    }

    private IDisposable RegisterRoutine(string name, Action handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterRoutine(name, handler);
    private IDisposable RegisterRoutine(string name, Func<Task> handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterRoutine(name, handler);
    private IDisposable RegisterRoutine(string name, Action<string[]> handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterRoutine(name, handler);
    private IDisposable RegisterRoutine(string name, Func<string[], Task> handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterRoutine(name, handler);
}

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.FunRunning(subrutineName) — UO.FunRunning(String)

引数: subrutineName (String)

結果: int / Integer.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

case "FunRunning":
                string runningName = Convert.ToString(arguments[0]) ?? "";
                result = IsRunning(runningName) || events is ICSharpScriptHost runningHost && runningHost.IsCSharpScriptRunning(runningName) ? 1 : 0;
                return true;

内部実装のコードです。単独のスクリプトとして実行できません。

public int FunRunning(string subrutineName) => bridge.FunRunning(subrutineName) ? 1 : 0;

UO.GetPauseScriptOnDisconnectStatus

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

C# のシグネチャ

dynamic UO.GetPauseScriptOnDisconnectStatus();

マネージャーが無効な場合に、スクリプトの一時停止設定を読み取ります。

引数

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

戻り値

int 1 — PauseScriptsOnDisconnect が有効。 0 - 無効。

動作

  • 個々のスクリプトの現在の一時停止ではなく、マネージャー フラグを読み取ります。通話自体は一時停止または一時停止解除されません。

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

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

簡単な例

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

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

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

1。設定読み取り - 直接スクリプト

引数と実行の流れ:

  • この値はマネージャーの設定を表します。
var enabled = UO.GetPauseScriptOnDisconnectStatus();
UO.Print(Convert.ToString(enabled));

2。別途接続確認 - スクリプト機能

引数と実行の流れ:

  • 構成フラグと接続は独立して読み取られます。
return  RunScenario();
 object? RunScenario()
{
    var pauseOnDisconnect = UO.GetPauseScriptOnDisconnectStatus();
    var online = UO.Connected();
    UO.Print(Convert.ToString(pauseOnDisconnect) + " " + Convert.ToString(online));
    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 saved = UO.GetPauseScriptOnDisconnectStatus();
        await Delay(100);
        UO.Print(Convert.ToString(saved));
        return null;
    }

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

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.GetPauseScriptOnDisconnectStatus() — UO.GetPauseScriptOnDisconnectStatus()

引数: 引数はありません。

結果: dynamic / Any.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

case "getpausescriptondisconnectstatus": return new InjectionValue(bridge.GetPauseScriptOnDisconnectStatus());

UO.GetScriptName

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

C# のシグネチャ

string UO.GetScriptName(object? scriptIndex);

アクティブな実行の表示名を読み取ります。

引数

  • scriptIndex - 必須 ScriptIndex - 整数、新しい GetScriptsList からのゼロからのインデックス。負のインデックスまたは欠落しているインデックスの場合は、記述された空/不明の結果が返されます。件名のserial、手順の名前、またはIDEからの起動のIDを渡さないでください。

戻り値

string: 表示名、またはインデックスがない場合は「」。既存の起動の名前を明示的に空の文字列に設定することもできます。

動作

  • 実行中および一時停止中の起動が考慮されます。完了済みでキャンセルリクエストを受け取ったものは除きます。通常、実行中のスクリプトはそれ自体を考慮します。 IDE タブをロードするだけでは起動とみなされません。
  • インデックスは起動順の現在の位置です。スクリプトの開始/停止により位置がずれることがあります。異なる呼び出しでは、共通のアトミック スナップショットは形成されません。次の制御コマンドの前にリストを再読み取りします。
  • GetScriptsList はインデックス、GetScriptsCount は数量、GetScriptState はスリーステートコードを与えます。一方を他方に置き換えたり、null 以外の結果を true として扱ったりしないでください。
  • ScriptIndex=0 - 現在の最初の起動。必ずしもスクリプトを呼び出す必要はありません。 SetScriptName は、ファイルの名前を変更せずに表示名を変更します。

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

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

簡単な例

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

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

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

1。最初の呼び出しと結果 - 直接スクリプト

引数と実行の流れ:

  • 指定された C#-スクリプトを実行します。渡される数字 0 はインデックスを表します。空の括弧は引数がないことを意味します。テキスト Print はメッセージの例にすぎません。
  • ScriptIndex=0 - 現在の最初の起動。必ずしもスクリプトを呼び出す必要はありません。 SetScriptName は、ファイルの名前を変更せずに表示名を変更します。
  • string: 表示名、またはインデックスがない場合は「」。既存の起動の名前を明示的に空の文字列に設定することもできます。
  • 必須の ScriptIndex は整数で、新しい GetScriptsList からのゼロからのインデックスです。負のインデックスまたは欠落しているインデックスの場合は、記述された空/不明の結果が返されます。項目のserial、手順の名前、またはIDEからの起動のIDを渡さないでください。
var index = 0;
var name = UO.GetScriptName(index);
UO.Print(name);

2。ループまたは条件で使用する - スクリプト関数

引数と実行の流れ:

  • コマンド共有の具体例です。配列のインデックス付けはゼロから始まります。長さをご確認の上お取り扱いください。 UO.Wait(250) が使用される場合、250 ミリ秒待機します。
  • ScriptIndex=0 - 現在の最初の起動。必ずしもスクリプトを呼び出す必要はありません。 SetScriptName は、ファイルの名前を変更せずに表示名を変更します。
  • string: 表示名、またはインデックスがない場合は「」。既存の起動の名前を明示的に空の文字列に設定することもできます。
  • 必須の ScriptIndex は整数で、新しい GetScriptsList からのゼロからのインデックスです。負のインデックスまたは欠落しているインデックスの場合は、記述された空/不明の結果が返されます。項目のserial、手順の名前、またはIDEからの起動のIDを渡さないでください。
return  RunScenario();
 object? RunScenario()
{
    var indices = UO.GetScriptsList();
    foreach (var index in indices)
    {
        var name = UO.GetScriptName(index);
        UO.Print(Convert.ToString(index) + " = " + name);
    }

    return null;
}

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

引数と実行の流れ:

  • Main の下には関数全体があります。そのパラメータと結果は、それが呼び出すAPI-コマンドとは別に説明されます。
  • DescribeScript はステータスをチェックし、名前とパスを連結します。通話の合間に一時停止することも可能です。 「欠落」は関数の値であり、GetScriptName の結果ではありません。
  • string: 表示名、またはインデックスがない場合は「」。既存の起動の名前を明示的に空の文字列に設定することもできます。
  • 必須の ScriptIndex は整数で、新しい GetScriptsList からのゼロからのインデックスです。負のインデックスまたは欠落しているインデックスの場合は、記述された空/不明の結果が返されます。項目のserial、手順の名前、またはIDEからの起動のIDを渡さないでください。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.Print(DescribeScript(0));
        return null;
    }

    dynamic DescribeScript(dynamic index)
    {
        if (Truth(UO.GetScriptState(index) == 0))
        {
            return "missing";
        }

        return UO.GetScriptName(index) + " | " + UO.GetScriptPath(index);
    }

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

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.GetScriptName(scriptIndex) — UO.GetScriptName(Any)

引数: scriptIndex (Any)

結果: string / String.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

case "getscriptname": return new InjectionValue(bridge.GetScriptName(Arg(0)));

UO.GetScriptPath

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

C# のシグネチャ

string UO.GetScriptPath(object? scriptIndex);

アクティブな起動ソース ファイルのパスを読み取ります。

引数

  • scriptIndex - 必須 ScriptIndex - 整数、新しい GetScriptsList からのゼロからのインデックス。負のインデックスまたは欠落しているインデックスの場合は、記述された空/不明の結果が返されます。件名のserial、手順の名前、またはIDEからの起動のIDを渡さないでください。

戻り値

string: ソースファイルの保存されたパス、またはインデックスがない場合は「」。ファイルを実行するとき、これは通常フルパスです。コマンドまたはソースのメモリ内に通常のファイルがない可能性があります。

動作

  • 実行中および一時停止中の起動が考慮されます。完了済みでキャンセルリクエストを受け取ったものは除きます。通常、実行中のスクリプトはそれ自体を考慮します。 IDE タブをロードするだけでは起動とみなされません。
  • インデックスは起動順の現在の位置です。スクリプトの開始/停止により位置がずれることがあります。異なる呼び出しでは、共通のアトミック スナップショットは形成されません。次の制御コマンドの前にリストを再読み取りします。
  • GetScriptsList はインデックス、GetScriptsCount は数量、GetScriptState はスリーステートコードを与えます。一方を他方に置き換えたり、null 以外の結果を true として扱ったりしないでください。
  • ScriptIndex=0 は、最初の現在の実行を選択します。結果はそのソースを示します。このコマンドは、このファイルを開いたり、保存したり、実行したりしません。

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

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

簡単な例

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

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

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

1。最初の呼び出しと結果 - 直接スクリプト

引数と実行の流れ:

  • 指定された C#-スクリプトを実行します。渡される数字 0 はインデックスを表します。空の括弧は引数がないことを意味します。テキスト Print はメッセージの例にすぎません。
  • ScriptIndex=0 は、最初の現在の実行を選択します。結果はそのソースを示します。このコマンドは、このファイルを開いたり、保存したり、実行したりしません。
  • string: ソースファイルの保存されたパス、またはインデックスがない場合は「」。ファイルを実行するとき、これは通常フルパスです。コマンドまたはソースのメモリ内に通常のファイルがない可能性があります。
  • 必須の ScriptIndex は整数で、新しい GetScriptsList からのゼロからのインデックスです。負のインデックスまたは欠落しているインデックスの場合は、記述された空/不明の結果が返されます。項目のserial、手順の名前、またはIDEからの起動のIDを渡さないでください。
var index = 0;
var path = UO.GetScriptPath(index);
if (Truth(path!=""))
{
    UO.Print(path);
}

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

2。ループまたは条件で使用する - スクリプト関数

引数と実行の流れ:

  • コマンド共有の具体例です。配列のインデックス付けはゼロから始まります。長さをご確認の上お取り扱いください。 UO.Wait(250) が使用される場合、250 ミリ秒待機します。
  • ScriptIndex=0 は、最初の現在の実行を選択します。結果はそのソースを示します。このコマンドは、このファイルを開いたり、保存したり、実行したりしません。
  • string: ソースファイルの保存されたパス、またはインデックスがない場合は「」。ファイルを実行するとき、これは通常フルパスです。コマンドまたはソースのメモリ内に通常のファイルがない可能性があります。
  • 必須の ScriptIndex は整数で、新しい GetScriptsList からのゼロからのインデックスです。負のインデックスまたは欠落しているインデックスの場合は、記述された空/不明の結果が返されます。項目のserial、手順の名前、またはIDEからの起動のIDを渡さないでください。
return  RunScenario();
 object? RunScenario()
{
    var indices = UO.GetScriptsList();
    foreach (var index in indices)
    {
        UO.Print(UO.GetScriptName(index) + " -> " + UO.GetScriptPath(index));
    }

    return null;
}

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

引数と実行の流れ:

  • Main の下には関数全体があります。そのパラメータと結果は、それが呼び出すAPI-コマンドとは別に説明されます。
  • ReadScriptPath は、パスが空の場合にのみフォールバック パラメータを置き換えます。これは別の関数であり、新しい GetScriptPath オーバーロードではありません。
  • string: ソースファイルの保存されたパス、またはインデックスがない場合は「」。ファイルを実行するとき、これは通常フルパスです。コマンドまたはソースのメモリ内に通常のファイルがない可能性があります。
  • 必須の ScriptIndex は整数で、新しい GetScriptsList からのゼロからのインデックスです。負のインデックスまたは欠落しているインデックスの場合は、記述された空/不明の結果が返されます。項目のserial、手順の名前、またはIDEからの起動のIDを渡さないでください。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.Print(ReadScriptPath(0, "path unavailable"));
        return null;
    }

    dynamic ReadScriptPath(dynamic index, dynamic fallback)
    {
        var path = UO.GetScriptPath(index);
        if (Truth(path == ""))
        {
            return fallback;
        }

        return path;
    }

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

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.GetScriptPath(scriptIndex) — UO.GetScriptPath(Any)

引数: scriptIndex (Any)

結果: string / String.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

case "getscriptpath": return new InjectionValue(bridge.GetScriptPath(Arg(0)));

UO.GetScriptState

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

C# のシグネチャ

int UO.GetScriptState(object? scriptIndex);

実行ステータスをインデックスで読み取ります。

引数

  • scriptIndex - 必須 ScriptIndex - 整数、新しい GetScriptsList からのゼロからのインデックス。負のインデックスまたは欠落しているインデックスの場合は、記述された空/不明の結果が返されます。件名のserial、手順の名前、またはIDEからの起動のIDを渡さないでください。

戻り値

int - ステータスコード: 0 = いいえ/不明、1 = 実行中、2 = 一時停止。これは bool ではありません。1 または 2 と明示的に比較します。

動作

  • 実行中および一時停止中の起動が考慮されます。完了済みでキャンセルリクエストを受け取ったものは除きます。通常、実行中のスクリプトはそれ自体を考慮します。 IDE タブをロードするだけでは起動とみなされません。
  • インデックスは起動順の現在の位置です。スクリプトの開始/停止により位置がずれることがあります。異なる呼び出しでは、共通のアトミック スナップショットは形成されません。次の制御コマンドの前にリストを再読み取りします。
  • GetScriptsList はインデックス、GetScriptsCount は数量、GetScriptState はスリーステートコードを与えます。一方を他方に置き換えたり、null 以外の結果を true として扱ったりしないでください。
  • 手動/デバッグ一時停止と設定されたシャットダウン一時停止が考慮されます。 1 状態は、スクリプトが現在 CPU を消費していること、またはサーバー データを受信して​​いることを保証するものではありません。

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

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

簡単な例

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

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

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

1。最初の呼び出しと結果 - 直接スクリプト

引数と実行の流れ:

  • 指定された C#-スクリプトを実行します。渡される数字 0 はインデックスを表します。空の括弧は引数がないことを意味します。テキスト Print はメッセージの例にすぎません。
  • 手動/デバッグ一時停止と設定されたシャットダウン一時停止が考慮されます。 1 状態は、スクリプトが現在 CPU を消費していること、またはサーバー データを受信して​​いることを保証するものではありません。
  • int - ステータスコード: 0 = いいえ/不明、1 = 実行中、2 = 一時停止。これは bool ではありません。1 または 2 と明示的に比較します。
  • 必須の ScriptIndex は整数で、新しい GetScriptsList からのゼロからのインデックスです。負のインデックスまたは欠落しているインデックスの場合は、記述された空/不明の結果が返されます。項目のserial、手順の名前、またはIDEからの起動のIDを渡さないでください。
int state = UO.GetScriptState(0);
string text = state switch
{
    1 => "running",
    2 => "paused",
    _ => "unknown"
};
UO.Print(text);

2。ループまたは条件で使用する - スクリプト関数

引数と実行の流れ:

  • コマンド共有の具体例です。配列のインデックス付けはゼロから始まります。長さをご確認の上お取り扱いください。 UO.Wait(250) が使用される場合、250 ミリ秒待機します。
  • 手動/デバッグ一時停止と設定されたシャットダウン一時停止が考慮されます。 1 状態は、スクリプトが現在 CPU を消費していること、またはサーバー データを受信して​​いることを保証するものではありません。
  • int - ステータスコード: 0 = いいえ/不明、1 = 実行中、2 = 一時停止。これは bool ではありません。1 または 2 と明示的に比較します。
  • 必須の ScriptIndex は整数で、新しい GetScriptsList からのゼロからのインデックスです。負のインデックスまたは欠落しているインデックスの場合は、記述された空/不明の結果が返されます。項目のserial、手順の名前、またはIDEからの起動のIDを渡さないでください。
return  RunScenario();
 object? RunScenario()
{
    var paused = 0;
    var indices = UO.GetScriptsList();
    foreach (var index in indices)
    {
        if (Truth(UO.GetScriptState(index) == 2))
        {
            paused += 1;
        }
    }

    UO.Print(Convert.ToString(paused));
    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。完全なヘルパー関数 - スクリプト クラス

引数と実行の流れ:

  • Main の下には関数全体があります。そのパラメータと結果は、それが呼び出すAPI-コマンドとは別に説明されます。
  • IsScriptActive は、1 と 2 を true に、0 を false に変換します。 GetScriptState 自体は依然として数値ステータス コードを返します。
  • int - ステータスコード: 0 = いいえ/不明、1 = 実行中、2 = 一時停止。これは bool ではありません。1 または 2 と明示的に比較します。
  • 必須の ScriptIndex は整数で、新しい GetScriptsList からのゼロからのインデックスです。負のインデックスまたは欠落しているインデックスの場合は、記述された空/不明の結果が返されます。項目のserial、手順の名前、またはIDEからの起動のIDを渡さないでください。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(Truth(IsScriptActive(0)) == true))
        {
            UO.Print("running or paused");
        }
        else
        {
            UO.Print("not active");
        }

        return null;
    }

    dynamic IsScriptActive(dynamic index)
    {
        var state = UO.GetScriptState(index);
        return Truth(state == 1) || Truth(state == 2);
    }

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

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.GetScriptState(scriptIndex) — UO.GetScriptState(Any)

引数: scriptIndex (Any)

結果: int / Integer.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

case "getscriptstate": return new InjectionValue(bridge.GetScriptState(Arg(0)));

UO.GetScriptsCount

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

C# のシグネチャ

int UO.GetScriptsCount();

このクライアントでのアクティブな実行をカウントします。

引数

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

戻り値

int >= 0: 一時停止されたものを含む、アクティブな実行の数。これは量であり、bool やスクリプトのインデックスではありません。

動作

  • 実行中および一時停止中の起動が考慮されます。完了済みでキャンセルリクエストを受け取ったものは除きます。通常、実行中のスクリプトはそれ自体を考慮します。 IDE タブをロードするだけでは起動とみなされません。
  • インデックスは起動順の現在の位置です。スクリプトの開始/停止により位置がずれることがあります。異なる呼び出しでは、共通のアトミック スナップショットは形成されません。次の制御コマンドの前にリストを再読み取りします。
  • GetScriptsList はインデックス、GetScriptsCount は数量、GetScriptState はスリーステートコードを与えます。一方を他方に置き換えたり、null 以外の結果を true として扱ったりしないでください。
  • 引数はありません。カウントによってリストは並べ替えられず、実行の状態も変更されません。

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

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

簡単な例

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

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

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

1。最初の呼び出しと結果 - 直接スクリプト

引数と実行の流れ:

  • 指定された C#-スクリプトを実行します。渡される数字 0 はインデックスを表します。空の括弧は引数がないことを意味します。テキスト Print はメッセージの例にすぎません。
  • 引数はありません。カウントによってリストは並べ替えられず、実行の状態も変更されません。
  • int >= 0: 一時停止されたものを含む、アクティブな実行の数。これは量であり、bool やスクリプトのインデックスではありません。
var count = UO.GetScriptsCount();
UO.Print(Convert.ToString(count));

2。ループまたは条件で使用する - スクリプト関数

引数と実行の流れ:

  • コマンド共有の具体例です。配列のインデックス付けはゼロから始まります。長さをご確認の上お取り扱いください。 UO.Wait(250) が使用される場合、250 ミリ秒待機します。
  • 引数はありません。カウントによってリストは並べ替えられず、実行の状態も変更されません。
  • int >= 0: 一時停止されたものを含む、アクティブな実行の数。これは量であり、bool やスクリプトのインデックスではありません。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.GetScriptsCount();
    await Delay(250);
    var after = UO.GetScriptsCount();
    UO.Print(Convert.ToString(after - before));
    return null;
}

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

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

引数と実行の流れ:

  • Main の下には関数全体があります。そのパラメータと結果は、それが呼び出すAPI-コマンドとは別に説明されます。
  • HasOtherScripts はカウントを 1 と比較します。通常、呼び出し元のスクリプトは 1 つのエントリを占有します。 GetScriptsCount とは異なり、ヘルパー関数は true/false を返します。
  • int >= 0: 一時停止されたものを含む、アクティブな実行の数。これは量であり、bool やスクリプトのインデックスではありません。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(HasOtherScripts()))
        {
            UO.Print("Other executions are active");
        }
        else
        {
            UO.Print("No other active executions");
        }

        return null;
    }

    dynamic HasOtherScripts()
    {
        var count = UO.GetScriptsCount();
        return count > 1;
    }

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

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.GetScriptsCount() — UO.GetScriptsCount()

引数: 引数はありません。

結果: int / Integer.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

case "getscriptscount": return new InjectionValue(bridge.GetScriptsCount());

UO.GetScriptsList

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

C# のシグネチャ

dynamic UO.GetScriptsList();

現在の数値スクリプトインデックスを返します。

引数

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

戻り値

int からの配列: インデックス 0..N-1 または空の配列。要素は数値であり、名前やテキストエントリではありません。

動作

  • 実行中および一時停止中の起動が考慮されます。完了済みでキャンセルリクエストを受け取ったものは除きます。通常、実行中のスクリプトはそれ自体を考慮します。 IDE タブをロードするだけでは起動とみなされません。
  • インデックスは起動順の現在の位置です。スクリプトの開始/停止により位置がずれることがあります。異なる呼び出しでは、共通のアトミック スナップショットは形成されません。次の制御コマンドの前にリストを再読み取りします。
  • GetScriptsList はインデックス、GetScriptsCount は数量、GetScriptState はスリーステートコードを与えます。一方を他方に置き換えたり、null 以外の結果を true として扱ったりしないでください。
  • 引数はありません。各数値を、名前、パス、または状態の対応するゲッターに渡します。結果として得られる配列は別個のスナップショットです。これを変更してもスクリプトは制御されません。

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

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

簡単な例

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

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

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

1。最初の呼び出しと結果 - 直接スクリプト

引数と実行の流れ:

  • 指定された C#-スクリプトを実行します。渡される数字 0 はインデックスを表します。空の括弧は引数がないことを意味します。テキスト Print はメッセージの例にすぎません。
  • 引数はありません。各数値を、名前、パス、または状態の対応するゲッターに渡します。結果として得られる配列は別個のスナップショットです。これを変更してもスクリプトは制御されません。
  • int からの配列: インデックス 0..N-1 または空の配列。要素は数値であり、名前やテキストエントリではありません。
var indices = UO.GetScriptsList();
foreach (var index in indices)
{
    UO.Print(Convert.ToString(index) + ": " + UO.GetScriptName(index));
}

2。ループまたは条件で使用する - スクリプト関数

引数と実行の流れ:

  • コマンド共有の具体例です。配列のインデックス付けはゼロから始まります。長さをご確認の上お取り扱いください。 UO.Wait(250) が使用される場合、250 ミリ秒待機します。
  • 引数はありません。各数値を、名前、パス、または状態の対応するゲッターに渡します。結果として得られる配列は別個のスナップショットです。これを変更してもスクリプトは制御されません。
  • int からの配列: インデックス 0..N-1 または空の配列。要素は数値であり、名前やテキストエントリではありません。
return  RunScenario();
 object? RunScenario()
{
    var indices = UO.GetScriptsList();
    if (Truth(ArrayLength(indices) > 0))
    {
        var firstIndex = indices[0];
        UO.Print(UO.GetScriptPath(firstIndex));
    }

    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。完全なヘルパー関数 - スクリプト クラス

引数と実行の流れ:

  • Main の下には関数全体があります。そのパラメータと結果は、それが呼び出すAPI-コマンドとは別に説明されます。
  • FindNamedScript は現在のインデックスを反復処理し、表示名または -1 の最初の完全一致を返します。名前は繰り返される場合があり、インデックスは後で移動される場合があります。
  • int からの配列: インデックス 0..N-1 または空の配列。要素は数値であり、名前やテキストエントリではありません。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var index = FindNamedScript("Mining");
        if (Truth(index >= 0))
        {
            UO.Print(Convert.ToString(index));
        }
        else
        {
            UO.Print("Name not found");
        }

        return null;
    }

    dynamic FindNamedScript(dynamic wanted)
    {
        var indices = UO.GetScriptsList();
        foreach (var index in indices)
        {
            if (Truth(UO.GetScriptName(index) == wanted))
            {
                return index;
            }
        }

        return -1;
    }

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

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.GetScriptsList() — UO.GetScriptsList()

引数: 引数はありません。

結果: dynamic / Array.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

case "getscriptslist": return new InjectionValue(bridge.GetScriptsList().Select(value => new InjectionValue(value)).ToArray());

UO.Launch

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

C# のシグネチャ

int UO.Launch(object? file);
int UO.Launch(object? file, object? parameters);
int UO.Launch(object? file, object? parameters, object? workingDirectory);
int UO.Launch(object? file, object? parameters, object? workingDirectory, object? hidden);

引数

  • file — プログラムまたはドキュメントの必須のパス/名前。テキストに変換されると、外側のスペースが削除されます。値が空の場合は、0 とエラー メッセージが表示されます。正確なプログラムを選択するには、フルパスを使用します。ファイル自体に外側の引用符を追加する必要はありません。
  • workingDirectory — プロセスのオプションの作業フォルダー。省略または空行がある場合は、現在のスクリプトのフォルダーが使用されます。ランタイムにそのようなフォルダーがない場合、ブリッジはクライアントの現在の作業フォルダーを使用します。これは必ずしもゲーム フォルダーや EXE クライアント フォルダーであるとは限りません。
  • hidden — オプションのブール値、デフォルトは false。 true は、OS シェルから開くことを無効にし、コンソール ウィンドウなしで起動するように要求します。実行可能ファイルが必要です。 false ではドキュメントの関連付けが可能です。 GUI プログラム自体は引き続きウィンドウを表示できます。

戻り値

int: 1 (true) Process.Start がプロセス オブジェクトを返した場合。それ以外の場合は、0 (false)。 C# では、結果 == 1 または結果 != 0 を確認します。 int を true と直接比較することはできません。これはPID、終了コード、または作業完了の確認ではありません。例外が発生した場合はエラーが出力され、0が返されます。すでに実行中のプログラムを通じてドキュメントを開くと、OS が新しいプロセスを返さないことがあります。この場合、0 はドキュメントが開かれていないことを証明しません。

動作

  • 指定された順序で 1 ~ 4 つの引数のオーバーロードのみが許可されます。 hidden を指定し、デフォルトの作業フォルダーをそのまま使用するには、3 番目の引数として空の文字列を渡します。 file/parameters/workingDirectory をテキストに変換する場合、ファイルの存在は事前にチェックされません。
  • デフォルトのフォルダーは、現在実行中のスクリプトによって決まります。 hidden=true を指定すると、相対プログラム パスが最初に workingDirectory と照合されます。部分的な OS 名の検索と関連付けはシステム固有です。フルパスを使用すると曖昧さがなくなります。作業フォルダーまたはプログラムが使用できない場合、起動に失敗する可能性があります。
  • 外部プロセスは独立して実行されます。 Launch は完了を待たず、stdout/stderr を読み取らず、スクリプトが停止しても終了しません。 hidden の true は起動メソッドのリクエストであり、ウィンドウが非表示になることを保証するものではありません。 Process オブジェクトはリクエスト後に解放されます。実行中のプログラム自体は引き続き実行されます。

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

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

簡単な例

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

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

var result = UO.Launch("loot-report.txt");
UO.Print("Launch: " + Convert.ToString(result));

1。既製のマイニング レポートを開く - 直接スクリプト

引数と実行の流れ:

  • 既存の loot-report.txt をスクリプトの隣に配置します。 OS は、.txt に割り当てられたアプリケーションでそれを開きます。 Main は、レポートの内容やレポートが読み取られたことの確認ではなく、Launch リクエストの結果を返します。
var started = UO.Launch("loot-report.txt");
return started;

2。スペースを含むパスをエディターに渡す - スクリプト関数

引数と実行の流れ:

  • フォルダーとレポートは存在する必要があります。それらを自分のものに置き換えてください。 Chr(34) ​​は、引数内のレポートの完全なパスを二重引用符で囲みます。 notepad.exe はシステムにアクセスできる必要があります。 false は通常のエディタ ウィンドウを有効にします。
return  RunScenario();
 object? RunScenario()
{
    var report = "C:\\UO Scripts\\loot report.txt";
    var arguments = Chr(34) + report + Chr(34);
    return UO.Launch("notepad.exe", arguments, "C:\\UO Scripts", false);
    return null;
}

string Chr(object? value) => ((char)Convert.ToInt32(value)).ToString();

3。コンソール ウィンドウを使用せずにローカル ログのリストを作成する - スクリプト クラス

引数と実行の流れ:

  • Windows の例では、組み込みの cmd.exe が実行されます。スクリプト フォルダーに、.log のリストを含む log-files.txt が作成または上書きされます。 3 番目の引数を空にするとスクリプト フォルダーが保存され、true はコンソールを非表示にします。 Main からの true は起動のみを意味します。ファイルはまだ準備ができていない可能性があり、.log やユーティリティ エラーがない場合でも、すでに取得されている結果 Launch は変更されません。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var started = UO.Launch("cmd.exe", "/d /c dir /b *.log > log-files.txt", "", true);
        if (Truth(started == 0))
        {
            return false;
        }

        return true;
        return null;
    }

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

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.Launch(file) — UO.Launch(Any)

引数: file (Any)

結果: int / Integer.

呼び出し時:

呼び出し時には保存済みのハンドラー delegate を実行します。登録メソッドは API の構築時にこの delegate を作成します。

内部実装のコードです。単独のスクリプトとして実行できません。

values => new InjectionValue(CompactLaunch(values))

UO.Launch(file, parameters) — UO.Launch(Any,Any)

引数: file (Any), parameters (Any)

結果: int / Integer.

呼び出し時:

呼び出し時には保存済みのハンドラー delegate を実行します。登録メソッドは API の構築時にこの delegate を作成します。

内部実装のコードです。単独のスクリプトとして実行できません。

values => new InjectionValue(CompactLaunch(values))

UO.Launch(file, parameters, workingDirectory) — UO.Launch(Any,Any,Any)

引数: file (Any), parameters (Any), workingDirectory (Any)

結果: int / Integer.

呼び出し時:

呼び出し時には保存済みのハンドラー delegate を実行します。登録メソッドは API の構築時にこの delegate を作成します。

内部実装のコードです。単独のスクリプトとして実行できません。

values => new InjectionValue(CompactLaunch(values))

UO.Launch(file, parameters, workingDirectory, hidden) — UO.Launch(Any,Any,Any,Any)

引数: file (Any), parameters (Any), workingDirectory (Any), hidden (Any)

結果: int / Integer.

呼び出し時:

呼び出し時には保存済みのハンドラー delegate を実行します。登録メソッドは API の構築時にこの delegate を作成します。

内部実装のコードです。単独のスクリプトとして実行できません。

values => new InjectionValue(CompactLaunch(values))

UO.PauseResumeScript

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

C# のシグネチャ

void UO.PauseResumeScript(object? scriptIndex);

1 つのアクティブな実行の手動一時停止を切り替えます。現在の進行状況を失うことなく、マイニングや別の手順を一時的に停止するために使用します。

引数

  • scriptIndex - 必須 ScriptIndex - 現在の起動インデックス: 0 は最初のインデックスを意味し、次に 1、2... GetScriptsList を介して取得します。これはファイル名である serial ではなく、StartScript の結果でもありません。負のインデックスまたは欠落したインデックスは何も変わりません。

戻り値

void - 戻り値はありません。この通話を true/1 と比較しないでください。別途GetScriptStateを読んで状態を確認してください。このような読み取りの結果は、0 (開始なし)、1 (実行中)、2 (一時停止) になります。

動作

  • 現在のセッションの実行でのみ機能します。実行せずに開いているタブはアクティブな起動ではありません。停止しても元のファイルは削除されず、サーバーへの接続も切断されません。
  • インデックスは動的です。別の実行が完了した後に位置が移動する可能性があります。複数の API 呼び出しはアトミックな操作ではありません。これらの例は、リストへの変更が並行して行われないように設計されています。アクションの前に目的の起動を再度探し、UO.Wait 経由でインデックスを保存しないでください。
  • これは切り替えであり、「常に続行」コマンドではありません。手動一時停止と自動一時停止は独立しています。手動に切り替えても、接続切断の一時停止は解除されません。コード 2 は一時停止の理由を説明していません。この方法で自分自身の起動を停止すると、次の呼び出しを行って起動を続行することができなくなります。 IDE/manager または他のスクリプトから再開します。

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

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

簡単な例

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

for (int index = 0; index < UO.GetScriptsCount(); index++)
    if (UO.GetScriptName(index) == "Worker")
    { UO.PauseResumeScript(index); break; }

1。名前による一時停止の切り替え - 直接スクリプト

引数と実行の流れ:

  • MineOre は、すでに実行されているプロシージャの表示名の例です。 FindNamedRun は、最初に一致したインデックス、または -1 を返します。別のコントローラーから呼び出します。もう一度呼び出すと、手動一時停止が元に戻ります。
  • インデックスは動的です。別の実行が完了した後に位置が移動する可能性があります。複数の API 呼び出しはアトミックな操作ではありません。これらの例は、リストへの変更が並行して行われないように設計されています。アクションの前に目的の起動を再度探し、UO.Wait 経由でインデックスを保存しないでください。
var index = FindNamedRun("MineOre");
if (Truth(index >= 0))
{
    UO.PauseResumeScript(index);
}

dynamic FindNamedRun(dynamic wanted)
{
    var indices = UO.GetScriptsList();
    foreach (var index in indices)
    {
        if (Truth(UO.GetScriptName(index) == wanted))
        {
            return index;
        }
    }
    return -1;
}

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

2。実行中のスタートアップを一時停止する - スクリプト関数

引数と実行の流れ:

  • Check == 1 は、アクションを実行中のトリガーに制限します。値 2 は、通信がないことを示す可能性があるため、「手動一時停止の解除」の表示としては使用されません。
  • インデックスは動的です。別の実行が完了した後に位置が移動する可能性があります。複数の API 呼び出しはアトミックな操作ではありません。これらの例は、リストへの変更が並行して行われないように設計されています。アクションの前に目的の起動を再度探し、UO.Wait 経由でインデックスを保存しないでください。
return  RunScenario();
 object? RunScenario()
{
    var index = FindNamedRun("MineOre");
    if (Truth(index >= 0))
    {
        if (Truth(UO.GetScriptState(index) == 1))
        {
            UO.PauseResumeScript(index);
        }
    }

    return null;
}

dynamic FindNamedRun(dynamic wanted)
{
    var indices = UO.GetScriptsList();
    foreach (var index in indices)
    {
        if (Truth(UO.GetScriptName(index) == wanted))
        {
            return index;
        }
    }

    return -1;
}

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

3。ファイルごとに実行 - スクリプト クラスを選択します

引数と実行の流れ:

  • 絶対パスを実際のパスに置き換えます。 FindFileRun は、大文字と小文字を区別せずにパスを比較し、このファイルの最初の実行を返します。複数のプロシージャを 1 つのファイルで実行できます。
  • インデックスは動的です。別の実行が完了した後に位置が移動する可能性があります。複数の API 呼び出しはアトミックな操作ではありません。これらの例は、リストへの変更が並行して行われないように設計されています。アクションの前に目的の起動を再度探し、UO.Wait 経由でインデックスを保存しないでください。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var wantedPath = "D:/Game/AutoLoad/Scripts/Worker.csx";
        var index = FindFileRun(wantedPath);
        if (Truth(index >= 0))
        {
            UO.PauseResumeScript(index);
        }

        return null;
    }

    dynamic FindFileRun(dynamic wantedPath)
    {
        var indices = UO.GetScriptsList();
        foreach (var index in indices)
        {
            if (Truth(Convert.ToString(ReplaceText(UO.GetScriptPath(index), Chr(92), "/")) == Convert.ToString(ReplaceText(wantedPath, Chr(92), "/"))))
            {
                return index;
            }
        }

        return -1;
    }

    string Chr(object? value) => ((char)Convert.ToInt32(value)).ToString();
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
    string ReplaceText(object? value, object? oldValue, object? newValue) => (Convert.ToString(value) ?? "").Replace(Convert.ToString(oldValue) ?? "", Convert.ToString(newValue) ?? "");
}

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.PauseResumeScript(scriptIndex) — UO.PauseResumeScript(Any)

引数: scriptIndex (Any)

結果: void / Unit.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

case "pauseresumescript": bridge.PauseResumeScript(Arg(0)); return InjectionValue.Unit;

UO.SetEvent

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

C# のシグネチャ

void UO.SetEvent(object? name, object? stateValue);
void UO.SetEvent(object? name, object? stateValue, object? repeatOrHandler);
void UO.SetEvent(object? nameValue, object? stateValue, object? repeatValue, object? subNameValue);

キャラクターの状態の変化の監視を有効または無効にし、1 回限りの反応または繰り返しの反応を選択できるようにします。たとえば、死亡後に残りのターゲットを一度キャンセルしたり、スタミナ低下に関する警告を受け取ることができます。ハンドラーは条件とは別に指定されます。メイン スクリプトは UO.Wait を実行し続ける必要があります。

引数

  • name — 5 つの名前のいずれかを含む文字列: ChangeHitPoints、ChangeMana、ChangeStamina、Death、SeeNewPlayer。大文字と小文字は重要ではありません。接頭辞 ev を使用できます (例: evChangeMana)。端の周りの空白が削除されます。イベントの数値カタログはありません。任意の名前では新しいイベントは作成されません。
  • nameValue — 名前と同じイベント名。これは、4 つの引数形式の最初のパラメータの名前であり、オプションの値ではありません。
  • stateValue - true/1 は監視をオンにし、false/0 は購読を解除します。ブール値を引用符なしで渡します。数値変換では、ゼロ以外の整数には観測値が含まれます。無効にしても、すでに実行中のハンドラーを待機したり停止したりすることはありません。
  • repeatOrHandler — 3 番目の引数には 2 つの目的があります。 「OnManaChanged」などの数値以外の空でない文字列は、自動繰り返しハンドラーを指定します。番号/bool セットは繰り返しのみ: false/0 — 1 回の操作、true/1 — 繰り返し。このフォームではハンドラーは割り当てられません。文字列「1」も数値であり、プロシージャ名ではありません。 1 回限りのハンドラーの場合は、4 つの引数を使用します。
  • repeatValue - 4 つの引数を持つ形式: false/0 - 最初に検出された遷移後にサブスクリプションを削除します。 true/1 - 次の変更のために残しておきます。ワンタイムサブスクリプションは、ハンドラーが見つからない場合、またはマネージャーがハンドラーの起動を拒否した場合にもキャンセルされます。イベントの検出と手順の正常な完了を混同しないでください。

戻り値

void - 値なし。 var result = を指定せず、true/1 との比較を行わずに、別の回線で呼び出します。登録を完了しても、ハンドラーが見つかったこと、開始されたこと、またはサーバーがアクションを実行したことは確認されません。イベントでプロシージャ名が見つからない場合、呼び出しは行われません。

動作

  • 2 つの引数: false はイベントを無効にします。 true では、ハンドラーなしで繰り返し観察を行います。名前が一致するプロシージャは自動的に置き換えられません。このフォームは所見を返さず、HP/Mana/Dead テストに代わるものではありません。
  • 4 つの引数は、イベント名、イネーブル、リピート、およびハンドラーを明示的に指定します。どちらのブール値パラメータも引用符なしで記述されます。 false/0 = ワンショット: サブスクリプションは、ハンドラーの終了後ではなく、最初の遷移が検出された後にサブスクライブ解除されます。
  • 1 つのイベントを再登録すると、以前の設定が置き換えられ、現在の状態が新しい参照ポイントとして記憶されます。 1 つのスクリプト内の 1 つの正規化された名前へのサブスクリプション SetEvent および SetEventProc は 1 つのレコードを使用し、蓄積されません。
  • ChangeHitPoints は、現在の HP self を前のスナップショットと比較します。健康を失ったときと回復したときの両方でトリガーされます。 ChangeMana と ChangeStamina は両方向で同様に反応します。それはダメージ、マナ消費、疲労だけではありません。
  • 死は、生きている状態から死亡した状態に移行するときにトリガーされます。すでに死亡したキャラクターを登録しても、ハンドラーはすぐには呼び出されません。復活後に再び死ぬと、再びトリガーされる可能性があります。
  • SeeNewPlayer は、0 と self を除く、ダウンロードされたモバイルのセットを比較します。この名前は、実際のプレイヤーをテストすることを意味するものではありません。これには、NPC とクリーチャーが含まれます。チェックごとに 1 つ以上の新しい serial により、起動が 1 回試行されます。ロードされたセットから出発したmobileが戻ってきたことも、新たな登場と考えることができます。 ID はハンドラーに渡されません。必要なオブジェクトは個別に見つける必要があります。
  • UO.Wait と WaitAsync は、待機を最大 25 ミリ秒の間隔に分割し、それぞれの後にイベントをチェックします。 UO.Wait(0) もチェックを実行します。これは、すべてのネットワーク パケットをインターセプトするのではなく、利用可能な状態をポーリングします。チェック間の高速な変更や戻りが見逃される可能性があります。 UO.Wait のない計算サイクル中、またはメイン スクリプトの完了後は、継続的な監視は行われません。
  • ハンドラー名は、RegisterRoutine を介して C# デリゲートに事前に関連付けられています。コールバックはこのセッションで非同期に実行されます。 1 つのタスクがそれ自体に重なることはありません。メインスクリプトの終了後、彼女のさらなる行動は禁止されます。
  • サブスクリプションとは、実行中のスクリプトのインスタンスを指します。これを作成した Main で削除します。別個に起動されたハンドラー内の同じ名前のコマンドは、それ自体のサブスクリプションを変更します。登録を解除しても、すでに実行中のハンドラーは停止されません。通常終了または処理可能なエラーの場合は、try/finally を使用します。強制停止は、このスクリプトのそれ以降のポーリングも停止します。
  • 不明な空ではないイベント名は、登録時にシステム メッセージとともに拒否されます。空の名前は何もしません。ハンドラーの存在は、トリガーされた場合にのみチェックされます。 SubExists で名前の誤りを事前に検出し、IDE でスクリプトをチェックすることをお勧めします。

C# では、ハンドラーを明示的に登録する必要があります: RegisterRoutine("Handler", Handler)。 HP への変更、マナ、スタミナはネイティブ イベント キューを通じて提供されます。死とSeeNewPlayerはローカルワールドのスナップショットと照合されます。引数付きの直接サブスクリプションは、SubscribeEvent("UO.JournalEntry", handler) および同様のネイティブ名を介して利用できます。この実行が完了またはキャンセルされると、すべてのサブスクリプションが解放されます。

アップロードされたC#-ファイル

ローカルのデリゲートに加えて、現在のマネージャーは、Child.csx::Main のようなキーを持つ明示的に読み込まれた C# エントリをサポートしています。 SubExists と FunRunning はそのようなキーを受け入れます。 CallSub は Args なしでファイルを実行し、Exec("exec Child.csx::Main 'north Gate' 42") は Args を渡します。スペースを含むキーは、Exec 内で引用符で囲まれます。一意の短い名前は許容されますが、あいまいな名前ではランダムなファイルが選択されません。ローカル登録が優先されます。ファイルの起動は、現在のワールド/マネージャー内で独自のコンテキストと有効期間を取得します。ローカル デリゲートは、それらを登録した実行に属します。

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

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

簡単な例

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

RegisterRoutine("HealthChanged", () => UO.Print("HP changed"));
UO.SetEvent("ChangeHitPoints", true, false, "HealthChanged");
await WaitAsync(5000);

1。未完了のターゲットを死亡後に一度キャンセル - 直接スクリプト

引数と実行の流れ:

  • 観察は 8 秒間続きます。すでに死亡しているキャラクターが死亡しても、ハンドラーはすぐには呼び出されません。この例では、復活後の 2 番目の死亡イベントは処理されなくなりました。
  • ハンドラーは実行時にターゲットのアクティブ カーソルをチェックし、その後でのみ CancelTarget を呼び出します。この例では、アクティブなカーソルのない準備済みキューはキャンセルされません。このスクリプトはキャラクターを復活させたり、すべてのスクリプトを停止したり、メインを終了したりしません。ターゲットをアクティブなままにしておく場合は、この例を実行しないでください。
var registrationOnFirstDeath = RegisterRoutine("OnFirstDeath", OnFirstDeath);
UO.SetEvent("Death", true, false, "OnFirstDeath");
try
{
    UO.Wait(8000);
}
finally
{
    UO.SetEvent("Death", false);
}

void OnFirstDeath()
{
    if (Truth(UO.Targeting()))
    {
        UO.CancelTarget();
        UO.Print("Death detected: active targeting cancelled");
    }
    else
    {
        UO.Print("Death detected: no active target");
    }
}

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

2。スタミナ繰り返し警告: 短い形式 - スクリプト関数

引数と実行の流れ:

  • 24 × 250 ミリ秒 – 6 秒。 10 はハンドラー内のしきい値であり、追加の引数 SetEvent ではありません。耐久性の増加もハンドラーによって引き起こされますが、10 の値ではメッセージは表示されません。
  • true、「OnFatigue」はtrue、trueとは異なり、後者のオプションは手順なしの繰り返しを指定します。このスクリプトは耐久性を向上させたり、サーバーの速度を変更したりすることはありません。
return  RunScenario();
 object? RunScenario()
{
    var registrationOnFatigue = RegisterRoutine("OnFatigue", OnFatigue);
    UO.SetEvent("evChangeStamina", true, "OnFatigue");
    try
    {
        for (int tick = (int)(1); tick <= 24; tick += (int)(1))
        {
            UO.Wait(250);
        }
    }
    finally
    {
        UO.SetEvent("ChangeStamina", false);
    }

    return null;
}

void OnFatigue()
{
    var staminaNow = UO.Stamina();
    if (Truth(staminaNow < 10))
    {
        UO.Print("Stamina is " + Convert.ToString(staminaNow) + ": consider resting");
    }
}

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

3。サブスクリプションを蓄積せずに mana ハンドラーを切り替える - スクリプト クラス

引数と実行の流れ:

  • 最初の 2 秒間は、変化が検出されるたびに OnManaLog がトリガーされます。次の 3 秒間、OnLowMana が使用されます。 2 番目のハンドラーを登録しても、それ自体はトリガーされません。
  • 置き換えによって、すでに実行されている古いプロシージャが中断されることはありません。これらの短いハンドラーは Main ローカル変数を使用しません。手順の強制を禁止する場合、管理者は起動を拒否できます。このモードの場合は、Main で直接 Mana を確認してください。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var registrationOnManaLog = RegisterRoutine("OnManaLog", OnManaLog);
        var registrationOnLowMana = RegisterRoutine("OnLowMana", OnLowMana);
        UO.SetEvent("ChangeMana", true, true, "OnManaLog");
        try
        {
            UO.Wait(2000);
            UO.SetEvent("ChangeMana", true, true, "OnLowMana");
            UO.Wait(3000);
        }
        finally
        {
            UO.SetEvent("ChangeMana", false);
        }

        return null;
    }

    void OnManaLog()
    {
        UO.Print("Mana now: " + Convert.ToString(UO.Mana()));
    }

    void OnLowMana()
    {
        if (Truth(UO.Mana() < 20))
        {
            UO.Print("Mana below 20: check the cost before casting");
        }
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
    private IDisposable RegisterRoutine(string name, Action handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterRoutine(name, handler);
    private IDisposable RegisterRoutine(string name, Func<Task> handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterRoutine(name, handler);
    private IDisposable RegisterRoutine(string name, Action<string[]> handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterRoutine(name, handler);
    private IDisposable RegisterRoutine(string name, Func<string[], Task> handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterRoutine(name, handler);
}

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.SetEvent(name, stateValue) — UO.SetEvent(Any,Any)

引数: name (Any), stateValue (Any)

結果: void / Unit.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

case "SetEvent": SetStateEvent(arguments); return true;

内部実装のコードです。単独のスクリプトとして実行できません。

public void SetEvent(InjectionValue name, InjectionValue stateValue)

            => SetEvent(name, stateValue, InjectionValue.True, new InjectionValue(string.Empty));

UO.SetEvent(name, stateValue, repeatOrHandler) — UO.SetEvent(Any,Any,Any)

引数: name (Any), stateValue (Any), repeatOrHandler (Any)

結果: void / Unit.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

case "SetEvent": SetStateEvent(arguments); return true;

内部実装のコードです。単独のスクリプトとして実行できません。

public void SetEvent(InjectionValue name, InjectionValue stateValue, InjectionValue repeatOrHandler)

        {

            string raw = repeatOrHandler.ToString() ?? string.Empty;

            if (!string.IsNullOrWhiteSpace(raw) && !NumberConversions.TryStr2Int(raw, out _))

                SetEvent(name, stateValue, InjectionValue.True, repeatOrHandler);

            else

                SetEvent(name, stateValue, repeatOrHandler, new InjectionValue(string.Empty));

        }

UO.SetEvent(nameValue, stateValue, repeatValue, subNameValue) — UO.SetEvent(Any,Any,Any,Any)

引数: nameValue (Any), stateValue (Any), repeatValue (Any), subNameValue (Any)

結果: void / Unit.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

case "SetEvent": SetStateEvent(arguments); return true;

内部実装のコードです。単独のスクリプトとして実行できません。

public void SetEvent(InjectionValue nameValue, InjectionValue stateValue, InjectionValue repeatValue, InjectionValue subNameValue)

        {

            string name = NormalizeLegacyEventName(nameValue.ToString());

            if (string.IsNullOrEmpty(name))

                return;



            bool enabled = NumberConversions.ToInt(stateValue) != 0;

            eventStates[name] = enabled ? 1 : 0;

            if (!enabled)

            {

                legacyEvents.Remove(name);

                return;

            }



            if (!IsSupportedLegacyEventName(name))

            {

                eventStates[name] = 0;

                legacyEvents.Remove(name);

                SystemMessage($"SetEvent: unsupported event '{name}'. Supported: SeeNewPlayer, Death, ChangeHitPoints, ChangeMana, ChangeStamina.");

                return;

            }



            var subscription = new LegacyEventSubscription

            {

                Name = name,

                Repeat = NumberConversions.ToInt(repeatValue) != 0,

                Handler = NormalizeLegacyEventHandler(subNameValue.ToString())

            };

            CaptureLegacyEventSnapshot(subscription);

            legacyEvents[name] = subscription;

        }

UO.SetEventProc

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

C# のシグネチャ

void UO.SetEventProc(object? eventname, object? procname);

観察された状態が変化したときにクライアントが実行する手順を指定します。たとえば、健康が失われたとき、マナが変化したとき、または新しい mobile が現れたときです。反応をメインサイクルから分離できます。登録自体は何も実行しません。メイン スクリプトはアクティブなままにしておく必要があります。 C# - コントロール ポイント、WaitAsync および UO.Wait はイベントを処理します。

引数

  • eventname — 5 つの名前のいずれかを含む文字列: ChangeHitPoints、ChangeMana、ChangeStamina、Death、SeeNewPlayer。大文字と小文字は重要ではありません。接頭辞 ev を使用できます (例: evChangeMana)。端の周りの空白が削除されます。イベントの数値カタログはありません。任意の名前では新しいイベントは作成されません。

戻り値

void - 値なし。 var result = を指定せず、true/1 との比較を行わずに、別の回線で呼び出します。登録を完了しても、ハンドラーが見つかったこと、開始されたこと、またはサーバーがアクションを実行したことは確認されません。イベントでプロシージャ名が見つからない場合、呼び出しは行われません。

動作

  • 両方の引数が必要です。サブスクリプションは繰り返し行われます。新たに検出された変更により、新たな起動が試行されます。 1 つの実行中のスクリプトでは、1 つの正規化されたイベント名に 1 つのハンドラーが割り当てられます。再登録するとそれが置き換えられ、最初のスナップショットが更新されます。 SetEventProc(event, "") は同じスクリプトでサブスクライブを解除します。 1 回限りの反応の場合は、SetEvent(event, true, false, "Handler") を使用します。
  • ChangeHitPoints は、現在の HP self を前のスナップショットと比較します。健康を失ったときと回復したときの両方でトリガーされます。 ChangeMana と ChangeStamina は両方向で同様に反応します。それはダメージ、マナ消費、疲労だけではありません。
  • 死は、生きている状態から死亡した状態に移行するときにトリガーされます。すでに死亡したキャラクターを登録しても、ハンドラーはすぐには呼び出されません。復活後に再び死ぬと、再びトリガーされる可能性があります。
  • SeeNewPlayer は、0 と self を除く、ダウンロードされたモバイルのセットを比較します。この名前は、実際のプレイヤーをテストすることを意味するものではありません。これには、NPC とクリーチャーが含まれます。チェックごとに 1 つ以上の新しい serial により、起動が 1 回試行されます。ロードされたセットから出発したmobileが戻ってきたことも、新たな登場と考えることができます。 ID はハンドラーに渡されません。必要なオブジェクトは個別に見つける必要があります。
  • UO.Wait と WaitAsync は、待機を最大 25 ミリ秒の間隔に分割し、それぞれの後にイベントをチェックします。 UO.Wait(0) もチェックを実行します。これは、すべてのネットワーク パケットをインターセプトするのではなく、利用可能な状態をポーリングします。チェック間の高速な変更や戻りが見逃される可能性があります。 UO.Wait のない計算サイクル中、またはメイン スクリプトの完了後は、継続的な監視は行われません。
  • ハンドラー名は、RegisterRoutine を介して C# デリゲートに事前に関連付けられています。コールバックはこのセッションで非同期に実行されます。 1 つのタスクがそれ自体に重なることはありません。メインスクリプトの終了後、彼女のさらなる行動は禁止されます。
  • サブスクリプションとは、実行中のスクリプトのインスタンスを指します。これを作成した Main で削除します。別個に起動されたハンドラー内の同じ名前のコマンドは、それ自体のサブスクリプションを変更します。登録を解除しても、すでに実行中のハンドラーは停止されません。通常終了または処理可能なエラーの場合は、try/finally を使用します。強制停止は、このスクリプトのそれ以降のポーリングも停止します。
  • 不明な空ではないイベント名は、登録時にシステム メッセージとともに拒否されます。空の名前は何もしません。ハンドラーの存在は、トリガーされた場合にのみチェックされます。 SubExists で名前の誤りを事前に検出し、IDE でスクリプトをチェックすることをお勧めします。

C# では、ハンドラーを明示的に登録する必要があります: RegisterRoutine("Handler", Handler)。 HP への変更、マナ、スタミナはネイティブ イベント キューを通じて提供されます。死とSeeNewPlayerはローカルワールドのスナップショットと照合されます。引数付きの直接サブスクリプションは、SubscribeEvent("UO.JournalEntry", handler) および同様のネイティブ名を介して利用できます。この実行が完了またはキャンセルされると、すべてのサブスクリプションが解放されます。

アップロードされたC#-ファイル

ローカルのデリゲートに加えて、現在のマネージャーは、Child.csx::Main のようなキーを持つ明示的に読み込まれた C# エントリをサポートしています。 SubExists と FunRunning はそのようなキーを受け入れます。 CallSub は Args なしでファイルを実行し、Exec("exec Child.csx::Main 'north Gate' 42") は Args を渡します。スペースを含むキーは、Exec 内で引用符で囲まれます。一意の短い名前は許容されますが、あいまいな名前ではランダムなファイルが選択されません。ローカル登録が優先されます。ファイルの起動は、現在のワールド/マネージャー内で独自のコンテキストと有効期間を取得します。ローカル デリゲートは、それらを登録した実行に属します。

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

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

簡単な例

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

RegisterRoutine("HealthChanged", () => UO.Print("HP changed"));
UO.SetEventProc("ChangeHitPoints", "HealthChanged");
await WaitAsync(5000);

1。 10 秒間の健全性の変化を監視 - 直接スクリプト

引数と実行の流れ:

  • ChangeHitPoints は、HP のキャラクターを観察します。 OnHealthChanged - 同じロードされたファイル内の Main の下/上のメソッドの名前。 UO.Wait はイベントを処理します。 2 番目の引数を空にすると、繰り返しが無効になります。
  • ハンドラーは警告のみを行い、自動的に治療を選択しません。 HP 60 → 50 → 70 を変更すると、2 つの反応が実行されます。これはヒットカウンターではありません。
var registrationOnHealthChanged = RegisterRoutine("OnHealthChanged", OnHealthChanged);
UO.SetEventProc("ChangeHitPoints", "OnHealthChanged");
try
{
    for (int tick = (int)(1); tick <= 40; tick += (int)(1))
    {
        UO.Wait(250);
    }
}
finally
{
    UO.SetEventProc("ChangeHitPoints", "");
}

void OnHealthChanged()
{
    var hp = UO.HP();
    if (Truth(hp < 40))
    {
        UO.Print("Low health: " + Convert.ToString(hp) + ". Check healing or retreat.");
    }
    else
    {
        UO.Print("Health changed: " + Convert.ToString(hp));
    }
}

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

2。準備中のマナとスタミナの監視はスクリプト機能です

引数と実行の流れ:

  • evChangeMana と ChangeMana は 1 つのイベントです。同じ名前の下に 2 つのハンドラーではなく、2 つの独立したサブスクリプションと 2 つの異なるハンドラーがあります。しきい値20と10は変更できます。
  • 待機は 5 秒続きます。リソースの回復も検出されますが、値がすでにしきい値を超えている場合には警告は発行されません。
return  RunScenario();
 object? RunScenario()
{
    var registrationOnManaChanged = RegisterRoutine("OnManaChanged", OnManaChanged);
    var registrationOnStaminaChanged = RegisterRoutine("OnStaminaChanged", OnStaminaChanged);
    UO.SetEventProc("evChangeMana", "OnManaChanged");
    UO.SetEventProc("ChangeStamina", "OnStaminaChanged");
    try
    {
        for (int tick = (int)(1); tick <= 20; tick += (int)(1))
        {
            UO.Wait(250);
        }
    }
    finally
    {
        UO.SetEventProc("ChangeMana", "");
        UO.SetEventProc("ChangeStamina", "");
    }

    return null;
}

void OnManaChanged()
{
    if (Truth(UO.Mana() < 20))
    {
        UO.Print("Mana below 20: postpone expensive spells");
    }
}

void OnStaminaChanged()
{
    if (Truth(UO.Stamina() < 10))
    {
        UO.Print("Stamina below 10: consider a movement break");
    }
}

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

3。新しいモバイルに気づき、監視を無効にする - スクリプト クラス

引数と実行の流れ:

  • SeeNewPlayer は、NPC を含む、ロードされたモバイルのセットでの serial の発生を検出します。一度に5体のクリーチャーをロードしても、5回の召喚が保証されるわけではありません。
  • GetMobiles() - イベントからの ID ではなく、実際のセットの個別の読み取り。敵を選択するには、明示的な条件が必要です。この例は意図的に誰かを攻撃しているわけではありません。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var registrationOnMobileAppeared = RegisterRoutine("OnMobileAppeared", OnMobileAppeared);
        UO.SetEventProc("SeeNewPlayer", "OnMobileAppeared");
        try
        {
            UO.Wait(5000);
        }
        finally
        {
            UO.SetEventProc("SeeNewPlayer", "");
        }

        UO.Wait(1000);
        return null;
    }

    void OnMobileAppeared()
    {
        var mobiles = UO.GetMobiles();
        UO.Print("Loaded mobiles now: " + Convert.ToString(ArrayLength(mobiles)));
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    private IDisposable RegisterRoutine(string name, Action handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterRoutine(name, handler);
    private IDisposable RegisterRoutine(string name, Func<Task> handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterRoutine(name, handler);
    private IDisposable RegisterRoutine(string name, Action<string[]> handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterRoutine(name, handler);
    private IDisposable RegisterRoutine(string name, Func<string[], Task> handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterRoutine(name, handler);
}

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.SetEventProc(eventname, procname) — UO.SetEventProc(Any,Any)

引数: eventname (Any), procname (Any)

結果: void / Unit.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

case "SetEventProc":
                SetStateEvent([arguments[0], !string.IsNullOrWhiteSpace(Convert.ToString(arguments[1])), true, arguments[1]]);
                return true;

内部実装のコードです。単独のスクリプトとして実行できません。

case "seteventproc":

                {

                    if (string.IsNullOrWhiteSpace(Text(1)))

                        SetEvent(arguments[0], InjectionValue.False);

                    else

                        SetEvent(arguments[0], InjectionValue.True, InjectionValue.True, arguments[1]);

                    return InjectionValue.Unit;

                }

UO.SetPauseScriptOnDisconnectStatus

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

C# のシグネチャ

void UO.SetPauseScriptOnDisconnectStatus(object? value);

接続が失われたときにスクリプトが一時停止するルールを変更します。

引数

  • value - 0 がオフになります。ゼロ以外の整数にはすべてが含まれます。

戻り値

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

動作

  • SetPauseScriptOnDisconnectStatus は _manager を設定します。PauseScriptsOnDisconnect = 有効 != 0。すでに実行中のスクリプトは、ここで PauseResumeScript コマンドを受け取りません。
  • クライアントの設定を変更します。この値は接続テストの結果ではなく、サーバーによる処理を確認するものではありません。

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

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

簡単な例

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

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

UO.Print("Calling UO.SetPauseScriptOnDisconnectStatus");
UO.SetPauseScriptOnDisconnectStatus(1);

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

引数と実行の流れ:

  • 接続が失われたときにスクリプトが一時停止するルールを変更します。
UO.SetPauseScriptOnDisconnectStatus(1);

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

引数と実行の流れ:

  • SetPauseScriptOnDisconnectStatus は _manager を設定します。PauseScriptsOnDisconnect = 有効 != 0。すでに実行中のスクリプトは、ここで PauseResumeScript コマンドを受け取りません。
return  RunScenario();
 object? RunScenario()
{
    UO.SetPauseScriptOnDisconnectStatus(0);
    return null;
}

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

引数と実行の流れ:

  • クライアントの設定を変更します。この値は接続テストの結果ではなく、サーバーによる処理を確認するものではありません。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        ApplyMode(1);
        return null;
    }

    void ApplyMode(dynamic mode)
    {
        UO.SetPauseScriptOnDisconnectStatus(mode);
    }
}

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.SetPauseScriptOnDisconnectStatus(value) — UO.SetPauseScriptOnDisconnectStatus(Any)

引数: value (Any)

結果: void / Unit.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

case "setpausescriptondisconnectstatus": bridge.SetPauseScriptOnDisconnectStatus(Arg(0)); return InjectionValue.Unit;

UO.SetScriptName

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

C# のシグネチャ

void UO.SetScriptName(object? scriptIndex, object? value);

1 つのアクティブな実行の表示名を変更します。リスト内で実行中のタスクと GetScriptName を介して実行中のタスクを区別するのに役立ちます。

引数

  • scriptIndex - 必須 ScriptIndex - 現在の起動インデックス: 0 は最初のインデックスを意味し、次に 1、2... GetScriptsList を介して取得します。これはファイル名である serial ではなく、StartScript の結果でもありません。負のインデックスまたは欠落したインデックスは何も変わりません。
  • value - 必須の値 - 文字列に変換された新しい名前。スペースは使用できます。空の文字列も受け入れられます。これは現在の実行の署名であり、ソース内のファイルまたはプロシージャの新しい名前ではありません。

戻り値

void - 戻り値はありません。この通話を true/1 と比較しないでください。別途GetScriptStateを読んで状態を確認してください。このような読み取りの結果は、0 (開始なし)、1 (実行中)、2 (一時停止) になります。

動作

  • 現在のセッションの実行でのみ機能します。実行せずに開いているタブはアクティブな起動ではありません。停止しても元のファイルは削除されず、サーバーへの接続も切断されません。
  • インデックスは動的です。別の実行が完了した後に位置が移動する可能性があります。複数の API 呼び出しはアトミックな操作ではありません。これらの例は、リストへの変更が並行して行われないように設計されています。アクションの前に目的の起動を再度探し、UO.Wait 経由でインデックスを保存しないでください。

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

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

簡単な例

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

for (int index = 0; index < UO.GetScriptsCount(); index++)
    if (UO.GetScriptName(index) == "Worker")
    { UO.SetScriptName(index, "Worker renamed"); break; }

1。タスクに明確な名前を付けます - 直接スクリプト

引数と実行の流れ:

  • MineOre はアクティブな実行で検索され、マイニングは新しい署名です。引用符内の名前はユーザーが作成したもので、置き換えることができます。
  • インデックスは動的です。別の実行が完了した後に位置が移動する可能性があります。複数の API 呼び出しはアトミックな操作ではありません。これらの例は、リストへの変更が並行して行われないように設計されています。アクションの前に目的の起動を再度探し、UO.Wait 経由でインデックスを保存しないでください。
var index = FindNamedRun("MineOre");
if (Truth(index >= 0))
{
    UO.SetScriptName(index, "Mining");
}

dynamic FindNamedRun(dynamic wanted)
{
    var indices = UO.GetScriptsList();
    foreach (var index in indices)
    {
        if (Truth(UO.GetScriptName(index) == wanted))
        {
            return index;
        }
    }
    return -1;
}

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

2。異なるファイルからのタスクを区別する - スクリプト機能

引数と実行の流れ:

  • wantedPath を絶対パスに置き換えます。このファイルの最初のアクティブな起動の署名は変更されますが、ディスク上のファイルは同じ場所に残ります。
  • インデックスは動的です。別の実行が完了した後に位置が移動する可能性があります。複数の API 呼び出しはアトミックな操作ではありません。これらの例は、リストへの変更が並行して行われないように設計されています。アクションの前に目的の起動を再度探し、UO.Wait 経由でインデックスを保存しないでください。
return  RunScenario();
 object? RunScenario()
{
    var wantedPath = "D:/Game/AutoLoad/Scripts/Worker.csx";
    var index = FindFileRun(wantedPath);
    if (Truth(index >= 0))
    {
        UO.SetScriptName(index, "Worker A");
    }

    return null;
}

dynamic FindFileRun(dynamic wantedPath)
{
    var indices = UO.GetScriptsList();
    foreach (var index in indices)
    {
        if (Truth(Convert.ToString(ReplaceText(UO.GetScriptPath(index), Chr(92), "/")) == Convert.ToString(ReplaceText(wantedPath, Chr(92), "/"))))
        {
            return index;
        }
    }

    return -1;
}

string Chr(object? value) => ((char)Convert.ToInt32(value)).ToString();
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
string ReplaceText(object? value, object? oldValue, object? newValue) => (Convert.ToString(value) ?? "").Replace(Convert.ToString(oldValue) ?? "", Convert.ToString(newValue) ?? "");

3。署名に状態を追加 - スクリプト クラス

引数と実行の流れ:

  • GetScriptState = 2 は、一時停止したテキストを名前に追加します。これは 1 回限りの署名です。継続後に自動的に更新されず、一時停止自体は制御されません。
  • インデックスは動的です。別の実行が完了した後に位置が移動する可能性があります。複数の API 呼び出しはアトミックな操作ではありません。これらの例は、リストへの変更が並行して行われないように設計されています。アクションの前に目的の起動を再度探し、UO.Wait 経由でインデックスを保存しないでください。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var index = FindNamedRun("Mining");
        if (Truth(index >= 0))
        {
            var newName = "Mining";
            if (Truth(UO.GetScriptState(index) == 2))
            {
                newName = "Mining (paused)";
            }

            UO.SetScriptName(index, newName);
        }

        return null;
    }

    dynamic FindNamedRun(dynamic wanted)
    {
        var indices = UO.GetScriptsList();
        foreach (var index in indices)
        {
            if (Truth(UO.GetScriptName(index) == wanted))
            {
                return index;
            }
        }

        return -1;
    }

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

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.SetScriptName(scriptIndex, value) — UO.SetScriptName(Any,Any)

引数: scriptIndex (Any), value (Any)

結果: void / Unit.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

case "setscriptname": bridge.SetScriptName(Arg(0), Text(1)); return InjectionValue.Unit;

UO.StartScript

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

C# のシグネチャ

int UO.StartScript(object? scriptPath);

引数

戻り値

int: 受け入れられた実行後のアクティブな実行の数。 65535 (0xFFFF) = 起動エラー。これは新しいスクリプトのインデックスでも、bool でも、完了の結果でもありません。

動作

  • 実行中および一時停止中の起動が考慮されます。完了済みでキャンセルリクエストを受け取ったものは除きます。通常、実行中のスクリプトはそれ自体を考慮します。 IDE タブをロードするだけでは起動とみなされません。
  • インデックスは起動順の現在の位置です。スクリプトの開始/停止により位置がずれることがあります。異なる呼び出しでは、共通のアトミック スナップショットは形成されません。次の制御コマンドの前にリストを再読み取りします。
  • GetScriptsList はインデックス、GetScriptsCount は数量、GetScriptState はスリーステートコードを与えます。一方を他方に置き換えたり、null 以外の結果を true として扱ったりしないでください。

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

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

簡単な例

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

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

var result = UO.StartScript("Scripts/Worker.csx");
UO.Print("StartScript: " + Convert.ToString(result));

1。最初の呼び出しと結果 - 直接スクリプト

引数と実行の流れ:

  • 指定された C#-スクリプトを実行します。渡される数字 0 はインデックスを表します。空の括弧は引数がないことを意味します。テキスト Print はメッセージの例にすぎません。
  • 例の前に、指定された Worker.csx ファイルを別途作成します。無効またはアクセスできないパス、不適切なメイン、無効な C#、または無効な並列実行により、エラーが発生します。前回の実行がまだ停止している場合は、遅延再試行が可能です。開始を受け入れることは完了を意味しません。短いスクリプトは、返品された数量を読み取る前に終了する場合があります。
  • int: 受け入れられた実行後のアクティブな実行の数。 65535 (0xFFFF) = 起動エラー。これは新しいスクリプトのインデックスでも、bool でも、完了の結果でもありません。
  • 必須 ScriptPath は文字列です。相対パスは、このクライアントの AutoLoad フォルダーから始まります。絶対パスも使用できます。パスはスペースで引用符で囲みます。トップレベルコードを備えた .csx、またはサポートされているエントリポイント C# を備えた通常の .cs/.csproj が必要です。
var count = UO.StartScript("Scripts/Worker.csx");
if (Truth(count==65535))
{
    UO.Print("launch failed");
}
else
{
    UO.Print("Active executions: " + Convert.ToString(count));
}

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

2。ループまたは条件で使用する - スクリプト関数

引数と実行の流れ:

  • コマンド共有の具体例です。配列のインデックス付けはゼロから始まります。長さをご確認の上お取り扱いください。 UO.Wait(250) が使用される場合、250 ミリ秒待機します。
  • 例の前に、指定された Worker.csx ファイルを別途作成します。無効またはアクセスできないパス、不適切なメイン、無効な C#、または無効な並列実行により、エラーが発生します。前回の実行がまだ停止している場合は、遅延再試行が可能です。開始を受け入れることは完了を意味しません。短いスクリプトは、返品された数量を読み取る前に終了する場合があります。
  • int: 受け入れられた実行後のアクティブな実行の数。 65535 (0xFFFF) = 起動エラー。これは新しいスクリプトのインデックスでも、bool でも、完了の結果でもありません。
  • 必須 ScriptPath は文字列です。相対パスは、このクライアントの AutoLoad フォルダーから始まります。絶対パスも使用できます。パスはスペースで引用符で囲みます。トップレベルコードを備えた .csx、またはサポートされているエントリポイント C# を備えた通常の .cs/.csproj が必要です。
return  RunScenario();
 object? RunScenario()
{
    var count = UO.StartScript("Scripts/My Worker.csx");
    if (Truth(count != 65535))
    {
        var indices = UO.GetScriptsList();
        foreach (var index in indices)
        {
            UO.Print(Convert.ToString(index) + ": " + UO.GetScriptPath(index));
        }
    }

    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。完全なヘルパー関数 - スクリプト クラス

引数と実行の流れ:

  • Main の下には関数全体があります。そのパラメータと結果は、それが呼び出すAPI-コマンドとは別に説明されます。
  • TryStartCSharp は結果を 65535 と比較し、true/false を返します。完了を待たず、数量をインデックスに変換しません。
  • int: 受け入れられた実行後のアクティブな実行の数。 65535 (0xFFFF) = 起動エラー。これは新しいスクリプトのインデックスでも、bool でも、完了の結果でもありません。
  • 必須 ScriptPath は文字列です。相対パスは、このクライアントの AutoLoad フォルダーから始まります。絶対パスも使用できます。パスはスペースで引用符で囲みます。トップレベルコードを備えた .csx、またはサポートされているエントリポイント C# を備えた通常の .cs/.csproj が必要です。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(TryStartCSharp("Scripts/Worker.csx")))
        {
            UO.Print("launch accepted");
        }
        else
        {
            UO.Print("check file, Main and execution settings");
        }

        return null;
    }

    dynamic TryStartCSharp(dynamic fileName)
    {
        var count = UO.StartScript(fileName);
        return Truth(count != 65535);
    }

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

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.StartScript(scriptPath) — UO.StartScript(Any)

引数: scriptPath (Any)

結果: int / Integer.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

case "startscript": return new InjectionValue(bridge.StartScript(Text(0)));

UO.StopAllScripts

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

C# のシグネチャ

void UO.StopAllScripts();

引数

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

戻り値

void - 戻り値はありません。この通話を true/1 と比較しないでください。別途GetScriptStateを読んで状態を確認してください。このような読み取りの結果は、0 (開始なし)、1 (実行中)、2 (一時停止) になります。

動作

  • 現在のセッションの実行でのみ機能します。実行せずに開いているタブはアクティブな起動ではありません。停止しても元のファイルは削除されず、サーバーへの接続も切断されません。
  • インデックスは動的です。別の実行が完了した後に位置が移動する可能性があります。複数の API 呼び出しはアトミックな操作ではありません。これらの例は、リストへの変更が並行して行われないように設計されています。アクションの前に目的の起動を再度探し、UO.Wait 経由でインデックスを保存しないでください。
  • 引数はありません。実行中および一時停止されたプロシージャ、保留中のクエリ、および再実行キューはキャンセルされます。呼び出しスクリプトもキャンセルされます。このコマンドの後に必要な保存/レポートを置かないでください。他のプロファイルやプロセスは影響を受けません。

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

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

簡単な例

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

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

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

1。無条件の一般停止 - 直接スクリプト

引数と実行の流れ:

  • コマンドに空の括弧が含まれています。呼び出す前に、必要な保存を実行してください。コントローラー自体も停止します。
  • インデックスは動的です。別の実行が完了した後に位置が移動する可能性があります。複数の API 呼び出しはアトミックな操作ではありません。これらの例は、リストへの変更が並行して行われないように設計されています。アクションの前に目的の起動を再度探し、UO.Wait 経由でインデックスを保存しないでください。
UO.StopAllScripts();

2。キャラクター死亡時に停止 - スクリプト機能

引数と実行の流れ:

  • Connected は世界への入り口をチェックし、Dead は死をチェックします。 StopAllScripts は、両方の条件が満たされた場合にのみ呼び出されます。この例ではそれらを 1 回チェックします。
  • インデックスは動的です。別の実行が完了した後に位置が移動する可能性があります。複数の API 呼び出しはアトミックな操作ではありません。これらの例は、リストへの変更が並行して行われないように設計されています。アクションの前に目的の起動を再度探し、UO.Wait 経由でインデックスを保存しないでください。
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Connected()))
    {
        if (Truth(UO.Dead()))
        {
            UO.StopAllScripts();
        }
    }

    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。 5 秒後に一般停止 - スクリプト クラス

引数と実行の流れ:

  • 5000 は、StopAllScripts パラメータではなく、UO.Wait のミリ秒です。コントローラーの手動または自動の一時停止により、実行が遅れる可能性があります。これは独立したタイマーではありません。
  • インデックスは動的です。別の実行が完了した後に位置が移動する可能性があります。複数の API 呼び出しはアトミックな操作ではありません。これらの例は、リストへの変更が並行して行われないように設計されています。アクションの前に目的の起動を再度探し、UO.Wait 経由でインデックスを保存しないでください。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var delayMs = 5000;
        UO.Wait(delayMs);
        UO.StopAllScripts();
        return null;
    }
}

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.StopAllScripts() — UO.StopAllScripts()

引数: 引数はありません。

結果: void / Unit.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

case "stopallscripts": bridge.StopAllScripts(); return InjectionValue.Unit;

UO.StopScript

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

C# のシグネチャ

void UO.StopScript(object? scriptIndex);

一時停止中のものも含め、1 つのアクティブな起動のキャンセルを要求します。この実行を後で続行するのではなく、完了する必要がある場合に使用します。

引数

  • scriptIndex - 必須 ScriptIndex - 現在の起動インデックス: 0 は最初のインデックスを意味し、次に 1、2... GetScriptsList を介して取得します。これはファイル名である serial ではなく、StartScript の結果でもありません。負のインデックスまたは欠落したインデックスは何も変わりません。

戻り値

void - 戻り値はありません。この通話を true/1 と比較しないでください。別途GetScriptStateを読んで状態を確認してください。このような読み取りの結果は、0 (開始なし)、1 (実行中)、2 (一時停止) になります。

動作

  • 現在のセッションの実行でのみ機能します。実行せずに開いているタブはアクティブな起動ではありません。停止しても元のファイルは削除されず、サーバーへの接続も切断されません。
  • インデックスは動的です。別の実行が完了した後に位置が移動する可能性があります。複数の API 呼び出しはアトミックな操作ではありません。これらの例は、リストへの変更が並行して行われないように設計されています。アクションの前に目的の起動を再度探し、UO.Wait 経由でインデックスを保存しないでください。
  • キャンセルは協調的です。一時停止を待ち、エンジンによってチェックされます。すでにサーバーに送信されたアクションはキャンセルされません。キャンセルされた起動はアクティブ リストからすぐに削除されますが、リソースの解放は引き続き続行される可能性があります。以前のインデックスに対して完了をチェックしないでください。そのインデックスの下にすでに別の実行が存在する可能性があります。

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

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

簡単な例

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

for (int index = 0; index < UO.GetScriptsCount(); index++)
    if (UO.GetScriptName(index) == "Worker")
    { UO.StopScript(index); break; }

1。 1 つのプロシージャを停止 - 直接スクリプト

引数と実行の流れ:

  • MineOre — 起動名。 -1はStopScriptに転送されません。停止後、保存されたインデックスは使用されなくなります。
  • インデックスは動的です。別の実行が完了した後に位置が移動する可能性があります。複数の API 呼び出しはアトミックな操作ではありません。これらの例は、リストへの変更が並行して行われないように設計されています。アクションの前に目的の起動を再度探し、UO.Wait 経由でインデックスを保存しないでください。
var index = FindNamedRun("MineOre");
if (Truth(index >= 0))
{
    UO.StopScript(index);
}

dynamic FindNamedRun(dynamic wanted)
{
    var indices = UO.GetScriptsList();
    foreach (var index in indices)
    {
        if (Truth(UO.GetScriptName(index) == wanted))
        {
            return index;
        }
    }
    return -1;
}

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

2。一時停止した起動を停止する - スクリプト関数

引数と実行の流れ:

  • コード 2 は一時停止された実行を選択します。 StopScript は一時停止を解除するのではなく終了します。他のタスクは続行します。
  • インデックスは動的です。別の実行が完了した後に位置が移動する可能性があります。複数の API 呼び出しはアトミックな操作ではありません。これらの例は、リストへの変更が並行して行われないように設計されています。アクションの前に目的の起動を再度探し、UO.Wait 経由でインデックスを保存しないでください。
return  RunScenario();
 object? RunScenario()
{
    var index = FindNamedRun("MineOre");
    if (Truth(index >= 0))
    {
        if (Truth(UO.GetScriptState(index) == 2))
        {
            UO.StopScript(index);
        }
    }

    return null;
}

dynamic FindNamedRun(dynamic wanted)
{
    var indices = UO.GetScriptsList();
    foreach (var index in indices)
    {
        if (Truth(UO.GetScriptName(index) == wanted))
        {
            return index;
        }
    }

    return -1;
}

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

3。特定のファイルからの実行を停止する - スクリプト クラス

引数と実行の流れ:

  • 絶対パスは、ファイルの最初のアクティブな実行を選択します。これは、ファイルを削除したり、そのファイルからのすべてのプロシージャを停止したりするものではありません。
  • インデックスは動的です。別の実行が完了した後に位置が移動する可能性があります。複数の API 呼び出しはアトミックな操作ではありません。これらの例は、リストへの変更が並行して行われないように設計されています。アクションの前に目的の起動を再度探し、UO.Wait 経由でインデックスを保存しないでください。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var wantedPath = "D:/Game/AutoLoad/Scripts/Worker.csx";
        var index = FindFileRun(wantedPath);
        if (Truth(index >= 0))
        {
            UO.StopScript(index);
        }

        return null;
    }

    dynamic FindFileRun(dynamic wantedPath)
    {
        var indices = UO.GetScriptsList();
        foreach (var index in indices)
        {
            if (Truth(Convert.ToString(ReplaceText(UO.GetScriptPath(index), Chr(92), "/")) == Convert.ToString(ReplaceText(wantedPath, Chr(92), "/"))))
            {
                return index;
            }
        }

        return -1;
    }

    string Chr(object? value) => ((char)Convert.ToInt32(value)).ToString();
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
    string ReplaceText(object? value, object? oldValue, object? newValue) => (Convert.ToString(value) ?? "").Replace(Convert.ToString(oldValue) ?? "", Convert.ToString(newValue) ?? "");
}

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.StopScript(scriptIndex) — UO.StopScript(Any)

引数: scriptIndex (Any)

結果: void / Unit.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

case "stopscript": bridge.StopScript(Arg(0)); return InjectionValue.Unit;

UO.SubExists

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

C# のシグネチャ

int UO.SubExists(object? subrutineName);

指定された名前の C# デリゲートが現在の実行に登録されているかどうかを確認します。これは、リフレクションを通じて任意のメソッドを自動的に検索することなく、特定のセッションのコールバック関数のレジストリです。明示的にロードされたファイル入力には、キーによってアクセスすることもできます。

引数

  • subrutineName は、RegisterRoutine によって指定された文字列名です。端の周りの空白は削除されます。登録名の検索では大文字と小文字は区別されません。

戻り値

int: 1 - 条件が満たされています。0 - 条件が満たされていません。複数のチェックで必要な場合は、1 つの呼び出しの結果を保存します。

動作

  • 登録とタスクは同じ実行に属します。別のキャラクター、プロファイル、またはその後の実行には独自のレジストリがあります。
  • RegisterRoutine は、Action、Func<Task>、またはExec への文字列引数の配列を持つデリゲートを受け入れます。登録を削除するとコードは実行されず、名前をそれ以上検索できなくなります。
  • メイン スクリプトは、そのヘルパーが必要な間、アクティブなままにしておく必要があります。完了後、タスクはキャンセルされ、登録とサブスクリプションが解放されます。
  • FunRunning はマネージャーインデックスではありません。 GetScriptsList と GetScriptState は独立したファイルの起動について説明します。ローカル コールバックは別のインデックスを受け取りません。
  • コールバック エラーは、次回のチェック時にメイン スクリプトに渡されます。 WaitAsync、UO.Wait、およびインストルメント化されたC# ループは、一時停止、キャンセル、およびイベント キューの処理をサポートします。

アップロードされたC#-ファイル

ローカルのデリゲートに加えて、現在のマネージャーは、Child.csx::Main のようなキーを持つ明示的に読み込まれた C# エントリをサポートしています。 SubExists と FunRunning はそのようなキーを受け入れます。 CallSub は Args なしでファイルを実行し、Exec("exec Child.csx::Main 'north Gate' 42") は Args を渡します。スペースを含むキーは、Exec 内で引用符で囲まれます。一意の短い名前は許容されますが、あいまいな名前ではランダムなファイルが選択されません。ローカル登録が優先されます。ファイルの起動は、現在のワールド/マネージャー内で独自のコンテキストと有効期間を取得します。ローカル デリゲートは、それらを登録した実行に属します。

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

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

簡単な例

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

RegisterRoutine("Hello", () => UO.Print("Hello"));
UO.Print("Registered flag: " + UO.SubExists("Hello"));

1。利用可能なオプションのプロシージャを実行 - 直接スクリプト

引数と実行の流れ:

  • コマンドは int を返します: C# では結果 != 0 または結果 == 1; true との直接比較は認められません。 WeightWatch の定義は以下に示されており、コマンドが呼び出される前に RegisterRoutine を介して登録されます。
  • 例を別のファイルとして保存し、IDE/manager にロードして Main を実行すると、残りのプロシージャがこのディレクトリに保存されます。 WeightWatch/ManaWatch - ここで完全に定義されたトレーニング手順: UO.Wait(1000) の間隔で 3 回のウェイト/マナ測定、つまり 1000 ミリ秒、ワールドに入るときにのみ出力されます。これは継続的な監視ではありません。一時停止すると時間が長くなる可能性があります。 2 つのタスクを含む例では、プロシージャの同時起動を許可する必要があります。
var registrationWeightWatch = RegisterRoutine("WeightWatch", WeightWatch);
if (Truth(Truth(UO.SubExists("WeightWatch")) == true))
{
    UO.CallSub("WeightWatch");
}

while (UO.FunRunning("WeightWatch") != 0) await WaitAsync(25);

void WeightWatch()
{
    dynamic sample = 0;
    for (sample = (int)(1); sample <= 3; sample += (int)(1))
    {
        if (Truth(UO.Connected()))
        {
            UO.Print("Weight: " + Convert.ToString(UO.Weight()));
        }
        UO.Wait(1000);
    }
}

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

2。フォールバック ハンドラーの選択 - スクリプト関数

引数と実行の流れ:

  • WeightWatchは別のファイルからロードできます。存在しない場合は、ここで宣言された ManaWatch が選択されます。プライマリが見つかっても開始できない場合、セカンダリへの自動移行は行われません。
  • 例を別のファイルとして保存し、IDE/manager にロードして Main を実行すると、残りのプロシージャがこのディレクトリに保存されます。 WeightWatch/ManaWatch - ここで完全に定義されたトレーニング手順: UO.Wait(1000) の間隔で 3 回のウェイト/マナ測定、つまり 1000 ミリ秒、ワールドに入るときにのみ出力されます。これは継続的な監視ではありません。一時停止すると時間が長くなる可能性があります。 2 つのタスクを含む例では、プロシージャの同時起動を許可する必要があります。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var registrationManaWatch = RegisterRoutine("ManaWatch", ManaWatch);
    if (Truth(UO.SubExists("WeightWatch") == 1))
    {
        UO.CallSub("WeightWatch");
    }
    else if (Truth(UO.SubExists("ManaWatch")))
    {
        UO.CallSub("ManaWatch");
    }

    while (UO.FunRunning("ManaWatch") != 0)
        await WaitAsync(25);
    return null;
}

void ManaWatch()
{
    dynamic sample = 0;
    for (sample = (int)(1); sample <= 3; sample += (int)(1))
    {
        if (Truth(UO.Connected()))
        {
            UO.Print("Mana: " + Convert.ToString(UO.Mana()));
        }

        UO.Wait(1000);
    }
}

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

3。実行前に両方の定義を確認してください - スクリプト クラス

引数と実行の流れ:

  • HaveMonitors は && を使用して 2 つの名前をテストします。少なくとも 1 つが欠落している場合、Main はタスクを呼び出しません。一連の定義がテストされますが、同時実行の成功を保証するものではありません。
  • 例を別のファイルとして保存し、IDE/manager にロードして Main を実行すると、残りのプロシージャがこのディレクトリに保存されます。 WeightWatch/ManaWatch - ここで完全に定義されたトレーニング手順: UO.Wait(1000) の間隔で 3 回のウェイト/マナ測定、つまり 1000 ミリ秒、ワールドに入るときにのみ出力されます。これは継続的な監視ではありません。一時停止すると時間が長くなる可能性があります。 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 registrationWeightWatch = RegisterRoutine("WeightWatch", WeightWatch);
        var registrationManaWatch = RegisterRoutine("ManaWatch", ManaWatch);
        if (Truth(HaveMonitors()))
        {
            UO.CallSub("WeightWatch");
            UO.CallSub("ManaWatch");
        }

        while (UO.FunRunning("WeightWatch") != 0 || UO.FunRunning("ManaWatch") != 0)
            await WaitAsync(25);
        return null;
    }

    dynamic HaveMonitors()
    {
        return UO.SubExists("WeightWatch") != 0 && UO.SubExists("ManaWatch") != 0;
    }

    void WeightWatch()
    {
        dynamic sample = 0;
        for (sample = (int)(1); sample <= 3; sample += (int)(1))
        {
            if (Truth(UO.Connected()))
            {
                UO.Print("Weight: " + Convert.ToString(UO.Weight()));
            }

            UO.Wait(1000);
        }
    }

    void ManaWatch()
    {
        dynamic sample = 0;
        for (sample = (int)(1); sample <= 3; sample += (int)(1))
        {
            if (Truth(UO.Connected()))
            {
                UO.Print("Mana: " + Convert.ToString(UO.Mana()));
            }

            UO.Wait(1000);
        }
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
    private IDisposable RegisterRoutine(string name, Action handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterRoutine(name, handler);
    private IDisposable RegisterRoutine(string name, Func<Task> handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterRoutine(name, handler);
    private IDisposable RegisterRoutine(string name, Action<string[]> handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterRoutine(name, handler);
    private IDisposable RegisterRoutine(string name, Func<string[], Task> handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterRoutine(name, handler);
}

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.SubExists(subrutineName) — UO.SubExists(String)

引数: subrutineName (String)

結果: int / Integer.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

case "SubExists":
                string requested = Convert.ToString(arguments[0]) ?? "";
                result = Exists(requested) || events is ICSharpScriptHost known && known.HasCSharpScript(requested) ? 1 : 0;
                return true;

内部実装のコードです。単独のスクリプトとして実行できません。

public int SubExists(string subrutineName) => bridge.SubExists(subrutineName) ? 1 : 0;

UO.Terminate

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

C# のシグネチャ

void UO.Terminate();
void UO.Terminate(object? subrutineName);

引数

  • subrutineName — 省略可能な文字列です。引数なし、または空文字列の場合は最後に開始されたファイルを選択します。"all" はすべての実行の取り消しを要求します。C# ファイルには harvest.csx::Main のようなカタログ内の正確なキーを使用します。Harvest のようなローカル callback 名は、RegisterRoutine で明示的に登録した後でのみ有効です。ファイルの入口は 1 つの Main です。クラスの各メソッドが自動的に個別起動できるプロシージャになるわけではありません。

戻り値

void: コマンドは数値を返さず、ワーカー スレッドが終了するのを待ちません。彼女はすぐにキャンセルを要求します。実行は次のキャンセルチェックで停止します。一時停止、ブレークポイント、および組み込みの待機は中断されます。キャンセル前にすでにディスパッチされたサーバー アクションはロールバックされません。

動作

UO.FunRunning(name) == 0 は、取り消しを要求した直後にも返されます。前の callback の finally ブロックが終了したことを意味しません。前のワーカーが実際に終了するまで、同じローカル名の別の CallSub または Exec はスキップされます。

  • UO.Terminate() は、名前、編集行、最終アクション時刻、表示順序ではなく、実行順序によってプロシージャを選択します。一時停止されたプロシージャも実行中とみなされます。
  • この実行に属するローカル ターゲットはクリアされ、残りの自動ルートはキャンセルされます。モーション キャンセルはゲーム スレッドで実行されます。ルートがすでに別の実行またはユーザーによって置き換えられている場合、前の所有者はルートを停止しません。サーバーに送信されたステップはリコールされません。
  • このコマンドは、1 つの同時起動の設定が有効になっている場合でも使用できます。キャンセルされたプロシージャは、そのワーカー スレッドがクリアされた後にのみスペースを解放します。これより前は、新しい起動はスキップされます。
  • 名前で停止すると、対応する保留中の開始もキャンセルされます。完了した手順は変更されません。クライアントは、ステータスに適切な起動がないことを報告します。キャンセルをサポートしていないサードパーティのネイティブ プラグインへのスタック呼び出しは、スレッドを強制的に強制終了しても安全に中断できません。

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

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

C# ファイルには harvest.csx::Main のようなカタログ内の正確なキーを使用します。Harvest のようなローカル callback 名は、RegisterRoutine で明示的に登録した後でのみ有効です。ファイルの入口は 1 つの Main です。クラスの各メソッドが自動的に個別起動できるプロシージャになるわけではありません。

簡単な例

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

UO.Terminate("harvest.csx::Main");
UO.Print("Cancellation requested for harvest.csx::Main");

1。名前による収集を停止し、他のプロシージャを残す - 直接スクリプト

実行中の harvest.csx::Main の取り消しを要求します。メッセージは finally の終了を確認するものではなく、実行済みのゲーム動作を元に戻すものでもありません。

var procedureName = "harvest.csx::Main";
UO.Terminate(procedureName);
UO.Print("Cancellation requested for harvest.csx::Main");

2。特定のファイルからメインのみを選択 - スクリプト関数

正確なキー harvest.csx::Main は heal.csx::Main とは異なります。読み込み済みファイルのキーに置き換えてください。#2 などの任意の接尾辞で別の入口は作成されません。

return  RunScenario();
 object? RunScenario()
{
    var procedureKey = "harvest.csx::Main";
    UO.Terminate(procedureKey);
    UO.Print("Cancellation requested: " + procedureKey);
    return null;
}

3。 Exec 経由の互換性のあるコンソール フォーム - スクリプト クラス

文字列 terminate harvest.csx::Main は UO.Exec を通じて同じキーを渡します。空白を含むキーはコマンド文字列内で引用符で囲む必要があります。

return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var command = "terminate harvest.csx::Main";
        UO.Exec(command);
        UO.Print("Stop command sent");
        return null;
    }
}

4。ヘルスが低い場合は最後の実行を停止 - 直接スクリプト

引数と実行の流れ:

  • 引数のないフォームでは、一時停止されたスクリプトも含め、最後に実行中のスクリプトが選択されます。これは例としての政策であり、健康不良に対する強制的な対応ではありません。キャンセル要求の前にメッセージが表示されます。
if (UO.GetHP() <= 30)
{
    UO.Print("Low health: requesting cancellation of the most recent run");
    UO.Terminate();
}

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.Terminate() — UO.Terminate()

引数: 引数はありません。

結果: void / Unit.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

public void Terminate() => bridge.Terminate(string.Empty);

UO.Terminate(subrutineName) — UO.Terminate(String)

引数: subrutineName (String)

結果: void / Unit.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

case "Terminate" when arguments.Length == 1:
                string routine = Convert.ToString(arguments[0]) ?? "";
                if (Exists(routine)) { Cancel(routine); return true; }
                if (Cancel(routine)) return true;
                return false;

内部実装のコードです。単独のスクリプトとして実行できません。

public void Terminate(string subrutineName) => bridge.Terminate(subrutineName);

UO.TerminateAll

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

C# のシグネチャ

void UO.TerminateAll();

引数

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

戻り値

void: 結果がありません。このコマンドは、現在のすべての実行のキャンセルを要求し、それ自体がキャンセルされていない場合は呼び出し元のコードに制御を返します。ワーカー スレッドは、キャンセル チェックがトリガーされた後にクリーンアップされます。

動作

  • 正確な構文は UO.TerminateAll() で、名前の中にスペースや引数は含まれません。 UO.Terminate("all") は互換性のある代替表記としてサポートされています。
  • 実行中のプロシージャ、手動で一時停止してブレークポイントを設定したプロシージャ、組み込みの待機、および登録された遅延実行を停止します。仕事がないときに折り返し電話するのが安全です。
  • ローカルの観光スポットと自動ルートを削除することは、その所有者を考慮に入れます。停止したスクリプトの残りのルートはゲーム スレッド上でキャンセルされます。それを置き換えたユーザーの新しいルートが保存されます。すでに送信されたモーション パッケージはキャンセルされません。
  • キャンセルしても、すでにサーバーに送信されたアクションはロールバックされません。キャンセルをサポートしていないサードパーティのネイティブ プラグイン コードは、ストリームとともに安全に破棄できません。コマンド実行後の新しい明示的な開始は許可されます。チェックボックスが有効になっている場合、クリーンアップが完了するまで試行はキューに入れられるのではなくスキップされるという意味で、スペースが空くまで待機します。

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

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

簡単な例

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

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

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

1。動作中のスクリプト内のすべてのスクリプトのチェックを停止します - 直接スクリプト

引数と実行の流れ:

  • TerminateAll にはパラメータがありません。条件 UO.Dead() は、次の反復の前にキャラクターの死亡をチェックします。
  • 条件が満たされると、現在のメイン実行と残りの実行 C# の両方がキャンセルされます。 Print メッセージは停止の前に配置されます。これは、このプロシージャのコードが停止の後に停止するためです。
  • この例では、WaitAsync(250) ​​はチェック間の一時停止 250 ミリ秒を指定します。 stop コマンドは、通常のスクリプトの一時停止の長さを変更しません。
for (int cycle = (int)(1); cycle <= 10; cycle += (int)(1))
{
    if (Truth(UO.Dead()))
    {
        UO.Print("Character is dead: stopping all C# scripts");
        UO.TerminateAll();
    }
    await Delay(250);
}

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;

2。すべてのスクリプト機能と互換性のあるフォーム

引数と実行の流れ:

  • この代替表記では、UO.Terminate を 1 つのパラメーター subrutineName="all" とともに使用します。これは UO.TerminateAll() に相当します。
  • 文字列 all は特別な値であり、宣言する必要があるプロシージャの名前ではありません。 EmergencyStopもキャンセルされます。
  • 緊急ゲーム キーの場合は、最初の例の 1 行コマンドを使用します。別のプロシージャ EmergencyStop 自体は、並列実行の禁止の対象となります。
return  RunScenario();
 object? RunScenario()
{
    UO.Print("Stopping all C# scripts");
    UO.Terminate("all");
    return null;
}

3。必要なオブジェクトが使用できなくなった場合は、一般的な操作を停止します - スクリプト クラス

引数と実行の流れ:

  • GetSerial は、serial に必要なオブジェクト、ここでは独自のバックパックを格納します。 Exists=0 は、このオブジェクトが現在クライアントにとって不明であることを意味します。
  • TerminateAll は、選択した条件に違反した場合にのみ、引数なしで呼び出されます。このポリシーは、特定のバックパックでの作業だけでなく、すべての手順を停止します。
  • まず、停止理由が表示されます。キャンセル要求が行われると、現在の手順も終了します。次の行動は期待できません。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var bag = UO.GetSerial("backpack");
        if (Truth(UO.Exists(bag) == 0))
        {
            UO.Print("Required backpack is unavailable: stopping all scripts");
            UO.TerminateAll();
        }

        return null;
    }

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

4。接続が失われた後にすべての作業を停止 - 直接スクリプト

引数と実行の流れ:

  • 接続がない場合はすべての起動が停止します。このコマンドはキャンセルされたスクリプトの数を返さず、現在の実行もキャンセルします。
if (UO.Connected() == 0)
{
    UO.Print("Disconnected: requesting cancellation of every active script");
    UO.TerminateAll();
}

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.TerminateAll() — UO.TerminateAll()

引数: 引数はありません。

結果: void / Unit.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

public void TerminateAll() => bridge.Terminate("all");

UO.Time

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

C# のシグネチャ

int UO.Time();

数値 HHMMSS を使用してコンピューターのローカル時刻を読み取ります。持続時間を測定するためではなく、許容動作時間を選択するのに便利です。

引数

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

戻り値

int HHMMSS、0..235959 は有効な分と秒を含みます。 07:29:35 -> 72935;真夜中 -> 0。ゼロは有効な時間であり、エラーや論理フラグ false ではありません。

動作

  • パラメータや引数を含むフォームはありません。空の括弧は時間を読み取るだけです。呼び出しは待機したり、タイマーを開始したり、ゲームにパケットを送信したりしません。
  • RealTimeSource.Now は DateTime.Now と読み取られます。UTC、シャード時間、ゲーム クロックではなく、コンピューターのローカル日付/時間です。タイムゾーン、夏時間、手動による時計の変更は結果に影響します。通話ごとに異なる瞬間が捉えられます。
  • 先頭のゼロやミリ秒は保持されません。数値的には、1 秒が経過していますが、13:00:00 から 12:59:59 を引くと、4041 が得られます。真夜中になると値は再びゼロになります。
  • 遅延を計算するためにカレンダー コードを減算しないでください。 Timer() と 1 回の実行の 2 つのマークを使用します。カレンダーの時計が戻る可能性があります。

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

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

簡単な例

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

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

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

1。個々の時間フィールドを表示 - 直接スクリプト

引数と実行の流れ:

  • スタンプは異なる秒が混在しないように一度読み取られます。 Int(スタンプ/10000) — 時間; Int(スタンプ/100) MOD 100 — 分; MOD 100 – 秒。単純な文字列ではフィールドにゼロが埋め込まれません。
var stamp = UO.Time();
var hour = stamp / 10000;
var minute = stamp / 100 % 100;
var second = stamp % 100;
UO.Print(Convert.ToString(hour) + ":" + Convert.ToString(minute) + ":" + Convert.ToString(second));

2。夕方枠のみシリーズを許可 - スクリプト機能

引数と実行の流れ:

  • 180000 - 18:00:00 を含む。 220000 - 22:00:00 は含まれません。 1 つのチェックでメインを続行するかどうかが決まります。スケジュールが登録されておらず、シリーズが自動的に開始されません。
return  RunScenario();
 object? RunScenario()
{
    var stamp = UO.Time();
    if (Truth(stamp >= 180000) && Truth(stamp < 220000))
    {
        UO.Print("Evening batch permitted by local schedule");
    }
    else
    {
        UO.Print("Outside the local schedule");
        return null;
    }

    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。午前 0 時以降の間隔を考慮する - シナリオ クラス

引数と実行の流れ:

  • ClockInWindow(スタンプ、最初、最後) は有効な HHMMSS を受け入れます。 230000..20000 は、23:00 を含み、02:00 を含まないことを意味します。 OR は午前 0 時を考慮します。境界が等しいということは、空の間隔を意味します。静かな期間中、メインは終了します。関数はそのまま与えられます。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(ClockInWindow(UO.Time(), 230000, 20000)))
        {
            UO.Print("Local quiet period; do not start a new batch");
            return null;
        }

        UO.Print("Outside the local quiet period");
        return null;
    }

    dynamic ClockInWindow(dynamic stamp, dynamic first, dynamic last)
    {
        if (Truth(first == last))
        {
            return false;
        }

        if (Truth(first < last))
        {
            return Truth(stamp >= first) && Truth(stamp < last);
        }

        return Truth(stamp >= first) || Truth(stamp < last);
    }

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

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.Time() — UO.Time()

引数: 引数はありません。

結果: int / Integer.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

public int Time()

        {

            var now = timeSource.Now;

            return now.Hour * 10000 + now.Minute * 100 + now.Second;

        }

UO.Timer

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

C# のシグネチャ

int UO.Timer();

現在のランタイムの実行時間を 10 分の 1 秒単位で読み取ります。独自の遅延やアクションマークに適しています。

引数

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

戻り値

int 0..2147483647;単位は100ミリ秒です。 399 ms で 3 が返されます。これは時計の読み取り値であり、true/false や充電残量ではありません。

動作

  • パラメータや引数を含むフォームはありません。空の括弧は時間を読み取るだけです。呼び出しは待機したり、タイマーを開始したり、ゲームにパケットを送信したりしません。
  • オリジンはこのランタイム インスタンスに属します。新しい実行中のプロシージャは新しいクロックを受け取る場合があります。異なる実行の値を比較したり、絶対日付として保存したりすることはできません。 UO.Wait とスクリプトの一時停止中、リアルタイムは進み続けます。
  • 10 の位の小数部は切り捨てられます。約 2485.5 日後、数値は 2147483647 に達し、オーバーフローすることなくそこに留まります。
  • これはあなたの遅延であり、スキル/呪文のサーバーのクールダウンや成功の確認ではありません。このコマンドでは、移動、呪文、またはスクリプトに関するサーバー制限を回避することはできません。

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

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

簡単な例

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

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

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

1。操作の所要時間を測定する - 直接スクリプト

引数と実行の流れ:

  • WaitAsync(250) は 250 ミリ秒をリクエストします。実際の遅延はさらに長くなる可能性があります。 2 つのマークの差を10.0 で割って秒を求めます。指示ステップ UO.Timer ~ 100 ms。
var started = UO.Timer();
await Delay(250);
var elapsed = UO.Timer() - started;
var seconds = elapsed / 10.0;
UO.Print("Elapsed seconds: " + Convert.ToString(seconds));

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

2。すでに要求された十字線の待機を 3 秒に制限する - スクリプト関数

引数と実行の流れ:

  • 限界30は、この関数の単位で与えられます。 UO.Wait(50) はチェック間の実行を解放します。 UO.Targeting は光景の存在を読み取ります。たとえば、キャストもターゲットも行いません。視界が現れない場合、サイクルは終了します。
  • カウンタがリミット int で停止している場合でも、上限を追加チェックすると待機が終了します。スコープのステータスは繰り返し読み取られるため、読み取りごとに変化する場合があります。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var started = UO.Timer();
    while (Truth(UO.Timer() - started < 30) && !(Truth(UO.Targeting())))
    {
        if (Truth(UO.Timer() >= 2147483647))
        {
            break;
        }

        await Delay(50);
    }

    if (Truth(UO.Targeting()))
    {
        UO.Print("Target cursor available");
    }
    else
    {
        UO.Print("Target wait ended");
    }

    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。カスタムリトライ間隔関数 - スクリプトクラス

引数と実行の流れ:

  • IntervalPassed(started,current,interval) は Main で完全に定義されています。 Interval=5 — このクロックの単位で 0.5 秒。負の間隔、反転、および上限の int は false を与えます。間隔を正確に達成すると、true が得られます。
  • これはあなたの遅延であり、スキル/呪文のサーバーのクールダウンや成功の確認ではありません。このコマンドでは、移動、呪文、またはスクリプトに関するサーバー制限を回避することはできません。
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 started = UO.Timer();
        await Delay(500);
        var ready = IntervalPassed(started, UO.Timer(), 5);
        if (Truth(ready))
        {
            UO.Print("Local retry interval passed");
        }

        return null;
    }

    dynamic IntervalPassed(dynamic started, dynamic current, dynamic interval)
    {
        if (Truth(interval < 0) || Truth(current < started))
        {
            return false;
        }

        if (Truth(current >= 2147483647))
        {
            return false;
        }

        return current - started >= interval;
    }

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

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.Timer() — UO.Timer()

引数: 引数はありません。

結果: int / Integer.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

public int Timer() => (int)Math.Max(0d, Math.Min(int.MaxValue, timeSource.SinceStart.TotalMilliseconds / 100d));

UO.Wait

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

C# のシグネチャ

void UO.Wait(object? waitTimeMS);

現在のスクリプトを指定されたミリ秒間一時停止します。ステータスチェックを繰り返す間に、スクリプトが連続ループで実行されるのを防ぐのに役立ちます。

引数

  • waitTimeMS — ミリ秒単位の整数時間: 1000 = 1 秒。 0..2147483647 を使用します。これはステップ数、秒数、サーバー確認タイムアウトではありません。

戻り値

void - 結果はありません。別回線でお電話ください。遅延の終了は、オブジェクトが移動したこと、呪文が完了したこと、または接続が確立されたことを意味するものではありません。目的の状態を個別に確認してください。

動作

  • 0 は実際の遅延を生じさせず、高速ループ内の一時停止としては適していません。負の時間は無限大を意味するわけではありません。UO.Wait はそれを 0 に短縮します。 UO.Wait/sleep はアクティブなコールバックを使用してそれを拒否できますが、それらのないクライアント ブリッジでは待機しません。移植可能なスクリプトの場合は、負でない時刻のみを使用してください。

例 .csx

UO.Wait(100);
// For an asynchronous script, use the host helper:
await WaitAsync(100);

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

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

簡単な例

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

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

UO.Print("Calling UO.Wait");
UO.Wait(250);

1。 UO.Wait - 1 - 直接スクリプト

引数と実行の流れ:

  • 250 - 4分の1秒。待機後に次の行が実行されます。遅延完了メッセージは例のテキストであり、返される結果ではありません。
UO.Wait(250);
UO.Print("Delay complete");

2。 UO.Wait — 2 — スクリプト関数

引数と実行の流れ:

  • WaitForOnline はこのスクリプトで完全に宣言されています。引数 20 は、250 ミリ秒の最大 20 回の一時停止を意味します。接続は一時停止の前と最後の一時停止の後に再度チェックされます。ヘルパーは状態 Connected (1/0) を返します。 wait コマンド自体は何も返さず、サーバーに接続しません。
return  RunScenario();
 object? RunScenario()
{
    return WaitForOnline(20);
    return null;
}

dynamic WaitForOnline(dynamic checks)
{
    while (Truth(checks > 0))
    {
        if (Truth(UO.Connected()))
        {
            return 1;
        }

        UO.Wait(250);
        checks = checks - 1;
    }

    return UO.Connected();
}

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 - 3 - シナリオクラス

引数と実行の流れ:

  • ループは正確に 3 つの重量の読み取りを行います。読み取りの間には 2 回の 500 ミリ秒の一時停止があり、最後の読み取りの後は一時停止はありません。メッセージは、最初に読み取られたときと重量が変化したときに出力されます。前の変数は、ゲームの重みを調整するのではなく、比較する値を保存します。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var previous = -1;
        var checks = 0;
        while (Truth(checks < 3))
        {
            var weight = UO.Weight();
            if (Truth(weight != previous))
            {
                UO.Print("Weight: " + Convert.ToString(weight));
                previous = weight;
            }

            checks = checks + 1;
            if (Truth(checks < 3))
            {
                UO.Wait(500);
            }
        }

        return null;
    }

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

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.Wait(waitTimeMS) — UO.Wait(Any)

引数: waitTimeMS (Any)

結果: void / Unit.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

public async Task WaitAsync(int milliseconds)
    {
        ArgumentOutOfRangeException.ThrowIfNegative(milliseconds);
        Checkpoint();
        // Short slices allow Pause to suspend further script progress promptly.
        int remaining = milliseconds;
        while (remaining > 0)
        {
            int slice = Math.Min(remaining, 25);
            await Task.Delay(slice, Cancellation).ConfigureAwait(false);
            Checkpoint(); remaining -= slice;
        }
    }

内部実装のコードです。単独のスクリプトとして実行できません。

case "wait": WaitWithEvents(Arg(0)); return InjectionValue.Unit;

UO.Waiting

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

C# のシグネチャ

int UO.Waiting();

準備された応答がターゲット キューに残っているかどうかを確認します。

引数

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

戻り値

int 1 - オブジェクト、タイルのキャンセルされていない遅延ターゲット、または次の光景のキャンセルがあります。 0 - キューは空です。開いたカーソルがありません。カーソルには TargetPresent/Targeting を使用します。

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

動作

  • クライアントのキュー全体が読み取られます。複数のプロシージャが同時に実行されている場合、それぞれの応答が考慮されます。
  • ゼロのみは保留中の応答がないことを意味します。サーバー上でスキルや呪文が正常に使用されたことを確認するものではありません。

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

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

簡単な例

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

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

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

1。チェックの準備 - 直接スクリプト

引数と実行の流れ:

  • WaitTargetSelf の後、サーバーターゲット 1 の前が予想されます。
  • CancelWaitTarget はキューをクリアします。次のテストでは 0 が得られます。
UO.WaitTargetSelf();
UO.Print(Convert.ToString(UO.Waiting()));
UO.CancelWaitTarget();

2。応答が消費されるまで境界を定めて待機する - スクリプト関数

引数と実行の流れ:

  • このチェックにはパラメータがありません。 UO.Wait=50 ミリ秒、最大20 の期待値。
  • 答えが残っている場合はキャンセルされます。サーバーアクションの結果のチェックを個別に追加します。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var attempts = 0;
    while (Truth(UO.Waiting()) && Truth(attempts < 20))
    {
        await Delay(50);
        attempts = attempts + 1;
    }

    if (Truth(UO.Waiting()))
    {
        UO.CancelWaitTarget();
    }

    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 行目はサイトの状態を示します。
  • カーソルのないキューとキューのないカーソルが可能です。これらの値は交換可能ではありません。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.Print("Queued: " + Convert.ToString(UO.Waiting()));
        UO.Print("Cursor: " + Convert.ToString(UO.TargetPresent()));
        return null;
    }
}

コマンドの実装

C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

UO.Waiting() — UO.Waiting()

引数: 引数はありません。

結果: int / Integer.

呼び出し時:

内部実装のコードです。単独のスクリプトとして実行できません。

public int Waiting() => bridge.GetWaitTargetQueue().Length > 0 ? 1 : 0;

Clone this wiki locally