KO UO Topic menus context menus - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

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

๋ฉ”๋‰ด ๋ฐ ์ƒํ™ฉ์— ๋งž๋Š” ๋ฉ”๋‰ด

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

์ด์ „ ๋ฉ”๋‰ด, ์ƒํ™ฉ์— ๋งž๋Š” ๋ฉ”๋‰ด ๋ฐ ํ…์ŠคํŠธ ์ž…๋ ฅ. ์ด๋Š” ๋ณ„๋„์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๋ฉ”๋‰ด์˜ ๋‹ต๋ณ€์—์„œ ํ•ญ๋ชฉ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์„น์…˜

์ฃผ์ œ ๋ช…๋ น ๋ฐ ์„ค๋ช…
AutoMenu UO.AutoMenu
WaitMenu UO.WaitMenu
Menu Hooks UO.MenuHookPresent ยท UO.CancelAllMenuHooks
๋ฉ”๋‰ด ํ•ญ๋ชฉ UO.GetMenuItems ยท UO.GetMenuItemsEx ยท UO.GetLastMenuItems
CancelMenu UO.CancelMenu
Context Menu UO.GetContextMenu ยท UO.ClearContextMenu
RequestContextMenu UO.RequestContextMenu
Context Menu Hooks UO.SetContextMenuHook

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

๋ฉ”๋‰ด

UO.AutoMenu ยท UO.WaitMenu ยท UO.GetMenuItems ยท UO.GetMenuItemsEx ยท UO.GetLastMenuItems ยท UO.MenuHookPresent ยท UO.MenuPresent ยท UO.CancelAllMenuHooks ยท UO.CancelMenu ยท UO.CloseMenu ยท UO.WaitingForMenu ยท UO.WaitingMenu

์ƒํ™ฉ์— ๋งž๋Š” ๋ฉ”๋‰ด

UO.GetContextMenu ยท UO.RequestContextMenu ยท UO.SetContextMenuHook ยท UO.ClearContextMenu

ํ…์ŠคํŠธ ์ž…๋ ฅ

UO.WaitTextEntry ยท UO.ConsoleEntryReply ยท UO.ConsoleEntryUnicodeReply

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

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

UO.RequestContextMenu

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

var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
    UO.RequestContextMenu(id);
}

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

UO.WaitMenu

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

UO.WaitMenu("Craft", "Tools");

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


UO.AutoMenu

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

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

void UO.AutoMenu(object? prompt, object? choice);

์˜๊ตฌ ๋ฉ”๋‰ด ํ›„ํฌ ๋“ฑ๋ก: ์ ์ ˆํ•œ ์บก์…˜์ด ์žˆ๋Š” ์„œ๋ฒ„ ๋ฉ”๋‰ด๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ์ ์ ˆํ•œ ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ์€ ๋ฉ”๋‰ด๋ฅผ ์—ด์ง€ ์•Š์œผ๋ฉฐ ๋™๊ธฐ์ ์œผ๋กœ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

  • prompt โ€” ์„œ๋ฒ„ ๋ฉ”๋‰ด ์ œ๋ชฉ์˜ ํ•˜์œ„ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
  • choice โ€” ๋ฉ”๋‰ด ํ•ญ๋ชฉ ์„œ๋ช…์˜ ํ•˜์œ„ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void. ํ˜ธ์ถœ์€ ํ›„ํฌ๋ฅผ ๋“ฑ๋กํ•  ๋ฟ์ด๋ฉฐ ๋ฉ”๋‰ด๋ฅผ ์ฐพ์•˜๋Š”์ง€ ๋˜๋Š” ํ•ญ๋ชฉ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์„ ํƒ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ๋ณด๊ณ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค ํ›„ํฌ๋Š” ์•„์ง ๋‹ซํžˆ์ง€ ์•Š์•˜์œผ๋ฉฐ ์ œ๋ชฉ์— prompt์ด ํฌํ•จ๋œ ์„œ๋ฒ„ ๋ฉ”๋‰ด๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์„œ๋ช…์— choice์ด ํฌํ•จ๋œ ํ•ญ๋ชฉ์ด ๋ฐœ๊ฒฌ๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ํ•ด๋‹น ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ํ›„ํฌ๋Š” ์„ ํƒ ํ›„์—๋„ ๋“ฑ๋ก๋œ ์ƒํƒœ๋กœ ์œ ์ง€๋˜๋ฏ€๋กœ ํ›„์† ์ผ์น˜ ๋ฉ”๋‰ด์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. UO.CancelMenu()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ›„ํฌ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.AutoMenu");
UO.AutoMenu("Choose material", "Copper");

1. "์žฌ๋ฃŒ ์„ ํƒ"์ด๋ผ๋Š” ์ œ๋ชฉ์˜ ๋ฉ”๋‰ด๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ "๊ตฌ๋ฆฌ"๋ผ๋Š” ํ…์ŠคํŠธ๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • "์žฌ๋ฃŒ ์„ ํƒ"์ด๋ผ๋Š” ์ œ๋ชฉ์˜ ๋ฉ”๋‰ด๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ "๊ตฌ๋ฆฌ"๋ผ๋Š” ํ…์ŠคํŠธ๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
UO.AutoMenu("Choose material", "Copper");

2. ํ•˜์œ„ ๋ฌธ์ž์—ด์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ๋น„๊ต๋ฉ๋‹ˆ๋‹ค. ํ›„ํฌ๋Š” ํ›„์† ์ผ์น˜ ๋ฉ”๋‰ด์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ํ•˜์œ„ ๋ฌธ์ž์—ด์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ๋น„๊ต๋ฉ๋‹ˆ๋‹ค. ํ›„ํฌ๋Š” ํ›„์† ์ผ์น˜ ๋ฉ”๋‰ด์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var menuCaption = "choose color";
    var itemCaption = "blue";
    UO.AutoMenu(menuCaption, itemCaption);
    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.AutoMenu("Choose material", "Iron");
        UO.CancelMenu();
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.AutoMenu(prompt, choice) โ€” UO.AutoMenu(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "automenu":

                    if (arguments.Length >= 2) bridge.AddMenuHook(arguments[0].ToString(), arguments[1].ToString(), true);

                    break;

UO.CancelAllMenuHooks

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

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

void UO.CancelAllMenuHooks();

์ด์ „ ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„ ๋ฉ”๋‰ด์—์„œ ๋“ฑ๋ก๋œ ๋ชจ๋“  ์ž๋™ ํ›„ํฌ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ClearMenuHooks ๊ด€๋ฆฌ์ž์—๊ฒŒ ์ „ํ™”๋ฅผ ๊ฒ๋‹ˆ๋‹ค. AutoMenu ๋ฐ WaitMenu๋ฅผ ํฌํ•จํ•œ ๋‹จ์ผ ๋ฐ ์˜๊ตฌ ์„ ํƒ ๊ทœ์น™์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ด๋ฏธ ์—ด๋ ค ์žˆ๋Š” ๋ฉ”๋‰ด๋ฅผ ๋‹ซ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. CloseMenu๊ฐ€ ์ด๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ๋ชจ๋“  ํ›„ํฌ ์ œ๊ฑฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ œ๊ฑฐ๋Š” ์ „์ฒด ํด๋ผ์ด์–ธํŠธ ๋ฉ”๋‰ด ํ›„ํฌ ์„ธํŠธ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
UO.CancelAllMenuHooks();

2. ์ž‘์—… ์ œํ•œ AutoMenu - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ํ›„ํฌ๋Š” ์ฆ‰์‹œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ๋ฏธ๋ž˜์— ์ผ์น˜ํ•˜๋Š” ๋ฉ”๋‰ด๋Š” ๋” ์ด์ƒ ์ž๋™์œผ๋กœ ์„ ํƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.AutoMenu("Choose material", "Iron");
    UO.CancelAllMenuHooks();
    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.CancelAllMenuHooks();
        UO.CloseMenu();
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.CancelAllMenuHooks() โ€” UO.CancelAllMenuHooks()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "cancelallmenuhooks": bridge.ClearMenuHooks(); return InjectionValue.Unit;

UO.CancelMenu

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

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

void UO.CancelMenu();

์ด์ „ ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„ ๋ฉ”๋‰ด์—์„œ ๋“ฑ๋ก๋œ ๋ชจ๋“  ์ž๋™ ํ›„ํฌ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ClearMenuHooks ๊ด€๋ฆฌ์ž์—๊ฒŒ ์ „ํ™”๋ฅผ ๊ฒ๋‹ˆ๋‹ค. AutoMenu ๋ฐ WaitMenu๋ฅผ ํฌํ•จํ•œ ๋‹จ์ผ ๋ฐ ์˜๊ตฌ ์„ ํƒ ๊ทœ์น™์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ด๋ฏธ ์—ด๋ ค ์žˆ๋Š” ๋ฉ”๋‰ด๋ฅผ ๋‹ซ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. CloseMenu๊ฐ€ ์ด๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ๋ชจ๋“  ํ›„ํฌ ์ œ๊ฑฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ œ๊ฑฐ๋Š” ์ „์ฒด ํด๋ผ์ด์–ธํŠธ ๋ฉ”๋‰ด ํ›„ํฌ ์„ธํŠธ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
UO.CancelMenu();

2. ์ž‘์—… ์ œํ•œ AutoMenu - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ํ›„ํฌ๋Š” ์ฆ‰์‹œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ๋ฏธ๋ž˜์— ์ผ์น˜ํ•˜๋Š” ๋ฉ”๋‰ด๋Š” ๋” ์ด์ƒ ์ž๋™์œผ๋กœ ์„ ํƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.AutoMenu("Choose material", "Iron");
    UO.CancelMenu();
    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.CancelMenu();
        UO.CloseMenu();
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.CancelMenu() โ€” UO.CancelMenu()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "cancelmenu": bridge.ClearMenuHooks(); break;

UO.ClearContextMenu

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

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

void UO.ClearContextMenu();

ํ˜„์žฌ ๋กœ์ปฌ ์ƒํ™ฉ์— ๋งž๋Š” ๋ฉ”๋‰ด ๋ชจ๋ธ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ๋ชจ๋ธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ServerMenus.Context์—์„œ Dispose๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์š”์ฒญ ํ›„์— ์ƒˆ ์„œ๋ฒ„ ๋ฉ”๋‰ด๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ CloseMenu์ด ์•„๋‹™๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ƒํƒœ ์ง€์šฐ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ํ˜„์žฌ ๋กœ์ปฌ ์ƒํ™ฉ์— ๋งž๋Š” ๋ฉ”๋‰ด ๋ชจ๋ธ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
UO.ClearContextMenu();

2. ์„ค์ • ํ›„ ์ง€์šฐ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์Šค๋ƒ…์ƒท์„ ์ฝ์€ ํ›„ ๋กœ์ปฌ ์ปจํ…์ŠคํŠธ ๋ฉ”๋‰ด๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var entries = UO.GetContextMenu();
    UO.ClearContextMenu();
    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.ClearContextMenu();
        UO.ClearContextMenu();
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.ClearContextMenu() โ€” UO.ClearContextMenu()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "clearcontextmenu": bridge.ClearContextMenu(); return InjectionValue.Unit;

UO.CloseMenu

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

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

void UO.CloseMenu();

CancelForYoko๋ฅผ ํ†ตํ•ด ํ™œ์„ฑํ™”๋œ ๋ชจ๋“  ์ด์ „ ์„œ๋ฒ„ ๋ฉ”๋‰ด๋ฅผ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ์Šค๋ƒ…์ƒท ServerMenus์„ ๋ฐ˜๋ณตํ•˜๊ณ  ๊ฐ ๋ชจ๋ธ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์ž๋™ ๋ฉ”๋‰ด ํ›„ํฌ๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ž„์˜์˜ ๊ฒ€ํ”„/์ธํ„ฐํŽ˜์ด์Šค ์ฐฝ์„ ๋‹ซ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์—ด๋ ค ์žˆ๋Š” ๋ฉ”๋‰ด ์ทจ์†Œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ทจ์†Œ๋Š” ๊ธฐ์กด MenuGump/์„œ๋ฒ„ ๋ฉ”๋‰ด์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
UO.CloseMenu();

2. ํ›„ํฌ ์ œ๊ฑฐ ๋ฐ ๋ฉ”๋‰ด ์ทจ์†Œ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ž๋™ ์„ ํƒ๊ณผ ๋ฉ”๋‰ด ์—ด๊ธฐ๋Š” ๋ณ„๋„์˜ ๋ช…๋ น์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.CancelAllMenuHooks();
    UO.CloseMenu();
    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 items = UO.GetLastMenuItems();
        UO.Print(Convert.ToString(ArrayLength(items)));
        UO.CloseMenu();
        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.CloseMenu() โ€” UO.CloseMenu()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "closemenu": bridge.CloseMenu(); return InjectionValue.Unit;

UO.ConsoleEntryReply

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

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

void UO.ConsoleEntryReply(object? text);

MessageManager.SendServerPromptResponse๋ฅผ ํ†ตํ•ด ํ™œ์„ฑ ์„œ๋ฒ„ ํ”„๋กฌํ”„ํŠธ์— ํ…์ŠคํŠธ๋กœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

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

  • text โ€” ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•  ๊ฐ’์ž…๋‹ˆ๋‹ค. ๋นˆ ๋ฌธ์ž์—ด์ด ๋นˆ ์‘๋‹ต์œผ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ๋‘ ํŒ€ ๋ชจ๋‘ ReplyServerPrompt๋กœ ํ–ฅํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ์œ ํ˜• ASCII/์œ ๋‹ˆ์ฝ”๋“œ๋Š” ์ €์žฅ๋œ ์„œ๋ฒ„ ํ”„๋กฌํ”„ํŠธ ์ƒํƒœ์— ๋”ฐ๋ผ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ๋ช…๋ น ์ด๋ฆ„์€ ๋ณ„๋„์˜ ์ธ์ฝ”๋”ฉ์„ ๊ฐ•์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ™œ์„ฑ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ์—†์œผ๋ฉด ๊ด€๋ฆฌ์ž๋Š” ์‘๋‹ต์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.ConsoleEntryReply");
UO.ConsoleEntryReply("reply");

1. ํ”„๋กฌํ”„ํŠธ์— ์‘๋‹ต - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ „์†ก์€ ํ˜„์žฌ ์„œ๋ฒ„ ์ž…๋ ฅ ์š”์ฒญ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
UO.ConsoleEntryReply("reply");

2. ๋นˆ ์‘๋‹ต - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋นˆ ํ…์ŠคํŠธ๋Š” ๋นˆ ์‘๋‹ต์œผ๋กœ ๊ด€๋ฆฌ์ž์—๊ฒŒ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.ConsoleEntryReply("");
    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 reply = "New item name";
        UO.ConsoleEntryReply(reply);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.ConsoleEntryReply(text) โ€” UO.ConsoleEntryReply(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "consoleentryreply":

                case "consoleentryunicodereply": bridge.ReplyServerPrompt(Text(0)); return InjectionValue.Unit;

UO.ConsoleEntryUnicodeReply

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

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

void UO.ConsoleEntryUnicodeReply(object? text);

MessageManager.SendServerPromptResponse๋ฅผ ํ†ตํ•ด ํ™œ์„ฑ ์„œ๋ฒ„ ํ”„๋กฌํ”„ํŠธ์— ํ…์ŠคํŠธ๋กœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

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

  • text โ€” ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•  ๊ฐ’์ž…๋‹ˆ๋‹ค. ๋นˆ ๋ฌธ์ž์—ด์ด ๋นˆ ์‘๋‹ต์œผ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ๋‘ ํŒ€ ๋ชจ๋‘ ReplyServerPrompt๋กœ ํ–ฅํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ์œ ํ˜• ASCII/์œ ๋‹ˆ์ฝ”๋“œ๋Š” ์ €์žฅ๋œ ์„œ๋ฒ„ ํ”„๋กฌํ”„ํŠธ ์ƒํƒœ์— ๋”ฐ๋ผ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ๋ช…๋ น ์ด๋ฆ„์€ ๋ณ„๋„์˜ ์ธ์ฝ”๋”ฉ์„ ๊ฐ•์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ™œ์„ฑ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ์—†์œผ๋ฉด ๊ด€๋ฆฌ์ž๋Š” ์‘๋‹ต์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.ConsoleEntryUnicodeReply");
UO.ConsoleEntryUnicodeReply("reply");

1. ํ”„๋กฌํ”„ํŠธ์— ์‘๋‹ต - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ „์†ก์€ ํ˜„์žฌ ์„œ๋ฒ„ ์ž…๋ ฅ ์š”์ฒญ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
UO.ConsoleEntryUnicodeReply("reply");

2. ๋นˆ ์‘๋‹ต - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋นˆ ํ…์ŠคํŠธ๋Š” ๋นˆ ์‘๋‹ต์œผ๋กœ ๊ด€๋ฆฌ์ž์—๊ฒŒ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.ConsoleEntryUnicodeReply("");
    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 reply = "New item name";
        UO.ConsoleEntryUnicodeReply(reply);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.ConsoleEntryUnicodeReply(text) โ€” UO.ConsoleEntryUnicodeReply(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "consoleentryreply":

                case "consoleentryunicodereply": bridge.ReplyServerPrompt(Text(0)); return InjectionValue.Unit;

UO.GetContextMenu

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

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

dynamic UO.GetContextMenu();

ํ˜„์žฌ ์ƒํ™ฉ์— ๋งž๋Š” ๋ฉ”๋‰ด ๋ชจ๋ธ์˜ ํ•ญ๋ชฉ ๋ฌธ์ž์—ด์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

ServerMenus.Context.GetYokoItems()์˜ ๋ฌธ์ž์—ด ๋ฐฐ์—ด; ๋ชจ๋ธ์ด ์—†์œผ๋ฉด ๋นˆ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.

๋™์ž‘

  • RequestContextMenu๋ฅผ ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉฐ ์„œ๋ฒ„ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋ฉ”๋‰ด๋ฅผ ์–ป์œผ๋ ค๋ฉด ๋จผ์ € ๋ณ„๋„๋กœ ์š”์ฒญํ•œ ํ›„ ํ•ด๋‹น ๋ชจ๋ธ์ด ๋‚˜ํƒ€๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์„ธ์š”. ClearContextMenu์€ ์ฝ์€ ํ›„ ๋ชจ๋ธ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ํ˜„์žฌ ๋ฉ”๋‰ด ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๊ธฐ์กด ๋ชจ๋ธ์„ ์ฝ์Šต๋‹ˆ๋‹ค.
var entries = UO.GetContextMenu();
for (int i = (int)(0); i <= ArrayLength(entries)-1; i += (int)(1))
{
    UO.Print(entries[i]);
}

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

2. ์š”์ฒญํ•˜๊ณ  ๋‚˜์ค‘์— ์ฝ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 500 ms - ์„œ๋ฒ„ ์‘๋‹ต์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š” ์ผ์‹œ์ค‘์ง€ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ๋นˆ ๋ฐฐ์—ด์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    UO.RequestContextMenu(UO.Self());
    await Delay(500);
    var entries = UO.GetContextMenu();
    UO.Print(Convert.ToString(ArrayLength(entries)));
    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));

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 entries = UO.GetContextMenu();
        UO.ClearContextMenu();
        UO.Print(Convert.ToString(ArrayLength(entries)));
        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetContextMenu() โ€” UO.GetContextMenu()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getcontextmenu": return StringArray(bridge.GetContextMenu());

UO.GetLastMenuItems

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

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

dynamic UO.GetLastMenuItems();

์ด๋ฏธ ์—ด๋ ค ์žˆ๋Š” ๊ธฐ์กด ์„œ๋ฒ„ ๋ฉ”๋‰ด์˜ ํ•ญ๋ชฉ์„ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

๋ฌธ์ž์—ด ๋ฐฐ์—ด. ํ’ˆ๋ชฉ ์ด๋ฆ„/์„ค๋ช… ์ค„ GetYokoItems. ์ ํ•ฉํ•œ ๋ฉ”๋‰ด๊ฐ€ ์—†์œผ๋ฉด ๋นˆ ๋ฐฐ์—ด์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋งˆ์ง€๋ง‰ ์‚ฌ์ง„ ๋ฉ”๋‰ด ServerMenus๊ฐ€ ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๋ฉ”๋‰ด๋ฅผ ์—ด์ง€ ์•Š๊ณ , ํ›„ํฌ๋ฅผ ๋ฐฐ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ํ•ญ๋ชฉ์„ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ƒํ™ฉ์— ๋งž๋Š” ๋ฉ”๋‰ด๋‚˜ ์ผ๋ฐ˜ ์„œ๋ฒ„ ๊ฒ€ํ”„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ์ˆœ์„œ๋Š” ๋ชจ๋ธ์˜ ํฌ์ธํŠธ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ชฉ๋ก์€ ์Šค๋ƒ…์ƒท์ž…๋‹ˆ๋‹ค. ํ›„์† ๋ฉ”๋‰ด ๋ณ€๊ฒฝ์€ ์ €์žฅ๋œ ๋ฐฐ์—ด์„ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ๋ชจ๋“  ํ•ญ๋ชฉ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋นˆ ๋ฐฐ์—ด์€ ๋ฃจํ”„๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
var items = UO.GetLastMenuItems();
for (int i = (int)(0); i <= ArrayLength(items)-1; i += (int)(1))
{
    UO.Print(items[i]);
}

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

2. ์ฒซ ๋ฒˆ์งธ ํฌ์ธํŠธ๋Š” ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

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

  • ์ธ๋ฑ์Šค 0๋Š” ํฌ๊ธฐ๋ฅผ ํ™•์ธํ•œ ํ›„์—๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var items = UO.GetLastMenuItems();
    if (Truth(ArrayLength(items) > 0))
    {
        UO.Print(items[0]);
    }

    return null;
}

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

3. ๋‹ซ๊ธฐ ์ „์— ์Šค๋ƒ…์ƒท ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์„œ๋ฒ„ ๋ฉ”๋‰ด๋ฅผ ์ทจ์†Œํ•œ ํ›„์—๋„ ์–ด๋ ˆ์ด๋Š” ๊ณ„์† ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
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 items = UO.GetLastMenuItems();
        UO.CloseMenu();
        UO.Print(Convert.ToString(ArrayLength(items)));
        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetLastMenuItems() โ€” UO.GetLastMenuItems()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getlastmenuitems": return StringArray(bridge.GetLastMenuItems());

UO.GetMenuItems

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

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

dynamic UO.GetMenuItems(object? caption);

์ด๋ฏธ ์—ด๋ ค ์žˆ๋Š” ๊ธฐ์กด ์„œ๋ฒ„ ๋ฉ”๋‰ด์˜ ํ•ญ๋ชฉ์„ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.

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

  • caption โ€” ์ด์ „ ์„œ๋ฒ„ ๋ฉ”๋‰ด ์ œ๋ชฉ์˜ ํ•˜์œ„ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. OrdinalIgnoreCase์„ ๊ฒ€์ƒ‰ํ•˜์„ธ์š”. ๋นˆ ์ค„์€ ๋ชจ๋“  ํ—ค๋”์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

๋ฌธ์ž์—ด ๋ฐฐ์—ด. ํ’ˆ๋ชฉ ์ด๋ฆ„/์„ค๋ช… ์ค„ GetYokoItems. ์ ํ•ฉํ•œ ๋ฉ”๋‰ด๊ฐ€ ์—†์œผ๋ฉด ๋นˆ ๋ฐฐ์—ด์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๋™์ž‘

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

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

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

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

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

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

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

1. ๋ชจ๋“  ํ•ญ๋ชฉ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋นˆ ๋ฐฐ์—ด์€ ๋ฃจํ”„๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
var items = UO.GetMenuItems("");
for (int i = (int)(0); i <= ArrayLength(items)-1; i += (int)(1))
{
    UO.Print(items[i]);
}

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

2. ์ฒซ ๋ฒˆ์งธ ํฌ์ธํŠธ๋Š” ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

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

  • ์ธ๋ฑ์Šค 0๋Š” ํฌ๊ธฐ๋ฅผ ํ™•์ธํ•œ ํ›„์—๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var items = UO.GetMenuItems("");
    if (Truth(ArrayLength(items) > 0))
    {
        UO.Print(items[0]);
    }

    return null;
}

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

3. ๋‹ซ๊ธฐ ์ „์— ์Šค๋ƒ…์ƒท ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์„œ๋ฒ„ ๋ฉ”๋‰ด๋ฅผ ์ทจ์†Œํ•œ ํ›„์—๋„ ์–ด๋ ˆ์ด๋Š” ๊ณ„์† ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
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 items = UO.GetMenuItems("");
        UO.CloseMenu();
        UO.Print(Convert.ToString(ArrayLength(items)));
        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetMenuItems(caption) โ€” UO.GetMenuItems(Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getmenuitems": return StringArray(bridge.GetMenuItems(Text(0), false));

UO.GetMenuItemsEx

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

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

dynamic UO.GetMenuItemsEx(object? caption);

์ด๋ฏธ ์—ด๋ ค ์žˆ๋Š” ๊ธฐ์กด ์„œ๋ฒ„ ๋ฉ”๋‰ด์˜ ํ•ญ๋ชฉ์„ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.

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

  • caption โ€” ์ด์ „ ์„œ๋ฒ„ ๋ฉ”๋‰ด ์ œ๋ชฉ์˜ ํ•˜์œ„ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. OrdinalIgnoreCase์„ ๊ฒ€์ƒ‰ํ•˜์„ธ์š”. ๋นˆ ์ค„์€ ๋ชจ๋“  ํ—ค๋”์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

๋ฌธ์ž์—ด ๋ฐฐ์—ด. ๋ฌธ์ž์—ด graphicHex|hueHex|index|์ด๋ฆ„(์˜ˆ: 0x0001|0x0000|1|choice). ์ ํ•ฉํ•œ ๋ฉ”๋‰ด๊ฐ€ ์—†์œผ๋ฉด ๋นˆ ๋ฐฐ์—ด์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๋™์ž‘

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

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

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

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

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

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

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

1. ๋ชจ๋“  ํ•ญ๋ชฉ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋นˆ ๋ฐฐ์—ด์€ ๋ฃจํ”„๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
var items = UO.GetMenuItemsEx("");
for (int i = (int)(0); i <= ArrayLength(items)-1; i += (int)(1))
{
    UO.Print(items[i]);
}

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

2. ์ฒซ ๋ฒˆ์งธ ํฌ์ธํŠธ๋Š” ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

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

  • ์ธ๋ฑ์Šค 0๋Š” ํฌ๊ธฐ๋ฅผ ํ™•์ธํ•œ ํ›„์—๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var items = UO.GetMenuItemsEx("");
    if (Truth(ArrayLength(items) > 0))
    {
        UO.Print(items[0]);
    }

    return null;
}

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

3. ๋‹ซ๊ธฐ ์ „์— ์Šค๋ƒ…์ƒท ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์„œ๋ฒ„ ๋ฉ”๋‰ด๋ฅผ ์ทจ์†Œํ•œ ํ›„์—๋„ ์–ด๋ ˆ์ด๋Š” ๊ณ„์† ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
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 items = UO.GetMenuItemsEx("");
        UO.CloseMenu();
        UO.Print(Convert.ToString(ArrayLength(items)));
        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetMenuItemsEx(caption) โ€” UO.GetMenuItemsEx(Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getmenuitemsex": return StringArray(bridge.GetMenuItems(Text(0), true));

UO.MenuHookPresent

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

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

dynamic UO.MenuHookPresent();

๋“ฑ๋ก๋œ ๋ฉ”๋‰ด ํ›„ํฌ์˜ ์กด์žฌ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

์ˆซ์ž ํ”Œ๋ž˜๊ทธ int: 1 - _manager.HasMenuHooks, 0 - ํ›„ํฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฉ”๋‰ด ์ž์ฒด๊ฐ€ ์—ฌ์ „ํžˆ ๋ˆ„๋ฝ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • ๋“ฑ๋ก๋œ ๋ฉ”๋‰ด ํ›„ํฌ์˜ ์กด์žฌ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
UO.Print(UO.MenuHookPresent());

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

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

  • ๋“ฑ๋ก๋œ ๋ฉ”๋‰ด ํ›„ํฌ์˜ ์กด์žฌ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋‰ด๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ , ์„œ๋ฒ„ ๊ฒ€ํ”„๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์œผ๋ฉฐ, Hook์„ ์†Œ๋ชจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.WaitMenu("Craft", "Tools");
    UO.Print(UO.MenuHookPresent());
    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 before = UO.MenuHookPresent();
        UO.Wait(500);
        var after = UO.MenuHookPresent();
        UO.Print(before);
        UO.Print(after);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.MenuHookPresent() โ€” UO.MenuHookPresent()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "menuhookpresent": return new InjectionValue(bridge.MenuHookPresent());

UO.MenuPresent

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

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

dynamic UO.MenuPresent();

MenuPresent๊ฐ€ WaitingMenu์—๊ฒŒ ์ง์ ‘ ์ „ํ™”๋ฅผ ๊ฒ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

์ˆซ์ž ํ”Œ๋ž˜๊ทธ int: 1 - ์„œ๋ฒ„ ๋ฉ”๋‰ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 0 - ์•„๋‹ˆ์š”.

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • MenuPresent๊ฐ€ WaitingMenu์—๊ฒŒ ์ง์ ‘ ์ „ํ™”๋ฅผ ๊ฒ๋‹ˆ๋‹ค.
UO.Print(UO.MenuPresent());

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

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

  • MenuPresent๊ฐ€ WaitingMenu์—๊ฒŒ ์ง์ ‘ ์ „ํ™”๋ฅผ ๊ฒ๋‹ˆ๋‹ค. GetGumpsCount, ์ปจํ…์ŠคํŠธ ๋ฉ”๋‰ด, ๋“ฑ๋ก๋œ Hook์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.MenuPresent()))
    {
        UO.Print(UO.GetLastMenuItems());
    }

    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. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.MenuPresent() โ€” UO.MenuPresent()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "menupresent": return new InjectionValue(bridge.MenuPresent());

UO.RequestContextMenu

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

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

void UO.RequestContextMenu(object? objID);

๊ฐœ์ฒด์˜ ์ƒํ™ฉ์— ๋งž๋Š” ๋ฉ”๋‰ด๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

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

  • objID โ€” ์ง๋ ฌ/ID ๊ฐœ์ฒด: int, ์ˆซ์ž/16์ง„์ˆ˜ ๋ฌธ์ž์—ด ๋˜๋Š” ์„ค์ •๋œ ๋ณ„์นญ(์˜ˆ: "lasttarget"). ์ด๊ฒƒ์€ graphic/type๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ธฐ ์ „์— ๋กœ๋“œ๋œ ๊ฐœ์ฒด๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ๋ธŒ๋ฆฌ์ง€ ํ†ตํ™” GameActions.OpenPopupMenu. ๋‹ต๋ณ€์€ ๋ณ„๋„๋กœ ์ €์žฅ๋˜์–ด GetContextMenu๋กœ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๋ฉ”๋‰ด ํ‘œ์‹œ์ค„์„ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Bridge๋Š” ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‚ด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.RequestContextMenu");
UO.RequestContextMenu(UO.GetSerial("lasttarget"));

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

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

  • ๊ฐœ์ฒด์˜ ์ƒํ™ฉ์— ๋งž๋Š” ๋ฉ”๋‰ด๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
    UO.RequestContextMenu(id);
}

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

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

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

  • ๋ธŒ๋ฆฌ์ง€ ํ†ตํ™” GameActions.OpenPopupMenu. ๋‹ต๋ณ€์€ ๋ณ„๋„๋กœ ์ €์žฅ๋˜์–ด GetContextMenu๋กœ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๋ฉ”๋‰ด ํ‘œ์‹œ์ค„์„ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("self");
    if (Truth(UO.Exists(id)))
    {
        UO.RequestContextMenu(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;

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

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

  • Bridge๋Š” ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‚ด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.
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()
    {
        ApplyToLoaded(UO.GetSerial("lasttarget"));
        return null;
    }

    void ApplyToLoaded(dynamic id)
    {
        if (Truth(UO.Exists(id)))
        {
            UO.RequestContextMenu(id);
        }
    }

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "requestcontextmenu": bridge.RequestContextMenu(Arg(0)); return InjectionValue.Unit;

UO.SetContextMenuHook

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

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

void UO.SetContextMenuHook(object? menuID, object? entryNumber);

์ƒํ™ฉ์— ๋งž๋Š” ๋ฉ”๋‰ด ํ•ญ๋ชฉ์˜ ์ผํšŒ์„ฑ ์„ ํƒ์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

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

  • menuID โ€” ๋ฉ”๋‰ด ๊ฐœ์ฒด์˜ ์ผ๋ จ ๋ฒˆํ˜ธ์ด๋ฉฐ uint๋กœ ์ถ•์†Œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 0๋Š” ์–ด๋–ค serial์—๋„ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์„œ๋ฒ„ ๊ฒ€ํ”„ ID๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • entryNumber โ€” ์˜์  ์ธ๋ฑ์Šค; ์Œ์ˆ˜ ๊ฐ’์€ ๋ณด๋ฅ˜ ์ค‘์ธ ์ปจํ…์ŠคํŠธ ํ›„ํฌ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. 0..GetArrayLength(UO.GetContextMenu())-1.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • Bridge๋Š” ๋ฐ์ดํ„ฐ๋ฅผ _manager.SetContextMenuHook๋กœ ์ „๋‹ฌํ•˜๋ฉฐ, ์—ฌ๊ธฐ์— _contextMenuSerial/_contextMenuEntry๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ProcessMenuHooks ํ•ธ๋“ค๋Ÿฌ๋Š” ์ผ์น˜ํ•˜๋Š” ๊ธฐ์กด ์ปจํ…์ŠคํŠธ ๋ฉ”๋‰ด๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
  • SelectYokoItem๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด ํ•„๋“œ๊ฐ€ 0/-1๋กœ ์ง€์›Œ์ง‘๋‹ˆ๋‹ค. ์ด ์„ค์ •์ž๋Š” ๋ฉ”๋‰ด๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. RequestContextMenu๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”. ํ˜ธ์ถœ ์ž์ฒด๋Š” ์„œ๋ฒ„ ์ž‘์—…์„ ์ฐจ๋‹จํ•˜๊ฑฐ๋‚˜ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.SetContextMenuHook");
UO.SetContextMenuHook(0, 0);

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

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

  • ์ƒํ™ฉ์— ๋งž๋Š” ๋ฉ”๋‰ด ํ•ญ๋ชฉ์˜ ์ผํšŒ์„ฑ ์„ ํƒ์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
UO.SetContextMenuHook(0, 0);

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

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

  • Bridge๋Š” ๋ฐ์ดํ„ฐ๋ฅผ _manager.SetContextMenuHook๋กœ ์ „๋‹ฌํ•˜๋ฉฐ, ์—ฌ๊ธฐ์— _contextMenuSerial/_contextMenuEntry๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ProcessMenuHooks ํ•ธ๋“ค๋Ÿฌ๋Š” ์ผ์น˜ํ•˜๋Š” ๊ธฐ์กด ์ปจํ…์ŠคํŠธ ๋ฉ”๋‰ด๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("lasttarget");
    UO.SetContextMenuHook(UO.Hex2Int(id), 0);
    UO.RequestContextMenu(id);
    return null;
}

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

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

  • SelectYokoItem๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด ํ•„๋“œ๊ฐ€ 0/-1๋กœ ์ง€์›Œ์ง‘๋‹ˆ๋‹ค. ์ด ์„ค์ •์ž๋Š” ๋ฉ”๋‰ด๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. RequestContextMenu๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”. ํ˜ธ์ถœ ์ž์ฒด๋Š” ์„œ๋ฒ„ ์ž‘์—…์„ ์ฐจ๋‹จํ•˜๊ฑฐ๋‚˜ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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.SetContextMenuHook(0, -1);
        UO.Print(UO.GetContextMenu());
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.SetContextMenuHook(menuID, entryNumber) โ€” UO.SetContextMenuHook(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "setcontextmenuhook": bridge.SetContextMenuHook(Arg(0), Arg(1)); return InjectionValue.Unit;

UO.WaitMenu

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

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

void UO.WaitMenu(object? menuCaption, object? elementCaption);
void UO.WaitMenu(object? prompt1, object? choice1, object? prompt2, object? choice2);
void UO.WaitMenu(object? prompt1, object? choice1, object? prompt2, object? choice2, object? prompt3, object? choice3);

์ผํšŒ์„ฑ ๋ฉ”๋‰ด ํ›„ํฌ๋ฅผ ์ตœ๋Œ€ 3๊ฐœ๊นŒ์ง€ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

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

  • menuCaption / prompt1 / prompt2 / prompt3 โ€” ์„œ๋ฒ„ ๋ฉ”๋‰ด ์ œ๋ชฉ ํ…œํ”Œ๋ฆฟ ๋ฌธ์ž์—ด. ์Œ์€ ํ—ค๋”, ์š”์†Œ ์ˆœ์„œ๋Œ€๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
  • menuCaption โ€” ์„œ๋ฒ„ ๋ฉ”๋‰ด ์ œ๋ชฉ ํ…œํ”Œ๋ฆฟ ๋ฌธ์ž์—ด. ์Œ์€ ํ—ค๋”, ์š”์†Œ ์ˆœ์„œ๋Œ€๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
  • prompt1 โ€” ์„œ๋ฒ„ ๋ฉ”๋‰ด ์ œ๋ชฉ ํ…œํ”Œ๋ฆฟ ๋ฌธ์ž์—ด. ์Œ์€ ํ—ค๋”, ์š”์†Œ ์ˆœ์„œ๋Œ€๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
  • prompt2 โ€” ์„œ๋ฒ„ ๋ฉ”๋‰ด ์ œ๋ชฉ ํ…œํ”Œ๋ฆฟ ๋ฌธ์ž์—ด. ์Œ์€ ํ—ค๋”, ์š”์†Œ ์ˆœ์„œ๋Œ€๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
  • prompt3 โ€” ์„œ๋ฒ„ ๋ฉ”๋‰ด ์ œ๋ชฉ ํ…œํ”Œ๋ฆฟ ๋ฌธ์ž์—ด. ์Œ์€ ํ—ค๋”, ์š”์†Œ ์ˆœ์„œ๋Œ€๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
  • elementCaption / choice1 / choice2 / choice3 โ€” ํ•ด๋‹น ํ—ค๋”์˜ ์š”์†Œ๋ฅผ ์„ ํƒํ•˜๋Š” ๋ผ์ธ์ž…๋‹ˆ๋‹ค. ID ์ผ๋ฐ˜ ๊ฒ€ํ”„ ๋ฒ„ํŠผ์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • elementCaption โ€” ํ•ด๋‹น ํ—ค๋”์˜ ์š”์†Œ๋ฅผ ์„ ํƒํ•˜๋Š” ๋ผ์ธ์ž…๋‹ˆ๋‹ค. ID ์ผ๋ฐ˜ ๊ฒ€ํ”„ ๋ฒ„ํŠผ์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • choice1 โ€” ํ•ด๋‹น ํ—ค๋”์˜ ์š”์†Œ๋ฅผ ์„ ํƒํ•˜๋Š” ๋ผ์ธ์ž…๋‹ˆ๋‹ค. ID ์ผ๋ฐ˜ ๊ฒ€ํ”„ ๋ฒ„ํŠผ์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • choice2 โ€” ํ•ด๋‹น ํ—ค๋”์˜ ์š”์†Œ๋ฅผ ์„ ํƒํ•˜๋Š” ๋ผ์ธ์ž…๋‹ˆ๋‹ค. ID ์ผ๋ฐ˜ ๊ฒ€ํ”„ ๋ฒ„ํŠผ์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • choice3 โ€” ํ•ด๋‹น ํ—ค๋”์˜ ์š”์†Œ๋ฅผ ์„ ํƒํ•˜๋Š” ๋ผ์ธ์ž…๋‹ˆ๋‹ค. ID ์ผ๋ฐ˜ ๊ฒ€ํ”„ ๋ฒ„ํŠผ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ๊ฐ ์Œ์€ _manager.AddMenuHook(ํ”„๋กฌํ”„ํŠธ, ์„ ํƒ, false)๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก๋œ ์–‘์‹์€ 2/4/6 ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค. false๋Š” ์ผํšŒ์šฉ ํ›„ํฌ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. AutoMenu/๋‘ ์ธ์ˆ˜ VendorMenu ์ƒ์ˆ˜ ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฉ”๋‰ด๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ๊นŒ์ง€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฉ”๋‰ด๊ฐ€ ์ ํ•ฉํ•  ๊ฒฝ์šฐ ๊ด€๋ฆฌ์ž๊ฐ€ Hook์„ ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฉ”๋‰ด์˜ ๊ฒฝ์šฐ WaitingMenu๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ›„ํฌ์˜ ๊ฒฝ์šฐ - MenuHookPresent๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๋ฉ”๋‰ด/์„ ํƒ ์–‘์‹์˜ ๊ฒฝ์šฐ ๊ด€๋ฆฌ์ž๋Š” ์ œ๋ชฉ์— ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ํ”„๋กฌํ”„ํŠธ๊ฐ€ ํฌํ•จ๋œ ์ฒซ ๋ฒˆ์งธ ๋ฉ”๋‰ด๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. SessionMenu๋Š” ์ด๋ฆ„์— choice๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ณ  ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋นˆ ํ…์ŠคํŠธ๋Š” ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž ํ…์ŠคํŠธ๋Š” ์ƒ‰์ธ์ด ์•„๋‹Œ ์ด๋ฆ„์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. ์„ฑ๊ณต์ ์œผ๋กœ ์„ ํƒํ•˜๋ฉด ์‘๋‹ต์ด ์ „์†ก๋˜๊ณ  ๋กœ์ปฌ ๋ฉ”๋‰ด๊ฐ€ ๋‹ซํž™๋‹ˆ๋‹ค. ์ผํšŒ์„ฑ ํ›„ํฌ๋Š” ์„ ํƒํ•œ ํ›„์—๋งŒ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ์˜๊ตฌ ํ›„ํฌ๊ฐ€ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.WaitMenu");
UO.WaitMenu("Craft", "Tools");

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

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

  • ์ผํšŒ์„ฑ ๋ฉ”๋‰ด ํ›„ํฌ๋ฅผ ์ตœ๋Œ€ 3๊ฐœ๊นŒ์ง€ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
UO.WaitMenu("Craft", "Tools");

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

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

  • ๊ฐ ์Œ์€ _manager.AddMenuHook(ํ”„๋กฌํ”„ํŠธ, ์„ ํƒ, false)๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก๋œ ์–‘์‹์€ 2/4/6 ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค. false๋Š” ์ผํšŒ์šฉ ํ›„ํฌ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. AutoMenu/๋‘ ์ธ์ˆ˜ VendorMenu ์ƒ์ˆ˜ ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.WaitMenu("Craft", "Tools", "Tools", "Shovel");
    return null;
}

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

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

  • ๋ฉ”๋‰ด๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ๊นŒ์ง€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฉ”๋‰ด๊ฐ€ ์ ํ•ฉํ•  ๊ฒฝ์šฐ ๊ด€๋ฆฌ์ž๊ฐ€ Hook์„ ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฉ”๋‰ด์˜ ๊ฒฝ์šฐ WaitingMenu๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ›„ํฌ์˜ ๊ฒฝ์šฐ - MenuHookPresent๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
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.WaitMenu("Craft", "Tools", "Tools", "Shovel", "Amount", "One");
        UO.Print(UO.MenuHookPresent());
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.WaitMenu(menuCaption, elementCaption) โ€” UO.WaitMenu(Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: menuCaption (Any/String), elementCaption (Any/String)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "waitmenu": bridge.WaitMenu(arguments.Select(value => value.ToString()).ToArray()); return InjectionValue.Unit;

UO.WaitMenu(menuCaption, elementCaption) โ€” UO.WaitMenu(String,String)

๋งค๊ฐœ๋ณ€์ˆ˜: menuCaption (Any/String), elementCaption (Any/String)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void WaitMenu(string prompt, string choice)

            => bridge.WaitMenu(prompt, choice);

UO.WaitMenu(prompt1, choice1, prompt2, choice2) โ€” UO.WaitMenu(String,String,String,String)

๋งค๊ฐœ๋ณ€์ˆ˜: prompt1 (String), choice1 (String), prompt2 (String), choice2 (String)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void WaitMenu(string prompt1, string choice1, string prompt2, string choice2)

            => bridge.WaitMenu(prompt1, choice1, prompt2, choice2);

UO.WaitMenu(prompt1, choice1, prompt2, choice2, prompt3, choice3) โ€” UO.WaitMenu(String,String,String,String,String,String)

๋งค๊ฐœ๋ณ€์ˆ˜: prompt1 (String), choice1 (String), prompt2 (String), choice2 (String), prompt3 (String), choice3 (String)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void WaitMenu(string prompt1, string choice1, string prompt2, string choice2, string prompt3, string choice3)

            => bridge.WaitMenu(prompt1, choice1, prompt2, choice2, prompt3, choice3);

UO.WaitTextEntry

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

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

void UO.WaitTextEntry(object? value);

ํ˜„์žฌ ๊ฒ€ํ”„์˜ ํ…์ŠคํŠธ ํ•ญ๋ชฉ์— ํ…์ŠคํŠธ๋ฅผ ์“ฐ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ExecuteClientApiCompatibility๋Š” SetGumpValue(-1, "textentry", -1, Text(0))๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. key=-1๋Š” ์ผ๋ฐ˜์ ์ธ null ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฒ€ํ”„ ๊ตฌํ˜„์—์„œ ๊ธฐ์กด ํ•„๋“œ๊ฐ€ ID์— ๋งคํ•‘๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ํ–ฅํ›„ ๊ฒ€ํ”„๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ํ”„๋กฌํ”„ํŠธ๋ฅผ ์—ด์ง€ ์•Š์œผ๋ฉฐ ํ›„ํฌ๋ฅผ ๋“ฑ๋กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜๋Š” ํ•„๋“œ๊ฐ€ ์—†์œผ๋ฉด SetGumpValue ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์•Œ๋ ค์ง„ ํ•„๋“œ์˜ ๊ฒฝ์šฐ ๋ช…์‹œ์ ์ธ ID/index์™€ ํ•จ๊ป˜ SetGump๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

UO.Print("Calling UO.WaitTextEntry");
UO.WaitTextEntry("Example");

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

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

  • ํ˜„์žฌ ๊ฒ€ํ”„์˜ ํ…์ŠคํŠธ ํ•ญ๋ชฉ์— ํ…์ŠคํŠธ๋ฅผ ์“ฐ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
UO.WaitTextEntry("Example");

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

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

  • ExecuteClientApiCompatibility๋Š” SetGumpValue(-1, "textentry", -1, Text(0))๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. key=-1๋Š” ์ผ๋ฐ˜์ ์ธ null ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฒ€ํ”„ ๊ตฌํ˜„์—์„œ ๊ธฐ์กด ํ•„๋“œ๊ฐ€ ID์— ๋งคํ•‘๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.GetGumpsCount() > 0))
    {
        UO.WaitTextEntry("Example");
    }

    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. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ํ–ฅํ›„ ๊ฒ€ํ”„๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ํ”„๋กฌํ”„ํŠธ๋ฅผ ์—ด์ง€ ์•Š์œผ๋ฉฐ ํ›„ํฌ๋ฅผ ๋“ฑ๋กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜๋Š” ํ•„๋“œ๊ฐ€ ์—†์œผ๋ฉด SetGumpValue ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์•Œ๋ ค์ง„ ํ•„๋“œ์˜ ๊ฒฝ์šฐ ๋ช…์‹œ์ ์ธ ID/index์™€ ํ•จ๊ป˜ SetGump๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
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.WaitTextEntry("Example");
        UO.Print("Check the target field in the current gump");
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.WaitTextEntry(value) โ€” UO.WaitTextEntry(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "waittextentry": bridge.SetGumpValue(-1, "textentry", -1, Text(0)); return InjectionValue.Unit;

UO.WaitingForMenu

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

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

int UO.WaitingForMenu(object? delay);
int UO.WaitingForMenu(object? delay, object? menuCount);
int UO.WaitingForMenu(object? delay, object? menuCount, object? blockMenu);
int UO.WaitingForMenu(object? delay, object? menuCount, object? blockMenu, object? menuName);
int UO.WaitingForMenu(object? delayValue, object? menuCountValue, object? blockMenuValue, object? menuNameValue, object? skillOrSerial);

ํ•„์š”ํ•œ ์„œ๋ฒ„ ๋ฉ”๋‰ด ํ‘œ์‹œ ํšŸ์ˆ˜๋Š” ์ œํ•œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

  • delay โ€” int ์‹œ๊ฐ„ ์ดˆ๊ณผ(๋ฐ€๋ฆฌ์ดˆ), ์Œ์ˆ˜๋Š” 0๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. 0๋ฅผ ์‚ฌ์šฉํ•ด๋„ ํ•œ ๋ฒˆ์˜ ๊ฒ€์‚ฌ๊ฐ€ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
  • delayValue โ€” int ์‹œ๊ฐ„ ์ดˆ๊ณผ(๋ฐ€๋ฆฌ์ดˆ), ์Œ์ˆ˜๋Š” 0๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. 0๋ฅผ ์‚ฌ์šฉํ•ด๋„ ํ•œ ๋ฒˆ์˜ ๊ฒ€์‚ฌ๊ฐ€ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
  • menuCount โ€” ์„ ํƒ์ ์ธ ๋“ฑ์žฅ ํšŸ์ˆ˜, ์ตœ์†Œ 1; ๊ธฐ๋ณธ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฉ”๋‰ด ํ•ญ๋ชฉ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • menuCountValue โ€” ์„ ํƒ์ ์ธ ๋“ฑ์žฅ ํšŸ์ˆ˜, ์ตœ์†Œ 1; ๊ธฐ๋ณธ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฉ”๋‰ด ํ•ญ๋ชฉ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • blockMenu โ€” 0์ด ์•„๋‹Œ ์„ ํƒ์  ์ˆซ์ž๋Š” ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜๋ฉด ๋ฉ”๋‰ด๋ฅผ ๋‹ซ์Šต๋‹ˆ๋‹ค. 0๊ฐ€ ๊ทธ๋ฅผ ๋– ๋‚œ๋‹ค.
  • blockMenuValue โ€” 0์ด ์•„๋‹Œ ์„ ํƒ์  ์ˆซ์ž๋Š” ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜๋ฉด ๋ฉ”๋‰ด๋ฅผ ๋‹ซ์Šต๋‹ˆ๋‹ค. 0๊ฐ€ ๊ทธ๋ฅผ ๋– ๋‚œ๋‹ค.
  • menuName - ์ •ํ™•ํ•œ ์ œ๋ชฉ(์„ ํƒ ์‚ฌํ•ญ), ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„; ๋น„์–ด ์žˆ์œผ๋ฉด ๋ˆ„๊ตฌ๋‚˜ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • menuNameValue - ์ •ํ™•ํ•œ ์ œ๋ชฉ(์„ ํƒ ์‚ฌํ•ญ), ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„; ๋น„์–ด ์žˆ์œผ๋ฉด ๋ˆ„๊ตฌ๋‚˜ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • skillOrSerial - ์„ ํƒ์  ๋งˆ์ง€๋ง‰ ์ธ์ˆ˜: TriggerWaitAction๋Š” ์ด๋ฆ„์ด ์ง€์ •๋œ ์Šคํ‚ฌ์ด๋‚˜ serial๋ผ๋Š” ๊ฐœ์ฒด๋ฅผ ๋จผ์ € ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ 0๋Š” ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

์ˆซ์ž ํ”Œ๋ž˜๊ทธ int: 1 - ์ ์–ด๋„ menuCount ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ด ๋ฐœ๊ฒฌ๋˜๊ณ  ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์— ์›ํ•˜๋Š” ์ œ๋ชฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 0 - ์‹œ๊ฐ„ ์ดˆ๊ณผ. ๊ธฐ์กด ๋ฉ”๋‰ด๋Š” ๋ฐ”๋กœ ์นด์šดํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • TriggerWaitAction๊ฐ€ GetLastMenuIdentity์„ ์ฝ์€ ํ›„; ์ƒˆ๋กœ์šด ์‹ ์›์€ ์นด์šดํ„ฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค. ๋นˆ ID๋Š” ์ด์ „ ID์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์žฌ์„ค์ •ํ•˜๋ฏ€๋กœ ๋‹ซ๊ฑฐ๋‚˜ ๋‹ค์‹œ ์—ฐ ํ›„์— ๋™์ผํ•œ ๋ฉ”๋‰ด๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐœ์ˆ˜ ๊ฒฝ๊ณ„๋Š” ์ƒˆ ID๋กœ๋งŒ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. ์™€ ์ผ์น˜ํ•˜๋ฉด blockMenu ๋ฉ”๋‰ด๋ฅผ ๋‹ซ์Šต๋‹ˆ๋‹ค. ํ™•์ธ ์‚ฌ์ด UO.Wait ~ 25 ms; ํ—ค๋”๋Š” ํ•˜์œ„ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ์„œ์ˆ˜๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ํ•„์š”ํ•œ ์„œ๋ฒ„ ๋ฉ”๋‰ด ํ‘œ์‹œ ํšŸ์ˆ˜๋Š” ์ œํ•œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
UO.Print(UO.WaitingForMenu(3000));

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

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

  • TriggerWaitAction๊ฐ€ GetLastMenuIdentity์„ ์ฝ์€ ํ›„; ์ƒˆ๋กœ์šด ์‹ ์›์€ ์นด์šดํ„ฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค. ๋นˆ ID๋Š” ์ด์ „ ID์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์žฌ์„ค์ •ํ•˜๋ฏ€๋กœ ๋‹ซ๊ฑฐ๋‚˜ ๋‹ค์‹œ ์—ฐ ํ›„์— ๋™์ผํ•œ ๋ฉ”๋‰ด๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.WaitingForMenu(3000, 1, 1, "Craft"));
    return null;
}

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

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

  • ๊ฐœ์ˆ˜ ๊ฒฝ๊ณ„๋Š” ์ƒˆ ID๋กœ๋งŒ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. ์™€ ์ผ์น˜ํ•˜๋ฉด blockMenu ๋ฉ”๋‰ด๋ฅผ ๋‹ซ์Šต๋‹ˆ๋‹ค. ํ™•์ธ ์‚ฌ์ด UO.Wait ~ 25 ms; ํ—ค๋”๋Š” ํ•˜์œ„ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ์„œ์ˆ˜๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.
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 found = UO.WaitingForMenu(3000, 1, 0, "Craft", "lasttarget");
        if (Truth(found))
        {
            UO.Print(UO.GetLastMenuItems());
        }

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int WaitingForMenu(InjectionValue delay) => WaitingForMenu(delay, InjectionValue.Zero, InjectionValue.Zero, new InjectionValue(string.Empty), InjectionValue.Zero);

UO.WaitingForMenu(delay, menuCount) โ€” UO.WaitingForMenu(Any,Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int WaitingForMenu(InjectionValue delay, InjectionValue menuCount) => WaitingForMenu(delay, menuCount, InjectionValue.Zero, new InjectionValue(string.Empty), InjectionValue.Zero);

UO.WaitingForMenu(delay, menuCount, blockMenu) โ€” UO.WaitingForMenu(Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: delay (Any), menuCount (Any), blockMenu (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int WaitingForMenu(InjectionValue delay, InjectionValue menuCount, InjectionValue blockMenu) => WaitingForMenu(delay, menuCount, blockMenu, new InjectionValue(string.Empty), InjectionValue.Zero);

UO.WaitingForMenu(delay, menuCount, blockMenu, menuName) โ€” UO.WaitingForMenu(Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: delay (Any), menuCount (Any), blockMenu (Any), menuName (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int WaitingForMenu(InjectionValue delay, InjectionValue menuCount, InjectionValue blockMenu, InjectionValue menuName) => WaitingForMenu(delay, menuCount, blockMenu, menuName, InjectionValue.Zero);

UO.WaitingForMenu(delayValue, menuCountValue, blockMenuValue, menuNameValue, skillOrSerial) โ€” UO.WaitingForMenu(Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: delayValue (Any), menuCountValue (Any), blockMenuValue (Any), menuNameValue (Any), skillOrSerial (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int WaitingForMenu(InjectionValue delayValue, InjectionValue menuCountValue, InjectionValue blockMenuValue, InjectionValue menuNameValue, InjectionValue skillOrSerial)

        {

            int delay = Math.Max(0, NumberConversions.ToInt(delayValue));

            int requiredMenuCount = Math.Max(1, NumberConversions.ToInt(menuCountValue));

            bool blockMenu = NumberConversions.ToInt(blockMenuValue) != 0;

            string expectedName = menuNameValue.ToString() ?? string.Empty;

            DateTime deadline = timeSource.Now.AddMilliseconds(delay);

            string previousIdentity = string.Empty;

            int observedMenuCount = 0;



            TriggerWaitAction(skillOrSerial);



            do

            {

                string identity = bridge.GetLastMenuIdentity() ?? string.Empty;

                if (identity.Length == 0)

                {

                    // Reset between server menus so an identical menu opened again

                    // still counts as a new appearance.

                    previousIdentity = string.Empty;

                }

                else if (!identity.Equals(previousIdentity, StringComparison.Ordinal))

                {

                    previousIdentity = identity;

                    observedMenuCount++;

                    string caption = bridge.GetLastMenuCaption() ?? string.Empty;

                    bool nameMatches = expectedName.Length == 0

                        || caption.Equals(expectedName, StringComparison.Ordinal);

                    if (observedMenuCount >= requiredMenuCount && nameMatches)

                    {

                        if (blockMenu)

                            bridge.CloseMenu();

                        return 1;

                    }

                }



                if (timeSource.Now >= deadline)

                    break;

                bridge.Wait(Math.Min(25, Math.Max(1, delay)));

            }

            while (true);



            return 0;

        }

UO.WaitingMenu

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

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

int UO.WaitingMenu();

_world.ServerMenus.Snapshot().Length != 0์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

์ˆซ์ž ํ”Œ๋ž˜๊ทธ int: 1 - ServerMenus์—๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฉ”๋‰ด๊ฐ€ ์žˆ๊ณ , 0 -์—๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋ฉ”๋‰ด๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋™์ž‘

  • _world.ServerMenus.Snapshot().Length != 0์„ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ ˆ๊ฑฐ์‹œ ์„œ๋ฒ„ ๋ฉ”๋‰ด๋Š” ์ผ๋ฐ˜ ์„œ๋ฒ„ ๊ฒ€ํ”„ ๋ฐ ์ƒํ™ฉ์— ๋งž๋Š” ๋ฉ”๋‰ด์™€ ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€, ๋Œ€์ƒ ๋˜๋Š” ์ž๋™ ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ์ƒํƒœ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • _world.ServerMenus.Snapshot().Length != 0์„ ์ฝ์Šต๋‹ˆ๋‹ค.
UO.Print(UO.WaitingMenu());

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

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

  • _world.ServerMenus.Snapshot().Length != 0์„ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ ˆ๊ฑฐ์‹œ ์„œ๋ฒ„ ๋ฉ”๋‰ด๋Š” ์ผ๋ฐ˜ ์„œ๋ฒ„ ๊ฒ€ํ”„ ๋ฐ ์ƒํ™ฉ์— ๋งž๋Š” ๋ฉ”๋‰ด์™€ ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.WaitingMenu()))
    {
        UO.Print(UO.GetLastMenuItems());
    }

    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. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.WaitingMenu() โ€” UO.WaitingMenu()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int WaitingMenu() => bridge.WaitingMenu();
โš ๏ธ **GitHub.com Fallback** โš ๏ธ