KO UO Topic diagnostics introspection - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

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

์ง„๋‹จ ๋ฐ ์„ฑ์ฐฐ

ํ™ˆ ยท C# ยท IDE ยท UO API ยท Aโ€“Z ยท ์˜ˆ ยท ์–ธ์–ด

๋ฌผ์ฒด, ํƒ€์ผ ๋ฐ ๊ฒ€ํ”„ ๊ฒ€์‚ฌ, ์ด๋ฆ„, ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ ์„œ๋ช… ํ™•์ธ API. ์„œ๋ช…์ด ์žˆ๋‹ค๊ณ  ํ•ด์„œ ํ˜„์žฌ ์ƒํƒœ์—์„œ ๊ฒŒ์ž„ ์ž‘์—…์˜ ๊ฐ€๋Šฅ์„ฑ์ด ํ™•์ธ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์„น์…˜

์ฃผ์ œ ๋ช…๋ น ๋ฐ ์„ค๋ช…
Help UO.Help
Dump UO.Dump
Info UO.Info
InfoTile UO.InfoTile
InfoGump UO.InfoGump
API Name Exists UO.ApiNameExists
API Signature Exists UO.ApiSignatureExists
API Parameter Exists UO.ApiParameterExists
Version UO.Version

๋ชจ๋“  ํ…Œ๋งˆ ๋ช…๋ น

์ ๊ฒ€

UO.Help ยท UO.Dump ยท UO.Info ยท UO.InfoColor ยท UO.GetInfo ยท UO.ExtendedInfo ยท UO.InfoTile ยท UO.InfoGump ยท UO.InfoGumps ยท UO.ApiNameExists ยท UO.ApiParameterExists ยท UO.ApiSignatureExists ยท UO.Version ยท UO.ClientInfo

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

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

UO.InfoGump

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

UO.InfoGump();

UO.ApiNameExists

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

return UO.ApiNameExists("UO.GetType");

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


UO.ApiNameExists

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

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

int UO.ApiNameExists(object? name);

ํ˜ธ์ถœ๋˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์ด ๋“ฑ๋ก๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

  • name - ํ•„์ˆ˜ string: ํ˜ธ์ถœ ํ‘œํ˜„์‹์ด ์•„๋‹Œ ๋“ฑ๋ก๋œ ์ •ํ™•ํ•œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ผ€์ด์Šค์™€ ๊ฐ€์žฅ์ž๋ฆฌ ๊ณต๊ฐ„์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. UO. ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„์€ 0๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ ˆ์ฐจ๋Š” ๊ณ ๋ ค๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int: 1์€ ์ด๋ฆ„์ด ๋“ฑ๋ก๋˜์—ˆ๋‹ค๋Š” ๋œป์ด๊ณ  0์€ ๋“ฑ๋ก๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. C#์—์„œ๋Š” result != 0 ๋˜๋Š” result == 0์„ ์‚ฌ์šฉํ•˜์„ธ์š”. int๋ฅผ true๋‚˜ false์™€ ๋น„๊ตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋“ฑ๋ก ์—ฌ๋ถ€๋Š” ์„œ๋ฒ„ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

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

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

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

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

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

var result = UO.ApiNameExists("UO.GetType");
UO.Print("ApiNameExists: " + Convert.ToString(result));

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

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

  • ์ฒซ ๋ฒˆ์งธ ์˜ˆ์—์„œ๋Š” ๋ช…์‹œ์ ์ธ UO๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒŒ์ž„ ์ด๋ฆ„์„ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค. 1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ค‘์ธ ์ •ํ™•ํ•œ ์ด๋ฆ„๊ณผ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ธ์ˆ˜ ์ˆ˜๊ฐ€ ํ˜ธ์ถœ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
return UO.ApiNameExists("UO.GetType");

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

๋„ค์ดํ‹ฐ๋ธŒ ์ด๋ฆ„์˜ ๋“ฑ๋ก๋งŒ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Convert.ToInt32๋Š” .NET ๋ฉ”์„œ๋“œ์ด๋ฉฐ UO API ํ•ญ๋ชฉ์ด ์•„๋‹ˆ๋ฏ€๋กœ ApiNameExists๋Š” 0์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ์ผ๋ฐ˜ C#์—์„œ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

return  RunScenario();
 object? RunScenario()
{
    var name = "Convert.ToInt32";
    return UO.ApiNameExists(name);
    return null;
}

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

๊ฐ ์ˆซ์ž ๊ฒฐ๊ณผ๋ฅผ 0๊ณผ ๋น„๊ตํ•œ ๋‹ค์Œ &&๋กœ ๋‘ bool ๊ฐ’์„ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์ด๋ฆ„๋“ค์˜ ๊ฒฐ๊ณผ๋Š” 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()
    {
        return HasBoth("GetType", "UO.GetType");
        return null;
    }

    dynamic HasBoth(dynamic first, dynamic second)
    {
        return UO.ApiNameExists(first) != 0 && UO.ApiNameExists(second) != 0;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.ApiNameExists(name) โ€” UO.ApiNameExists(String)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int ApiNameExists(string name)

        {

            string normalized = NormalizeApiName(name);

            return metadata.NativeSubrutines.Any(definition =>

                definition.Name.Equals(normalized, StringComparison.OrdinalIgnoreCase)) ? 1 : 0;

        }

UO.ApiParameterExists

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

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

int UO.ApiParameterExists(object? name);

๋Ÿฐํƒ€์ž„ ๊ฐ’์ด๋‚˜ ๋ช…๋ช…๋œ ๊ฐœ์ฒด๊ฐ€ ๋“ฑ๋ก๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

  • name - ํ•„์ˆ˜ string: ํ˜ธ์ถœ ํ‘œํ˜„์‹์ด ์•„๋‹Œ ๋“ฑ๋ก๋œ ์ •ํ™•ํ•œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ผ€์ด์Šค์™€ ๊ฐ€์žฅ์ž๋ฆฌ ๊ณต๊ฐ„์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. UO. ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„์€ 0๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ ˆ์ฐจ๋Š” ๊ณ ๋ ค๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int: 1์€ ์ด๋ฆ„์ด ๋“ฑ๋ก๋˜์—ˆ๋‹ค๋Š” ๋œป์ด๊ณ  0์€ ๋“ฑ๋ก๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. C#์—์„œ๋Š” result != 0 ๋˜๋Š” result == 0์„ ์‚ฌ์šฉํ•˜์„ธ์š”. int๋ฅผ true๋‚˜ false์™€ ๋น„๊ตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋“ฑ๋ก ์—ฌ๋ถ€๋Š” ์„œ๋ฒ„ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

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

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

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

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

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

var result = UO.ApiParameterExists("backpack");
UO.Print("ApiParameterExists: " + Convert.ToString(result));

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

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

  • ์ฒซ ๋ฒˆ์งธ ์˜ˆ์—์„œ๋Š” ๋ช…์‹œ์ ์ธ UO๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒŒ์ž„ ์ด๋ฆ„์„ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค. 1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ค‘์ธ ์ •ํ™•ํ•œ ์ด๋ฆ„๊ณผ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ธ์ˆ˜ ์ˆ˜๊ฐ€ ํ˜ธ์ถœ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
return UO.ApiParameterExists("UO.GetHP");

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

๋“ฑ๋ก๋œ backpack ์„ ํƒ์ž๋ฅผ ํ™•์ธํ•˜๋ฉฐ ๊ฒฐ๊ณผ๋Š” 1์ž…๋‹ˆ๋‹ค. C# ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋‚˜ ๊ฒŒ์ž„ ์„ธ๊ณ„์—์„œ ๋ฐฐ๋‚ญ์˜ ์กด์žฌ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์•„๋‹™๋‹ˆ๋‹ค.

return  RunScenario();
 object? RunScenario()
{
    var name = "backpack";
    return UO.ApiParameterExists(name);
    return null;
}

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

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

  • ์„ธ ๋ฒˆ์งธ ์˜ˆ์—๋Š” ์™„์ „ํ•œ ๋„์šฐ๋ฏธ ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฑฐ๋œ ์งง์€ ํ˜•์‹์ด๋‚˜ ์ง€์›๋˜์ง€ ์•Š๋Š” ํ˜•์‹์„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ˜•์‹๊ณผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„, ์ฒซ ๋ฒˆ์งธ, ๋‘ ๋ฒˆ์งธ ๋ฐ ๊ฐœ์ˆ˜ ํŒจ์Šค ์ด๋ฆ„/๊ฐœ์ˆ˜๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ํ˜ธ์ถœ ํ™•์ธ์˜ ๊ฒฝ์šฐ 0์ด๊ณ  ๊ฐ’ ํ™•์ธ์˜ ๊ฒฝ์šฐ 0:1์ž…๋‹ˆ๋‹ค.
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 CompareNames("GetHP", "UO.GetHP");
        return null;
    }

    dynamic CompareNames(dynamic first, dynamic second)
    {
        return Convert.ToString(UO.ApiParameterExists(first)) + ":" + Convert.ToString(UO.ApiParameterExists(second));
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.ApiParameterExists(name) โ€” UO.ApiParameterExists(String)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int ApiParameterExists(string name)

        {

            string value = (name ?? string.Empty).Trim();

            if (value.Length == 0)

                return 0;



            if (Metadata.ShortcutVariables.Any(item => item.Equals(value, StringComparison.OrdinalIgnoreCase)))

                return 1;



            return metadata.IntrinsicVariableExists(value) ? 1 : 0;

        }

UO.ApiSignatureExists

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

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

int UO.ApiSignatureExists(object? name, object? argumentCount);

์ฃผ์–ด์ง„ ๊ฐœ์ˆ˜์˜ ์ธ์ˆ˜๋กœ ์ด๋ฆ„ ๋“ฑ๋ก์„ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

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

  • name - ํ•„์ˆ˜ string: ํ˜ธ์ถœ ํ‘œํ˜„์‹์ด ์•„๋‹Œ ๋“ฑ๋ก๋œ ์ •ํ™•ํ•œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ผ€์ด์Šค์™€ ๊ฐ€์žฅ์ž๋ฆฌ ๊ณต๊ฐ„์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. UO. ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„์€ 0๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ ˆ์ฐจ๋Š” ๊ณ ๋ ค๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • argumentCount โ€” ํ•„์ˆ˜ int: ๋ช…์‹œ์ ์œผ๋กœ ์ „๋‹ฌ๋œ ์„ ํƒ์  ์ธ์ˆ˜๋ฅผ ํฌํ•จํ•œ ์œ„์น˜ ์ธ์ˆ˜์˜ ์ด ๊ฐœ์ˆ˜์ž…๋‹ˆ๋‹ค. ์Œ์ˆ˜์ด๊ฑฐ๋‚˜ ์ง€์›๋˜์ง€ ์•Š๋Š” ์ˆ˜๋Ÿ‰์€ 0์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜ ์ž์ฒด์˜ ์œ ํ˜•์€ ํ™•์ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int: 1์€ ์ด๋ฆ„์ด ๋“ฑ๋ก๋˜์—ˆ๋‹ค๋Š” ๋œป์ด๊ณ  0์€ ๋“ฑ๋ก๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. C#์—์„œ๋Š” result != 0 ๋˜๋Š” result == 0์„ ์‚ฌ์šฉํ•˜์„ธ์š”. int๋ฅผ true๋‚˜ false์™€ ๋น„๊ตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋“ฑ๋ก ์—ฌ๋ถ€๋Š” ์„œ๋ฒ„ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

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

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

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

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

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

var result = UO.ApiSignatureExists("UO.GetType", 1);
UO.Print("ApiSignatureExists: " + Convert.ToString(result));

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

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

  • ์ฒซ ๋ฒˆ์งธ ์˜ˆ์—์„œ๋Š” ๋ช…์‹œ์ ์ธ UO๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒŒ์ž„ ์ด๋ฆ„์„ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค. 1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ค‘์ธ ์ •ํ™•ํ•œ ์ด๋ฆ„๊ณผ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ธ์ˆ˜ ์ˆ˜๊ฐ€ ํ˜ธ์ถœ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
return UO.ApiSignatureExists("UO.GetType",1);

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

UO.FindType์˜ ์ธ์ˆ˜๊ฐ€ ํ•˜๋‚˜์ธ ํ˜•์‹๊ณผ ์—†๋Š” ํ˜•์‹์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๋ฌธ์ž์—ด "1:0"์ด๋ฉฐ, ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ํ˜•์‹์€ ๋“ฑ๋ก๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

return  RunScenario();
 object? RunScenario()
{
    return Convert.ToString(UO.ApiSignatureExists("UO.FindType", 1)) + ":" + Convert.ToString(UO.ApiSignatureExists("UO.FindType", 0));
    return null;
}

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

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

  • ์„ธ ๋ฒˆ์งธ ์˜ˆ์—๋Š” ์™„์ „ํ•œ ๋„์šฐ๋ฏธ ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฑฐ๋œ ์งง์€ ํ˜•์‹์ด๋‚˜ ์ง€์›๋˜์ง€ ์•Š๋Š” ํ˜•์‹์„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ˜•์‹๊ณผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„, ์ฒซ ๋ฒˆ์งธ, ๋‘ ๋ฒˆ์งธ ๋ฐ ๊ฐœ์ˆ˜ ํŒจ์Šค ์ด๋ฆ„/๊ฐœ์ˆ˜๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ํ˜ธ์ถœ ํ™•์ธ์˜ ๊ฒฝ์šฐ 0์ด๊ณ  ๊ฐ’ ํ™•์ธ์˜ ๊ฒฝ์šฐ 0:1์ž…๋‹ˆ๋‹ค.
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 CheckForm("UO.GetType", 0);
        return null;
    }

    dynamic CheckForm(dynamic name, dynamic count)
    {
        return UO.ApiSignatureExists(name, count);
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.ApiSignatureExists(name, argumentCount) โ€” UO.ApiSignatureExists(String,Integer)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int ApiSignatureExists(string name, int argumentCount)

            => metadata.NativeSubrutineExists(NormalizeApiName(name), argumentCount) ? 1 : 0;

UO.ClientInfo

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

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

dynamic UO.ClientInfo();

์‹คํ–‰ ์ค‘์ธ ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์ •๋ณด๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

3๊ฐœ์˜ ๋ฐฐ์—ด string: [0] - ์ œํ’ˆ ์ด๋ฆ„, [1] - ์‹คํ–‰ ์ค‘์ธ ํด๋ผ์ด์–ธํŠธ ๋ฒ„์ „, [2] - ํด๋ผ์ด์–ธํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ. ์ธ๋ฑ์Šค๋Š” 0๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฌธ์ž์—ด JSON๋„ ์•„๋‹ˆ๊ณ  ์‚ฌ์ „๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • RuntimeProductName, RuntimeProductVersion ๋ฐ ClientPath์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์•„๋ฌด๊ฒƒ๋„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ์„œ๋ฒ„์— ์•„๋ฌด๊ฒƒ๋„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ๋„์šฐ๋ฏธ ํ•จ์ˆ˜์—์„œ ์ƒ‰์ธ์„ ์ƒ์„ฑํ•˜๊ธฐ ์ „์— ArrayLength๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ํด๋ผ์ด์–ธํŠธ ์ •๋ณด๋ฅผ ์บ๋ฆญํ„ฐ ๋Šฅ๋ ฅ์น˜๋‚˜ ์„œ๋ฒ„ ๋ฒ„์ „๊ณผ ํ˜ผ๋™ํ•˜์ง€ ๋งˆ์„ธ์š”.
  • ํ˜„์žฌ ClassicUO ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

object? result = UO.ClientInfo();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ์„ธ ๊ฐ€์ง€ ํ•„๋“œ ๋ชจ๋‘ ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • 0 - ์ œํ’ˆ, 1 - ๋ฒ„์ „, 2 - ์นดํƒˆ๋กœ๊ทธ. ๋ฒ„์ „ ๊ฐ’์€ ์‹œ์ž‘ ์‹œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” ์ˆ˜์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
var info = UO.ClientInfo();
UO.Print("Product: " + info[0]);
UO.Print("Client version: " + info[1]);
UO.Print("Client folder: " + info[2]);

2. ๋ฐฐ์—ด์„ ํ†ตํ•œ ๋ฃจํ”„ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ArrayLength๋Š” ํ•„๋“œ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ์œ ํšจํ•œ ์ธ๋ฑ์Šค๋Š” ๊ธธ์ด์—์„œ 1์„ ๋บ€ ๊ฐ’๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var info = UO.ClientInfo();
    var i = 0;
    while (Truth(i < ArrayLength(info)))
    {
        UO.Print(Convert.ToString(i) + ": " + info[i]);
        i = i + 1;
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. ์™„์ „ํ•œ ํด๋ผ์ด์–ธํŠธ ์„œ๋ช… ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ClientCaption๋Š” ์ œ๋ชฉ๊ณผ ๋ฒ„์ „ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์›๋ž˜ ๋ฐฐ์—ด์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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.Print(ClientCaption());
        return null;
    }

    dynamic ClientCaption()
    {
        var info = UO.ClientInfo();
        if (Truth(ArrayLength(info) < 2))
        {
            return "Client information unavailable";
        }

        return info[0] + " / " + info[1];
    }

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

UO.ClientInfo() โ€” UO.ClientInfo()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: dynamic / Array.

ํ˜ธ์ถœ ์‹œ:

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

case "clientinfo":

                    return new InjectionValue(new[]

                    {

                        new InjectionValue(bridge.RuntimeProductName),

                        new InjectionValue(bridge.RuntimeProductVersion),

                        new InjectionValue(bridge.ClientPath)

                    });

UO.Dump

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

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

void UO.Dump();
void UO.Dump(object? @object);

ํด๋ผ์ด์–ธํŠธ์— ์•Œ๋ ค์ง„ ๊ฐœ์ฒด์˜ ์ง„๋‹จ ์Šค๋ƒ…์ƒท์„ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค.

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

  • object - ์„ ํƒ์‚ฌํ•ญ serial/๋งํฌ. ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด bridge.LastTarget๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋ฉ”์‹œ์ง€์—๋Š” serial(0xXXXXXXXX), ์ด๋ฆ„, graphic/type, hue ๋ฐ X/Y/Z๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ํ•„๋“œ๋Š” ๋กœ์ปฌ ๋ชจ๋ธ์—์„œ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค. ๋ˆ„๋ฝ๋œ ๊ฐ์ฒด๋Š” ๋นˆ ์ด๋ฆ„๊ณผ null ํ•„๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ตœ์‹  ์„œ๋ฒ„ ์†์„ฑ์„ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•ž์˜ ๋ฉ”์‹œ์ง€๋Š” ํ˜ธ์ถœ ์‹œ์ž‘์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์„œ๋ฒ„ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UO.Print("Calling UO.Dump");
UO.Dump();

1. ๋งˆ์ง€๋ง‰ ๋Œ€์ƒ์˜ ์Šค๋ƒ…์ƒท - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋ˆ„๋ฝ๋œ ์ธ์ˆ˜๋Š” LastTarget๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
UO.Dump();

2. ์…€ํ”„์ƒท - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋ชจ๋“  ํ•„๋“œ๋Š” ์ž์‹ ์˜ ์บ๋ฆญํ„ฐ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Dump("self");
    return null;
}

3. ๊ฒ€์‚ฌ๋œ ๊ฐœ์ฒด์˜ ์Šค๋ƒ…์ƒท - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • Exists ํ…Œ์ŠคํŠธ๋Š” ํ•„๋“œ๊ฐ€ 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 id = UO.LastTarget();
        if (Truth(UO.Exists(id)))
        {
            UO.Dump(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;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Dump() โ€” UO.Dump()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "dump":

                {

                    int id = Arg(0, bridge.LastTarget);

                    SystemMessage($"0x{id:X8} {bridge.GetName(id)} type=0x{bridge.GetGraphics(id):X4} hue=0x{bridge.GetColor(id):X4} xyz={bridge.GetX(id)},{bridge.GetY(id)},{bridge.GetZ(id)}");

                    break;

                }

UO.Dump(object) โ€” UO.Dump(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "dump":

                {

                    int id = Arg(0, bridge.LastTarget);

                    SystemMessage($"0x{id:X8} {bridge.GetName(id)} type=0x{bridge.GetGraphics(id):X4} hue=0x{bridge.GetColor(id):X4} xyz={bridge.GetX(id)},{bridge.GetY(id)},{bridge.GetZ(id)}");

                    break;

                }

UO.ExtendedInfo

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

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

dynamic UO.ExtendedInfo();

ํ˜„์žฌ ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ๊ตฌ์„ฑ์˜ 4๊ฐœ ํ•„๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

Array [ClientPath:string, CurrentProfilePath:string, GameServerAddress:string, GameServerPort:int].

๋™์ž‘

  • ํ•„๋“œ์˜ ์ˆœ์„œ๋Š” ๊ณ ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ClientPath ๋ฐ CurrentProfilePath์€ ํด๋ผ์ด์–ธํŠธ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. GameServerAddress ๋ฐ GameServerPort๋Š” ์ „์—ญ ์„ค์ •์„ ์ฝ์Šต๋‹ˆ๋‹ค.GlobalSettings.IP/Port: ์‹ค์ œ ํ”ผ์–ด ๊ด€๋ฆฌ์ž ์„ธ์…˜์„ ํ™•์ธํ•˜์ง€ ์•Š๊ณ  ๊ตฌ์„ฑ๋œ ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค. ๋ชฉ๋ก์—๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉฐ ์„œ๋ฒ„์— ์ •๋ณด๋ฅผ ๋ฌป๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„/์—ฐ๊ฒฐ์„ ์„ ํƒํ•˜๊ธฐ ์ „์— ๊ณต๋ฐฑ ๊ฐ’์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

object? result = UO.ExtendedInfo();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ์ถœ๋ ฅ ํ•„๋“œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋ฐฐ์—ด์—๋Š” ํ˜ผํ•ฉ ์œ ํ˜•์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ Convert.ToString๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
var info = UO.ExtendedInfo();
for (int i = (int)(0); i <= ArrayLength(info)-1; i += (int)(1))
{
    UO.Print(Convert.ToString(info[i]));
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

2. ์ฃผ์†Œ ๋ฐ ํฌํŠธ ์ธ์‡„ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ƒ‰์ธ 2 ๋ฐ 3์€ ์ฃผ์†Œ์™€ ํฌํŠธ์ž…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var info = UO.ExtendedInfo();
    UO.Print(Convert.ToString(info[2]) + ":" + Convert.ToString(info[3]));
    return null;
}

3. ํ”„๋กœํ•„ ๊ฒฝ๋กœ ์ฝ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ƒ‰์ธ 1 โ€” CurrentProfilePath, ClientPath ์•„๋‹˜.
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 info = UO.ExtendedInfo();
        var path = info[1];
        UO.Print(path);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.ExtendedInfo() โ€” UO.ExtendedInfo()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "extendedinfo":

                    return new InjectionValue(new[] { new InjectionValue(bridge.ClientPath), new InjectionValue(bridge.CurrentProfilePath), new InjectionValue(bridge.GameServerAddress), new InjectionValue(bridge.GameServerPort) });

UO.GetInfo

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

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

string UO.GetInfo(object? arg);

์ •ํ™•ํ•œ ๋ฌธ์ž ์„ ํƒ๊ธฐ์— ๋Œ€ํ•ด์„œ๋งŒ ๋ฌธ์ž ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

  • arg - string. ๋ฌธ์ž ํ˜ธ์ถœ์˜ ์ •ํ™•ํ•œ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ๊ฐ’ GetName("self"); ๋‹ค๋ฅธ ๊ฐ’์€ ์ธ์‹๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string โ€” ์บ๋ฆญํ„ฐ์˜ ์บ๋ฆญํ„ฐ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ์ธ์ˆ˜์˜ ๊ฒฝ์šฐ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด UNKNOWN. ๋ฌธ์ž๊ฐ€ ์—†์œผ๋ฉด ์ด๋ฆ„์ด ๋น„์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋น„๊ต StringComparison.Ordinal์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž ์„ ํƒ๊ธฐ๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๋„คํŠธ์›Œํฌ๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋กœ์ปฌ ๋ฌธ์ž ๋ชจ๋ธ์—์„œ ์ด๋ฆ„์„ ์ฝ์Šต๋‹ˆ๋‹ค. ์ฐฝ FillInfoWindow์€ ๋ณ„๋„๋กœ ์ œ์–ด๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

var result = UO.GetInfo("character");
UO.Print("GetInfo: " + Convert.ToString(result));

1. ์บ๋ฆญํ„ฐ ์ด๋ฆ„ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ •ํ™•ํ•œ ๋ฌธ์ž ๋ฆฌํ„ฐ๋Ÿด์€ self์ž…๋‹ˆ๋‹ค.
var name = UO.GetInfo("character");
UO.Print(name);

2. ๊ธฐํƒ€ ์‚ฌ๋ก€ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋ฌธ์ž๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๊ณ  UNKNOWN๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetInfo("Character");
    UO.Print(value);
    return null;
}

3. ์•Œ ์ˆ˜ ์—†๋Š” ์„ ํƒ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ํ”„๋กœํ•„์€ ์ด ๊ตฌํ˜„์—์„œ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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 value = UO.GetInfo("profile");
        UO.Print(value);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetInfo(arg) โ€” UO.GetInfo(String)

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

private string GetInfo(string arg)

        {

            if (arg.Equals("character", StringComparison.Ordinal))

                return GetName("self");



            return "UNKNOWN";

        }

UO.Help

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

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

void UO.Help();

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

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. ์™„๋ฃŒ๋Š” ์„œ๋ฒ„์˜ ์ž‘์—…์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ง€์ •๋œ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋งŒ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์—๋Š” ์„œ๋ฒ„ ํ™•์ธ์ด ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•ž์˜ ๋ฉ”์‹œ์ง€๋Š” ํ˜ธ์ถœ ์‹œ์ž‘์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์„œ๋ฒ„ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UO.Print("Calling UO.Help");
UO.Help();

1. ์ง์ ‘ ํ†ตํ™” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • C# IDE์— ๋Œ€ํ•œ ๋กœ์ปฌ ํžŒํŠธ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
UO.Help();

2. ๋ช…์‹œ์  ์˜ต์…˜ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ExecuteLegacyManualAlias๋Š” UO.*, ๊ตฌ์„ฑ๋œ ์ฑ„ํŒ… ์ ‘๋‘์‚ฌ ๋ฐ ์˜ต์…˜ > C# IDE > SystemMessage๋ฅผ ํ†ตํ•œ ์ˆ˜๋™์— ๋Œ€ํ•œ ์ค„์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋„์›€ ์š”์ฒญ์€ ์„œ๋ฒ„๋กœ ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Help();
    UO.OpenIDE();
    return null;
}

3. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ง€์ •๋œ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋งŒ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์—๋Š” ์„œ๋ฒ„ ํ™•์ธ์ด ์—†์Šต๋‹ˆ๋‹ค.
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.Help();
        UO.Print("Options > C# IDE > Manual");
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Help() โ€” UO.Help()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "help": SystemMessage("C# Scripts IDE: use UO.* in scripts or the configured chat prefix. Open Options > C# Scripts IDE > Manual."); break;

UO.Info

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

string UO.Info();
string UO.Info(object? serial);
string UO.Info(object? type, object? x, object? y);
string UO.Info(object? type, object? x, object? y, object? z);

๋™์ž‘ ๋ฐ ๋ฐ˜ํ™˜๊ฐ’

ํ˜ธ์ถœ ์œ„์น˜๊ฐ€ ํ‘œ์‹œ ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ž„์˜ ๊ทธ๋ž˜ํ”ฝ ์ฑ„ํŒ… ๋ช…๋ น์€ ํ•„๋“œ, ๊ฐ’, Ctrl+C์™€ ์Šคํฌ๋กค์ด ์žˆ๋Š” ํ‘œ๋ฅผ ์—ฝ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ C# ์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฒŒ์ž„ ์ฐฝ์ด ์—ด๋ ค ์žˆ์–ด๋„ ์ฐฝ์ด๋‚˜ ํƒ€๊นƒ ์—†์ด ๋ณด๊ณ ์„œ ๋ฌธ์ž์—ด๋งŒ ๋ฐ›์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”ฝ ์ฑ„ํŒ…์—์„œ ์ธ์ˆ˜ ์—†๋Š” Info์™€ InfoTile์€ ํƒ€๊นƒ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ์˜ Info()๋Š” ๋งˆ์ง€๋ง‰ ๋ฌผ์ฒด ํƒ€๊นƒ ๋˜๋Š” ํ”Œ๋ ˆ์ด์–ด๋ฅผ, InfoTile()์€ ๋ฐœ๋ฐ‘ ์ง€ํ˜•์„ ์ฝ์Šต๋‹ˆ๋‹ค. serial, type, ์ขŒํ‘œ๋กœ ๋Œ€์ƒ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. InfoTile(x,y,map)์˜ ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ๋งต ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.

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

  • serial โ€” ๊ฐ์ฒด ์‹œ๋ฆฌ์–ผ ๋ฒˆํ˜ธ ๋˜๋Š” ์ €์žฅ๋œ ๋ณ„์นญ.
  • type โ€” ์•„์ดํ…œ ๊ทธ๋ž˜ํ”ฝ ID. -1์€ ์ง€์ • ์œ„์น˜์˜ ๋ชจ๋“  ์ข…๋ฅ˜์™€ ์ผ์น˜.
  • x โ€” ์›”๋“œ X ์ขŒํ‘œ.
  • y โ€” ์›”๋“œ Y ์ขŒํ‘œ.
  • z โ€” Z ๋†’์ด. ์งง์€ ํ˜•์‹์€ 0 ์‚ฌ์šฉ.

์ ‘๋‘์‚ฌ๋Š” C# Scripts IDE์—์„œ ์„ค์ •ํ•˜๋ฉฐ #์€ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๊ณ  ๋”ฐ์˜ดํ‘œ ์•ˆ์˜ ํ…์ŠคํŠธ๋Š” ํ•˜๋‚˜์˜ ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค. id๋Š” serial, type์€ graphic์ž…๋‹ˆ๋‹ค. xy x y [z]๋Š” ํ•ด๋‹น ์œ„์น˜์˜ ์ฒซ ๋กœ๋“œ ๊ฐœ์ฒด, type๋งŒ ์“ฐ๋ฉด ์ฒซ ์ผ์น˜ ๊ฐœ์ฒด๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. InfoTile(x,y,map)์˜ ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” Z๊ฐ€ ์•„๋‹ˆ๋ผ ์ง€๋„์ž…๋‹ˆ๋‹ค.

์ฑ„ํŒ… ๋ช…๋ น

#info
#UO.Info id 0x40001234
#info type 0x0EED
#info xy 1450 1690
#info type 0x0EED xy 1450 1690 0

์™„์ „ํ•œ C# ์˜ˆ์ œ

๊ฐ ์ฝ”๋“œ ๋ธ”๋ก์€ ์™„์ „ํ•œ ๋…๋ฆฝ .csx์ž…๋‹ˆ๋‹ค. ์˜ˆ์‹œ serial, type๊ณผ ์ขŒํ‘œ๋ฅผ ๋ฐ”๊พธ์„ธ์š”. ์ธ์ˆ˜ ์ˆœ์„œ์™€ C# ๋ช…๋ช…๋œ ์ธ์ˆ˜๋Š” ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

1

string report = UO.Info(0x40001234);
UO.Print(report);

2

string InspectSelf() => UO.Info("self");
UO.Print(InspectSelf());

3

foreach (int serial in new[] { 0x40001234, 0x40005678 })
{
    string report = UO.Info(serial);
    UO.Print(report);
}

4

new CommandSample().Execute(UO);

sealed class CommandSample
{
    public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
    {
        string report = api.Info(0x40001234);
        api.Print(report);
    }
}

๋‚ด๋ถ€ ํ˜ธ์ถœ

CSharpGameApi.Info
  -> CSharpScriptGlobals
  -> InjectionScript.Runtime.InjectionApiUO.Info
ClassicUOInjectionApiBridge -> YokoInfoReport -> YokoInfoGump


UO.InfoColor

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

string UO.InfoColor();
string UO.InfoColor(object? serial);

๋™์ž‘ ๋ฐ ๋ฐ˜ํ™˜๊ฐ’

ํ˜ธ์ถœ ์œ„์น˜๊ฐ€ ํ‘œ์‹œ ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ž„์˜ ๊ทธ๋ž˜ํ”ฝ ์ฑ„ํŒ… ๋ช…๋ น์€ ํ•„๋“œ, ๊ฐ’, Ctrl+C์™€ ์Šคํฌ๋กค์ด ์žˆ๋Š” ํ‘œ๋ฅผ ์—ฝ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ C# ์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฒŒ์ž„ ์ฐฝ์ด ์—ด๋ ค ์žˆ์–ด๋„ ์ฐฝ์ด๋‚˜ ํƒ€๊นƒ ์—†์ด ๋ณด๊ณ ์„œ ๋ฌธ์ž์—ด๋งŒ ๋ฐ›์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”ฝ ์ฑ„ํŒ…์—์„œ ์ธ์ˆ˜ ์—†๋Š” Info์™€ InfoTile์€ ํƒ€๊นƒ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ์˜ Info()๋Š” ๋งˆ์ง€๋ง‰ ๋ฌผ์ฒด ํƒ€๊นƒ ๋˜๋Š” ํ”Œ๋ ˆ์ด์–ด๋ฅผ, InfoTile()์€ ๋ฐœ๋ฐ‘ ์ง€ํ˜•์„ ์ฝ์Šต๋‹ˆ๋‹ค. serial, type, ์ขŒํ‘œ๋กœ ๋Œ€์ƒ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. InfoTile(x,y,map)์˜ ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ๋งต ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.

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

  • serial โ€” ๊ฐ์ฒด ์‹œ๋ฆฌ์–ผ ๋ฒˆํ˜ธ ๋˜๋Š” ์ €์žฅ๋œ ๋ณ„์นญ.

์ ‘๋‘์‚ฌ๋Š” C# Scripts IDE์—์„œ ์„ค์ •ํ•˜๋ฉฐ #์€ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๊ณ  ๋”ฐ์˜ดํ‘œ ์•ˆ์˜ ํ…์ŠคํŠธ๋Š” ํ•˜๋‚˜์˜ ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค. id๋Š” serial, type์€ graphic์ž…๋‹ˆ๋‹ค. xy x y [z]๋Š” ํ•ด๋‹น ์œ„์น˜์˜ ์ฒซ ๋กœ๋“œ ๊ฐœ์ฒด, type๋งŒ ์“ฐ๋ฉด ์ฒซ ์ผ์น˜ ๊ฐœ์ฒด๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. InfoTile(x,y,map)์˜ ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” Z๊ฐ€ ์•„๋‹ˆ๋ผ ์ง€๋„์ž…๋‹ˆ๋‹ค.

์ฑ„ํŒ… ๋ช…๋ น

#infocolor 0x40001234

์™„์ „ํ•œ C# ์˜ˆ์ œ

๊ฐ ์ฝ”๋“œ ๋ธ”๋ก์€ ์™„์ „ํ•œ ๋…๋ฆฝ .csx์ž…๋‹ˆ๋‹ค. ์˜ˆ์‹œ serial, type๊ณผ ์ขŒํ‘œ๋ฅผ ๋ฐ”๊พธ์„ธ์š”. ์ธ์ˆ˜ ์ˆœ์„œ์™€ C# ๋ช…๋ช…๋œ ์ธ์ˆ˜๋Š” ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

1

UO.Print(UO.InfoColor(0x40001234));

2

string report = UO.InfoColor();
UO.Print(report);

3

foreach (int serial in new[] { 0x40001234, 0x40005678 })
    UO.Print(UO.InfoColor(serial));

4

new CommandSample().Execute(UO);

sealed class CommandSample
{
    public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
    {
        api.Print(api.InfoColor(0x40001234));
    }
}

๋‚ด๋ถ€ ํ˜ธ์ถœ

CSharpGameApi.InfoColor
  -> CSharpScriptGlobals
  -> InjectionScript.Runtime.InjectionApiUO.InfoColor
ClassicUOInjectionApiBridge -> YokoInfoReport -> YokoInfoGump


UO.InfoGump

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

string UO.InfoGump();
string UO.InfoGump(object? gump);

๋™์ž‘ ๋ฐ ๋ฐ˜ํ™˜๊ฐ’

ํ˜ธ์ถœ ์œ„์น˜๊ฐ€ ํ‘œ์‹œ ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ž„์˜ ๊ทธ๋ž˜ํ”ฝ ์ฑ„ํŒ… ๋ช…๋ น์€ ํ•„๋“œ, ๊ฐ’, Ctrl+C์™€ ์Šคํฌ๋กค์ด ์žˆ๋Š” ํ‘œ๋ฅผ ์—ฝ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ C# ์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฒŒ์ž„ ์ฐฝ์ด ์—ด๋ ค ์žˆ์–ด๋„ ์ฐฝ์ด๋‚˜ ํƒ€๊นƒ ์—†์ด ๋ณด๊ณ ์„œ ๋ฌธ์ž์—ด๋งŒ ๋ฐ›์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

InfoGump()๋Š” ์ตœ์‹  ์„œ๋ฒ„ ๋Œ€ํ™”์ƒ์ž ๋˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ฐฝ์„ ์ฝ์Šต๋‹ˆ๋‹ค. ID๋‚˜ ์ธ๋ฑ์Šค๋กœ ์„ ํƒํ•˜๋ฉฐ last, LastGump, Last Gump๋Š” ์ตœ์‹  ์ฐฝ์ž…๋‹ˆ๋‹ค. InfoGumps๋Š” ๊ฒ€์‚ฌ ์ฐฝ์„ ์ œ์™ธํ•œ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”ฝ ๋ช…๋ น๋งŒ ํ‘œ๋ฅผ ์—ฝ๋‹ˆ๋‹ค.

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

  • gump โ€” ์„œ๋ฒ„ ์ฐฝ ID ๋˜๋Š” ์ธ๋ฑ์Šค. -1์€ ๋งˆ์ง€๋ง‰ ํ™œ์„ฑ ์ฐฝ.

์ ‘๋‘์‚ฌ๋Š” C# Scripts IDE์—์„œ ์„ค์ •ํ•˜๋ฉฐ #์€ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๊ณ  ๋”ฐ์˜ดํ‘œ ์•ˆ์˜ ํ…์ŠคํŠธ๋Š” ํ•˜๋‚˜์˜ ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค. id๋Š” serial, type์€ graphic์ž…๋‹ˆ๋‹ค. xy x y [z]๋Š” ํ•ด๋‹น ์œ„์น˜์˜ ์ฒซ ๋กœ๋“œ ๊ฐœ์ฒด, type๋งŒ ์“ฐ๋ฉด ์ฒซ ์ผ์น˜ ๊ฐœ์ฒด๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. InfoTile(x,y,map)์˜ ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” Z๊ฐ€ ์•„๋‹ˆ๋ผ ์ง€๋„์ž…๋‹ˆ๋‹ค.

์ฑ„ํŒ… ๋ช…๋ น

#infogump
#infogump last
#info gump last gump
#infogump 0x12345678

์™„์ „ํ•œ C# ์˜ˆ์ œ

๊ฐ ์ฝ”๋“œ ๋ธ”๋ก์€ ์™„์ „ํ•œ ๋…๋ฆฝ .csx์ž…๋‹ˆ๋‹ค. ์˜ˆ์‹œ serial, type๊ณผ ์ขŒํ‘œ๋ฅผ ๋ฐ”๊พธ์„ธ์š”. ์ธ์ˆ˜ ์ˆœ์„œ์™€ C# ๋ช…๋ช…๋œ ์ธ์ˆ˜๋Š” ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

1

string report = UO.InfoGump();
UO.Print(report);

2

UO.Print(UO.InfoGump(0x12345678));

3

string ReadLatestWindow() => UO.InfoGump();
UO.Print(ReadLatestWindow());

4

new CommandSample().Execute(UO);

sealed class CommandSample
{
    public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
    {
        string report = api.InfoGump();
        api.Print(report);
    }
}

๋‚ด๋ถ€ ํ˜ธ์ถœ

CSharpGameApi.InfoGump
  -> CSharpScriptGlobals
  -> InjectionScript.Runtime.InjectionApiUO.InfoGump
ClassicUOInjectionApiBridge -> YokoInfoReport -> YokoInfoGump


UO.InfoGumps

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

string UO.InfoGumps();
string UO.InfoGumps(object? gump);

๋™์ž‘ ๋ฐ ๋ฐ˜ํ™˜๊ฐ’

ํ˜ธ์ถœ ์œ„์น˜๊ฐ€ ํ‘œ์‹œ ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ž„์˜ ๊ทธ๋ž˜ํ”ฝ ์ฑ„ํŒ… ๋ช…๋ น์€ ํ•„๋“œ, ๊ฐ’, Ctrl+C์™€ ์Šคํฌ๋กค์ด ์žˆ๋Š” ํ‘œ๋ฅผ ์—ฝ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ C# ์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฒŒ์ž„ ์ฐฝ์ด ์—ด๋ ค ์žˆ์–ด๋„ ์ฐฝ์ด๋‚˜ ํƒ€๊นƒ ์—†์ด ๋ณด๊ณ ์„œ ๋ฌธ์ž์—ด๋งŒ ๋ฐ›์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

InfoGump()๋Š” ์ตœ์‹  ์„œ๋ฒ„ ๋Œ€ํ™”์ƒ์ž ๋˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ฐฝ์„ ์ฝ์Šต๋‹ˆ๋‹ค. ID๋‚˜ ์ธ๋ฑ์Šค๋กœ ์„ ํƒํ•˜๋ฉฐ last, LastGump, Last Gump๋Š” ์ตœ์‹  ์ฐฝ์ž…๋‹ˆ๋‹ค. InfoGumps๋Š” ๊ฒ€์‚ฌ ์ฐฝ์„ ์ œ์™ธํ•œ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”ฝ ๋ช…๋ น๋งŒ ํ‘œ๋ฅผ ์—ฝ๋‹ˆ๋‹ค.

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

  • gump โ€” ์„œ๋ฒ„ ์ฐฝ ID ๋˜๋Š” ์ธ๋ฑ์Šค. -1์€ ๋งˆ์ง€๋ง‰ ํ™œ์„ฑ ์ฐฝ.

์ ‘๋‘์‚ฌ๋Š” C# Scripts IDE์—์„œ ์„ค์ •ํ•˜๋ฉฐ #์€ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๊ณ  ๋”ฐ์˜ดํ‘œ ์•ˆ์˜ ํ…์ŠคํŠธ๋Š” ํ•˜๋‚˜์˜ ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค. id๋Š” serial, type์€ graphic์ž…๋‹ˆ๋‹ค. xy x y [z]๋Š” ํ•ด๋‹น ์œ„์น˜์˜ ์ฒซ ๋กœ๋“œ ๊ฐœ์ฒด, type๋งŒ ์“ฐ๋ฉด ์ฒซ ์ผ์น˜ ๊ฐœ์ฒด๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. InfoTile(x,y,map)์˜ ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” Z๊ฐ€ ์•„๋‹ˆ๋ผ ์ง€๋„์ž…๋‹ˆ๋‹ค.

์ฑ„ํŒ… ๋ช…๋ น

#infogumps

์™„์ „ํ•œ C# ์˜ˆ์ œ

๊ฐ ์ฝ”๋“œ ๋ธ”๋ก์€ ์™„์ „ํ•œ ๋…๋ฆฝ .csx์ž…๋‹ˆ๋‹ค. ์˜ˆ์‹œ serial, type๊ณผ ์ขŒํ‘œ๋ฅผ ๋ฐ”๊พธ์„ธ์š”. ์ธ์ˆ˜ ์ˆœ์„œ์™€ C# ๋ช…๋ช…๋œ ์ธ์ˆ˜๋Š” ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

1

UO.Print(UO.InfoGumps());

2

string report = UO.InfoGumps(0x12345678);
UO.Print(report);

3

string ReadAllWindows() => UO.InfoGumps();
UO.Print(ReadAllWindows());

4

new CommandSample().Execute(UO);

sealed class CommandSample
{
    public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
    {
        api.Print(api.InfoGumps());
    }
}

๋‚ด๋ถ€ ํ˜ธ์ถœ

CSharpGameApi.InfoGumps
  -> CSharpScriptGlobals
  -> InjectionScript.Runtime.InjectionApiUO.InfoGumps
ClassicUOInjectionApiBridge -> YokoInfoReport -> YokoInfoGump


UO.InfoTile

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

string UO.InfoTile();
string UO.InfoTile(object? x);
string UO.InfoTile(object? x, object? y);
string UO.InfoTile(object? x, object? y, object? map);
string UO.InfoTile(object? type, object? x, object? y, object? z);
string UO.InfoTile(object? type, object? x, object? y, object? z, object? map);

๋™์ž‘ ๋ฐ ๋ฐ˜ํ™˜๊ฐ’

ํ˜ธ์ถœ ์œ„์น˜๊ฐ€ ํ‘œ์‹œ ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ž„์˜ ๊ทธ๋ž˜ํ”ฝ ์ฑ„ํŒ… ๋ช…๋ น์€ ํ•„๋“œ, ๊ฐ’, Ctrl+C์™€ ์Šคํฌ๋กค์ด ์žˆ๋Š” ํ‘œ๋ฅผ ์—ฝ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ C# ์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฒŒ์ž„ ์ฐฝ์ด ์—ด๋ ค ์žˆ์–ด๋„ ์ฐฝ์ด๋‚˜ ํƒ€๊นƒ ์—†์ด ๋ณด๊ณ ์„œ ๋ฌธ์ž์—ด๋งŒ ๋ฐ›์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”ฝ ์ฑ„ํŒ…์—์„œ ์ธ์ˆ˜ ์—†๋Š” Info์™€ InfoTile์€ ํƒ€๊นƒ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ์˜ Info()๋Š” ๋งˆ์ง€๋ง‰ ๋ฌผ์ฒด ํƒ€๊นƒ ๋˜๋Š” ํ”Œ๋ ˆ์ด์–ด๋ฅผ, InfoTile()์€ ๋ฐœ๋ฐ‘ ์ง€ํ˜•์„ ์ฝ์Šต๋‹ˆ๋‹ค. serial, type, ์ขŒํ‘œ๋กœ ๋Œ€์ƒ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. InfoTile(x,y,map)์˜ ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ๋งต ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.

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

  • map โ€” ๋งต ๋ฒˆํ˜ธ. ์ƒ๋žตํ•˜๋ฉด ํ˜„์žฌ ๋งต ์‚ฌ์šฉ.
  • type โ€” ์•„์ดํ…œ ๊ทธ๋ž˜ํ”ฝ ID. -1์€ ์ง€์ • ์œ„์น˜์˜ ๋ชจ๋“  ์ข…๋ฅ˜์™€ ์ผ์น˜.
  • x โ€” ์›”๋“œ X ์ขŒํ‘œ.
  • y โ€” ์›”๋“œ Y ์ขŒํ‘œ.
  • z โ€” Z ๋†’์ด. ์งง์€ ํ˜•์‹์€ 0 ์‚ฌ์šฉ.

์ ‘๋‘์‚ฌ๋Š” C# Scripts IDE์—์„œ ์„ค์ •ํ•˜๋ฉฐ #์€ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๊ณ  ๋”ฐ์˜ดํ‘œ ์•ˆ์˜ ํ…์ŠคํŠธ๋Š” ํ•˜๋‚˜์˜ ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค. id๋Š” serial, type์€ graphic์ž…๋‹ˆ๋‹ค. xy x y [z]๋Š” ํ•ด๋‹น ์œ„์น˜์˜ ์ฒซ ๋กœ๋“œ ๊ฐœ์ฒด, type๋งŒ ์“ฐ๋ฉด ์ฒซ ์ผ์น˜ ๊ฐœ์ฒด๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. InfoTile(x,y,map)์˜ ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” Z๊ฐ€ ์•„๋‹ˆ๋ผ ์ง€๋„์ž…๋‹ˆ๋‹ค.

์ฑ„ํŒ… ๋ช…๋ น

#infotile
#info tile xy 1450 1690
#infotile 1450 1690 0
#infotile type 0x0EED 1450 1690 0 0

์™„์ „ํ•œ C# ์˜ˆ์ œ

๊ฐ ์ฝ”๋“œ ๋ธ”๋ก์€ ์™„์ „ํ•œ ๋…๋ฆฝ .csx์ž…๋‹ˆ๋‹ค. ์˜ˆ์‹œ serial, type๊ณผ ์ขŒํ‘œ๋ฅผ ๋ฐ”๊พธ์„ธ์š”. ์ธ์ˆ˜ ์ˆœ์„œ์™€ C# ๋ช…๋ช…๋œ ์ธ์ˆ˜๋Š” ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

1

UO.Print(UO.InfoTile(1450, 1690));

2

string report = UO.InfoTile(1450, 1690, 0);
UO.Print(report);

3

UO.Print(UO.InfoTile(0x0EED, 1450, 1690, 0, 0));

4

new CommandSample().Execute(UO);

sealed class CommandSample
{
    public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
    {
        api.Print(api.InfoTile(1450, 1690));
    }
}

๋‚ด๋ถ€ ํ˜ธ์ถœ

CSharpGameApi.InfoTile
  -> CSharpScriptGlobals
  -> InjectionScript.Runtime.InjectionApiUO.InfoTile
ClassicUOInjectionApiBridge -> YokoInfoReport -> YokoInfoGump


UO.Version

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

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

void UO.Version();

์ œํ’ˆ์˜ ์ด๋ฆ„๊ณผ ๋Ÿฐํƒ€์ž„ ๋ฒ„์ „์„ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค.

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

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. ์™„๋ฃŒ๋Š” ์„œ๋ฒ„์˜ ์ž‘์—…์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ExecuteLegacyManualAlias๋Š” ๋ธŒ๋ฆฌ์ง€RuntimeProductName ๋ฐ ๋ธŒ๋ฆฌ์ง€RuntimeProductVersion๋ฅผ SystemMessage๋ฅผ ํ†ตํ•ด ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐ˜ํ™˜๋œ ๋ฒ„์ „ ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹Œ ๋กœ๊ทธ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
  • ์ง€์ •๋œ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋งŒ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์—๋Š” ์„œ๋ฒ„ ํ™•์ธ์ด ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•ž์˜ ๋ฉ”์‹œ์ง€๋Š” ํ˜ธ์ถœ ์‹œ์ž‘์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์„œ๋ฒ„ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UO.Print("Calling UO.Version");
UO.Version();

1. ์ง์ ‘ ํ†ตํ™” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ œํ’ˆ์˜ ์ด๋ฆ„๊ณผ ๋Ÿฐํƒ€์ž„ ๋ฒ„์ „์„ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค.
UO.Version();

2. ๋ช…์‹œ์  ์˜ต์…˜ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ExecuteLegacyManualAlias๋Š” ๋ธŒ๋ฆฌ์ง€RuntimeProductName ๋ฐ ๋ธŒ๋ฆฌ์ง€RuntimeProductVersion๋ฅผ SystemMessage๋ฅผ ํ†ตํ•ด ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐ˜ํ™˜๋œ ๋ฒ„์ „ ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹Œ ๋กœ๊ทธ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Version();
    UO.Help();
    return null;
}

3. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ง€์ •๋œ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋งŒ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์—๋Š” ์„œ๋ฒ„ ํ™•์ธ์ด ์—†์Šต๋‹ˆ๋‹ค.
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.Version();
        UO.Print(UO.GetUserCodepage());
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Version() โ€” UO.Version()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "version": SystemMessage($"{bridge.RuntimeProductName} v{bridge.RuntimeProductVersion}"); break;
โš ๏ธ **GitHub.com Fallback** โš ๏ธ