JA UO Topic world geometry - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

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

世界と幾何学

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

座標、距離、視線、横断能力、および地図データ。ルートの取得については移動で別途説明します。

セクション

トピック コマンドと説明
X / Y / Z UO.GetX · UO.GetY · UO.GetZ
Distance UO.GetDistance · UO.Dist
LOS UO.CheckLOS · UO.LOSOptions
World Number UO.WorldNum
World Cells UO.GetWorldCell · UO.GetWorldTilesArray
Passability UO.IsWorldCellPassable · UO.GetNextStepZ
Surface Z UO.GetSurfaceZ
Map Cells UO.GetMapCell
Land Tiles UO.GetLandTileAt · UO.GetLandTileData · UO.GetLandTilesArray · UO.GetLandTilesArrayEx
Static Tiles UO.GetStaticTileAt · UO.GetStaticTileData · UO.GetStaticTiles · UO.GetStaticTilesArray · UO.GetStaticTilesArrayEx
Tile Flags UO.GetTileFlags · UO.ConvertIntegerToFlags
Tile Height UO.GetTileHeight
Tile Layer UO.GetTileLayer
Tile Name UO.GetTileName
Water Tiles UO.IsWaterTile
Tree Tiles UO.IsTreeTile
Mine Tiles UO.IsMineTile

すべてのテーマコマンド

X / Y / Z

UO.X · UO.Y · UO.Z · UO.GetX · UO.GetY · UO.GetZ

距離

UO.Dist · UO.GetDistance

LOS

UO.CheckLOS · UO.LOSOptions

世界番号

UO.WorldNum · UO.GetWorldNum

ワールドセル / 通行可能性

UO.GetWorldCell · UO.GetMapCell · UO.IsWorldCellPassable · UO.GetSurfaceZ · UO.GetNextStepZ · UO.GetWorldTilesArray

土地タイル

UO.GetLandscapeTile · UO.GetLandTileAt · UO.GetLandTileData · UO.GetLandTilesArray · UO.GetLandTilesArrayEx

静的タイル

UO.GetStaticArt · UO.GetStaticTileAt · UO.GetStaticTileData · UO.GetStaticTiles · UO.GetStaticTilesArray · UO.GetStaticTilesArrayEx · UO.ReadStaticsXY · UO.PrivateGetTile · UO.GetTileXYM · UO.GetLayerCount

タイルのプロパティ

UO.GetTileFlags · UO.GetTileHeight · UO.GetTileLayer · UO.GetTileName · UO.IsWaterTile · UO.IsTreeTile · UO.IsMineTile · UO.ConvertIntegerToFlags

クライアントの統計

UO.AddUserStatic · UO.ClearUserStatics · UO.GetUserStatic · UO.GetUserStatics · UO.RemoveUserStatic · UO.UserStaticExists

このトピックに関する例

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

UO.GetDistance

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

var target = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(target)))
{
    var distance = UO.GetDistance(target);
    if (Truth(distance <= 2))
    {
        UO.Print("Target is within two tiles");
    }
}

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

UO.IsWorldCellPassable

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

var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
var result = UO.IsWorldCellPassable(x,y,z,x+1,y,z,UO.WorldNum());
if (Truth(Truth(result[0]) == true))
{
    UO.Print("Passable, Z=" + Convert.ToString(result[1]));
}
else
{
    UO.Print("Blocked");
}

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

リファレンスの各部

1 · 2

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


UO.AddUserStatic

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

C# のシグネチャ

dynamic UO.AddUserStatic(object? staticItem, object? worldNum);
int UO.AddUserStatic(object? graphic, object? x, object? y, object? z, object? hue, object? map);

カスタム静的エントリをローカル スクリプト状態に追加します。数値 graphic は、パスファインダーによるローカル障害物チェックに使用されます。オブジェクトはサーバー上に作成されません。番号なしのテキストを使用した 2 つの引数の呼び出しでは、従来の値が保持され、パスファインダーに静的値が追加されません。

引数

  • staticItem — 数値 graphic または従来のテキスト値。
  • worldNum - 記録またはローカル静的カードのインデックス。
  • graphic — ID 0 から 65535 までの静的。
  • z — 高さ。パスファインダーに追加される場合、値は符号付きの byte の範囲に制限されます。
  • hue - hue;追加する場合は0~65535の範囲に限定されます。
  • map — マップインデックス。マネージャー処理の場合、範囲は0–255に制限されます。
  • x — 世界のX ユーザー統計。 int。マネージャーは、現在ロードされているマップ内の座標を受け入れます。
  • y — 世界のY ユーザー統計。 int。マネージャーは、現在ロードされているマップ内の座標を受け入れます。

戻り値

作成したエントリのポジティブ ID。 6 パラメーター形式の場合、負の graphic、x、y、または map、および 65535 上の graphic は、-1 になります。 ID は、UO.UserStaticExists、UO.RemoveUserStatic に渡すことも、レガシー レコードの確認/削除に使用することもできます。返された ID 自体は、静的がサーバー上で表示または適用されることを確認するものではありません。

動作

    • UO.AddUserStatic('tree', 0) - tree は数値ではないため、元の値のペアを実行時状態のレガシー レコードとして保存します。パスファインダーは使用しません。
  • 数値 graphic を使用した 2 つのパラメーター呼び出しは、その graphic のスタティックを、キャラクターの z と hue 0 を使用してキャラクターの現在の座標に追加します。
  • 6 つのパラメーターの呼び出しでは、指定された graphic、座標、高度、hue、および地図を使用して静的データが追加されます。パスファインディングでは、アクティブなマップ上で、クライアント タイルデータの graphic フラグに従ってのみ考慮されます。

これらのエントリはスクリプト クライアントに対してローカルです。ゲーム オブジェクトの作成、ネットワーク リクエストの作成、シャード データの変更は行いません。

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

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

簡単な例

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

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

object? result = UO.AddUserStatic(0x0CCA, UO.GetWorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1。ペアをレガシー データとして保存します。テキスト StaticItem はパスファインダーの障害物にはなりません。 - 直接スクリプト

引数と実行の流れ:

  • ペアをレガシー データとして保存します。テキスト StaticItem はパスファインダーの障害物にはなりません。
var legacyId = UO.AddUserStatic("tree", 0);
UO.Print(Convert.ToString(legacyId));

2。現在のマップ上のキャラクターの位置に数値 graphic が追加されます。 - スクリプト機能

引数と実行の流れ:

  • 現在のマップ上のキャラクターの位置に数値 graphic が追加されます。
return  RunScenario();
 object? RunScenario()
{
    var staticId = UO.AddUserStatic(0x0CCA, UO.GetWorldNum());
    UO.Print(Convert.ToString(staticId));
    return null;
}

3。ローカル静的 graphic を指定された位置と指定されたマップに明示的に追加します。 - スクリプトクラス

引数と実行の流れ:

  • ローカル静的 graphic を指定された位置と指定されたマップに明示的に追加します。
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 staticId = UO.AddUserStatic(0x0CCA, UO.GetX(), UO.GetY(), UO.GetZ(), 0, UO.GetWorldNum());
        UO.Print(Convert.ToString(staticId));
        return null;
    }
}

コマンドの実装

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

UO.AddUserStatic(staticItem, worldNum) — UO.AddUserStatic(Any,Any)

引数: staticItem (Any), worldNum (Any)

結果: dynamic / Any.

呼び出し時:

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

case "adduserstatic":

                {

                    int map = Arg(1, bridge.WorldNumber);

                    if (arguments[0].Kind != InjectionValueKind.Array)

                    {

                        int graphic = 0;

                        if (arguments[0].Kind == InjectionValueKind.String &&

                            !NumberConversions.TryStr2Int(arguments[0].String, out graphic))

                        {

                            int legacyId = state.NextUserStaticId++;

                            state.UserStatics[legacyId] = Text(0) + "|" + Text(1);

                            return new InjectionValue(legacyId);

                        }

                        graphic = arguments[0].Kind == InjectionValueKind.String

                            ? graphic

                            : NumberConversions.ToInt(arguments[0]);

                        return new InjectionValue(AddUserStatic(graphic, bridge.GetX(bridge.Self), bridge.GetY(bridge.Self),

                            bridge.GetZ(bridge.Self), 0, map));

                    }

                    if (arguments[0].Array.Length < 4)

                        throw new NativeSubrutineException("AddUserStatic expects [graphic,x,y,z,color] and world number, or graphic,x,y,z,color,world.");

                    InjectionValue[] item = arguments[0].Array;

                    return new InjectionValue(AddUserStatic(

                        NumberConversions.ToInt(item[0]), NumberConversions.ToInt(item[1]), NumberConversions.ToInt(item[2]),

                        NumberConversions.ToInt(item[3]), item.Length > 4 ? NumberConversions.ToInt(item[4]) : 0, map));

                }

UO.AddUserStatic(graphic, x, y, z, hue, map) — UO.AddUserStatic(Any,Any,Any,Any,Any,Any)

引数: graphic (Any), x (Any), y (Any), z (Any), hue (Any), map (Any)

結果: int / Integer.

呼び出し時:

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

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

values => new InjectionValue(AddUserStatic(

                    NumberConversions.ToInt(values[0]), NumberConversions.ToInt(values[1]), NumberConversions.ToInt(values[2]),

                    NumberConversions.ToInt(values[3]), NumberConversions.ToInt(values[4]), NumberConversions.ToInt(values[5])))

UO.CheckLOS

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

C# のシグネチャ

dynamic UO.CheckLOS(object? xfrom, object? yfrom, object? zfrom, object? xto, object? yto, object? zto, object? worldNum);

CheckPortableLineOfSight を介して 2 つのマップポイント間のラインのローカル通過可能性をチェックします。

引数

  • xfrom — ソース X: 0..65535。
  • yfrom — ソース Y: 0..65535。
  • zfrom — イニシャル Z、int。
  • xto - 終了 X: 0..65535。
  • yto - 終了 Y: 0..65535。
  • zto — 最終 Z、int。
  • worldNum - 0..255。ゼロ以外の長さのビームは、現在ロードされている _world.Map/World.Map のみを読み取ります。 CheckWorldStep を介して、WorldNum == _world.MapIndex とライブ Player.Pathfinder が必要です。別のファセットはロードまたは要求されていません。マップ/キャラクター/パスファインダーがないか、ステップが利用できません - 0。同一の X/Y を除外すると、セルのサイクル全体がスキップされます。X/Y が 0..65535、WorldNum が 0..255 で、abs(Zfrom-Zto)<=20 は、カードがロードされていない場合やカード番号が異なる場合でも、1 を返します。これは、ジオメトリや到達可能性を証明するものではありません。結果はローカルであり、LOS サーバー ソリューションではありません。

戻り値

int 1 — ローカル光線は X/Y に到達し、最終的な高さは Zto との差が 20 以内です。 0 - 無効な座標、障害物、またはチェック限界。

動作

  • ビームはブレゼンハム アルゴリズムを使用して、最大 4096 ステップで移動します。各セルでは、BadLocations、CheckWorldStep、および返された高さが考慮されます。
  • LosOptions != 0 に加えて CheckLosCell が使用される場合。ビット 0x100 は、対角線の両側の正方形をチェックします。ローカル ジオメトリ チェックでは、サーバー固有の LOS ルールは検証されず、何も移動されません。
  • マイナー byte (値 & 0xFF) はアルゴリズム 1..4 を選択します。 CheckLosCell のマイナー byte の他の値には、3 アルゴリズムが使用されます。アルゴリズム1/2は壁と通行不能をブロックし、3はさらにNoShootをブロックし、4は0x200でのみNoShootを有効にし、0x400でのみ窓の障害物を許可します。ビット 0x100 は、選択されたアルゴリズムの各対角ビーム ステップの両側のセルをさらにチェックします。 value=0 は追加の CheckLosCell/対角チェックを無効にしますが、BadLocations と CheckWorldStep は残ります。たとえば、4+0x100+0x200+0x400 は 3 つのフラグを持つカスタムを選択します。 setter は、正規化されたアルゴリズムではなく、元の int を保持します。
  • ゼロ以外の長さのビームは、現在ロードされている _world.Map/World.Map のみを読み取ります。 CheckWorldStep を介して、WorldNum == _world.MapIndex とライブ Player.Pathfinder が必要です。別のファセットはロードまたは要求されていません。マップ/キャラクター/パスファインダーがないか、ステップが利用できません - 0。同一の X/Y を除外すると、セルのサイクル全体がスキップされます。X/Y が 0..65535、WorldNum が 0..255 で、abs(Zfrom-Zto)<=20 は、ロードされているカードがなくても、または異なるカード番号があっても、1 を返します。これは、ジオメトリや到達可能性を証明するものではありません。結果はローカルであり、LOS サーバー ソリューションではありません。
  • CheckLosCell は、1 つのセルのロードされた Land/Static/Multi/Item をバイパスします。 ABS(rayZ-land.Z)<=20 の通行不能な土地ブロック。 Static/Multi/Item フラグは、tile.Z-2 .. tile.Z+max(1,Height)+2; の範囲でのみ有効です。許可されたカスタム ウィンドウは、Wall/Impassable/NoShoot がチェックされるまでスキップされます。 X/Y ビームはブレゼンハムを使用し、最大 4096 ステップ。 Z はサーフェス CheckWorldStep から取得され、Zto に補間されません。最終的な高さの許容差は 20 です。

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

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

簡単な例

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

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

object? result = UO.CheckLOS(UO.X(), UO.Y(), UO.Z(), UO.X() + 1, UO.Y(), UO.Z(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1。現在のセルの行 - 直接スクリプト

引数と実行の流れ:

  • 同一の点が許容される X/Y/マップ内を通過します。
var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
var visible = UO.CheckLOS(x,y,z,x,y,z,UO.WorldNum());
UO.Print(Convert.ToString(visible));

2。 Checking adjacent cell - script function

引数と実行の流れ:

  • 隣接セルの高さと透過率はローカル マップから読み取られます。
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX();
    var y = UO.GetY();
    var z = UO.GetZ();
    var clear = UO.CheckLOS(x, y, z, x + 1, y, z, UO.WorldNum());
    UO.Print(Convert.ToString(clear));
    return null;
}

3。無効な座標 — スクリプト クラス

引数と実行の流れ:

  • 負の X は、マップを通過せずに 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 clear = UO.CheckLOS(-1, 0, 0, 0, 0, 0, 0);
        UO.Print(Convert.ToString(clear));
        return null;
    }
}

コマンドの実装

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

UO.CheckLOS(xfrom, yfrom, zfrom, xto, yto, zto, worldNum) — UO.CheckLOS(Any,Any,Any,Any,Any,Any,Any)

引数: xfrom (Any), yfrom (Any), zfrom (Any), xto (Any), yto (Any), zto (Any), worldNum (Any)

結果: dynamic / Any.

呼び出し時:

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

case "checklos": return new InjectionValue(CheckPortableLineOfSight(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), Arg(5), Arg(6)) ? 1 : 0);

UO.ClearUserStatics

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

C# のシグネチャ

void UO.ClearUserStatics();

すべてのユーザー静的ランタイム エントリとローカル静的マネージャー オブジェクトを削除します。

引数

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

戻り値

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

動作

  • 状態。UserStatics およびマネージャー オブジェクトはクリアされます。アップロードされたマップ ファイルと実サーバーのアイテムは削除されません。

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

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

簡単な例

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

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

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

1。状態のクリア - 直接スクリプト

引数と実行の流れ:

  • すべてのユーザー静的ランタイム エントリとローカル静的マネージャー オブジェクトを削除します。
UO.ClearUserStatics();

2。セットアップ後にクリア - スクリプト機能

引数と実行の流れ:

  • 現在のセルにローカル静的静的を追加し、すべてのカスタム静的静的を削除します。
return  RunScenario();
 object? RunScenario()
{
    var localStatic = UO.AddUserStatic(0x0CCA, UO.GetX(), UO.GetY(), UO.GetZ(), 0, UO.WorldNum());
    UO.ClearUserStatics();
    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()
    {
        UO.ClearUserStatics();
        UO.ClearUserStatics();
        return null;
    }
}

コマンドの実装

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

UO.ClearUserStatics() — UO.ClearUserStatics()

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

結果: void / Unit.

呼び出し時:

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

case "clearuserstatics": state.UserStatics.Clear(); bridge.ClearUserStatics(); return InjectionValue.Unit;

UO.ConvertIntegerToFlags

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

C# のシグネチャ

dynamic UO.ConvertIntegerToFlags(object? group, object? value);

タイル フラグの数値マスクを解析して列挙名 TileFlag の配列にします。

引数

  • group - int: 1 または 2 のみが変換を有効にします。他の値を指定すると空の配列になります。
  • value — Arg が符号付き 32 ビット int に変換し、ブリッジして ulong に導くマスク。上位 64 ビット フラグの場合、この形式では完全なマスクが保持されません。

戻り値

非ゼロ TileFlag という名前の文字列の配列。そのビットはマスク内に完全に存在します。マスク 0 は空の配列を生成します。

動作

  • グループ 1 と 2 は、異なるディレクトリではなく、同じ Enum.GetValues を使用します。これはローカル マスク変換です。タイルデータは要求されません。
  • API-登録は object? を使用しますが、Arg(1) ディスパッチャは int を渡します。 ulong にキャストする場合、負の int は符号拡張されます。 GetTileFlags は、下位の 32 ビットのみを signed int として返します。この互換性のあるペアは、完全な 64 ビットのタイルデータ コントラクトを提供しません。

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

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

簡単な例

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

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

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

1。 Null マスク - 直接スクリプト

引数と実行の流れ:

  • マスク 0 にはゼロ以外のフラグが存在しません。
var flags = UO.ConvertIntegerToFlags(1,0);
UO.Print(Convert.ToString(ArrayLength(flags)));

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

2。下位ビットマスク - スクリプト関数

引数と実行の流れ:

  • 配列には、選択したマスクの実際の名前 TileFlag が含まれます。
return  RunScenario();
 object? RunScenario()
{
    var flags = UO.ConvertIntegerToFlags(2, 1);
    for (int i = (int)(0); i <= ArrayLength(flags) - 1; i += (int)(1))
    {
        UO.Print(flags[i]);
    }

    return null;
}

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

3。無効なグループ - スクリプト クラス

引数と実行の流れ:

  • グループ 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 flags = UO.ConvertIntegerToFlags(0, 1);
        UO.Print(Convert.ToString(ArrayLength(flags)));
        return null;
    }

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

コマンドの実装

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

UO.ConvertIntegerToFlags(group, value) — UO.ConvertIntegerToFlags(Any,Any)

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

結果: dynamic / Any.

呼び出し時:

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

case "convertintegertoflags":

                    return new InjectionValue(bridge.ConvertTileFlags(Arg(0), Arg(1))

                        .Select(flag => new InjectionValue(flag)).ToArray());

UO.Dist

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

C# のシグネチャ

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

2 つのワールド ポイント間のセル単位の距離、つまり X と Y の間の絶対差の最大値を計算します。

引数

  • xfrom — 開始点の X 座標。
  • yfrom — 開始点の Y 座標。
  • xto — X 割り当て座標。
  • yto — Y 割り当て座標。

戻り値

int — セル内の距離。有効な座標では負ではありません。 0 は同じ XY、1 - 1 つのセルを意味します。これは量であり、成功の兆候ではありません。別の比較距離 <= 2 は、bool true または false を返します。距離自体はintのままです。

動作

  • 座標のみを計算します。バッチなし、待機なし、マップ読み込みなし、障害物チェックなし、Z なし、世界地図なし。チームは通行可能なルートを探索するものではなく、目標の達成を保証するものではありません。点は同じ座標系に属している必要があります。障害物を避けると道が長くなる可能性があります。
  • 4 つのパラメータすべてが必要です。世界座標 int を文書化された範囲 0..65535 で送信します。 object?署名内の は、商品の ID ではなく、ユニバーサルアダプターを示します。これらのコマンドには、デフォルト値、胸部内の座標、5 番目の Z および 1 つのオブジェクトによるオーバーロードはありません。
  • 式: Max(Abs(Xto-Xfrom)、Abs(Yto-Yfrom))。点を並べ替えても結果は同じになります。これはユークリッド距離、差の合計、障害物を迂回するときの歩数ではありません。

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

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

簡単な例

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

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

var result = UO.Dist(100, 100, 103, 104);
UO.Print("Dist: " + Convert.ToString(result));

1。直接計算 - 直接スクリプト

引数と実行の流れ:

  • (100,100) ​​から (103,104) まで: 絶対的な差は 3 と 4 で、最大は 4 です。メインは int 4 を返します。
  • int — セル内の距離。有効な座標では負ではありません。 0 は同じ XY、1 - 1 つのセルを意味します。これは量であり、成功の兆候ではありません。別の比較距離 <= 2 は、bool true または false を返します。距離自体はintのままです。
  • 式: Max(Abs(Xto-Xfrom)、Abs(Yto-Yfrom))。点を並べ替えても結果は同じになります。これはユークリッド距離、差の合計、障害物を迂回するときの歩数ではありません。
return UO.Dist(100,100,103,104);

2。結果を正しくチェックするのはスクリプトの機能です

引数と実行の流れ:

  • (100,100) ​​から (101,99) までの距離は 1 です。距離 <=2 を個別に比較すると、true=1 が得られます。 Main は「1:1」を返します。最初の単位は距離で、2 番目の単位は比較の論理結果です。
  • int — セル内の距離。有効な座標では負ではありません。 0 は同じ XY、1 - 1 つのセルを意味します。これは量であり、成功の兆候ではありません。別の比較距離 <= 2 は、bool true または false を返します。距離自体はintのままです。
  • 式: Max(Abs(Xto-Xfrom)、Abs(Yto-Yfrom))。点を並べ替えても結果は同じになります。これはユークリッド距離、差の合計、障害物を迂回するときの歩数ではありません。
return  RunScenario();
 object? RunScenario()
{
    var distance = UO.Dist(100, 100, 101, 99);
    var close = distance <= 2;
    return Convert.ToString(distance) + ":" + Convert.ToString(close);
    return null;
}

3。完全なスクリプト解析 - スクリプト クラス

引数と実行の流れ:

  • UO.Dist は 4 を返します。 RebuildTileDistance は Abs を介して差を計算し、それらを比較して、大きい方を返します。4 も同様です。メインは「4:4」を返します。アシスタントは例で完全に示されており、別のエンジン コマンドではありません。
  • int — セル内の距離。有効な座標では負ではありません。 0 は同じ XY、1 - 1 つのセルを意味します。これは量であり、成功の兆候ではありません。別の比較距離 <= 2 は、bool true または false を返します。距離自体はintのままです。
  • 式: Max(Abs(Xto-Xfrom)、Abs(Yto-Yfrom))。点を並べ替えても結果は同じになります。これはユークリッド距離、差の合計、障害物を迂回するときの歩数ではありません。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var actual = UO.Dist(100, 100, 103, 104);
        var rebuilt = RebuildTileDistance(100, 100, 103, 104);
        return Convert.ToString(actual) + ":" + Convert.ToString(rebuilt);
        return null;
    }

    dynamic RebuildTileDistance(dynamic Xfrom, dynamic Yfrom, dynamic Xto, dynamic Yto)
    {
        var dx = Math.Abs(Xto - Xfrom);
        var dy = Math.Abs(Yto - Yfrom);
        if (Truth(dx > dy))
        {
            return dx;
        }

        return dy;
    }

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

引数: xfrom (Any), yfrom (Any), xto (Any), yto (Any)

結果: int / Integer.

呼び出し時:

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

case "dist": return new InjectionValue(arguments.Length >= 4

                    ? GetDistance(Arg(0), Arg(1), Arg(2), Arg(3))

                    : bridge.GetDistance(Arg(0)));

UO.GetDistance

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

C# のシグネチャ

int UO.GetDistance(object? id);
int UO.GetDistance(object? x, object? y);
int UO.GetDistance(object? id1, object? x2, object? y2);
int UO.GetDistance(object? x1, object? y1, object? x2, object? y2);

最大の X/Y 差に基づいてセル内の距離を測定します。これは経路探索を行わない幾何学的推定です。

引数

  • id — 1 つの引数: serial またはロードされたオブジェクトのエイリアス、取得したい距離。
  • x — 2 つの引数: 世界の目的地。始まりはGetX(self)、GetY(self)です。
  • y — 2 つの引数: 世界の目的地。始まりはGetX(self)、GetY(self)です。
  • id1 - 3 つの引数形式 - serial/座標が原点となるオブジェクトのエイリアス。
  • x1 — 4 つの引数形式での原点の座標。このフォームにはオブジェクトは必要ありません。
  • y1 — 4 つの引数形式での原点の座標。このフォームにはオブジェクトは必要ありません。
  • x2 — 3 つまたは 4 つの引数を持つフォームでは、終了座標。 2 番目のオブジェクトの serial と混同しないでください。
  • y2 — 3 つまたは 4 つの引数を持つフォームでは、終了座標。 2 番目のオブジェクトの serial と混同しないでください。

戻り値

int - max(abs(x2-x1), abs(y2-y1)): 隣接するセルまでの水平、垂直、対角線には距離 1 があります。高さ Z と障害物は考慮されません。未知の serial の場合、1 引数形式は 0 を返します。文字が存在しない既存のオブジェクトの場合 - 65535。不明な id1 の場合、3 引数形式では (0,0) が使用されるため、最初に Exists(id1) を確認します。

動作

  • 単一オブジェクト フォームでは、現在の World.RangeSize 範囲の中心と、移動するMob のステップ キューの最後の位置が使用されます。移動中はGetX/GetYによる計算結果と異なる場合があります。
  • 座標フォームは渡された数値を使用して機能します。ゲーム座標の場合、範囲 0..65535 を使用します。極端な int 値と差分のオーバーフローはサポートされていない座標です。
  • チームは目標が達成可能であることを約束しません。移動するには、MoveXY/NewMoveXY を実行し、その結果を確認する必要があります。壁があると実際のパスが長くなる可能性があります。

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

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

簡単な例

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

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

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

1。 Check range to target - direct script

引数と実行の流れ:

  • ターゲットは type ではなく serial です。 Exists チェックは、未知のオブジェクトのゼロが近くのターゲットと間違われるのを防ぎます。
  • distance<=2 は X/Y 範囲をチェックします。視認性と通過性は個別にチェックされます。
var target = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(target)))
{
    var distance = UO.GetDistance(target);
    if (Truth(distance <= 2))
    {
        UO.Print("Target is within two tiles");
    }
}

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

2。 2点間の距離 - スクリプト関数

引数と実行の流れ:

  • x1=100、y1=200、x2=103、y2=204。違いは3と4です。
  • 結果は、7 ではなく、ユークリッド 5 ではなく、4 です。
return  RunScenario();
 object? RunScenario()
{
    var distance = UO.GetDistance(100, 200, 103, 204);
    UO.Print(Convert.ToString(distance));
    return null;
}

3。オブジェクトとキャラクターから開始 - スクリプト クラス

引数と実行の流れ:

  • 2 つの x/y 引数は、self の現在位置を使用します。 3 つの引数 id1/x2/y2 を使用すると、開始オブジェクトを明示的に指定できます。
  • 一定の位置では、両方の量は 3 に等しくなります。座標はマップの境界内にとどまる必要があります。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var x = UO.GetX() + 3;
        var y = UO.GetY() + 1;
        var fromSelf = UO.GetDistance(x, y);
        var fromObject = UO.GetDistance("self", x, y);
        UO.Print(Convert.ToString(fromSelf) + " / " + Convert.ToString(fromObject));
        return null;
    }
}

コマンドの実装

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

UO.GetDistance(id) — UO.GetDistance(Any)

引数: id (Any/Integer/String)

結果: int / Any.

呼び出し時:

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

case "getdistance": return new InjectionValue(bridge.GetDistance(Arg(0)));

UO.GetDistance(id) — UO.GetDistance(Integer)

引数: id (Any/Integer/String)

結果: int / Integer.

呼び出し時:

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

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

UO.GetDistance(id) — UO.GetDistance(String)

引数: id (Any/Integer/String)

結果: int / Integer.

呼び出し時:

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

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

UO.GetDistance(x, y) — UO.GetDistance(Integer,Integer)

引数: x (Integer), y (Integer)

結果: int / Integer.

呼び出し時:

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

public int GetDistance(int x, int y) => GetDistance(bridge.GetX(bridge.Self), bridge.GetY(bridge.Self), x, y);

UO.GetDistance(id1, x2, y2) — UO.GetDistance(Any,Any,Any)

引数: id1 (Any), x2 (Any), y2 (Any)

結果: int / Integer.

呼び出し時:

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

public int GetDistance(InjectionValue id1, InjectionValue x2, InjectionValue y2)

        {

            var obj1 = GetObject(id1);

            int x1 = bridge.GetX(obj1);

            int y1 = bridge.GetY(obj1);



            return GetDistance(x1, y1, NumberConversions.ToInt(x2), NumberConversions.ToInt(y2));

        }

UO.GetDistance(x1, y1, x2, y2) — UO.GetDistance(Integer,Integer,Integer,Integer)

引数: x1 (Integer), y1 (Integer), x2 (Integer), y2 (Integer)

結果: int / Integer.

呼び出し時:

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

public int GetDistance(int x1, int y1, int x2, int y2)

        {

            int dx = Math.Abs(x1 - x2);

            int dy = Math.Abs(y1 - y2);



            return Math.Max(dx, dy);

        }

UO.GetLandTileAt

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

C# のシグネチャ

dynamic UO.GetLandTileAt(object? x, object? y);
dynamic UO.GetLandTileAt(object? x, object? y, object? map);

選択したセルの拡張土地レコードを返します。

引数

  • x — 現在ロードされているマップの X セル。ガンプ内の位置ではなく、世界座標。
  • y — 現在ロードされているマップの Y セル。ガンプ内の位置ではなく、世界座標。
  • map — カード番号。この引数が選択したフォームに存在しない場合は、現在のマップが使用されます。実際のクライアントは、現在ロードされているマップからタイルを読み取るだけです。

戻り値

1 つのレコードの 11 フィールドの配列。インデックスは 0 で始まります:

  • [0] kind — string: 「ランド」、「静的」、または「object」。
  • [1] serial - int: serial 動的アイテム。陸上/静的の場合は 0 です。
  • [2] graphic - int: type グラフィックス。
  • [3] x、[4] y - int: セルの世界座標。
  • [5] z - int: ワールドのベースの高さ。
  • [6] hue - int: 地面 0 に近い色。
  • [7] flags - int: タイルデータ フラグの下位 32 ビット。
  • [8] name - string: タイルデータからの名前。
  • [9] layer - int: タイルデータからの機器のレイヤー、地面 0 の近く。静的インデックスではありません。
  • [10] height - int: タイルデータからの高さ graphic、地面 0 付近。座標Zではありません。

空の配列 [] は、エントリがない、またはアクセスできないカード/セルを意味します。 GetStaticTileAt の場合、負のインデックスまたは大きすぎるインデックスは [] も生成します。インデックス オーバーフローでは、他の人のエントリは選択されません。

動作

  • データは現在ロードされているマップを参照します。別のカードまたは到達不能なセルがあると、空の配列になります。直接タイル クエリでは、さらにマップの不一致が報告される場合があります。 GetWorldCell と GetWorldTilesArray は、そのようなメッセージを表示せずに、すぐに空の配列を返します。
  • 配列インデックスは 0 で始まります。フィールドを読み取る前に、ArrayLength を確認してください。 Z は世界高度を表します。 Layer はタイルデータからの機器プロパティ、index はセル エントリのシリアル番号です。

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

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

簡単な例

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

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

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

1。 type、Z とレイヤーを個別に読み取る - 直接スクリプト

引数と実行の流れ:

  • x/y — 文字の位置。カードが下げられ、自動的に選択されます。 GetStaticTileAtの場合、index=0は最初のエントリを意味します。
  • フィールド [2]、[5]、[9] は異なる意味を持っています。 11 の長さを確認した後、すべて読み取り専用になります。
var tile = UO.GetLandTileAt(UO.GetX(), UO.GetY());
if (Truth(ArrayLength(tile) == 11))
{
    UO.Print("Type: " + Convert.ToString(tile[2]));
    UO.Print("World Z: " + Convert.ToString(tile[5]));
    UO.Print("Equipment layer: " + Convert.ToString(tile[9]));
}
else
{
    UO.Print("Tile is unavailable");
}

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

2。名前と身長を取得 graphic - スクリプト関数

引数と実行の流れ:

  • 同じ座標が使用されます。 GetStaticTileAt はインデックス=0 を読み取ります。
  • tile[8] は名前文字列、tile[10] は Z ベースではなく、タイルデータからの高さの寸法です。
return  RunScenario();
 object? RunScenario()
{
    var tile = UO.GetLandTileAt(UO.GetX(), UO.GetY());
    if (Truth(ArrayLength(tile) == 11))
    {
        UO.Print(tile[8]);
        UO.Print("Graphic height: " + Convert.ToString(tile[10]));
    }

    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。 typeと座標によるターゲットの準備 - シナリオクラス

引数と実行の流れ:

  • WaitTargetTile は、2…5 フィールドから graphic、x、y、z を受け取ります。
  • これは次のターゲットへの準備にすぎません。この例では、ツールや呪文はトリガーされません。静的な値の serial=0 をアイテムの 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 tile = UO.GetLandTileAt(UO.GetX(), UO.GetY());
        if (Truth(ArrayLength(tile) == 11))
        {
            UO.WaitTargetTile(tile[2], tile[3], tile[4], tile[5]);
        }

        return null;
    }

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

コマンドの実装

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

UO.GetLandTileAt(x, y) — UO.GetLandTileAt(Any,Any)

引数: x (Any), y (Any)

結果: dynamic / Any.

呼び出し時:

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

public InjectionValue GetLandTileAt(InjectionValue x, InjectionValue y)

            => GetLandTileAt(x, y, new InjectionValue(bridge.WorldNumber));

UO.GetLandTileAt(x, y, map) — UO.GetLandTileAt(Any,Any,Any)

引数: x (Any), y (Any), map (Any)

結果: dynamic / Any.

呼び出し時:

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

public InjectionValue GetLandTileAt(InjectionValue x, InjectionValue y, InjectionValue map)

        {

            int cellX = NumberConversions.ToInt(x);

            int cellY = NumberConversions.ToInt(y);

            int world = NumberConversions.ToInt(map);

            int[] land = bridge.GetLandscapeTile(cellX, cellY, world) ?? Array.Empty<int>();

            return land.Length >= 2

                ? BuildWorldTileRecord("land", 0, land[0], cellX, cellY, land[1], 0, 0)

                : new InjectionValue(Array.Empty<InjectionValue>());

        }

UO.GetLandTileData

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

C# のシグネチャ

dynamic UO.GetLandTileData(object? tile);

タイルデータから拡張土地参照​​レコードを読み取ります。

引数

  • tile はグラフィック/type エントリであり、serial ではなく、セル内のインデックスでもありません。ランドテーブルはチーム名そのものによって選択されます。

戻り値

有効な graphic の 7 フィールドの配列。名前 (string) を除くすべてのフィールド int:

  • [0] graphic — graphic/type レコード。
  • [1] flags — 下位の32 フラグビット。
  • [2] name - タイルデータからの名前 (string)。
  • [3] texId - ID 地面テクスチャ。
  • [4] wet — ウェットが取り付けられている場合は 1、それ以外の場合は 0。
  • [5] impassable — 通行できない場合は 1、通行できない場合は 0。
  • [6] noDiagonal — noDiagonal の場合は 1、そうでない場合は 0。

無効な graphic の場合、参照プロパティはありません。短い配列 [переданный graphic, 0, ""] が返されます。プロパティを読む前に全長を確認してください。これは Pascal レコードやオブジェクトのリストではありません。

動作

  • このコマンドはタイルデータを読み取り、ワールド内にその graphic を持つアイテムを必要としません。フラグはリソースを説明します。この結果は、完全なルート チェックに代わるものではありません。

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

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

簡単な例

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

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

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

1。エントリ名の読み取り - 直接スクリプト

引数と実行の流れ:

  • タイルは、選択したテーブルの数値 graphic です。
  • data[2]には名前が含まれます。長さチェックにより、完全なエントリと無効な graphic の短いエントリが分離されます。
var data = UO.GetLandTileData(0x0003);
if (Truth(ArrayLength(data) == 7))
{
    UO.Print(data[2]);
}
else
{
    UO.Print("Tiledata entry is unavailable");
}

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

2。個々のブールフラグのチェック - スクリプト関数

引数と実行の流れ:

  • data[5] は別の通過不可能なフィールドです: 1 (条件が満たされた)、0 (条件が満たされていない)。
  • このチェックでは、セル内の他のオブジェクトやキャラクターの能力は考慮されません。
return  RunScenario();
 object? RunScenario()
{
    var data = UO.GetLandTileData(0x0003);
    if (Truth(ArrayLength(data) == 7))
    {
        if (Truth(data[5]))
        {
            UO.Print("Impassable flag is set");
        }
        else
        {
            UO.Print("Impassable flag is not set");
        }
    }

    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。 graphic と一般フラグマスクを出力します - スクリプトクラス

引数と実行の流れ:

  • data[0]は送信されたgraphicを繰り返し、data[1]は一般的なフラグマスクです。
  • マスクには同時に複数のビットを含めることができます。その数値はserialではありません。
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 data = UO.GetLandTileData(0x0003);
        if (Truth(ArrayLength(data) == 7))
        {
            UO.Print("Graphic: " + Convert.ToString(data[0]));
            UO.Print("Flags: " + Convert.ToString(data[1]));
        }

        return null;
    }

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

コマンドの実装

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

UO.GetLandTileData(tile) — UO.GetLandTileData(Any)

引数: tile (Any)

結果: dynamic / Any.

呼び出し時:

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

case "getlandtiledata":

                    return BuildTileData(0, Arg(0));

UO.GetLandTilesArray

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

C# のシグネチャ

dynamic UO.GetLandTilesArray(object? xmin, object? ymin, object? xmax, object? ymax, object? worldNum, object? tileType);

長方形内のgraphic/typeにある土地タイルを検索します。

引数

  • xmin — 2 つの角度の世界座標。 0..65535。再配置された角度は正規化されます。面積は 1 000 000 細胞以下。境界が無効であると、マップが読み取られる前にスクリプト エラーが発生します。
  • ymin — 2 つの角度の世界座標。 0..65535。再配置された角度は正規化されます。面積は 1 000 000 細胞以下。境界が無効であると、マップが読み取られる前にスクリプト エラーが発生します。
  • xmax — 2 つの角度の世界座標。 0..65535。再配置された角度は正規化されます。面積は 1 000 000 細胞以下。境界が無効であると、マップが読み取られる前にスクリプト エラーが発生します。
  • ymax — 2 つの角度の世界座標。 0..65535。再配置された角度は正規化されます。面積は 1 000 000 細胞以下。境界が無効であると、マップが読み取られる前にスクリプト エラーが発生します。
  • worldNum — マップ/ファセット 0..255; UO.WorldNum() を使用してください。別のマップでは空の配列が得られます。マップがチャンク間で変更される場合、部分的な結果は破棄されます。
  • tileType - 1 つの graphic/type タイル、通常は 0..65535;これはserialではありません。 0 は正確な graphic 0 であり、-1 は type を意味しません。 type が一致しない場合、結果は空白になります。

戻り値

Array of entries [graphic, X, Y, Z];すべてのフィールドは int です。 graphic — type of earth, Z — its base.一致するものはありません: 空の配列。数量は ArrayLength(結果) であり、結果そのものではありません。 The indices start with 0. This is not a bool, serial or Pascal record; there is no seventh output parameter.

動作

  • ローカルデータが読み取られます。検索では FindItem/FindCount は変更されず、移動、ターゲット、またはネットワーク コマンドは実行されません。
  • 順序: X の昇順、X - Y 以内の昇順。 1 つのセルの記録にはブリッジの順序が保存されます。距離や高さによって並べ替えられることはありません。
  • 検索は、約 1 ミリ秒のソフト バジェットで、最大 32 セルのチャンクで処理されます。キャンセルはサービングの間にチェックされます。複雑なセルまたはコールドリードは予算を超える可能性があります。広い領域を分割することをお勧めします。読んでいる間に世界が変わるかもしれません。

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

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

簡単な例

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

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

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

1。文字の近くを検索 - 直接スクリプト

引数と実行の流れ:

  • x/y — 位置 self、地図 — 現在の地図。領域3×3には境界が含まれます。 Ex では 2 つの type が送信され、通常の形式では 1 つになります。リソースに合わせてサンプルを変更します。これは ID オブジェクトではなく、graphic です。
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var rows = UO.GetLandTilesArray(x, y, x + 2, y + 2, map, 0x0003);
UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));

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

2。再配置された角度とすべてのフィールドの出力 - スクリプト関数

引数と実行の流れ:

  • 領域2×2は、大きい角度から小さい角度に移動されます。アルゴリズム自体が境界を正規化します。行 - 1 つのレコード。 PrintTile は全体が宣言されており、数値のみをフォーマットし、何も移動しません。 graphic - type、x/y - 座標、z - 高さ、hue - 色。土地の場合、条件付き hue=0 が渡されます。土地レコードにはカラー フィールドがありません。
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX();
    var y = UO.GetY();
    var map = UO.WorldNum();
    var rows = UO.GetLandTilesArray(x + 1, y + 1, x, y, map, 0x0003);
    var i = 0;
    while (Truth(i < ArrayLength(rows)))
    {
        var row = rows[i];
        PrintTile(row[0], row[1], row[2], row[3], 0);
        i = i + 1;
    }

    return null;
}

void PrintTile(dynamic graphic, dynamic x, dynamic y, dynamic z, dynamic hue)
{
    UO.Print("Type=" + Convert.ToString(graphic) + " X=" + Convert.ToString(x) + " Y=" + Convert.ToString(y));
    UO.Print("Z=" + Convert.ToString(z) + " hue=" + Convert.ToString(hue));
}

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。再試行制限付きの再ポーリング - スクリプト クラス

引数と実行の流れ:

  • 1 つのセルに対する検索は 3 回までです。試行間 WaitAsync(250)。呼び出しごとに新しい結果が作成されます。長さがゼロであることは、オブジェクトがサーバーから永久に欠落しているのではなく、一致するものが存在しないことを意味します。
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var x = UO.GetX();
        var y = UO.GetY();
        var map = UO.WorldNum();
        var attempt = 0;
        while (Truth(attempt < 3))
        {
            var rows = UO.GetLandTilesArray(x, y, x, y, map, 0x0003);
            UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));
            attempt = attempt + 1;
            await Delay(250);
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    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.GetLandTilesArray(xmin, ymin, xmax, ymax, worldNum, tileType) — UO.GetLandTilesArray(Any,Any,Any,Any,Any,Any)

引数: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileType (Any)

結果: dynamic / Any.

呼び出し時:

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

case "getlandtilesarray":

                    return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), new[] { Arg(5) }, false);

UO.GetLandTilesArrayEx

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

C# のシグネチャ

dynamic UO.GetLandTilesArrayEx(object? xmin, object? ymin, object? xmax, object? ymax, object? worldNum, object? tileTypes);

長方形内のgraphic/typeにある土地タイルを検索します。

引数

  • xmin — 2 つの角度の世界座標。 0..65535。再配置された角度は正規化されます。面積は 1 000 000 細胞以下。境界が無効であると、マップが読み取られる前にスクリプト エラーが発生します。
  • ymin — 2 つの角度の世界座標。 0..65535。再配置された角度は正規化されます。面積は 1 000 000 細胞以下。境界が無効であると、マップが読み取られる前にスクリプト エラーが発生します。
  • xmax — 2 つの角度の世界座標。 0..65535。再配置された角度は正規化されます。面積は 1 000 000 細胞以下。境界が無効であると、マップが読み取られる前にスクリプト エラーが発生します。
  • ymax — 2 つの角度の世界座標。 0..65535。再配置された角度は正規化されます。面積は 1 000 000 細胞以下。境界が無効であると、マップが読み取られる前にスクリプト エラーが発生します。
  • worldNum — マップ/ファセット 0..255; UO.WorldNum() を使用してください。別のマップでは空の配列が得られます。マップがチャンク間で変更される場合、部分的な結果は破棄されます。
  • tileTypes — 数値 graphic/type の配列;一致するそれぞれの type がオンになります。 type を繰り返してもエントリは重複しません。スカラーも 1 つの type として扱われます。空の配列はすべてを意味します type; 1 つの 0 の配列は 0 のみを検索します。

戻り値

Array of entries [graphic, X, Y, Z];すべてのフィールドは int です。 graphic — type of earth, Z — its base.一致するものはありません: 空の配列。数量は ArrayLength(結果) であり、結果そのものではありません。 The indices start with 0. This is not a bool, serial or Pascal record; there is no seventh output parameter.

動作

  • ローカルデータが読み取られます。検索では FindItem/FindCount は変更されず、移動、ターゲット、またはネットワーク コマンドは実行されません。
  • 順序: X の昇順、X - Y 以内の昇順。 1 つのセルの記録にはブリッジの順序が保存されます。距離や高さによって並べ替えられることはありません。
  • 検索は、約 1 ミリ秒のソフト バジェットで、最大 32 セルのチャンクで処理されます。キャンセルはサービングの間にチェックされます。複雑なセルまたはコールドリードは予算を超える可能性があります。広い領域を分割することをお勧めします。読んでいる間に世界が変わるかもしれません。

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

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

簡単な例

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

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

object? result = UO.GetLandTilesArrayEx(UO.X(), UO.Y(), UO.X() + 1, UO.Y() + 1, UO.WorldNum(), new[] { 0x0003 });
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1。文字の近くを検索 - 直接スクリプト

引数と実行の流れ:

  • x/y — 位置 self、地図 — 現在の地図。領域3×3には境界が含まれます。 Ex では 2 つの type が送信され、通常の形式では 1 つになります。リソースに合わせてサンプルを変更します。これは ID オブジェクトではなく、graphic です。
dynamic[] types = new dynamic[checked((int)(1) + 1)];
types[0] = 0x0003;
types[1] = 0x0004;
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var rows = UO.GetLandTilesArrayEx(x, y, x + 2, y + 2, map, types);
UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));

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

2。再配置された角度とすべてのフィールドの出力 - スクリプト関数

引数と実行の流れ:

  • 領域2×2は、大きい角度から小さい角度に移動されます。アルゴリズム自体が境界を正規化します。行 - 1 つのレコード。 PrintTile は全体が宣言されており、数値のみをフォーマットし、何も移動しません。 graphic - type、x/y - 座標、z - 高さ、hue - 色。土地の場合、条件付き hue=0 が渡されます。土地レコードにはカラー フィールドがありません。
return  RunScenario();
 object? RunScenario()
{
    dynamic[] types = new dynamic[checked((int)(1) + 1)];
    types[0] = 0x0003;
    types[1] = 0x0004;
    var x = UO.GetX();
    var y = UO.GetY();
    var map = UO.WorldNum();
    var rows = UO.GetLandTilesArrayEx(x + 1, y + 1, x, y, map, types);
    var i = 0;
    while (Truth(i < ArrayLength(rows)))
    {
        var row = rows[i];
        PrintTile(row[0], row[1], row[2], row[3], 0);
        i = i + 1;
    }

    return null;
}

void PrintTile(dynamic graphic, dynamic x, dynamic y, dynamic z, dynamic hue)
{
    UO.Print("Type=" + Convert.ToString(graphic) + " X=" + Convert.ToString(x) + " Y=" + Convert.ToString(y));
    UO.Print("Z=" + Convert.ToString(z) + " hue=" + Convert.ToString(hue));
}

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。再試行制限付きの再ポーリング - スクリプト クラス

引数と実行の流れ:

  • 1 つのセルに対する検索は 3 回までです。試行間 WaitAsync(250)。呼び出しごとに新しい結果が作成されます。長さがゼロであることは、オブジェクトがサーバーから永久に欠落しているのではなく、一致するものが存在しないことを意味します。
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        dynamic[] types = new dynamic[checked((int)(1) + 1)];
        types[0] = 0x0003;
        types[1] = 0x0004;
        var x = UO.GetX();
        var y = UO.GetY();
        var map = UO.WorldNum();
        var attempt = 0;
        while (Truth(attempt < 3))
        {
            var rows = UO.GetLandTilesArrayEx(x, y, x, y, map, types);
            UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));
            attempt = attempt + 1;
            await Delay(250);
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    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.GetLandTilesArrayEx(xmin, ymin, xmax, ymax, worldNum, tileTypes) — UO.GetLandTilesArrayEx(Any,Any,Any,Any,Any,Any)

引数: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileTypes (Any)

結果: dynamic / Any.

呼び出し時:

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

case "getlandtilesarrayex":

                    return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), ArrayArg(5), false);

UO.GetLandscapeTile

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

C# のシグネチャ

dynamic UO.GetLandscapeTile(object? x, object? y, object? map);

現在のカードの 1 つのセルのランドを読み取ります。

引数

  • x — 現在ロードされているマップの X セル。ガンプ内の位置ではなく、世界座標。
  • y — 現在ロードされているマップの Y セル。ガンプ内の位置ではなく、世界座標。
  • map — カード番号。この引数が選択したフォームに存在しない場合は、現在のマップが使用されます。実際のクライアントは、現在ロードされているマップからタイルを読み取るだけです。

戻り値

3 つの int の配列: [0] graphic - type ランド。 [1] z — 地球の世界高度。 [2] flags — タイルデータ フラグの下位 32 ビット。カード/タイルが利用できない場合、または土地がない場合は、空の配列 [] が返されます。これはフラットなレコードであり、3 つのタイルのリストではありません。

動作

  • データは現在ロードされているマップを参照します。別のカードまたは到達不能なセルがあると、空の配列になります。直接タイル クエリでは、さらにマップの不一致が報告される場合があります。 GetWorldCell と GetWorldTilesArray は、そのようなメッセージを表示せずに、すぐに空の配列を返します。
  • 配列インデックスは 0 で始まります。フィールドを読み取る前に、ArrayLength を確認してください。 Z は世界高度を表します。 Layer はタイルデータからの機器プロパティ、index はセル エントリのシリアル番号です。

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

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

簡単な例

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

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

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

1。キャラクターの下の地面を表示 - 直接スクリプト

引数と実行の流れ:

  • x/y はキャラクターの位置から取得されます。 map=WorldNum() は現在のマップを選択します。
  • インデックス付けの前に、3 つのフィールドの存在がチェックされます。土地[0] - graphic、土地[1] - Z。
var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
if (Truth(ArrayLength(land) >= 3))
{
    UO.Print("Graphic: " + Convert.ToString(land[0]));
    UO.Print("Ground Z: " + Convert.ToString(land[1]));
}
else
{
    UO.Print("Land is unavailable");
}

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

2。隣接するセルの高さを比較する - スクリプト関数

引数と実行の流れ:

  • x+1 は隣接するセルで、y とマップは保存されます。
  • deltaZは土地と性格を比較します。これは合格可能性テストではありません。ブリッジと静電気は別々にカウントされます。
return  RunScenario();
 object? RunScenario()
{
    var land = UO.GetLandscapeTile(UO.GetX() + 1, UO.GetY(), UO.WorldNum());
    if (Truth(ArrayLength(land) >= 3))
    {
        var deltaZ = land[1] - UO.GetZ();
        UO.Print("Ground height difference: " + Convert.ToString(deltaZ));
    }

    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。見つけた土地の名前を読む - シナリオクラス

引数と実行の流れ:

  • group=0 は土地を選択します。土地[0] — graphic。
  • GetTileName はテキストを返しますが、GetLandscapeTile は配列を返します。
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 land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
        if (Truth(ArrayLength(land) >= 3))
        {
            var name = UO.GetTileName(0, land[0]);
            UO.Print(name);
        }

        return null;
    }

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

コマンドの実装

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

UO.GetLandscapeTile(x, y, map) — UO.GetLandscapeTile(Any,Any,Any)

引数: x (Any), y (Any), map (Any)

結果: dynamic / Any.

呼び出し時:

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

public InjectionValue GetLandscapeTile(InjectionValue x, InjectionValue y, InjectionValue map)

            => ToArray(bridge.GetLandscapeTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map)));

UO.GetLayerCount

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

C# のシグネチャ

dynamic UO.GetLayerCount(object? x, object? y, object? worldNum);

1 つのセル内の地球以外のジオメトリ レコードをカウントします。

引数

  • x — ガンプ内の位置ではなく、現在のマップのセルの世界座標 X。
  • y — 現在のマップ セルのワールド Y 座標。
  • worldNum — カード/ファセット番号。 UO.WorldNum() を使用してください。現在ロードされているカードのみが読み取られます。

戻り値

int — GetStaticTiles が受信したトリプル graphic/Z/hue の数。現在のクライアントでは、Static、Multi、Item が考慮されます。同じ高さの複数のレコードは個別にカウントされます。空のマス/別のカードは 0 を与えます。これは、機器の階層数、フロア数、固有の高さの数、または bool ではありません。

動作

  • このコマンドはローカル マップを読み取りますが、移動やターゲットをトリガーしません。マップのサイズ外のセルは、隣接する列のセルに置き換えられません。
  • Z、graphic/typeの高さ、hueの色、旗、装備レイヤーはそれぞれ意味が異なります。 Null graphic または Z=0 は有効なデータである可能性があります。結果フォームを確認してください。
  • この組成は、GetLayer や ObjAtLayer ではなく、ReadStaticsXY に対応します。このクライアントには、動的アイテムとマルチパーツが含まれています。

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

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

簡単な例

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

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

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

1。文字の下のレコードを数える - 直接スクリプト

引数と実行の流れ:

  • count — セルレコードの数。 1 は 1 つのエントリを意味し、論理的な成功ではありません。
var count = UO.GetLayerCount(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print("Tile records: " + Convert.ToString(count));

2。隣接セルのチェック - スクリプト関数

引数と実行の流れ:

  • 記録がないからといって土地の通行を証明することはできません。録音の存在も、それが壁であることを証明するものではありません。
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX() + 1;
    var y = UO.GetY();
    var count = UO.GetLayerCount(x, y, UO.WorldNum());
    if (Truth(count > 0))
    {
        UO.Print("Non-land geometry exists: " + Convert.ToString(count));
    }
    else
    {
        UO.Print("No loaded non-land records");
    }

    return null;
}

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

3。 2 つのマップ レイヤーの内容を比較する - スクリプト クラス

引数と実行の流れ:

  • 同じワールド内の現在のセルと隣接するセルがチェックされます。レイヤーの数は、その高さやgraphicではありません。
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()
    {
        int x = UO.GetX();
        int y = UO.GetY();
        int world = UO.WorldNum();
        int land = UO.GetLayerCount(x, y, world);
        int nearby = UO.GetLayerCount(x + 1, y, world);
        UO.Print($"Layers here: {land}; adjacent tile: {nearby}");
        return null;
    }
}

コマンドの実装

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

UO.GetLayerCount(x, y, worldNum) — UO.GetLayerCount(Any,Any,Any)

引数: x (Any), y (Any), worldNum (Any)

結果: dynamic / Any.

呼び出し時:

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

case "getlayercount":

                    // Stealth's deprecated GetLayerCount(X,Y,WorldNum) is the

                    // number of static records at a map cell.  The portable

                    // bridge returns each record as Graphic/Z/Hue triples.

                    return new InjectionValue(bridge.GetStaticTiles(Arg(0), Arg(1), Arg(2)).Length / 3);

UO.GetMapCell

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

C# のシグネチャ

dynamic UO.GetMapCell(object? x, object? y, object? worldNum);

1 つのマップ スクエア内のgraphic、高さ、および土地フラグを読み取ります。

引数

  • x — ガンプ内の位置ではなく、現在のマップのセルの世界座標 X。
  • y — 現在のマップ セルのワールド Y 座標。
  • worldNum — カード/ファセット番号。 UO.WorldNum() を使用してください。現在ロードされているカードのみが読み取られます。

戻り値

3 つの int の配列: [0] graphic/type ランド、[1] ワールド Z ベース ランド、タイルデータ フラグの [2] マイナー 32 ビット。アクセスできないセルまたは他のカードがあると、空の配列になります。これは、serial、bool、または Pascal のレコードではありません。 .Tile/.Z フィールドは使用しないでください。フィールドの数については、ArrayLength(セル)を呼び出します。

動作

  • このコマンドはローカル マップを読み取りますが、移動やターゲットをトリガーしません。マップのサイズ外のセルは、隣接する列のセルに置き換えられません。
  • Z、graphic/typeの高さ、hueの色、旗、装備レイヤーはそれぞれ意味が異なります。 Null graphic または Z=0 は有効なデータである可能性があります。結果フォームを確認してください。

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

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

簡単な例

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

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

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

1。キャラクターの下の地面を読む - 直接スクリプト

引数と実行の流れ:

  • X/Y は self から取得され、WorldNum が現在のカードです。 cell には 1 回の呼び出しのすべてのフィールドが格納されます。
  • インデックスは 0 で始まります。 cell[1] は高さであり、検索が成功したことを示すものではありません。空の配列はインデックス付けの前にチェックされます。
var cell = UO.GetMapCell(UO.GetX(), UO.GetY(), UO.WorldNum());
if (Truth(ArrayLength(cell) == 3))
{
    UO.Print("Type: " + Convert.ToString(cell[0]));
    UO.Print("Land Z: " + Convert.ToString(cell[1]));
    UO.Print("Flags: " + Convert.ToString(cell[2]));
}
else
{
    UO.Print("Map cell unavailable");
}

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

2。 2 つの隣接するセルを比較 - スクリプト関数

引数と実行の流れ:

  • 2 回目のコールでは、どちらも同じカードを使用して東の広場を読み取ります。
  • 地面の高さの違いは通行可能であることを証明するものではありません。壁、静電気、その他の物体は個別にチェックされます。
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX();
    var y = UO.GetY();
    var map = UO.WorldNum();
    var here = UO.GetMapCell(x, y, map);
    var east = UO.GetMapCell(x + 1, y, map);
    if (Truth(ArrayLength(here) == 3) && Truth(ArrayLength(east) == 3))
    {
        UO.Print("Land difference: " + Convert.ToString(east[1] - here[1]));
    }

    return null;
}

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

3。地球の底面と平均的な表面を比較する - スクリプト クラス

引数と実行の流れ:

  • GetMapCell は Land.Z を読み取ります。 GetSurfaceZ は Land.AverageZ を読み取ります。
  • どちらの値も高さです。傾斜地では異なる場合があります。これは家の床の高さではありません。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var x = UO.GetX();
        var y = UO.GetY();
        var map = UO.WorldNum();
        var cell = UO.GetMapCell(x, y, map);
        if (Truth(ArrayLength(cell) == 3))
        {
            var average = UO.GetSurfaceZ(x, y, map);
            UO.Print("Base: " + Convert.ToString(cell[1]) + ", average: " + Convert.ToString(average));
        }

        return null;
    }

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

コマンドの実装

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

UO.GetMapCell(x, y, worldNum) — UO.GetMapCell(Any,Any,Any)

引数: x (Any), y (Any), worldNum (Any)

結果: dynamic / Any.

呼び出し時:

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

case "getmapcell":

                    return new InjectionValue(bridge.GetLandscapeTile(Arg(0), Arg(1), Arg(2))

                        .Select(value => new InjectionValue(value)).ToArray());

UO.GetNextStepZ

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

C# のシグネチャ

int UO.GetNextStepZ(object? currX, object? currY, object? destX, object? destY, object? worldNum, object? currZ);

指定された方向の次のステップの推定高さを計算します。

引数

  • currX — 初期ワールド X、通常は UO.GetX()。
  • currY — 初期ワールド Y、通常は UO.GetY()。
  • destX — X の目的地。特定のステップを確認するには、隣接するセルを通過します。
  • destY — Y の宛先。 DestX と組み合わせて、完全なルートではなく 1 つのステップの方向を設定します。
  • worldNum — カード/ファセット番号。 UO.WorldNum() を使用してください。現在ロードされているカードのみが読み取られます。
  • currZ — 初期の高さ Z、通常は UO.GetZ();幾何学的計算では、範囲 -128..127 が使用されます。

戻り値

int — 次のステップの計算された Z。 0 と負の数値は有効な高さです。キャラクターまたは他のカード0が無効化された場合。このメソッドは、チェックが失敗した場合でも、チェックの Z コンポーネントを返します。番号自体は通過を確認するものではありません。フラグと高さを合わせて指定するには、IsWorldCellPassable を使用し、[0]/[1] を読み取ります。

動作

  • このコマンドはローカル マップを読み取りますが、移動やターゲットをトリガーしません。マップのサイズ外のセルは、隣接する列のセルに置き換えられません。
  • Z、graphic/typeの高さ、hueの色、旗、装備レイヤーはそれぞれ意味が異なります。 Null graphic または Z=0 は有効なデータである可能性があります。結果フォームを確認してください。
  • 計算は一歩も進まず、ドアも開きません。ローカルのジオメトリをチェックします。サーバーが実際の動きを拒否する可能性があります。ブリッジが Z を返さない場合は、CurrZ が使用されます。

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

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

簡単な例

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

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

var result = UO.GetNextStepZ(UO.GetX(), UO.GetY(), UO.GetX() + 1, UO.GetY(), UO.WorldNum(), UO.GetZ());
UO.Print("GetNextStepZ: " + Convert.ToString(result));

1。東側の階段の推定高さを調べる - 直接スクリプト

引数と実行の流れ:

  • 6 つのパラメータ: 元の X/Y、隣接する X/Y、マップおよび元の Z。 nextZ - 高さ、true/false ではありません。
var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
var nextZ = UO.GetNextStepZ(x, y, x + 1, y, UO.WorldNum(), z);
UO.Print("Candidate Z: " + Convert.ToString(nextZ));

2。真の高度からの分離旅行 0 - スクリプト関数

引数と実行の流れ:

  • 通話は、既知の接続がある場合にのみ行われます。チェックと読み取りの間に接続が失われる可能性があります。 Z=0 はまだ成功コードではありません。
return  RunScenario();
 object? RunScenario()
{
    if (Truth(Truth(UO.Connected()) == true))
    {
        var x = UO.GetX();
        var y = UO.GetY();
        var z = UO.GetNextStepZ(x, y, x, y + 1, UO.WorldNum(), UO.GetZ());
        UO.Print("South candidate Z: " + Convert.ToString(z));
    }
    else
    {
        UO.Print("Character disconnected");
    }

    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。現在の高さから次のステップを確認する - スクリプトクラス

引数と実行の流れ:

  • ソースセルとターゲットセルの座標は別々に送信されます。結果は、障害物があっても期待どおりの高さになります。パスフラグは別途IsWorldCellPassableを与えます。
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()
    {
        int x = UO.GetX();
        int y = UO.GetY();
        int z = UO.GetZ();
        int nextZ = UO.GetNextStepZ(x, y, x + 1, y, UO.WorldNum(), z);
        UO.Print($"Current height: {z}; next-step result: {nextZ}");
        return null;
    }
}

コマンドの実装

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

UO.GetNextStepZ(currX, currY, destX, destY, worldNum, currZ) — UO.GetNextStepZ(Any,Any,Any,Any,Any,Any)

引数: currX (Any), currY (Any), destX (Any), destY (Any), worldNum (Any), currZ (Any)

結果: int / Integer.

呼び出し時:

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

case "getnextstepz":

                {

                    if (bridge.IsOnline() == 0 || Arg(4) != bridge.WorldNumber)

                        return new InjectionValue(0);

                    int[] step = bridge.CheckWorldStep(Arg(0), Arg(1), Arg(5), Arg(2), Arg(3), Arg(4));

                    return new InjectionValue(step.Length > 1 ? step[1] : Arg(5));

                }

UO.GetStaticArt

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

C# のシグネチャ

dynamic UO.GetStaticArt(object? objType, object? hue);

インストールされている Ultima Online グラフィック ファイルから 1 つのグラフィック イメージを取得し、それを BMP 形式でメモリに返します。ゲーム リソース、アイコン サイズの確認、ピクセル カラーの読み取り、アイテムのカラー バージョンの比較に役立ちます。コマンド自体は、ウィンドウを開いたり、ファイルを保存したり、ワールド内のアイテムを検索したりしません。

引数

  • objType — 静的アートセクションの必須グラフィック/type: 整数 0..65535、その番号を含む文字列、または保存された名前 AddType。たとえば、0x0EED は金の山のアートです。これはアイテムのserial、マップ/タイル座標、またはボディアニメーション番号ではありません。ロードされたアイテムのアートを取得するには、UO.GetType(item) を渡します。ここで、アイテムはその serial です。数値 type が範囲外の場合、結果は空の配列になります。不明な文字列名は変換エラーを引き起こします。
  • hue — 必須の整数カラー値: 0 — アートの元の色。正の値はクライアント ファイルからの hue です。結果 UO.GetColor(item) を含む数値文字列を使用できます。値は 0..65535 の範囲に制限されます。負の場合は 0 になり、大きすぎる場合は 65535 になります。ここで、-1 は色を意味するものではありません。 PartialHueのフラッグアートは部分的にカラーリングを使用しています。他の人にとっては - 完了です。特定の hue の結果は、ロードされたカラー テーブルによって異なります。

戻り値

配列は 1 次元配列 int で、各要素 0..255 は、ヘッダーから始まる完全な BMP ファイルの 1 バイトを表します。 0 によるインデックス作成。これは、bool、ID、パス、ビットマップ オブジェクト、およびカラー配列 RGB ではありません。空の配列は、数値 type が無効であるか、アートが欠落しているか、必要なゲーム ファイルがロードされていないことを意味します。タイトルを読む前にArrayLengthをご確認ください。空の配列は数値 0 と等しくありません。

動作

  • 引数は 2 つだけ必要です。読み取りは、サーバーへのリクエストを行わずに、クライアントのローカル リソースから実行されます。世界にオブジェクトが存在する必要はありません。 mobile の場合、GetType の番号は body を意味します。ここでは、同じ番号が別のリソース セクションを指しており、キャラクター アニメーションのイメージは提供されていません。
  • 結果の形式: 非圧縮 24 ビット BMP。バイト [0]=66 および [1]=77 - BM; [2..5] - ファイル全体のサイズ。 [10..13] - ピクセルの始まり、今は54; [14..17] - DIB ヘッダーのサイズ、現在は 40; [18..21] - 幅; [22..25] - 正の高さ。 [26..27] - 1 飛行機; [28..29] - 24 ビット。マルチバイト数値はリトルエンディアンで書き込まれます。
  • 各ピクセルは B、G、R の順で 3 バイトを占めます。ラインは下から上に進み、4 の倍数までゼロ バイトが埋め込まれます。文字列の長さ = Int((幅 * 3 + 3) / 4) * 4。左上隅からの X、Y 座標の場合、オフセット = 54 + (高さ - 1 - y) * ストライド + x * 3。アクセスする前に配列の境界とサイズを確認してください。
  • 元のアートの透明度は保持されません。ここでは、BMP にはアルファが含まれません。透明な背景が黒くなり、元の黒ピクセルと区別できなくなります。スクリーンショット、ゲーム ウィンドウのスケーリング、ライト、可視範囲、オブジェクトの座標は関係ありません。
  • 呼び出しごとに、画像配列が生成されます。アートが何度も必要な場合は、結果を変数に保存し、再度処理します。ループ内のすべてのピクセルに対して読み込み/色付けを呼び出さないでください。同じパラメータと変更されていないファイルでは、同じ結果が得られます。異なる hue は、特に PartialHue の場合、すべてのピクセルを変更する必要はありません。
  • 実際の .bmp では、テキスト エンコードを行わずに正確なバイトのバイナリ出力が必要です。通常の File.WriteLine または JsonSave は BMP を作成しません。以下の例はメモリ内の配列を処理し、存在しないファイルの存在を保証するものではありません。WriteBytes。

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

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

簡単な例

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

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

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

1。自分で処理する前にアイコンのサイズを確認する - 直接スクリプト

引数と実行の流れ:

  • ObjType=0x0EED はリソースを選択し、Hue=0 は元の色を残します。配列は、オフセット 18 および 22 を読み取る前にチェックされます。 64 はコマンドの制限ではなく、サンプル自体の制限です。
  • ArtSizeField はユーザー定義関数 C# であり、UO コマンドではありません。重み 1、256、65536、16777216 を含む 4 バイトを追加します。このスクリプトは、セルのサイズを選択するのに役立ちます。ガンプは自動的には作成されません。
var bmp = UO.GetStaticArt(0x0EED, 0);
if (Truth(ArrayLength(bmp) < 54))
{
    UO.Print("Gold art is unavailable");
    return null;
}
var width = ArtSizeField(bmp, 18);
var height = ArtSizeField(bmp, 22);
if (Truth(width > 64) || Truth(height > 64))
{
    UO.Print("Use a larger cell for this icon");
    return null;
}
UO.Print("Icon fits: " + Convert.ToString(width) + " x " + Convert.ToString(height));

dynamic ArtSizeField(dynamic bytes, dynamic offset)
{
    return bytes[offset] + bytes[offset+1]*256 + bytes[offset+2]*65536 + bytes[offset+3]*16777216;
}

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

2。反転ラインBMPを考慮してピクセルのRGBを計算する - スクリプト関数

引数と実行の流れ:

  • GetStaticArt は BMP を返します。 ArtPixelRGB は、この形式の別の関数例です。 x=0,y=0 は、世界座標ではなく、画像の左上のピクセルを意味します。線の順序が下から上にあるため、置換高さ-1-yが必要です。
  • この関数は RGB int 0..16777215 を返し、 -1 はピクセルが存在しないことを示す指標としてのみ使用されます。黒 0 は有効な色ですが、false ではなく、エラーではありません。したがって、rgb < 0 の場合のテストは、rgb = 0 の場合とは別のものになります。
return  RunScenario();
 object? RunScenario()
{
    var bmp = UO.GetStaticArt(0x0EED, 0);
    var rgb = ArtPixelRGB(bmp, 0, 0);
    if (Truth(rgb < 0))
    {
        UO.Print("No pixel at this position");
        return null;
    }

    if (Truth(rgb == 0))
    {
        UO.Print("Black pixel: may also be the original transparent background");
    }

    return null;
}

dynamic ArtPixelRGB(dynamic bmp, dynamic x, dynamic y)
{
    if (Truth(ArrayLength(bmp) < 54))
    {
        return -1;
    }

    var width = bmp[18] + bmp[19] * 256 + bmp[20] * 65536 + bmp[21] * 16777216;
    var height = bmp[22] + bmp[23] * 256 + bmp[24] * 65536 + bmp[25] * 16777216;
    if (Truth(x < 0) || Truth(y < 0) || Truth(x >= width) || Truth(y >= height))
    {
        return -1;
    }

    var stride = Math.Floor((width * 3 + 3) / 4) * 4;
    var offset = 54 + (height - 1 - y) * stride + x * 3;
    if (Truth(offset + 2 >= ArrayLength(bmp)))
    {
        return -1;
    }

    return bmp[offset + 2] * 65536 + bmp[offset + 1] * 256 + bmp[offset];
}

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。同じアートのオリジナル バージョンとカラー バージョンを比較する - スクリプト クラス

引数と実行の流れ:

  • 0x1F03 — グラフィックローブ。 0 と 0x0044 はオリジナルであり、選択された hue です。同じグラフィックは同じ寸法を与えます。結果が空の場合、比較は開始されません。
  • 変更された場合は、オブジェクトやピクセル数ではなく、カラー チャネルのさまざまなバイトをカウントします。 1 つのピクセルは最大 3 バイトまで変更できます。 PartialHue、カラーテーブルと元の色は、画像の一部または全体が同じままになる場合があります。これはチームのミスの証拠ではありません。
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 original = UO.GetStaticArt(0x1F03, 0);
        var colored = UO.GetStaticArt(0x1F03, 0x0044);
        var size = ArrayLength(original);
        if (Truth(size < 54) || Truth(size != ArrayLength(colored)))
        {
            UO.Print("Cannot compare these art resources");
            return null;
        }

        var changed = 0;
        for (int offset = (int)(54); offset <= size - 1; offset += (int)(1))
        {
            if (Truth(original[offset] != colored[offset]))
            {
                changed = changed + 1;
            }
        }

        if (Truth(changed == 0))
        {
            UO.Print("This hue did not change the exported bytes");
        }
        else
        {
            UO.Print("Changed color bytes: " + Convert.ToString(changed));
        }

        return null;
    }

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

コマンドの実装

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

UO.GetStaticArt(objType, hue) — UO.GetStaticArt(Any,Any)

引数: objType (Any), hue (Any)

結果: dynamic / Any.

呼び出し時:

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

case "getstaticart":

                    return new InjectionValue(bridge.GetStaticArt(ResolveType(arguments[0]), Arg(1)).Select(value => new InjectionValue(value)).ToArray());

UO.GetStaticTileAt

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

C# のシグネチャ

dynamic UO.GetStaticTileAt(object? x, object? y, object? index);
dynamic UO.GetStaticTileAt(object? x, object? y, object? map, object? index);

選択したセルの地上 1 レコードの拡張レコードを返します。

引数

  • x — 現在ロードされているマップの X セル。ガンプ内の位置ではなく、世界座標。
  • y — 現在ロードされているマップの Y セル。ガンプ内の位置ではなく、世界座標。
  • map — カード番号。この引数が選択したフォームに存在しない場合は、現在のマップが使用されます。実際のクライアントは、現在ロードされているマップからタイルを読み取るだけです。
  • index — 結果 GetStaticTiles のレコードのシーケンス番号 (0 で始まる)。これは graphic ではなく、Z ではなく、また機器の層でもありません。 3 引数の形式では、インデックスが 3 番目になります。 4 の形式で、引数は 3 番目にマップされ、4 番目にインデックスが付けられます。

戻り値

1 つのレコードの 11 フィールドの配列。インデックスは 0 で始まります:

  • [0] kind — string: 「ランド」、「静的」、または「object」。
  • [1] serial - int: serial 動的アイテム。陸上/静的の場合は 0 です。
  • [2] graphic - int: type グラフィックス。
  • [3] x、[4] y - int: セルの世界座標。
  • [5] z - int: ワールドのベースの高さ。
  • [6] hue - int: 地面 0 に近い色。
  • [7] flags - int: タイルデータ フラグの下位 32 ビット。
  • [8] name - string: タイルデータからの名前。
  • [9] layer - int: タイルデータからの機器のレイヤー、地面 0 の近く。静的インデックスではありません。
  • [10] height - int: タイルデータからの高さ graphic、地面 0 付近。座標Zではありません。

空の配列 [] は、エントリがない、またはアクセスできないカード/セルを意味します。 GetStaticTileAt の場合、負のインデックスまたは大きすぎるインデックスは [] も生成します。インデックス オーバーフローでは、他の人のエントリは選択されません。

動作

  • データは現在ロードされているマップを参照します。別のカードまたは到達不能なセルがあると、空の配列になります。直接タイル クエリでは、さらにマップの不一致が報告される場合があります。 GetWorldCell と GetWorldTilesArray は、そのようなメッセージを表示せずに、すぐに空の配列を返します。
  • 配列インデックスは 0 で始まります。フィールドを読み取る前に、ArrayLength を確認してください。 Z は世界高度を表します。 Layer はタイルデータからの機器プロパティ、index はセル エントリのシリアル番号です。

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

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

簡単な例

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

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

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

1。 type、Z とレイヤーを個別に読み取る - 直接スクリプト

引数と実行の流れ:

  • x/y — 文字の位置。カードが下げられ、自動的に選択されます。 GetStaticTileAtの場合、index=0は最初のエントリを意味します。
  • フィールド [2]、[5]、[9] は異なる意味を持っています。 11 の長さを確認した後、すべて読み取り専用になります。
var tile = UO.GetStaticTileAt(UO.GetX(), UO.GetY(), 0);
if (Truth(ArrayLength(tile) == 11))
{
    UO.Print("Type: " + Convert.ToString(tile[2]));
    UO.Print("World Z: " + Convert.ToString(tile[5]));
    UO.Print("Equipment layer: " + Convert.ToString(tile[9]));
}
else
{
    UO.Print("Tile is unavailable");
}

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

2。名前と身長を取得 graphic - スクリプト関数

引数と実行の流れ:

  • 同じ座標が使用されます。 GetStaticTileAt はインデックス=0 を読み取ります。
  • tile[8] は名前文字列、tile[10] は Z ベースではなく、タイルデータからの高さの寸法です。
return  RunScenario();
 object? RunScenario()
{
    var tile = UO.GetStaticTileAt(UO.GetX(), UO.GetY(), 0);
    if (Truth(ArrayLength(tile) == 11))
    {
        UO.Print(tile[8]);
        UO.Print("Graphic height: " + Convert.ToString(tile[10]));
    }

    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。 typeと座標によるターゲットの準備 - シナリオクラス

引数と実行の流れ:

  • WaitTargetTile は、2…5 フィールドから graphic、x、y、z を受け取ります。
  • これは次のターゲットへの準備にすぎません。この例では、ツールや呪文はトリガーされません。静的な値の serial=0 をアイテムの 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 tile = UO.GetStaticTileAt(UO.GetX(), UO.GetY(), 0);
        if (Truth(ArrayLength(tile) == 11))
        {
            UO.WaitTargetTile(tile[2], tile[3], tile[4], tile[5]);
        }

        return null;
    }

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

コマンドの実装

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

UO.GetStaticTileAt(x, y, index) — UO.GetStaticTileAt(Any,Any,Any)

引数: x (Any), y (Any), index (Any)

結果: dynamic / Any.

呼び出し時:

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

public InjectionValue GetStaticTileAt(InjectionValue x, InjectionValue y, InjectionValue index)

            => GetStaticTileAt(x, y, new InjectionValue(bridge.WorldNumber), index);

UO.GetStaticTileAt(x, y, map, index) — UO.GetStaticTileAt(Any,Any,Any,Any)

引数: x (Any), y (Any), map (Any), index (Any)

結果: dynamic / Any.

呼び出し時:

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

public InjectionValue GetStaticTileAt(InjectionValue x, InjectionValue y, InjectionValue map, InjectionValue index)

        {

            int cellX = NumberConversions.ToInt(x);

            int cellY = NumberConversions.ToInt(y);

            int[] statics = bridge.GetStaticTiles(cellX, cellY, NumberConversions.ToInt(map)) ?? Array.Empty<int>();

            int tileIndex = NumberConversions.ToInt(index);

            if (tileIndex < 0 || tileIndex >= statics.Length / 3)

                return new InjectionValue(Array.Empty<InjectionValue>());

            int offset = tileIndex * 3;

            return offset + 2 < statics.Length

                ? BuildWorldTileRecord("static", 0, statics[offset], cellX, cellY, statics[offset + 1], statics[offset + 2], 1)

                : new InjectionValue(Array.Empty<InjectionValue>());

        }

UO.GetStaticTileData

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

C# のシグネチャ

dynamic UO.GetStaticTileData(object? tile);

タイルデータから静的拡張参照エントリ graphic を読み取ります。

引数

  • tile はグラフィック/type エントリであり、serial ではなく、セル内のインデックスでもありません。静的テーブルはコマンド名自体によって選択されます。

戻り値

有効な graphic の 17 フィールドの配列。名前 (string) を除くすべてのフィールド int:

  • [0] graphic — graphic/type レコード。
  • [1] flags — 下位の32 フラグビット。
  • [2] name - タイルデータからの名前 (string)。
  • [3] weight — タイルデータからの重み。
  • [4] layer — 機器レイヤー番号。
  • [5] count は、タイルデータの Count フィールドであり、ワールド内のアイテムの数ではありません。
  • [6] animId - ID アニメーション。
  • [7] hue — タイルデータからの hue。
  • [8] lightIndex — 光源のインデックス。
  • [9] height — 高さ graphic、ワールド高さ Z ではありません。
  • [10] wet — ウェットが取り付けられている場合は 1、それ以外の場合は 0。
  • [11] impassable — 通行できない場合は 1、通行できない場合は 0。
  • [12] surface — 表面の場合は 1、そうでない場合は 0。
  • [13] foliage — 葉の場合は 1、そうでない場合は 0。
  • [14] door — ドアの場合は 1、それ以外の場合は 0。
  • [15] wall — 壁の場合は 1、そうでない場合は 0。
  • [16] container — コンテナの場合は 1、そうでない場合は 0。

無効な graphic の場合、参照プロパティはありません。短い配列 [переданный graphic, 0, ""] が返されます。プロパティを読む前に全長を確認してください。これは Pascal レコードやオブジェクトのリストではありません。

動作

  • このコマンドはタイルデータを読み取り、ワールド内にその graphic を持つアイテムを必要としません。フラグはリソースを説明します。この結果は、完全なルート チェックに代わるものではありません。

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

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

簡単な例

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

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

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

1。エントリ名の読み取り - 直接スクリプト

引数と実行の流れ:

  • タイルは、選択したテーブルの数値 graphic です。
  • data[2]には名前が含まれます。長さチェックにより、完全なエントリと無効な graphic の短いエントリが分離されます。
var data = UO.GetStaticTileData(0x0CCA);
if (Truth(ArrayLength(data) == 17))
{
    UO.Print(data[2]);
}
else
{
    UO.Print("Tiledata entry is unavailable");
}

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

2。個々のブールフラグのチェック - スクリプト関数

引数と実行の流れ:

  • data[11] は別の通過不可能なフィールドです: 1 (条件が満たされた)、0 (条件が満たされていない)。
  • このチェックでは、セル内の他のオブジェクトやキャラクターの能力は考慮されません。
return  RunScenario();
 object? RunScenario()
{
    var data = UO.GetStaticTileData(0x0CCA);
    if (Truth(ArrayLength(data) == 17))
    {
        if (Truth(data[11]))
        {
            UO.Print("Impassable flag is set");
        }
        else
        {
            UO.Print("Impassable flag is not set");
        }
    }

    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。 graphic と一般フラグマスクを出力します - スクリプトクラス

引数と実行の流れ:

  • data[0]は送信されたgraphicを繰り返し、data[1]は一般的なフラグマスクです。
  • マスクには同時に複数のビットを含めることができます。その数値はserialではありません。
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 data = UO.GetStaticTileData(0x0CCA);
        if (Truth(ArrayLength(data) == 17))
        {
            UO.Print("Graphic: " + Convert.ToString(data[0]));
            UO.Print("Flags: " + Convert.ToString(data[1]));
        }

        return null;
    }

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

コマンドの実装

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

UO.GetStaticTileData(tile) — UO.GetStaticTileData(Any)

引数: tile (Any)

結果: dynamic / Any.

呼び出し時:

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

case "getstatictiledata":

                    return BuildTileData(1, Arg(0));

UO.GetStaticTiles

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

C# のシグネチャ

dynamic UO.GetStaticTiles(object? x, object? y, object? map);

現在のマップの 1 つのセルの地上のエントリを読み取ります。

引数

  • x — 現在ロードされているマップの X セル。ガンプ内の位置ではなく、世界座標。
  • y — 現在ロードされているマップの Y セル。ガンプ内の位置ではなく、世界座標。
  • map — カード番号。この引数が選択したフォームに存在しない場合は、現在のマップが使用されます。実際のクライアントは、現在ロードされているマップからタイルを読み取るだけです。

戻り値

配列は、int-トリプル [graphic0, z0, hue0, graphic1, z1, hue1, …] のフラットなシーケンスです。エントリの数は配列の長さ / 3 と同じです。 i 表記の場合、graphic は [i*3] に、Z は [i*3+1] に、hue は [i*3+2] にあります。空の配列は、エントリがない、またはアクセスできないカード/セルを意味します。ここではシリアル番号とレイヤー番号は返されません。

動作

  • データは現在ロードされているマップを参照します。別のカードまたは到達不能なセルがあると、空の配列になります。直接タイル クエリでは、さらにマップの不一致が報告される場合があります。 GetWorldCell と GetWorldTilesArray は、そのようなメッセージを表示せずに、すぐに空の配列を返します。
  • 配列インデックスは 0 で始まります。フィールドを読み取る前に、ArrayLength を確認してください。 Z は世界高度を表します。 Layer はタイルデータからの機器プロパティ、index はセル エントリのシリアル番号です。
  • 現在のブリッジには、セル チェーン内の静的アイテム、マルチ アイテム、およびワールド アイテムがリストされます。コマンドの名前によって、結果が statics.mul エントリのみに限定されるわけではありません。チェーンの順序は Z ソートを保証しません。

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

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

簡単な例

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

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

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

1。セルレコードのカウント - 直接スクリプト

引数と実行の流れ:

  • x/y/map は現在のセルを選択します。
  • 配列の長さはフィールドの数です。 3 で割ると、エントリの数が得られます。
var tiles = UO.GetStaticTiles(UO.GetX(), UO.GetY(), UO.WorldNum());
var count = ArrayLength(tiles) / 3;
UO.Print("Tile records: " + Convert.ToString(count));

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

2。 graphic とすべてのエントリの高さをループする - スクリプト関数

引数と実行の流れ:

  • offset は、次のトリプルの最初のフィールドのインデックスで、3 だけ増加します。
  • offset+2 チェックは、レコード全体が読み取られるのを防ぎます。
return  RunScenario();
 object? RunScenario()
{
    var tiles = UO.GetStaticTiles(UO.GetX(), UO.GetY(), UO.WorldNum());
    var offset = 0;
    while (Truth(offset + 2 < ArrayLength(tiles)))
    {
        UO.Print("Type: " + Convert.ToString(tiles[offset]) + ", Z: " + Convert.ToString(tiles[offset + 1]));
        offset = offset + 3;
    }

    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。最初のエントリの hue を読み取ります - スクリプト クラス

引数と実行の流れ:

  • x+1 は隣接するセルを選択します。
  • タイル[2] — 最初のエントリの色。これは 3 番目のタイルではありません。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var tiles = UO.GetStaticTiles(UO.GetX() + 1, UO.GetY(), UO.WorldNum());
        if (Truth(ArrayLength(tiles) >= 3))
        {
            var hue = tiles[2];
            UO.Print("First tile hue: " + Convert.ToString(hue));
        }
        else
        {
            UO.Print("No tile records");
        }

        return null;
    }

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

コマンドの実装

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

UO.GetStaticTiles(x, y, map) — UO.GetStaticTiles(Any,Any,Any)

引数: x (Any), y (Any), map (Any)

結果: dynamic / Any.

呼び出し時:

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

public InjectionValue GetStaticTiles(InjectionValue x, InjectionValue y, InjectionValue map)

            => ToArray(bridge.GetStaticTiles(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map)));

UO.GetStaticTilesArray

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

C# のシグネチャ

dynamic UO.GetStaticTilesArray(object? xmin, object? ymin, object? xmax, object? ymax, object? worldNum, object? tileType);

四角形内のgraphic/type によって静的/マルチ/アイテムのエントリを検索します。

引数

  • xmin — 2 つの角度の世界座標。 0..65535。再配置された角度は正規化されます。面積は 1 000 000 細胞以下。境界が無効であると、マップが読み取られる前にスクリプト エラーが発生します。
  • ymin — 2 つの角度の世界座標。 0..65535。再配置された角度は正規化されます。面積は 1 000 000 細胞以下。境界が無効であると、マップが読み取られる前にスクリプト エラーが発生します。
  • xmax — 2 つの角度の世界座標。 0..65535。再配置された角度は正規化されます。面積は 1 000 000 細胞以下。境界が無効であると、マップが読み取られる前にスクリプト エラーが発生します。
  • ymax — 2 つの角度の世界座標。 0..65535。再配置された角度は正規化されます。面積は 1 000 000 細胞以下。境界が無効であると、マップが読み取られる前にスクリプト エラーが発生します。
  • worldNum — マップ/ファセット 0..255; UO.WorldNum() を使用してください。別のマップでは空の配列が得られます。マップがチャンク間で変更される場合、部分的な結果は破棄されます。
  • tileType - 1 つの graphic/type タイル、通常は 0..65535;これはserialではありません。 0 は正確な graphic 0 であり、-1 は type を意味しません。 type が一致しない場合、結果は空白になります。

戻り値

配列エントリ [graphic, X, Y, Z, hue];すべてのフィールド int。 graphic - type、Z - ベース、hue - カラー。複数のセルエントリは分離されたままになります。一致するものはありません: 空の配列。数量は ArrayLength(結果) であり、結果そのものではありません。下付き文字は 0 で始まります。これは、bool、serial、または Pascal レコードではありません。 7 番目の出力パラメータはありません。

動作

  • ローカルデータが読み取られます。検索では FindItem/FindCount は変更されず、移動、ターゲット、またはネットワーク コマンドは実行されません。
  • 順序: X の昇順、X - Y 以内の昇順。 1 つのセルの記録にはブリッジの順序が保存されます。距離や高さによって並べ替えられることはありません。
  • 検索は、約 1 ミリ秒のソフト バジェットで、最大 32 セルのチャンクで処理されます。キャンセルはサービングの間にチェックされます。複雑なセルまたはコールドリードは予算を超える可能性があります。広い領域を分割することをお勧めします。読んでいる間に世界が変わるかもしれません。
  • 現在のクライアントの静的ブランチには、セルからの静的、マルチ、アイテムが含まれており、地上にロードされたアイテムも含まれます。土地と移動体は含まれません。これは、静的ファイルのみを選択する従来の方法よりも幅広いです。

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

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

簡単な例

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

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

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

1。文字の近くを検索 - 直接スクリプト

引数と実行の流れ:

  • x/y — 位置 self、地図 — 現在の地図。領域3×3には境界が含まれます。 Ex では 2 つの type が送信され、通常の形式では 1 つになります。リソースに合わせてサンプルを変更します。これは ID オブジェクトではなく、graphic です。
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var rows = UO.GetStaticTilesArray(x, y, x + 2, y + 2, map, 0x0CCA);
UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));

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

2。再配置された角度とすべてのフィールドの出力 - スクリプト関数

引数と実行の流れ:

  • 領域2×2は、大きい角度から小さい角度に移動されます。アルゴリズム自体が境界を正規化します。行 - 1 つのレコード。 PrintTile は全体が宣言されており、数値のみをフォーマットし、何も移動しません。 graphic - type、x/y - 座標、z - 高さ、hue - 色。土地の場合、条件付き hue=0 が渡されます。土地レコードにはカラー フィールドがありません。
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX();
    var y = UO.GetY();
    var map = UO.WorldNum();
    var rows = UO.GetStaticTilesArray(x + 1, y + 1, x, y, map, 0x0CCA);
    var i = 0;
    while (Truth(i < ArrayLength(rows)))
    {
        var row = rows[i];
        PrintTile(row[0], row[1], row[2], row[3], row[4]);
        i = i + 1;
    }

    return null;
}

void PrintTile(dynamic graphic, dynamic x, dynamic y, dynamic z, dynamic hue)
{
    UO.Print("Type=" + Convert.ToString(graphic) + " X=" + Convert.ToString(x) + " Y=" + Convert.ToString(y));
    UO.Print("Z=" + Convert.ToString(z) + " hue=" + Convert.ToString(hue));
}

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。再試行制限付きの再ポーリング - スクリプト クラス

引数と実行の流れ:

  • 1 つのセルに対する検索は 3 回までです。試行間 WaitAsync(250)。呼び出しごとに新しい結果が作成されます。長さがゼロであることは、オブジェクトがサーバーから永久に欠落しているのではなく、一致するものが存在しないことを意味します。
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var x = UO.GetX();
        var y = UO.GetY();
        var map = UO.WorldNum();
        var attempt = 0;
        while (Truth(attempt < 3))
        {
            var rows = UO.GetStaticTilesArray(x, y, x, y, map, 0x0CCA);
            UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));
            attempt = attempt + 1;
            await Delay(250);
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    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.GetStaticTilesArray(xmin, ymin, xmax, ymax, worldNum, tileType) — UO.GetStaticTilesArray(Any,Any,Any,Any,Any,Any)

引数: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileType (Any)

結果: dynamic / Any.

呼び出し時:

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

case "getstatictilesarray":

                    return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), new[] { Arg(5) }, true);

UO.GetStaticTilesArrayEx

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

C# のシグネチャ

dynamic UO.GetStaticTilesArrayEx(object? xmin, object? ymin, object? xmax, object? ymax, object? worldNum, object? tileTypes);

四角形内のgraphic/type によって静的/マルチ/アイテムのエントリを検索します。

引数

  • xmin — 2 つの角度の世界座標。 0..65535。再配置された角度は正規化されます。面積は 1 000 000 細胞以下。境界が無効であると、マップが読み取られる前にスクリプト エラーが発生します。
  • ymin — 2 つの角度の世界座標。 0..65535。再配置された角度は正規化されます。面積は 1 000 000 細胞以下。境界が無効であると、マップが読み取られる前にスクリプト エラーが発生します。
  • xmax — 2 つの角度の世界座標。 0..65535。再配置された角度は正規化されます。面積は 1 000 000 細胞以下。境界が無効であると、マップが読み取られる前にスクリプト エラーが発生します。
  • ymax — 2 つの角度の世界座標。 0..65535。再配置された角度は正規化されます。面積は 1 000 000 細胞以下。境界が無効であると、マップが読み取られる前にスクリプト エラーが発生します。
  • worldNum — マップ/ファセット 0..255; UO.WorldNum() を使用してください。別のマップでは空の配列が得られます。マップがチャンク間で変更される場合、部分的な結果は破棄されます。
  • tileTypes — 数値 graphic/type の配列;一致するそれぞれの type がオンになります。 type を繰り返してもエントリは重複しません。スカラーも 1 つの type として扱われます。空の配列はすべてを意味します type; 1 つの 0 の配列は 0 のみを検索します。

戻り値

配列エントリ [graphic, X, Y, Z, hue];すべてのフィールド int。 graphic - type、Z - ベース、hue - カラー。複数のセルエントリは分離されたままになります。一致するものはありません: 空の配列。数量は ArrayLength(結果) であり、結果そのものではありません。下付き文字は 0 で始まります。これは、bool、serial、または Pascal レコードではありません。 7 番目の出力パラメータはありません。

動作

  • ローカルデータが読み取られます。検索では FindItem/FindCount は変更されず、移動、ターゲット、またはネットワーク コマンドは実行されません。
  • 順序: X の昇順、X - Y 以内の昇順。 1 つのセルの記録にはブリッジの順序が保存されます。距離や高さによって並べ替えられることはありません。
  • 検索は、約 1 ミリ秒のソフト バジェットで、最大 32 セルのチャンクで処理されます。キャンセルはサービングの間にチェックされます。複雑なセルまたはコールドリードは予算を超える可能性があります。広い領域を分割することをお勧めします。読んでいる間に世界が変わるかもしれません。
  • 現在のクライアントの静的ブランチには、セルからの静的、マルチ、アイテムが含まれており、地上にロードされたアイテムも含まれます。土地と移動体は含まれません。これは、静的ファイルのみを選択する従来の方法よりも幅広いです。

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

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

簡単な例

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

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

object? result = UO.GetStaticTilesArrayEx(UO.X(), UO.Y(), UO.X() + 1, UO.Y() + 1, UO.WorldNum(), new[] { 0x0CCA });
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1。文字の近くを検索 - 直接スクリプト

引数と実行の流れ:

  • x/y — 位置 self、地図 — 現在の地図。領域3×3には境界が含まれます。 Ex では 2 つの type が送信され、通常の形式では 1 つになります。リソースに合わせてサンプルを変更します。これは ID オブジェクトではなく、graphic です。
dynamic[] types = new dynamic[checked((int)(1) + 1)];
types[0] = 0x0CCA;
types[1] = 0x0CCB;
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var rows = UO.GetStaticTilesArrayEx(x, y, x + 2, y + 2, map, types);
UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));

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

2。再配置された角度とすべてのフィールドの出力 - スクリプト関数

引数と実行の流れ:

  • 領域2×2は、大きい角度から小さい角度に移動されます。アルゴリズム自体が境界を正規化します。行 - 1 つのレコード。 PrintTile は全体が宣言されており、数値のみをフォーマットし、何も移動しません。 graphic - type、x/y - 座標、z - 高さ、hue - 色。土地の場合、条件付き hue=0 が渡されます。土地レコードにはカラー フィールドがありません。
return  RunScenario();
 object? RunScenario()
{
    dynamic[] types = new dynamic[checked((int)(1) + 1)];
    types[0] = 0x0CCA;
    types[1] = 0x0CCB;
    var x = UO.GetX();
    var y = UO.GetY();
    var map = UO.WorldNum();
    var rows = UO.GetStaticTilesArrayEx(x + 1, y + 1, x, y, map, types);
    var i = 0;
    while (Truth(i < ArrayLength(rows)))
    {
        var row = rows[i];
        PrintTile(row[0], row[1], row[2], row[3], row[4]);
        i = i + 1;
    }

    return null;
}

void PrintTile(dynamic graphic, dynamic x, dynamic y, dynamic z, dynamic hue)
{
    UO.Print("Type=" + Convert.ToString(graphic) + " X=" + Convert.ToString(x) + " Y=" + Convert.ToString(y));
    UO.Print("Z=" + Convert.ToString(z) + " hue=" + Convert.ToString(hue));
}

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。再試行制限付きの再ポーリング - スクリプト クラス

引数と実行の流れ:

  • 1 つのセルに対する検索は 3 回までです。試行間 WaitAsync(250)。呼び出しごとに新しい結果が作成されます。長さがゼロであることは、オブジェクトがサーバーから永久に欠落しているのではなく、一致するものが存在しないことを意味します。
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        dynamic[] types = new dynamic[checked((int)(1) + 1)];
        types[0] = 0x0CCA;
        types[1] = 0x0CCB;
        var x = UO.GetX();
        var y = UO.GetY();
        var map = UO.WorldNum();
        var attempt = 0;
        while (Truth(attempt < 3))
        {
            var rows = UO.GetStaticTilesArrayEx(x, y, x, y, map, types);
            UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));
            attempt = attempt + 1;
            await Delay(250);
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    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.GetStaticTilesArrayEx(xmin, ymin, xmax, ymax, worldNum, tileTypes) — UO.GetStaticTilesArrayEx(Any,Any,Any,Any,Any,Any)

引数: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileTypes (Any)

結果: dynamic / Any.

呼び出し時:

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

case "getstatictilesarrayex":

                    return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), ArrayArg(5), true);

UO.GetSurfaceZ

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

C# のシグネチャ

dynamic UO.GetSurfaceZ(object? x, object? y, object? worldNum);

セル内の地表の平均高さを読み取ります。

引数

  • x — ガンプ内の位置ではなく、現在のマップのセルの世界座標 X。
  • y — 現在のマップ セルのワールド Y 座標。
  • worldNum — カード/ファセット番号。 UO.WorldNum() を使用してください。現在ロードされているカードのみが読み取られます。

戻り値

int - Land.AverageZ、負の高さと 0 を含みます。地図/地面がない場合、または地図の不一致がある場合は、0 が返されるため、この値は欠落データと真の高さ 0 を区別しません。それは、bool、床、または最も近い静的なものの高さではありません。

動作

  • このコマンドはローカル マップを読み取りますが、移動やターゲットをトリガーしません。マップのサイズ外のセルは、隣接する列のセルに置き換えられません。
  • Z、graphic/typeの高さ、hueの色、旗、装備レイヤーはそれぞれ意味が異なります。 Null graphic または Z=0 は有効なデータである可能性があります。結果フォームを確認してください。

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

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

簡単な例

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

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

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

1。キャラクターの下の平均高さ - 直接スクリプト

引数と実行の流れ:

  • 3 つのパラメータはすべて、マップの現在のセルに関連します。 z は数値的な高さであり、動きの結果ではありません。
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var z = UO.GetSurfaceZ(x, y, map);
UO.Print("Average land Z: " + Convert.ToString(z));

2。読む前に地面の空き状況を確認 - スクリプト機能

引数と実行の流れ:

  • GetMapCell は、欠損データと高さ 0 を区別するために必要です。マップは 2 回の呼び出しの間でも変化する可能性があります。
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX() + 1;
    var y = UO.GetY();
    var map = UO.WorldNum();
    var cell = UO.GetMapCell(x, y, map);
    if (Truth(ArrayLength(cell) == 3))
    {
        UO.Print("Average: " + Convert.ToString(UO.GetSurfaceZ(x, y, map)));
    }
    else
    {
        UO.Print("No land data");
    }

    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。東への平均高さの変化を表示 - シナリオ クラス

引数と実行の流れ:

  • その違いは地球の傾きを示しています。この例では何も移動せず、ルートも計算しません。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var x = UO.GetX();
        var y = UO.GetY();
        var map = UO.WorldNum();
        var a = UO.GetMapCell(x, y, map);
        var b = UO.GetMapCell(x + 1, y, map);
        if (Truth(ArrayLength(a) == 3) && Truth(ArrayLength(b) == 3))
        {
            var difference = UO.GetSurfaceZ(x + 1, y, map) - UO.GetSurfaceZ(x, y, map);
            UO.Print("Average difference: " + Convert.ToString(difference));
        }

        return null;
    }

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

コマンドの実装

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

UO.GetSurfaceZ(x, y, worldNum) — UO.GetSurfaceZ(Any,Any,Any)

引数: x (Any), y (Any), worldNum (Any)

結果: dynamic / Any.

呼び出し時:

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

case "getsurfacez":

                    return new InjectionValue(bridge.GetSurfaceZ(Arg(0), Arg(1), Arg(2)));

UO.GetTileFlags

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

C# のシグネチャ

dynamic UO.GetTileFlags(object? group, object? tileId);

プロパティ ビットマスク graphic をタイルデータ エントリから読み取ります。

引数

  • group - 0 - 土地テーブル。 1 — 静的graphic のテーブル。実装では、null 以外のグループはすべて 2 番目のテーブルであると見なされます。 0 または 1 を使用してください。
  • tileId — タイルデータ内のグラフィック/type エントリ。通常は整数 0…65535。これはオブジェクトの serial やセル内の静的なインデックスではありません。

戻り値

int — タイルデータ フラグの下位 32 ビット。最上位ビットを設定すると、負の符号の数値になります。 0 は、これらのフラグが存在しない、または無効な tileId を意味します。これは、bool ではなく、エラーの独立した兆候ではありません。複数のプロパティを同時に設定できます。

動作

  • このコマンドは、参照エントリ graphic を読み取ります。世界座標は必要ありません。 group=0 と group=1 は、tileId が同じであっても、異なるテーブルを選択します。
  • プロパティは、特定の項目の現在の状態からではなく、graphic データから読み取られます。

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

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

簡単な例

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

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

object? result = UO.GetTileFlags(1, 0x0CCA);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1。既知の静的 graphic のプロパティの読み取り - 直接スクリプト

引数と実行の流れ:

  • group=1 は静的タイルデータを選択します。 tileId=0x0CCA - graphic ツリー。
  • value には、「戻り値」セクションで説明されている結果が含まれます。その意味はserialとは一致しません。
var value = UO.GetTileFlags(1, 0x0CCA);
if (Truth((Convert.ToUInt64(value) & 0x40UL) != 0))
{
    UO.Print("Impassable flag is set");
}

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

2。見つかったアイテムのプロパティgraphicを読み取る - スクリプト関数

引数と実行の流れ:

  • FindType は serial を返します。 GetType はそれを数値の graphic に変換します。
  • group=1 は項目に使用されます。 tileId graphic ではアイテムではなく送信されます。
return  RunScenario();
 object? RunScenario()
{
    var item = UO.FindType(0x0EED, -1, "backpack");
    if (Truth(item != ""))
    {
        var graphic = UO.GetType(item);
        var value = UO.GetTileFlags(1, graphic);
        UO.Print(Convert.ToString(value));
    }

    return null;
}

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

3。キャラクターの下の地面のプロパティを読み取る - シナリオクラス

引数と実行の流れ:

  • 最初の 2 つの引数 GetLandscapeTile は現在のワールド X/Y です。 3 番目は現在のマップです。
  • land[0] には graphic ランドが含まれています。 group=0 は土地タイルデータを選択します。 GetTileLayer/GetTileHeight の場合、地面は 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 land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
        if (Truth(ArrayLength(land) >= 3))
        {
            var graphic = land[0];
            var value = UO.GetTileFlags(0, graphic);
            UO.Print(Convert.ToString(value));
        }

        return null;
    }

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

コマンドの実装

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

UO.GetTileFlags(group, tileId) — UO.GetTileFlags(Any,Any)

引数: group (Any), tileId (Any)

結果: dynamic / Any.

呼び出し時:

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

public InjectionValue GetTileFlags(InjectionValue group, InjectionValue tileId)

            => new InjectionValue(unchecked((int)bridge.GetTileFlags(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId))));

UO.GetTileHeight

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

C# のシグネチャ

int UO.GetTileHeight(object? group, object? tileId);

tiledata エントリから高さ graphic を読み取ります。

引数

  • group - 0 - 土地テーブル。 1 — 静的graphic のテーブル。実装では、null 以外のグループはすべて 2 番目のテーブルであると見なされます。 0 または 1 を使用してください。
  • tileId — タイルデータ内のグラフィック/type エントリ。通常は整数 0…65535。これはオブジェクトの serial やセル内の静的なインデックスではありません。

戻り値

int は、tiledata からの Z 単位でのグラフィックの高さです。これはグラフィックの高さのサイズであり、ベース Z のワールド座標ではありません。地面、エントリの欠落、または高さがゼロの場合、0 が返されます。身長そのものがクロスカントリー能力を証明するものではありません。

動作

  • このコマンドは、参照エントリ graphic を読み取ります。世界座標は必要ありません。 group=0 と group=1 は、tileId が同じであっても、異なるテーブルを選択します。
  • プロパティは、特定の項目の現在の状態からではなく、graphic データから読み取られます。

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

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

簡単な例

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

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

var result = UO.GetTileHeight(1, 0x0CCA);
UO.Print("GetTileHeight: " + Convert.ToString(result));

1。既知の静的 graphic のプロパティの読み取り - 直接スクリプト

引数と実行の流れ:

  • group=1 は静的タイルデータを選択します。 tileId=0x0CCA - graphic ツリー。
  • value には、「戻り値」セクションで説明されている結果が含まれます。その意味はserialとは一致しません。
var value = UO.GetTileHeight(1, 0x0CCA);
UO.Print("Tiledata height: " + Convert.ToString(value));

2。見つかったアイテムのプロパティgraphicを読み取る - スクリプト関数

引数と実行の流れ:

  • FindType は serial を返します。 GetType はそれを数値の graphic に変換します。
  • group=1 は項目に使用されます。 tileId graphic ではアイテムではなく送信されます。
return  RunScenario();
 object? RunScenario()
{
    var item = UO.FindType(0x0EED, -1, "backpack");
    if (Truth(item != ""))
    {
        var graphic = UO.GetType(item);
        var value = UO.GetTileHeight(1, graphic);
        UO.Print(Convert.ToString(value));
    }

    return null;
}

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

3。キャラクターの下の地面のプロパティを読み取る - シナリオクラス

引数と実行の流れ:

  • 最初の 2 つの引数 GetLandscapeTile は現在のワールド X/Y です。 3 番目は現在のマップです。
  • land[0] には graphic ランドが含まれています。 group=0 は土地タイルデータを選択します。 GetTileLayer/GetTileHeight の場合、地面は 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 land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
        if (Truth(ArrayLength(land) >= 3))
        {
            var graphic = land[0];
            var value = UO.GetTileHeight(0, graphic);
            UO.Print(Convert.ToString(value));
        }

        return null;
    }

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

コマンドの実装

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

UO.GetTileHeight(group, tileId) — UO.GetTileHeight(Any,Any)

引数: group (Any), tileId (Any)

結果: int / Integer.

呼び出し時:

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

public int GetTileHeight(InjectionValue group, InjectionValue tileId)

        {

            int tileGroup = NumberConversions.ToInt(group);

            int[] properties = bridge.GetTileDataProperties(tileGroup, NumberConversions.ToInt(tileId)) ?? Array.Empty<int>();

            return tileGroup == 0 || properties.Length < 7 ? 0 : properties[6];

        }

UO.GetTileLayer

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

C# のシグネチャ

int UO.GetTileLayer(object? group, object? tileId);

タイルデータエントリから機器レイヤー番号を読み取ります。

引数

  • group - 0 - 土地テーブル。 1 — 静的graphic のテーブル。実装では、null 以外のグループはすべて 2 番目のテーブルであると見なされます。 0 または 1 を使用してください。
  • tileId — タイルデータ内のグラフィック/type エントリ。通常は整数 0…65535。これはオブジェクトの serial やセル内の静的なインデックスではありません。

戻り値

int — 機器層 graphic の番号: 例: 1=Rhand、2=Lhand、21=Backpack。グラウンド層、エントリの欠落、またはヌル層の場合は、0 が返されます。これは、セル内の静電気の順序ではなく、フロアでも、Z でもありません。

動作

  • このコマンドは、参照エントリ graphic を読み取ります。世界座標は必要ありません。 group=0 と group=1 は、tileId が同じであっても、異なるテーブルを選択します。
  • プロパティは、特定の項目の現在の状態からではなく、graphic データから読み取られます。

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

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

簡単な例

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

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

var result = UO.GetTileLayer(1, 0x0CCA);
UO.Print("GetTileLayer: " + Convert.ToString(result));

1。既知の静的 graphic のプロパティの読み取り - 直接スクリプト

引数と実行の流れ:

  • group=1 は静的タイルデータを選択します。 tileId=0x0CCA - graphic ツリー。
  • value には、「戻り値」セクションで説明されている結果が含まれます。その意味はserialとは一致しません。
var value = UO.GetTileLayer(1, 0x0CCA);
if (Truth(value == 1))
{
    UO.Print("Right-hand graphic");
}

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

2。見つかったアイテムのプロパティgraphicを読み取る - スクリプト関数

引数と実行の流れ:

  • FindType は serial を返します。 GetType はそれを数値の graphic に変換します。
  • group=1 は項目に使用されます。 tileId graphic ではアイテムではなく送信されます。
return  RunScenario();
 object? RunScenario()
{
    var item = UO.FindType(0x0EED, -1, "backpack");
    if (Truth(item != ""))
    {
        var graphic = UO.GetType(item);
        var value = UO.GetTileLayer(1, graphic);
        UO.Print(Convert.ToString(value));
    }

    return null;
}

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

3。キャラクターの下の地面のプロパティを読み取る - シナリオクラス

引数と実行の流れ:

  • 最初の 2 つの引数 GetLandscapeTile は現在のワールド X/Y です。 3 番目は現在のマップです。
  • land[0] には graphic ランドが含まれています。 group=0 は土地タイルデータを選択します。 GetTileLayer/GetTileHeight の場合、地面は 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 land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
        if (Truth(ArrayLength(land) >= 3))
        {
            var graphic = land[0];
            var value = UO.GetTileLayer(0, graphic);
            UO.Print(Convert.ToString(value));
        }

        return null;
    }

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

コマンドの実装

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

UO.GetTileLayer(group, tileId) — UO.GetTileLayer(Any,Any)

引数: group (Any), tileId (Any)

結果: int / Integer.

呼び出し時:

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

public int GetTileLayer(InjectionValue group, InjectionValue tileId)

        {

            int tileGroup = NumberConversions.ToInt(group);

            int[] properties = bridge.GetTileDataProperties(tileGroup, NumberConversions.ToInt(tileId)) ?? Array.Empty<int>();

            return tileGroup == 0 || properties.Length < 2 ? 0 : properties[1];

        }

UO.GetTileName

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

C# のシグネチャ

string UO.GetTileName(object? group, object? tileId);

tiledata エントリから名前 graphic を読み取ります。

引数

  • group - 0 - 土地テーブル。 1 — 静的graphic のテーブル。実装では、null 以外のグループはすべて 2 番目のテーブルであると見なされます。 0 または 1 を使用してください。
  • tileId — タイルデータ内のグラフィック/type エントリ。通常は整数 0…65535。これはオブジェクトの serial やセル内の静的なインデックスではありません。

戻り値

string - ゲームのタイルデータ ファイルからの名前。空の文字列は、空の名前または無効な tileId を意味します。名前はゲーム リソースから取得され、インターフェイス言語 IDE に自動的に翻訳されません。これは、サーバーからの特定のアイテムの名前ではありません。

動作

  • このコマンドは、参照エントリ graphic を読み取ります。世界座標は必要ありません。 group=0 と group=1 は、tileId が同じであっても、異なるテーブルを選択します。
  • プロパティは、特定の項目の現在の状態からではなく、graphic データから読み取られます。

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

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

簡単な例

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

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

var result = UO.GetTileName(1, 0x0CCA);
UO.Print("GetTileName: " + Convert.ToString(result));

1。既知の静的 graphic のプロパティの読み取り - 直接スクリプト

引数と実行の流れ:

  • group=1 は静的タイルデータを選択します。 tileId=0x0CCA - graphic ツリー。
  • value には、「戻り値」セクションで説明されている結果が含まれます。その意味はserialとは一致しません。
var value = UO.GetTileName(1, 0x0CCA);
if (Truth(value != ""))
{
    UO.Print(value);
}
else
{
    UO.Print("No tiledata name");
}

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

2。見つかったアイテムのプロパティgraphicを読み取る - スクリプト関数

引数と実行の流れ:

  • FindType は serial を返します。 GetType はそれを数値の graphic に変換します。
  • group=1 は項目に使用されます。 tileId graphic ではアイテムではなく送信されます。
return  RunScenario();
 object? RunScenario()
{
    var item = UO.FindType(0x0EED, -1, "backpack");
    if (Truth(item != ""))
    {
        var graphic = UO.GetType(item);
        var value = UO.GetTileName(1, graphic);
        UO.Print(Convert.ToString(value));
    }

    return null;
}

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

3。キャラクターの下の地面のプロパティを読み取る - シナリオクラス

引数と実行の流れ:

  • 最初の 2 つの引数 GetLandscapeTile は現在のワールド X/Y です。 3 番目は現在のマップです。
  • land[0] には graphic ランドが含まれています。 group=0 は土地タイルデータを選択します。 GetTileLayer/GetTileHeight の場合、地面は 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 land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
        if (Truth(ArrayLength(land) >= 3))
        {
            var graphic = land[0];
            var value = UO.GetTileName(0, graphic);
            UO.Print(Convert.ToString(value));
        }

        return null;
    }

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

コマンドの実装

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

UO.GetTileName(group, tileId) — UO.GetTileName(Any,Any)

引数: group (Any), tileId (Any)

結果: string / String.

呼び出し時:

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

public string GetTileName(InjectionValue group, InjectionValue tileId)

            => bridge.GetTileDataName(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId));

UO.GetTileXYM

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

C# のシグネチャ

dynamic UO.GetTileXYM(object? x, object? y, object? map, object? tileStart, object? tileEnd, object? uoPath);

現在ロードされているゲーム カードのセルのオブジェクト チェーンから、一致する graphic ID を読み取ります。

引数

  • x — X セル、int を調整します。
  • y — Y セル、int を調整します。
  • map — カード番号。 World.MapIndex と一致し、World.Map が存在する必要があります。
  • tileStart — 下部の有効なグラフィック境界線。
  • tileEnd — グラフィックの上部に含まれる境界線。逆の範囲は再配置されず、一致は生成されません。
  • uoPath - 互換性パラメータは string に変換されますが、現在のブリッジはそれを使用せず、他のファイル フォルダ UO をロードしません。

戻り値

フラットクワッドを含む int 配列 [graphic,x,y,z,graphic,x,y,z,...]。マップ エラーでは、空の配列とメッセージが表示されます。一致しない場合も空の配列になります。

動作

  • World.Map.GetTile(x,y).TNext に従い、tileStart<=Graphic<=tileEnd をチェックします。オブジェクト タイプは個別にフィルタリングされません。オブジェクト タイプは単なる静的なものではなく、セルのチェーンです。
  • このコマンドは、クライアントのロードされたジオメトリを読み取ります。別のマップ/ファセットからのデータはロードされません。 uoPath パラメータはファイルのダウンロードには使用されません。エントリの数は配列の長さ/4と同じです。

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

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

簡単な例

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

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

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

1。現在のセルのすべてのグラフは直接スクリプトです

引数と実行の流れ:

  • 各エントリには 4 つの int が必要です。
var tiles = UO.GetTileXYM(UO.GetX(),UO.GetY(),UO.WorldNum(),0,65535,"");
UO.Print(Convert.ToString(ArrayLength(tiles)/4));

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

2。 graphic と高さを印刷 - スクリプト関数

引数と実行の流れ:

  • インデックス i と i+3 は、同じレコードの graphic と z に対応します。
return  RunScenario();
 object? RunScenario()
{
    var tiles = UO.GetTileXYM(UO.GetX(), UO.GetY(), UO.WorldNum(), 0, 65535, "");
    for (int i = (int)(0); i <= ArrayLength(tiles) - 1; i += (int)(4))
    {
        UO.Print(Convert.ToString(tiles[i]) + " " + Convert.ToString(tiles[i + 3]));
    }

    return null;
}

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

3。逆範囲 - スクリプトクラス

引数と実行の流れ:

  • 範囲 100..99 には graphic が含まれず、空の配列が生成されます。
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 tiles = UO.GetTileXYM(UO.GetX(), UO.GetY(), UO.WorldNum(), 100, 99, "");
        UO.Print(Convert.ToString(ArrayLength(tiles)));
        return null;
    }

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

コマンドの実装

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

UO.GetTileXYM(x, y, map, tileStart, tileEnd, uoPath) — UO.GetTileXYM(Any,Any,Any,Any,Any,Any)

引数: x (Any), y (Any), map (Any), tileStart (Any), tileEnd (Any), uoPath (Any)

結果: dynamic / Any.

呼び出し時:

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

public InjectionValue GetTileXYM(InjectionValue x, InjectionValue y, InjectionValue map, InjectionValue tileStart, InjectionValue tileEnd, InjectionValue uoPath)

            => ToArray(bridge.GetTileXYM(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map), NumberConversions.ToInt(tileStart), NumberConversions.ToInt(tileEnd), uoPath.ToString()));

UO.GetUserStatic

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

C# のシグネチャ

string UO.GetUserStatic(object? id);

保存されたユーザー静的レコードを読み取ります。

引数

  • id - int ID、AddUserStatic によって取得。世界のgraphic/typeやserialではありません。

戻り値

string — 保存されたシリアル化されたレコード。不明 ID は空の文字列を返します。

動作

  • state.UserStatics.TryGetValue は文字列を解析せずに返します。幾何学表記 - "graphic|x|y|z|hue|map";古いテキストエントリは異なるテキストである可能性があります。
  • 現在のローカル状態を読み取ります。パッケージ、ターゲット、自動アップデートはありません。個々の読み取りでは異なる状態が表示される場合があります。
  • 通常のクライアント ホストでは、この状態データは GetPersistentState マネージャーから取得され、同じワールド/プロファイルのスクリプト/チャット/マクロに共通であり、1 つのスクリプトに属しません。別のプロセス、または明らかに別個の InjectionRuntimeState の状態は異なります。プロファイルをロード/クリアすると、プロファイルを置き換えることができます。保存された serial はロードされたワールドに対して引き続きチェックされます。

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

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

簡単な例

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

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

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

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

引数と実行の流れ:

  • 保存されたユーザー静的レコードを読み取ります。
UO.Print(UO.GetUserStatic(1));

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

引数と実行の流れ:

  • state.UserStatics.TryGetValue は文字列を解析せずに返します。幾何学表記 - "graphic|x|y|z|hue|map";古いテキストエントリは異なるテキストである可能性があります。
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.UserStaticExists(1)))
    {
        UO.Print(UO.GetUserStatic(1));
    }

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

引数と実行の流れ:

  • 現在のローカル状態を読み取ります。パッケージ、ターゲット、自動アップデートはありません。個々の読み取りでは異なる状態が表示される場合があります。
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 records = UO.GetUserStatics();
        if (Truth(UO.GetArrayLength(records) > 0))
        {
            UO.Print(UO.GetUserStatic(records[0][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.GetUserStatic(id) — UO.GetUserStatic(Any)

引数: id (Any)

結果: string / String.

呼び出し時:

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

public string GetUserStatic(InjectionValue id)

            => state.UserStatics.TryGetValue(NumberConversions.ToInt(id), out string value) ? value : string.Empty;

UO.GetUserStatics

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

C# のシグネチャ

dynamic UO.GetUserStatics();

状態を読み取ります。UserStatics。

引数

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

戻り値

ID でソートされた文字列 [id, serializedText] の配列。各 ID は int、serializedText - string です。空の辞書は空の配列を返します。

動作

  • 状態を読み取ります。UserStatics。幾何学的表記は「graphic|x|y|z|hue|map」として保存されます。古いテキスト エントリ AddUserStatic の形式は異なる場合があります。これらはローカル ユーザー エントリであり、すべての静的マップではありません。
  • 現在のローカル状態を読み取ります。パッケージ、ターゲット、自動アップデートはありません。個々の読み取りでは異なる状態が表示される場合があります。
  • 通常のクライアント ホストでは、この状態データは GetPersistentState マネージャーから取得され、同じワールド/プロファイルのスクリプト/チャット/マクロに共通であり、1 つのスクリプトに属しません。別のプロセス、または明らかに別個の InjectionRuntimeState の状態は異なります。プロファイルをロード/クリアすると、プロファイルを置き換えることができます。保存された serial はロードされたワールドに対して引き続きチェックされます。

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

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

簡単な例

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

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

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

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

引数と実行の流れ:

  • 状態を読み取ります。UserStatics。
var records = UO.GetUserStatics();
UO.Print(UO.GetArrayLength(records));

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

引数と実行の流れ:

  • 状態を読み取ります。UserStatics。幾何学的表記は「graphic|x|y|z|hue|map」として保存されます。古いテキスト エントリ AddUserStatic の形式は異なる場合があります。これらはローカル ユーザー エントリであり、すべての静的マップではありません。
return  RunScenario();
 object? RunScenario()
{
    var records = UO.GetUserStatics();
    if (Truth(UO.GetArrayLength(records) > 0))
    {
        UO.Print(records[0][0]);
        UO.Print(records[0][1]);
    }

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

引数と実行の流れ:

  • 現在のローカル状態を読み取ります。パッケージ、ターゲット、自動アップデートはありません。個々の読み取りでは異なる状態が表示される場合があります。
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 before = UO.GetUserStatics();
        UO.Wait(500);
        var after = UO.GetUserStatics();
        UO.Print(before);
        UO.Print(after);
        return null;
    }
}

コマンドの実装

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

UO.GetUserStatics() — UO.GetUserStatics()

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

結果: dynamic / Any.

呼び出し時:

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

public InjectionValue GetUserStatics()

            => new InjectionValue(state.UserStatics.OrderBy(pair => pair.Key)

                .Select(pair => new InjectionValue(new[] { new InjectionValue(pair.Key), new InjectionValue(pair.Value) }))

                .ToArray());

UO.GetWorldCell

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

C# のシグネチャ

dynamic UO.GetWorldCell(object? x, object? y);
dynamic UO.GetWorldCell(object? x, object? y, object? map);

選択したエリアの拡張地上レコード、地上レコード、およびロードされたワールド アイテムを読み取ります。

引数

  • x — 現在ロードされているマップの X セル。ガンプ内の位置ではなく、世界座標。
  • y — 現在ロードされているマップの Y セル。ガンプ内の位置ではなく、世界座標。
  • map — カード番号。この引数が選択したフォームに存在しない場合は、現在のマップが使用されます。実際のクライアントは、現在ロードされているマップからタイルを読み取るだけです。

戻り値

レコードの配列。各 result[i] 要素の形式は次のとおりです。

1 つのレコードの 11 フィールドの配列。インデックスは 0 で始まります:

  • [0] kind — string: 「ランド」、「静的」、または「object」。
  • [1] serial - int: serial 動的アイテム。陸上/静的の場合は 0 です。
  • [2] graphic - int: type グラフィックス。
  • [3] x、[4] y - int: セルの世界座標。
  • [5] z - int: ワールドのベースの高さ。
  • [6] hue - int: 地面 0 に近い色。
  • [7] flags - int: タイルデータ フラグの下位 32 ビット。
  • [8] name - string: タイルデータからの名前。
  • [9] layer - int: タイルデータからの機器のレイヤー、地面 0 の近く。静的インデックスではありません。
  • [10] height - int: タイルデータからの高さ graphic、地面 0 付近。座標Zではありません。

ArrayLength(結果) - セルの数やルート ステップの数ではなく、レコードの数です。結果は空になる可能性があります。 1 つの x/y には、異なる Z を持つ複数のエントリを含めることができます。エントリ "object" には serial があります。エントリ「static」には使用可能な serial がありません。

動作

  • データは現在ロードされているマップを参照します。別のカードまたは到達不能なセルがあると、空の配列になります。直接タイル クエリでは、さらにマップの不一致が報告される場合があります。 GetWorldCell と GetWorldTilesArray は、そのようなメッセージを表示せずに、すぐに空の配列を返します。
  • 配列インデックスは 0 で始まります。フィールドを読み取る前に、ArrayLength を確認してください。 Z は世界高度を表します。 Layer はタイルデータからの機器プロパティ、index はセル エントリのシリアル番号です。
  • 静的部分は GetStaticTiles を使用します。現在の選択にはマルチ/アイテムも含まれます。ワールド アイテムは、さらに「object」と serial として表示される場合があります。各エントリを一意の項目として扱わないでください。
  • GetWorldTilesArray は、1 000 000 セルの領域を制限します。 0…65535 / 0…255 の外側の座標を超えると、部分的な配列ではなくコマンド エラーが発生します。頻繁にポーリングを行う場合は、小さなエリアを選択してください。

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

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

簡単な例

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

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

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

1。レコードのカウントとリスト - 直接スクリプト

引数と実行の流れ:

  • GetWorldCell は 1 つのセルを読み取ります。この例の GetWorldTilesArray は、境界線が有効になっている正方形 3×3 を読み取ります。
  • cell[i] は入れ子になった配列です。タイル[0] - カテゴリ、[2] - graphic、[5] - Z。
var cells = UO.GetWorldCell(UO.GetX(), UO.GetY());
var i = 0;
while (Truth(i < ArrayLength(cells)))
{
    var tile = cells[i];
    UO.Print(tile[0] + ": " + Convert.ToString(tile[2]) + ", Z=" + Convert.ToString(tile[5]));
    i = i + 1;
}

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

2。項目 serial を持つエントリのみを表示 - スクリプト関数

引数と実行の流れ:

  • 領域はコンテナではなく座標によって選択されます。
  • kind="object" チェックは、シリアル項目をグランド/静的項目から分離します。 [1]にはserialが含まれます。
return  RunScenario();
 object? RunScenario()
{
    var cells = UO.GetWorldCell(UO.GetX(), UO.GetY());
    var i = 0;
    while (Truth(i < ArrayLength(cells)))
    {
        var tile = cells[i];
        if (Truth(tile[0] == "object"))
        {
            UO.Print("Object serial: " + Convert.ToString(tile[1]));
        }

        i = i + 1;
    }

    return null;
}

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

3。文字の高さでレコードを選択 - スクリプト クラス

引数と実行の流れ:

  • tile[5] と GetZ() は同じワールド高さ単位で比較されます。
  • 等価 Z はベースをフィルタリングしますが、フロア全体の通過可能性や一致を意味するものではありません。
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 cells = UO.GetWorldCell(UO.GetX(), UO.GetY());
        var i = 0;
        while (Truth(i < ArrayLength(cells)))
        {
            var tile = cells[i];
            if (Truth(tile[5] == UO.GetZ()))
            {
                UO.Print(tile[8]);
            }

            i = i + 1;
        }

        return null;
    }

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

コマンドの実装

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

UO.GetWorldCell(x, y) — UO.GetWorldCell(Any,Any)

引数: x (Any), y (Any)

結果: dynamic / Any.

呼び出し時:

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

public InjectionValue GetWorldCell(InjectionValue x, InjectionValue y)

            => GetWorldCell(x, y, new InjectionValue(bridge.WorldNumber));

UO.GetWorldCell(x, y, map) — UO.GetWorldCell(Any,Any,Any)

引数: x (Any), y (Any), map (Any)

結果: dynamic / Any.

呼び出し時:

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

public InjectionValue GetWorldCell(InjectionValue x, InjectionValue y, InjectionValue map)

            => BuildWorldCell(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map), true);

UO.GetWorldNum

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

C# のシグネチャ

int UO.GetWorldNum();

クライアントモデルから現在のカード番号を読み取ります。

引数

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

戻り値

int — クライアントの現在のカードのインデックス。通常は、0=フェルッカ、1=トランメル、2=イルシェナー、3=マラス、4=トクノ、5=テル・ムールです。ユーザー サーバーは異なるカード セットを使用する場合があります。 0 は本格的なマップであり、エラーの兆候ではありません。

動作

  • 受信済みのローカルデータを読み込みます。このリクエストはステータスをオープンせず、サーバーに更新の送信を強制しません。死亡、マップの遷移、またはオブジェクトの削除後、2 つの呼び出しの間で値が変化する可能性があります。
  • C# は大文字と小文字を区別します。正確な UO 名を使用してください。数値フラグは 0 と比較し、戻り値が bool の場合だけ bool を使います。

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

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

簡単な例

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

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

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

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

引数と実行の流れ:

  • 引数なしの呼び出しは、self を参照します。 valueには現在のカード番号が格納されます。
  • Convert.ToString は出力する数値を変換するもので、結果の意味は変わりません。
var value = UO.GetWorldNum();
UO.Print("GetWorldNum: " + Convert.ToString(value));

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

引数と実行の流れ:

  • 値は引数なしで 1 回読み取られます。現在のカード番号は、表示される計算または条件に使用されます。
  • 数値しきい値はスクリプト条件の例であり、新しいクライアントの制限ではありません。このフィールドには、上記のサーバー単位と制限が格納されます。
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetWorldNum();
    var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), value);
    UO.Print("Land record length: " + Convert.ToString(ArrayLength(land)));
    return null;
}

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

3。変化を 1 秒で監視する - スクリプト クラス

引数と実行の流れ:

  • 引数なしの両方の呼び出しは、現在の値を読み取ります。 UO.Wait(1000) はショット間にミリ秒単位の一時停止を与えます。
  • 比較される変化は現在のカードの番号です。例は世界を変えることはなく、無限に待つこともありません。この 1 秒以内のイベントは見逃される可能性があります。
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

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

        return null;
    }

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

コマンドの実装

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

UO.GetWorldNum() — UO.GetWorldNum()

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

結果: int / Integer.

呼び出し時:

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

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

() => bridge.WorldNumber

API の作成: これらの関数は API を登録します。コマンドを呼ぶたびに実行されるものではありません。


UO.GetWorldTilesArray

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

C# のシグネチャ

dynamic UO.GetWorldTilesArray(object? minX, object? minY, object? maxX, object? maxY, object? map);

選択したエリアの拡張地上レコード、地上レコード、およびロードされたワールド アイテムを読み取ります。

引数

  • minX — 長方形の最初の X 境界線が含まれます。 0…65535。
  • minY — 長方形の最初の Y 境界線が含まれます。 0…65535。
  • maxX — 2 番目に含まれる境界 X; 2 つの X のうち小さい方/大きい方が自動的に選択されます。
  • maxY — 2 番目に含まれる境界 Y; 2 つの Y のうち小さい方/大きい方が自動的に選択されます。
  • map — カード番号。この引数が選択したフォームに存在しない場合は、現在のマップが使用されます。実際のクライアントは、現在ロードされているマップからタイルを読み取るだけです。

戻り値

レコードの配列。各 result[i] 要素の形式は次のとおりです。

1 つのレコードの 11 フィールドの配列。インデックスは 0 で始まります:

  • [0] kind — string: 「ランド」、「静的」、または「object」。
  • [1] serial - int: serial 動的アイテム。陸上/静的の場合は 0 です。
  • [2] graphic - int: type グラフィックス。
  • [3] x、[4] y - int: セルの世界座標。
  • [5] z - int: ワールドのベースの高さ。
  • [6] hue - int: 地面 0 に近い色。
  • [7] flags - int: タイルデータ フラグの下位 32 ビット。
  • [8] name - string: タイルデータからの名前。
  • [9] layer - int: タイルデータからの機器のレイヤー、地面 0 の近く。静的インデックスではありません。
  • [10] height - int: タイルデータからの高さ graphic、地面 0 付近。座標Zではありません。

ArrayLength(結果) - セルの数やルート ステップの数ではなく、レコードの数です。結果は空になる可能性があります。 1 つの x/y には、異なる Z を持つ複数のエントリを含めることができます。エントリ "object" には serial があります。エントリ「static」には使用可能な serial がありません。

動作

  • データは現在ロードされているマップを参照します。別のカードまたは到達不能なセルがあると、空の配列になります。直接タイル クエリでは、さらにマップの不一致が報告される場合があります。 GetWorldCell と GetWorldTilesArray は、そのようなメッセージを表示せずに、すぐに空の配列を返します。
  • 配列インデックスは 0 で始まります。フィールドを読み取る前に、ArrayLength を確認してください。 Z は世界高度を表します。 Layer はタイルデータからの機器プロパティ、index はセル エントリのシリアル番号です。
  • 静的部分は GetStaticTiles を使用します。現在の選択にはマルチ/アイテムも含まれます。ワールド アイテムは、さらに「object」と serial として表示される場合があります。各エントリを一意の項目として扱わないでください。
  • GetWorldTilesArray は、1 000 000 セルの領域を制限します。 0…65535 / 0…255 の外側の座標を超えると、部分的な配列ではなくコマンド エラーが発生します。頻繁にポーリングを行う場合は、小さなエリアを選択してください。

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

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

簡単な例

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

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

object? result = UO.GetWorldTilesArray(UO.GetX() - 1, UO.GetY() - 1, UO.GetX() + 1, UO.GetY() + 1, UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1。レコードのカウントとリスト - 直接スクリプト

引数と実行の流れ:

  • GetWorldCell は 1 つのセルを読み取ります。この例の GetWorldTilesArray は、境界線が有効になっている正方形 3×3 を読み取ります。
  • cell[i] は入れ子になった配列です。タイル[0] - カテゴリ、[2] - graphic、[5] - Z。
var cells = UO.GetWorldTilesArray(UO.GetX() - 1, UO.GetY() - 1, UO.GetX() + 1, UO.GetY() + 1, UO.WorldNum());
var i = 0;
while (Truth(i < ArrayLength(cells)))
{
    var tile = cells[i];
    UO.Print(tile[0] + ": " + Convert.ToString(tile[2]) + ", Z=" + Convert.ToString(tile[5]));
    i = i + 1;
}

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

2。項目 serial を持つエントリのみを表示 - スクリプト関数

引数と実行の流れ:

  • 領域はコンテナではなく座標によって選択されます。
  • kind="object" チェックは、シリアル項目をグランド/静的項目から分離します。 [1]にはserialが含まれます。
return  RunScenario();
 object? RunScenario()
{
    var cells = UO.GetWorldTilesArray(UO.GetX() - 1, UO.GetY() - 1, UO.GetX() + 1, UO.GetY() + 1, UO.WorldNum());
    var i = 0;
    while (Truth(i < ArrayLength(cells)))
    {
        var tile = cells[i];
        if (Truth(tile[0] == "object"))
        {
            UO.Print("Object serial: " + Convert.ToString(tile[1]));
        }

        i = i + 1;
    }

    return null;
}

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

3。文字の高さでレコードを選択 - スクリプト クラス

引数と実行の流れ:

  • tile[5] と GetZ() は同じワールド高さ単位で比較されます。
  • 等価 Z はベースをフィルタリングしますが、フロア全体の通過可能性や一致を意味するものではありません。
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 cells = UO.GetWorldTilesArray(UO.GetX() - 1, UO.GetY() - 1, UO.GetX() + 1, UO.GetY() + 1, UO.WorldNum());
        var i = 0;
        while (Truth(i < ArrayLength(cells)))
        {
            var tile = cells[i];
            if (Truth(tile[5] == UO.GetZ()))
            {
                UO.Print(tile[8]);
            }

            i = i + 1;
        }

        return null;
    }

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

コマンドの実装

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

UO.GetWorldTilesArray(minX, minY, maxX, maxY, map) — UO.GetWorldTilesArray(Any,Any,Any,Any,Any)

引数: minX (Any), minY (Any), maxX (Any), maxY (Any), map (Any)

結果: dynamic / Any.

呼び出し時:

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

public InjectionValue GetWorldTilesArray(InjectionValue minX, InjectionValue minY, InjectionValue maxX, InjectionValue maxY, InjectionValue map)

        {

            int firstX = Math.Min(NumberConversions.ToInt(minX), NumberConversions.ToInt(maxX));

            int lastX = Math.Max(NumberConversions.ToInt(minX), NumberConversions.ToInt(maxX));

            int firstY = Math.Min(NumberConversions.ToInt(minY), NumberConversions.ToInt(maxY));

            int lastY = Math.Max(NumberConversions.ToInt(minY), NumberConversions.ToInt(maxY));

            int world = NumberConversions.ToInt(map);

            if (firstX < 0 || firstY < 0 || lastX > ushort.MaxValue || lastY > ushort.MaxValue

                || world < 0 || world > byte.MaxValue)

                throw new NativeSubrutineException("World tile coordinates must be 0..65535 and the map must be 0..255.");

            if (((long)lastX - firstX + 1) * ((long)lastY - firstY + 1) > 1_000_000L)

                throw new NativeSubrutineException("World tile array is limited to 1,000,000 cells per call.");

            // Live world items have no per-result map field. Never combine the

            // current world's items with a request for a different map, or scan

            // every cell only to report the same unloaded-map failure repeatedly.

            if (world != bridge.WorldNumber)

                return new InjectionValue(Array.Empty<InjectionValue>());



            var result = new List<InjectionValue>();

            for (int cellX = firstX; cellX <= lastX; cellX++)

            for (int cellY = firstY; cellY <= lastY; cellY++)

            {

                InjectionValue cell = BuildWorldCell(cellX, cellY, world, false);

                if (cell.Kind == InjectionValueKind.Array)

                    result.AddRange(cell.Array);

            }



            foreach (int serial in bridge.GetWorldItems() ?? Array.Empty<int>())

            {

                int objectX = bridge.GetX(serial);

                int objectY = bridge.GetY(serial);

                if (objectX >= firstX && objectX <= lastX && objectY >= firstY && objectY <= lastY)

                    result.Add(BuildWorldTileRecord("object", serial, bridge.GetGraphics(serial), objectX, objectY,

                        bridge.GetZ(serial), bridge.GetColor(serial), 1));

            }

            return new InjectionValue(result.ToArray());

        }

UO.GetX

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

C# のシグネチャ

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

ロードされたオブジェクトまたは現在のキャラクターの X フィールドを読み取ります。

引数

  • id はオブジェクトのシリアル/ID であり、graphic/type ではありません。数値、16 進文字列、標準名 self/backpack/lasttarget/lastobject/lastcontainer/laststatus/finditem/lastcorpse または名前 AddObject。エイリアスを設定する必要があります。 Existsで存在を確認します。引数なしで登録されたフォームは self を使用します。

戻り値

int は X 座標です。不明なオブジェクトの場合は、0 が返されます。ゼロも有効な座標です。ワールド オブジェクトのセルで測定されます。これらは画面のピクセルではありません。

動作

  • クライアントがすでに知っている最新のデータが読み取られます。更新リクエストはサーバーに送信されません。
  • 不明なオブジェクトおよびまだ取得されていないプロパティは、null/空の値を持つ可能性があります。 Exists と特定のアクションの条件を確認してください。
  • 地面上のキャラクターまたはオブジェクトの場合、これはワールド座標です。コンテナ内のアイテムはガンプ内で X/Y 位置を持ちます。このコマンドは、それらをオーナーのワールド座標に変換しません。
  • オブジェクトの現在の座標が読み取られます。保留中のステップは、このコマンドではルート計算に変換されません。

例 .csx

int x = UO.GetX();
UO.Print($"X = {x}");

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

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

簡単な例

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

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

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

1。座標を読み取る - 直接スクリプト

引数と実行の流れ:

  • 引数のない形式では、現在の文字である self が選択されます。
  • 位置には、serial ではなく、X の座標が含まれます。
var position = UO.GetX();
UO.Print("X: " + Convert.ToString(position));

2。選択した文字と比較 - スクリプト関数

引数と実行の流れ:

  • lasttarget は、地面にロードされたキャラクターまたはアイテムを指す必要があります。
  • デルタ — 1 つの軸に沿った差。ルートの長さではありません。値は負の値になる可能性があります。
return  RunScenario();
 object? RunScenario()
{
    var other = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(other)))
    {
        var delta = UO.GetX(other) - UO.GetX();
        UO.Print("Difference: " + Convert.ToString(delta));
    }

    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。ポイントを覚えて後で比較する - スクリプト クラス

引数と実行の流れ:

  • id="self" は文字選択の明示的な形式です。 UO.Wait=500 ミリ秒。
  • 比較では、X 軸の変化のみが表示されます。他の軸または回転の変更はここでは考慮されません。
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.GetX("self");
        await Delay(500);
        var after = UO.GetX("self");
        if (Truth(before != after))
        {
            UO.Print("Coordinate changed");
        }

        return null;
    }

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

コマンドの実装

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

UO.GetX() — UO.GetX()

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

結果: int / Integer.

呼び出し時:

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

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

UO.GetX(id) — UO.GetX(Any)

引数: id (Any/Integer/String)

結果: int / Any.

呼び出し時:

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

case "getx": return new InjectionValue(bridge.GetX(Arg(0, bridge.Self)));

UO.GetX(id) — UO.GetX(Integer)

引数: id (Any/Integer/String)

結果: int / Integer.

呼び出し時:

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

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

UO.GetX(id) — UO.GetX(String)

引数: id (Any/Integer/String)

結果: int / Integer.

呼び出し時:

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

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

UO.GetY

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

C# のシグネチャ

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

ロードされたオブジェクトまたは現在のキャラクターの Y フィールドを読み取ります。

引数

  • id はオブジェクトのシリアル/ID であり、graphic/type ではありません。数値、16 進文字列、標準名 self/backpack/lasttarget/lastobject/lastcontainer/laststatus/finditem/lastcorpse または名前 AddObject。エイリアスを設定する必要があります。 Existsで存在を確認します。引数なしで登録されたフォームは self を使用します。

戻り値

int は Y 座標です。不明なオブジェクトの場合は、0 が返されます。ゼロも有効な座標です。ワールド オブジェクトのセルで測定されます。これらは画面のピクセルではありません。

動作

  • クライアントがすでに知っている最新のデータが読み取られます。更新リクエストはサーバーに送信されません。
  • 不明なオブジェクトおよびまだ取得されていないプロパティは、null/空の値を持つ可能性があります。 Exists と特定のアクションの条件を確認してください。
  • 地面上のキャラクターまたはオブジェクトの場合、これはワールド座標です。コンテナ内のアイテムはガンプ内で X/Y 位置を持ちます。このコマンドは、それらをオーナーのワールド座標に変換しません。
  • オブジェクトの現在の座標が読み取られます。保留中のステップは、このコマンドではルート計算に変換されません。

例 .csx

int y = UO.GetY();
UO.Print($"Y = {y}");

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

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

簡単な例

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

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

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

1。座標を読み取る - 直接スクリプト

引数と実行の流れ:

  • 引数のない形式では、現在の文字である self が選択されます。
  • 位置には、serial ではなく、Y の座標が含まれます。
var position = UO.GetY();
UO.Print("Y: " + Convert.ToString(position));

2。選択した文字と比較 - スクリプト関数

引数と実行の流れ:

  • lasttarget は、地面にロードされたキャラクターまたはアイテムを指す必要があります。
  • デルタ — 1 つの軸に沿った差。ルートの長さではありません。値は負の値になる可能性があります。
return  RunScenario();
 object? RunScenario()
{
    var other = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(other)))
    {
        var delta = UO.GetY(other) - UO.GetY();
        UO.Print("Difference: " + Convert.ToString(delta));
    }

    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。ポイントを覚えて後で比較する - スクリプト クラス

引数と実行の流れ:

  • id="self" は文字選択の明示的な形式です。 UO.Wait=500 ミリ秒。
  • 比較では、Y 軸の変化のみが表示されます。他の軸または回転の変更はここでは考慮されません。
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.GetY("self");
        await Delay(500);
        var after = UO.GetY("self");
        if (Truth(before != after))
        {
            UO.Print("Coordinate changed");
        }

        return null;
    }

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

コマンドの実装

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

UO.GetY() — UO.GetY()

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

結果: int / Integer.

呼び出し時:

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

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

UO.GetY(id) — UO.GetY(Any)

引数: id (Any/Integer/String)

結果: int / Any.

呼び出し時:

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

case "gety": return new InjectionValue(bridge.GetY(Arg(0, bridge.Self)));

UO.GetY(id) — UO.GetY(Integer)

引数: id (Any/Integer/String)

結果: int / Integer.

呼び出し時:

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

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

UO.GetY(id) — UO.GetY(String)

引数: id (Any/Integer/String)

結果: int / Integer.

呼び出し時:

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

public int GetY(string id) => GetY(GetObject(id));
⚠️ **GitHub.com Fallback** ⚠️