ZH TW 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

座標、距離、視線、越野能力和地圖資料。取得路線在Movement中單獨描述。

部分

主題 命令與解釋
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用於探路器進行局部障礙物檢查;該物件不是在伺服器上建立的。使用未編號文字的雙參數呼叫會保留舊值,並且不會在路徑查找器中新增靜態。

參數

  • staticItem — 數字 graphic 或舊文字值。
  • worldNum - 用於記錄或本地靜態的卡片的索引。
  • graphic — ID 從 0 到 65535 靜態。
  • z——高度。当添加到探路器时,该值被限制在带符号byte的范围内。
  • hue - hue;添加時,限制在0到65535的範圍內。
  • map — 地圖索引;對於管理器處理,範圍僅限於0–255。
  • x — 世界 X 用戶統計數據; int。管理器接受目前載入的地圖內的座標。
  • y — 世界 Y 用戶統計數據; int。管理器接受目前載入的地圖內的座標。

傳回值

已建立條目的正ID。對於六參數形式,負的graphic、x、y或map,以及graphic高於65535,結果為-1。 ID可以傳遞給UO.UserStaticExists、UO.RemoveUserStatic或用於檢查/刪除舊記錄。傳回的 ID 本身並不確認靜態將在伺服器上可見或套用。

行為

    • UO.AddUserStatic('tree', 0) - 由於tree不是數字,因此在運行時狀態中保存一對原始值作為遺留記錄;探路者不使用它。
  • 使用數字 graphic 的兩個參數呼叫會將 graphic 的靜態加到角色的目前座標,以及角色的 z 和 hue 0。
  • 六參數呼叫增加一個帶有給定 graphic、座標、海拔、hue 和地圖的靜態資料。尋路僅在活動地圖上並根據客戶端圖塊資料中的graphic標誌考慮它。

這些條目是腳本用戶端本地的:它們不會建立遊戲物件、發出網路請求或修改分片資料。

獨立的 C# 腳本

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

簡單範例

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

將一次呼叫的結果輸出到日誌。數值不會轉換成 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 檢查兩個地圖點之間的線路的局部通過性。

參數

  • 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:via CheckWorldStep 需要的 WorldNum == _world.MapIndex 和即時 Player.Pathfinder。未載入或請求另一個方面;沒有地圖/角色/探路者或步驟不可用 - 0。排除相同的 X/Y 會跳過整個細胞週期:X/Y 位於 0..65535, WorldNum V 0..255 和abs(Zfrom-Zto)<=20 回報 1 即使沒有加載卡或卡號不同。這不是幾何或可達性的證明。結果是局部的,不是解決方案 LOS 伺服器.

傳回值

int 1 — 局部光線已到達 X/Y,最終高度與 Zto 的差異不超過 20; 0—無效座標、障礙物或檢查限制。

行為

  • 光束使用 Bresenham 演算法傳播,最大步長為 4096。在每個單元格上,都會考慮BadLocations、CheckWorldStep 和返回的高度。
  • 當LosOptions != 0 另外使用CheckLosCell時;位 0x100 檢查對角線兩側的正方形。本機幾何檢查不會驗證特定於伺服器的LOS規則,並且不會移動任何內容。
  • 次要byte(值&0xFF)選擇演算法1..4;CheckLosCell中次byte的其他值使用3演算法。演算法1/2阻擋牆壁和不可通行,3另外NoShoot,4僅使用0x200啟用NoShoot,僅使用0x400P18⟧。位元0x100也檢查每個對角波束步長的兩側單元是否有任何選定的演算法。 value=0 禁用額外的 CheckLosCell/對角線檢查,但 BadLocations 和 CheckWorldStep 保留。例如4+0x100+0x200+0x400選擇具有三個標誌的自訂; setter 保留原始的int,而不是標準化演算法。
  • 非零長度的光束僅讀取目前載入的_world.Map/World.Map:via CheckWorldStep 需要的 WorldNum == _world.MapIndex 和即時 Player.Pathfinder。未載入或請求另一個方面;沒有地圖/角色/探路者或步驟不可用 - 0。排除相同的 X/Y 會跳過整個細胞週期:X/Y 位於 0..65535, WorldNum V 0..255 和abs(Zfrom-Zto)<=20 回報 1 即使沒有加載卡或卡號不同。這不是幾何或可達性的證明。結果是局部的,不是解決方案 LOS 伺服器.
  • CheckLosCell 繞過一個單元格的載入陸地/靜態/多/項目。具有ABS的不可逾越的土地塊(rayZ-land.Z)<=20。靜態/多/項目標誌僅適用於圖塊範圍。Z-2 .. tile.Z+max(1,Height)+2;在檢查 Wall/Impassable/ 之前跳過允許的自訂窗口NoShoot。光束 X/Y 使用 Bresenham,最大 4096 步驟; Z 從表面獲取 CheckWorldStep,不插值到Zto,最終的高度公差為 20.

獨立的 C# 腳本

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

簡單範例

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

將一次呼叫的結果輸出到日誌。數值不會轉換成 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。檢查相鄰單元格 - 腳本函數

參數與執行流程:

  • 從本地地圖讀取相鄰單元格的高度和滲透率。
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 - 無回傳值。

行為

  • State.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而不是不同的目錄。這是局部掩模變換;不請求tiledata。
  • API註冊使用object? ,但Arg(1)調度程序發送int。當轉換為 ulong 時,負 int 符號擴展。 GetTileFlags 也只傳回已簽署的 int 的低 32 位元:此相容對不提供完整的 64 位元tiledata 合約。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。空遮罩 - 直接腳本

參數與執行流程:

  • 掩碼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);

計算兩個世界點之間的像元距離:X 和 Y 之間的最大絕對差。

參數

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

傳回值

int — 單元格中的距離,有效座標為非負值。 0 表示相同的XY、1 - 一個單元格。這是一個數量,而不是成功的標誌。單獨的比較距離 <= 2 回傳 bool true 或 false;距離本身仍為int。

行為

  • 僅計算座標:沒有批次,沒有等待,沒有地圖加載,沒有障礙物檢查,沒有Z,也沒有世界地圖。團隊不尋找可行的路線,也不保證目標的實現。這些點必須屬於同一座標系;避開障礙物可以延長道路。
  • 所有四個參數都是必需的。發送記錄範圍 0..65535 內的世界座標 int。 object?簽名中的 表示通用適配器,而不是該商品的ID。這些指令沒有預設值、箱子內的座標、第五個Z和一個物件的重載。
  • 公式:Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom))。當您重新排列點時,結果是相同的。這不是歐幾裡得距離,不是差值總和,也不是繞過障礙物時的步數。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。直接計算-直接腳本

參數與執行流程:

  • 由(100,100)到(103,104):絕對差為3和4,最大為4。主要回報int4。
  • int — 單元格中的距離,有效座標為非負值。 0 表示相同的XY、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」:第一個單位是距離,第二個單位是比較的邏輯結果。
  • int — 單元格中的距離,有效座標為非負值。 0 表示相同的XY、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 - 一個單元格。這是一個數量,而不是成功的標誌。單獨的比較距離 <= 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 — 一個參數:serial 或載入物件的別名,也就是您想要取得的距離。
  • x — 兩個參數:世界目的地。開頭是GetX(self)、GetY(self)。
  • y — 兩個參數:世界目的地。開頭是GetX(self)、GetY(self)。
  • id1 - 三參數形式 - serial/座標作為原點的物件的別名。
  • x1 — 四參數形式,原點座標。此形式不需要任何物件。
  • y1 — 四參數形式,原點座標。此形式不需要任何物件。
  • x2 — 在具有三/四個參數的表單中,結束座標。不要將它們與第二個物件的 serial 混淆。
  • y2 — 在具有三/四個參數的表單中,結束座標。不要將它們與第二個物件的 serial 混淆。

傳回值

int - max(abs(x2-x1), abs(y2-y1)):到相鄰單元格的水平、垂直和對角線距離為1。不考慮高度Z和障礙物。對於未知的serial,單一參數形式傳回0;對於沒有字元的現有物件 - 65535。對於未知的 id1,三參數形式使用 (0,0),因此首先檢查 Exists(id1)。

行為

  • 單物件形式使用目前 World.RangeSize 範圍中心和移動生物步驟佇列中的最後一個位置。在移動過程中,結果可能與 GetX/GetY 的計算結果不同。
  • 座標表格與傳遞的數字一起使用。對於遊戲座標,使用範圍0..65535;不支援極端 int 值和差異溢出座標。
  • 團隊不承諾目標一定能夠達成。要移動,您需要 MoveXY/NewMoveXY 並檢查其結果;牆壁可以使實際路徑更長。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。檢查目標範圍 - 直接腳本

參數與執行流程:

  • 目标是serial,而不是type。 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。兩點之間的距離 - 腳本函數

參數與執行流程:

  • x1=100,y1=200,x2=103,y2=204。差別是3和4。
  • 結果是4,不是7,也不是歐幾裡得5。
return  RunScenario();
 object? RunScenario()
{
    var distance = UO.GetDistance(100, 200, 103, 204);
    UO.Print(Convert.ToString(distance));
    return null;
}

3。從物件和角色開始 - 腳本類

參數與執行流程:

  • 兩個 x/y 參數使用 self 的目前位置。三個參數 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 — 卡號。如果所選表單中不存在此參數,則使用目前對應。真正的客戶端僅從目前載入的地圖中讀取圖塊。

傳回值

一筆記錄的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:tiledata 標誌的低 32 位。
  • [8] name - string:來自tiledata的名稱。
  • [9] layer - int:來自tiledata的設備層,靠近地面0;不是靜態索引。
  • [10] height - int:距tiledata的高度graphic,近地面0;不是座標Z。

空數組[]表示沒有條目或無法存取的卡片/單元。對於GetStaticTileAt,負/太大的索引也會產生[];索引溢位不會選擇其他人的條目。

行為

  • 數據指的是目前載入的地圖。另一張卡片或無法存取的儲存格會導致空數組。直接圖塊查詢也可能報告地圖不符; GetWorldCell和GetWorldTilesArray立即傳回一個空數組,沒有這樣的訊息。
  • 數組索引以 0 開頭。在讀取字段之前檢查ArrayLength。 Z表示世界海拔高度; Layer 是來自tiledata 的裝置屬性,index 則是單元條目的序號。

獨立的 C# 腳本

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

簡單範例

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

將一次呼叫的結果輸出到日誌。數值不會轉換成 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索引=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] 是tiledata 的高度尺寸,而不是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);

從tiledata讀取擴展的土地參考記錄。

參數

  • tile 是一個 Graphic/type 條目,而不是 serial,也不是單元格內的索引。土地表由球隊名稱本身選擇。

傳回值

有效 graphic 的 7 欄位數組。除名稱 (string) 之外的所有欄位 int:

  • [0] graphic — graphic/type 記錄。
  • [1] flags — 低位 32 標誌位。
  • [2] name - 來自tiledata的名稱(string)。
  • [3] texId - ID 地面紋理。
  • [4] wet — 1 如果安裝濕式,否則 0.
  • 若無法通行則[5] impassable — 1,否則0。
  • 若noDiagonal,則[6] noDiagonal — 1,否則0。

對於無效的graphic,沒有引用屬性:傳回一個短數組[переданный graphic, 0, ""]。在閱讀屬性之前檢查完整長度。這不是 Pascal 記錄或物件清單。

行為

  • 該指令讀取tiledata,且不需要世界上具有該graphic的項目。標誌描述資源;結果不會取代完整的路由檢查。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。讀取條目名稱 - 直接腳本

參數與執行流程:

  • Tile 是所選表格的數字 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 — 兩個角度的世界座標(含); 0..65535。重新排列的角度被標準化。面積不超過1000000個單元格;無效邊界會在讀取地圖之前導致腳本錯誤。
  • ymin — 兩個角度的世界座標(含); 0..65535。重新排列的角度被標準化。面積不超過1000000個單元格;無效邊界會在讀取地圖之前導致腳本錯誤。
  • xmax — 兩個角度的世界座標(含); 0..65535。重新排列的角度被標準化。面積不超過1000000個單元格;無效邊界會在讀取地圖之前導致腳本錯誤。
  • ymax — 兩個角度的世界座標(含); 0..65535。重新排列的角度被標準化。面積不超過1000000個單元格;無效邊界會在讀取地圖之前導致腳本錯誤。
  • worldNum — 地圖/構面 0..255;使用UO.WorldNum()。另一個映射給出了一個空數組。如果映射在區塊之間發生變化,則部分結果將被丟棄。
  • tileType - 一塊 graphic/type 方塊,通常為 0..65535;這不是serial。 0 是確切的 graphic 0,-1 不代表任何 type。不匹配的 type 會給出空白結果。

傳回值

條目數組 [graphic, X, Y, Z];所有字段int。 graphic - 地球的type,Z - 地球的基礎。沒有符合項:空數組。數量是ArrayLength(結果),而不是結果本身。索引以 0 開頭。這不是 bool、serial 或 Pascal 記錄;沒有第七個輸出參數。

行為

  • 讀取本地資料。搜尋不會變更 FindItem/FindCount,且不會執行移動、目標或網路指令。
  • 順序:X 升序,X - Y 內升序。一個單元格的記錄保留了橋接的順序;它不按距離或高度排序。
  • 搜尋以最多 32 個單元的區塊處理,軟預算約為 1 毫秒。兩次服務之間會檢查取消情況。複雜的單元格或冷讀可能會超出預算。最好劃分一個大的區域;世界可以在閱讀中改變。

獨立的 C# 腳本

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

簡單範例

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

將一次呼叫的結果輸出到日誌。數值不會轉換成 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,map — 目前地圖。區域3×3包括邊界。在Ex中,兩個type以正常形式一被傳送。更改範例以適合您的資源;這是一個 graphic,而不是 ID 物件。
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從較大角度轉移到較小角度。演算法本身對邊界進行標準化。 row - 一筆記錄; 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。具有重試限制的重新輪詢 - 腳本類

參數與執行流程:

  • 一個儲存格的搜尋次數不超過 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 — 兩個角度的世界座標(含); 0..65535。重新排列的角度被標準化。面積不超過1000000個單元格;無效邊界會在讀取地圖之前導致腳本錯誤。
  • ymin — 兩個角度的世界座標(含); 0..65535。重新排列的角度被標準化。面積不超過1000000個單元格;無效邊界會在讀取地圖之前導致腳本錯誤。
  • xmax — 兩個角度的世界座標(含); 0..65535。重新排列的角度被標準化。面積不超過1000000個單元格;無效邊界會在讀取地圖之前導致腳本錯誤。
  • ymax — 兩個角度的世界座標(含); 0..65535。重新排列的角度被標準化。面積不超過1000000個單元格;無效邊界會在讀取地圖之前導致腳本錯誤。
  • worldNum — 地圖/構面 0..255;使用UO.WorldNum()。另一個映射給出了一個空數組。如果映射在區塊之間發生變化,則部分結果將被丟棄。
  • tileTypes — 数值数组graphic/type;每个匹配的type均已打开。重複type不會重複條目。標量也被視為 1 type。空数组意味着一切type;包含一个 0 的数组仅搜索 0。

傳回值

條目數組 [graphic, X, Y, Z];所有字段int。 graphic - 地球的type,Z - 地球的基礎。沒有符合項:空數組。數量是ArrayLength(結果),而不是結果本身。索引以 0 開頭。這不是 bool、serial 或 Pascal 記錄;沒有第七個輸出參數。

行為

  • 讀取本地資料。搜尋不會變更 FindItem/FindCount,且不會執行移動、目標或網路指令。
  • 順序:X 升序,X - Y 內升序。一個單元格的記錄保留了橋接的順序;它不按距離或高度排序。
  • 搜尋以最多 32 個單元的區塊處理,軟預算約為 1 毫秒。兩次服務之間會檢查取消情況。複雜的單元格或冷讀可能會超出預算。最好劃分一個大的區域;世界可以在閱讀中改變。

獨立的 C# 腳本

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

簡單範例

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

將一次呼叫的結果輸出到日誌。數值不會轉換成 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,map — 目前地圖。區域3×3包括邊界。在Ex中,兩個type以正常形式一被傳送。更改範例以適合您的資源;這是一個 graphic,而不是 ID 物件。
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從較大角度轉移到較小角度。演算法本身對邊界進行標準化。 row - 一筆記錄; 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。具有重試限制的重新輪詢 - 腳本類

參數與執行流程:

  • 一個儲存格的搜尋次數不超過 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);

讀取目前卡的一格的土地。

參數

  • x — 目前載入地圖的 X 單元格;世界座標,而非阿甘內的位置。
  • y — 目前載入地圖的 Y 單元格;世界座標,而非阿甘內的位置。
  • map — 卡號。如果所選表單中不存在此參數,則使用目前對應。真正的客戶端僅從目前載入的地圖中讀取圖塊。

傳回值

三個int的陣列:[0] graphic - type 著陸; [1] z — 地球的世界高度; [2] flags —tiledata 標誌的低 32 位。如果卡片/牌不可用或沒有土地,則傳回空數組[]。這是一個平面記錄,而不是三個圖塊的列表。

行為

  • 數據指的是目前載入的地圖。另一張卡片或無法存取的儲存格會導致空數組。直接圖塊查詢也可能報告地圖不符; GetWorldCell和GetWorldTilesArray立即傳回一個空數組,沒有這樣的訊息。
  • 數組索引以 0 開頭。在讀取字段之前檢查ArrayLength。 Z表示世界海拔高度; Layer 是來自tiledata 的裝置屬性,index 則是單元條目的序號。

獨立的 C# 腳本

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

簡單範例

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

將一次呼叫的結果輸出到日誌。數值不會轉換成 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() 選擇目前地圖。
  • 在建立索引之前會檢查三個字段是否存在;土地[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和map被保留。
  • 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);

計算一個單元格中的非地球幾何記錄。

參數

  • x — 目前地圖單元格的世界座標 X,而非 Gump 中的位置。
  • y — 目前地圖單元格的世界 Y 座標。
  • worldNum — 卡/面編號;使用UO.WorldNum()。僅讀取目前載入的卡片。

傳回值

int — GetStaticTiles 收到的三元組graphic/Z/hue 的數量。當前客戶端中考慮了Static、Multi、Item:多個相同高度的記錄分別進行統計。空方塊/另一張卡給0。這不是設備層數、樓層數、唯一高度數或bool。

行為

  • 此命令讀取本機地圖,不會觸發移動或目標。超出地圖大小的儲存格不會被相鄰列中的儲存格取代。
  • Z,graphic/type的高度,hue的顏色,標誌和設備層有不同的意義。 Null graphic 或 Z=0 可能是有效資料;檢查結果表。
  • 此構圖對應於ReadStaticsXY,而不是GetLayer或ObjAtLayer。該客戶端包括動態項目和多部分。

獨立的 C# 腳本

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

簡單範例

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

將一次呼叫的結果輸出到日誌。數值不會轉換成 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 表示一次進入,而不是邏輯上的成功。
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。比較兩個地圖圖層的內容 - 腳本類

參數與執行流程:

  • 檢查同一世界中的目前單元格和相鄰單元格。層數不是它們的高度或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);

在一個地圖方塊中讀取graphic、高度和土地標誌。

參數

  • x — 目前地圖單元格的世界座標 X,而非 Gump 中的位置。
  • y — 目前地圖單元格的世界 Y 座標。
  • worldNum — 卡/面編號;使用UO.WorldNum()。僅讀取目前載入的卡片。

傳回值

三個數組 int: [0] graphic/type 土地, [1] 全球的 Z 陸地基地, [2] 青少年組 32 tiledata 標誌位。無法存取的儲存格或其他卡片會導致空數組。這不是 serial, bool 或帕斯卡記錄;不要使用 .Tile/ 欄位。Z。對於字段數調用 ArrayLength(cell).

行為

  • 此命令讀取本機地圖,不會觸發移動或目標。超出地圖大小的儲存格不會被相鄰列中的儲存格取代。
  • Z,graphic/type的高度,hue的顏色,標誌和設備層有不同的意義。 Null graphic 或 Z=0 可能是有效資料;檢查結果表。

獨立的 C# 腳本

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

簡單範例

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

將一次呼叫的結果輸出到日誌。數值不會轉換成 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為當前卡。單元格儲存一次呼叫的所有欄位。
  • 索引以 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。比較兩個相鄰單元格 - 腳本函數

參數與執行流程:

  • 第二次呼叫讀取東邊的方塊,兩者都使用同一張卡。
  • 地面高度的差異並不能證明通過性:牆壁、靜力學和其他物體是單獨檢查的。
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 一起設定一步的方向,而不是完整的路線。
  • 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 和網址替換成自己的值。

將一次呼叫的結果輸出到日誌。數值不會轉換成 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。找出東部台階的估計高度 - 直接腳本

參數與執行流程:

  • 六個參數:原始 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 圖形檔案中取得單一圖形影像,並將其以 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的結果取決於載入的顏色表。

傳回值

陣列是一個一維數組int,每個元素0..255代表完整的BMP檔案的一個位元組,從檔案頭開始。使用 0 進行索引。它不是bool,不是ID,不是路徑,不是Bitmap對象,也不是顏色數組RGB。空數組意味著數字 type 無效、美術遺失或未載入所需的遊戲檔案。看標題之前先看一下ArrayLength;空數組不等於數字0。

行為

  • 恰好需要两个参数。读取是从客户端的本地资源执行的,无需向服务器发出请求。世界上某个物体的存在不是必需的。對於mobile,GetType中的數字意味著body;這裡,相同的編號涉及不同的資源部分,並且不提供角色動畫的圖像。
  • 結果格式:未壓縮 24-bit 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 的順序佔用三個位元組。這些行從下到上並用零位元組填充,最多為 4 的倍數。字串長度 = Int((寬度 * 3 + 3) / 4) * 4。對於從左上角開始的 x,y 座標,偏移量 = 54 + (高度 - 1 - y) * 步幅 + x * 3。訪問之前檢查數組的邊界和大小。
  • 原始藝術的透明度未保留:BMP此處不包含alpha。透明背景變成黑色,透過結果無法將其與原來的黑色像素區分開來。不涉及截圖、遊戲視窗縮放、光線、可見範圍和物件座標。
  • 對於每次調用,都會產生一個圖像數組。如果您多次需要藝術,請將結果保存到變數中並再次處理。不要為循環內的每個像素呼叫載入/著色。相同的參數和未更改的檔案給出相同的結果;不同的hue不需要改變每個像素,尤其是PartialHue。
  • 真正的 .bmp 需要精確位元組的二進位輸出,而不需要文字編碼。常規 File.WriteLine 或 JsonSave 不會建立 BMP。下面的範例處理記憶體中的數組,並且不保證存在不存在的 File.WriteBytes。

獨立的 C# 腳本

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

簡單範例

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

將一次呼叫的結果輸出到日誌。數值不會轉換成 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 的四個位元組。該腳本可以幫助您選擇單元格的大小;不會自動建立一個 Gump。
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,也不是錯誤。因此, if rgb < 0 的測試與 if 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。相同的圖形具有相同的尺寸。如果結果為空,則不開始比較。
  • 更改計算顏色通道的不同字節,而不是物件或像素數。一個像素最多可以改變三個位元組。 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);

傳回所選儲存格上方一筆記錄的擴充記錄。

參數

  • x — 目前載入地圖的 X 單元格;世界座標,而非阿甘內的位置。
  • y — 目前載入地圖的 Y 單元格;世界座標,而非阿甘內的位置。
  • map — 卡號。如果所選表單中不存在此參數,則使用目前對應。真正的客戶端僅從目前載入的地圖中讀取圖塊。
  • index — 結果GetStaticTiles 中記錄的序號,從0 開始。這不是graphic,不是Z,也不是一層裝備。在3參數的形式中,索引排在第三位;以4參數的形式表示第三個地圖,第四個索引。

傳回值

一筆記錄的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:tiledata 標誌的低 32 位。
  • [8] name - string:來自tiledata的名稱。
  • [9] layer - int:來自tiledata的設備層,靠近地面0;不是靜態索引。
  • [10] height - int:距tiledata的高度graphic,近地面0;不是座標Z。

空數組[]表示沒有條目或無法存取的卡片/單元。對於GetStaticTileAt,負/太大的索引也會產生[];索引溢位不會選擇其他人的條目。

行為

  • 數據指的是目前載入的地圖。另一張卡片或無法存取的儲存格會導致空數組。直接圖塊查詢也可能報告地圖不符; GetWorldCell和GetWorldTilesArray立即傳回一個空數組,沒有這樣的訊息。
  • 數組索引以 0 開頭。在讀取字段之前檢查ArrayLength。 Z表示世界海拔高度; Layer 是來自tiledata 的裝置屬性,index 則是單元條目的序號。

獨立的 C# 腳本

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

簡單範例

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

將一次呼叫的結果輸出到日誌。數值不會轉換成 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索引=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] 是tiledata 的高度尺寸,而不是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);

從tiledata讀取靜態擴充引用條目graphic。

參數

  • tile 是一個 Graphic/type 條目,而不是 serial,也不是單元格內的索引。靜態表由命令名稱本身選擇。

傳回值

有效 graphic 的 17 欄位數組。除名稱 (string) 之外的所有欄位 int:

  • [0] graphic — graphic/type 記錄。
  • [1] flags — 低位 32 標誌位。
  • [2] name - 來自tiledata的名稱(string)。
  • [3] weight — 來自tiledata的權重。
  • [4] layer——設備層號。
  • [5] count是tiledata中的Count字段,而不是世界上的項目數。
  • [6] animId - ID 動畫。
  • [7] hue — hue 來自tiledata。
  • [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 記錄或物件清單。

行為

  • 該指令讀取tiledata,且不需要世界上具有該graphic的項目。標誌描述資源;結果不會取代完整的路由檢查。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。讀取條目名稱 - 直接腳本

參數與執行流程:

  • Tile 是所選表格的數字 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);

讀取目前地圖的一個儲存格中地面以上的條目。

參數

  • 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 是來自tiledata 的裝置屬性,index 則是單元條目的序號。
  • 目前的橋列出了單元鏈中的靜態、多和世界項目。命令名稱不僅僅將結果限制為 statics.mul 條目。鏈序不保證 Z 排序。

獨立的 C# 腳本

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

簡單範例

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

將一次呼叫的結果輸出到日誌。數值不會轉換成 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 選擇相鄰單元格。
  • tiles[2] — 第一個條目的顏色;這不是第三塊磁磚。
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        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 — 兩個角度的世界座標(含); 0..65535。重新排列的角度被標準化。面積不超過1000000個單元格;無效邊界會在讀取地圖之前導致腳本錯誤。
  • ymin — 兩個角度的世界座標(含); 0..65535。重新排列的角度被標準化。面積不超過1000000個單元格;無效邊界會在讀取地圖之前導致腳本錯誤。
  • xmax — 兩個角度的世界座標(含); 0..65535。重新排列的角度被標準化。面積不超過1000000個單元格;無效邊界會在讀取地圖之前導致腳本錯誤。
  • ymax — 兩個角度的世界座標(含); 0..65535。重新排列的角度被標準化。面積不超過1000000個單元格;無效邊界會在讀取地圖之前導致腳本錯誤。
  • worldNum — 地圖/構面 0..255;使用UO.WorldNum()。另一個映射給出了一個空數組。如果映射在區塊之間發生變化,則部分結果將被丟棄。
  • tileType - 一塊 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 記錄;沒有第七個輸出參數。

行為

  • 讀取本地資料。搜尋不會變更 FindItem/FindCount,且不會執行移動、目標或網路指令。
  • 順序:X 升序,X - Y 內升序。一個單元格的記錄保留了橋接的順序;它不按距離或高度排序。
  • 搜尋以最多 32 個單元的區塊處理,軟預算約為 1 毫秒。兩次服務之間會檢查取消情況。複雜的單元格或冷讀可能會超出預算。最好劃分一個大的區域;世界可以在閱讀中改變。
  • 目前客戶端的Static分支包括來自cell的Static、Multi和Item,包括地面上載入的物品;不包括陸地和移動。它比僅靜態文件的經典選擇更廣泛。

獨立的 C# 腳本

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

簡單範例

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

將一次呼叫的結果輸出到日誌。數值不會轉換成 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,map — 目前地圖。區域3×3包括邊界。在Ex中,兩個type以正常形式一被傳送。更改範例以適合您的資源;這是一個 graphic,而不是 ID 物件。
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從較大角度轉移到較小角度。演算法本身對邊界進行標準化。 row - 一筆記錄; 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。具有重試限制的重新輪詢 - 腳本類

參數與執行流程:

  • 一個儲存格的搜尋次數不超過 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 — 兩個角度的世界座標(含); 0..65535。重新排列的角度被標準化。面積不超過1000000個單元格;無效邊界會在讀取地圖之前導致腳本錯誤。
  • ymin — 兩個角度的世界座標(含); 0..65535。重新排列的角度被標準化。面積不超過1000000個單元格;無效邊界會在讀取地圖之前導致腳本錯誤。
  • xmax — 兩個角度的世界座標(含); 0..65535。重新排列的角度被標準化。面積不超過1000000個單元格;無效邊界會在讀取地圖之前導致腳本錯誤。
  • ymax — 兩個角度的世界座標(含); 0..65535。重新排列的角度被標準化。面積不超過1000000個單元格;無效邊界會在讀取地圖之前導致腳本錯誤。
  • worldNum — 地圖/構面 0..255;使用UO.WorldNum()。另一個映射給出了一個空數組。如果映射在區塊之間發生變化,則部分結果將被丟棄。
  • tileTypes — 数值数组graphic/type;每个匹配的type均已打开。重複type不會重複條目。標量也被視為 1 type。空数组意味着一切type;包含一个 0 的数组仅搜索 0。

傳回值

數組條目 [graphic, X, Y, Z, hue];所有字段int。 graphic - type、Z - 基礎、hue - 顏色。多個單元格條目保持獨立。沒有符合項:空數組。數量是ArrayLength(結果),而不是結果本身。下標以0開頭。這不是 bool、serial 或 Pascal 記錄;沒有第七個輸出參數。

行為

  • 讀取本地資料。搜尋不會變更 FindItem/FindCount,且不會執行移動、目標或網路指令。
  • 順序:X 升序,X - Y 內升序。一個單元格的記錄保留了橋接的順序;它不按距離或高度排序。
  • 搜尋以最多 32 個單元的區塊處理,軟預算約為 1 毫秒。兩次服務之間會檢查取消情況。複雜的單元格或冷讀可能會超出預算。最好劃分一個大的區域;世界可以在閱讀中改變。
  • 目前客戶端的Static分支包括來自cell的Static、Multi和Item,包括地面上載入的物品;不包括陸地和移動。它比僅靜態文件的經典選擇更廣泛。

獨立的 C# 腳本

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

簡單範例

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

將一次呼叫的結果輸出到日誌。數值不會轉換成 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,map — 目前地圖。區域3×3包括邊界。在Ex中,兩個type以正常形式一被傳送。更改範例以適合您的資源;這是一個 graphic,而不是 ID 物件。
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從較大角度轉移到較小角度。演算法本身對邊界進行標準化。 row - 一筆記錄; 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。具有重試限制的重新輪詢 - 腳本類

參數與執行流程:

  • 一個儲存格的搜尋次數不超過 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,而非 Gump 中的位置。
  • 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 和網址替換成自己的值。

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

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

1。角色平均高度 - 直接腳本

參數與執行流程:

  • 所有三個參數都與地圖的當前單元格相關。 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。地圖在兩次調用之間仍可能發生變化。
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);

從tiledata條目中讀取屬性位元遮罩graphic。

參數

  • group - 0 - 土地表; 1 — 靜態graphic表。此實作將任何非空組視為第二個表;使用0或1。
  • tileId —tiledata 中的圖形/type 條目,通常是整數0…65535。這不是物件的 serial 或單元格內的靜態索引。

傳回值

int —tiledata 標誌的低 32 位。最高有效位元組產生負號。 0表示沒有這些標誌或tileId無效;這不是錯誤的獨立標誌,也不是bool。可以同時設定多個屬性。

行為

  • 此指令讀取參考條目graphic;不需要世界座標。即使 tileId 相同,group=0 和 group=1 選擇不同的表。
  • 該屬性是從 graphic 資料中讀取的,而不是從特定項目的當前狀態中讀取的。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。讀取已知靜態graphic的屬性 - 直接腳本

參數與執行流程:

  • group=1 選擇靜態tiledata; tileId=0x0CCA - graphic 樹。
  • value 包含 Returns 部分中所述的結果;其意義與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。讀取角色下地面的屬性-場景類

參數與執行流程:

  • 前兩個參數GetLandscapeTile是當前世界X/Y;第三個是當前地圖。
  • 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表。此實作將任何非空組視為第二個表;使用0或1。
  • tileId —tiledata 中的圖形/type 條目,通常是整數0…65535。這不是物件的 serial 或單元格內的靜態索引。

傳回值

int 是來自tiledata 的圖形高度,以Z 為單位。这是图形的高度尺寸,而不是其基础Z的世界坐标。对于地面、缺失条目或零高度,返回0。身高本身並不能證明越野能力。

行為

  • 此指令讀取參考條目graphic;不需要世界座標。即使 tileId 相同,group=0 和 group=1 選擇不同的表。
  • 該屬性是從 graphic 資料中讀取的,而不是從特定項目的當前狀態中讀取的。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。讀取已知靜態graphic的屬性 - 直接腳本

參數與執行流程:

  • group=1 選擇靜態tiledata; tileId=0x0CCA - graphic 樹。
  • value 包含 Returns 部分中所述的結果;其意義與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。讀取角色下地面的屬性-場景類

參數與執行流程:

  • 前兩個參數GetLandscapeTile是當前世界X/Y;第三個是當前地圖。
  • 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);

從tiledata條目中讀取設備層編號。

參數

  • group - 0 - 土地表; 1 — 靜態graphic表。此實作將任何非空組視為第二個表;使用0或1。
  • tileId —tiledata 中的圖形/type 條目,通常是整數0…65535。這不是物件的 serial 或單元格內的靜態索引。

傳回值

int — 設備層編號graphic:例如1=Rhand、2=Lhand、21=Backpack。對於地面、缺失條目或空層,返回0。這不是單元格、樓層、也不是 Z 中的靜力學順序。

行為

  • 此指令讀取參考條目graphic;不需要世界座標。即使 tileId 相同,group=0 和 group=1 選擇不同的表。
  • 該屬性是從 graphic 資料中讀取的,而不是從特定項目的當前狀態中讀取的。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。讀取已知靜態graphic的屬性 - 直接腳本

參數與執行流程:

  • group=1 選擇靜態tiledata; tileId=0x0CCA - graphic 樹。
  • value 包含 Returns 部分中所述的結果;其意義與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。讀取角色下地面的屬性-場景類

參數與執行流程:

  • 前兩個參數GetLandscapeTile是當前世界X/Y;第三個是當前地圖。
  • 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表。此實作將任何非空組視為第二個表;使用0或1。
  • tileId —tiledata 中的圖形/type 條目,通常是整數0…65535。這不是物件的 serial 或單元格內的靜態索引。

傳回值

string — 遊戲檔案的名稱tiledata.空字串意味著空名稱或無效的tileId。名稱取自遊戲資源,不會自動翻譯為介面語言IDE。這不是伺服器中特定項目的名稱。

行為

  • 此指令讀取參考條目graphic;不需要世界座標。即使 tileId 相同,group=0 和 group=1 選擇不同的表。
  • 該屬性是從 graphic 資料中讀取的,而不是從特定項目的當前狀態中讀取的。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。讀取已知靜態graphic的屬性 - 直接腳本

參數與執行流程:

  • group=1 選擇靜態tiledata; tileId=0x0CCA - graphic 樹。
  • value 包含 Returns 部分中所述的結果;其意義與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。讀取角色下地面的屬性-場景類

參數與執行流程:

  • 前兩個參數GetLandscapeTile是當前世界X/Y;第三個是當前地圖。
  • 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);

從目前載入的遊戲卡的單元格的物件鏈中讀取符合的graphicID。

參數

  • 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,...]。地圖錯誤給出一個空數組和一條訊息;沒有匹配也會導致空數組。

行為

  • 遵循世界地圖。GetTile(x,y).TNext 並檢查 tileStart<=Graphic<=tileEnd。物件類型不會單獨過濾:它是一個單元鏈,而不僅僅是靜態資料。
  • 此命令讀取客戶端載入的幾何圖形。不會載入來自另一個地圖/構面的資料。 uoPath參數不用於下載檔案;條目數等於陣列長度/4。

獨立的 C# 腳本

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

簡單範例

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

將一次呼叫的結果輸出到日誌。數值不會轉換成 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。目前單元格的所有圖形都是直接腳本

參數與執行流程:

  • 每個條目佔用四個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管理器,並且對於同一世界/設定檔的腳本/聊天/巨集是通用的,且不屬於一個腳本。另一個進程或明顯獨立的InjectionRuntimeState具有不同的狀態。載入/清除設定檔可以取代它;已儲存的serial仍然會根據載入的世界進行檢查。

獨立的 C# 腳本

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

簡單範例

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

將一次呼叫的結果輸出到日誌。數值不會轉換成 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, serializedText],依 id 排序。每個id為int,serializedText - string;空字典給出空數組。

行為

  • 讀取狀態。 UserStatics。幾何符號儲存為「graphic|x|y|z|hue|map」;較舊的文字條目 AddUserStatic 可能有不同的格式。這些是本機使用者條目,並非所有靜態地圖。
  • 讀取目前本地狀態。沒有軟體包、目標或自動更新;個別讀取可能會看到不同的狀態。
  • 在常規用戶端主機中,此狀態資料取自GetPersistentState管理器,並且對於同一世界/設定檔的腳本/聊天/巨集是通用的,且不屬於一個腳本。另一個進程或明顯獨立的InjectionRuntimeState具有不同的狀態。載入/清除設定檔可以取代它;已儲存的serial仍然會根據載入的世界進行檢查。

獨立的 C# 腳本

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

簡單範例

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

將一次呼叫的結果輸出到日誌。數值不會轉換成 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] 元素具有以下格式:

一筆記錄的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:tiledata 標誌的低 32 位。
  • [8] name - string:來自tiledata的名稱。
  • [9] layer - int:來自tiledata的設備層,靠近地面0;不是靜態索引。
  • [10] height - int:距tiledata的高度graphic,近地面0;不是座標Z。

ArrayLength(結果) - 記錄數,不是儲存格數,也不是路線步驟數。結果可能為空。一個 x/y 可以有多個不同 Z 的條目。條目「object」有serial;條目「static」沒有可用的serial。

行為

  • 數據指的是目前載入的地圖。另一張卡片或無法存取的儲存格會導致空數組。直接圖塊查詢也可能報告地圖不符; GetWorldCell和GetWorldTilesArray立即傳回一個空數組,沒有這樣的訊息。
  • 數組索引以 0 開頭。在讀取字段之前檢查ArrayLength。 Z表示世界海拔高度; Layer 是來自tiledata 的裝置屬性,index 則是單元條目的序號。
  • 靜態部分使用GetStaticTiles:其目前選擇還包括Multi/Item。世界物品可能另外顯示為“object”和serial;不要將每個條目視為唯一的項目。
  • GetWorldTilesArray 限制1 000 000 單元格的區域。超出0…65535之外的座標/0…255以外的地圖會導致命令錯誤而非部分陣列。對於頻繁輪詢,請選擇較小的區域。

獨立的 C# 腳本

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

簡單範例

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

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

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

1。計數和列出記錄 - 直接腳本

參數與執行流程:

  • GetWorldCell 讀取一個單元格;本例中的GetWorldTilesArray讀取啟用了邊框的正方形3×3。
  • cells[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=Felucca, 1=Trammel, 2=Ilshenar, 3=Malas, 4=Tokuno, 5=泰爾穆爾。用戶伺服器可以使用不同的卡片組。 0 ——一張完整的地圖,沒有錯誤的跡象。

行為

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

獨立的 C# 腳本

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

簡單範例

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

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

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

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

參數與執行流程:

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

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

參數與執行流程:

  • 該值在沒有任何參數的情況下被讀取一次。當前卡號用於顯示的計算或條件。
  • 數字閾值是腳本條件的範例,而不是新的客戶端限制。此欄位儲存上述伺服器單元和限制。
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。一秒看變化——腳本類

參數與執行流程:

  • 兩個不帶參數的呼叫都會讀取它們的目前值。 UO.Wait(1000) 在兩次拍攝之間提供以毫秒為單位的暫停。
  • 比較的變化就是目前卡的號碼。榜樣不會改變世界上的任何事情,也不會無止盡地等待。這一秒鐘內的事件可能會被錯過。
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.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 — 第二個包含邊界 X;自動選擇兩個 X 中較小/較大的一個。
  • maxY — 第二個包含邊界 Y;自動選擇兩個 Y 中較小/較大的一個。
  • map — 卡號。如果所選表單中不存在此參數,則使用目前對應。真正的客戶端僅從目前載入的地圖中讀取圖塊。

傳回值

記錄數組。每個 result[i] 元素具有以下格式:

一筆記錄的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:tiledata 標誌的低 32 位。
  • [8] name - string:來自tiledata的名稱。
  • [9] layer - int:來自tiledata的設備層,靠近地面0;不是靜態索引。
  • [10] height - int:距tiledata的高度graphic,近地面0;不是座標Z。

ArrayLength(結果) - 記錄數,不是儲存格數,也不是路線步驟數。結果可能為空。一個 x/y 可以有多個不同 Z 的條目。條目「object」有serial;條目「static」沒有可用的serial。

行為

  • 數據指的是目前載入的地圖。另一張卡片或無法存取的儲存格會導致空數組。直接圖塊查詢也可能報告地圖不符; GetWorldCell和GetWorldTilesArray立即傳回一個空數組,沒有這樣的訊息。
  • 數組索引以 0 開頭。在讀取字段之前檢查ArrayLength。 Z表示世界海拔高度; Layer 是來自tiledata 的裝置屬性,index 則是單元條目的序號。
  • 靜態部分使用GetStaticTiles:其目前選擇還包括Multi/Item。世界物品可能另外顯示為“object”和serial;不要將每個條目視為唯一的項目。
  • GetWorldTilesArray 限制1 000 000 單元格的區域。超出0…65535之外的座標/0…255以外的地圖會導致命令錯誤而非部分陣列。對於頻繁輪詢,請選擇較小的區域。

獨立的 C# 腳本

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

簡單範例

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

將一次呼叫的結果輸出到日誌。數值不會轉換成 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 讀取一個單元格;本例中的GetWorldTilesArray讀取啟用了邊框的正方形3×3。
  • cells[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 是物件的 Serial/ID,而非 graphic/type。數字、十六進位字串、標準名稱 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 和網址替換成自己的值。

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

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

1。讀取您的座標 - 直接腳本

參數與執行流程:

  • 不含參數的形式選擇目前字元 self。
  • 位置包含座標X,而不是serial。
var position = UO.GetX();
UO.Print("X: " + Convert.ToString(position));

2。與選定的字元比較 - 腳本功能

參數與執行流程:

  • lasttarget 應表示地面上已加載的角色或物品。
  • delta — 沿一個軸的差異。它不是路線的長度;而是路線的長度。該值可能為負數。
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 是物件的 Serial/ID,而非 graphic/type。數字、十六進位字串、標準名稱 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 和網址替換成自己的值。

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

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

1。讀取您的座標 - 直接腳本

參數與執行流程:

  • 不含參數的形式選擇目前字元 self。
  • 位置包含座標Y,而不是serial。
var position = UO.GetY();
UO.Print("Y: " + Convert.ToString(position));

2。與選定的字元比較 - 腳本功能

參數與執行流程:

  • lasttarget 應表示地面上已加載的角色或物品。
  • delta — 沿一個軸的差異。它不是路線的長度;而是路線的長度。該值可能為負數。
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** ⚠️