KO UO Topic files json data - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

ํŒŒ์ผ / JSON / ๋ฐ์ดํ„ฐ

ํ™ˆ ยท 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

Random ๊ฐ’

UO.Random

C# ๋ฐ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ยท C# ๋ฐ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ยท C# ๋ฐ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์ฃผ์ œ์— ๋Œ€ํ•œ ์˜ˆ

๊ฐ ๋ช…๋ น ์นด๋“œ์—๋Š” ์ง์ ‘ ์ฝ”๋“œ, ํ•จ์ˆ˜ ๋ฐ ํด๋ž˜์Šค ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋…๋ฆฝ์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์„ ํƒ๋œ ์งง์€ ์‹œ๋‚˜๋ฆฌ์˜ค์ž…๋‹ˆ๋‹ค. ์ œํ•œ์‚ฌํ•ญ๊ณผ ์ „์ฒด ๋ถ„์„์ด ์นด๋“œ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

UO.GetArrayLength

๋งค๊ฐœ๋ณ€์ˆ˜, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋“  ์‹œ๋‚˜๋ฆฌ์˜ค

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;

UO.GetWord

๋งค๊ฐœ๋ณ€์ˆ˜, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋“  ์‹œ๋‚˜๋ฆฌ์˜ค

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;

์ „์ฒด ๋ช…๋ น ์ฐธ์กฐ


UO.GetArrayLength

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

dynamic UO.GetArrayLength(object? arg);

์ œํ•œ๋œ ๋ฐ˜๋ณต๊ณผ ์•ˆ์ „ํ•œ ์ธ๋ฑ์Šค ์ฝ๊ธฐ๋ฅผ ์œ„ํ•ด ์ฆ‰์‹œ ๋ฐฐ์—ด ์…€์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋ฐ˜ํ™˜๊ฐ’

int >= 0. ๋นˆ ๋ฐฐ์—ด๊ณผ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ๊ฐ’์€ 0๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋งŒ์œผ๋กœ๋Š” ์œ ํ˜•์„ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” bool๋„ ์•„๋‹ˆ๊ณ  ๋งˆ์ง€๋ง‰ ์ง€์ˆ˜๋„ ์•„๋‹Œ ์ˆ˜๋Ÿ‰์ž…๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋กœ์ปฌ ํ™•์ธ: ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด์ง€ ์•Š๊ณ  ํ•ญ๋ชฉ์„ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ๋ฐฐ์—ด์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ์‹œ์—๋Š” ์‹ค์‹œ๊ฐ„ ์ธ๋ฒคํ† ๋ฆฌ๊ฐ€ ์•„๋‹Œ ๊ต์œก ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ’ ์œ ํ˜•์„ ํ™•์ธํ•˜๊ณ  ์ˆœํšŒ ๋˜๋Š” ํ•ฉ์‚ฐ ์—†์ด Array.Length๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ๊ฐ’(2)์„ ์„ ์–ธํ•˜๋ฉด ๋นˆ ์…€์„ ํฌํ•จํ•˜์—ฌ ์ธ๋ฑ์Šค 0..2๋ผ๋Š” ์„ธ ๊ฐœ์˜ ์…€์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • ์ค‘์ฒฉ๋œ ์š”์†Œ๋Š” ์žฌ๊ท€์ ์œผ๋กœ ๊ณ„์‚ฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด์˜ ๊ฒฝ์šฐ Len์ด ์žˆ๊ณ  ๋ชฉ๋ก/์‚ฌ์ „์˜ ๊ฒฝ์šฐ Count์ด ์žˆ์Šต๋‹ˆ๋‹ค. UO.GetArrayLength๋Š” ๋™์ผํ•œ ๋กœ์ปฌ ๊ฒ€์‚ฌ์— ๋Œ€ํ•ด ํ˜ธํ™˜๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .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));

1. ์ œํ•œ๋œ ๋ชฉ๋ก์—์„œ ์ˆ˜๋Ÿ‰ ์ถ”๊ฐ€ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋ณ€์ˆ˜ ๊ธˆ์•ก(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. ํฌ์ธํŠธ์™€ ์ขŒํ‘œ ํ•„๋“œ๋ฅผ ๋ณ„๋„๋กœ ๊ณ„์‚ฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๊ฒฝ๋กœ์—๋Š” 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;
}

3. ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ด ์ค„์€ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetArrayLength(arg) โ€” UO.GetArrayLength(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: arg (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public static InjectionValue GetArrayLength(InjectionValue arg) => arg.Kind==InjectionValueKind.Array?new InjectionValue(arg.Array.Length):InjectionValue.Zero;

UO.GetWord

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.GetWord("red green blue", 1);
UO.Print("GetWord: " + Convert.ToString(result));

1. UO.GetWord - 1 - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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;

2. UO.GetWord โ€” 2 โ€” ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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, "|");
}

3. UO.GetWord - 3 - ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์—…

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetWord(value, wordIndex) โ€” UO.GetWord(String,Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: value (String), wordIndex (Integer)

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

private static string GetWord(string value,int wordIndex) => GetWord(value,wordIndex," ");

UO.GetWord(value, wordIndex, delimiter) โ€” UO.GetWord(String,Integer,String)

๋งค๊ฐœ๋ณ€์ˆ˜: value (String), wordIndex (Integer), delimiter (String)

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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;
        }

UO.GetWordCount

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.GetWordCount("red green blue");
UO.Print("GetWordCount: " + Convert.ToString(result));

1. UO.GetWordCount - 1 - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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;

2. UO.GetWordCount โ€” 2 โ€” ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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;

3. UO.GetWordCount - 3 - ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์—…

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetWordCount(value) โ€” UO.GetWordCount(String)

๋งค๊ฐœ๋ณ€์ˆ˜: value (String)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

private static int GetWordCount(string value) => GetWordCount(value," ");

UO.GetWordCount(value, delimiter) โ€” UO.GetWordCount(String,String)

๋งค๊ฐœ๋ณ€์ˆ˜: value (String), delimiter (String)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

private static int GetWordCount(string value,string delimiter) => SplitWords(value,delimiter).Length;

UO.Random

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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์— ๋Œ€ํ•œ ๋‘ ๋ฒˆ์˜ ๊ฐœ๋ณ„ ํ˜ธ์ถœ์€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์„ ํƒํ•œ ์‚ฌ๊ฐํ˜•์ด ์ด๋™ ๋˜๋Š” ์ด๋™์— ์œ ํšจํ•œ์ง€ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ•ด๋‹น ๊ฒŒ์ž„ ๋ช…๋ น์œผ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.Random(10);
UO.Print("Random: " + Convert.ToString(result));

1. 1๋ถ€ํ„ฐ 6๊นŒ์ง€์˜ ๋‚œ์ˆ˜ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ตœ์†Œ๊ฐ’์€ ๋‚ฎ์•„์ง=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));

2. 350 ๋ฐ 700 ๋ฐ€๋ฆฌ์ดˆ ์‚ฌ์ด์˜ ๋ฌด์ž‘์œ„ ์ผ์‹œ ์ค‘์ง€ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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;
}

3. ์„ธ ๊ฐ€์ง€ ์ž‘์—… ์ค‘ ํ•˜๋‚˜๋ฅผ ์กฐ๊ฑด์œผ๋กœ ์„ ํƒ - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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;
}

4. ๋ฐฐ๋‚ญ ๋‚ด๋ถ€ MassMove ์œ„์น˜ ์„ ํƒ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ฒซ ๋ฒˆ์งธ 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));

5. ์›๋ž˜ ์ขŒํ‘œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์Œ์ˆ˜ ์˜คํ”„์…‹ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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;
}

6. Random(max) - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค์™€์˜ ํ˜ธํ™˜์„ฑ ์œ ์ง€

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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;
    }
}

7. ๋™์ผํ•œ ๊ฒฝ๊ณ„ ๋ฐ ์ „์ฒด ๋ฒ”์œ„ int - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Random(max) โ€” UO.Random(Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: max (Integer)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int Random(int max)

        {

            lock (randomSync) return random.Next(max);

        }

UO.Random(min, max) โ€” UO.Random(Integer,Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: 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));

            }

        }
โš ๏ธ **GitHub.com Fallback** โš ๏ธ