KO UO Topic profiles configuration - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

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

ํ”„๋กœํ•„ ๋ฐ ๊ตฌ์„ฑ

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

ํ”„๋กœํ•„, ์„ค์ • ์ €์žฅ, ์ „์—ญ ๊ฐ’ ๋ฐ ๋‹จ์ถ•ํ‚ค. ์ „์—ญ ๋Ÿฐํƒ€์ž„ ๊ฐ’๊ณผ ๋กœ์ปฌ ํ”„๋กœ์‹œ์ € ๋ณ€์ˆ˜์˜ ์ˆ˜๋ช…์€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์„น์…˜

์ฃผ์ œ ๋ช…๋ น ๋ฐ ์„ค๋ช…
GetProfile UO.GetProfile
ProfileName UO.ProfileName
ProfileShardName UO.ProfileShardName
ChangeProfile UO.ChangeProfile
ExtChangeProfile UO.ExtChangeProfile
ResetProfile UO.ResetProfile
SaveConfig UO.SaveConfig
Global Variables UO.GetGlobal ยท UO.SetGlobal ยท UO.GListGet ยท UO.GListSet ยท UO.GListSize
EasyUO Variables UO.GetEasyUO ยท UO.SetEasyUO
MUL Path UO.SetMulPath

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

ํ”„๋กœํ•„

UO.GetProfile ยท UO.ProfileName ยท UO.ProfileShardName ยท UO.ChangeProfile ยท UO.ExtChangeProfile ยท UO.ResetProfile ยท UO.SaveConfig ยท UO.ReqProfile ยท UO.ClientProfilePath ยท UO.ClientPath ยท UO.SetMulPath

์ „์—ญ ๋ณ€์ˆ˜

UO.GetGlobal ยท UO.SetGlobal ยท UO.GetEasyUO ยท UO.SetEasyUO ยท UO.GListClear ยท UO.GListGet ยท UO.GListPosName ยท UO.GListPosValue ยท UO.GListSet ยท UO.GListSize

๋‹จ์ถ•ํ‚ค/์„ค์ •

UO.LoadHotkeys ยท UO.SaveHotkeys ยท UO.Set ยท UO.SetDefault

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

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

UO.GetGlobal

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

var text = UO.GetGlobal("manual.delay");
var delayMs = 350;
if (Truth(text != "N/A") && Truth(IsNumeric(text)))
{
    var parsed = Val(text);
    if (Truth(parsed >= 50) && Truth(parsed <= 5000))
    {
        delayMs = checked((int)parsed);
    }
}
await Delay(delayMs);

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
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;
double Val(object? value) => double.TryParse(Convert.ToString(value), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out var number) ? number : 0;

UO.SetGlobal

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

UO.SetGlobal("manual.delay", 350);
UO.SetGlobal("manual.delay", 600);
var text = UO.GetGlobal("manual.delay");
if (Truth(IsNumeric(text)))
{
    await Delay(Val(text));
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
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;
double Val(object? value) => double.TryParse(Convert.ToString(value), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out var number) ? number : 0;

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


UO.ChangeProfile

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

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

dynamic UO.ChangeProfile(object? name);

์„ธ์…˜ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๋ฉด ๋‹ค์Œ ์…€ํ”„ ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ์„ ์œ„ํ•ด ์„ ํƒํ•œ ํ”„๋กœํ•„์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

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

  • name โ€” ์„ ํƒ๋œ ์ƒค๋“œ์— ๋Œ€ํ•ด TryResolveProfileCharacter๋กœ ํ™•์ธ๋œ ์ €์žฅ๋œ ํ”„๋กœํ•„/์บ๋ฆญํ„ฐ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„์€ -4๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int: 0 โ€” ์„ ํƒ ํ•ญ๋ชฉ์ด ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. -2 โ€” ๊ด€๋ฆฌ์ž ์„ธ์…˜ ๋˜๋Š” ์—ฐ๊ฒฐ/๊ฒŒ์ž„ ์„ธ๊ณ„๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. -3 โ€” ๋‘˜ ์ด์ƒ์˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. -4 - ํ”„๋กœํ•„ ์ด๋ฆ„/์ƒค๋“œ๊ฐ€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ChangeProfile๋Š” ๋นˆ ์ƒค๋“œ/๋ฌธ์ž๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ExtChangeProfile๋Š” ๋ช…์‹œ์ ์ธ ์ƒค๋“œ์™€ ๋ฌธ์ž๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž ์„ธ์…˜์—์„œ๋Š” ClassicUO Manager์—์„œ ๋‹ค๋ฅธ ์„ธ์…˜์„ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ์ค‘์ธ ์„ธ์…˜์€ ํ•ด๋‹น ํ”„๋กœํ•„์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์„ฑ๊ณตํ•˜๋ฉด ํ˜„์žฌ ํ”„๋กœํ•„์„ ์ €์žฅ ๋ฐ ์–ธ๋กœ๋“œํ•˜๊ณ  LastServerName๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์„ค์ •์„ ์ €์žฅํ•˜๊ณ  ๋‹ค์Œ ๋ฌธ์ž๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ ์ž์ฒด๊ฐ€ ์‹œ์ž‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Connect๋Š” ๋ณ„๋„๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์‹คํŒจ ์ฝ”๋“œ ํ™•์ธ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์‹ค์ œ ์ €์žฅ๋œ ํ”„๋กœํ•„ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์Œ์ˆ˜ ์ฝ”๋“œ๋Š” ์‹คํŒจ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
var status = UO.ChangeProfile("ExampleProfile");
UO.Print(Convert.ToString(status));

2. ๋นˆ ์ด๋ฆ„ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋‹ค๋ฅธ ์œ„๋ฐ˜ ์‚ฌํ•ญ์ด ์—†๋Š” ๋น„ํ™œ์„ฑํ™”๋œ ๋…๋ฆฝ ์‹คํ–‰ํ˜• ํด๋ผ์ด์–ธํŠธ๋Š” ๋นˆ ์ด๋ฆ„์— ๋Œ€ํ•ด -4๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var status = UO.ChangeProfile("");
    UO.Print(Convert.ToString(status));
    return null;
}

3. ์„ฑ๊ณต์ ์ธ ์„ ํƒ ํ›„ ์—ฐ๊ฒฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • Connect๋Š” ์ฝ”๋“œ 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 status = UO.ChangeProfile("ExampleProfile");
        if (Truth(status == 0))
        {
            UO.Connect();
        }

        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.ChangeProfile(name) โ€” UO.ChangeProfile(Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "changeprofile":

                    return new InjectionValue(bridge.ChangeProfileSelection(Text(0), string.Empty, string.Empty));

UO.ClientPath

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

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

string UO.ClientPath();

ํด๋ผ์ด์–ธํŠธ ์„ค์น˜/์‹คํ–‰ ๊ฐ€๋Šฅ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

string โ€” ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ฒฝ๋กœ. bool๋„ ์•„๋‹ˆ๊ณ , ๋ฐฐ์—ด๋„ ์•„๋‹ˆ๊ณ , ID๋„ ์•„๋‹™๋‹ˆ๋‹ค. ๋นˆ ๊ฒฝ๋กœ๋Š” ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํ˜„์žฌ ์ž‘์—… ํด๋”๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๋™์ž‘

  • CUOEnviroment.ExecutablePath๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”. ์ด๋Š” ์šด์ „ ๊ฒฝ๋กœ, ๊ฒฝ์œ ์ง€ ๋ชฉ๋ก, ์Šคํฌ๋ฆฝํŠธ ํด๋” ๋˜๋Š” ๊ฒŒ์ž„ ๋ฐ์ดํ„ฐ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์€ ๊ฒฝ๋กœ๋ฅผ ์ฝ๊ธฐ๋งŒ ํ•˜๊ณ  ์•„๋ฌด๊ฒƒ๋„ ์—ด๊ฑฐ๋‚˜ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ›„ํ–‰ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋ฅผ ๊ฐ€์ •ํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋„์šฐ๋ฏธ ์˜ˆ์ œ์—์„œ๋Š” ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ด๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฆ„์€ ๊ฒŒ์ž„/ํด๋ผ์ด์–ธํŠธ ์ด๋ฆ„ API์ด๊ณ  ์ฒ ์ž๋Š” UO์ž…๋‹ˆ๋‹ค. ClientPath๋Š” ํด๋ผ์ด์–ธํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ClientProfilePath๋Š” ํ™œ์„ฑ ํ”„๋กœํ•„ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ฝ๊ธฐ ๊ฒฝ๋กœ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋…ผ์Ÿ์ด ์—†์Šต๋‹ˆ๋‹ค. ํด๋” - ๋ฌธ์ž์—ด; ๋นˆ ๊ฐ’์€ ๋ณ„๋„๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
var folder = UO.ClientPath();
if (Truth(folder == ""))
{
    UO.Print("Folder is not available");
    return null;
}
UO.Print(folder);

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. ํด๋ผ์ด์–ธํŠธ ํด๋”๋ฅผ ํ”„๋กœํ•„ ํด๋”์™€ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ด๋Ÿฌํ•œ ํด๋”๋Š” ๋‹ค๋ฅธ ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋Š” ๊ตฌ์„ฑ์ด๋‚˜ ํ”„๋กœํ•„์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋‘ ์ค„์„ ๋ชจ๋‘ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var client = UO.ClientPath();
    var profile = UO.ClientProfilePath();
    UO.Print("Client: " + client);
    if (Truth(profile == ""))
    {
        UO.Print("No current profile");
    }
    else
    {
        UO.Print("Profile: " + profile);
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ์™„์ „ํ•œ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ChildPath ์ „์ฒด๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ํด๋”๋Š” ๊ฒฐ๊ณผ ๋””๋ ‰ํ„ฐ๋ฆฌ์ด๊ณ  ๋ฆฌํ”„๋Š” ํŒŒ์ผ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ฒ”์šฉ ๊ฒฝ๋กœ ์ •๊ทœํ™”๊ฐ€ ์•„๋‹Œ ํŠน์ • ์ด๋ฆ„์— ๋Œ€ํ•œ ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ์ž…๋‹ˆ๋‹ค.
  • ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ์ฝํ˜€์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋จผ์ € ๊ฒฐ๊ณผ ๋ฌธ์ž์—ด์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
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 folder = UO.ClientPath();
        var filePath = ChildPath(folder, "sample.json");
        if (Truth(filePath != ""))
        {
            UO.Print("Example path: " + filePath);
        }

        return null;
    }

    dynamic ChildPath(dynamic folder, dynamic leaf)
    {
        if (Truth(folder == ""))
        {
            return "";
        }

        var last = Right(folder, 1);
        if (Truth(last == "/") || Truth(last == "\\"))
        {
            return folder + leaf;
        }

        return folder + "/" + leaf;
    }

    string Right(object? value, int count)
    {
        string text = Convert.ToString(value) ?? "";
        return text[Math.Max(0, text.Length - count)..];
    }

    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.ClientPath() โ€” UO.ClientPath()

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

case "clientpath": return new InjectionValue(bridge.ClientPath);

UO.ClientProfilePath

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

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

string UO.ClientProfilePath();

ํ˜„์žฌ ํด๋ผ์ด์–ธํŠธ ํ”„๋กœํ•„ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

string โ€” ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ฒฝ๋กœ. bool๋„ ์•„๋‹ˆ๊ณ , ๋ฐฐ์—ด๋„ ์•„๋‹ˆ๊ณ , ID๋„ ์•„๋‹™๋‹ˆ๋‹ค. ๋นˆ ๊ฒฝ๋กœ๋Š” ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํ˜„์žฌ ์ž‘์—… ํด๋”๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๋™์ž‘

  • ProfileManager.ProfilePath ์ฝ๊ธฐ; ํ”„๋กœํ•„์ด ์•„์ง ์„ ํƒ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋นˆ ๋ฌธ์ž์—ด์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ํ†ตํ™” ์ž์ฒด๋Š” ํ”„๋กœํ•„์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋ฉฐ ์„ค์ •์„ ์ „์†กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์€ ๊ฒฝ๋กœ๋ฅผ ์ฝ๊ธฐ๋งŒ ํ•˜๊ณ  ์•„๋ฌด๊ฒƒ๋„ ์—ด๊ฑฐ๋‚˜ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ›„ํ–‰ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋ฅผ ๊ฐ€์ •ํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋„์šฐ๋ฏธ ์˜ˆ์ œ์—์„œ๋Š” ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ด๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฆ„์€ ๊ฒŒ์ž„/ํด๋ผ์ด์–ธํŠธ ์ด๋ฆ„ API์ด๊ณ  ์ฒ ์ž๋Š” UO์ž…๋‹ˆ๋‹ค. ClientPath๋Š” ํด๋ผ์ด์–ธํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ClientProfilePath๋Š” ํ™œ์„ฑ ํ”„๋กœํ•„ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ฝ๊ธฐ ๊ฒฝ๋กœ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋…ผ์Ÿ์ด ์—†์Šต๋‹ˆ๋‹ค. ํด๋” - ๋ฌธ์ž์—ด; ๋นˆ ๊ฐ’์€ ๋ณ„๋„๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
var folder = UO.ClientProfilePath();
if (Truth(folder == ""))
{
    UO.Print("Folder is not available");
    return null;
}
UO.Print(folder);

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. ํด๋ผ์ด์–ธํŠธ ํด๋”๋ฅผ ํ”„๋กœํ•„ ํด๋”์™€ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ด๋Ÿฌํ•œ ํด๋”๋Š” ๋‹ค๋ฅธ ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋Š” ๊ตฌ์„ฑ์ด๋‚˜ ํ”„๋กœํ•„์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋‘ ์ค„์„ ๋ชจ๋‘ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var client = UO.ClientPath();
    var profile = UO.ClientProfilePath();
    UO.Print("Client: " + client);
    if (Truth(profile == ""))
    {
        UO.Print("No current profile");
    }
    else
    {
        UO.Print("Profile: " + profile);
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ์™„์ „ํ•œ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ChildPath ์ „์ฒด๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ํด๋”๋Š” ๊ฒฐ๊ณผ ๋””๋ ‰ํ„ฐ๋ฆฌ์ด๊ณ  ๋ฆฌํ”„๋Š” ํŒŒ์ผ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ฒ”์šฉ ๊ฒฝ๋กœ ์ •๊ทœํ™”๊ฐ€ ์•„๋‹Œ ํŠน์ • ์ด๋ฆ„์— ๋Œ€ํ•œ ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ์ž…๋‹ˆ๋‹ค.
  • ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ์ฝํ˜€์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋จผ์ € ๊ฒฐ๊ณผ ๋ฌธ์ž์—ด์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
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 folder = UO.ClientProfilePath();
        var filePath = ChildPath(folder, "sample.json");
        if (Truth(filePath != ""))
        {
            UO.Print("Example path: " + filePath);
        }

        return null;
    }

    dynamic ChildPath(dynamic folder, dynamic leaf)
    {
        if (Truth(folder == ""))
        {
            return "";
        }

        var last = Right(folder, 1);
        if (Truth(last == "/") || Truth(last == "\\"))
        {
            return folder + leaf;
        }

        return folder + "/" + leaf;
    }

    string Right(object? value, int count)
    {
        string text = Convert.ToString(value) ?? "";
        return text[Math.Max(0, text.Length - count)..];
    }

    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.ClientProfilePath() โ€” UO.ClientProfilePath()

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

case "shardpath":

                case "clientprofilepath": return new InjectionValue(bridge.CurrentProfilePath);

UO.ExtChangeProfile

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

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

dynamic UO.ExtChangeProfile(object? profileName);
dynamic UO.ExtChangeProfile(object? profileName, object? shardName);
dynamic UO.ExtChangeProfile(object? profileName, object? shardName, object? charName);

์„ธ์…˜ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๋ฉด ๋‹ค์Œ ์…€ํ”„ ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ์„ ์œ„ํ•ด ์„ ํƒํ•œ ํ”„๋กœํ•„์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

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

  • profileName โ€” ์„ ํƒ๋œ ์ƒค๋“œ์— ๋Œ€ํ•ด TryResolveProfileCharacter๋กœ ํ™•์ธ๋œ ์ €์žฅ๋œ ํ”„๋กœํ•„/์บ๋ฆญํ„ฐ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„์€ -4๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • shardName โ€” ์„ ํƒ์  ์ƒค๋“œ ์ด๋ฆ„. ๋นˆ ๊ฐ’์€ CurrentProfile.ServerName, World.ServerName ๋˜๋Š” LastServerName๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • charName - ์„ ํƒ์ ์ธ ์บ๋ฆญํ„ฐ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๋นˆ ๊ฐ’์€ ์ €์žฅ๋œ ํ”„๋กœํ•„ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int: 0 โ€” ์„ ํƒ ํ•ญ๋ชฉ์ด ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. -2 โ€” ๊ด€๋ฆฌ์ž ์„ธ์…˜ ๋˜๋Š” ์—ฐ๊ฒฐ/๊ฒŒ์ž„ ์„ธ๊ณ„๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. -3 โ€” ๋‘˜ ์ด์ƒ์˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. -4 - ํ”„๋กœํ•„ ์ด๋ฆ„/์ƒค๋“œ๊ฐ€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ChangeProfile๋Š” ๋นˆ ์ƒค๋“œ/๋ฌธ์ž๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ExtChangeProfile๋Š” ๋ช…์‹œ์ ์ธ ์ƒค๋“œ์™€ ๋ฌธ์ž๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž ์„ธ์…˜์—์„œ๋Š” ClassicUO Manager์—์„œ ๋‹ค๋ฅธ ์„ธ์…˜์„ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ์ค‘์ธ ์„ธ์…˜์€ ํ•ด๋‹น ํ”„๋กœํ•„์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์„ฑ๊ณตํ•˜๋ฉด ํ˜„์žฌ ํ”„๋กœํ•„์„ ์ €์žฅ ๋ฐ ์–ธ๋กœ๋“œํ•˜๊ณ  LastServerName๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์„ค์ •์„ ์ €์žฅํ•˜๊ณ  ๋‹ค์Œ ๋ฌธ์ž๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ ์ž์ฒด๊ฐ€ ์‹œ์ž‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Connect๋Š” ๋ณ„๋„๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์‹คํŒจ ์ฝ”๋“œ ํ™•์ธ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์‹ค์ œ ์ €์žฅ๋œ ํ”„๋กœํ•„ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์Œ์ˆ˜ ์ฝ”๋“œ๋Š” ์‹คํŒจ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
var status = UO.ExtChangeProfile("ExampleProfile");
UO.Print(Convert.ToString(status));

2. ๋นˆ ์ด๋ฆ„ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋‹ค๋ฅธ ์œ„๋ฐ˜ ์‚ฌํ•ญ์ด ์—†๋Š” ๋น„ํ™œ์„ฑํ™”๋œ ๋…๋ฆฝ ์‹คํ–‰ํ˜• ํด๋ผ์ด์–ธํŠธ๋Š” ๋นˆ ์ด๋ฆ„์— ๋Œ€ํ•ด -4๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var status = UO.ExtChangeProfile("");
    UO.Print(Convert.ToString(status));
    return null;
}

3. ์„ฑ๊ณต์ ์ธ ์„ ํƒ ํ›„ ์—ฐ๊ฒฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • Connect๋Š” ์ฝ”๋“œ 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 status = UO.ExtChangeProfile("ExampleProfile");
        if (Truth(status == 0))
        {
            UO.Connect();
        }

        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.ExtChangeProfile(profileName) โ€” UO.ExtChangeProfile(Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "extchangeprofile":

                {

                    string requestedProfile = Text(0);

                    string requestedShard = arguments.Length > 1 ? Text(1) : string.Empty;

                    string requestedCharacter = arguments.Length > 2 ? Text(2) : string.Empty;

                    return new InjectionValue(bridge.ChangeProfileSelection(requestedProfile, requestedShard, requestedCharacter));

                }

UO.ExtChangeProfile(profileName, shardName) โ€” UO.ExtChangeProfile(Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: profileName (Any), shardName (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "extchangeprofile":

                {

                    string requestedProfile = Text(0);

                    string requestedShard = arguments.Length > 1 ? Text(1) : string.Empty;

                    string requestedCharacter = arguments.Length > 2 ? Text(2) : string.Empty;

                    return new InjectionValue(bridge.ChangeProfileSelection(requestedProfile, requestedShard, requestedCharacter));

                }

UO.ExtChangeProfile(profileName, shardName, charName) โ€” UO.ExtChangeProfile(Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: profileName (Any), shardName (Any), charName (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "extchangeprofile":

                {

                    string requestedProfile = Text(0);

                    string requestedShard = arguments.Length > 1 ? Text(1) : string.Empty;

                    string requestedCharacter = arguments.Length > 2 ? Text(2) : string.Empty;

                    return new InjectionValue(bridge.ChangeProfileSelection(requestedProfile, requestedShard, requestedCharacter));

                }

UO.GListClear

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

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

void UO.GListClear();

์ƒˆ๋กœ์šด ์ผ๋ จ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ „์ฒด ์ž„์‹œ ๋ชฉ๋ก์„ ์ง€์›๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

void - ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ง€์šฐ๊ณ  ๋‚˜๋ฉด GListSize()๋Š” 0๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋ชฉ๋ก์€ ๋Ÿฐํƒ€์ž„ ์ธ์Šคํ„ด์Šค์— ์†ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์—๋Š” ์ž์ฒด ๋ชฉ๋ก์ด ์žˆ์Šต๋‹ˆ๋‹ค. GList๋Š” ๊ณต์œ ๋œ ํ”„๋กœํ•„ ๊ฐ„ ์ €์žฅ์†Œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ช…๋ น์€ ํŒŒ์ผ์„ ์“ฐ์ง€ ์•Š์œผ๋ฉฐ ์ €์žฅ๋œ ํ”„๋กœํ•„ ์ƒํƒœ๋กœ ๋“ค์–ด๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ ๋Ÿฐํƒ€์ž„์€ ๋นˆ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋˜ํ•œ var/๋ณ€์ˆ˜ ์„ ์–ธ๋„ ์•„๋‹ˆ๊ณ  UO.SetGlobal๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • ์ƒˆ ์ด๋ฆ„์ด ๋์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ์ด๋ฆ„์„ ๋ฐ˜๋ณตํ•˜๋ฉด ์›๋ž˜ ์œ„์น˜์—์„œ ์ด๋ฆ„์˜ ์˜๋ฏธ์™€ ์ฒ ์ž๊ฐ€ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ์ฝ์–ด๋„ ์•„๋ฌด๊ฒƒ๋„ ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ˆ์ •์ ์ธ ์ƒ‰์ธ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ฒ€์ƒ‰ ๋„์ค‘์— ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ž‘์—…์€ ๋กœ์ปฌ์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ํŒจํ‚ท์ด ์—†๊ณ  ๊ฐœ์ฒด ๊ฒ€์ƒ‰์ด ์—†์œผ๋ฉฐ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค. Set/์ด๋ฆ„์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๋” ํฐ ์„ธํŠธ์˜ ๊ฒฝ์šฐ ์‚ฌ์ „์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์ด ๊ณ„์—ด์—์„œ ํ•˜๋‚˜์˜ ํ‚ค๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•œ ๋ณ„๋„์˜ ๋ช…๋ น์€ ์—†์Šต๋‹ˆ๋‹ค. ์ง€์šฐ๊ธฐ๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์ง€์›๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • Clear๋Š” ๋‘ ๊ทœ์น™์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๊ณ  Size๋Š” ๋น„์–ด ์žˆ์Œ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ์˜ ์•„์ดํ…œ์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
UO.GListClear();
UO.GListSet("bandage", 0x0E21);
UO.GListSet("gold", 0x0EED);
UO.GListClear();
if (Truth(UO.GListSize() == 0))
{
    UO.Print("Batch rules cleared");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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

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

  • ๊ด‘์„์ด ์ถ”๊ฐ€๋˜๊ธฐ ์ „์— ์ด์ „ ๊ทœ์น™์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰์—๋Š” graphic 0x19B9๊ฐ€ ํฌํ•จ๋œ ์ƒˆ ๊ทœ์น™๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.GListClear();
    UO.GListSet("bandage", 0x0E21);
    UO.GListSet("gold", 0x0EED);
    UO.GListClear();
    UO.GListSet("ore", 0x19B9);
    var i = 0;
    while (Truth(i < UO.GListSize()))
    {
        var name = UO.GListPosName(i);
        var graphic = UO.GListPosValue(i);
        UO.Print(name + " | graphic: " + Convert.ToString(graphic));
        i = i + 1;
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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

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

  • ์ด์ „์— ์ฝ์€ ์ˆซ์ž๋Š” ๋ชฉ๋ก์ด ์ง€์›Œ์ง„ ํ›„์—๋„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชฉ๋ก์— ์ด๋ฏธ 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()
    {
        UO.GListClear();
        UO.GListSet("bandage", 0x0E21);
        UO.GListSet("gold", 0x0EED);
        var retained = UO.GListGet("bandage");
        UO.GListClear();
        UO.Print("Retained graphic: " + Convert.ToString(retained));
        UO.Print("Remaining entries: " + Convert.ToString(UO.GListSize()));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.GListClear() โ€” UO.GListClear()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void GListClear() => globalList.Clear();

UO.GListGet

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

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

dynamic UO.GListGet(object? nameValue);

๊ทœ์น™ ๋˜๋Š” ์นด์šดํ„ฐ ์ด๋ฆ„๋ณ„๋กœ ์ž„์‹œ ๋ชฉ๋ก์—์„œ ๊ฐ’์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • nameValue โ€” object? ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ๋น„๊ต๋ฉ๋‹ˆ๋‹ค. "bandage"์™€ "BANDAGE"๊ฐ€ ํ•˜๋‚˜์˜ ํ‚ค์ž…๋‹ˆ๋‹ค. ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๋ฌธ์ž์—ด ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋นˆ ์ด๋ฆ„๋„ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

object? โ€” ๋™์ผํ•œ ์œ ํ˜•์˜ ์ €์žฅ๋œ ๊ฐ’์ž…๋‹ˆ๋‹ค. ์—ด์‡ ๊ฐ€ ์—†์œผ๋ฉด int 0. ๋ณด์กด๋œ 0๋Š” ์—†๋Š” GListGet์™€ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„์„ ํ™•์ธํ•˜์„ธ์š”.

๋™์ž‘

  • ๋ชฉ๋ก์€ ๋Ÿฐํƒ€์ž„ ์ธ์Šคํ„ด์Šค์— ์†ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์—๋Š” ์ž์ฒด ๋ชฉ๋ก์ด ์žˆ์Šต๋‹ˆ๋‹ค. GList๋Š” ๊ณต์œ ๋œ ํ”„๋กœํ•„ ๊ฐ„ ์ €์žฅ์†Œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ช…๋ น์€ ํŒŒ์ผ์„ ์“ฐ์ง€ ์•Š์œผ๋ฉฐ ์ €์žฅ๋œ ํ”„๋กœํ•„ ์ƒํƒœ๋กœ ๋“ค์–ด๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ ๋Ÿฐํƒ€์ž„์€ ๋นˆ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋˜ํ•œ var/๋ณ€์ˆ˜ ์„ ์–ธ๋„ ์•„๋‹ˆ๊ณ  UO.SetGlobal๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • ์ƒˆ ์ด๋ฆ„์ด ๋์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ์ด๋ฆ„์„ ๋ฐ˜๋ณตํ•˜๋ฉด ์›๋ž˜ ์œ„์น˜์—์„œ ์ด๋ฆ„์˜ ์˜๋ฏธ์™€ ์ฒ ์ž๊ฐ€ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ์ฝ์–ด๋„ ์•„๋ฌด๊ฒƒ๋„ ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ˆ์ •์ ์ธ ์ƒ‰์ธ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ฒ€์ƒ‰ ๋„์ค‘์— ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ž‘์—…์€ ๋กœ์ปฌ์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ํŒจํ‚ท์ด ์—†๊ณ  ๊ฐœ์ฒด ๊ฒ€์ƒ‰์ด ์—†์œผ๋ฉฐ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค. Set/์ด๋ฆ„์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๋” ํฐ ์„ธํŠธ์˜ ๊ฒฝ์šฐ ์‚ฌ์ „์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์ด ๊ณ„์—ด์—์„œ ํ•˜๋‚˜์˜ ํ‚ค๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•œ ๋ณ„๋„์˜ ๋ช…๋ น์€ ์—†์Šต๋‹ˆ๋‹ค. ์ง€์šฐ๊ธฐ๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์ง€์›๋‹ˆ๋‹ค.

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

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

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

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

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

UO.GListSet("simple_value", 42);
object? result = UO.GListGet("simple_value");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

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

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

  • BANDAGE๋Š” ๋ถ•๋Œ€ ์—ด์‡ ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. 0x0E21 - graphic ๋ถ•๋Œ€, ๊ทธ์˜ ๊ณ ์œ ํ•œ serial๊ฐ€ ์•„๋‹˜.
UO.GListClear();
UO.GListSet("bandage", 0x0E21);
UO.GListSet("gold", 0x0EED);
var graphic = UO.GListGet("BANDAGE");
if (Truth(graphic == 0x0E21))
{
    UO.Print("Bandage rule selected");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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

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

  • ์™„์ „ํ•œ ํ•จ์ˆ˜ HasEntry๋Š” ์ด๋ฆ„์„ ํ†ตํ•ด ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฒ˜๋ฆฌ๋œ 0๋Š” ๋ˆ„๋ฝ๋œ ๊ฒƒ๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ž์ฒด ํ‚ค์˜ ๊ฒฝ์šฐ ์—ฌ๊ธฐ์—์„œ ASCII ์ด๋ฆ„์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.GListClear();
    UO.GListSet("processed", 0);
    if (Truth(HasEntry("processed")))
    {
        var count = UO.GListGet("processed");
        UO.Print("Recorded count: " + Convert.ToString(count));
    }

    if (!(Truth(HasEntry("missing"))))
    {
        UO.Print("No entry named missing");
    }

    return null;
}

dynamic HasEntry(dynamic name)
{
    var i = 0;
    while (Truth(i < UO.GListSize()))
    {
        if (Truth(Convert.ToString(UO.GListPosName(i)) == Convert.ToString(name)))
        {
            return true;
        }

        i = i + 1;
    }

    return false;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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

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

  • ์ง€์—ฐ โ€” ๋ฐ€๋ฆฌ์ดˆ ์ˆ˜; UO.Wait๋Š” 50โ€“5000 ๋ฒ”์œ„์˜ ๊ฐ’์— ๋Œ€ํ•ด์„œ๋งŒ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” 350ms ๋™์•ˆ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
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;
    }

    async public Task<object?> RunScenarioAsync()
    {
        UO.GListClear();
        UO.GListSet("delay", 350);
        var delayMs = UO.GListGet("delay");
        if (Truth(delayMs >= 50) && Truth(delayMs <= 5000))
        {
            await Delay(delayMs);
        }
        else
        {
            UO.Print("Delay outside the accepted range");
        }

        return null;
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    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.GListGet(nameValue) โ€” UO.GListGet(Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

public InjectionValue GListGet(InjectionValue nameValue)

        {

            string name = nameValue.ToString();

            int index = globalList.FindIndex(pair => pair.Key.Equals(name, StringComparison.OrdinalIgnoreCase));

            return index >= 0 ? globalList[index].Value : InjectionValue.Zero;

        }

UO.GListPosName

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

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

string UO.GListPosName(object? index);

๊ทœ์น™์„ ์—ด๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์œ„์น˜๋ณ„๋กœ ๋ ˆ์ฝ”๋“œ ์ด๋ฆ„์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • index - int: 0๋ถ€ํ„ฐ GListSize()-1๊นŒ์ง€์˜ ์ธ๋ฑ์Šค์ž…๋‹ˆ๋‹ค. serial, graphic ๋˜๋Š” ์Šคํƒ์˜ ๋‹จ์œ„ ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string๋Š” ๋“ฑ๋ก๋ถ€์˜ ๋งˆ์ง€๋ง‰ ๊ธฐ๋ก ํ˜•์‹์— ์žˆ๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ์ธ๋ฑ์Šค๋Š” ""๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋นˆ ํ‚ค๋„ ""๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋ชฉ๋ก์€ ๋Ÿฐํƒ€์ž„ ์ธ์Šคํ„ด์Šค์— ์†ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์—๋Š” ์ž์ฒด ๋ชฉ๋ก์ด ์žˆ์Šต๋‹ˆ๋‹ค. GList๋Š” ๊ณต์œ ๋œ ํ”„๋กœํ•„ ๊ฐ„ ์ €์žฅ์†Œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ช…๋ น์€ ํŒŒ์ผ์„ ์“ฐ์ง€ ์•Š์œผ๋ฉฐ ์ €์žฅ๋œ ํ”„๋กœํ•„ ์ƒํƒœ๋กœ ๋“ค์–ด๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ ๋Ÿฐํƒ€์ž„์€ ๋นˆ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋˜ํ•œ var/๋ณ€์ˆ˜ ์„ ์–ธ๋„ ์•„๋‹ˆ๊ณ  UO.SetGlobal๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • ์ƒˆ ์ด๋ฆ„์ด ๋์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ์ด๋ฆ„์„ ๋ฐ˜๋ณตํ•˜๋ฉด ์›๋ž˜ ์œ„์น˜์—์„œ ์ด๋ฆ„์˜ ์˜๋ฏธ์™€ ์ฒ ์ž๊ฐ€ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ์ฝ์–ด๋„ ์•„๋ฌด๊ฒƒ๋„ ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ˆ์ •์ ์ธ ์ƒ‰์ธ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ฒ€์ƒ‰ ๋„์ค‘์— ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ž‘์—…์€ ๋กœ์ปฌ์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ํŒจํ‚ท์ด ์—†๊ณ  ๊ฐœ์ฒด ๊ฒ€์ƒ‰์ด ์—†์œผ๋ฉฐ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค. Set/์ด๋ฆ„์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๋” ํฐ ์„ธํŠธ์˜ ๊ฒฝ์šฐ ์‚ฌ์ „์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์ด ๊ณ„์—ด์—์„œ ํ•˜๋‚˜์˜ ํ‚ค๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•œ ๋ณ„๋„์˜ ๋ช…๋ น์€ ์—†์Šต๋‹ˆ๋‹ค. ์ง€์šฐ๊ธฐ๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์ง€์›๋‹ˆ๋‹ค.

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

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

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

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

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

UO.GListClear();
UO.GListSet("simple_value", 42);
var result = UO.GListPosName(0);
UO.Print("GListPosName: " + Convert.ToString(result));

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

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

  • ์ƒ‰์ธ 0์€ ์ฒซ ๋ฒˆ์งธ ๊ทœ์น™์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฝ๊ธฐ ์ „์— ๋ชฉ๋ก์ด ๋น„์–ด ์žˆ์ง€ ์•Š์€์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
UO.GListClear();
UO.GListSet("bandage", 0x0E21);
UO.GListSet("gold", 0x0EED);
if (Truth(UO.GListSize() > 0))
{
    var first = UO.GListPosName(0);
    UO.Print("First rule: " + first);
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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

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

  • HasEntry๋Š” ๊ธฐ๋ก๋œ 0 ์นด์šดํ„ฐ์— ๋Œ€ํ•ด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ด๋ฆ„์ด ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.GListClear();
    UO.GListSet("processed", 0);
    if (Truth(HasEntry("processed")))
    {
        var count = UO.GListGet("processed");
        UO.Print("Recorded count: " + Convert.ToString(count));
    }

    if (!(Truth(HasEntry("missing"))))
    {
        UO.Print("No entry named missing");
    }

    return null;
}

dynamic HasEntry(dynamic name)
{
    var i = 0;
    while (Truth(i < UO.GListSize()))
    {
        if (Truth(Convert.ToString(UO.GListPosName(i)) == Convert.ToString(name)))
        {
            return true;
        }

        i = i + 1;
    }

    return false;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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

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

  • BANDAGE๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉด ์ฒซ ๋ฒˆ์งธ ์œ„์น˜์— ์žˆ๋Š” ์ด๋ฆ„์˜ ์ฒ ์ž๊ฐ€ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ๊ธˆ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹2์œ„๋‹ค.
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.GListClear();
        UO.GListSet("bandage", 0x0E21);
        UO.GListSet("gold", 0x0EED);
        UO.GListSet("BANDAGE", 0x0E21);
        var i = 0;
        while (Truth(i < UO.GListSize()))
        {
            var name = UO.GListPosName(i);
            var graphic = UO.GListPosValue(i);
            UO.Print(name + " | graphic: " + Convert.ToString(graphic));
            i = i + 1;
        }

        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.GListPosName(index) โ€” UO.GListPosName(Integer)

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

public string GListPosName(int index) => index >= 0 && index < globalList.Count ? globalList[index].Key : string.Empty;

UO.GListPosValue

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

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

dynamic UO.GListPosValue(object? index);

๋ฏธ๋ฆฌ ์ฑ„์›Œ์ง„ ๋ชฉ๋ก์—์„œ graphic์™€ ๊ฐ™์€ ์œ„์น˜๋ณ„ ํ•ญ๋ชฉ ๊ฐ’์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • index - int: 0๋ถ€ํ„ฐ GListSize()-1๊นŒ์ง€์˜ ์ธ๋ฑ์Šค์ž…๋‹ˆ๋‹ค. serial, graphic ๋˜๋Š” ์Šคํƒ์˜ ๋‹จ์œ„ ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

object? โ€” ๋ณด์กด๋œ ์œ ํ˜•์˜ ๊ฐ’; ์ž˜๋ชป๋œ ์ธ๋ฑ์Šค๋Š” int 0๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. true 0๊ฐ€ ํ—ˆ์šฉ๋˜๋ฏ€๋กœ ๊ฒฝ๊ณ„๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

๋™์ž‘

  • ๋ชฉ๋ก์€ ๋Ÿฐํƒ€์ž„ ์ธ์Šคํ„ด์Šค์— ์†ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์—๋Š” ์ž์ฒด ๋ชฉ๋ก์ด ์žˆ์Šต๋‹ˆ๋‹ค. GList๋Š” ๊ณต์œ ๋œ ํ”„๋กœํ•„ ๊ฐ„ ์ €์žฅ์†Œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ช…๋ น์€ ํŒŒ์ผ์„ ์“ฐ์ง€ ์•Š์œผ๋ฉฐ ์ €์žฅ๋œ ํ”„๋กœํ•„ ์ƒํƒœ๋กœ ๋“ค์–ด๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ ๋Ÿฐํƒ€์ž„์€ ๋นˆ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋˜ํ•œ var/๋ณ€์ˆ˜ ์„ ์–ธ๋„ ์•„๋‹ˆ๊ณ  UO.SetGlobal๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • ์ƒˆ ์ด๋ฆ„์ด ๋์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ์ด๋ฆ„์„ ๋ฐ˜๋ณตํ•˜๋ฉด ์›๋ž˜ ์œ„์น˜์—์„œ ์ด๋ฆ„์˜ ์˜๋ฏธ์™€ ์ฒ ์ž๊ฐ€ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ์ฝ์–ด๋„ ์•„๋ฌด๊ฒƒ๋„ ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ˆ์ •์ ์ธ ์ƒ‰์ธ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ฒ€์ƒ‰ ๋„์ค‘์— ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ž‘์—…์€ ๋กœ์ปฌ์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ํŒจํ‚ท์ด ์—†๊ณ  ๊ฐœ์ฒด ๊ฒ€์ƒ‰์ด ์—†์œผ๋ฉฐ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค. Set/์ด๋ฆ„์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๋” ํฐ ์„ธํŠธ์˜ ๊ฒฝ์šฐ ์‚ฌ์ „์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์ด ๊ณ„์—ด์—์„œ ํ•˜๋‚˜์˜ ํ‚ค๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•œ ๋ณ„๋„์˜ ๋ช…๋ น์€ ์—†์Šต๋‹ˆ๋‹ค. ์ง€์šฐ๊ธฐ๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์ง€์›๋‹ˆ๋‹ค.

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

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

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

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

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

UO.GListClear();
UO.GListSet("simple_value", 42);
object? result = UO.GListPosValue(0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

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

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

  • ์ง€์ˆ˜ 1๋Š” ๋‘ ๋ฒˆ์งธ ๊ธˆ์น™์น™์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์„ ์ฝ๊ธฐ ์ „์— ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
UO.GListClear();
UO.GListSet("bandage", 0x0E21);
UO.GListSet("gold", 0x0EED);
var index = 1;
if (Truth(index >= 0) && Truth(index < UO.GListSize()))
{
    var graphic = UO.GListPosValue(index);
    UO.Print("Second rule graphic: " + Convert.ToString(graphic));
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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

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

  • graphic ๋ถ•๋Œ€๋Š” ์›”๋“œ์— ์žˆ๋Š” ์•„์ดํ…œ์ด ์•„๋‹Œ ๊ทœ์น™์— ์žˆ๋Š” ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž… ๊ฒ€์ƒ‰์ž…๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์š”์ฒญ์ด ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.GListClear();
    UO.GListSet("bandage", 0x0E21);
    UO.GListSet("gold", 0x0EED);
    var total = UO.GListSize();
    var i = 0;
    while (Truth(i < total))
    {
        var graphic = UO.GListPosValue(i);
        if (Truth(graphic == 0x0E21))
        {
            UO.Print("Bandage rule at index " + Convert.ToString(i));
        }

        i = i + 1;
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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

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

  • ์ธ๋ฑ์Šค 0๊ฐ€ ์กด์žฌํ•˜๋ฏ€๋กœ 0 ๊ฐ’์ด ์œ ํšจํ•œ ์นด์šดํ„ฐ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” null์ด ์•„๋‹Œ ๊ฐ’์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.
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.GListClear();
        UO.GListSet("processed", 0);
        var index = 0;
        if (Truth(index < UO.GListSize()))
        {
            var count = UO.GListPosValue(index);
            UO.Print("Valid zero count: " + Convert.ToString(count));
        }

        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.GListPosValue(index) โ€” UO.GListPosValue(Integer)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

public InjectionValue GListPosValue(int index) => index >= 0 && index < globalList.Count ? globalList[index].Value : InjectionValue.Zero;

UO.GListSet

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

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

void UO.GListSet(object? nameValue, object? value);

์ž„์‹œ ๋ชฉ๋ก์— ๋ช…๋ช…๋œ ๊ฐ’์„ ์”๋‹ˆ๋‹ค(์˜ˆ: graphic ์ „๋ฆฌํ’ˆ ๊ทœ์น™ ๋˜๋Š” ํ•ญ๋ชฉ ์ฒ˜๋ฆฌ ์นด์šดํ„ฐ).

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

  • nameValue โ€” object? ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ๋น„๊ต๋ฉ๋‹ˆ๋‹ค. "bandage"์™€ "BANDAGE"๊ฐ€ ํ•˜๋‚˜์˜ ํ‚ค์ž…๋‹ˆ๋‹ค. ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๋ฌธ์ž์—ด ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋นˆ ์ด๋ฆ„๋„ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ• ๋‹น ์—†์ด ๋ณ„๋„์˜ ๋ช…๋ น์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋ชฉ๋ก์€ ๋Ÿฐํƒ€์ž„ ์ธ์Šคํ„ด์Šค์— ์†ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์—๋Š” ์ž์ฒด ๋ชฉ๋ก์ด ์žˆ์Šต๋‹ˆ๋‹ค. GList๋Š” ๊ณต์œ ๋œ ํ”„๋กœํ•„ ๊ฐ„ ์ €์žฅ์†Œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ช…๋ น์€ ํŒŒ์ผ์„ ์“ฐ์ง€ ์•Š์œผ๋ฉฐ ์ €์žฅ๋œ ํ”„๋กœํ•„ ์ƒํƒœ๋กœ ๋“ค์–ด๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ ๋Ÿฐํƒ€์ž„์€ ๋นˆ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋˜ํ•œ var/๋ณ€์ˆ˜ ์„ ์–ธ๋„ ์•„๋‹ˆ๊ณ  UO.SetGlobal๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • ์ƒˆ ์ด๋ฆ„์ด ๋์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ์ด๋ฆ„์„ ๋ฐ˜๋ณตํ•˜๋ฉด ์›๋ž˜ ์œ„์น˜์—์„œ ์ด๋ฆ„์˜ ์˜๋ฏธ์™€ ์ฒ ์ž๊ฐ€ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ์ฝ์–ด๋„ ์•„๋ฌด๊ฒƒ๋„ ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ˆ์ •์ ์ธ ์ƒ‰์ธ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ฒ€์ƒ‰ ๋„์ค‘์— ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ž‘์—…์€ ๋กœ์ปฌ์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ํŒจํ‚ท์ด ์—†๊ณ  ๊ฐœ์ฒด ๊ฒ€์ƒ‰์ด ์—†์œผ๋ฉฐ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค. Set/์ด๋ฆ„์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๋” ํฐ ์„ธํŠธ์˜ ๊ฒฝ์šฐ ์‚ฌ์ „์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์ด ๊ณ„์—ด์—์„œ ํ•˜๋‚˜์˜ ํ‚ค๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•œ ๋ณ„๋„์˜ ๋ช…๋ น์€ ์—†์Šต๋‹ˆ๋‹ค. ์ง€์šฐ๊ธฐ๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์ง€์›๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.GListSet");
UO.GListSet("gold", 0x0EED);

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

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

  • ๋ถ•๋Œ€์™€ ๊ธˆ์€ ๊ทœ์น™์˜ ์ด๋ฆ„์ด๊ณ  ์ˆซ์ž๋Š” graphic์ž…๋‹ˆ๋‹ค. BANDAGE๋Š” ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ๋Œ€์ฒดํ•˜๊ณ  ์„ธ ๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ถœ๋ ฅ์— ์ˆœ์„œ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
UO.GListClear();
UO.GListSet("bandage", 0x0E21);
UO.GListSet("gold", 0x0EED);
UO.GListSet("BANDAGE", 0x0E21);
var i = 0;
while (Truth(i < UO.GListSize()))
{
    var name = UO.GListPosName(i);
    var graphic = UO.GListPosValue(i);
    UO.Print(name + " | graphic: " + Convert.ToString(graphic));
    i = i + 1;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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

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

  • ์ฒ˜๋ฆฌ๋Š” 0๋กœ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. 3๋‹จ๊ณ„๋Š” ์ €์žฅ๋œ ์นด์šดํ„ฐ๋ฅผ 3๋กœ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์•„์ดํ…œ์€ ์—ฌ๊ธฐ๋กœ ์ด๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.GListClear();
    UO.GListSet("processed", 0);
    for (int i = (int)(1); i <= 3; i += (int)(1))
    {
        UO.GListSet("processed", UO.GListGet("processed") + 1);
    }

    UO.Print("Recorded count: " + Convert.ToString(UO.GListGet("processed")));
    return null;
}

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

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

  • ๋ชจ๋“œ โ€” ๋ฌธ์ž์—ด, ์ œํ•œ โ€” ์ˆซ์ž 2. ๋ชจ๋“œ๋Š” ๋ถ„๊ธฐ๋ฅผ ์„ ํƒํ•˜๊ณ  ์ˆซ์ž๋Š” ์ฒ˜๋ฆฌ๋ฅผ ๋‘ ๋‹จ๊ณ„๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
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.GListClear();
        UO.GListSet("mode", "inspect");
        UO.GListSet("limit", 2);
        if (Truth(UO.GListGet("mode") == "inspect"))
        {
            for (int i = (int)(1); i <= UO.GListGet("limit"); i += (int)(1))
            {
                UO.Print("Inspect batch: " + Convert.ToString(i));
            }
        }

        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.GListSet(nameValue, value) โ€” UO.GListSet(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void GListSet(InjectionValue nameValue, InjectionValue value)

        {

            string name = nameValue.ToString();

            int index = globalList.FindIndex(pair => pair.Key.Equals(name, StringComparison.OrdinalIgnoreCase));

            var entry = new KeyValuePair<string, InjectionValue>(name, value);

            if (index >= 0)

                globalList[index] = entry;

            else

                globalList.Add(entry);

        }

UO.GListSize

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

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

int UO.GListSize();

๋น„์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž…์„ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด ์ž„์‹œ ๋ชฉ๋ก์—์„œ ๋ช…๋ช…๋œ ํ•ญ๋ชฉ์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int >= 0 โ€” ์Šคํƒ์— ์žˆ๋Š” ์•„์ดํ…œ์ด๋‚˜ ์œ ๋‹›์˜ ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ๊ณ ์œ ํ•œ ์ด๋ฆ„์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋ชฉ๋ก์€ ๋Ÿฐํƒ€์ž„ ์ธ์Šคํ„ด์Šค์— ์†ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์—๋Š” ์ž์ฒด ๋ชฉ๋ก์ด ์žˆ์Šต๋‹ˆ๋‹ค. GList๋Š” ๊ณต์œ ๋œ ํ”„๋กœํ•„ ๊ฐ„ ์ €์žฅ์†Œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ช…๋ น์€ ํŒŒ์ผ์„ ์“ฐ์ง€ ์•Š์œผ๋ฉฐ ์ €์žฅ๋œ ํ”„๋กœํ•„ ์ƒํƒœ๋กœ ๋“ค์–ด๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ ๋Ÿฐํƒ€์ž„์€ ๋นˆ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋˜ํ•œ var/๋ณ€์ˆ˜ ์„ ์–ธ๋„ ์•„๋‹ˆ๊ณ  UO.SetGlobal๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • ์ƒˆ ์ด๋ฆ„์ด ๋์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ์ด๋ฆ„์„ ๋ฐ˜๋ณตํ•˜๋ฉด ์›๋ž˜ ์œ„์น˜์—์„œ ์ด๋ฆ„์˜ ์˜๋ฏธ์™€ ์ฒ ์ž๊ฐ€ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ์ฝ์–ด๋„ ์•„๋ฌด๊ฒƒ๋„ ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ˆ์ •์ ์ธ ์ƒ‰์ธ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ฒ€์ƒ‰ ๋„์ค‘์— ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ž‘์—…์€ ๋กœ์ปฌ์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ํŒจํ‚ท์ด ์—†๊ณ  ๊ฐœ์ฒด ๊ฒ€์ƒ‰์ด ์—†์œผ๋ฉฐ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค. Set/์ด๋ฆ„์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๋” ํฐ ์„ธํŠธ์˜ ๊ฒฝ์šฐ ์‚ฌ์ „์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์ด ๊ณ„์—ด์—์„œ ํ•˜๋‚˜์˜ ํ‚ค๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•œ ๋ณ„๋„์˜ ๋ช…๋ น์€ ์—†์Šต๋‹ˆ๋‹ค. ์ง€์šฐ๊ธฐ๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์ง€์›๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ๋นˆ ์„ธํŠธ๋Š” ๊ทœ์น™์ด ์ฒ˜๋ฆฌ๋˜๊ธฐ ์ „์— ์ ˆ์ฐจ๋ฅผ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.
UO.GListClear();
if (Truth(UO.GListSize() == 0))
{
    UO.Print("No batch rules; stop here");
    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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

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

  • ๋‘ ๊ทœ์น™์€ ์ธ๋ฑ์Šค 0 ๋ฐ 1์— ๋Œ€ํ•ด ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค. i < Size ์กฐ๊ฑด์€ ์ธ๋ฑ์Šค 2์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.GListClear();
    UO.GListSet("bandage", 0x0E21);
    UO.GListSet("gold", 0x0EED);
    var i = 0;
    while (Truth(i < UO.GListSize()))
    {
        var name = UO.GListPosName(i);
        var graphic = UO.GListPosValue(i);
        UO.Print(name + " | graphic: " + Convert.ToString(graphic));
        i = i + 1;
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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

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

  • ๋Œ€์ฒด BANDAGE๋Š” ์ด๋ฆ„ ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ „ํ›„ ํฌ๊ธฐ๋Š” 2์ž…๋‹ˆ๋‹ค.
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.GListClear();
        UO.GListSet("bandage", 0x0E21);
        UO.GListSet("gold", 0x0EED);
        var before = UO.GListSize();
        UO.GListSet("BANDAGE", 0x0E21);
        if (Truth(UO.GListSize() == before))
        {
            UO.Print("Existing rule updated without an extra entry");
        }

        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.GListSize() โ€” UO.GListSize()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GListSize() => globalList.Count;

UO.GetEasyUO

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

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

string UO.GetEasyUO(object? number);

์‚ฌ์šฉ์ž์˜ Windows ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ EasyUO์—์„œ ๋ฌธ์ž์—ด์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • number - int/NumberConversions.ToInt๋กœ ๋ณ€ํ™˜๋œ ๊ฐ’. 10์ง„์ˆ˜ ์ด๋ฆ„ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๊ฐ’์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string โ€” ๊ฐ’ HKCU\Software\EasyUO<๋ฒˆํ˜ธ>; ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ * ์ด๋ฆ„์ด ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. ํ‚ค/๊ฐ’์ด ๋ˆ„๋ฝ๋˜์—ˆ๊ฑฐ๋‚˜ Windows ์™ธ๋ถ€์— ์žˆ๋Š” ๊ฒฝ์šฐ ๋นˆ ๋ฌธ์ž์—ด์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋…์„œ๋Š” ์—ด์‡ ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๊ฒŒ์ž„ ์„ธ๊ณ„์— ์ ‘๊ทผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ ˆ๊ฑฐ์‹œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค๋Š” GetGlobal์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์•ก์„ธ์Šค ์˜ค๋ฅ˜๊ฐ€ ํผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ฆฟ์ง€์—๋Š” ๋ณ„๋„์˜ ์บ์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

var result = UO.GetEasyUO(1);
UO.Print("GetEasyUO: " + Convert.ToString(result));

1. ํ•ญ๋ชฉ ์ฝ๊ธฐ 1 - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ด๋ฆ„์„ ๋จผ์ € ์ฝ๊ณ (1), ๊ทธ ๋‹ค์Œ *1์„ ์ฝ์Šต๋‹ˆ๋‹ค.
var value = UO.GetEasyUO(1);
UO.Print(value);

2. ๋นˆ ๊ฒฐ๊ณผ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋นˆ ๋ฌธ์ž์—ด์€ ๊ฐ’์ด ์—†๊ฑฐ๋‚˜ ๋นˆ ํ…์ŠคํŠธ๋กœ ์ €์žฅ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetEasyUO(999);
    if (Truth(Len(value) == 0))
    {
        UO.Print("empty");
    }

    return null;
}

int Len(object? value) => Convert.ToString(value)?.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. ์ €์žฅ๋œ ๋ฒˆํ˜ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ˆซ์ž๋Š” ๊ฐœ์ฒด์˜ serial๊ฐ€ ์•„๋‹Œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๊ฐ’์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
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 number = 2;
        var value = UO.GetEasyUO(number);
        UO.Print(value);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetEasyUO(number) โ€” UO.GetEasyUO(Any)

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

public string GetEasyUO(InjectionValue number) => bridge.GetEasyUO(NumberConversions.ToInt(number));

UO.GetGlobal

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

string UO.GetGlobal(object? name);
dynamic UO.GetGlobal(object? globalRegion, object? varName);

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

SetGlobal๊ณผ GetGlobal์€ ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ, ํ”„๋กœํ•„๊ณผ Full Client/Client ํ”„๋กœ์„ธ์Šค์—์„œ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์€ ๋ฌธ์ž์—ด์ด๊ณ  ์—†๋Š” ํ‚ค๋Š” "N/A"์ž…๋‹ˆ๋‹ค. ํ‚ค๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜๋ฉฐ region ํ˜•์‹์€ region/name ์Œ์ž…๋‹ˆ๋‹ค. Manager/Game Manager/CSharp/globals.json์„ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ์ž ๊ธˆ์œผ๋กœ ์ƒˆ๋กœ ์ฝ๊ณ  ์žฌ์‹œ์ž‘ ํ›„์—๋„ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. Shared ํ˜•์‹๋„ ๊ฐ™์€ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค.

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

  • globalRegion โ€” ํ‚ค ์ด๋ฆ„๊ณผ ๊ฒฐํ•ฉํ•˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค.
  • name โ€” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ณต์œ  ํ‚ค ์ด๋ฆ„.
  • varName โ€” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ณต์œ  ํ‚ค ์ด๋ฆ„.

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

์ฑ„ํŒ… ๋ช…๋ น

#getglobal team.target
#get global team.message

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

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

1

string value = UO.GetGlobal("team.target");
UO.Print(value);

2

string value = UO.GetGlobal("team.delay");
if (int.TryParse(value, out int milliseconds))
    UO.Print(milliseconds.ToString());

3

UO.Print(Convert.ToString(UO.GetGlobal("team", "delay")));

4

new CommandSample().Execute(UO);

sealed class CommandSample
{
    public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
    {
        string value = api.GetGlobal("team.target");
        api.Print(value);
    }
}

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

CSharpGameApi.GetGlobal
  -> CSharpScriptGlobals
  -> InjectionScript.Runtime.InjectionApiUO.RegisterClientApiCompatibility
  -> InjectionScript.Runtime.State.Globals.GetGlobal
Globals -> SharedGlobalStore -> named mutex -> atomic JSON replacement


UO.GetProfile

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

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

string UO.GetProfile(object? serial);

ํ”„๋กœํ•„ ์ฐฝ์— ๋Œ€ํ•ด ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ด๋Š” ๊ณต๊ฐœ ๋ฌธ์ž ์„ค๋ช…์„ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์„ ํƒํ•œ ์บ๋ฆญํ„ฐ์˜ ์„ค๋ช…์—์„œ ํ…์ŠคํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ด€๋ฆฌ์ž ํ”„๋กœํ•„ ์„ค์ •์ด ์•„๋‹™๋‹ˆ๋‹ค.

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

  • serial โ€” ์—ฐ์† ๋ฌธ์ž: ์ˆซ์ž, ID 0x๊ฐ€ ํฌํ•จ๋œ ๋ฌธ์ž์—ด... ๋˜๋Š” "self" ๋˜๋Š” "lasttarget"๊ณผ ๊ฐ™์€ ๊ฐœ์ฒด ์„ ํƒ๊ธฐ. ์ด๊ฒƒ์€ ์ฒดํ˜•๋„, ํŒŒ์ผ๋ช…๋„, ๊ด€๋ฆฌ์ž ํ”„๋กœํ•„๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string โ€” ์ œ๋ชฉ๊ณผ ์„œ๋ช…์ด ์—†๋Š” ๊ธฐ๋ณธ ์„ค๋ช… ํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ๋นˆ ์„ค๋ช…์€ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. 3์ดˆ ๋™์•ˆ ์‘๋‹ต์ด ์—†์œผ๋ฉด ๊ณต๋ฐฑ ๊ฒฐ๊ณผ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ true/false๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์š”์ฒญ์ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์„ค๋ช…์ด ์ด๋ฏธ ์„ธ์…˜์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ์—ด๋ ค ์žˆ๋Š” ์ฐฝ์˜ ์ดˆ์•ˆ์„ ํฌํ•จํ•˜์—ฌ ์ฆ‰์‹œ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ƒˆ๋กœ์šด ์„œ๋ฒ„ ์‘๋‹ต์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์„ค๋ช…๊ณผ ์ดˆ์•ˆ์€ ์„ธ์…˜์— ์†ํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์ฐฝ์„ ๋‹ซ์œผ๋ฉด ๊ฒŒ์‹œํ•˜์ง€ ์•Š๊ณ  ์ €์žฅ๋˜๋ฉฐ, ์—ด๋ฉด ํ”„๋กœํ•„ ์ฐฝ์ด ๋ณต์›๋ฉ๋‹ˆ๋‹ค. ์ž์‹ ์˜ ํ”„๋กœํ•„์„ ๋ช…์‹œ์ ์œผ๋กœ ๋‹ซ์œผ๋ฉด ์ˆ˜์ •๋œ ํ…์ŠคํŠธ๊ฐ€ ํ•œ ๋ฒˆ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๋ฌธ์ž๋Š” ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ ์„œ๋ฒ„ ์‘๋‹ต์€ ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ€์ฒดํ•˜๊ณ  ์—ฐ๊ฒฐ์„ ๋Š์œผ๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์ง€์›Œ์ง‘๋‹ˆ๋‹ค. GetProfile ์ž์ฒด๋Š” ์•„๋ฌด๊ฒƒ๋„ ํŽธ์ง‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

var result = UO.GetProfile("self");
UO.Print("GetProfile: " + Convert.ToString(result));

1. ์ง์ ‘ ์‹ ์ฒญ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • "self" - ์บ๋ฆญํ„ฐ์— ๋Œ€ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. ๊ณ„์ • ๊ตฌ์„ฑ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ˆ˜์‹ ๋˜์—ˆ๊ฑฐ๋‚˜ ์ด๋ฏธ ์„ธ์…˜์— ์ €์žฅ๋œ ํ…์ŠคํŠธ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
var note = UO.GetProfile("self");
if (Truth(note != ""))
{
    UO.Print(note);
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. ๊ฒŒ์ž„ ์กฐ๊ฑด - ์‹œ๋‚˜๋ฆฌ์˜ค ๊ธฐ๋Šฅ

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

  • ๊ธฐ์กด lasttarget๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. FindText ์ž์œ  ํ…์ŠคํŠธ์—์„œ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ "Healer"๋ผ๋Š” ๋‹จ์–ด๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์žˆ์œผ๋ฉด AddObject๋Š” ์„ ํƒํ•œ serial๋ฅผ healerNote๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ง์—… ์ฆ๋ช…์ด ์•„๋‹Œ ์‚ฌ์šฉ์ž ๋ฉ”๋ชจ์ž…๋‹ˆ๋‹ค NPC.
return  RunScenario();
 object? RunScenario()
{
    if (!(Truth(UO.Exists("lasttarget"))))
    {
        return null;
    }

    var note = UO.GetProfile("lasttarget");
    if (Truth(FindText(note, "Healer") > 0))
    {
        UO.AddObject("healerNote", "lasttarget");
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
int FindText(object? text, object? value) => (Convert.ToString(text) ?? "").IndexOf(Convert.ToString(value) ?? "", StringComparison.Ordinal) + 1;
int FindText(int start, object? text, object? value)
{
    string input = Convert.ToString(text) ?? "";
    return input.IndexOf(Convert.ToString(value) ?? "", Math.Clamp(start - 1, 0, input.Length), StringComparison.Ordinal) + 1;
}

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

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

  • ์ „์ฒด ๊ธฐ๋Šฅ HasPublicNote์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด์™€ ํ•˜์œ„ ๋ฌธ์ž์—ด์˜ ์กด์žฌ๋ฅผ ํ…Œ์ŠคํŠธํ•˜์—ฌ true/false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. "๊ธธ๋“œ" - ๋ฐ๋ชจ ํ…์ŠคํŠธ; ๋นˆ ์‘๋‹ต์€ ์„œ๋ฒ„์— ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†์Œ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(HasPublicNote("lasttarget", "Guild")))
        {
            UO.AddObject("guildNote", "lasttarget");
        }

        return null;
    }

    dynamic HasPublicNote(dynamic serial, dynamic phrase)
    {
        if (!(Truth(UO.Exists(serial))))
        {
            return false;
        }

        return FindText(UO.GetProfile(serial), phrase) > 0;
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
    int FindText(object? text, object? value) => (Convert.ToString(text) ?? "").IndexOf(Convert.ToString(value) ?? "", StringComparison.Ordinal) + 1;
    int FindText(int start, object? text, object? value)
    {
        string input = Convert.ToString(text) ?? "";
        return input.IndexOf(Convert.ToString(value) ?? "", Math.Clamp(start - 1, 0, input.Length), StringComparison.Ordinal) + 1;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetProfile(serial) โ€” UO.GetProfile(Any)

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

public string GetProfile(InjectionValue serial) => bridge.GetProfile(GetObject(serial));

UO.LoadHotkeys

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

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

void UO.LoadHotkeys();

์ €์žฅ๋œ ๋งคํฌ๋กœ์™€ ๋‹จ์ถ•ํ‚ค๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • LoadHotkeys๋Š” Invoke๋ฅผ ํ†ตํ•ด _world.Macros.Load๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋งคํฌ๋กœ ํ…Œ์ด๋ธ”์€ ๋กœ์ปฌ ํ”„๋กœํ•„ ๋ฐ์ดํ„ฐ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค.
  • ์ง€์ •๋œ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋งŒ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์—๋Š” ์„œ๋ฒ„ ํ™•์ธ์ด ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ์ €์žฅ๋œ ๋งคํฌ๋กœ์™€ ๋‹จ์ถ•ํ‚ค๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
UO.LoadHotkeys();

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

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

  • LoadHotkeys๋Š” Invoke๋ฅผ ํ†ตํ•ด _world.Macros.Load๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋งคํฌ๋กœ ํ…Œ์ด๋ธ”์€ ๋กœ์ปฌ ํ”„๋กœํ•„ ๋ฐ์ดํ„ฐ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.ProfileName());
    UO.LoadHotkeys();
    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.LoadHotkeys();
        UO.Print("Macros loaded");
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.LoadHotkeys() โ€” UO.LoadHotkeys()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "loadhotkeys": bridge.LoadHotkeys(); break;

UO.ProfileName

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

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

dynamic UO.ProfileName();

ํ˜„์žฌ ํ”„๋กœํ•„์˜ ์ด๋ฆ„์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

string โ€” ๋ธŒ๋ฆฌ์ง€ ํ•„๋“œ์˜ ํ…์ŠคํŠธ.ProfileName; ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ๋นˆ ๋ฌธ์ž์—ด์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์—ฐ๊ฒฐ ๊ธฐํ˜ธ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์ˆซ์ž ID๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ExecuteClientApiCompatibility๋Š” ํ”„๋กœํ•„์ด๋‚˜ ์„œ๋ฒ„ ์„ ํƒ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋ธŒ๋ฆฌ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ProfileName.
  • ํ˜„์žฌ ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€, ๋Œ€์ƒ ๋˜๋Š” ์ž๋™ ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ์ƒํƒœ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ํ˜„์žฌ ํ”„๋กœํ•„์˜ ์ด๋ฆ„์„ ์ฝ์Šต๋‹ˆ๋‹ค.
var value = UO.ProfileName();
UO.Print(value);

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

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

  • ExecuteClientApiCompatibility๋Š” ํ”„๋กœํ•„์ด๋‚˜ ์„œ๋ฒ„ ์„ ํƒ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋ธŒ๋ฆฌ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ProfileName.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.ProfileName();
    if (Truth(Len(value) > 0))
    {
        UO.TextPrint(value);
    }

    return null;
}

int Len(object? value) => Convert.ToString(value)?.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. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ํ˜„์žฌ ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€, ๋Œ€์ƒ ๋˜๋Š” ์ž๋™ ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ์ƒํƒœ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
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 before = UO.ProfileName();
        UO.Wait(500);
        var after = UO.ProfileName();
        UO.Print(before = after);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.ProfileName() โ€” UO.ProfileName()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "profilename": return new InjectionValue(bridge.ProfileName);

UO.ProfileShardName

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

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

dynamic UO.ProfileShardName();

์ƒค๋“œ ์ด๋ฆ„์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

string โ€” ๋ธŒ๋ฆฌ์ง€ ํ•„๋“œ์˜ ํ…์ŠคํŠธ.ShardName; ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ๋นˆ ๋ฌธ์ž์—ด์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์—ฐ๊ฒฐ ๊ธฐํ˜ธ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์ˆซ์ž ID๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ExecuteClientApiCompatibility๋Š” ํ”„๋กœํ•„์ด๋‚˜ ์„œ๋ฒ„ ์„ ํƒ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋ธŒ๋ฆฌ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ShardName.
  • ํ˜„์žฌ ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€, ๋Œ€์ƒ ๋˜๋Š” ์ž๋™ ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ์ƒํƒœ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ์ƒค๋“œ ์ด๋ฆ„์„ ์ฝ์Šต๋‹ˆ๋‹ค.
var value = UO.ProfileShardName();
UO.Print(value);

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

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

  • ExecuteClientApiCompatibility๋Š” ํ”„๋กœํ•„์ด๋‚˜ ์„œ๋ฒ„ ์„ ํƒ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋ธŒ๋ฆฌ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ShardName.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.ProfileShardName();
    if (Truth(Len(value) > 0))
    {
        UO.TextPrint(value);
    }

    return null;
}

int Len(object? value) => Convert.ToString(value)?.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. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ํ˜„์žฌ ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€, ๋Œ€์ƒ ๋˜๋Š” ์ž๋™ ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ์ƒํƒœ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
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 before = UO.ProfileShardName();
        UO.Wait(500);
        var after = UO.ProfileShardName();
        UO.Print(before = after);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.ProfileShardName() โ€” UO.ProfileShardName()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "shardname":

                case "profileshardname": return new InjectionValue(bridge.ShardName);

UO.ReqProfile

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

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

void UO.ReqProfile();
void UO.ReqProfile(object? mobile);

์บ๋ฆญํ„ฐ์˜ ์•Œ๋ ค์ง„ ํ”„๋กœํ•„ ํ…์ŠคํŠธ๋ฅผ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค.

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

  • mobile - ์„ ํƒ์‚ฌํ•ญ serial/๋ณ„์นญ. ์ธ์ˆ˜ ์—†์Œ - "lasttarget". ์ด๊ฒƒ์€ ๋กœ์ปฌ ์„ค์ • ํ”„๋กœํ•„ ClassicUO์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ExecuteLegacyManualAlias๊ฐ€ GetProfile์„ ํ˜ธ์ถœํ•œ ๋‹ค์Œ SystemMessage๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. Bridge.GetProfile๋Š” RequestProfile๋ฅผ ๋ณด๋‚ธ ๋‹ค์Œ ์ตœ๋Œ€ 3์ดˆ ๋™์•ˆ CharacterPanels.Profile.CurrentText๋ฅผ ํ™•์ธํ•˜๊ณ  25 ms๋ฅผ ์ผ์‹œ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํ…์ŠคํŠธ๋Š” ์ฆ‰์‹œ ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๊ณ  ๋นˆ ์ค„์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ํ…์ŠคํŠธ๋ฅผ ์ธ์‡„ํ•˜์ง€๋งŒ ๋ฐ˜ํ™˜ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
  • string ๊ฐ’์—๋Š” UO.GetProfile๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ํ…์ŠคํŠธ์˜ ์กด์žฌ๋Š” ์„ฑ๊ณต์ ์ธ ์ด๋ฆ„ ๋ณ€๊ฒฝ์ด๋‚˜ ์บ๋ฆญํ„ฐ ์ƒํƒœ์˜ ์ฆ๊ฑฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ์บ๋ฆญํ„ฐ์˜ ์•Œ๋ ค์ง„ ํ”„๋กœํ•„ ํ…์ŠคํŠธ๋ฅผ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค.
UO.ReqProfile();

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

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

  • ExecuteLegacyManualAlias๊ฐ€ GetProfile์„ ํ˜ธ์ถœํ•œ ๋‹ค์Œ SystemMessage๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. Bridge.GetProfile๋Š” RequestProfile๋ฅผ ๋ณด๋‚ธ ๋‹ค์Œ ์ตœ๋Œ€ 3์ดˆ ๋™์•ˆ CharacterPanels.Profile.CurrentText๋ฅผ ํ™•์ธํ•˜๊ณ  25 ms๋ฅผ ์ผ์‹œ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํ…์ŠคํŠธ๋Š” ์ฆ‰์‹œ ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๊ณ  ๋นˆ ์ค„์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ํ…์ŠคํŠธ๋ฅผ ์ธ์‡„ํ•˜์ง€๋งŒ ๋ฐ˜ํ™˜ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.ReqProfile("self");
    return null;
}

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

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

  • string ๊ฐ’์—๋Š” UO.GetProfile๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ํ…์ŠคํŠธ์˜ ์กด์žฌ๋Š” ์„ฑ๊ณต์ ์ธ ์ด๋ฆ„ ๋ณ€๊ฒฝ์ด๋‚˜ ์บ๋ฆญํ„ฐ ์ƒํƒœ์˜ ์ฆ๊ฑฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
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.GetSerial("lasttarget");
        if (Truth(UO.Exists(id)))
        {
            UO.ReqProfile(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.ReqProfile() โ€” UO.ReqProfile()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "reqprofile":

                    SystemMessage(GetProfile(arguments.Length > 0 ? arguments[0] : new InjectionValue("lasttarget")));

                    break;

UO.ReqProfile(mobile) โ€” UO.ReqProfile(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "reqprofile":

                    SystemMessage(GetProfile(arguments.Length > 0 ? arguments[0] : new InjectionValue("lasttarget")));

                    break;

UO.ResetProfile

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

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

void UO.ResetProfile();

ํ™œ์„ฑ ํ”„๋กœํ•„์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ResetProfile๊ฐ€ ProfileManager.ResetCurrentProfileToDefault๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑ ํ”„๋กœํ•„์ด ์—†์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๋ฏ€๋กœ ์ €์žฅ๋œ ์‚ฌ์šฉ์ž ๊ฐ’์ด ์†์‹ค๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ง€์ •๋œ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋งŒ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์—๋Š” ์„œ๋ฒ„ ํ™•์ธ์ด ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ํ™œ์„ฑ ํ”„๋กœํ•„์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
UO.ResetProfile();

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

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

  • ResetProfile๊ฐ€ ProfileManager.ResetCurrentProfileToDefault๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑ ํ”„๋กœํ•„์ด ์—†์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๋ฏ€๋กœ ์ €์žฅ๋œ ์‚ฌ์šฉ์ž ๊ฐ’์ด ์†์‹ค๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.ProfileName());
    UO.ResetProfile();
    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.ResetProfile();
        UO.SaveConfig();
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.ResetProfile() โ€” UO.ResetProfile()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "resetprofile": bridge.ResetProfile(); break;

UO.SaveConfig

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

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

void UO.SaveConfig();

ํ˜„์žฌ ClassicUO ํ”„๋กœํ•„์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • ํ˜„์žฌ ClassicUO ํ”„๋กœํ•„์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
UO.SaveConfig();

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

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

  • SaveConfig๋Š” Invoke๋ฅผ ํ†ตํ•ด ProfileManager.SaveCurrentProfile๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๋กœ์ปฌ ํ”„๋กœํ•„ ์„ค์ •์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๊ฒฝ๋กœ๋Š” ProfileManager์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.ProfileName());
    UO.SaveConfig();
    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.SaveConfig();
        UO.Print(UO.ShardPath());
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.SaveConfig() โ€” UO.SaveConfig()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void SaveConfig() => bridge.SaveConfig();

UO.SaveHotkeys

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

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

void UO.SaveHotkeys();

๋งคํฌ๋กœ์™€ ๋‹จ์ถ•ํ‚ค๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • SaveHotkeys๋Š” Invoke๋ฅผ ํ†ตํ•ด _world.Macros.Save๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ํ”„๋กœํ•„์˜ ๋กœ์ปฌ ๋งคํฌ๋กœ ํ…Œ์ด๋ธ”์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ์ง€์ •๋œ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋งŒ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์—๋Š” ์„œ๋ฒ„ ํ™•์ธ์ด ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ๋งคํฌ๋กœ์™€ ๋‹จ์ถ•ํ‚ค๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
UO.SaveHotkeys();

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

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

  • SaveHotkeys๋Š” Invoke๋ฅผ ํ†ตํ•ด _world.Macros.Save๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ํ”„๋กœํ•„์˜ ๋กœ์ปฌ ๋งคํฌ๋กœ ํ…Œ์ด๋ธ”์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.ProfileName());
    UO.SaveHotkeys();
    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.SaveHotkeys();
        UO.LoadHotkeys();
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.SaveHotkeys() โ€” UO.SaveHotkeys()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "savehotkeys": bridge.SaveHotkeys(); break;

UO.Set

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

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

void UO.Set(object? name, object? value);

์„ธ ๊ฐ€์ง€ ๋ ˆ๊ฑฐ์‹œ ์„ค์ • ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

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

  • name โ€” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ž์—ด: "finddistance", "grabdelay" ๋˜๋Š” "equipfordress". ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„์€ ์ž๋™์œผ๋กœ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.
  • value - int ๋˜๋Š” double/0x-ํ…์ŠคํŠธ. ๋ฌธ์ž์—ด ํ˜•์‹์˜ ๊ฒฝ์šฐ TryStr2Int; ์ž˜๋ชป๋œ ํ…์ŠคํŠธ๋Š” ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ 0๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • finddistance๊ฐ€ ๋ธŒ๋ฆฌ์ง€๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.SetFindDistance, Grabdelay๊ฐ€ ๋ธŒ๋ฆฌ์ง€๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.SetGrabDelay, ์žฅ๋น„fordress๊ฐ€ ์ƒํƒœ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.UseEquipForDress. ์ด๋Š” ์„ธ ๊ฐ€์ง€ ๊ฐœ๋ณ„ ์„ค์ •์ž…๋‹ˆ๋‹ค. ์ž„์˜์˜ ์†์„ฑ์— ๋Œ€ํ•œ ๋ฒ”์šฉ ์„ค์ •์ž๋Š” ์—†์Šต๋‹ˆ๋‹ค.
  • ๋ฌธ์ž์—ด ๊ฐ’์€ ๋จผ์ € fallback=0๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ TryStr2Int๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ธ์‹๋œ ์„ค์ •์— ์˜คํƒ€๋กœ ์ธํ•ด 0๊ฐ€ ๊ธฐ๋ก๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Set ์ž์‹ ์€ ๋ฌผ๊ฑด์„ ์ฐพ์ง€ ์•Š์œผ๋ฉฐ, ์˜ท๋„ ๊ฐˆ์•„์ž…์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.Set");
UO.Set("finddistance", 10);

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

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

  • ์„ธ ๊ฐ€์ง€ ๋ ˆ๊ฑฐ์‹œ ์„ค์ • ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
UO.Set("finddistance", 10);

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

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

  • finddistance๊ฐ€ ๋ธŒ๋ฆฌ์ง€๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.SetFindDistance, Grabdelay๊ฐ€ ๋ธŒ๋ฆฌ์ง€๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.SetGrabDelay, ์žฅ๋น„fordress๊ฐ€ ์ƒํƒœ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.UseEquipForDress. ์ด๋Š” ์„ธ ๊ฐ€์ง€ ๊ฐœ๋ณ„ ์„ค์ •์ž…๋‹ˆ๋‹ค. ์ž„์˜์˜ ์†์„ฑ์— ๋Œ€ํ•œ ๋ฒ”์šฉ ์„ค์ •์ž๋Š” ์—†์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Set("grabdelay", "250");
    return null;
}

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

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

  • ๋ฌธ์ž์—ด ๊ฐ’์€ ๋จผ์ € fallback=0๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ TryStr2Int๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ธ์‹๋œ ์„ค์ •์— ์˜คํƒ€๋กœ ์ธํ•ด 0๊ฐ€ ๊ธฐ๋ก๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Set ์ž์‹ ์€ ๋ฌผ๊ฑด์„ ์ฐพ์ง€ ์•Š์œผ๋ฉฐ, ์˜ท๋„ ๊ฐˆ์•„์ž…์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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.Set("equipfordress", 1);
        UO.Print(UO.FindDistance());
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.Set(name, value) โ€” UO.Set(String,Integer)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void Set(string name, int value)

        {

            if (name.Equals("finddistance", StringComparison.OrdinalIgnoreCase))

            {

                bridge.SetFindDistance(value);

            }

            else if (name.Equals("grabdelay", StringComparison.OrdinalIgnoreCase))

            {

                bridge.SetGrabDelay(value);

            }

            else if (name.Equals("equipfordress", StringComparison.OrdinalIgnoreCase))

            {

                state.UseEquipForDress = value;

            }

        }

UO.Set(name, value) โ€” UO.Set(String,String)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void Set(string name, string valueStr)

        {

            int valueInt = NumberConversions.TryStr2Int(valueStr, out var value) ? value : 0;

            Set(name, valueInt);

        }

UO.SetDefault

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

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

void UO.SetDefault(object? name, object? @object);

๋Ÿฐํƒ€์ž„ ์ƒํƒœ์— ๋ช…๋ช…๋œ ๋ณ„์นญ serial์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

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

  • name โ€” ๋ณ„์นญ์„ ํ…์ŠคํŠธ๋กœ ์ง€์ •ํ•˜๊ณ  ์‚ฌ๋ก€๋Š” ๊ฐœ์ฒด ์‚ฌ์ „์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • object โ€” Arg/GetObject์„ ํ†ตํ•œ ์ง๋ ฌ/๋ณ„์นญ. ์ด๋ฆ„๊ณผ serial ์ˆœ์„œ๋Œ€๋กœ ์ž…๋ ฅํ•˜์„ธ์š”.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ExecuteLegacyManualAlias๋Š” state.Objects.Set(Text(0),Arg(1))๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋Œ€ํ™”์‹ ์„ ํƒ์€ ์—†์Šต๋‹ˆ๋‹ค. serial์˜ ์กด์žฌ๋Š” ํ™•์ธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” ํ”„๋กœํ•„์„ ์žฌ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ๋ชจ๋“  ์„ค์ •์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐœ์ฒด ์ด๋ฆ„์„ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ›„์† ํ˜ธ์ถœ์—์„œ๋Š” ๋ณ„์นญ์ด ๋‹ค์‹œ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.SetDefault");
UO.SetDefault("manualObject", UO.Self());

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

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

  • ๋Ÿฐํƒ€์ž„ ์ƒํƒœ์— ๋ช…๋ช…๋œ ๋ณ„์นญ serial์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
UO.SetDefault("manualObject", UO.Self());

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

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

  • ExecuteLegacyManualAlias๋Š” state.Objects.Set(Text(0),Arg(1))๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋Œ€ํ™”์‹ ์„ ํƒ์€ ์—†์Šต๋‹ˆ๋‹ค. serial์˜ ์กด์žฌ๋Š” ํ™•์ธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.SetDefault("manualBag", UO.Backpack());
    UO.Print(UO.GetSerial("manualBag"));
    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 id = UO.GetSerial("lasttarget");
        if (Truth(UO.Exists(id)))
        {
            UO.SetDefault("manualTarget", id);
            UO.Print(UO.GetName("manualTarget"));
        }

        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.SetDefault(name, object) โ€” UO.SetDefault(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "setdefault":

                    if (arguments.Length > 1) state.Objects.Set(Text(0), Arg(1));

                    break;

UO.SetEasyUO

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

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

void UO.SetEasyUO(object? number, object? value);

Windows ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ EasyUO์— ๋ฌธ์ž์—ด ๊ฐ’์„ ์”๋‹ˆ๋‹ค.

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

  • number โ€” int ๊ฐ’ ๋ฒˆํ˜ธ, *-์ ‘๋‘์‚ฌ ์—†์ด double ํ˜•์‹.
  • value โ€” ToString์„ ํ†ตํ•œ ํ…์ŠคํŠธ; ์ „์†ก๋œ ์ƒํƒœ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • Windows์—์„œ๋Š” ์“ฐ๊ธฐ ๊ถŒํ•œ SetValue(decimalNumber,value,RegistryValueKind.string)์ด ์žˆ๋Š” HKCU\Software\EasyUO๋ฅผ ์—ด๊ฑฐ๋‚˜ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ OS์—์„œ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ๊ธฐ๋กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” ํ˜„์žฌ ์‚ฌ์šฉ์ž ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ์™ธ๋ถ€ ์˜๊ตฌ ํ•ญ๋ชฉ์ด๋ฉฐ, ๋ฒ”์œ„๊ฐ€ ์ง€์ •๋œ ์ „์—ญ ๋Ÿฐํƒ€์ž„์ด ์•„๋‹ˆ๋ฉฐ ๊ฒŒ์ž„ serial๋„ ์•„๋‹™๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์•ก์„ธ์Šค ์˜ค๋ฅ˜๋ฅผ ์ˆจ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.SetEasyUO");
UO.SetEasyUO(9001, "manual-example");

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

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

  • Windows ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ EasyUO์— ๋ฌธ์ž์—ด ๊ฐ’์„ ์”๋‹ˆ๋‹ค.
UO.SetEasyUO(9001, "manual-example");

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

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

  • Windows์—์„œ๋Š” ์“ฐ๊ธฐ ๊ถŒํ•œ SetValue(decimalNumber,value,RegistryValueKind.String)์ด ์žˆ๋Š” HKCU\Software\EasyUO๋ฅผ ์—ด๊ฑฐ๋‚˜ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ OS์—์„œ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ๊ธฐ๋กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.SetEasyUO(9001, "");
    return null;
}

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

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

  • ์ด๋Š” ํ˜„์žฌ ์‚ฌ์šฉ์ž ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ์™ธ๋ถ€ ์˜๊ตฌ ํ•ญ๋ชฉ์ด๋ฉฐ, ๋ฒ”์œ„๊ฐ€ ์ง€์ •๋œ ์ „์—ญ ๋Ÿฐํƒ€์ž„์ด ์•„๋‹ˆ๋ฉฐ ๊ฒŒ์ž„ serial๋„ ์•„๋‹™๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์•ก์„ธ์Šค ์˜ค๋ฅ˜๋ฅผ ์ˆจ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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.SetEasyUO(9001, "manual-example");
        UO.Print(UO.GetEasyUO(9001));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.SetEasyUO(number, value) โ€” UO.SetEasyUO(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void SetEasyUO(InjectionValue number, InjectionValue value)

            => bridge.SetEasyUO(NumberConversions.ToInt(number), value.ToString());

UO.SetGlobal

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

void UO.SetGlobal(object? name, object? value);
void UO.SetGlobal(object? globalRegion, object? varName, object? varValue);

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

SetGlobal๊ณผ GetGlobal์€ ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ, ํ”„๋กœํ•„๊ณผ Full Client/Client ํ”„๋กœ์„ธ์Šค์—์„œ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์€ ๋ฌธ์ž์—ด์ด๊ณ  ์—†๋Š” ํ‚ค๋Š” "N/A"์ž…๋‹ˆ๋‹ค. ํ‚ค๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜๋ฉฐ region ํ˜•์‹์€ region/name ์Œ์ž…๋‹ˆ๋‹ค. Manager/Game Manager/CSharp/globals.json์„ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ์ž ๊ธˆ์œผ๋กœ ์ƒˆ๋กœ ์ฝ๊ณ  ์žฌ์‹œ์ž‘ ํ›„์—๋„ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. Shared ํ˜•์‹๋„ ๊ฐ™์€ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค.

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

  • globalRegion โ€” ํ‚ค ์ด๋ฆ„๊ณผ ๊ฒฐํ•ฉํ•˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค.
  • name โ€” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ณต์œ  ํ‚ค ์ด๋ฆ„.
  • value โ€” ํ…์ŠคํŠธ๋กœ ์ €์žฅ๋˜๋Š” ๊ฐ’.
  • varName โ€” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ณต์œ  ํ‚ค ์ด๋ฆ„.
  • varValue โ€” ํ…์ŠคํŠธ๋กœ ์ €์žฅ๋˜๋Š” ๊ฐ’.

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

์ฑ„ํŒ… ๋ช…๋ น

#setglobal team.target 0x40001234
#set global team.message ะŸั€ะธะฒั–ั‚ ัƒัั–ะผ

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

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

1

UO.SetGlobal("team.target", 0x40001234);
UO.Print(UO.GetGlobal("team.target"));

2

UO.SetGlobal("team.message", "ะŸั€ะธะฒั–ั‚");
UO.Print(UO.GetGlobal("team.message"));

3

UO.SetGlobal("team", "delay", "350");
UO.Print(Convert.ToString(UO.GetGlobal("team", "delay")));

4

new CommandSample().Execute(UO);

sealed class CommandSample
{
    public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
    {
        api.SetGlobal("team.target", 0x40001234);
        api.Print(api.GetGlobal("team.target"));
    }
}

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

CSharpGameApi.SetGlobal
  -> CSharpScriptGlobals
  -> InjectionScript.Runtime.InjectionApiUO.RegisterClientApiCompatibility
  -> InjectionScript.Runtime.State.Globals.SetGlobal
Globals -> SharedGlobalStore -> named mutex -> atomic JSON replacement


UO.SetMulPath

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

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

void UO.SetMulPath(object? pathValue);

๋Ÿฐํƒ€์ž„์— ๊ฒฝ๋กœ ๋ฌธ์ž์—ด mulPath์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

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

  • pathValue โ€” ToString์„ ํ†ตํ•œ ํ…์ŠคํŠธ; ์ „์†ก๋œ ์ƒํƒœ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • mulPath = ToString ๋˜๋Š” ๋นˆ ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์ด ์—ด๋ฆฌ์ง€ ์•Š๊ณ  ์ง€๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค์‹œ ๋กœ๋“œ๋˜์ง€ ์•Š์œผ๋ฉฐ ์ด ๊ธฐ๋Šฅ์œผ๋กœ ๊ฒฝ๋กœ ๊ฐ€์šฉ์„ฑ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” ํ˜„์žฌ ๋Ÿฐํƒ€์ž„์˜ ํ˜ธํ™˜์„ฑ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๋น„๊ณต๊ฐœ mulPath/showZ์—๋Š” ์†Œ๋น„์ž๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ž์‚ฐ์„ ๋‹ค์‹œ ๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ๋†’์ด ํ‘œ์‹œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.SetMulPath");
UO.SetMulPath("C:\\Ultima Online");

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

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

  • ๋Ÿฐํƒ€์ž„์— ๊ฒฝ๋กœ ๋ฌธ์ž์—ด mulPath์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
UO.SetMulPath("C:\\Ultima Online");

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

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

  • mulPath = ToString ๋˜๋Š” ๋นˆ ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์ด ์—ด๋ฆฌ์ง€ ์•Š๊ณ  ์ง€๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค์‹œ ๋กœ๋“œ๋˜์ง€ ์•Š์œผ๋ฉฐ ์ด ๊ธฐ๋Šฅ์œผ๋กœ ๊ฒฝ๋กœ ๊ฐ€์šฉ์„ฑ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.SetMulPath("");
    return null;
}

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

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

  • ์ด๋Š” ํ˜„์žฌ ๋Ÿฐํƒ€์ž„์˜ ํ˜ธํ™˜์„ฑ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๋น„๊ณต๊ฐœ mulPath/showZ์—๋Š” ์†Œ๋น„์ž๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ž์‚ฐ์„ ๋‹ค์‹œ ๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ๋†’์ด ํ‘œ์‹œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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()
    {
        ApplyValue("C:\\Ultima Online");
        return null;
    }

    void ApplyValue(dynamic value)
    {
        UO.SetMulPath(value);
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.SetMulPath(pathValue) โ€” UO.SetMulPath(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void SetMulPath(InjectionValue pathValue) => mulPath = pathValue.ToString() ?? string.Empty;
โš ๏ธ **GitHub.com Fallback** โš ๏ธ