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
๊ฐ ๋ช ๋ น ์นด๋์๋ ์ง์ ์ฝ๋, ํจ์ ๋ฐ ํด๋์ค ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๋ค์์ ์ ํ๋ ์งง์ ์๋๋ฆฌ์ค์ ๋๋ค. ์ ํ์ฌํญ๊ณผ ์ ์ฒด ๋ถ์์ด ์นด๋์ ํฌํจ๋์ด ์์ต๋๋ค.
๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
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("Craft", "Tools");ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.AutoMenu(object? prompt, object? choice);์๊ตฌ ๋ฉ๋ด ํํฌ ๋ฑ๋ก: ์ ์ ํ ์บก์ ์ด ์๋ ์๋ฒ ๋ฉ๋ด๊ฐ ๋ํ๋๋ฉด ํด๋ผ์ด์ธํธ๋ ์ ์ ํ ํญ๋ชฉ์ ์ ํํฉ๋๋ค. ํธ์ถ์ ๋ฉ๋ด๋ฅผ ์ด์ง ์์ผ๋ฉฐ ๋๊ธฐ์ ์ผ๋ก ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
-
promptโ ์๋ฒ ๋ฉ๋ด ์ ๋ชฉ์ ํ์ ๋ฌธ์์ด์ ๋๋ค. -
choiceโ ๋ฉ๋ด ํญ๋ชฉ ์๋ช ์ ํ์ ๋ฌธ์์ด์ ๋๋ค.
void. ํธ์ถ์ ํํฌ๋ฅผ ๋ฑ๋กํ ๋ฟ์ด๋ฉฐ ๋ฉ๋ด๋ฅผ ์ฐพ์๋์ง ๋๋ ํญ๋ชฉ์ด ์ฑ๊ณต์ ์ผ๋ก ์ ํ๋์๋์ง ์ฌ๋ถ๋ ๋ณด๊ณ ํ์ง ์์ต๋๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ์
๋ฐ์ดํธ๋ ๋๋ง๋ค ํํฌ๋ ์์ง ๋ซํ์ง ์์์ผ๋ฉฐ ์ ๋ชฉ์
prompt์ด ํฌํจ๋ ์๋ฒ ๋ฉ๋ด๋ฅผ ์ฐพ์ต๋๋ค. ์๋ช ์choice์ด ํฌํจ๋ ํญ๋ชฉ์ด ๋ฐ๊ฒฌ๋๋ฉด ํด๋ผ์ด์ธํธ๋ ํด๋น ํญ๋ชฉ์ ์ ํํฉ๋๋ค. ํํฌ๋ ์ ํ ํ์๋ ๋ฑ๋ก๋ ์ํ๋ก ์ ์ง๋๋ฏ๋ก ํ์ ์ผ์น ๋ฉ๋ด์์ ์๋ํฉ๋๋ค.UO.CancelMenu()๋ฅผ ์ฌ์ฉํ์ฌ ํํฌ๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: prompt (Any), choice (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.AddMenuHook:bridge.AddMenuHook(arguments[0].ToString(), arguments[1].ToString(), true). -
InjectionScript.Runtime.InjectionValue.ToString:arguments[0].ToString().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "automenu":
if (arguments.Length >= 2) bridge.AddMenuHook(arguments[0].ToString(), arguments[1].ToString(), true);
break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.CancelAllMenuHooks();์ด์ ํด๋ผ์ด์ธํธ ์๋ฒ ๋ฉ๋ด์์ ๋ฑ๋ก๋ ๋ชจ๋ ์๋ ํํฌ๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- ClearMenuHooks ๊ด๋ฆฌ์์๊ฒ ์ ํ๋ฅผ ๊ฒ๋๋ค. AutoMenu ๋ฐ WaitMenu๋ฅผ ํฌํจํ ๋จ์ผ ๋ฐ ์๊ตฌ ์ ํ ๊ท์น์ด ์ ๊ฑฐ๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ์ด๋ฏธ ์ด๋ ค ์๋ ๋ฉ๋ด๋ฅผ ๋ซ์ง ์์ต๋๋ค. CloseMenu๊ฐ ์ด๋ฅผ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.CancelAllMenuHooks");
UO.CancelAllMenuHooks();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ๊ฑฐ๋ ์ ์ฒด ํด๋ผ์ด์ธํธ ๋ฉ๋ด ํํฌ ์ธํธ์ ์ ์ฉ๋ฉ๋๋ค.
UO.CancelAllMenuHooks();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํํฌ๋ ์ฆ์ ์ ๊ฑฐ๋ฉ๋๋ค. ๋ฏธ๋์ ์ผ์นํ๋ ๋ฉ๋ด๋ ๋ ์ด์ ์๋์ผ๋ก ์ ํ๋์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.AutoMenu("Choose material", "Iron");
UO.CancelAllMenuHooks();
return 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.CancelAllMenuHooks();
UO.CloseMenu();
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ClearMenuHooks:bridge.ClearMenuHooks().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "cancelallmenuhooks": bridge.ClearMenuHooks(); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.CancelMenu();์ด์ ํด๋ผ์ด์ธํธ ์๋ฒ ๋ฉ๋ด์์ ๋ฑ๋ก๋ ๋ชจ๋ ์๋ ํํฌ๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- ClearMenuHooks ๊ด๋ฆฌ์์๊ฒ ์ ํ๋ฅผ ๊ฒ๋๋ค. AutoMenu ๋ฐ WaitMenu๋ฅผ ํฌํจํ ๋จ์ผ ๋ฐ ์๊ตฌ ์ ํ ๊ท์น์ด ์ ๊ฑฐ๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ์ด๋ฏธ ์ด๋ ค ์๋ ๋ฉ๋ด๋ฅผ ๋ซ์ง ์์ต๋๋ค. CloseMenu๊ฐ ์ด๋ฅผ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.CancelMenu");
UO.CancelMenu();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ๊ฑฐ๋ ์ ์ฒด ํด๋ผ์ด์ธํธ ๋ฉ๋ด ํํฌ ์ธํธ์ ์ ์ฉ๋ฉ๋๋ค.
UO.CancelMenu();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํํฌ๋ ์ฆ์ ์ ๊ฑฐ๋ฉ๋๋ค. ๋ฏธ๋์ ์ผ์นํ๋ ๋ฉ๋ด๋ ๋ ์ด์ ์๋์ผ๋ก ์ ํ๋์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.AutoMenu("Choose material", "Iron");
UO.CancelMenu();
return 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.CancelMenu();
UO.CloseMenu();
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ClearMenuHooks:bridge.ClearMenuHooks().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "cancelmenu": bridge.ClearMenuHooks(); break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ClearContextMenu();ํ์ฌ ๋ก์ปฌ ์ํฉ์ ๋ง๋ ๋ฉ๋ด ๋ชจ๋ธ์ ์ ๊ฑฐํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- ๋ชจ๋ธ์ด ์๋ ๊ฒฝ์ฐ ServerMenus.Context์์ Dispose๋ฅผ ํธ์ถํฉ๋๋ค. ๋ค์ ์์ฒญ ํ์ ์ ์๋ฒ ๋ฉ๋ด๊ฐ ๋ํ๋ ์ ์์ต๋๋ค. ์ด๊ฒ์ CloseMenu์ด ์๋๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.ClearContextMenu");
UO.ClearContextMenu();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ๋ก์ปฌ ์ํฉ์ ๋ง๋ ๋ฉ๋ด ๋ชจ๋ธ์ ์ ๊ฑฐํฉ๋๋ค.
UO.ClearContextMenu();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ค๋ ์ท์ ์ฝ์ ํ ๋ก์ปฌ ์ปจํ ์คํธ ๋ฉ๋ด๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var entries = UO.GetContextMenu();
UO.ClearContextMenu();
return 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.ClearContextMenu();
UO.ClearContextMenu();
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ClearContextMenu:bridge.ClearContextMenu().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "clearcontextmenu": bridge.ClearContextMenu(); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.CloseMenu();CancelForYoko๋ฅผ ํตํด ํ์ฑํ๋ ๋ชจ๋ ์ด์ ์๋ฒ ๋ฉ๋ด๋ฅผ ์ทจ์ํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- ์ค๋ ์ท ServerMenus์ ๋ฐ๋ณตํ๊ณ ๊ฐ ๋ชจ๋ธ์ ์ญ์ ํฉ๋๋ค. ์๋ ๋ฉ๋ด ํํฌ๋ฅผ ์ ๊ฑฐํ์ง ์์ผ๋ฉฐ ์์์ ๊ฒํ/์ธํฐํ์ด์ค ์ฐฝ์ ๋ซ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.CloseMenu");
UO.CloseMenu();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ทจ์๋ ๊ธฐ์กด MenuGump/์๋ฒ ๋ฉ๋ด์ ์ ์ฉ๋ฉ๋๋ค.
UO.CloseMenu();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๋ ์ ํ๊ณผ ๋ฉ๋ด ์ด๊ธฐ๋ ๋ณ๋์ ๋ช ๋ น์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.CancelAllMenuHooks();
UO.CloseMenu();
return 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()
{
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CloseMenu:bridge.CloseMenu().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "closemenu": bridge.CloseMenu(); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ConsoleEntryReply(object? text);MessageManager.SendServerPromptResponse๋ฅผ ํตํด ํ์ฑ ์๋ฒ ํ๋กฌํํธ์ ํ ์คํธ๋ก ์๋ตํฉ๋๋ค.
-
textโ ๋ฌธ์์ด๋ก ๋ณํํ ๊ฐ์ ๋๋ค. ๋น ๋ฌธ์์ด์ด ๋น ์๋ต์ผ๋ก ์ ์ก๋ฉ๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- ๋ ํ ๋ชจ๋ ReplyServerPrompt๋ก ํฅํฉ๋๋ค. ํจํค์ง ์ ํ ASCII/์ ๋์ฝ๋๋ ์ ์ฅ๋ ์๋ฒ ํ๋กฌํํธ ์ํ์ ๋ฐ๋ผ ์ ํ๋ฉ๋๋ค. ๋ช ๋ น ์ด๋ฆ์ ๋ณ๋์ ์ธ์ฝ๋ฉ์ ๊ฐ์ ํ์ง ์์ต๋๋ค. ํ์ฑ ํ๋กฌํํธ๊ฐ ์์ผ๋ฉด ๊ด๋ฆฌ์๋ ์๋ต์ ๋ณด๋ด์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.ConsoleEntryReply");
UO.ConsoleEntryReply("reply");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ์ก์ ํ์ฌ ์๋ฒ ์ ๋ ฅ ์์ฒญ์ ๋ํ๋ ๋๋ค.
UO.ConsoleEntryReply("reply");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ํ ์คํธ๋ ๋น ์๋ต์ผ๋ก ๊ด๋ฆฌ์์๊ฒ ์ ์ก๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.ConsoleEntryReply("");
return 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()
{
var reply = "New item name";
UO.ConsoleEntryReply(reply);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: text (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ReplyServerPrompt:bridge.ReplyServerPrompt(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "consoleentryreply":
case "consoleentryunicodereply": bridge.ReplyServerPrompt(Text(0)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ConsoleEntryUnicodeReply(object? text);MessageManager.SendServerPromptResponse๋ฅผ ํตํด ํ์ฑ ์๋ฒ ํ๋กฌํํธ์ ํ ์คํธ๋ก ์๋ตํฉ๋๋ค.
-
textโ ๋ฌธ์์ด๋ก ๋ณํํ ๊ฐ์ ๋๋ค. ๋น ๋ฌธ์์ด์ด ๋น ์๋ต์ผ๋ก ์ ์ก๋ฉ๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- ๋ ํ ๋ชจ๋ ReplyServerPrompt๋ก ํฅํฉ๋๋ค. ํจํค์ง ์ ํ ASCII/์ ๋์ฝ๋๋ ์ ์ฅ๋ ์๋ฒ ํ๋กฌํํธ ์ํ์ ๋ฐ๋ผ ์ ํ๋ฉ๋๋ค. ๋ช ๋ น ์ด๋ฆ์ ๋ณ๋์ ์ธ์ฝ๋ฉ์ ๊ฐ์ ํ์ง ์์ต๋๋ค. ํ์ฑ ํ๋กฌํํธ๊ฐ ์์ผ๋ฉด ๊ด๋ฆฌ์๋ ์๋ต์ ๋ณด๋ด์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.ConsoleEntryUnicodeReply");
UO.ConsoleEntryUnicodeReply("reply");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ์ก์ ํ์ฌ ์๋ฒ ์ ๋ ฅ ์์ฒญ์ ๋ํ๋ ๋๋ค.
UO.ConsoleEntryUnicodeReply("reply");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ํ ์คํธ๋ ๋น ์๋ต์ผ๋ก ๊ด๋ฆฌ์์๊ฒ ์ ์ก๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.ConsoleEntryUnicodeReply("");
return 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()
{
var reply = "New item name";
UO.ConsoleEntryUnicodeReply(reply);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: text (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ReplyServerPrompt:bridge.ReplyServerPrompt(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "consoleentryreply":
case "consoleentryunicodereply": bridge.ReplyServerPrompt(Text(0)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetContextMenu();ํ์ฌ ์ํฉ์ ๋ง๋ ๋ฉ๋ด ๋ชจ๋ธ์ ํญ๋ชฉ ๋ฌธ์์ด์ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
ServerMenus.Context.GetYokoItems()์ ๋ฌธ์์ด ๋ฐฐ์ด; ๋ชจ๋ธ์ด ์์ผ๋ฉด ๋น ๋ฐฐ์ด์ ๋๋ค.
- RequestContextMenu๋ฅผ ๋ณด๋ด์ง ์์ผ๋ฉฐ ์๋ฒ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ์๋ก์ด ๋ฉ๋ด๋ฅผ ์ป์ผ๋ ค๋ฉด ๋จผ์ ๋ณ๋๋ก ์์ฒญํ ํ ํด๋น ๋ชจ๋ธ์ด ๋ํ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ธ์. ClearContextMenu์ ์ฝ์ ํ ๋ชจ๋ธ์ ์ญ์ ํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetContextMenu();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ธฐ์กด ๋ชจ๋ธ์ ์ฝ์ต๋๋ค.
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฉ๋ด ๋ชจ๋ธ์ ์ง์๋ ์ ์ฅ๋ ๋ฐฐ์ด์ ์ฌ๋ผ์ง์ง ์์ต๋๋ค.
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.StringArray:StringArray(bridge.GetContextMenu()). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetContextMenu:bridge.GetContextMenu().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getcontextmenu": return StringArray(bridge.GetContextMenu());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetLastMenuItems();์ด๋ฏธ ์ด๋ ค ์๋ ๊ธฐ์กด ์๋ฒ ๋ฉ๋ด์ ํญ๋ชฉ์ ์ฝ์ด์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๋ฌธ์์ด ๋ฐฐ์ด. ํ๋ชฉ ์ด๋ฆ/์ค๋ช ์ค GetYokoItems. ์ ํฉํ ๋ฉ๋ด๊ฐ ์์ผ๋ฉด ๋น ๋ฐฐ์ด์ด ์์ฑ๋ฉ๋๋ค.
- ๋ง์ง๋ง ์ฌ์ง ๋ฉ๋ด ServerMenus๊ฐ ์ ํ๋์์ต๋๋ค. ์ด ๋ช ๋ น์ ๋ฉ๋ด๋ฅผ ์ด์ง ์๊ณ , ํํฌ๋ฅผ ๋ฐฐ์นํ์ง ์์ผ๋ฉฐ, ํญ๋ชฉ์ ์ ํํ์ง ์์ต๋๋ค. ์ด๊ฒ์ ์ํฉ์ ๋ง๋ ๋ฉ๋ด๋ ์ผ๋ฐ ์๋ฒ ๊ฒํ๊ฐ ์๋๋๋ค.
- ์์๋ ๋ชจ๋ธ์ ํฌ์ธํธ์ ํด๋นํฉ๋๋ค. ๋ชฉ๋ก์ ์ค๋ ์ท์ ๋๋ค. ํ์ ๋ฉ๋ด ๋ณ๊ฒฝ์ ์ ์ฅ๋ ๋ฐฐ์ด์ ์ ๋ฐ์ดํธํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetLastMenuItems();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ๋ฐฐ์ด์ ๋ฃจํ๋ก๋ถํฐ ์์ ํฉ๋๋ค.
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ๋ฑ์ค 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๋ฒ ๋ฉ๋ด๋ฅผ ์ทจ์ํ ํ์๋ ์ด๋ ์ด๋ ๊ณ์ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.StringArray:StringArray(bridge.GetLastMenuItems()). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLastMenuItems:bridge.GetLastMenuItems().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getlastmenuitems": return StringArray(bridge.GetLastMenuItems());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetMenuItems(object? caption);์ด๋ฏธ ์ด๋ ค ์๋ ๊ธฐ์กด ์๋ฒ ๋ฉ๋ด์ ํญ๋ชฉ์ ์ฝ์ด์ต๋๋ค.
-
captionโ ์ด์ ์๋ฒ ๋ฉ๋ด ์ ๋ชฉ์ ํ์ ๋ฌธ์์ด์ ๋๋ค. OrdinalIgnoreCase์ ๊ฒ์ํ์ธ์. ๋น ์ค์ ๋ชจ๋ ํค๋์ ์ผ์นํฉ๋๋ค.
๋ฌธ์์ด ๋ฐฐ์ด. ํ๋ชฉ ์ด๋ฆ/์ค๋ช ์ค GetYokoItems. ์ ํฉํ ๋ฉ๋ด๊ฐ ์์ผ๋ฉด ๋น ๋ฐฐ์ด์ด ์์ฑ๋ฉ๋๋ค.
- ์ผ์นํ๋ ์ ๋ชฉ ํ์ ๋ฌธ์์ด์ด ์๋ ๋ง์ง๋ง ๋น์ฒ๋ฆฌ ๋ฉ๋ด๊ฐ ์ ํ๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ๋ฉ๋ด๋ฅผ ์ด์ง ์๊ณ , ํํฌ๋ฅผ ๋ฐฐ์นํ์ง ์์ผ๋ฉฐ, ํญ๋ชฉ์ ์ ํํ์ง ์์ต๋๋ค. ์ด๊ฒ์ ์ํฉ์ ๋ง๋ ๋ฉ๋ด๋ ์ผ๋ฐ ์๋ฒ ๊ฒํ๊ฐ ์๋๋๋ค.
- ์์๋ ๋ชจ๋ธ์ ํฌ์ธํธ์ ํด๋นํฉ๋๋ค. ๋ชฉ๋ก์ ์ค๋ ์ท์ ๋๋ค. ํ์ ๋ฉ๋ด ๋ณ๊ฒฝ์ ์ ์ฅ๋ ๋ฐฐ์ด์ ์ ๋ฐ์ดํธํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetMenuItems("");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ๋ฐฐ์ด์ ๋ฃจํ๋ก๋ถํฐ ์์ ํฉ๋๋ค.
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ๋ฑ์ค 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๋ฒ ๋ฉ๋ด๋ฅผ ์ทจ์ํ ํ์๋ ์ด๋ ์ด๋ ๊ณ์ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: caption (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.StringArray:StringArray(bridge.GetMenuItems(Text(0), false)). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetMenuItems:bridge.GetMenuItems(Text(0), false). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getmenuitems": return StringArray(bridge.GetMenuItems(Text(0), false));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetMenuItemsEx(object? caption);์ด๋ฏธ ์ด๋ ค ์๋ ๊ธฐ์กด ์๋ฒ ๋ฉ๋ด์ ํญ๋ชฉ์ ์ฝ์ด์ต๋๋ค.
-
captionโ ์ด์ ์๋ฒ ๋ฉ๋ด ์ ๋ชฉ์ ํ์ ๋ฌธ์์ด์ ๋๋ค. OrdinalIgnoreCase์ ๊ฒ์ํ์ธ์. ๋น ์ค์ ๋ชจ๋ ํค๋์ ์ผ์นํฉ๋๋ค.
๋ฌธ์์ด ๋ฐฐ์ด. ๋ฌธ์์ด graphicHex|hueHex|index|์ด๋ฆ(์: 0x0001|0x0000|1|choice). ์ ํฉํ ๋ฉ๋ด๊ฐ ์์ผ๋ฉด ๋น ๋ฐฐ์ด์ด ์์ฑ๋ฉ๋๋ค.
- ์ผ์นํ๋ ์ ๋ชฉ ํ์ ๋ฌธ์์ด์ด ์๋ ๋ง์ง๋ง ๋น์ฒ๋ฆฌ ๋ฉ๋ด๊ฐ ์ ํ๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ๋ฉ๋ด๋ฅผ ์ด์ง ์๊ณ , ํํฌ๋ฅผ ๋ฐฐ์นํ์ง ์์ผ๋ฉฐ, ํญ๋ชฉ์ ์ ํํ์ง ์์ต๋๋ค. ์ด๊ฒ์ ์ํฉ์ ๋ง๋ ๋ฉ๋ด๋ ์ผ๋ฐ ์๋ฒ ๊ฒํ๊ฐ ์๋๋๋ค.
- ์์๋ ๋ชจ๋ธ์ ํฌ์ธํธ์ ํด๋นํฉ๋๋ค. ๋ชฉ๋ก์ ์ค๋ ์ท์ ๋๋ค. ํ์ ๋ฉ๋ด ๋ณ๊ฒฝ์ ์ ์ฅ๋ ๋ฐฐ์ด์ ์ ๋ฐ์ดํธํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetMenuItemsEx("");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ๋ฐฐ์ด์ ๋ฃจํ๋ก๋ถํฐ ์์ ํฉ๋๋ค.
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ๋ฑ์ค 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๋ฒ ๋ฉ๋ด๋ฅผ ์ทจ์ํ ํ์๋ ์ด๋ ์ด๋ ๊ณ์ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: caption (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.StringArray:StringArray(bridge.GetMenuItems(Text(0), true)). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetMenuItems:bridge.GetMenuItems(Text(0), true). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getmenuitemsex": return StringArray(bridge.GetMenuItems(Text(0), true));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.MenuHookPresent();๋ฑ๋ก๋ ๋ฉ๋ด ํํฌ์ ์กด์ฌ๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
์ซ์ ํ๋๊ทธ int: 1 - _manager.HasMenuHooks, 0 - ํํฌ๊ฐ ์์ต๋๋ค. ๋ฉ๋ด ์์ฒด๊ฐ ์ฌ์ ํ ๋๋ฝ๋์์ ์ ์์ต๋๋ค.
- ๋ฑ๋ก๋ ๋ฉ๋ด ํํฌ์ ์กด์ฌ๋ฅผ ์ฝ์ต๋๋ค. ๋ฉ๋ด๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ , ์๋ฒ ๊ฒํ๋ฅผ ํ์ธํ์ง ์์ผ๋ฉฐ, Hook์ ์๋ชจํ์ง ์์ต๋๋ค.
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.MenuHookPresent();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฑ๋ก๋ ๋ฉ๋ด ํํฌ์ ์กด์ฌ๋ฅผ ์ฝ์ต๋๋ค.
UO.Print(UO.MenuHookPresent());๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฑ๋ก๋ ๋ฉ๋ด ํํฌ์ ์กด์ฌ๋ฅผ ์ฝ์ต๋๋ค. ๋ฉ๋ด๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ , ์๋ฒ ๊ฒํ๋ฅผ ํ์ธํ์ง ์์ผ๋ฉฐ, Hook์ ์๋ชจํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.WaitMenu("Craft", "Tools");
UO.Print(UO.MenuHookPresent());
return 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()
{
var before = UO.MenuHookPresent();
UO.Wait(500);
var after = UO.MenuHookPresent();
UO.Print(before);
UO.Print(after);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.MenuHookPresent:bridge.MenuHookPresent().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "menuhookpresent": return new InjectionValue(bridge.MenuHookPresent());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.MenuPresent();MenuPresent๊ฐ WaitingMenu์๊ฒ ์ง์ ์ ํ๋ฅผ ๊ฒ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
์ซ์ ํ๋๊ทธ int: 1 - ์๋ฒ ๋ฉ๋ด๊ฐ ์์ต๋๋ค. 0 - ์๋์.
- MenuPresent๊ฐ WaitingMenu์๊ฒ ์ง์ ์ ํ๋ฅผ ๊ฒ๋๋ค. GetGumpsCount, ์ปจํ ์คํธ ๋ฉ๋ด, ๋ฑ๋ก๋ Hook์ ํ์ธํ์ง ์์ต๋๋ค.
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.MenuPresent();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- MenuPresent๊ฐ WaitingMenu์๊ฒ ์ง์ ์ ํ๋ฅผ ๊ฒ๋๋ค.
UO.Print(UO.MenuPresent());๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.MenuPresent:bridge.MenuPresent().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "menupresent": return new InjectionValue(bridge.MenuPresent());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.RequestContextMenu(object? objID);๊ฐ์ฒด์ ์ํฉ์ ๋ง๋ ๋ฉ๋ด๋ฅผ ์์ฒญํฉ๋๋ค.
-
objIDโ ์ง๋ ฌ/ID ๊ฐ์ฒด: int, ์ซ์/16์ง์ ๋ฌธ์์ด ๋๋ ์ค์ ๋ ๋ณ์นญ(์: "lasttarget"). ์ด๊ฒ์ graphic/type๊ฐ ์๋๋๋ค. ์กฐ์น๋ฅผ ์ทจํ๊ธฐ ์ ์ ๋ก๋๋ ๊ฐ์ฒด๋ฅผ ํ์ธํ์ญ์์ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ๋ธ๋ฆฌ์ง ํตํ GameActions.OpenPopupMenu. ๋ต๋ณ์ ๋ณ๋๋ก ์ ์ฅ๋์ด GetContextMenu๋ก ์ฝํ์ง๋๋ค. ์ด ๋ช ๋ น์ ๋ฉ๋ด ํ์์ค์ ์ ํํ์ง ์์ต๋๋ค.
- Bridge๋ ๊ฒ์ ์คํธ๋ฆผ์ ๋ํ ์์ฒญ์ ๋ณด๋ ๋๋ค. ์๋ฒ ๊ท์น์ด ์ ์ฉ๋ฉ๋๋ค. ํ์ธ์ ๊ธฐ๋ค๋ฆฌ๋ ๋ด์ฅ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.RequestContextMenu");
UO.RequestContextMenu(UO.GetSerial("lasttarget"));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ฒด์ ์ํฉ์ ๋ง๋ ๋ฉ๋ด๋ฅผ ์์ฒญํฉ๋๋ค.
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ธ๋ฆฌ์ง ํตํ 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.RequestContextMenu:bridge.RequestContextMenu(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "requestcontextmenu": bridge.RequestContextMenu(Arg(0)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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๋ง ์ฌ์ฉํ์ธ์. ํธ์ถ ์์ฒด๋ ์๋ฒ ์์ ์ ์ฐจ๋จํ๊ฑฐ๋ ํ์ธํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SetContextMenuHook");
UO.SetContextMenuHook(0, 0);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ํฉ์ ๋ง๋ ๋ฉ๋ด ํญ๋ชฉ์ ์ผํ์ฑ ์ ํ์ ๋ฑ๋กํฉ๋๋ค.
UO.SetContextMenuHook(0, 0);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: menuID (Any), entryNumber (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetContextMenuHook:bridge.SetContextMenuHook(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "setcontextmenuhook": bridge.SetContextMenuHook(Arg(0), Arg(1)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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๊ฐ ํฌํจ๋์ด ์๊ณ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋ ์ฒซ ๋ฒ์งธ ํญ๋ชฉ์ ์ ํํฉ๋๋ค. ๋น ํ ์คํธ๋ ๋๊ตฌ์๊ฒ๋ ์ ํฉํฉ๋๋ค. ์ซ์ ํ ์คํธ๋ ์์ธ์ด ์๋ ์ด๋ฆ์ ์ผ๋ถ์ ๋๋ค. ์ฑ๊ณต์ ์ผ๋ก ์ ํํ๋ฉด ์๋ต์ด ์ ์ก๋๊ณ ๋ก์ปฌ ๋ฉ๋ด๊ฐ ๋ซํ๋๋ค. ์ผํ์ฑ ํํฌ๋ ์ ํํ ํ์๋ง ์ญ์ ๋ฉ๋๋ค. ์๊ตฌ ํํฌ๊ฐ ๋จ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.WaitMenu");
UO.WaitMenu("Craft", "Tools");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ผํ์ฑ ๋ฉ๋ด ํํฌ๋ฅผ ์ต๋ 3๊ฐ๊น์ง ๋ฑ๋กํฉ๋๋ค.
UO.WaitMenu("Craft", "Tools");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ ์์ _manager.AddMenuHook(ํ๋กฌํํธ, ์ ํ, false)๋ก ์ ๋ฌ๋ฉ๋๋ค. ๋ฑ๋ก๋ ์์์ 2/4/6 ์ธ์์ ๋๋ค. false๋ ์ผํ์ฉ ํํฌ๋ฅผ ๋ํ๋ ๋๋ค. AutoMenu/๋ ์ธ์ VendorMenu ์์ ํํฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.WaitMenu("Craft", "Tools", "Tools", "Shovel");
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฉ๋ด๊ฐ ๋ํ๋ ๋๊น์ง ์คํฌ๋ฆฝํธ๋ฅผ ์ฐจ๋จํ์ง ์์ต๋๋ค. ๋ฉ๋ด๊ฐ ์ ํฉํ ๊ฒฝ์ฐ ๊ด๋ฆฌ์๊ฐ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: menuCaption (Any/String), elementCaption (Any/String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WaitMenu:bridge.WaitMenu(arguments.Select(value => value.ToString()).ToArray()). -
InjectionScript.Runtime.InjectionValue.ToString:value.ToString().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "waitmenu": bridge.WaitMenu(arguments.Select(value => value.ToString()).ToArray()); return InjectionValue.Unit;๋งค๊ฐ๋ณ์: menuCaption (Any/String), elementCaption (Any/String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void WaitMenu(string prompt, string choice)
=> bridge.WaitMenu(prompt, choice);๋งค๊ฐ๋ณ์: 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);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.WaitTextEntry(object? value);ํ์ฌ ๊ฒํ์ ํ ์คํธ ํญ๋ชฉ์ ํ ์คํธ๋ฅผ ์ฐ๋ ค๊ณ ํฉ๋๋ค.
-
valueโ ToString์ ํตํ ํ ์คํธ; ์ ์ก๋ ์ํ๋ก ์ ์ฅ๋ฉ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ExecuteClientApiCompatibility๋ SetGumpValue(-1, "textentry", -1, Text(0))๋ฅผ ํธ์ถํฉ๋๋ค. key=-1๋ ์ผ๋ฐ์ ์ธ null ์ธ๋ฑ์ค๊ฐ ์๋๋๋ค. ๊ฒํ ๊ตฌํ์์ ๊ธฐ์กด ํ๋๊ฐ ID์ ๋งคํ๋๋ ๊ฒฝ์ฐ์๋ง ์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
- ํฅํ ๊ฒํ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ํ๋กฌํํธ๋ฅผ ์ด์ง ์์ผ๋ฉฐ ํํฌ๋ฅผ ๋ฑ๋กํ์ง ์์ต๋๋ค. ์ผ์นํ๋ ํ๋๊ฐ ์์ผ๋ฉด SetGumpValue ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค. ์๋ ค์ง ํ๋์ ๊ฒฝ์ฐ ๋ช ์์ ์ธ ID/index์ ํจ๊ป SetGump๋ฅผ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.WaitTextEntry");
UO.WaitTextEntry("Example");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ๊ฒํ์ ํ ์คํธ ํญ๋ชฉ์ ํ ์คํธ๋ฅผ ์ฐ๋ ค๊ณ ํฉ๋๋ค.
UO.WaitTextEntry("Example");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํฅํ ๊ฒํ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ํ๋กฌํํธ๋ฅผ ์ด์ง ์์ผ๋ฉฐ ํํฌ๋ฅผ ๋ฑ๋กํ์ง ์์ต๋๋ค. ์ผ์นํ๋ ํ๋๊ฐ ์์ผ๋ฉด 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetGumpValue:bridge.SetGumpValue(-1, "textentry", -1, Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "waittextentry": bridge.SetGumpValue(-1, "textentry", -1, Text(0)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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; ํค๋๋ ํ์ ๋ฌธ์์ด์ด ์๋ ์์๋ก ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.WaitingForMenu(3000);
UO.Print("WaitingForMenu: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ํ ์๋ฒ ๋ฉ๋ด ํ์ ํ์๋ ์ ํ๋์ด ์์ต๋๋ค.
UO.Print(UO.WaitingForMenu(3000));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- TriggerWaitAction๊ฐ GetLastMenuIdentity์ ์ฝ์ ํ; ์๋ก์ด ์ ์์ ์นด์ดํฐ๋ฅผ ์ฆ๊ฐ์ํต๋๋ค. ๋น ID๋ ์ด์ ID์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ค์ ํ๋ฏ๋ก ๋ซ๊ฑฐ๋ ๋ค์ ์ฐ ํ์ ๋์ผํ ๋ฉ๋ด๋ฅผ ๋ค์ ๊ณ์ฐํ ์ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.WaitingForMenu(3000, 1, 1, "Craft"));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ ๊ฒฝ๊ณ๋ ์ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: delay (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.WaitingForMenu. -
InjectionScript.Runtime.InjectionApiUO.WaitingForMenu:WaitingForMenu(delay, InjectionValue.Zero, InjectionValue.Zero, new InjectionValue(string.Empty), InjectionValue.Zero).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int WaitingForMenu(InjectionValue delay) => WaitingForMenu(delay, InjectionValue.Zero, InjectionValue.Zero, new InjectionValue(string.Empty), InjectionValue.Zero);๋งค๊ฐ๋ณ์: delay (Any), menuCount (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.WaitingForMenu. -
InjectionScript.Runtime.InjectionApiUO.WaitingForMenu:WaitingForMenu(delay, menuCount, InjectionValue.Zero, new InjectionValue(string.Empty), InjectionValue.Zero).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int WaitingForMenu(InjectionValue delay, InjectionValue menuCount) => WaitingForMenu(delay, menuCount, InjectionValue.Zero, new InjectionValue(string.Empty), InjectionValue.Zero);๋งค๊ฐ๋ณ์: delay (Any), menuCount (Any), blockMenu (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.WaitingForMenu. -
InjectionScript.Runtime.InjectionApiUO.WaitingForMenu:WaitingForMenu(delay, menuCount, blockMenu, new InjectionValue(string.Empty), InjectionValue.Zero).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int WaitingForMenu(InjectionValue delay, InjectionValue menuCount, InjectionValue blockMenu) => WaitingForMenu(delay, menuCount, blockMenu, new InjectionValue(string.Empty), InjectionValue.Zero);๋งค๊ฐ๋ณ์: delay (Any), menuCount (Any), blockMenu (Any), menuName (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.WaitingForMenu. -
InjectionScript.Runtime.InjectionApiUO.WaitingForMenu:WaitingForMenu(delay, menuCount, blockMenu, menuName, InjectionValue.Zero).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.WaitingForMenu. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(delayValue). -
InjectionScript.Runtime.InjectionValue.ToString:menuNameValue.ToString(). -
InjectionScript.Runtime.InjectionApiUO.TriggerWaitAction:TriggerWaitAction(skillOrSerial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLastMenuIdentity:bridge.GetLastMenuIdentity(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLastMenuCaption:bridge.GetLastMenuCaption(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CloseMenu:bridge.CloseMenu(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Wait:bridge.Wait(Math.Min(25, Math.Max(1, delay))).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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;
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.WaitingMenu();_world.ServerMenus.Snapshot().Length != 0์ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
์ซ์ ํ๋๊ทธ int: 1 - ServerMenus์๋ ํ๋ ์ด์์ ๋ฉ๋ด๊ฐ ์๊ณ , 0 -์๋ ์์ต๋๋ค. ์ด๊ฒ์ ์คํฌ๋ฆฝํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ฉ๋ด๋ฅผ ๊ฐ๋ ๊ฒ์ ๋๋ค.
- _world.ServerMenus.Snapshot().Length != 0์ ์ฝ์ต๋๋ค. ๋ ๊ฑฐ์ ์๋ฒ ๋ฉ๋ด๋ ์ผ๋ฐ ์๋ฒ ๊ฒํ ๋ฐ ์ํฉ์ ๋ง๋ ๋ฉ๋ด์ ๋ณ๊ฐ์ ๋๋ค.
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.WaitingMenu();
UO.Print("WaitingMenu: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- _world.ServerMenus.Snapshot().Length != 0์ ์ฝ์ต๋๋ค.
UO.Print(UO.WaitingMenu());๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- _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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.WaitingMenu. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WaitingMenu:bridge.WaitingMenu().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int WaitingMenu() => bridge.WaitingMenu();