ZH TW UO Topic multis houses - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
家 · C# · IDE · UO API · A–Z · 範例 · Languages
世界的複合物體:房屋和其他多物體,它們的部分和在地圖上的位置。
| 主題 | 命令與解釋 |
|---|---|
| GetMultis | UO.GetMultis |
| Multi Parts | UO.GetMultiAllParts |
| Parts at Position | UO.GetMultiPartsAtPosition |
| IsHouse | UO.IsHouse |
UO.GetMultis · UO.GetMultiAllParts · UO.GetMultiPartsAtPosition · UO.IsHouse
每個命令卡都有幾個獨立的場景:直接程式碼、函數和類別。以下是精選的簡短場景;限制和全面分析是有可能的。
var items = UO.GetMultis();
UO.Print(Convert.ToString(ArrayLength(items)));
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;var houses = UO.GetMultis();
if (Truth(ArrayLength(houses) == 0))
{
return null;
}
var parts = UO.GetMultiAllParts(houses[0]);
UO.Print(Convert.ToString(ArrayLength(parts)));
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;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetMultiAllParts(object? multiID);讀取一棟房屋的某個組成部分的記錄。
-
multiID— Serial/ID 具體對象: int、十進制/十六進位字串或已建立的別名 self, backpack, lasttarget, lastobject 或姓名 AddObject。這不是 graphic/type。一定有 ID 忙碌的房子在 HouseManager.
Array<Array>。每行包含 9 字段: [0] graphic/type 成分, [1] hue, [2] 世界 X, [3] 世界 Y, [4] 世界 Z, [5] multiOffsetX - 抵消 X 來自多個, [6] multiOffsetY - 抵消 Y, [7] multiOffsetZ - 抵消 Z, [8] multiSerial — serial 房屋。沒有元件 - 空數組。圖形不是 ID;各個靜態元件在這裡沒有自己的 serial.
- 讀取客戶端已經下載的資料。該命令不會開啟容器、移動項目或從整個伺服器下載物件。
- 陣列 - 索引從 0 開始的陣列。保存在var,訪問前檢查ArrayLength。拍攝快照後,元素可能會從世界中消失:在採取行動之前檢查Exists(serial)。
- 傳回已知的、未刪除的組件HouseManager。單獨的靜態地圖和土地不包含在此列表中。行是一個快照;不承諾固定順序或 Z 排序。
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
var multis = (object?[])UO.GetMultis();
if (multis.Length > 0) {
var parts = (object?[])UO.GetMultiAllParts(multis[0]);
UO.Print("Parts: " + parts.Length);
}參數與執行流程:
- 首先,選擇一個有負載的房子。
- 長度是組件的數量,而不是組件的高度或房屋的數量。
var houses = UO.GetMultis();
if (Truth(ArrayLength(houses) == 0))
{
return null;
}
var parts = UO.GetMultiAllParts(houses[0]);
UO.Print(Convert.ToString(ArrayLength(parts)));
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;參數與執行流程:
- parts[0] 是数组的第一行。她的[0] - type,[2]/[3]/[4] - 世界X/Y/Z。
- 索引 [5]/[6]/[7] 包含相對偏移量。
return RunScenario();
object? RunScenario()
{
var houses = UO.GetMultis();
if (Truth(ArrayLength(houses) == 0))
{
return null;
}
var parts = UO.GetMultiAllParts(houses[0]);
if (Truth(ArrayLength(parts) > 0))
{
var part = parts[0];
UO.Print("Type: 0x" + Hex(part[0]));
UO.Print(Convert.ToString(part[2]) + "," + Convert.ToString(part[3]) + "," + Convert.ToString(part[4]));
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;參數與執行流程:
- [8]是serial在家,[7]是Z組件的偏移量。
- 不要將部分[0]傳遞給在家中期望serial的命令:那是單獨組件的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 houses = UO.GetMultis();
if (Truth(ArrayLength(houses) == 0))
{
return null;
}
var parts = UO.GetMultiAllParts(houses[0]);
var i = 0;
while (Truth(i < ArrayLength(parts)))
{
var part = parts[i];
UO.Print("Multi: 0x" + Hex(part[8]) + ", offset Z: " + Convert.ToString(part[7]));
i = i + 1;
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
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。
參數: multiID (Any)
結果: dynamic / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetMultiAllParts:bridge.GetMultiAllParts(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
內部實作程式碼,不能作為獨立腳本執行。
case "getmultiallparts":
return new InjectionValue((bridge.GetMultiAllParts(Arg(0)) ?? Array.Empty<int[]>())
.Select(part => new InjectionValue((part ?? Array.Empty<int>()).Select(value => new InjectionValue(value)).ToArray())).ToArray());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetMultiPartsAtPosition(object? x, object? y);讀取指定世界單位中房屋的組成部分。
-
x— 目前地圖單元格的世界 X 座標,而非房屋內的偏移量。 -
y— 單元格的世界座標 Y。傳回此儲存格中所有 Z 高度的所有已裝載房屋的組件。
Array<Array>。每行包含 9 字段: [0] graphic/type 成分, [1] hue, [2] 世界 X, [3] 世界 Y, [4] 世界 Z, [5] multiOffsetX - 抵消 X 來自多個, [6] multiOffsetY - 抵消 Y, [7] multiOffsetZ - 抵消 Z, [8] multiSerial — serial 房屋。沒有元件 - 空數組。圖形不是 ID;各個靜態元件在這裡沒有自己的 serial.
- 讀取客戶端已經下載的資料。該命令不會開啟容器、移動項目或從整個伺服器下載物件。
- 陣列 - 索引從 0 開始的陣列。保存在var,訪問前檢查ArrayLength。拍攝快照後,元素可能會從世界中消失:在採取行動之前檢查Exists(serial)。
- 傳回已知的、未刪除的組件HouseManager。單獨的靜態地圖和土地不包含在此列表中。行是一個快照;不承諾固定順序或 Z 排序。
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。
object? result = UO.GetMultiPartsAtPosition(UO.GetX(), UO.GetY());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));參數與執行流程:
- X/Y - 角色的目前位置。
- 長度是組件的數量,而不是組件的高度或房屋的數量。
var parts = UO.GetMultiPartsAtPosition(UO.GetX(), UO.GetY());
UO.Print(Convert.ToString(ArrayLength(parts)));
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;參數與執行流程:
- parts[0] 是数组的第一行。她的[0] - type,[2]/[3]/[4] - 世界X/Y/Z。
- 索引 [5]/[6]/[7] 包含相對偏移量。
return RunScenario();
object? RunScenario()
{
var parts = UO.GetMultiPartsAtPosition(UO.GetX(), UO.GetY());
if (Truth(ArrayLength(parts) > 0))
{
var part = parts[0];
UO.Print("Type: 0x" + Hex(part[0]));
UO.Print(Convert.ToString(part[2]) + "," + Convert.ToString(part[3]) + "," + Convert.ToString(part[4]));
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;參數與執行流程:
- [8]是serial在家,[7]是Z組件的偏移量。
- 不要將部分[0]傳遞給在家中期望serial的命令:那是單獨組件的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 parts = UO.GetMultiPartsAtPosition(UO.GetX(), UO.GetY());
var i = 0;
while (Truth(i < ArrayLength(parts)))
{
var part = parts[i];
UO.Print("Multi: 0x" + Hex(part[8]) + ", offset Z: " + Convert.ToString(part[7]));
i = i + 1;
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
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.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetMultiPartsAtPosition:bridge.GetMultiPartsAtPosition(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
內部實作程式碼,不能作為獨立腳本執行。
case "getmultipartsatposition":
return new InjectionValue((bridge.GetMultiPartsAtPosition(Arg(0), Arg(1)) ?? Array.Empty<int[]>())
.Select(part => new InjectionValue((part ?? Array.Empty<int>()).Select(value => new InjectionValue(value)).ToArray())).ToArray());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetMultis();客戶端識別為 home/multi 的已載入物件清單。
沒有參數。
陣列是世界專案的serial,其中IsHouse回傳1。如果沒有這樣的對象,則為空數組。這是ID房屋,不是圖形組件列表,不是座標,也不是伺服器上所有房屋的列表。
- 讀取客戶端已經下載的資料。該命令不會開啟容器、移動項目或從整個伺服器下載物件。
- 陣列 - 索引從 0 開始的陣列。保存在var,訪問前檢查ArrayLength。拍攝快照後,元素可能會從世界中消失:在採取行動之前檢查Exists(serial)。
- 數據是從載入的世界項目中讀取的。對於一間房子的組件,使用 GetMultiAllParts(serial)。
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。
object? result = UO.GetMultis();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));參數與執行流程:
- 沒有參數;選擇了已裝載的房屋/多個項目。
- 長度 - 記錄數/ID。這不是堆疊中的金額數量。空列表給出0。
var items = UO.GetMultis();
UO.Print(Convert.ToString(ArrayLength(items)));
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;參數與執行流程:
- 沒有參數;選擇了已裝載的房屋/多個項目。
- items[i] — 數字 serial。十六進制僅用於輸出。循環不存取最後一個索引。
return RunScenario();
object? RunScenario()
{
var items = UO.GetMultis();
var i = 0;
while (Truth(i < ArrayLength(items)))
{
UO.Print("0x" + Hex(items[i]));
i = i + 1;
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
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 items = UO.GetMultis();
if (Truth(ArrayLength(items) > 0))
{
var first = items[0];
if (Truth(UO.Exists(first)))
{
UO.Print(UO.GetName(first));
}
}
else
{
UO.Print("Empty list");
}
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。
參數: 沒有參數。
結果: dynamic / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetWorldItems:bridge.GetWorldItems(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsHouse:bridge.IsHouse(id).
內部實作程式碼,不能作為獨立腳本執行。
case "getmultis":
return new InjectionValue(bridge.GetWorldItems().Where(id => bridge.IsHouse(id) != 0).Select(id => new InjectionValue(id)).ToArray());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.IsHouse(object? objID);檢查加載物的多重標誌:房屋、船或其他多重結構。
-
objID— 特定对象的强制 serial/ID:int,十六进制字符串或别名 self、backpack、lasttarget、lastobject、lastcontainer、laststatus、finditem、lastcorpse或名稱AddObject。這不是graphic/type。未指定的名稱解析為0;該指令不會開啟任何新目標。
int 1 - 具有 IsMulti 屬性的項目。 int 0 - 普通對象,mobile,未知或遠程對象。該名稱並不將結果限制為房屋:船也可以給出1。球隊不歸還房主、地區或面積。
該命令的結果是一個數字標誌: 1 表示滿足條件, 0 - 未實現。後 var 結果=命令(...)檢查是否(結果!= 0) 或 if (結果 == 0)。儲存一次呼叫的結果:重複呼叫可以再次執行該操作或讀取已經變更的狀態。
- 讀取本機用戶端模型;無需向伺服器發出請求,無需等待或移動。
- 結果指的是閱讀的那一刻。在UO.Wait或其他操作之後,物件及其標誌可能會發生變化。
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。
var result = UO.IsHouse(UO.GetSerial("lasttarget"));
UO.Print("IsHouse: " + Convert.ToString(result));參數與執行流程:
- 目標應包含多物件的serial,而不是單一牆壁的graphic。
- 1表示多類;這並不能證明該結構是住宅大樓。
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsHouse(target)))
{
UO.Print("Loaded multi structure");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;參數與執行流程:
- 首先,檢查存在性,然後消除mobile。
- 沒有 Exists 的零可能意味著沒有對象,而不是普通對象。
return RunScenario();
object? RunScenario()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(target)))
{
if (Truth(UO.IsNPC(target) == 0))
{
if (Truth(UO.IsHouse(target)))
{
UO.Print("Multi");
}
else
{
UO.Print("Ordinary item");
}
}
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;參數與執行流程:
- self 是mobile,所以即使在屋內,第一個結果也是0。
- 要測試一個構造,請傳遞它自己的 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 selfIsMulti = UO.IsHouse("self");
var selectedIsMulti = UO.IsHouse("lasttarget");
UO.Print("Self: " + Convert.ToString(selfIsMulti));
UO.Print("Selected object: " + Convert.ToString(selectedIsMulti));
return null;
}
}C# 區分大小寫。請使用正確的 UO 名稱。數值旗標應與 0 比較;只有回傳型別為 bool 時才使用 bool。
參數: objID (Any)
結果: int / Integer.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsHouse:bridge.IsHouse(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
內部實作程式碼,不能作為獨立腳本執行。
case "ishouse": return new InjectionValue(bridge.IsHouse(Arg(0)));