Skip to content

JA UO Topic files json data

Codex edited this page Oct 12, 2026 · 4 revisions

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

ファイル / JSON / データ

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

ファイル、JSON、配列とコレクション C#、および互換性のあるヘルパー UO。組み込み関数 C# は UO なしで記述されます。

セクション

トピック コマンドと説明
ファイル C# と標準ライブラリ
JSON 解析 C# と標準ライブラリ
JSON ロード C# と標準ライブラリ))
JSON 保存 C# と標準ライブラリ
JSON 文字列化 C# と標準ライブラリ
リスト C# と標準ライブラリ
辞書 C# と標準ライブラリ
配列 C# と標準ライブラリ · C# と標準ライブラリ ​​
MemoryStream C# と標準ライブラリ

すべてのテーマコマンド

互換性コレクション

UO.GetArrayLength · UO.GetWord · UO.GetWordCount

Random 値

UO.Random

C#と標準ライブラリ · C#と標準ライブラリ ​​· C#と標準ライブラリ

このトピックに関する例

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

UO.GetArrayLength

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

dynamic[] amounts = new dynamic[checked((int)(2) + 1)];
amounts[0] = 50;
amounts[1] = 75;
amounts[2] = 25;
var total = 0;
for (int index = (int)(0); index <= UO.GetArrayLength(amounts) - 1; index += (int)(1))
{
    total += amounts[index];
}
return total;

UO.GetWord

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

return ReadX("move   1445 1690");

dynamic ReadX(dynamic text)
{
    if (Truth(UO.GetWordCount(text) != 3))
    {
        return -1;
    }
    if (Truth(UO.GetWord(text, 0) != "move"))
    {
        return -1;
    }
    var xText = UO.GetWord(text, 1);
    if (!(Truth(IsNumeric(xText))))
    {
        return -1;
    }
    var x = Convert.ToDouble(xText);
    if (Truth(Convert.ToString(x) == "NaN") || Truth(x < 0) || Truth(x > 65535))
    {
        return -1;
    }
    if (Truth(x != Math.Truncate(x)))
    {
        return -1;
    }
    return Convert.ToInt32(x);
}

bool IsNumeric(object? value) => double.TryParse(Convert.ToString(value), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out _);
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

コマンドの完全なリファレンス


UO.GetArrayLength

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

C# のシグネチャ

dynamic UO.GetArrayLength(object? arg);

限られた反復と安全なインデックス読み取りのために、直接の配列セルをカウントします。

引数

戻り値

int >= 0。空の配列と別の種類の値は 0 を返します。結果だけでは型をチェックできません。これは数量であり、bool や最後の指数ではありません。

動作

  • ローカル チェック: サーバーにリクエストを送信せず、項目を移動したり、配列を変更したりしません。例には、ライブ インベントリではなくトレーニング データが含まれています。
  • 値のタイプをチェックし、走査または合計を行わずに Array.Length を読み取ります。変数値(2)を宣言すると、空のセルを含む 3 つのセル (インデックス 0..2) が作成されます。
  • ネストされた要素は再帰的にカウントされません。文字列の場合は Len があり、リスト/辞書の場合は Count があります。 UO.GetArrayLength は、同じローカル チェックの互換性のある名前です。

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

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

簡単な例

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

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

object? result = UO.GetArrayLength(new[] { 10, 20, 30 });
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1。限定されたリストから数量を追加 - 直接スクリプト

引数と実行の流れ:

  • 変数 amount(2) ​​を宣言すると、3 つのエントリが作成されます。ループはインデックス 0..2 を反復し、150 を返します。量は、ArrayLength ではなく、サイクルによって追加されます。
  • ローカル チェック: サーバーにリクエストを送信せず、項目を移動したり、配列を変更したりしません。例には、ライブ インベントリではなくトレーニング データが含まれています。
dynamic[] amounts = new dynamic[checked((int)(2) + 1)];
amounts[0] = 50;
amounts[1] = 75;
amounts[2] = 25;
var total = 0;
for (int index = (int)(0); index <= UO.GetArrayLength(amounts) - 1; index += (int)(1))
{
    total += amounts[index];
}
return total;

2。ポイントと座標フィールドを個別にカウントする - スクリプト関数

引数と実行の流れ:

  • ルートには 2 つの配列ポイントがあり、それぞれに 3 つの座標セルがあります。結果は 6 ではなく、2|3 になります。キャラクターは動きません。
  • ローカル チェック: サーバーにリクエストを送信せず、項目を移動したり、配列を変更したりしません。例には、ライブ インベントリではなくトレーニング データが含まれています。
return  RunScenario();
 object? RunScenario()
{
    dynamic[] first = new dynamic[checked((int)(2) + 1)];
    first[0] = 100;
    first[1] = 200;
    first[2] = 0;
    dynamic[] second = new dynamic[checked((int)(2) + 1)];
    second[0] = 101;
    second[1] = 200;
    second[2] = 0;
    dynamic[] route = new dynamic[checked((int)(1) + 1)];
    route[0] = first;
    route[1] = second;
    return Convert.ToString(UO.GetArrayLength(route)) + "|" + Convert.ToString(UO.GetArrayLength(route[0]));
    return null;
}

3。最初のインデックスの確認 - スクリプト クラス

引数と実行の流れ:

  • この行は 0 を与えます。 Main はインデックスにアクセスする前にルートを返しません。このチェックは空の配列にも適していますが、これらのケースは区別されません。
  • ローカル チェック: サーバーにリクエストを送信せず、項目を移動したり、配列を変更したりしません。例には、ライブ インベントリではなくトレーニング データが含まれています。
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 route = "not an array";
        if (Truth(UO.GetArrayLength(route) == 0))
        {
            return "no route";
        }

        return route[0];
        return null;
    }

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

コマンドの実装

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

UO.GetArrayLength(arg) — UO.GetArrayLength(Any)

引数: arg (Any)

結果: dynamic / Any.

呼び出し時:

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

public static InjectionValue GetArrayLength(InjectionValue arg) => arg.Kind==InjectionValueKind.Array?new InjectionValue(arg.Array.Length):InjectionValue.Zero;

UO.GetWord

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

C# のシグネチャ

string UO.GetWord(object? value, object? wordIndex);
string UO.GetWord(object? value, object? wordIndex, object? delimiter);

テキストから単一の単語またはフィールドを取得します。座標、優先順位のリスト、または保存されたスクリプト設定を解析するのに役立ちます。

引数

  • value — ソース文字列。この関数は、送信されたテキストを正確に解析します。雑誌、ファイル、機器、またはワールドを独自に読み取ることはありません。
  • wordIndex — 0 の単語のインデックス全体: 0 が最初、1 が 2 番目です。負のインデックスと単語数以上のインデックスは空の文字列を返します。
  • delimiter — オプションの区切り文字。これを使用しない場合、"" または単一のスペース " " を使用すると、テキストはタブや改行を含む Unicode 空白文字によって分割されます。もう 1 つの区切り文字は、シーケンス全体を正確に表します。「::」は、すべてのコロンではなく、連続する 2 つのコロンを意味します。空の部分は破棄されます。空でない部分はトリミングされません。

戻り値

string — 選択された空でない部分、またはインデックスがない場合は ""。これはテキストであり、ID、type、または数値ではありません。数値の場合は、IsNumeric を個別に確認し、値を変換します。

動作

  • パッケージやゲームアクションなしでローカルで動作します。 GetWord と UO.GetWord は同じハンドラーを呼び出します。 GetWordCount、UO.GetWordCountも同様です。呼び出しごとにテキスト全体が再分割されます。ループ内で、事前に数量を保存します。大規模な繰り返し解析の場合は、すでに解析されたフィールドを配列に格納することをお勧めします。これは CSV パーサーではありません。引用符は区切り文字を保護せず、空の列は失われます。
  • GetWord · GetWordCount · IsNumeric

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

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

簡単な例

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

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

var result = UO.GetWord("red green blue", 1);
UO.Print("GetWord: " + Convert.ToString(result));

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

引数と実行の流れ:

  • ReadX は文字列「move 1445 1690」を受け取ります。 3 つの単語をテストし、名前を移動します。インデックス 1 は X を選択します。 IsNumeric はテキストをチェックし、変換します。 ToInt32 は 1445 を返します。これはセットアップの内訳にすぎません。キャラクターは動きません。形式が間違っている場合は、-1 が返されます。
  • ReadX では、Convert.ToInt32 の前に、範囲 0..65535 の X 全体も必要です。 NaN、無限大、分数の X は拒否されます。 Y はここではテストされていません。
return ReadX("move   1445 1690");

dynamic ReadX(dynamic text)
{
    if (Truth(UO.GetWordCount(text) != 3))
    {
        return -1;
    }
    if (Truth(UO.GetWord(text, 0) != "move"))
    {
        return -1;
    }
    var xText = UO.GetWord(text, 1);
    if (!(Truth(IsNumeric(xText))))
    {
        return -1;
    }
    var x = Convert.ToDouble(xText);
    if (Truth(Convert.ToString(x) == "NaN") || Truth(x < 0) || Truth(x > 65535))
    {
        return -1;
    }
    if (Truth(x != Math.Truncate(x)))
    {
        return -1;
    }
    return Convert.ToInt32(x);
}

bool IsNumeric(object? value) => double.TryParse(Convert.ToString(value), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out _);
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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

引数と実行の流れ:

  • PriorityAt はリスト「mage||tank|archer|」を取得します。インデックス=1。区切り文字 |空の要素を破棄するため、結果はタンクになります。名前は任意です。ここでは、ClassMask の登録や服装のチェックは行われません。数えたり選択したりするときは、同じ除算ルールを使用します。
return  RunScenario();
 object? RunScenario()
{
    return PriorityAt("mage||tank|archer|", 1);
    return null;
}

dynamic PriorityAt(dynamic names, dynamic index)
{
    return UO.GetWord(names, index, "|");
}

3。 UO.GetWord - 3 - シナリオクラス

引数と実行の流れ:

  • ReadPlace は、「Britain::Bank:west」を正確な区切り文字 :: で分割します。インデックス 1 は、内側の単一コロンを残して Bank:west を返します。空ではない部分がちょうど 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()
    {
        return ReadPlace("Britain::Bank:west");
        return null;
    }

    dynamic ReadPlace(dynamic text)
    {
        if (Truth(UO.GetWordCount(text, "::") != 2))
        {
            return "";
        }

        return UO.GetWord(text, 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.GetWord(value, wordIndex) — UO.GetWord(String,Integer)

引数: value (String), wordIndex (Integer)

結果: string / String.

呼び出し時:

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

private static string GetWord(string value,int wordIndex) => GetWord(value,wordIndex," ");

UO.GetWord(value, wordIndex, delimiter) — UO.GetWord(String,Integer,String)

引数: value (String), wordIndex (Integer), delimiter (String)

結果: string / String.

呼び出し時:

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

private static string GetWord(string value,int wordIndex,string delimiter)
        {
            var words=SplitWords(value,delimiter);return wordIndex>=0&&wordIndex<words.Length?words[wordIndex]:string.Empty;
        }

UO.GetWordCount

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

C# のシグネチャ

int UO.GetWordCount(object? value);
int UO.GetWordCount(object? value, object? delimiter);

空ではないテキストフィールドをカウントします。解析する前に座標の数を確認し、リストの列挙の境界を決定できます。

引数

  • value — ソース文字列。この関数は、送信されたテキストを正確に解析します。雑誌、ファイル、機器、またはワールドを独自に読み取ることはありません。
  • delimiter — オプションの区切り文字。これを使用しない場合、"" または単一のスペース " " を使用すると、テキストはタブや改行を含む Unicode 空白文字によって分割されます。もう 1 つの区切り文字は、シーケンス全体を正確に表します。「::」は、すべてのコロンではなく、連続する 2 つのコロンを意味します。空の部分は破棄されます。空でない部分はトリミングされません。

戻り値

int — 空ではないパーツの数。空の文字列と区切り文字のみの文字列は 0 となります。これはカウンターであり、bool ではありません。2 も有効な結果です。カウント > 0 または必要な正確な数量を確認してください。

動作

  • パッケージやゲームアクションなしでローカルで動作します。 GetWord と UO.GetWord は同じハンドラーを呼び出します。 GetWordCount、UO.GetWordCountも同様です。呼び出しごとにテキスト全体が再分割されます。ループ内で、事前に数量を保存します。大規模な繰り返し解析の場合は、すでに解析されたフィールドを配列に格納することをお勧めします。これは CSV パーサーではありません。引用符は区切り文字を保護せず、空の列は失われます。
  • GetWord · GetWordCount · IsNumeric

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

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

簡単な例

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

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

var result = UO.GetWordCount("red green blue");
UO.Print("GetWordCount: " + Convert.ToString(result));

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

引数と実行の流れ:

  • HasPoint は「1445 1690 0」を受け入れます。それぞれに正確に 3 つの単語と数値テキストが必要で、その場合は 1 を返します。それ以外の場合は0。これは形式のチェックのみであり、地図の有効性、座標境界、通行可能性を確認するものではありません。ここで、GetWordCount は 3 を返し、bool はヘルパーを返します。
  • HasPoint はさらに、NaN と無限大を拒否します。これは、IsNumeric 自体が受け入れることができます。小数の有限数は許可されます。移動前に、ゲーム全体の座標を別途チェックする必要があります。
return HasPoint("1445 1690 0");

dynamic HasPoint(dynamic text)
{
    if (Truth(UO.GetWordCount(text) != 3))
    {
        return 0;
    }
    var i = 0;
    while (Truth(i < 3))
    {
        if (!(Truth(IsNumeric(UO.GetWord(text, i)))))
        {
            return 0;
        }
        var value = Convert.ToString(Convert.ToDouble(UO.GetWord(text, i)));
        if (Truth(value == "NaN") || Truth(value == "Infinity") || Truth(value == "-Infinity"))
        {
            return 0;
        }
        i = i + 1;
    }
    return 1;
}

bool IsNumeric(object? value) => double.TryParse(Convert.ToString(value), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out _);
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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

引数と実行の流れ:

  • JoinPriorities は「メイジ||タンク|アーチャー|」を取得します。 3 つの空でない要素を 1 回カウントし、インデックス 0..2 を反復処理して、「mage > Tank > Archer」を返します。始まり、終わり、そして繰り返し |別の優先順位を作成しないでください。
return  RunScenario();
 object? RunScenario()
{
    return JoinPriorities("mage||tank|archer|");
    return null;
}

dynamic JoinPriorities(dynamic names)
{
    var count = UO.GetWordCount(names, "|");
    var i = 0;
    var result = "";
    while (Truth(i < count))
    {
        if (Truth(i > 0))
        {
            result = result + " > ";
        }

        result = result + UO.GetWord(names, i, "|");
        i = i + 1;
    }

    return result;
}

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

3。 UO.GetWordCount - 3 - シナリオクラス

引数と実行の流れ:

  • CountPlaces は「英国::銀行:西::」を取得します。 :: 区切り文字によって 2 つのフィールドが指定され、末尾の空のフィールドが削除されます。結果は 2 です。シングル: Bank:west 内でテキストが分割されません。これはクライアントからの都市のリストではなく、セットアップ形式の例です。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        return CountPlaces("Britain::Bank:west::");
        return null;
    }

    dynamic CountPlaces(dynamic text)
    {
        return UO.GetWordCount(text, "::");
    }
}

コマンドの実装

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

UO.GetWordCount(value) — UO.GetWordCount(String)

引数: value (String)

結果: int / Integer.

呼び出し時:

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

private static int GetWordCount(string value) => GetWordCount(value," ");

UO.GetWordCount(value, delimiter) — UO.GetWordCount(String,String)

引数: value (String), delimiter (String)

結果: int / Integer.

呼び出し時:

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

private static int GetWordCount(string value,string delimiter) => SplitWords(value,delimiter).Length;

UO.Random

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

C# のシグネチャ

int UO.Random(object? max);
int UO.Random(object? min, object? max);

ランダムな整数を返します。新しい形式 UO.Random(min, max) は、最小値から最大値までの数値を選択します。以前の形式 UO.Random(max) が保持され、0 から max −1 までが選択されます。結果は変数に保存し、遅延、座標、インデックス、または条件として使用できます。

引数

  • min — 2 引数形式の最初の引数のみが含まれる下限、-2147483648 から 2147483647 までの整数です。負、ゼロ、または正の値を指定できます。最大値を超えてはなりません。引数が 1 つの形式では最小値はなく、渡された数値は最大値を意味します。
  • max — 2 引数形式の 2 番目の引数には、−2147483648 から 2147483647 までの上限 int が含まれます。前者の引数が 1 つの形式では、単一の引数、上限は除外され、0 から 2147483647 までの整数です。 Random(0) は 0 を返します。 1 つの引数形式で負の最大値を指定することはできません。

戻り値

int は 1 つの擬似乱数整数です。 2 つの引数 min ≤ result ≤ max;両方の境界線が外れてしまう可能性があります。 1 つの正の引数 0 ≤ result < max.以前に引いた数字を繰り返すことは許容されます。チームは繰り返しのない数字を選択しません。

動作

  • 正確に 2 つの形式、UO.Random(max) と UO.Random(min, max) がサポートされています。引数のない呼び出しは登録されません。 「from と to」の範囲の場合は、2 つの引数を使用します。
  • Random(5, 5) ​​は常に 5 を返します。 Random(10, 1) は範囲エラーを報告します: 境界はサイレントに交換されません。 −10 が −1 より小さいため、Random(-10, -1) は正しいです。
  • どちらの境界も int です。小数の場合は、目的のスケールの整数単位を選択して除算できます。たとえば、Random(0, 100) ​​/ 100.0 は、0 から 1 まで0,01 ずつ増分する離散値を与えます。
  • 全範囲 Random(-2147483648, 2147483647) が有効です。この実装では、int の最大値に 1 が追加されないため、上限でオーバーフローすることはありません。広い範囲の場合、除算の余りが選択に偏らないように、余分な値を破棄することが使用されます。
  • 通話はローカルで番号を計算し、パケットを送信せず、通話自体は一時停止しません。ランダムな一時停止の場合、結果を UO.Wait に渡します。スクリプトは、サーバーに必要な最小限の遅延を維持する必要があります。
  • 同じ数値が複数回必要な場合は、結果を var に保存します。 Random への 2 つの別々の呼び出しでは、異なる値が返される場合があります。このコマンドは、選択した正方形が移動または転送に有効であるかどうかをチェックしません。これは、対応するゲーム コマンドによってチェックされます。

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

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

簡単な例

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

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

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

1。 1 から 6 までの乱数 - 直接スクリプト

引数と実行の流れ:

  • 最小値は下位=1、最大値は上限=6になります。取り得る値は正確に 6 つあります: 1、2、3、4、5、6。
  • ロールには受信した番号が 1 つ格納されます。 Print はまさにこれを表示します。 Convert.ToString は、int を文字列に変換します。再度実行すると同じ数値が得られる場合があります。
var lower = 1;
var upper = 6;
var roll = UO.Random(lower, upper);
UO.Print("Roll: " + Convert.ToString(roll));

2。 350 と 700 ミリ秒間のランダムな一時停止 - スクリプト関数

引数と実行の流れ:

  • min=350 および max=700 は、有効な遅延制限を定義します。 350、512、700 などの結果は遅延するように書き込まれます。
  • UO.Wait はミリ秒単位で 1 つの遅延引数を受け取ります。一時停止は UO.Wait で発生します。 Random は数値を計算するだけです。
  • サーバーのアクションと要件に基づいて下限を選択します。次のアクションで応答が必要な場合、ランダムな遅延はサーバーの応答を待つ代わりにはなりません。
return  RunScenario();
 object? RunScenario()
{
    var delay = UO.Random(350, 700);
    UO.Print("Waiting " + Convert.ToString(delay) + " ms");
    UO.Wait(delay);
    UO.Print("Wait finished");
    return null;
}

3。条件として 3 つのアクションのうち 1 つを選択します - シナリオ クラス

引数と実行の流れ:

  • min=1、max=3: 選択肢は 1、2 または 3 です。各分岐は有効な数値の 1 つに対応します。
  • Random への呼び出しは、if の前に 1 回実行されます。それぞれの条件でもう一度コールすると、異なる選挙になります。
  • Print をスクリプト内の目的のアクションに置き換え、それらのアクションの条件、範囲、サーバー応答チェックを維持します。
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 choice = UO.Random(1, 3);
        if (Truth(choice == 1))
        {
            UO.Print("First action");
        }
        else
        {
            if (Truth(choice == 2))
            {
                UO.Print("Second action");
            }
            else
            {
                UO.Print("Third action");
            }
        }

        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。バックパック内のMassMoveの場所を選択 - 直接スクリプト

引数と実行の流れ:

  • 最初の Random: 最小 = 50、最大 = 90、結果 x。 2 番目: 最小 = 60、最大 = 100、結果 y。これらはコンテナ内の 2 つの独立した座標であり、画面座標やマップ座標ではありません。
  • MassMove 遅延=350 ミリ秒、数量=10 整数項目では、type=0 は最初の手動転送によって決定され、宛先=backpack、x/y は変数 z=0 から取得されます。
  • コマンドの後、マウスを使用して元のコンテナからサンプルをドラッグします。 MassMove のこの組み込み全体では、選択された 1 つの位置が使用されます。個々の項目の位置をランダム化するには、MassMove を 1 回呼び出すのではなく、個別の MoveItem を使用したループが必要です。
  • バックパックの利用可能な領域内の X/Y 範囲を選択します。サーバーによりアイテムの配置が変更される場合があります。
var x = UO.Random(50, 90);
var y = UO.Random(60, 100);
UO.MassMove(350, 10, 0, "backpack", x, y, 0);
UO.Print("Drag a source item; position: " + Convert.ToString(x) + ", " + Convert.ToString(y));

5。元の座標を基準とした負のオフセット - スクリプト関数

引数と実行の流れ:

  • どちらの呼び出しでも、min=−2 および max=2: −2、−1、0、1、2 が可能です。 GetX/GetY は引数なしで文字の座標を読み取ります。
  • x/y は、文字の周囲の正方形内の計算されたセルにすぎません。この例では、移動を開始したり、オブジェクトを投げたりしません。
  • ランダムなセルは通行できないか、マップの境界を越えている可能性があります。ゲームのアクションの前に、適切な座標とルートのチェックを使用してください。
return  RunScenario();
 object? RunScenario()
{
    var offsetX = UO.Random(-2, 2);
    var offsetY = UO.Random(-2, 2);
    var x = UO.GetX() + offsetX;
    var y = UO.GetY() + offsetY;
    UO.Print("Candidate tile: " + Convert.ToString(x) + ", " + Convert.ToString(y));
    return null;
}

6。 Random(max) - シナリオクラスとの互換性を維持

引数と実行の流れ:

  • Random(count) では、max=10 のみが存在します。上限はなく、0..9 が可能です。 10 という数字は表示されません。
  • Random(0, count−1) ​​min=0 および max=9 では、有効な範囲は同じですが、呼び出しでは新しい独立した選択が行われます。
  • インデックス選択の場合、count は正の値である必要があります。特別な互換性のあるケース Random(0)=0 は、空のコレクションのインデックス 0 に要素があることを意味するものではありません。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var count = 10;
        var index = UO.Random(count);
        var equivalent = UO.Random(0, count - 1);
        UO.Print("Index 0..9: " + Convert.ToString(index));
        UO.Print("Another independent index: " + Convert.ToString(equivalent));
        return null;
    }
}

7。等しい境界と全範囲 int - 直接スクリプト

引数と実行の流れ:

  • min=7 および max=7 では、単一の結果 7 が得られます。
  • min=−100 および max=−50 は、両方の境界を含む負の数のみを示します。
  • 最後の呼び出しは、署名された 32 ビット int 全体をカバーします。その結果は、正、負、またはゼロになります。
  • 境界は小さい方から大きい方へ渡されます。 Random(10, 1) ​​への誤った呼び出しは、min が max を超えてはいけないというメッセージで停止します。反転範囲に使用する必要はありません。
var fixedValue = UO.Random(7, 7);
var negative = UO.Random(-100, -50);
var signedValue = UO.Random(-2147483648, 2147483647);
UO.Print("Fixed: " + Convert.ToString(fixedValue));
UO.Print("Negative: " + Convert.ToString(negative));
UO.Print("Signed Integer: " + Convert.ToString(signedValue));

コマンドの実装

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

UO.Random(max) — UO.Random(Integer)

引数: max (Integer)

結果: int / Integer.

呼び出し時:

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

public int Random(int max)

        {

            lock (randomSync) return random.Next(max);

        }

UO.Random(min, max) — UO.Random(Integer,Integer)

引数: min (Integer), max (Integer)

結果: int / Integer.

呼び出し時:

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

public int Random(int min, int max)

        {

            if (min > max)

                throw new NativeSubrutineException("UO.Random(min, max): min must not exceed max.");

            if (min == max) return min;

            long count = (long)max - min + 1;

            lock (randomSync)

            {

                if (count <= int.MaxValue)

                    return (int)(min + (long)random.Next((int)count));



                // Inclusive Int32.MaxValue and the full signed range must not

                // overflow. Rejection avoids modulo bias; reuse the four bytes.

                const ulong domain = 1UL << 32;

                ulong limit = domain - domain % (ulong)count;

                uint sample;

                do

                {

                    random.NextBytes(randomRangeBytes);

                    sample = BitConverter.ToUInt32(randomRangeBytes, 0);

                } while (sample >= limit);

                return (int)(min + (long)(sample % (ulong)count));

            }

        }

Clone this wiki locally