ZH TW UO Topic character Part 5 - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
家 · C# · IDE · UO API · A–Z · 範例 · Languages
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Undress();從3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24層移除衣服和盔甲。手、頭髮、鬍鬚、背包、坐騎和銀行不受影響。
沒有參數。
數字標誌int:1(滿足條件)- 接受本地操作,0(不滿足條件)- 拒絕。這不是伺服器確認,不是ID,也不是數量。稍後伺服器可能會發生故障;接聽後檢查實際設備。
該命令的結果是一個數字標誌: 1 表示滿足條件, 0 - 未實現。後 var 結果=命令(...)檢查是否(結果!= 0) 或 if (結果 == 0)。儲存一次呼叫的結果:重複呼叫可以再次執行該操作或讀取已經變更的狀態。
- 需要裝載物品並徒手拖曳。取下后,需要实际背包self:不使用备用背包GrabBag。未知、損壞和不合適的物品將被拒絕。其他人的物品無法透過UnequipItems移除。集合不是原子事務。
- EquipItems/UnequipItems 在接受操作之後、下一個元素之前應用DressSpeed; Disarm/Undress - 在每個佔用層之後。當提款被接受時,提款仍遵守DropDelay。其他運行時的相同設定不變;加速不會超越伺服器限制。
- 不正確的呼叫形式、未知的圖層名稱或不可轉換為數字的值可能會導致腳本錯誤,而不是0。設備快照僅包含已經載入的資料。在助手中,ChangeAndConfirm層=1是右手:對於另一件事,通過它的真實層。
- 對於數組,1表示接受所有列出的操作;如果拒絕,0將被退回。剩餘的元素仍然被處理,沒有回滾。空數組會產生 1 且不執行任何操作。當所需層已為空時,Disarm/Undress也給出1;部分失敗給出0。
- UO.EquipItems · UO.UnequipItems · UO.DressSpeed · UO.DropDelay · UO.ObjAtLayerEx
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。
var result = UO.Undress();
UO.Print("Undress: " + Convert.ToString(result));參數與執行流程:
- 首先,在遊戲中選擇適當的項目:lasttarget - 它的ID。在Equip/WearItem範例中,1層需要副手武器。 Unequip(1) 移除右手; Disarm/Undress 使用自己的固定圖層。拒绝后不会自动重播。
return UO.Undress();參數與執行流程:
- 裝備方面,0x0F5E是劍的例子,0x1B76是盾的例子。 FindType在背包裝載的物品中尋找它們,ASC轉換返回的十六進制-ID。為了刪除,讀取自己的目前層。如果所需的項目不可用,則腳本結束。陣列儲存兩個ID;每個項目都被完全轉移。
return RunScenario();
object? RunScenario()
{
var first = UO.ObjAtLayerEx(5, UO.Self());
var second = UO.ObjAtLayerEx(4, UO.Self());
if (Truth(first == 0) || Truth(second == 0))
{
return 0;
}
UO.AddObject("saved_first", first);
UO.AddObject("saved_second", second);
return UO.Undress();
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;參數與執行流程:
- ChangeAndConfirm 執行一次指令。然後檢查實際狀態最多20次,暫停100毫秒。 1 - 檢查看到預期狀態,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()
{
return ChangeAndConfirm();
return null;
}
dynamic ChangeAndConfirm()
{
if (!(Truth(UO.Undress())))
{
return 0;
}
dynamic[] layers = new dynamic[checked((int)(16) + 1)];
layers[0] = 3;
layers[1] = 4;
layers[2] = 5;
layers[3] = 6;
layers[4] = 7;
layers[5] = 8;
layers[6] = 10;
layers[7] = 12;
layers[8] = 13;
layers[9] = 14;
layers[10] = 17;
layers[11] = 18;
layers[12] = 19;
layers[13] = 20;
layers[14] = 22;
layers[15] = 23;
layers[16] = 24;
for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
{
dynamic empty = true;
for (int i = (int)(0); i <= ArrayLength(layers) - 1; i += (int)(1))
{
if (Truth(UO.ObjAtLayerEx(layers[i], UO.Self()) != 0))
{
empty = false;
}
}
if (Truth(empty))
{
return 1;
}
UO.Wait(100);
}
return 0;
}
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。
參數: 沒有參數。
結果: int / Integer.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.Undress. -
InjectionScript.Runtime.InjectionApiUO.Unequip:Unequip(dressLayers, "Clothing removed.").
內部實作程式碼,不能作為獨立腳本執行。
public int Undress()
=> Unequip(dressLayers, "Clothing removed.");Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Unequip(object? layer);將他的物品從指定層移除到他自己的背包中。
-
layer- 層數,例如 1 - 右手,2 - 左手。 Equip和Unequip也接受圖層名稱,例如「Rhand」。 WearItem 使用數字層。該層必須與物品的可穿戴層相符;它不是graphic,也不是ID。
數字標誌int:1(滿足條件)- 接受本地操作,0(不滿足條件)- 拒絕。這不是伺服器確認,不是ID,也不是數量。稍後伺服器可能會發生故障;接聽後檢查實際設備。
該命令的結果是一個數字標誌: 1 表示滿足條件, 0 - 未實現。後 var 結果=命令(...)檢查是否(結果!= 0) 或 if (結果 == 0)。儲存一次呼叫的結果:重複呼叫可以再次執行該操作或讀取已經變更的狀態。
- 需要裝載物品並徒手拖曳。取下后,需要实际背包self:不使用备用背包GrabBag。未知、損壞和不合適的物品將被拒絕。其他人的物品無法透過UnequipItems移除。集合不是原子事務。
- EquipItems/UnequipItems 在接受操作之後、下一個元素之前應用DressSpeed; Disarm/Undress - 在每個佔用層之後。當提款被接受時,提款仍遵守DropDelay。其他運行時的相同設定不變;加速不會超越伺服器限制。
- 不正確的呼叫形式、未知的圖層名稱或不可轉換為數字的值可能會導致腳本錯誤,而不是0。設備快照僅包含已經載入的資料。在助手中,ChangeAndConfirm層=1是右手:對於另一件事,通過它的真實層。
- UO.EquipItems · UO.UnequipItems · UO.DressSpeed · UO.DropDelay · UO.ObjAtLayerEx
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。
var result = UO.Unequip(1);
UO.Print("Unequip: " + Convert.ToString(result));參數與執行流程:
- 首先,在遊戲中選擇適當的項目:lasttarget - 它的ID。在Equip/WearItem範例中,1層需要副手武器。 Unequip(1) 移除右手; Disarm/Undress 使用自己的固定圖層。拒绝后不会自动重播。
return UO.Unequip(1);參數與執行流程:
- 裝備方面,0x0F5E是劍的例子,0x1B76是盾的例子。 FindType在背包裝載的物品中尋找它們,ASC轉換返回的十六進制-ID。為了刪除,讀取自己的目前層。如果所需的項目不可用,則腳本結束。陣列儲存兩個ID;每個項目都被完全轉移。
return RunScenario();
object? RunScenario()
{
var first = UO.ObjAtLayerEx(1, UO.Self());
var second = UO.ObjAtLayerEx(2, UO.Self());
if (Truth(first == 0) || Truth(second == 0))
{
return 0;
}
UO.AddObject("saved_first", first);
UO.AddObject("saved_second", second);
var firstOk = UO.Unequip(1);
var secondOk = UO.Unequip(2);
return firstOk != 0 && secondOk != 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;參數與執行流程:
- ChangeAndConfirm 執行一次指令。然後檢查實際狀態最多20次,暫停100毫秒。 1 - 檢查看到預期狀態,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 item = UO.ObjAtLayerEx(1, UO.Self());
return ChangeAndConfirm(1, item);
return null;
}
dynamic ChangeAndConfirm(dynamic layer, dynamic item)
{
if (Truth(item == 0))
{
return 0;
}
if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) != item))
{
return 0;
}
if (!(Truth(UO.Unequip(layer))))
{
return 0;
}
for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
{
if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == 0))
{
return 1;
}
UO.Wait(100);
}
return 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。
參數: layer (Any/String)
結果: int / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.Unequip:Unequip(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Unequip:bridge.Unequip(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
內部實作程式碼,不能作為獨立腳本執行。
case "unequip":
return new InjectionValue(arguments[0].Kind == InjectionValueKind.String ? Unequip(Text(0)) : bridge.Unequip(Arg(0)));參數: layer (Any/String)
結果: int / Integer.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.Unequip. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Unequip:bridge.Unequip(ConvertLayer(layer)). -
InjectionScript.Runtime.InjectionApiUO.ConvertLayer:ConvertLayer(layer).
內部實作程式碼,不能作為獨立腳本執行。
public int Unequip(string layer) => bridge.Unequip(ConvertLayer(layer));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.UnequipItems(object? items);將列出的個人物品放入背包中。別人的物品的ID不會從同一層中刪除你的物品。
-
items- 必需的ID 或項目陣列ID。數組元素是數字或數字十六進位字串。單一參數也接受“lasttarget”/名稱AddObject。對於數組,對索引 0 和 1 處的兩個元素使用變數宣告 items[1]。事物被傳輸,不是層數,也不是type。
數字標誌int:1(滿足條件)- 接受本地操作,0(不滿足條件)- 拒絕。這不是伺服器確認,不是ID,也不是數量。稍後伺服器可能會發生故障;接聽後檢查實際設備。
該命令的結果是一個數字標誌: 1 表示滿足條件, 0 - 未實現。後 var 結果=命令(...)檢查是否(結果!= 0) 或 if (結果 == 0)。儲存一次呼叫的結果:重複呼叫可以再次執行該操作或讀取已經變更的狀態。
- 需要裝載物品並徒手拖曳。取下后,需要实际背包self:不使用备用背包GrabBag。未知、損壞和不合適的物品將被拒絕。其他人的物品無法透過UnequipItems移除。集合不是原子事務。
- EquipItems/UnequipItems 在接受操作之後、下一個元素之前應用DressSpeed; Disarm/Undress - 在每個佔用層之後。當提款被接受時,提款仍遵守DropDelay。其他運行時的相同設定不變;加速不會超越伺服器限制。
- 不正確的呼叫形式、未知的圖層名稱或不可轉換為數字的值可能會導致腳本錯誤,而不是0。設備快照僅包含已經載入的資料。在助手中,ChangeAndConfirm層=1是右手:對於另一件事,通過它的真實層。
- 對於數組,1表示接受所有列出的操作;如果拒絕,0將被退回。剩餘的元素仍然被處理,沒有回滾。空數組會產生 1 且不執行任何操作。當所需層已為空時,Disarm/Undress也給出1;部分失敗給出0。
- UO.EquipItems · UO.UnequipItems · UO.DressSpeed · UO.DropDelay · UO.ObjAtLayerEx
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。
object? result = UO.UnequipItems(UO.ObjAtLayerEx(1, "self"));
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));參數與執行流程:
- 首先,在遊戲中選擇適當的項目:lasttarget - 它的ID。在Equip/WearItem範例中,1層需要副手武器。 Unequip(1) 移除右手; Disarm/Undress 使用自己的固定圖層。拒绝后不会自动重播。
var item = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(item == 0))
{
return 0;
}
return UO.UnequipItems(item);
int Asc(object? value, int fallback = 0) { string text = Convert.ToString(value) ?? ""; if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback; return int.TryParse(text, out int number) ? number : fallback; }
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;參數與執行流程:
- 裝備方面,0x0F5E是劍的例子,0x1B76是盾的例子。 FindType在背包裝載的物品中尋找它們,ASC轉換返回的十六進制-ID。為了刪除,讀取自己的目前層。如果所需的項目不可用,則腳本結束。陣列儲存兩個ID;每個項目都被完全轉移。
return RunScenario();
object? RunScenario()
{
var first = UO.ObjAtLayerEx(1, UO.Self());
var second = UO.ObjAtLayerEx(2, UO.Self());
if (Truth(first == 0) || Truth(second == 0))
{
return 0;
}
UO.AddObject("saved_first", first);
UO.AddObject("saved_second", second);
dynamic[] items = new dynamic[checked((int)(1) + 1)];
items[0] = first;
items[1] = second;
return UO.UnequipItems(items);
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;參數與執行流程:
- ChangeAndConfirm 執行一次指令。然後檢查實際狀態最多20次,暫停100毫秒。 1 - 檢查看到預期狀態,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 item = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(item == 0))
{
return 0;
}
return ChangeAndConfirm(1, item);
return null;
}
dynamic ChangeAndConfirm(dynamic layer, dynamic item)
{
if (Truth(item == 0))
{
return 0;
}
if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) != item))
{
return 0;
}
if (!(Truth(UO.UnequipItems(item))))
{
return 0;
}
for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
{
if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == 0))
{
return 1;
}
UO.Wait(100);
}
return 0;
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
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。
參數: items (Any)
結果: dynamic / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ChangeEquipmentItems:ChangeEquipmentItems(ArrayArg(0), false). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::ArrayArg:ArrayArg(0).
內部實作程式碼,不能作為獨立腳本執行。
case "unequipitems":
return new InjectionValue(ChangeEquipmentItems(ArrayArg(0), false));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.UnsetArm(object? name);刪除指定武器組的條目而不解除角色的武裝。
-
name— 集合的字串名稱,例如「旅行」或「戰鬥」。名稱不區分大小寫。服裝和武器套裝分開存放:兩者允許使用相同的名稱。這不是 ID 的東西或檔名。只有SetDress允許沒有名稱:然後為DressSavedSet/EquipDressSet記錄一個單獨的集合。
void - 无值。使用單獨的線路撥打電話;不要分配結果或將其與true進行比較。儲存和刪除會更改條目,而不是設備。
- 服裝:層數3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24。武器:僅限1和2。頭髮、鬍鬚、背包、動物和銀行不包含在這些套裝中。
- 具體的serial已經加載的東西都記錄在自己的層中。再次儲存相同的名稱會取代該條目。空層也有意義:當恢復時,相應的佔用層將被釋放到自己的背包中。因此,已儲存的完全空集會從其圖層中刪除內容。
- 此集合儲存在運行時狀態中。呼叫本身不會建立文件,也不保證該集將被傳輸到另一個設定檔或新的運行時。首先,將所需的集合儲存為其使用狀態。載入/保存客戶端的一般狀態是一個單獨的機制。
- 刪除僅影響所選名稱的條目。物品保留在角色上,其他名稱和其他類型的套裝不受影響。重新刪除遺失的條目是可以接受的。 UnsetDress 和 UnsetArm 需要一個名稱。
- UO.SetDress · UO.Dress · UO.DressSavedSet · UO.SetArm · UO.Arm · UO.DressSpeed
- 在常規用戶端主機中,此狀態資料取自GetPersistentState管理器,並且對於同一世界/設定檔的腳本/聊天/巨集是通用的,且不屬於一個腳本。另一個進程或明顯獨立的InjectionRuntimeState具有不同的狀態。載入/清除設定檔可以取代它;已儲存的serial仍然會根據載入的世界進行檢查。
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
指令是獨立的陳述式。前面的訊息表示呼叫開始,並非伺服器已完成動作的確認。
UO.Print("Calling UO.UnsetArm");
UO.UnsetArm("battle");參數與執行流程:
- 僅刪除指定的條目。衣服/武器無法脫下。
UO.UnsetArm("battle");參數與執行流程:
- 旅行和戰鬥這兩個名字分別刪除了。不同類型的集合的相同名稱將被保留。
return RunScenario();
object? RunScenario()
{
UO.UnsetArm("travel");
UO.UnsetArm("battle");
return null;
}參數與執行流程:
- CleanupSets 是一個完全聲明的過程,用於清理兩個專有名稱。 prefix 產生條目名稱,而不是檔案路徑。
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()
{
CleanupSets("mine_");
return null;
}
void CleanupSets(dynamic prefix)
{
UO.UnsetArm(prefix + "travel");
UO.UnsetArm(prefix + "battle");
}
}C# 區分大小寫。請使用正確的 UO 名稱。數值旗標應與 0 比較;只有回傳型別為 bool 時才使用 bool。
參數: name (String)
結果: void / Unit.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.UnsetArm. -
InjectionScript.Runtime.State.RuntimeDictionary.Remove:armSets.Remove(name). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("Arm set removed.").
內部實作程式碼,不能作為獨立腳本執行。
public void UnsetArm(string name)
{
armSets.Remove(name);
SystemMessage("Arm set removed.");
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.UnsetDress(object? name);刪除一組指定衣服的條目而不刪除該項目。
-
name— 集合的字串名稱,例如「旅行」或「戰鬥」。名稱不區分大小寫。服裝和武器套裝分開存放:兩者允許使用相同的名稱。這不是 ID 的東西或檔名。只有SetDress允許沒有名稱:然後為DressSavedSet/EquipDressSet記錄一個單獨的集合。
void - 无值。使用單獨的線路撥打電話;不要分配結果或將其與true進行比較。儲存和刪除會更改條目,而不是設備。
- 服裝:層數3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24。武器:僅限1和2。頭髮、鬍鬚、背包、動物和銀行不包含在這些套裝中。
- 具體的serial已經加載的東西都記錄在自己的層中。再次儲存相同的名稱會取代該條目。空層也有意義:當恢復時,相應的佔用層將被釋放到自己的背包中。因此,已儲存的完全空集會從其圖層中刪除內容。
- 此集合儲存在運行時狀態中。呼叫本身不會建立文件,也不保證該集將被傳輸到另一個設定檔或新的運行時。首先,將所需的集合儲存為其使用狀態。載入/保存客戶端的一般狀態是一個單獨的機制。
- 刪除僅影響所選名稱的條目。物品保留在角色上,其他名稱和其他類型的套裝不受影響。重新刪除遺失的條目是可以接受的。 UnsetDress 和 UnsetArm 需要一個名稱。
- UO.SetDress · UO.Dress · UO.DressSavedSet · UO.SetArm · UO.Arm · UO.DressSpeed
- 在常規用戶端主機中,此狀態資料取自GetPersistentState管理器,並且對於同一世界/設定檔的腳本/聊天/巨集是通用的,且不屬於一個腳本。另一個進程或明顯獨立的InjectionRuntimeState具有不同的狀態。載入/清除設定檔可以取代它;已儲存的serial仍然會根據載入的世界進行檢查。
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
指令是獨立的陳述式。前面的訊息表示呼叫開始,並非伺服器已完成動作的確認。
UO.Print("Calling UO.UnsetDress");
UO.UnsetDress("travel");參數與執行流程:
- 僅刪除指定的條目。衣服/武器無法脫下。
UO.UnsetDress("travel");參數與執行流程:
- 旅行和戰鬥這兩個名字分別刪除了。不同類型的集合的相同名稱將被保留。
return RunScenario();
object? RunScenario()
{
UO.UnsetDress("travel");
UO.UnsetDress("battle");
return null;
}參數與執行流程:
- CleanupSets 是一個完全聲明的過程,用於清理兩個專有名稱。 prefix 產生條目名稱,而不是檔案路徑。
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()
{
CleanupSets("mine_");
return null;
}
void CleanupSets(dynamic prefix)
{
UO.UnsetDress(prefix + "travel");
UO.UnsetDress(prefix + "battle");
}
}C# 區分大小寫。請使用正確的 UO 名稱。數值旗標應與 0 比較;只有回傳型別為 bool 時才使用 bool。
參數: name (String)
結果: void / Unit.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.UnsetDress. -
InjectionScript.Runtime.State.RuntimeDictionary.Remove:dressSets.Remove(name). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("Dress set removed.").
內部實作程式碼,不能作為獨立腳本執行。
public void UnsetDress(string name)
{
dressSets.Remove(name);
SystemMessage("Dress set removed.");
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.UseOtherPaperdollScroll(object? objID);透過橋使用指定的serial。 UseObject,通常會打開角色的紙娃娃。
-
objID— 序列/ID 物件:int,數字/十六進位字串或已建立的別名,例如「lasttarget」。這不是graphic/type。在採取行動之前檢查裝載的物體。
void - 沒有值。使用單獨的線路撥打電話;完成並不確認伺服器的操作。
- ObjID 指的是字符,而不是ID 滾動按鈕。該呼叫不會讀取 paperdoll 結構,也不會等待它開啟。
- Bridge 在遊戲串流上發送請求。伺服器規則適用;沒有內建的等待確認。
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
指令是獨立的陳述式。前面的訊息表示呼叫開始,並非伺服器已完成動作的確認。
UO.Print("Calling UO.UseOtherPaperdollScroll");
UO.UseOtherPaperdollScroll(UO.GetSerial("lasttarget"));參數與執行流程:
- 透過橋使用指定的serial。 UseObject,通常會打開角色的紙娃娃。
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
UO.UseOtherPaperdollScroll(id);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;參數與執行流程:
- ObjID 指的是字符,而不是ID 滾動按鈕。該呼叫不會讀取 paperdoll 結構,也不會等待它開啟。
return RunScenario();
object? RunScenario()
{
var id = UO.GetSerial("self");
if (Truth(UO.Exists(id)))
{
UO.UseOtherPaperdollScroll(id);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;參數與執行流程:
- Bridge 在遊戲串流上發送請求。伺服器規則適用;沒有內建的等待確認。
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()
{
ApplyToLoaded(UO.GetSerial("lasttarget"));
return null;
}
void ApplyToLoaded(dynamic id)
{
if (Truth(UO.Exists(id)))
{
UO.UseOtherPaperdollScroll(id);
}
}
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。
參數: objID (Any)
結果: void / Unit.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseObject:bridge.UseObject(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
內部實作程式碼,不能作為獨立腳本執行。
case "useotherpaperdollscroll": bridge.UseObject(Arg(0)); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.UseSelfPaperdollScroll();使用當前角色,通常會打開紙娃娃。
沒有參數。
void - 沒有值。使用單獨的線路撥打電話;完成並不確認伺服器的操作。
- ExecuteClientApiCompatibility 呼叫網橋。 UseObject(網橋。Self)。沒有單獨讀取或點擊 paperdoll 元素;這是self的正常請求UseObject。
- 在範例中,UO.Wait僅指定腳本暫停;暫停的結束並不能證明伺服器已經完成了請求。
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
指令是獨立的陳述式。前面的訊息表示呼叫開始,並非伺服器已完成動作的確認。
UO.Print("Calling UO.UseSelfPaperdollScroll");
UO.UseSelfPaperdollScroll();參數與執行流程:
- 使用當前角色,通常會打開紙娃娃。
UO.UseSelfPaperdollScroll();參數與執行流程:
- ExecuteClientApiCompatibility 呼叫網橋。 UseObject(網橋。Self)。沒有單獨讀取或點擊 paperdoll 元素;這是self的正常請求UseObject。
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Self() != 0))
{
UO.UseSelfPaperdollScroll();
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;參數與執行流程:
- 在範例中,UO.Wait僅指定腳本暫停;暫停的結束並不能證明伺服器已經完成了請求。
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.UseSelfPaperdollScroll();
UO.Wait(500);
UO.Print(UO.Name());
return null;
}
}C# 區分大小寫。請使用正確的 UO 名稱。數值旗標應與 0 比較;只有回傳型別為 bool 時才使用 bool。
參數: 沒有參數。
結果: void / Unit.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseObject:bridge.UseObject(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
內部實作程式碼,不能作為獨立腳本執行。
case "useselfpaperdollscroll": bridge.UseObject(bridge.Self); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.WearItem(object? layer, object? objID);將所選項目裝備到角色的編號圖層。
-
layer- 層數,例如 1 - 右手,2 - 左手。 Equip和Unequip也接受圖層名稱,例如「Rhand」。 WearItem 使用數字層。該層必須與物品的可穿戴層相符;它不是graphic,也不是ID。 - 載入的特定事物的
id- ID:整數、十六進位字串、「lasttarget」或名稱AddObject。這不是type。例如0x0F5E先尋找graphic的劍並透過ID得到它。 - 載入的特定事物的
ObjID- ID:整數、十六進位字串、「lasttarget」或名稱AddObject。這不是type。例如0x0F5E先尋找graphic的劍並透過ID得到它。
數字標誌int:1(滿足條件)- 接受本地操作,0(不滿足條件)- 拒絕。這不是伺服器確認,不是ID,也不是數量。稍後伺服器可能會發生故障;接聽後檢查實際設備。
該命令的結果是一個數字標誌: 1 表示滿足條件, 0 - 未實現。後 var 結果=命令(...)檢查是否(結果!= 0) 或 if (結果 == 0)。儲存一次呼叫的結果:重複呼叫可以再次執行該操作或讀取已經變更的狀態。
- 需要裝載物品並徒手拖曳。取下后,需要实际背包self:不使用备用背包GrabBag。未知、損壞和不合適的物品將被拒絕。其他人的物品無法透過UnequipItems移除。集合不是原子事務。
- EquipItems/UnequipItems 在接受操作之後、下一個元素之前應用DressSpeed; Disarm/Undress - 在每個佔用層之後。當提款被接受時,提款仍遵守DropDelay。其他運行時的相同設定不變;加速不會超越伺服器限制。
- 不正確的呼叫形式、未知的圖層名稱或不可轉換為數字的值可能會導致腳本錯誤,而不是0。設備快照僅包含已經載入的資料。在助手中,ChangeAndConfirm層=1是右手:對於另一件事,通過它的真實層。
- UO.EquipItems · UO.UnequipItems · UO.DressSpeed · UO.DropDelay · UO.ObjAtLayerEx
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
int item = UO.LastTarget();
if (item != 0)
UO.Print("Accepted flag: " + Convert.ToString(UO.WearItem(1, item)));參數與執行流程:
- 首先,在遊戲中選擇適當的項目:lasttarget - 它的ID。在Equip/WearItem範例中,1層需要副手武器。 Unequip(1) 移除右手; Disarm/Undress 使用自己的固定圖層。拒绝后不会自动重播。
var item = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(item == 0))
{
return 0;
}
return UO.WearItem(1, item);
int Asc(object? value, int fallback = 0) { string text = Convert.ToString(value) ?? ""; if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback; return int.TryParse(text, out int number) ? number : fallback; }
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;參數與執行流程:
- 裝備方面,0x0F5E是劍的例子,0x1B76是盾的例子。 FindType在背包裝載的物品中尋找它們,ASC轉換返回的十六進制-ID。為了刪除,讀取自己的目前層。如果所需的項目不可用,則腳本結束。陣列儲存兩個ID;每個項目都被完全轉移。
return RunScenario();
object? RunScenario()
{
var first = Asc(UO.FindType(0x0F5E, -1, "backpack"), 0);
var second = Asc(UO.FindType(0x1B76, -1, "backpack"), 0);
if (Truth(first == 0) || Truth(second == 0))
{
return 0;
}
UO.AddObject("saved_first", first);
UO.AddObject("saved_second", second);
var firstOk = UO.WearItem(1, first);
var secondOk = UO.WearItem(2, second);
return firstOk != 0 && secondOk != 0;
return null;
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;參數與執行流程:
- ChangeAndConfirm 執行一次指令。然後檢查實際狀態最多20次,暫停100毫秒。 1 - 檢查看到預期狀態,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 item = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(item == 0))
{
return 0;
}
return ChangeAndConfirm(1, item);
return null;
}
dynamic ChangeAndConfirm(dynamic layer, dynamic item)
{
if (Truth(item == 0))
{
return 0;
}
if (!(Truth(UO.WearItem(layer, item))))
{
return 0;
}
for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
{
if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == item))
{
return 1;
}
UO.Wait(100);
}
return 0;
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
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。
參數: layer (Any), objID (Any)
結果: dynamic / Any.
呼叫時:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Equip:bridge.Equip(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
內部實作程式碼,不能作為獨立腳本執行。
case "wearitem": return new InjectionValue(bridge.Equip(Arg(0), Arg(1)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Weight();讀取角色的狀態計數器:目前的石頭重量。
沒有參數。
int — 當前石頭重量,0..65535 在客戶端模型中。 0 可以是真實值、無資料或遺失/損壞的播放器。這是一個數量,不是bool、ID或type:1表示一個單位,而不是成功。該指令不會迭代對象,也不傳回數組。
- 此指令不帶參數。使用上面的確切簽名。
- 如果目前Player存在且尚未被銷毀,則在遊戲執行緒上讀取需要Player.Weight;否則0。設備不排序,獎金不重新計算,狀態不要求,並且沒有等待更新。存在的鬼魂不等於被摧毀的玩家。
- Weight 讀取伺服器報告的總重量(以石頭為單位)。身體、設備和隨附行李的重量包含在數量中是由分片的規則決定的。團隊不會遍歷貨櫃、累加物品重量或更新封閉的袋子。這不是單一項目的 Weight 屬性,也不是項目的數量。
- CharacterStatus 在更新之前檢查所需的主體。 Weight 可用其自己的擴展狀態,插槽 - 與 type 3, Luck - 和 type 4, 伺服器 WeightMax - 和 type 5。沒有可選計數器的緊湊/舊包會留下其先前的快取。新玩家從頭開始;該通話並未證明收到新狀態。
- 這些函式負責註冊 API,不會在每次命令呼叫時重新執行。 C# 區分大小寫。請使用正確的 UO 名稱。數值旗標應與 0 比較;只有回傳型別為 bool 時才使用 bool。
- 每次呼叫都會重新讀取本地資料。變數儲存快照;各個讀取可能會收到不同的伺服器更新。非零結果不會測試連線。零可以是一個值,也可以沒有資料。
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。
var result = UO.Weight();
UO.Print("Weight: " + Convert.ToString(result));參數與執行流程:
- value 儲存對其自身字元的一次無參數呼叫; Convert.ToString 格式化日誌中的數字而不改變其意義。
var value = UO.Weight();
UO.Print("Weight: " + Convert.ToString(value));參數與執行流程:
- UO.Wait(500)前後間隔500毫秒。差值可以是正數、零或負數;暫時更新和角色變更可能會被跳過。暫停就是一個例子。
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.Weight();
await Delay(500);
var after = UO.Weight();
var difference = after - before;
UO.Print("Counter change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));參數與執行流程:
- CanCarry(額外)獲得額外的石頭重量; 10是一個例子,不是堆疊的數量。拒絕負額外、無玩家或最大值 <= 0,讀取當前重量和限制,然後按額外 <= 最大值 - 目前返回 bool: true 或 false。減法避免了當前+額外的溢出。過載時,即使額外=0,結果也是false。這是本地評估,不是伺服器解析;讀取不是原子的,並且零權重可能是未知的。
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()
{
if (Truth(Truth(CanCarry(10)) == true))
{
UO.Print("Local check passed");
}
else
{
UO.Print("Local check failed or data unavailable");
}
return null;
}
dynamic CanCarry(dynamic extra)
{
if (Truth(extra < 0) || Truth(UO.Self() == 0))
{
return false;
}
var current = UO.Weight();
var maximum = UO.MaxWeight();
if (Truth(maximum <= 0))
{
return false;
}
return extra <= maximum - current;
}
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.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Weight:bridge.Weight.
內部實作程式碼,不能作為獨立腳本執行。
case "weight": return new InjectionValue(bridge.Weight);