ZH TW UO Topic files json data - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
家 · C# · IDE · UO API · A–Z · 範例 · Languages
檔案、JSON、陣列和集合C#以及相容的幫助程式UO。內建函數C#是在沒有UO的情況下編寫的。
| 主題 | 命令與解釋 |
|---|---|
| 文件 | C#與標準函式庫 |
| JSON 解析 | C#與標準函式庫 |
| JSON 載入 | C#與標準函式庫)) |
| JSON 保存 | C#與標準函式庫 |
| JSON Stringify | C#和標準函式庫 |
| 列表 | C#與標準函式庫 |
| 字典 | C#與標準函式庫 |
| 陣列 | C# 與標準函式庫 · C# 與標準函式庫 |
| MemoryStream | C#與標準函式庫 |
UO.GetArrayLength · UO.GetWord · UO.GetWordCount
C# 與標準函式庫 · C# 與標準函式庫 · C# 與標準函式庫
每個命令卡都有幾個獨立的場景:直接程式碼、函數和類別。以下是精選的簡短場景;限制和全面分析是有可能的。
dynamic[] amounts = new dynamic[checked((int)(2) + 1)];
amounts[0] = 50;
amounts[1] = 75;
amounts[2] = 25;
var total = 0;
for (int index = (int)(0); index <= UO.GetArrayLength(amounts) - 1; index += (int)(1))
{
total += amounts[index];
}
return total;return ReadX("move 1445 1690");
dynamic ReadX(dynamic text)
{
if (Truth(UO.GetWordCount(text) != 3))
{
return -1;
}
if (Truth(UO.GetWord(text, 0) != "move"))
{
return -1;
}
var xText = UO.GetWord(text, 1);
if (!(Truth(IsNumeric(xText))))
{
return -1;
}
var x = Convert.ToDouble(xText);
if (Truth(Convert.ToString(x) == "NaN") || Truth(x < 0) || Truth(x > 65535))
{
return -1;
}
if (Truth(x != Math.Truncate(x)))
{
return -1;
}
return Convert.ToInt32(x);
}
bool IsNumeric(object? value) => double.TryParse(Convert.ToString(value), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out _);
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.GetArrayLength(object? arg);對直接數組單元進行計數以進行有限迭代和安全索引讀取。
int>=0。空數組和另一個值給出0:僅結果無法檢查類型。這是一個數量,不是bool,也不是最後一個索引。
- 本機檢查:不向伺服器發送請求,不移動項目或修改陣列。這些範例包含訓練數據,而不是即時庫存。
- 檢查值的類型並讀取 Array.Length,而不進行遍歷或求和。宣告變數值(2)建立三個單元格,索引0..2,包括空白單元格。
- 嵌套元素不進行遞歸計數。對於字串,有 Len,對於列表/字典,有它們的 Count。 UO.GetArrayLength 是同一本地檢查的相容名稱。
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。
object? result = UO.GetArrayLength(new[] { 10, 20, 30 });
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));參數與執行流程:
- 宣告變數金額(2)會建立三個條目。此循環迭代索引 0..2 並傳回 150。數量是按週期添加的,而不是ArrayLength 添加的。
- 本機檢查:不向伺服器發送請求,不移動項目或修改陣列。這些範例包含訓練數據,而不是即時庫存。
dynamic[] amounts = new dynamic[checked((int)(2) + 1)];
amounts[0] = 50;
amounts[1] = 75;
amounts[2] = 25;
var total = 0;
for (int index = (int)(0); index <= UO.GetArrayLength(amounts) - 1; index += (int)(1))
{
total += amounts[index];
}
return total;參數與執行流程:
- 路線中有兩個數組點,每個數組點有三個座標單元。結果是 2|3,而不是 6。角色不動。
- 本機檢查:不向伺服器發送請求,不移動項目或修改陣列。這些範例包含訓練數據,而不是即時庫存。
return RunScenario();
object? RunScenario()
{
dynamic[] first = new dynamic[checked((int)(2) + 1)];
first[0] = 100;
first[1] = 200;
first[2] = 0;
dynamic[] second = new dynamic[checked((int)(2) + 1)];
second[0] = 101;
second[1] = 200;
second[2] = 0;
dynamic[] route = new dynamic[checked((int)(1) + 1)];
route[0] = first;
route[1] = second;
return Convert.ToString(UO.GetArrayLength(route)) + "|" + Convert.ToString(UO.GetArrayLength(route[0]));
return null;
}參數與執行流程:
- 該線給出0; Main 在訪問索引之前不返回任何路由。此檢查也適用於空數組,但不區分這些情況。
- 本機檢查:不向伺服器發送請求,不移動項目或修改陣列。這些範例包含訓練數據,而不是即時庫存。
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 route = "not an array";
if (Truth(UO.GetArrayLength(route) == 0))
{
return "no route";
}
return route[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。
參數: arg (Any)
結果: dynamic / Any.
呼叫時:
內部實作程式碼,不能作為獨立腳本執行。
public static InjectionValue GetArrayLength(InjectionValue arg) => arg.Kind==InjectionValueKind.Array?new InjectionValue(arg.Array.Length):InjectionValue.Zero;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
string UO.GetWord(object? value, object? wordIndex);
string UO.GetWord(object? value, object? wordIndex, object? delimiter);從文字中取得單字或欄位。對於解析座標、優先列表或已儲存的腳本設定很有用。
-
value— 來源字串。此函數精確解析傳輸的文字:它本身不會讀取雜誌、文件、裝置或世界。 -
wordIndex— 0 中單字的完整索引:0 是第一個,1 是第二個。負索引和不小於單字數的索引傳回空字串。 -
delimiter— 可選分隔符號。如果沒有它,則使用“”或單一空格“”,文字將被任何 Unicode 空白字元(包括製表符和換行符)分隔。另一個分隔符號是完整的精確序列:「::」表示連續兩個冒號,而不是每個冒號。空零件被丟棄;非空部分不會被修剪。
string — 選定的非空部分,若沒有索引則為「」。這是文本,而不是 ID、type 或數字:對於數字,請單獨檢查 IsNumeric 並轉換值。
- 在本地工作,無需軟體包或遊戲操作。 GetWord和UO.GetWord呼叫同一個處理程序; GetWordCount和UO.GetWordCount也是一樣。每次呼叫都會重新分割整個文字。循環中,提前保存數量;對於大量重複解析,最好將已解析的欄位儲存在陣列中。這不是 CSV 解析器:引號不保護分隔符,空列會遺失。
- GetWord · GetWordCount · IsNumeric
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。
var result = UO.GetWord("red green blue", 1);
UO.Print("GetWord: " + Convert.ToString(result));參數與執行流程:
- ReadX 接收字串「move 1445 1690」。測試三個單字和名稱移動;索引1選擇X。 IsNumeric 檢查文本,轉換。 ToInt32 回傳1445。這只是設定的細分;角色不動。如果形式不正確,則回傳-1。
- ReadX 還需要在 Convert.ToInt32 之前獲得0..65535 範圍內的整個X; NaN、無窮大和分數 X 被拒絕。 Y這裡沒有測試。
return ReadX("move 1445 1690");
dynamic ReadX(dynamic text)
{
if (Truth(UO.GetWordCount(text) != 3))
{
return -1;
}
if (Truth(UO.GetWord(text, 0) != "move"))
{
return -1;
}
var xText = UO.GetWord(text, 1);
if (!(Truth(IsNumeric(xText))))
{
return -1;
}
var x = Convert.ToDouble(xText);
if (Truth(Convert.ToString(x) == "NaN") || Truth(x < 0) || Truth(x > 65535))
{
return -1;
}
if (Truth(x != Math.Truncate(x)))
{
return -1;
}
return Convert.ToInt32(x);
}
bool IsNumeric(object? value) => double.TryParse(Convert.ToString(value), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out _);
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;參數與執行流程:
- PriorityAt 取得清單「法師||坦克|弓箭手|」索引=1。分隔符號|丟棄空元素,因此結果是坦克。名字是任意的;在這裡他們不登記ClassMask或檢查服裝。計數和選擇時使用相同的劃分規則。
return RunScenario();
object? RunScenario()
{
return PriorityAt("mage||tank|archer|", 1);
return null;
}
dynamic PriorityAt(dynamic names, dynamic index)
{
return UO.GetWord(names, index, "|");
}參數與執行流程:
- ReadPlace 用精確的分隔符號 :: 分隔「Britain::Bank:west」。索引 1 返回 Bank:west,保留內部單冒號。如果不存在兩個非空部分,則助手傳回「」。零件周圍的空間被保留。
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 ReadPlace("Britain::Bank:west");
return null;
}
dynamic ReadPlace(dynamic text)
{
if (Truth(UO.GetWordCount(text, "::") != 2))
{
return "";
}
return UO.GetWord(text, 1, "::");
}
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。
參數: value (String), wordIndex (Integer)
結果: string / String.
呼叫時:
-
InjectionScript.Runtime.InjectionApi.GetWord. -
InjectionScript.Runtime.InjectionApi.GetWord:GetWord(value,wordIndex," ").
內部實作程式碼,不能作為獨立腳本執行。
private static string GetWord(string value,int wordIndex) => GetWord(value,wordIndex," ");參數: value (String), wordIndex (Integer), delimiter (String)
結果: string / String.
呼叫時:
-
InjectionScript.Runtime.InjectionApi.GetWord. -
InjectionScript.Runtime.InjectionApi.SplitWords:SplitWords(value,delimiter).
內部實作程式碼,不能作為獨立腳本執行。
private static string GetWord(string value,int wordIndex,string delimiter)
{
var words=SplitWords(value,delimiter);return wordIndex>=0&&wordIndex<words.Length?words[wordIndex]:string.Empty;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetWordCount(object? value);
int UO.GetWordCount(object? value, object? delimiter);計算非空白文字欄位的數量。允许您在解析之前检查坐标数并确定列表枚举的边界。
-
value— 來源字串。此函數精確解析傳輸的文字:它本身不會讀取雜誌、文件、裝置或世界。 -
delimiter— 可選分隔符號。如果沒有它,則使用“”或單一空格“”,文字將被任何 Unicode 空白字元(包括製表符和換行符)分隔。另一個分隔符號是完整的精確序列:「::」表示連續兩個冒號,而不是每個冒號。空零件被丟棄;非空部分不會被修剪。
int — 非空部分的數量。空字串和僅分隔字串產生 0。這是一個計數器,不是bool:2也是一個有效結果;檢查數量 > 0 或您需要的確切數量。
- 在本地工作,無需軟體包或遊戲操作。 GetWord和UO.GetWord呼叫同一個處理程序; GetWordCount和UO.GetWordCount也是一樣。每次呼叫都會重新分割整個文字。循環中,提前保存數量;對於大量重複解析,最好將已解析的欄位儲存在陣列中。這不是 CSV 解析器:引號不保護分隔符,空列會遺失。
- GetWord · GetWordCount · IsNumeric
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。
var result = UO.GetWordCount("red green blue");
UO.Print("GetWordCount: " + Convert.ToString(result));參數與執行流程:
- HasPoint 接受「1445 1690 0」。需要正好三個單字和數字文本,然後返回 1;否則0。這只是對形式的檢查,而不是對地圖、座標邊界或通行性的有效性的檢查。 GetWordCount 這裡返回 3 並且 bool 由我們的助手返回。
- HasPoint 另外拒絕 NaN 和無窮大,而 IsNumeric 本身可以接受。允許使用有限小數;在移動之前,需要單獨檢查整個遊戲座標。
return HasPoint("1445 1690 0");
dynamic HasPoint(dynamic text)
{
if (Truth(UO.GetWordCount(text) != 3))
{
return 0;
}
var i = 0;
while (Truth(i < 3))
{
if (!(Truth(IsNumeric(UO.GetWord(text, i)))))
{
return 0;
}
var value = Convert.ToString(Convert.ToDouble(UO.GetWord(text, i)));
if (Truth(value == "NaN") || Truth(value == "Infinity") || Truth(value == "-Infinity"))
{
return 0;
}
i = i + 1;
}
return 1;
}
bool IsNumeric(object? value) => double.TryParse(Convert.ToString(value), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out _);
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;參數與執行流程:
- JoinPriorities 取得「法師||坦克|弓箭手|」。計算一次三個非空元素,迭代索引 0..2 並返回「法師 > 坦克 > 弓箭手」。開始、結束和重複|不要建立單獨的優先順序。
return RunScenario();
object? RunScenario()
{
return JoinPriorities("mage||tank|archer|");
return null;
}
dynamic JoinPriorities(dynamic names)
{
var count = UO.GetWordCount(names, "|");
var i = 0;
var result = "";
while (Truth(i < count))
{
if (Truth(i > 0))
{
result = result + " > ";
}
result = result + UO.GetWord(names, i, "|");
i = i + 1;
}
return result;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;參數與執行流程:
- CountPlaces 得到「Britain::Bank:west::」。 :: 分隔符號給出兩個字段,刪除尾隨的空白字段:結果是 2。 Single:Bank:west 不拆分其中的文字。這不是客戶端的城市列表,而是您的設定格式的範例。
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 CountPlaces("Britain::Bank:west::");
return null;
}
dynamic CountPlaces(dynamic text)
{
return UO.GetWordCount(text, "::");
}
}C# 區分大小寫。請使用正確的 UO 名稱。數值旗標應與 0 比較;只有回傳型別為 bool 時才使用 bool。
參數: value (String)
結果: int / Integer.
呼叫時:
-
InjectionScript.Runtime.InjectionApi.GetWordCount. -
InjectionScript.Runtime.InjectionApi.GetWordCount:GetWordCount(value," ").
內部實作程式碼,不能作為獨立腳本執行。
private static int GetWordCount(string value) => GetWordCount(value," ");參數: value (String), delimiter (String)
結果: int / Integer.
呼叫時:
-
InjectionScript.Runtime.InjectionApi.GetWordCount. -
InjectionScript.Runtime.InjectionApi.SplitWords:SplitWords(value,delimiter).
內部實作程式碼,不能作為獨立腳本執行。
private static int GetWordCount(string value,string delimiter) => SplitWords(value,delimiter).Length;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Random(object? max);
int UO.Random(object? min, object? max);傳回一個隨機整數。新形式 UO.Random(min, max) 選擇從最小值到最大值(含)的數字。保留之前的形式UO.Random(max):它從0到max−1進行選擇。結果可以儲存在變數中並用作延遲、座標、索引或條件。
-
min— 雙參數形式的第一個參數僅是包含的下界,是從 −2147483648 到 2147483647 的整數。可以是負數、零或正數。不應超過最大值。在單參數形式中沒有最小值,傳遞的數字表示最大值。 -
max— 在雙參數形式中,第二個參數,包括從 −2147483648 到 2147483647 的上限 int。在前一種單參數形式中,單一參數,排除上限,從0到2147483647的整數;Random(0) 回傳0。不允許單參數形式的負最大值。
int 是一個偽隨機整數。有兩個參數 min ≤ result ≤ max;兩個邊框都可能脫落。有一個正參數 0 ≤ 結果 < 最大值。重複之前抽出的號碼是可以接受的:團隊不會選擇沒有重複的號碼。
- 僅支援兩種形式:UO.Random(max)和UO.Random(min, max)。不註冊不帶參數的呼叫。對於“從和到”範圍,請使用兩個參數。
- Random(5, 5) 總是回傳 5。 Random(10, 1) 報告範圍錯誤:邊界不會靜默交換。 Random(-10, -1) 是正確的,因為 −10 小於 −1。
- 兩個邊界都是整數int;對於小數,您可以選擇所需比例的整數單位,然後進行除法。例如,Random(0, 100) / 100.0給出從0到1的離散值,增量為0,01。
- 全范围 Random(-2147483648, 2147483647) 有效。该实现不会将 1 添加到 int 中的最大值,因此不会在上限溢出。對於寬範圍,使用丟棄額外的值,以便除法的餘數不會使選擇產生偏差。
- 呼叫在本地計算號碼,不發送資料包,本身不會暫停。對於隨機暫停,將結果傳遞給UO.Wait。您的腳本應保持伺服器所需的最小延遲。
- 如果多次需要相同的數字,請將結果儲存在 var 中。對 Random 的兩次單獨呼叫可能會傳回不同的值。此命令不檢查所選方格對於移動或轉移是否有效:這是由相應的遊戲命令檢查的。
每個範例都可以儲存為單獨的檔案.csx並在IDE中運行。 UO物件和等待函數提供當前遊戲會話的主機。將演示 serial 名稱、座標和地址替換為您自己的。
將這段程式碼存為獨立的 .csx 檔案執行。參數直接出現在呼叫中;請將範例名稱、serial 和網址替換成自己的值。
將一次呼叫的結果輸出到日誌。數值不會轉換成 bool;若結果是陣列,則顯示元素數量。
var result = UO.Random(10);
UO.Print("Random: " + Convert.ToString(result));參數與執行流程:
- min 變低=1,max 變高=6。剛好有六個可能的值:1、2、3、4、5 和 6。
- 卷存儲一個收到的號碼。 Print 正是顯示了這一點; Convert.ToString 將 int 轉換為字串。再次運行可能會給出相同的數字。
var lower = 1;
var upper = 6;
var roll = UO.Random(lower, upper);
UO.Print("Roll: " + Convert.ToString(roll));參數與執行流程:
- min=350 和 max=700 定義啟用的延遲限制。結果,如350、512或700,被寫入延遲。
- UO.Wait 接收一個以毫秒為單位的延遲參數。暂停发生在UO.Wait; Random只计算数字。
- 根據伺服器的操作和要求選擇下限。如果下一個操作需要伺服器回應,則隨機延遲不能取代等待伺服器回應。
return RunScenario();
object? RunScenario()
{
var delay = UO.Random(350, 700);
UO.Print("Waiting " + Convert.ToString(delay) + " ms");
UO.Wait(delay);
UO.Print("Wait finished");
return null;
}參數與執行流程:
- min=1,max=3:選擇是1、2 或3。每個分支對應於一個有效數字。
- 對Random的呼叫在if之前執行一次。如果您在每種情況下再次調用它,這些將是不同的選舉。
- 將 Print 替換為腳本中所需的操作,並保留這些操作的條件、範圍和伺服器回應檢查。
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 choice = UO.Random(1, 3);
if (Truth(choice == 1))
{
UO.Print("First action");
}
else
{
if (Truth(choice == 2))
{
UO.Print("Second action");
}
else
{
UO.Print("Third action");
}
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}參數與執行流程:
- 首先Random:min=50,max=90,結果x。第二:min=60,max=100,結果y。這是容器內的兩個獨立座標,不是螢幕座標或地圖座標。
- 在MassMove延遲=350毫秒,數量=10整數項,type=0由第一次手動傳輸確定,目的地=backpack,x/y取自變數z=0。
- 命令後,用滑鼠將樣本從原始容器中拖出。 MassMove 的整個包含使用了一個選定的位置。隨機化每個單獨項目的位置需要一個具有單獨的 MoveItem 的循環,而不是對 MassMove 的單一呼叫。
- 在背包的可用区域内选择范围X/Y。伺服器可能會更改項目的位置。
var x = UO.Random(50, 90);
var y = UO.Random(60, 100);
UO.MassMove(350, 10, 0, "backpack", x, y, 0);
UO.Print("Drag a source item; position: " + Convert.ToString(x) + ", " + Convert.ToString(y));參數與執行流程:
- 在這兩個呼叫中,min=−2 和 max=2:−2、−1、0、1、2 都是可能的。 GetX/GetY 讀取不含參數的字元座標。
- x/y 只是字元周圍正方形中的計算單元格。此範例不會開始移動或投擲物體。
- 隨機單元格可能無法通過或超出地圖邊界。在遊戲開始之前,使用適當的座標和路線檢查。
return RunScenario();
object? RunScenario()
{
var offsetX = UO.Random(-2, 2);
var offsetY = UO.Random(-2, 2);
var x = UO.GetX() + offsetX;
var y = UO.GetY() + offsetY;
UO.Print("Candidate tile: " + Convert.ToString(x) + ", " + Convert.ToString(y));
return null;
}參數與執行流程:
- 在 Random(count) 中,只有 max=10:沒有上限,0..9 可能。數字10沒有出現。
- 在 Random(0, count−1) min=0 和 max=9 中:有效範圍相同,但呼叫會做出新的獨立選擇。
- 對於索引選擇,計數必須為正。特殊兼容情况 Random(0)=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 count = 10;
var index = UO.Random(count);
var equivalent = UO.Random(0, count - 1);
UO.Print("Index 0..9: " + Convert.ToString(index));
UO.Print("Another independent index: " + Convert.ToString(equivalent));
return null;
}
}參數與執行流程:
- min=7 和 max=7 給出單一結果 7。
- min=−100 和 max=−50 僅給出負數,包括兩個邊界。
- 最後一次呼叫覆蓋了整個帶符號的32位int。其結果可以是正數、負數或零。
- 邊界是從小到大的。對 Random(10, 1) 的錯誤呼叫停止,並顯示訊息 min must not equal max;它不需要用於反轉範圍。
var fixedValue = UO.Random(7, 7);
var negative = UO.Random(-100, -50);
var signedValue = UO.Random(-2147483648, 2147483647);
UO.Print("Fixed: " + Convert.ToString(fixedValue));
UO.Print("Negative: " + Convert.ToString(negative));
UO.Print("Signed Integer: " + Convert.ToString(signedValue));C# 區分大小寫。請使用正確的 UO 名稱。數值旗標應與 0 比較;只有回傳型別為 bool 時才使用 bool。
參數: max (Integer)
結果: int / Integer.
呼叫時:
內部實作程式碼,不能作為獨立腳本執行。
public int Random(int max)
{
lock (randomSync) return random.Next(max);
}參數: min (Integer), max (Integer)
結果: int / Integer.
呼叫時:
內部實作程式碼,不能作為獨立腳本執行。
public int Random(int min, int max)
{
if (min > max)
throw new NativeSubrutineException("UO.Random(min, max): min must not exceed max.");
if (min == max) return min;
long count = (long)max - min + 1;
lock (randomSync)
{
if (count <= int.MaxValue)
return (int)(min + (long)random.Next((int)count));
// Inclusive Int32.MaxValue and the full signed range must not
// overflow. Rejection avoids modulo bias; reuse the four bytes.
const ulong domain = 1UL << 32;
ulong limit = domain - domain % (ulong)count;
uint sample;
do
{
random.NextBytes(randomRangeBytes);
sample = BitConverter.ToUInt32(randomRangeBytes, 0);
} while (sample >= limit);
return (int)(min + (long)(sample % (ulong)count));
}
}