KO 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 ยท ์ ยท ์ธ์ด
ํ์ผ, JSON, ๋ฐฐ์ด ๋ฐ ์ปฌ๋ ์ C#, ํธํ ๋์ฐ๋ฏธ UO. ๋ด์ฅ ๊ธฐ๋ฅ C#์ UO ์์ด ์์ฑ๋ฉ๋๋ค.
| ์ฃผ์ | ๋ช ๋ น ๋ฐ ์ค๋ช |
|---|---|
| ํ์ผ | C# ๋ฐ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ |
| JSON ๊ตฌ๋ฌธ ๋ถ์ | C# ๋ฐ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ |
| JSON ๋ก๋ | C# ๋ฐ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ)) |
| JSON ์ ์ฅ | C# ๋ฐ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ |
| JSON ๋ฌธ์์ดํ | 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์ด ์๋ 2|3์ ๋๋ค. ์บ๋ฆญํฐ๊ฐ ์์ง์ด์ง ์์ต๋๋ค.
- ๋ก์ปฌ ํ์ธ: ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด์ง ์๊ณ ํญ๋ชฉ์ ์ด๋ํ๊ฑฐ๋ ๋ฐฐ์ด์ ์์ ํ์ง ์์ต๋๋ค. ์์์๋ ์ค์๊ฐ ์ธ๋ฒคํ ๋ฆฌ๊ฐ ์๋ ๊ต์ก ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
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โ ์ ํ์ ๊ตฌ๋ถ ๊ธฐํธ์ ๋๋ค. "" ๋๋ ๋จ์ผ ๊ณต๋ฐฑ โโ" "์ด ์์ผ๋ฉด ํ ์คํธ๋ ํญ๊ณผ ์ค ๋ฐ๊ฟ์ ํฌํจํ ์ ๋์ฝ๋ ๊ณต๋ฐฑ ๋ฌธ์๋ก ๊ตฌ๋ถ๋ฉ๋๋ค. ๋ ๋ค๋ฅธ ๊ตฌ๋ถ ๊ธฐํธ๋ ์ ์ฒด์ ์ ํํ ์์์ ๋๋ค. "::"๋ ๋ชจ๋ ์ฝ๋ก ์ด ์๋๋ผ ์ฐ์๋ ๋ ๊ฐ์ ์ฝ๋ก ์ ์๋ฏธํฉ๋๋ค. ๋น ๋ถํ์ ํ๊ธฐ๋ฉ๋๋ค. ๋น์ด ์์ง ์์ ๋ถ๋ถ์ ์๋ฆฌ์ง ์์ต๋๋ค.
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๋ "mage||tank|archer|" ๋ชฉ๋ก์ ์ป์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ธ๋ฑ์ค=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โ ์ ํ์ ๊ตฌ๋ถ ๊ธฐํธ์ ๋๋ค. "" ๋๋ ๋จ์ผ ๊ณต๋ฐฑ โโ" "์ด ์์ผ๋ฉด ํ ์คํธ๋ ํญ๊ณผ ์ค ๋ฐ๊ฟ์ ํฌํจํ ์ ๋์ฝ๋ ๊ณต๋ฐฑ ๋ฌธ์๋ก ๊ตฌ๋ถ๋ฉ๋๋ค. ๋ ๋ค๋ฅธ ๊ตฌ๋ถ ๊ธฐํธ๋ ์ ์ฒด์ ์ ํํ ์์์ ๋๋ค. "::"๋ ๋ชจ๋ ์ฝ๋ก ์ด ์๋๋ผ ์ฐ์๋ ๋ ๊ฐ์ ์ฝ๋ก ์ ์๋ฏธํฉ๋๋ค. ๋น ๋ถํ์ ํ๊ธฐ๋ฉ๋๋ค. ๋น์ด ์์ง ์์ ๋ถ๋ถ์ ์๋ฆฌ์ง ์์ต๋๋ค.
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๋ IsNumeric ์์ฒด๊ฐ ํ์ฉํ ์ ์๋ NaN ๋ฐ ๋ฌดํ๋๋ฅผ ์ถ๊ฐ๋ก ๊ฑฐ๋ถํฉ๋๋ค. ๋ถ์ ์ ํ ์ซ์๊ฐ ํ์ฉ๋ฉ๋๋ค. ์ด๋ ์ , ๊ฒ์ ์ ์ฒด ์ขํ์ ๋ํ ๋ณ๋์ ํ์ธ์ด ํ์ํฉ๋๋ค.
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๋ "mage||tank|archer|"๋ฅผ ์ป์ต๋๋ค. ๋น์ด ์์ง ์์ ์ธ ๊ฐ์ ์์๋ฅผ ํ ๋ฒ ๊ณ์ฐํ๊ณ , ์ธ๋ฑ์ค 0..2๋ฅผ ๋ฐ๋ณตํ๊ณ "mage > Tank > Archer"๋ฅผ ๋ฐํํฉ๋๋ค. ์์, ๋ ๋ฐ ๋ฐ๋ณต | ๋ณ๋์ ์ฐ์ ์์๋ฅผ ๋ง๋ค์ง ๋ง์ธ์.
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์ ๋๋ค. ๋จ์ผ: 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โ 2๊ฐ ์ธ์ ํ์์ ์ฒซ ๋ฒ์งธ ์ธ์๋ง ํฌํจ๋ ํํ์ด๋ฉฐ, โ2147483648๋ถํฐ 2147483647๊น์ง์ ์ ์์ ๋๋ค. ์์, 0 ๋๋ ์์์ผ ์ ์์ต๋๋ค. ์ต๋๊ฐ์ ์ด๊ณผํ ์ ์์ต๋๋ค. ๋จ์ผ ์ธ์ ํ์์๋ ์ต์๊ฐ์ด ์์ผ๋ฉฐ ์ ๋ฌ๋ ์ซ์๋ ์ต๋๊ฐ์ ์๋ฏธํฉ๋๋ค. -
maxโ ๋ ๊ฐ์ ์ธ์ ํ์์์ โ2147483648์์ 2147483647๊น์ง์ ์ํ int๋ฅผ ํฌํจํ๋ ๋ ๋ฒ์งธ ์ธ์์ ๋๋ค. ์ด์ ์ ๋จ์ผ ์ธ์ ํ์์์๋ ๋จ์ผ ์ธ์, EXCLUDED ์ํ, 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)๊ฐ ์ ํจํฉ๋๋ค. ๊ตฌํ ์ int์ ์ต๋๊ฐ์ 1๋ฅผ ์ถ๊ฐํ์ง ์์ผ๋ฏ๋ก ์ํ์์ ์ค๋ฒํ๋ก๋์ง ์์ต๋๋ค. ๋์ ๋ฒ์์ ๊ฒฝ์ฐ ๋ถํ ์ ๋๋จธ์ง ๋ถ๋ถ์ด ์ ํ์ ํธํฅ์ํค์ง ์๋๋ก ์ถ๊ฐ ๊ฐ์ ๋ฒ๋ฆฌ๋ ๊ฒ์ด ์ฌ์ฉ๋ฉ๋๋ค.
- ํธ์ถ์ ๋ก์ปฌ์์ ๋ฒํธ๋ฅผ ๊ณ์ฐํ๊ณ , ํจํท์ ๋ณด๋ด์ง ์์ผ๋ฉฐ, ์์ฒด์ ์ผ๋ก ์ผ์ ์ค์ง๋์ง ์์ต๋๋ค. ๋ฌด์์๋ก ์ผ์์ค์งํ๋ ค๋ฉด ๊ฒฐ๊ณผ๋ฅผ UO.Wait์ ์ ๋ฌํ์ธ์. ์คํฌ๋ฆฝํธ๋ ์๋ฒ์ ํ์ํ ์ต์ ๋๊ธฐ ์๊ฐ์ ์ ์งํด์ผ ํฉ๋๋ค.
- ๋์ผํ ์ซ์๊ฐ ์ฌ๋ฌ ๋ฒ ํ์ํ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ๋ฅผ var์ ์ ์ฅํ์ธ์. Random์ ๋ํ ๋ ๋ฒ์ ๊ฐ๋ณ ํธ์ถ์ ์๋ก ๋ค๋ฅธ ๊ฐ์ ๋ฐํํ ์ ์์ต๋๋ค. ์ด ๋ช ๋ น์ ์ ํํ ์ฌ๊ฐํ์ด ์ด๋ ๋๋ ์ด๋์ ์ ํจํ์ง ํ์ธํ์ง ์์ต๋๋ค. ์ด๋ ํด๋น ๊ฒ์ ๋ช ๋ น์ผ๋ก ํ์ธํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Random(10);
UO.Print("Random: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์๊ฐ์ ๋ฎ์์ง=1, ์ต๋๊ฐ์ ๋์์ง=6. ๊ฐ๋ฅํ ๊ฐ์ ์ ํํ 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 ms, ์๋=10 ์ ์ ํญ๋ชฉ์์ type=0๋ ์ฒซ ๋ฒ์งธ ์๋ ์ ์ก์ธ ๋ชฉ์ ์ง=backpack์ ์ํด ๊ฒฐ์ ๋๋ฉฐ x/y๋ ๋ณ์ z=0์์ ๊ฐ์ ธ์ต๋๋ค.
- ๋ช ๋ น ํ ์๋ณธ ์ปจํ ์ด๋์์ ๋ง์ฐ์ค๋ก ์ํ์ ๋๋๊ทธํฉ๋๋ค. MassMove ์ ์ฒด ํฌํจ์ ํ๋์ ์ ํ๋ ์์น๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฐ ๊ฐ๋ณ ํญ๋ชฉ์ ์์น๋ฅผ โโ๋ฌด์์๋ก ์ง์ ํ๋ ค๋ฉด MassMove์ ๋ํ ๋จ์ผ ํธ์ถ์ด ์๋ ๋ณ๋์ MoveItem๋ฅผ ์ฌ์ฉํ๋ ๋ฃจํ๊ฐ ํ์ํฉ๋๋ค.
- ๋ฐฐ๋ญ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์์ญ ๋ด์์ 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 ํฌํจ: ์ ํจํ ๋ฒ์๋ ๋์ผํ์ง๋ง ํธ์ถ์ ์๋ก์ด ๋ ๋ฆฝ์ ์ ํ์ ๋ง๋ญ๋๋ค.
- ์ธ๋ฑ์ค๋ฅผ ์ ํํ๋ ค๋ฉด count๊ฐ ์์์ฌ์ผ ํฉ๋๋ค. ํน๋ณํ ํธํ ์ฌ๋ก์ธ 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์ ๋ค๋ฃน๋๋ค. ๊ทธ ๊ฒฐ๊ณผ๋ ์์, ์์ ๋๋ 0์ผ ์ ์์ต๋๋ค.
- ๊ฒฝ๊ณ๋ ๋ ์์ ๊ฒ์์ ๋ ํฐ ๊ฒ์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค. Random(10, 1)์ ๋ํ ์๋ชป๋ ํธ์ถ์ min must not also 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));
}
}