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 |
UO.X · UO.Y · UO.Z · UO.GetX · UO.GetY · UO.GetZ
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
每個命令卡都有幾個獨立的場景:直接程式碼、函數和類別。以下是精選的簡短場景;限制和全面分析是有可能的。
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;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;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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和 hue0。 - 六參數呼叫增加一個帶有給定 graphic、座標、海拔、hue 和地圖的靜態資料。尋路僅在活動地圖上並根據客戶端圖塊資料中的graphic標誌考慮它。
這些條目是腳本用戶端本地的:它們不會建立遊戲物件、發出網路請求或修改分片資料。
每個範例都可以儲存為單獨的檔案.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));參數與執行流程:
- 將這對儲存為遺留資料;文字StaticItem不會對探路者造成障礙。
var legacyId = UO.AddUserStatic("tree", 0);
UO.Print(Convert.ToString(legacyId));參數與執行流程:
- 數字graphic將會加入到角色在目前地圖上的位置。
return RunScenario();
object? RunScenario()
{
var staticId = UO.AddUserStatic(0x0CCA, UO.GetWorldNum());
UO.Print(Convert.ToString(staticId));
return null;
}參數與執行流程:
- 明確新增本地靜態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。
參數: staticItem (Any), worldNum (Any)
結果: dynamic / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1, bridge.WorldNumber). -
InjectionScript.Runtime.NumberConversions.TryStr2Int:NumberConversions.TryStr2Int(arguments[0].String, out graphic). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(arguments[0]). -
InjectionScript.Runtime.InjectionApiUO.AddUserStatic:AddUserStatic(graphic, bridge.GetX(bridge.Self), bridge.GetY(bridge.Self), bridge.GetZ(bridge.Self), 0, map). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetZ:bridge.GetZ(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
內部實作程式碼,不能作為獨立腳本執行。
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));
}參數: graphic (Any), x (Any), y (Any), z (Any), hue (Any), map (Any)
結果: int / Integer.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.Register [AddUserStatic]. -
InjectionScript.Runtime.InjectionApiUO.AddUserStatic: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])). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(values[0]).
呼叫時執行已儲存的處理函式 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])))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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.
每個範例都可以儲存為單獨的檔案.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));參數與執行流程:
- 相同的點在可接受的 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));參數與執行流程:
- 從本地地圖讀取相鄰單元格的高度和滲透率。
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;
}參數與執行流程:
- 負 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.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.CheckPortableLineOfSight:CheckPortableLineOfSight(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), Arg(5), Arg(6)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
內部實作程式碼,不能作為獨立腳本執行。
case "checklos": return new InjectionValue(CheckPortableLineOfSight(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), Arg(5), Arg(6)) ? 1 : 0);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.ClearUserStatics();刪除所有使用者靜態運行時條目和本機靜態管理器物件。
沒有參數。
void - 無回傳值。
- State.UserStatics和管理器物件被清除。上傳的地圖檔案和真實伺服器項目不會被刪除。
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
指令是獨立的陳述式。前面的訊息表示呼叫開始,並非伺服器已完成動作的確認。
UO.Print("Calling UO.ClearUserStatics");
UO.ClearUserStatics();參數與執行流程:
- 刪除所有使用者靜態運行時條目和本機靜態管理器物件。
UO.ClearUserStatics();參數與執行流程:
- 在目前儲存格上新增本機靜態,然後刪除所有自訂靜態。
return RunScenario();
object? RunScenario()
{
var localStatic = UO.AddUserStatic(0x0CCA, UO.GetX(), UO.GetY(), UO.GetZ(), 0, UO.WorldNum());
UO.ClearUserStatics();
return null;
}參數與執行流程:
- 清除空集是可以接受的,並且不會建立新設定。
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。
參數: 沒有參數。
結果: void / Unit.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ClearUserStatics:bridge.ClearUserStatics().
內部實作程式碼,不能作為獨立腳本執行。
case "clearuserstatics": state.UserStatics.Clear(); bridge.ClearUserStatics(); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 合約。
每個範例都可以儲存為單獨的檔案.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));參數與執行流程:
- 掩碼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;參數與執行流程:
- 此陣列包含所選遮罩的真實姓名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;參數與執行流程:
- 此指令不接受群組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。
參數: group (Any), value (Any)
結果: dynamic / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ConvertTileFlags:bridge.ConvertTileFlags(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
內部實作程式碼,不能作為獨立腳本執行。
case "convertintegertoflags":
return new InjectionValue(bridge.ConvertTileFlags(Arg(0), Arg(1))
.Select(flag => new InjectionValue(flag)).ToArray());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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))。當您重新排列點時,結果是相同的。這不是歐幾裡得距離,不是差值總和,也不是繞過障礙物時的步數。
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。
var result = UO.Dist(100, 100, 103, 104);
UO.Print("Dist: " + Convert.ToString(result));參數與執行流程:
- 由(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);參數與執行流程:
- 由(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;
}參數與執行流程:
- 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。
參數: xfrom (Any), yfrom (Any), xto (Any), yto (Any)
結果: int / Integer.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.GetDistance:GetDistance(Arg(0), Arg(1), Arg(2), Arg(3)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDistance:bridge.GetDistance(Arg(0)).
內部實作程式碼,不能作為獨立腳本執行。
case "dist": return new InjectionValue(arguments.Length >= 4
? GetDistance(Arg(0), Arg(1), Arg(2), Arg(3))
: bridge.GetDistance(Arg(0)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 並檢查其結果;牆壁可以使實際路徑更長。
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。
var result = UO.GetDistance("lasttarget");
UO.Print("GetDistance: " + Convert.ToString(result));參數與執行流程:
- 目标是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;參數與執行流程:
- 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;
}參數與執行流程:
- 兩個 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。
參數: id (Any/Integer/String)
結果: int / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDistance:bridge.GetDistance(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
內部實作程式碼,不能作為獨立腳本執行。
case "getdistance": return new InjectionValue(bridge.GetDistance(Arg(0)));參數: id (Any/Integer/String)
結果: int / Integer.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.GetDistance. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDistance:bridge.GetDistance(id).
內部實作程式碼,不能作為獨立腳本執行。
public int GetDistance(int id) => bridge.GetDistance(id);參數: id (Any/Integer/String)
結果: int / Integer.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.GetDistance. -
InjectionScript.Runtime.InjectionApiUO.GetDistance:GetDistance(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
內部實作程式碼,不能作為獨立腳本執行。
public int GetDistance(string id) => GetDistance(GetObject(id));參數: x (Integer), y (Integer)
結果: int / Integer.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.GetDistance. -
InjectionScript.Runtime.InjectionApiUO.GetDistance:GetDistance(bridge.GetX(bridge.Self), bridge.GetY(bridge.Self), x, y). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
內部實作程式碼,不能作為獨立腳本執行。
public int GetDistance(int x, int y) => GetDistance(bridge.GetX(bridge.Self), bridge.GetY(bridge.Self), x, y);參數: id1 (Any), x2 (Any), y2 (Any)
結果: int / Integer.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.GetDistance. -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(obj1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(obj1). -
InjectionScript.Runtime.InjectionApiUO.GetDistance:GetDistance(x1, y1, NumberConversions.ToInt(x2), NumberConversions.ToInt(y2)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x2).
內部實作程式碼,不能作為獨立腳本執行。
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));
}參數: 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);
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 則是單元條目的序號。
每個範例都可以儲存為單獨的檔案.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));參數與執行流程:
- 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;參數與執行流程:
- 使用相同的座標;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;參數與執行流程:
- 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。
參數: x (Any), y (Any)
結果: dynamic / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.GetLandTileAt. -
InjectionScript.Runtime.InjectionApiUO.GetLandTileAt:GetLandTileAt(x, y, new InjectionValue(bridge.WorldNumber)). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
內部實作程式碼,不能作為獨立腳本執行。
public InjectionValue GetLandTileAt(InjectionValue x, InjectionValue y)
=> GetLandTileAt(x, y, new InjectionValue(bridge.WorldNumber));參數: x (Any), y (Any), map (Any)
結果: dynamic / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.GetLandTileAt. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLandscapeTile:bridge.GetLandscapeTile(cellX, cellY, world). -
InjectionScript.Runtime.InjectionApiUO.BuildWorldTileRecord:BuildWorldTileRecord("land", 0, land[0], cellX, cellY, land[1], 0, 0).
內部實作程式碼,不能作為獨立腳本執行。
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>());
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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的項目。標誌描述資源;結果不會取代完整的路由檢查。
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。
object? result = UO.GetLandTileData(0x0003);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));參數與執行流程:
- 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;參數與執行流程:
- 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;參數與執行流程:
- 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。
參數: tile (Any)
結果: dynamic / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.BuildTileData:BuildTileData(0, Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
內部實作程式碼,不能作為獨立腳本執行。
case "getlandtiledata":
return BuildTileData(0, Arg(0));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 毫秒。兩次服務之間會檢查取消情況。複雜的單元格或冷讀可能會超出預算。最好劃分一個大的區域;世界可以在閱讀中改變。
每個範例都可以儲存為單獨的檔案.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));參數與執行流程:
- 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從較大角度轉移到較小角度。演算法本身對邊界進行標準化。 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 次;嘗試之間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.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.FindPortableTiles:FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), new[] { Arg(5) }, false). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
內部實作程式碼,不能作為獨立腳本執行。
case "getlandtilesarray":
return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), new[] { Arg(5) }, false);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 毫秒。兩次服務之間會檢查取消情況。複雜的單元格或冷讀可能會超出預算。最好劃分一個大的區域;世界可以在閱讀中改變。
每個範例都可以儲存為單獨的檔案.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));參數與執行流程:
- 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從較大角度轉移到較小角度。演算法本身對邊界進行標準化。 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 次;嘗試之間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.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.FindPortableTiles:FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), ArrayArg(5), false). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::ArrayArg:ArrayArg(5).
內部實作程式碼,不能作為獨立腳本執行。
case "getlandtilesarrayex":
return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), ArrayArg(5), false);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 則是單元條目的序號。
每個範例都可以儲存為單獨的檔案.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));參數與執行流程:
- 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;參數與執行流程:
- 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;參數與執行流程:
- 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。
參數: x (Any), y (Any), map (Any)
結果: dynamic / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.GetLandscapeTile. -
InjectionScript.Runtime.InjectionApiUO.ToArray:ToArray(bridge.GetLandscapeTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map))). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLandscapeTile:bridge.GetLandscapeTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x).
內部實作程式碼,不能作為獨立腳本執行。
public InjectionValue GetLandscapeTile(InjectionValue x, InjectionValue y, InjectionValue map)
=> ToArray(bridge.GetLandscapeTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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。該客戶端包括動態項目和多部分。
每個範例都可以儲存為單獨的檔案.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));參數與執行流程:
- count-儲存格記錄的數量;1 表示一次進入,而不是邏輯上的成功。
var count = UO.GetLayerCount(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print("Tile records: " + Convert.ToString(count));參數與執行流程:
- 沒有記錄並不能證明土地的通過。錄音的存在也不能證明它是一面牆。
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;參數與執行流程:
- 檢查同一世界中的目前單元格和相鄰單元格。層數不是它們的高度或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。
參數: x (Any), y (Any), worldNum (Any)
結果: dynamic / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetStaticTiles:bridge.GetStaticTiles(Arg(0), Arg(1), Arg(2)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
內部實作程式碼,不能作為獨立腳本執行。
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);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 可能是有效資料;檢查結果表。
每個範例都可以儲存為單獨的檔案.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));參數與執行流程:
- 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;參數與執行流程:
- 第二次呼叫讀取東邊的方塊,兩者都使用同一張卡。
- 地面高度的差異並不能證明通過性:牆壁、靜力學和其他物體是單獨檢查的。
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;參數與執行流程:
- 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。
參數: x (Any), y (Any), worldNum (Any)
結果: dynamic / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLandscapeTile:bridge.GetLandscapeTile(Arg(0), Arg(1), Arg(2)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
內部實作程式碼,不能作為獨立腳本執行。
case "getmapcell":
return new InjectionValue(bridge.GetLandscapeTile(Arg(0), Arg(1), Arg(2))
.Select(value => new InjectionValue(value)).ToArray());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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。
每個範例都可以儲存為單獨的檔案.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));參數與執行流程:
- 六個參數:原始 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));參數與執行流程:
- 僅當存在已知連線時才會進行通話。在檢查和讀取之間,連接可能會遺失;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;參數與執行流程:
- 來源單元格和目標單元格的座標分別傳輸。結果是預期高度,即使有障礙物;通道標誌分別給出 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.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsOnline:bridge.IsOnline(). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(4). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CheckWorldStep:bridge.CheckWorldStep(Arg(0), Arg(1), Arg(5), Arg(2), Arg(3), Arg(4)). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
內部實作程式碼,不能作為獨立腳本執行。
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));
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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。
每個範例都可以儲存為單獨的檔案.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));參數與執行流程:
- 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;參數與執行流程:
- 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;參數與執行流程:
- 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。
參數: objType (Any), hue (Any)
結果: dynamic / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetStaticArt:bridge.GetStaticArt(ResolveType(arguments[0]), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(arguments[0]). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1).
內部實作程式碼,不能作為獨立腳本執行。
case "getstaticart":
return new InjectionValue(bridge.GetStaticArt(ResolveType(arguments[0]), Arg(1)).Select(value => new InjectionValue(value)).ToArray());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 則是單元條目的序號。
每個範例都可以儲存為單獨的檔案.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));參數與執行流程:
- 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;參數與執行流程:
- 使用相同的座標;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;參數與執行流程:
- 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。
參數: x (Any), y (Any), index (Any)
結果: dynamic / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.GetStaticTileAt. -
InjectionScript.Runtime.InjectionApiUO.GetStaticTileAt:GetStaticTileAt(x, y, new InjectionValue(bridge.WorldNumber), index). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
內部實作程式碼,不能作為獨立腳本執行。
public InjectionValue GetStaticTileAt(InjectionValue x, InjectionValue y, InjectionValue index)
=> GetStaticTileAt(x, y, new InjectionValue(bridge.WorldNumber), index);參數: x (Any), y (Any), map (Any), index (Any)
結果: dynamic / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.GetStaticTileAt. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetStaticTiles:bridge.GetStaticTiles(cellX, cellY, NumberConversions.ToInt(map)). -
InjectionScript.Runtime.InjectionApiUO.BuildWorldTileRecord:BuildWorldTileRecord("static", 0, statics[offset], cellX, cellY, statics[offset + 1], statics[offset + 2], 1).
內部實作程式碼,不能作為獨立腳本執行。
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>());
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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的項目。標誌描述資源;結果不會取代完整的路由檢查。
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。
object? result = UO.GetStaticTileData(0x0CCA);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));參數與執行流程:
- 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;參數與執行流程:
- 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;參數與執行流程:
- 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。
參數: tile (Any)
結果: dynamic / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.BuildTileData:BuildTileData(1, Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
內部實作程式碼,不能作為獨立腳本執行。
case "getstatictiledata":
return BuildTileData(1, Arg(0));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 排序。
每個範例都可以儲存為單獨的檔案.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));參數與執行流程:
- 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;參數與執行流程:
- 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;參數與執行流程:
- 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。
參數: x (Any), y (Any), map (Any)
結果: dynamic / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.GetStaticTiles. -
InjectionScript.Runtime.InjectionApiUO.ToArray:ToArray(bridge.GetStaticTiles(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map))). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetStaticTiles:bridge.GetStaticTiles(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x).
內部實作程式碼,不能作為獨立腳本執行。
public InjectionValue GetStaticTiles(InjectionValue x, InjectionValue y, InjectionValue map)
=> ToArray(bridge.GetStaticTiles(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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,包括地面上載入的物品;不包括陸地和移動。它比僅靜態文件的經典選擇更廣泛。
每個範例都可以儲存為單獨的檔案.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));參數與執行流程:
- 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從較大角度轉移到較小角度。演算法本身對邊界進行標準化。 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 次;嘗試之間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.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.FindPortableTiles:FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), new[] { Arg(5) }, true). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
內部實作程式碼,不能作為獨立腳本執行。
case "getstatictilesarray":
return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), new[] { Arg(5) }, true);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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,包括地面上載入的物品;不包括陸地和移動。它比僅靜態文件的經典選擇更廣泛。
每個範例都可以儲存為單獨的檔案.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));參數與執行流程:
- 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從較大角度轉移到較小角度。演算法本身對邊界進行標準化。 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 次;嘗試之間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.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.FindPortableTiles:FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), ArrayArg(5), true). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::ArrayArg:ArrayArg(5).
內部實作程式碼,不能作為獨立腳本執行。
case "getstatictilesarrayex":
return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), ArrayArg(5), true);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 可能是有效資料;檢查結果表。
每個範例都可以儲存為單獨的檔案.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));參數與執行流程:
- 所有三個參數都與地圖的當前單元格相關。 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));參數與執行流程:
- 需要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;參數與執行流程:
- 差異顯示了地球的坡度。此範例不移動任何東西,也不計算路線。
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。
參數: x (Any), y (Any), worldNum (Any)
結果: dynamic / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetSurfaceZ:bridge.GetSurfaceZ(Arg(0), Arg(1), Arg(2)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
內部實作程式碼,不能作為獨立腳本執行。
case "getsurfacez":
return new InjectionValue(bridge.GetSurfaceZ(Arg(0), Arg(1), Arg(2)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 資料中讀取的,而不是從特定項目的當前狀態中讀取的。
每個範例都可以儲存為單獨的檔案.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));參數與執行流程:
- 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;參數與執行流程:
- 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;參數與執行流程:
- 前兩個參數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。
參數: group (Any), tileId (Any)
結果: dynamic / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.GetTileFlags. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileFlags:bridge.GetTileFlags(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(group).
內部實作程式碼,不能作為獨立腳本執行。
public InjectionValue GetTileFlags(InjectionValue group, InjectionValue tileId)
=> new InjectionValue(unchecked((int)bridge.GetTileFlags(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId))));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 資料中讀取的,而不是從特定項目的當前狀態中讀取的。
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。
var result = UO.GetTileHeight(1, 0x0CCA);
UO.Print("GetTileHeight: " + Convert.ToString(result));參數與執行流程:
- group=1 選擇靜態tiledata; tileId=0x0CCA - graphic 樹。
- value 包含 Returns 部分中所述的結果;其意義與serial不一致。
var value = UO.GetTileHeight(1, 0x0CCA);
UO.Print("Tiledata height: " + Convert.ToString(value));參數與執行流程:
- 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;參數與執行流程:
- 前兩個參數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。
參數: group (Any), tileId (Any)
結果: int / Integer.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.GetTileHeight. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(group). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileDataProperties:bridge.GetTileDataProperties(tileGroup, NumberConversions.ToInt(tileId)).
內部實作程式碼,不能作為獨立腳本執行。
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];
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 資料中讀取的,而不是從特定項目的當前狀態中讀取的。
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。
var result = UO.GetTileLayer(1, 0x0CCA);
UO.Print("GetTileLayer: " + Convert.ToString(result));參數與執行流程:
- 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;參數與執行流程:
- 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;參數與執行流程:
- 前兩個參數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。
參數: group (Any), tileId (Any)
結果: int / Integer.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.GetTileLayer. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(group). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileDataProperties:bridge.GetTileDataProperties(tileGroup, NumberConversions.ToInt(tileId)).
內部實作程式碼,不能作為獨立腳本執行。
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];
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 資料中讀取的,而不是從特定項目的當前狀態中讀取的。
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。
var result = UO.GetTileName(1, 0x0CCA);
UO.Print("GetTileName: " + Convert.ToString(result));參數與執行流程:
- 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;參數與執行流程:
- 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;參數與執行流程:
- 前兩個參數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。
參數: group (Any), tileId (Any)
結果: string / String.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.GetTileName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileDataName:bridge.GetTileDataName(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(group).
內部實作程式碼,不能作為獨立腳本執行。
public string GetTileName(InjectionValue group, InjectionValue tileId)
=> bridge.GetTileDataName(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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。
每個範例都可以儲存為單獨的檔案.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));參數與執行流程:
- 每個條目佔用四個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;參數與執行流程:
- 索引 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;參數與執行流程:
- 範圍 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。
參數: x (Any), y (Any), map (Any), tileStart (Any), tileEnd (Any), uoPath (Any)
結果: dynamic / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.GetTileXYM. -
InjectionScript.Runtime.InjectionApiUO.ToArray:ToArray(bridge.GetTileXYM(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map), NumberConversions.ToInt(tileStart), NumberConversions.ToInt(tileEnd), uoPath.ToString())). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileXYM:bridge.GetTileXYM(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map), NumberConversions.ToInt(tileStart), NumberConversions.ToInt(tileEnd), uoPath.ToString()). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x). -
InjectionScript.Runtime.InjectionValue.ToString:uoPath.ToString().
內部實作程式碼,不能作為獨立腳本執行。
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()));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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仍然會根據載入的世界進行檢查。
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。
var result = UO.GetUserStatic(1);
UO.Print("GetUserStatic: " + Convert.ToString(result));參數與執行流程:
- 讀取已儲存的使用者靜態記錄。
UO.Print(UO.GetUserStatic(1));參數與執行流程:
- 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;參數與執行流程:
- 讀取目前本地狀態。沒有軟體包、目標或自動更新;個別讀取可能會看到不同的狀態。
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。
參數: id (Any)
結果: string / String.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.GetUserStatic. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(id).
內部實作程式碼,不能作為獨立腳本執行。
public string GetUserStatic(InjectionValue id)
=> state.UserStatics.TryGetValue(NumberConversions.ToInt(id), out string value) ? value : string.Empty;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetUserStatics();讀取狀態。 UserStatics。
沒有參數。
字串陣列 [id, serializedText],依 id 排序。每個id為int,serializedText - string;空字典給出空數組。
- 讀取狀態。 UserStatics。幾何符號儲存為「graphic|x|y|z|hue|map」;較舊的文字條目 AddUserStatic 可能有不同的格式。這些是本機使用者條目,並非所有靜態地圖。
- 讀取目前本地狀態。沒有軟體包、目標或自動更新;個別讀取可能會看到不同的狀態。
- 在常規用戶端主機中,此狀態資料取自GetPersistentState管理器,並且對於同一世界/設定檔的腳本/聊天/巨集是通用的,且不屬於一個腳本。另一個進程或明顯獨立的InjectionRuntimeState具有不同的狀態。載入/清除設定檔可以取代它;已儲存的serial仍然會根據載入的世界進行檢查。
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。
object? result = UO.GetUserStatics();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));參數與執行流程:
- 讀取狀態。 UserStatics。
var records = UO.GetUserStatics();
UO.Print(UO.GetArrayLength(records));參數與執行流程:
- 讀取狀態。 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;參數與執行流程:
- 讀取目前本地狀態。沒有軟體包、目標或自動更新;個別讀取可能會看到不同的狀態。
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。
參數: 沒有參數。
結果: 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());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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以外的地圖會導致命令錯誤而非部分陣列。對於頻繁輪詢,請選擇較小的區域。
每個範例都可以儲存為單獨的檔案.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));參數與執行流程:
- 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;參數與執行流程:
- 該區域是透過座標而不是容器來選擇的。
- 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;參數與執行流程:
- 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。
參數: x (Any), y (Any)
結果: dynamic / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.GetWorldCell. -
InjectionScript.Runtime.InjectionApiUO.GetWorldCell:GetWorldCell(x, y, new InjectionValue(bridge.WorldNumber)). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
內部實作程式碼,不能作為獨立腳本執行。
public InjectionValue GetWorldCell(InjectionValue x, InjectionValue y)
=> GetWorldCell(x, y, new InjectionValue(bridge.WorldNumber));參數: x (Any), y (Any), map (Any)
結果: dynamic / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.GetWorldCell. -
InjectionScript.Runtime.InjectionApiUO.BuildWorldCell:BuildWorldCell(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map), true). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x).
內部實作程式碼,不能作為獨立腳本執行。
public InjectionValue GetWorldCell(InjectionValue x, InjectionValue y, InjectionValue map)
=> BuildWorldCell(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map), true);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetWorldNum();從客戶端型號讀取目前卡號。
沒有參數。
int — 目前客戶端卡的索引,通常 0=Felucca, 1=Trammel, 2=Ilshenar, 3=Malas, 4=Tokuno, 5=泰爾穆爾。用戶伺服器可以使用不同的卡片組。 0 ——一張完整的地圖,沒有錯誤的跡象。
- 讀取已經接收到的本地資料。該請求不會開啟狀態,也不會強制伺服器發送更新。死亡、地圖轉換或物件刪除後,兩次呼叫之間的值可能會改變。
- C# 區分大小寫。請使用正確的 UO 名稱。數值旗標應與 0 比較;只有回傳型別為 bool 時才使用 bool。
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。
var result = UO.GetWorldNum();
UO.Print("GetWorldNum: " + Convert.ToString(result));參數與執行流程:
- 不帶參數的呼叫指的是 self。當前卡號被儲存在值中。
- Convert.ToString 轉換要輸出的數字,不改變結果的意義。
var value = UO.GetWorldNum();
UO.Print("GetWorldNum: " + Convert.ToString(value));參數與執行流程:
- 該值在沒有任何參數的情況下被讀取一次。當前卡號用於顯示的計算或條件。
- 數字閾值是腳本條件的範例,而不是新的客戶端限制。此欄位儲存上述伺服器單元和限制。
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;參數與執行流程:
- 兩個不帶參數的呼叫都會讀取它們的目前值。 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。
參數: 沒有參數。
結果: int / Integer.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [GetWorldNum]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
呼叫時執行已儲存的處理函式 delegate。註冊方法在建立 API 時建立此 delegate。
內部實作程式碼,不能作為獨立腳本執行。
() => bridge.WorldNumber建立 API: 這些函式負責註冊 API,不會在每次命令呼叫時重新執行。
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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以外的地圖會導致命令錯誤而非部分陣列。對於頻繁輪詢,請選擇較小的區域。
每個範例都可以儲存為單獨的檔案.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));參數與執行流程:
- 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;參數與執行流程:
- 該區域是透過座標而不是容器來選擇的。
- 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;參數與執行流程:
- 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。
參數: minX (Any), minY (Any), maxX (Any), maxY (Any), map (Any)
結果: dynamic / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.GetWorldTilesArray. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(minX). -
InjectionScript.Runtime.InjectionApiUO.BuildWorldCell:BuildWorldCell(cellX, cellY, world, false). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetWorldItems:bridge.GetWorldItems(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(serial). -
InjectionScript.Runtime.InjectionApiUO.BuildWorldTileRecord:BuildWorldTileRecord("object", serial, bridge.GetGraphics(serial), objectX, objectY, bridge.GetZ(serial), bridge.GetColor(serial), 1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetGraphics:bridge.GetGraphics(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetZ:bridge.GetZ(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetColor:bridge.GetColor(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
內部實作程式碼,不能作為獨立腳本執行。
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());
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 位置;該命令不會將它們轉換為所有者的世界座標。
- 讀取物件的當前座標。此命令不會將待處理步驟轉換為路徑計算。
int x = UO.GetX();
UO.Print($"X = {x}");每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。
var result = UO.GetX();
UO.Print("GetX: " + Convert.ToString(result));參數與執行流程:
- 不含參數的形式選擇目前字元 self。
- 位置包含座標X,而不是serial。
var position = UO.GetX();
UO.Print("X: " + Convert.ToString(position));參數與執行流程:
- 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;參數與執行流程:
- 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。
參數: 沒有參數。
結果: int / Integer.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.GetX. -
InjectionScript.Runtime.InjectionApiUO.GetX:GetX("self").
內部實作程式碼,不能作為獨立腳本執行。
public int GetX() => GetX("self");參數: id (Any/Integer/String)
結果: int / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(Arg(0, bridge.Self)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0, bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
內部實作程式碼,不能作為獨立腳本執行。
case "getx": return new InjectionValue(bridge.GetX(Arg(0, bridge.Self)));參數: id (Any/Integer/String)
結果: int / Integer.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.GetX. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(id).
內部實作程式碼,不能作為獨立腳本執行。
public int GetX(int id) => bridge.GetX(id);參數: id (Any/Integer/String)
結果: int / Integer.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.GetX. -
InjectionScript.Runtime.InjectionApiUO.GetX:GetX(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
內部實作程式碼,不能作為獨立腳本執行。
public int GetX(string id) => GetX(GetObject(id));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 位置;該命令不會將它們轉換為所有者的世界座標。
- 讀取物件的當前座標。此命令不會將待處理步驟轉換為路徑計算。
int y = UO.GetY();
UO.Print($"Y = {y}");每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。
var result = UO.GetY();
UO.Print("GetY: " + Convert.ToString(result));參數與執行流程:
- 不含參數的形式選擇目前字元 self。
- 位置包含座標Y,而不是serial。
var position = UO.GetY();
UO.Print("Y: " + Convert.ToString(position));參數與執行流程:
- 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;參數與執行流程:
- 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。
參數: 沒有參數。
結果: int / Integer.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.GetY. -
InjectionScript.Runtime.InjectionApiUO.GetY:GetY("self").
內部實作程式碼,不能作為獨立腳本執行。
public int GetY() => GetY("self");參數: id (Any/Integer/String)
結果: int / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(Arg(0, bridge.Self)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0, bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
內部實作程式碼,不能作為獨立腳本執行。
case "gety": return new InjectionValue(bridge.GetY(Arg(0, bridge.Self)));參數: id (Any/Integer/String)
結果: int / Integer.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.GetY. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(id).
內部實作程式碼,不能作為獨立腳本執行。
public int GetY(int id) => bridge.GetY(id);參數: id (Any/Integer/String)
結果: int / Integer.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.GetY. -
InjectionScript.Runtime.InjectionApiUO.GetY:GetY(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
內部實作程式碼,不能作為獨立腳本執行。
public int GetY(string id) => GetY(GetObject(id));