KO UO Topic speech chat - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
ํ ยท C# ยท IDE ยท UO API ยท AโZ ยท ์ ยท ์ธ์ด
์บ๋ฆญํฐ ์์ฑ, ๊ฐ์ , ์ฑํ ์ฑ๋ ๋ฐ ํํฐ. ํด๋ผ์ด์ธํธ์ ๋ก์ปฌ ๋ฉ์์ง ์ธ์๋ ํด๋ผ์ด์ธํธ UI์ ์์ต๋๋ค.
| ์ฃผ์ | ๋ช ๋ น ๋ฐ ์ค๋ช |
|---|---|
| Say | UO.Say |
| SayU | UO.SayU |
| UOSay | UO.UOSay |
| Emote | UO.EmoteAction ยท UO.Bow ยท UO.Salute |
| Speech Filters | UO.FilterSpeech |
| Global Chat | UO.GlobalChatSendMsg ยท UO.GlobalChatActiveChannel |
| Channels | UO.GlobalChatChannelsList ยท UO.GlobalChatJoinChannel ยท UO.GlobalChatLeaveChannel |
| Ignore Users | UO.AddChatUserIgnore ยท UO.ClearChatUserIgnore |
UO.Say ยท UO.SayU ยท UO.UOSay ยท UO.UOSayColor ยท UO.Msg ยท UO.UOAMessage ยท UO.FixTalk
UO.Bow ยท UO.Salute ยท UO.EmoteAction
UO.FilterSpeech ยท UO.AddChatUserIgnore ยท UO.ClearChatUserIgnore ยท UO.GlobalChatActiveChannel ยท UO.GlobalChatChannelsList ยท UO.GlobalChatJoinChannel ยท UO.GlobalChatLeaveChannel ยท UO.GlobalChatSendMsg
๊ฐ ๋ช ๋ น ์นด๋์๋ ์ง์ ์ฝ๋, ํจ์ ๋ฐ ํด๋์ค ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๋ค์์ ์ ํ๋ ์งง์ ์๋๋ฆฌ์ค์ ๋๋ค. ์ ํ์ฌํญ๊ณผ ์ ์ฒด ๋ถ์์ด ์นด๋์ ํฌํจ๋์ด ์์ต๋๋ค.
๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
if (Truth(UO.Connected()))
{
UO.Say("bank");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
UO.GlobalChatSendMsg("Hello");ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.AddChatUserIgnore(object? userName);๋ก์ปฌ ๋ก๊ทธ ๋ฉ์์ง ํํฐ๋ง ๋ชฉ๋ก์ ๋ณด๋ธ ์ฌ๋์ ์ด๋ฆ์ ์ถ๊ฐํฉ๋๋ค. ํํฐ๋ ์ด ํด๋ผ์ด์ธํธ์์ ์๋ํ๋ฉฐ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด์ง ์์ต๋๋ค.
-
userName๋ ๋ก๊ทธ ๋ณด๋ธ ์ฌ๋์ ์ด๋ฆ์ ๋๋ค. ๋น์ด ์๊ฑฐ๋ ๊ณต๋ฐฑ์ด ํฌํจ๋ ๊ฐ์ ๋ฌด์๋ฉ๋๋ค. ๊ฐ์ฅ์๋ฆฌ ๊ณต๊ฐ์ด ์ ๊ฑฐ๋ฉ๋๋ค.
void. ์ด ๋ช
๋ น์ ์ฑ๊ณต์ ์ธ ์ถ๊ฐ๋ฅผ ๋ฐํํ์ง ์์ต๋๋ค.
- ๋ณด๋ธ ์ฌ๋ ์ด๋ฆ ๋น๊ต์์๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค. ์ผ์นํ๋ ์ด๋ฆ์ ๋ฉ์์ง๋ ๋ก์ปฌ ๋ก๊ทธ ํํฐ์ ์ํด ์จ๊ฒจ์ง๋๋ค. ์ด๋ ์๋ฒ์ ํ๋ ์ด์ด๋ฅผ ์ฐจ๋จํ๋ ๊ฒ์ด ์๋๋๋ค.
UO.ClearChatUserIgnore()์ ์ฒด ๋ก์ปฌ ์ด๋ฆ ๋ชฉ๋ก์ ์ง์๋๋ค. ํํฐ๋ฅผ ์ง์๋ ์ด๋ฏธ ํ์์์ ์ ์ธ๋ ๊ธฐ๋ก์ ๋ณต์๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.AddChatUserIgnore");
UO.AddChatUserIgnore("ExampleVendor");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ํ ๋ํธ์์ ์ด ์ด๋ฆ์ผ๋ก ์ ๋ก๊ทธ ํญ๋ชฉ์ ์จ๊น๋๋ค.
UO.AddChatUserIgnore("ExampleVendor");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฌธ์์ด ๋ณ์๋ฅผ ํตํด ์ด๋ฆ์ ์ ๋ฌํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var sender = "ExampleVendor";
UO.AddChatUserIgnore(sender);
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.AddChatUserIgnore("ExampleVendor");
UO.AddChatUserIgnore("ExamplePlayer");
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: userName (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.AddChatUserIgnore:bridge.AddChatUserIgnore(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "addchatuserignore": bridge.AddChatUserIgnore(Text(0)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.Bow();GameActions.EmoteAction์ ํตํด ํ ์บ๋ฆญํฐ์ ๋์์ ๋ณด๋ ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- ์บ๋ฆญํฐ์ ์ ๋๋ฉ์ด์ /์ก์ ์ ๋๋ค. ์ด ๋ช ๋ น์ ์๋ฒ ํ์ธ์ ๋ฐํํ์ง ์์ผ๋ฉฐ ์ ๋๋ฉ์ด์ ์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.Bow");
UO.Bow();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ ํ๋๋ฅผ ๋ณด๋ด์ญ์์ค.
UO.Bow();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ ์ ๋ณด๋ด๊ธฐ ์ ์ ์ฐ๊ฒฐ์ ํ์ธํ์ธ์.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Connected()))
{
UO.Bow();
}
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()
{
Greet();
return null;
}
void Greet()
{
UO.Bow();
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Bow:bridge.Bow().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "bow": bridge.Bow(); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ClearChatUserIgnore();๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋ ๋ชจ๋ ๋ณด๋ธ ์ฌ๋ ์ด๋ฆ ํํฐ JournalManager๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- ํํฐ๋ฅผ ์ ๊ฑฐํด๋ ๊ธฐ๋ก ํญ๋ชฉ์ด ์ญ์ ๋๊ฑฐ๋ AddJournalIgnore ํ ์คํธ ํํฐ๊ฐ ์ทจ์๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.ClearChatUserIgnore");
UO.ClearChatUserIgnore();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋ ๋ชจ๋ ๋ณด๋ธ ์ฌ๋ ์ด๋ฆ ํํฐ JournalManager๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
UO.ClearChatUserIgnore();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ณต๊ธ์ ์ฒด๋ฅผ ๋์ ํ์ฌ ๋ฉ์์ง ํ์๋ฅผ ๋ค์ ํ์ฑํํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.AddChatUserIgnore("Vendor");
UO.ClearChatUserIgnore();
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.ClearChatUserIgnore();
UO.ClearChatUserIgnore();
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ClearChatUserIgnore:bridge.ClearChatUserIgnore().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "clearchatuserignore": bridge.ClearChatUserIgnore(); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.EmoteAction(object? action);์บ๋ฆญํฐ ์ก์ /์ ๋๋ฉ์ด์ ๋ฌธ์์ด ์ด๋ฆ์ GameActions.EmoteAction๋ก ๋ณด๋ ๋๋ค.
-
actionโ ์ธ์ฌ๋ ๊ฒฝ๋ก์ ๊ฐ์ ๋์ ์ด๋ฆ. string๋ก ๋ณํ๋์์ต๋๋ค. ๋์ ์ธ์์ GameActions์ ์ํด ์ํ๋ฉ๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- ์ด๊ฒ์ ์ก์ง์ ๋ฌธ๊ตฌ๋ฅผ ์ธ์ํ๋ ๊ฒ์ด ์๋๋ผ ์บ๋ฆญํฐ ์ก์ ์ ๋๋ค. ์ด ๋ช ๋ น์ ์๋ฒ ํ์ธ์ ๋ฐํํ์ง ์์ผ๋ฉฐ ์ ๋๋ฉ์ด์ ์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.EmoteAction");
UO.EmoteAction("bow");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ก์ ์ด๋ฆ์ ํ์ ๋๋ค.
UO.EmoteAction("bow");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ ์ด๋ฆ ๊ฒฝ๋ก๊ฐ ์ ๋ฌ๋์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.EmoteAction("salute");
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 action = "bow";
UO.EmoteAction(action);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: action (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.EmoteAction:bridge.EmoteAction(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Text:Text(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "emoteaction": bridge.EmoteAction(Text(0)); break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.FilterSpeech();
void UO.FilterSpeech(object? enabled);ํด๋ผ์ด์ธํธ ์์ฑ ํํฐ๋ฅผ ํ์ฑํํ๊ฑฐ๋ ๋นํ์ฑํํฉ๋๋ค.
-
enabledโ ์ ํ ๊ฐ: ์ธ์๊ฐ ์์ผ๋ฉด ํํฐ๊ฐ ์ผ์ง๋๋ค. 0๊ฐ ๊บผ์ง๊ณ 0์ด ์๋ int๊ฐ ์ผ์ง๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- ์ ๊ทํ๋ ํ๋๊ทธ๋ฅผ ๋ฐํ์ ์ํ์ ์ฐ๊ณ ์ด๋ฅผ ๊ด๋ฆฌ์์๊ฒ ์ ๋ฌํฉ๋๋ค. ํํฐ๋ ํด๋ผ์ด์ธํธ์ ์ฒ๋ฆฌ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์๋ฒ ์ด๋ฒคํธ์ ๊ธฐํ ๋ก๊ทธ ์ค์ ์ ๋ณ๋๋ก ์ ์ง๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.FilterSpeech");
UO.FilterSpeech();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์ ์๊ฐ 0์ด๋ฉด ์ฝ๊ธฐ๊ฐ ์๋ ํฌํจ์ ์๋ฏธํฉ๋๋ค.
UO.FilterSpeech();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ช ์์ ์ธ 0๋ ํด๋ผ์ด์ธํธ ํํฐ๋ฅผ ๋๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.FilterSpeech(0);
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.FilterSpeech(1);
UO.FilterSpeech(0);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetSpeechFilter:bridge.SetSpeechFilter(state.SpeechFilter).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "filterspeech": state.SpeechFilter = arguments.Length == 0 || Arg(0) != 0 ? 1 : 0; bridge.SetSpeechFilter(state.SpeechFilter); break;๋งค๊ฐ๋ณ์: enabled (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetSpeechFilter:bridge.SetSpeechFilter(state.SpeechFilter).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "filterspeech": state.SpeechFilter = arguments.Length == 0 || Arg(0) != 0 ? 1 : 0; bridge.SetSpeechFilter(state.SpeechFilter); break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.FixTalk();๋ ๊ฑฐ์ ๋ค์ดํฐ๋ธ ํด๋ผ์ด์ธํธ ํจ์น FixTalk๊ฐ ํ์ํ์ง ์์ ClassicUO์ ์๋ฆฌ๋ ์๋ฆผ์ ์ธ์ํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- ExecuteLegacyManualAlias ๋ถ๊ธฐ๋ SystemMessage๋ง ํธ์ถํฉ๋๋ค. ๋์, ์์ฑ, ์ปจํ ์ด๋ ๋๋ ๋คํธ์ํฌ ํ๋กํ ์ฝ์ ์์ ๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.FixTalk");
UO.FixTalk();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฉ์์ง๋ ์ด์ ํจ์น๊ฐ ํ์ํ์ง ์์์ ์ค๋ช ํฉ๋๋ค.
UO.FixTalk();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํธํ์ฑ ์ ์ฐจ๋ ๊ฒ์ ์ธ๊ณ๋ฅผ ๋ฐ๊พธ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
CompatibilityNotice();
return null;
}
void CompatibilityNotice()
{
UO.FixTalk();
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ง๋จ ๋ฉ์์ง ํ์ ์คํ์ด ๊ณ์๋ฉ๋๋ค.
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.FixTalk();
UO.Print("continued");
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage($"{name}: obsolete native-client patch; ClassicUO does not require it.").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "boxhack":
case "fixtalk":
case "fixwalk":
SystemMessage($"{name}: obsolete native-client patch; ClassicUO does not require it.");
break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GlobalChatActiveChannel();ChatManager.CurrentChannelName์ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
string โ CurrentChannelName ๋๋ ์ฑ๋์ด ์ ํ๋์ง ์์ ๊ฒฝ์ฐ ๋น ๋ฌธ์์ด์ ๋๋ค.
- ChatManager.CurrentChannelName์ ์ฝ์ต๋๋ค. ๋น ์ค - ์ด๋ฆ ์์, ์ค๋ฅ ์ฝ๋ ์์; ์ฑ๋ ์์ฒด๋ ์ ๋ ฅ๋์ง ์์ต๋๋ค.
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GlobalChatActiveChannel();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ChatManager.CurrentChannelName์ ์ฝ์ต๋๋ค.
UO.Print(UO.GlobalChatActiveChannel());๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ChatManager.CurrentChannelName์ ์ฝ์ต๋๋ค. ๋น ์ค - ์ด๋ฆ ์์, ์ค๋ฅ ์ฝ๋ ์์; ์ฑ๋ ์์ฒด๋ ์ ๋ ฅ๋์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var channel = UO.GlobalChatActiveChannel();
if (Truth(Len(channel) > 0))
{
UO.Print(channel);
}
return null;
}
int Len(object? value) => Convert.ToString(value)?.Length ?? 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
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.GlobalChatActiveChannel();
UO.Wait(500);
var after = UO.GlobalChatActiveChannel();
UO.Print(before);
UO.Print(after);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GlobalChatActiveChannel:bridge.GlobalChatActiveChannel().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "globalchatactivechannel": return new InjectionValue(bridge.GlobalChatActiveChannel());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GlobalChatChannelsList();Bridge๋ ChatManager.Channels.Keys.OrderBy(์ด๋ฆ => ์ด๋ฆ)์ ๋ฐํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
์ด๋ฆ๋ณ๋ก ์ ๋ ฌ๋ ์ฑ๋ ์ด๋ฆ ๋ฌธ์์ด ๋ฐฐ์ด์ ๋๋ค. ๋น ๋ก์ปฌ ํ ์ด๋ธ์ ๋น ๋ฐฐ์ด์ ์์ฑํฉ๋๋ค.
- Bridge๋ ChatManager.Channels.Keys.OrderBy(์ด๋ฆ => ์ด๋ฆ)์ ๋ฐํํฉ๋๋ค. ๋ชฉ๋ก์ ํด๋ผ์ด์ธํธ์ ์๋ ค์ง๋ฉฐ ์๋ฒ๊ฐ ์ ๋ฐ์ดํธ๋ ๋๊น์ง ์๋ฃ๋์ง ์์ ์ ์์ต๋๋ค.
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GlobalChatChannelsList();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Bridge๋ ChatManager.Channels.Keys.OrderBy(์ด๋ฆ => ์ด๋ฆ)์ ๋ฐํํฉ๋๋ค.
var channels = UO.GlobalChatChannelsList();
UO.Print(UO.GetArrayLength(channels));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Bridge๋ ChatManager.Channels.Keys.OrderBy(์ด๋ฆ => ์ด๋ฆ)์ ๋ฐํํฉ๋๋ค. ๋ชฉ๋ก์ ํด๋ผ์ด์ธํธ์ ์๋ ค์ง๋ฉฐ ์๋ฒ๊ฐ ์ ๋ฐ์ดํธ๋ ๋๊น์ง ์๋ฃ๋์ง ์์ ์ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var channels = UO.GlobalChatChannelsList();
if (Truth(UO.GetArrayLength(channels) > 0))
{
UO.Print(channels[0]);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
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.GlobalChatChannelsList();
UO.Wait(500);
var after = UO.GlobalChatChannelsList();
UO.Print(before);
UO.Print(after);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.StringArray:StringArray(bridge.GlobalChatChannels()). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GlobalChatChannels:bridge.GlobalChatChannels().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "globalchatchannelslist": return StringArray(bridge.GlobalChatChannels());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.GlobalChatJoinChannel(object? chName);๊ธ๋ก๋ฒ ์ฑํ ์ฑ๋์ ์ ์ฅ์ ์์ฒญํฉ๋๋ค.
-
chNameโ ToString์ ํตํ ํ ์คํธ; ์ ์ก๋ ์ํ๋ก ์ ์ฅ๋ฉ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ์ฃผ์ด์ง ์ฑ๋ ์ด๋ฆ์ผ๋ก Send_ChatJoinCommand๋ฅผ ๋ณด๋ ๋๋ค. ์ฑ๋์ ์กด์ฌ ์ฌ๋ถ์ ์ ์ฅ ๊ถํ์ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. ๋ก์ปฌ ํ์ฑ ์ฑ๋์ ์ด๋ฆ์ ๋ณ๋๋ก ์ฝํ์ง๋๋ค.
- Bridge๋ ๊ฒ์ ์คํธ๋ฆผ์ ๋ํ ์์ฒญ์ ๋ณด๋ ๋๋ค. ์๋ฒ ๊ท์น์ด ์ ์ฉ๋ฉ๋๋ค. ํ์ธ์ ๊ธฐ๋ค๋ฆฌ๋ ๋ด์ฅ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.GlobalChatJoinChannel");
UO.GlobalChatJoinChannel("General");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ธ๋ก๋ฒ ์ฑํ ์ฑ๋์ ์ ์ฅ์ ์์ฒญํฉ๋๋ค.
UO.GlobalChatJoinChannel("General");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฃผ์ด์ง ์ฑ๋ ์ด๋ฆ์ผ๋ก Send_ChatJoinCommand๋ฅผ ๋ณด๋ ๋๋ค. ์ฑ๋์ ์กด์ฌ ์ฌ๋ถ์ ์ ์ฅ ๊ถํ์ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. ๋ก์ปฌ ํ์ฑ ์ฑ๋์ ์ด๋ฆ์ ๋ณ๋๋ก ์ฝํ์ง๋๋ค.
return RunScenario();
object? RunScenario()
{
var message = "General";
if (Truth(UO.IsOnline()))
{
UO.GlobalChatJoinChannel(message);
}
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()
{
SendText("General");
return null;
}
void SendText(dynamic message)
{
if (Truth(Len(message) > 0))
{
UO.GlobalChatJoinChannel(message);
}
}
int Len(object? value) => Convert.ToString(value)?.Length ?? 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: chName (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GlobalChatJoin:bridge.GlobalChatJoin(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "globalchatjoinchannel": bridge.GlobalChatJoin(Text(0)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.GlobalChatLeaveChannel();๊ธ๋ก๋ฒ ์ฑํ ์ฑ๋ ํํด๋ฅผ ์์ฒญํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- GlobalChatLeave๋ Send_ChatLeaveChannelCommand๋ฅผ ๋ณด๋ ๋๋ค. ์ฑํ ๋ฐ์ดํฐ๊ฐ ์ฒ๋ฆฌ๋ ํ ๋ก์ปฌ ์ฑ๋ ์ด๋ฆ์ด ๋ณ๊ฒฝ๋ฉ๋๋ค.
- ์์ ์์ UO.Wait๋ ์คํฌ๋ฆฝํธ ์ผ์ ์ค์ง๋ง ์ง์ ํฉ๋๋ค. ์ผ์ ์ค์ง๊ฐ ๋๋ฌ๋ค๊ณ ํด์ ์๋ฒ๊ฐ ์์ฒญ์ ์๋ฃํ์์ ์ฆ๋ช ํ๋ ๊ฒ์ ์๋๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.GlobalChatLeaveChannel");
UO.GlobalChatLeaveChannel();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ธ๋ก๋ฒ ์ฑํ ์ฑ๋ ํํด๋ฅผ ์์ฒญํฉ๋๋ค.
UO.GlobalChatLeaveChannel();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- GlobalChatLeave๋ Send_ChatLeaveChannelCommand๋ฅผ ๋ณด๋ ๋๋ค. ์ฑํ ๋ฐ์ดํฐ๊ฐ ์ฒ๋ฆฌ๋ ํ ๋ก์ปฌ ์ฑ๋ ์ด๋ฆ์ด ๋ณ๊ฒฝ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.GlobalChatActiveChannel());
UO.GlobalChatLeaveChannel();
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ ์์ UO.Wait๋ ์คํฌ๋ฆฝํธ ์ผ์ ์ค์ง๋ง ์ง์ ํฉ๋๋ค. ์ผ์ ์ค์ง๊ฐ ๋๋ฌ๋ค๊ณ ํด์ ์๋ฒ๊ฐ ์์ฒญ์ ์๋ฃํ์์ ์ฆ๋ช ํ๋ ๊ฒ์ ์๋๋๋ค.
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.GlobalChatLeaveChannel();
UO.Wait(500);
UO.Print(UO.GlobalChatActiveChannel());
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GlobalChatLeave:bridge.GlobalChatLeave().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "globalchatleavechannel": bridge.GlobalChatLeave(); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.GlobalChatSendMsg(object? msgText);๊ธ๋ก๋ฒ ์ฑํ ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ ๋๋ค.
-
msgTextโ ToString์ ํตํ ํ ์คํธ; ์ ์ก๋ ์ํ๋ก ์ ์ฅ๋ฉ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ์ ์ก๋ ํ ์คํธ์ ํจ๊ป Send_ChatMessageCommand๋ฅผ ๋ณด๋ ๋๋ค. ์ฑ๋์ ํด๋ผ์ด์ธํธ/์๋ฒ ์ฑํ ์ํ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ์ ์ฑ๋ ์์ฒด๋ฅผ ์ ํํ์ง ์์ต๋๋ค.
- Bridge๋ ๊ฒ์ ์คํธ๋ฆผ์ ๋ํ ์์ฒญ์ ๋ณด๋ ๋๋ค. ์๋ฒ ๊ท์น์ด ์ ์ฉ๋ฉ๋๋ค. ํ์ธ์ ๊ธฐ๋ค๋ฆฌ๋ ๋ด์ฅ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.GlobalChatSendMsg");
UO.GlobalChatSendMsg("Hello");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ธ๋ก๋ฒ ์ฑํ ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ ๋๋ค.
UO.GlobalChatSendMsg("Hello");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ์ก๋ ํ ์คํธ์ ํจ๊ป Send_ChatMessageCommand๋ฅผ ๋ณด๋ ๋๋ค. ์ฑ๋์ ํด๋ผ์ด์ธํธ/์๋ฒ ์ฑํ ์ํ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ์ ์ฑ๋ ์์ฒด๋ฅผ ์ ํํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var message = "Hello";
if (Truth(UO.IsOnline()))
{
UO.GlobalChatSendMsg(message);
}
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()
{
SendText("Hello");
return null;
}
void SendText(dynamic message)
{
if (Truth(Len(message) > 0))
{
UO.GlobalChatSendMsg(message);
}
}
int Len(object? value) => Convert.ToString(value)?.Length ?? 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: msgText (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GlobalChatSend:bridge.GlobalChatSend(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "globalchatsendmsg": bridge.GlobalChatSend(Text(0)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.Msg(object? message);์คํฌ๋ฆฝํธ ์งํ ๋๋ ์ค์ง ์กฐ๊ฑด์ ๋ํ ๋ก์ปฌ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค. ๋ณด์๋ค์ํผ ๋ค๋ฅธ ํ๋ ์ด์ด๋ ์๋๋๋ค.
๋ฐํ ์ ํ์ด void์ธ ๋ฉ์๋์ ๋ํ ํธ์ถ์ ๋
๋ฆฝ ์คํํ ๋ฌธ C#๋ก ์์ฑ๋ฉ๋๋ค. ๊ฒฐ๊ณผ๋ฅผ ํ ๋นํ๊ฑฐ๋ ํ์ธํ ์ ์์ต๋๋ค. ๋ช
์ธ์๋ฅผ ์์ฑํ๋ค๊ณ ํด์ ๊ฒ์ ์๋ฒ์ ํ์ธ์ด ์ด๋ฃจ์ด์ง๋ ๊ฒ์ ์๋๋๋ค.
- ๋ฉ์์ง๋ ๊ฒ์์ฐฝ ์ข์ธกํ๋จ๊ณผ ๋ก์ปฌ๋ก๊ทธ๋ก ์ด๋ํฉ๋๋ค. ์ถ๋ ฅ IDE์์ ์ฌ๋ณธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ด๋ฆฌ์์ ์ผ๋ฐ ๋ก๊ทธ์์ ์คํฌ๋ฆฝํธ ๋ฉ์์ง ํํฐ๋ฅผ ํ์ฑํํ๋ฉด ๊ฒ์ ์ฐฝ ์์ด ํญ๋ชฉ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฒ ์์คํ ๋ฉ์์ง ํํฐ๋ ๊ทธ๋ฌํ ๋ ์ฝ๋๋ฅผ ์ ํํ์ง ์์ต๋๋ค. ๋คํธ์ํฌ ์์ฑ ํจํท์ด ์ ์ก๋์ง ์์ต๋๋ค. ๋จธ๋ฆฌ ์์ ๋น๋ฌธ์๋ UO.CharPrint์ด ์์ต๋๋ค.
-
UO.Print๋ ๊ฒ์ ๋ฉ์์ง ๋ก๊ทธ์ ์ ํญ๋ชฉ์ ์ถ๊ฐํฉ๋๋ค. ๋จผ์ ์ํ๋ ๊ฒ์ ๋ฌธ์์ด/๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ฑฐ๋ ์ ์ฅํ ๋ค์ ์ง๋จ ๋ฉ์์ง๋ฅผ ๊ธฐ๋กํฉ๋๋ค. ๋น ๋ฅธ ๋ฃจํ์์๋ ๋ชจ๋ ๋ฐ๋ณต์ด ์๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ ๋ ๋ฉ์์ง๋ฅผ ๊ธฐ๋กํฉ๋๋ค. - ์์์ด ์์ผ๋ฉด hue 0x03B2๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. UO.Print(text, color)๋ ํ ์คํธ๋ฅผ ๋จผ์ ๋ฐ์๋ค์ ๋๋ค. UO.ColorPrint(color, text) โ ์์ ์ฐ์ .
- ์๋ฒ ์ด๋ฆ์ด๋ ๋คํธ์ํฌ ๋ฉ์์ง์์ ์ ์ฌ์ฑ์๋ ๋ถ๊ตฌํ๊ณ ์ด ๋ช ๋ น์ ๋ก์ปฌ ํ ์คํธ๋ง ์ธ์ํฉ๋๋ค. ์ ์ธ๊ณ์ ๋ํํ๋ ค๋ฉด UO.Say๋ฅผ ์ฌ์ฉํ์ธ์.
- UO.Print ยท UO.CharPrint ยท UO.Say ยท UO.ConColor
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช
๋ น์ ๋
๋ฆฝ๋ ๋ฌธ์ด๋ฉฐ ๋ฐํ ๊ฐ์ด ์์ต๋๋ค(void). ๋ฉ์์ง ๋ด์ฉ์ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค.
UO.Msg("Hello from C#");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒ๋ฆฌ๋จ=12 โ ์ด๋ฏธ ์ฒ๋ฆฌ๋ ํญ๋ชฉ์ ๋ฐ๋ชจ ์์ ๋๋ค. Convert.ToString๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํฉ๋๋ค. ์ด ์์์๋ ์ซ์๋ง ๋ณด๊ณ ํฉ๋๋ค. ๊ฐ์ฒด ์์ฒด๋ฅผ ์ ์กํ์ง๋ ์์ต๋๋ค.
var processed = 12;
UO.Msg("Processed item entries: " + Convert.ToString(processed));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์บ๋ฆญํฐ์ ๋ฌด๊ฒ์ ์ต๋๊ฐ์ ์ฝ์ด์ต๋๋ค. 0/์ ์ ์๋ ์ต๋๊ฐ์ ๊ณผ๋ถํ๋ก ๊ฐ์ฃผ๋์ง ์์ต๋๋ค. ๋ฌด๊ฒ๊ฐ ์ต๋๊ฐ๋ณด๋ค ํฌ๋ฉด ํ ์ค์ด ์ธ์๋๊ณ Main์ด ๋๋ฉ๋๋ค. ๋ฌผ๊ฑด์ ๋ฒ๋ฆฌ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var weight = UO.Weight();
var maximum = UO.MaxWeight();
if (Truth(maximum > 0) && Truth(weight >= maximum))
{
UO.Msg("Too heavy: " + Convert.ToString(weight) + "/" + Convert.ToString(maximum));
return null;
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Main์ ๊ฐ์ค์น๋ฅผ ๊ธฐ์ตํ๊ณ 1000 ๋ฐ๋ฆฌ์ด๋ฅผ ๊ธฐ๋ค๋ฆฐ ํ ์์ ํ ์ ์ธ๋ ReportWeight๋ฅผ ํธ์ถํฉ๋๋ค. ๋ณด์กฐ์๋ ๋ฌด๊ฒ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ์ธ์ํ๊ณ ๋ค์ ์ ๊ฒ์ ์ํด ์ ๋ฌด๊ฒ๋ฅผ ๋ฐํํฉ๋๋ค. ๊ทธ ์์ฒด๋ก๋ ๋ฌดํ ๋ฃจํ๋ฅผ ์์ฑํ์ง ์์ต๋๋ค.
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 previous = UO.Weight();
UO.Wait(1000);
previous = ReportWeight(previous, UO.Weight());
return null;
}
dynamic ReportWeight(dynamic previous, dynamic current)
{
if (Truth(previous != current))
{
UO.Msg("Weight changed: " + Convert.ToString(current));
}
return current;
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: message (String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Msg. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ServerPrint:bridge.ServerPrint(message).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void Msg(string message) => bridge.ServerPrint(message);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.Salute();์ธ์ฌ๋ง ์ ๋๋ฉ์ด์ ์ ์์ฒญํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- Salute๋ Invoke๋ฅผ ํตํด GameActions.EmoteAction("๊ฒฝ๋ก")๋ฅผ ํธ์ถํฉ๋๋ค. UO.Say ํ ์คํธ๊ฐ ์๋ ์บ๋ฆญํฐ ์ก์ ์ ๋๋ค.
- ์์ ์์ UO.Wait๋ ์คํฌ๋ฆฝํธ ์ผ์ ์ค์ง๋ง ์ง์ ํฉ๋๋ค. ์ผ์ ์ค์ง๊ฐ ๋๋ฌ๋ค๊ณ ํด์ ์๋ฒ๊ฐ ์์ฒญ์ ์๋ฃํ์์ ์ฆ๋ช ํ๋ ๊ฒ์ ์๋๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.Salute");
UO.Salute();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์ฌ๋ง ์ ๋๋ฉ์ด์ ์ ์์ฒญํฉ๋๋ค.
UO.Salute();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Salute๋ Invoke๋ฅผ ํตํด GameActions.EmoteAction("๊ฒฝ๋ก")๋ฅผ ํธ์ถํฉ๋๋ค. UO.Say ํ ์คํธ๊ฐ ์๋ ์บ๋ฆญํฐ ์ก์ ์ ๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.IsOnline()))
{
UO.Salute();
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ ์์ UO.Wait๋ ์คํฌ๋ฆฝํธ ์ผ์ ์ค์ง๋ง ์ง์ ํฉ๋๋ค. ์ผ์ ์ค์ง๊ฐ ๋๋ฌ๋ค๊ณ ํด์ ์๋ฒ๊ฐ ์์ฒญ์ ์๋ฃํ์์ ์ฆ๋ช ํ๋ ๊ฒ์ ์๋๋๋ค.
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.Salute();
UO.Wait(1000);
UO.Print("Salute requested");
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Salute:bridge.Salute().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "salute": bridge.Salute(); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.Say(object? message);์บ๋ฆญํฐ์ ์ผ๋ฐ์ ์ธ ๋ง์ ์๋ฒ์ ๋ณด๋ ๋๋ค. ์๋ฅผ ๋ค์ด ์ํ์์๊ฒ ์ฃผ์๋ฅผ ๋ณด๋ด๊ฑฐ๋ ์ ์๋๋ฌผ์๊ฒ ๋ช ๋ น์ ๋ณด๋ ๋๋ค.
๋ฐํ ์ ํ์ด void์ธ ๋ฉ์๋์ ๋ํ ํธ์ถ์ ๋
๋ฆฝ ์คํํ ๋ฌธ C#๋ก ์์ฑ๋ฉ๋๋ค. ๊ฒฐ๊ณผ๋ฅผ ํ ๋นํ๊ฑฐ๋ ํ์ธํ ์ ์์ต๋๋ค. ๋ช
์ธ์๋ฅผ ์์ฑํ๋ค๊ณ ํด์ ๊ฒ์ ์๋ฒ์ ํ์ธ์ด ์ด๋ฃจ์ด์ง๋ ๊ฒ์ ์๋๋๋ค.
- ํ๋กํ ์ฝ ๋ฒ์ 2.0.0 ์ด์์ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ๋ ์ ๋์ฝ๋ ์์ฑ์ ๋ณด๋ ๋๋ค. ๋์ด๊ฐ ๋ง์ ์ฌ๋์ ๊ฒฝ์ฐ - ASCII ์ฐ์ค. SayU๋ผ๋ ์ด๋ฆ์ ์ด์ ํ๋กํ ์ฝ์ ์ ๋์ฝ๋๋ก ๊ฐ์ ํ์ง ์์ต๋๋ค. ๋ช ์์ ์ธ ์์์ด ์์ผ๋ฉด ํ๋กํ์ SpeechHue์ด ์ดฌ์๋ฉ๋๋ค. UO.UOSayColor์ 0xFFFF๋ ์ด ์์์ ์ ํํฉ๋๋ค. ํ ์คํธ๊ฐ ์๋ฒ๋ก ์ ์ก๋์ง๋ง ์คํฌ๋ฆฝํธ๋ ์ด๋ฅผ ์ฝ๋๋ก ์คํํ์ง ์์ต๋๋ค.
- UO.Print ยท UO.CharPrint ยท UO.Say ยท UO.ConColor
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.Say");
UO.Say("bank");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Connected๋ ๋ฐ์ก ์ ํ์ธ๋ฉ๋๋ค. ์ํ์ ์ด๋ฆ API์ด ์๋๋ผ ํ ์ค์ ์ฐ์ค์ ๋๋ค. ์ํ์ ๊ฐ์คํ๋ ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๊ทผ์ฒ์ ์ ํฉํ NPC์ด ํ์ํฉ๋๋ค. ์๋ฒ๊ฐ ๋ค๋ฅธ ๋ฌธ๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด๋ฅผ ๋ฐ๊พธ์ญ์์ค.
if (Truth(UO.Connected()))
{
UO.Say("bank");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- petName๋ ์ ์๋๋ฌผ์ ์ด๋ฆ์ ๋๋ค. ์ฌ๊ธฐ์๋ Shadow์ ๋๋ค. ํ ์ค๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. Shadow follow me. ์บ๋ฆญํฐ๋ฅผ ์์ง์ด๋ UO.Follow์ด ์๋ ํซ์ด ๋ฐ๋ผ์ค๋๋ก ํ๋ ๋ช ๋ น์ ๋๋ค.
return RunScenario();
object? RunScenario()
{
var petName = "Shadow";
if (Truth(UO.Connected()))
{
UO.Say(petName + " follow me");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- RequestBankIfHeavy ์ฐ๊ฒฐ๊ณผ ์์ ์ ์ธ ์์ ์ต๋ ์ค๋์ ํ์ธํฉ๋๋ค. ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆฐ ๊ฒฝ์ฐ์๋ง ๋ฑ ํฌ๋ฅผ ๋ณด๋ด๊ณ ์ ์ก๋ ์์ฒญ์ ํ์๋ก 1๋ฅผ ๋ฐํํฉ๋๋ค. 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()
{
return RequestBankIfHeavy();
return null;
}
dynamic RequestBankIfHeavy()
{
if (!(Truth(UO.Connected())))
{
return 0;
}
var maximum = UO.MaxWeight();
if (Truth(maximum <= 0) || Truth(UO.Weight() < maximum))
{
return 0;
}
UO.Say("bank");
return 1;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: message (String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Say. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Say:bridge.Say(message).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void Say(string message) => bridge.Say(message);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.SayU(object? text);์บ๋ฆญํฐ์ ์ผ๋ฐ์ ์ธ ๋ง์ ์๋ฒ์ ๋ณด๋ ๋๋ค. ์๋ฅผ ๋ค์ด ์ํ์์๊ฒ ์ฃผ์๋ฅผ ๋ณด๋ด๊ฑฐ๋ ์ ์๋๋ฌผ์๊ฒ ๋ช ๋ น์ ๋ณด๋ ๋๋ค.
๋ฐํ ์ ํ์ด void์ธ ๋ฉ์๋์ ๋ํ ํธ์ถ์ ๋
๋ฆฝ ์คํํ ๋ฌธ C#๋ก ์์ฑ๋ฉ๋๋ค. ๊ฒฐ๊ณผ๋ฅผ ํ ๋นํ๊ฑฐ๋ ํ์ธํ ์ ์์ต๋๋ค. ๋ช
์ธ์๋ฅผ ์์ฑํ๋ค๊ณ ํด์ ๊ฒ์ ์๋ฒ์ ํ์ธ์ด ์ด๋ฃจ์ด์ง๋ ๊ฒ์ ์๋๋๋ค.
- ํ๋กํ ์ฝ ๋ฒ์ 2.0.0 ์ด์์ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ๋ ์ ๋์ฝ๋ ์์ฑ์ ๋ณด๋ ๋๋ค. ๋์ด๊ฐ ๋ง์ ์ฌ๋์ ๊ฒฝ์ฐ - ASCII ์ฐ์ค. SayU๋ผ๋ ์ด๋ฆ์ ์ด์ ํ๋กํ ์ฝ์ ์ ๋์ฝ๋๋ก ๊ฐ์ ํ์ง ์์ต๋๋ค. ๋ช ์์ ์ธ ์์์ด ์์ผ๋ฉด ํ๋กํ์ SpeechHue์ด ์ดฌ์๋ฉ๋๋ค. UO.UOSayColor์ 0xFFFF๋ ์ด ์์์ ์ ํํฉ๋๋ค. ํ ์คํธ๊ฐ ์๋ฒ๋ก ์ ์ก๋์ง๋ง ์คํฌ๋ฆฝํธ๋ ์ด๋ฅผ ์ฝ๋๋ก ์คํํ์ง ์์ต๋๋ค.
- UO.Print ยท UO.CharPrint ยท UO.Say ยท UO.ConColor
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SayU");
UO.SayU("bank");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Connected๋ ๋ฐ์ก ์ ํ์ธ๋ฉ๋๋ค. ์ํ์ ์ด๋ฆ API์ด ์๋๋ผ ํ ์ค์ ์ฐ์ค์ ๋๋ค. ์ํ์ ๊ฐ์คํ๋ ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๊ทผ์ฒ์ ์ ํฉํ NPC์ด ํ์ํฉ๋๋ค. ์๋ฒ๊ฐ ๋ค๋ฅธ ๋ฌธ๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด๋ฅผ ๋ฐ๊พธ์ญ์์ค.
if (Truth(UO.Connected()))
{
UO.SayU("bank");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- petName๋ ์ ์๋๋ฌผ์ ์ด๋ฆ์ ๋๋ค. ์ฌ๊ธฐ์๋ Shadow์ ๋๋ค. ํ ์ค๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. Shadow follow me. ์บ๋ฆญํฐ๋ฅผ ์์ง์ด๋ UO.Follow์ด ์๋ ํซ์ด ๋ฐ๋ผ์ค๋๋ก ํ๋ ๋ช ๋ น์ ๋๋ค.
return RunScenario();
object? RunScenario()
{
var petName = "Shadow";
if (Truth(UO.Connected()))
{
UO.SayU(petName + " follow me");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- RequestBankIfHeavy ์ฐ๊ฒฐ๊ณผ ์์ ์ ์ธ ์์ ์ต๋ ์ค๋์ ํ์ธํฉ๋๋ค. ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆฐ ๊ฒฝ์ฐ์๋ง ๋ฑ ํฌ๋ฅผ ๋ณด๋ด๊ณ ์ ์ก๋ ์์ฒญ์ ํ์๋ก 1๋ฅผ ๋ฐํํฉ๋๋ค. 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()
{
return RequestBankIfHeavy();
return null;
}
dynamic RequestBankIfHeavy()
{
if (!(Truth(UO.Connected())))
{
return 0;
}
var maximum = UO.MaxWeight();
if (Truth(maximum <= 0) || Truth(UO.Weight() < maximum))
{
return 0;
}
UO.SayU("bank");
return 1;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: text (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.Say:Say(arguments.Length > 0 ? arguments[0].ToString() : string.Empty). -
InjectionScript.Runtime.InjectionValue.ToString:arguments[0].ToString().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "sayu": Say(arguments.Length > 0 ? arguments[0].ToString() : string.Empty); break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.UOAMessage(object? text);hue๋ฅผ UO.FontColor๋ก ์ค์ ํ์ฌ ClassicUO์ ๋ก์ปฌ ๋ฉ์์ง๋ฅผ ์ธ์ํฉ๋๋ค. ์ฌ๊ณ , ๊ฒฝ๋ก ์ํ ๋๋ ๋จ๊ณ ์๋ฃ์ ๋ํ ์คํฌ๋ฆฝํธ ์๋ฆผ์ ์ ํฉํฉ๋๋ค.
void: ํ ์คํธ, ๋ก๊ทธ ์์ธ ๋๋ true/false๋ฅผ ๋ฐํํ์ง ์์ต๋๋ค. ํธ์ถ์ ๋ก์ปฌ ์ถ๋ ฅ์ ์ํํฉ๋๋ค. ๋ฐํ๋ ํ์ ํ์ธ์ด ์์ต๋๋ค.
- ํ์ฌ ๋ฐํ์์ ์ํFontColor(์๋๋ 0x03B2)๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ น์์ ํ๋จ ๋ฉ์์ง ์์ญ๊ณผ ํด๋ผ์ด์ธํธ ๋ก๊ทธ, IDE ์ถ๋ ฅ์ ํตํด ์งํ๋ฉ๋๋ค.
- ์๋ฒ์ ์์ฑ์ ๋ณด๋ด์ง ์๊ณ , ํ์ ์ฐฝ์ ๋์ฐ์ง ์์ผ๋ฉฐ, ๋ค๋ฅธ ํ๋ ์ด์ด์๊ฒ ๋ฉ์์ง๋ฅผ ๋ณด๋ด์ง ์์ต๋๋ค. ์ผ๋ฐ UO.Print์๋ ๊ณ ์ ํ ์์์ด ์์ต๋๋ค.
- ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ํ๋์ ๋ฉ์์ง ์์์ ์ง์ ํ๋ ค๋ฉด FontColor UO.Print(text,color)๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช
๋ น์ ๋
๋ฆฝ๋ ๋ฌธ์ด๋ฉฐ ๋ฐํ ๊ฐ์ด ์์ต๋๋ค(void). ๋ฉ์์ง ๋ด์ฉ์ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค.
UO.UOAMessage("Hello from C#");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 0x0021 โ ์์ธ hue; ์ต์ข ์์์ ํด๋ผ์ด์ธํธ์ ์์ ํ์ผ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ๋ฉ์์ง๋ ๋ก์ปฌ์์ ๋ณผ ์ ์์ต๋๋ค. ์บ๋ฆญํฐ๊ฐ ๋งํ์ง ์์ต๋๋ค.
UO.FontColor(0x0021);
var first = UO.FindList("0x0EED", "backpack");
if (Truth(first == ""))
{
UO.UOAMessage("No gold in the loaded backpack");
}
else
{
UO.UOAMessage("Gold units: " + Convert.ToString(UO.FindFullQuantity()));
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ์ฒด ๊ณต์ง์๋ ํ ์คํธ์ hue๊ฐ ํ์ฉ๋ฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก ์ค์น๋ hue๋ ์ด ๋ฐํ์์ ๋ค์ UOAMessage์๋ ๋จ์ ์์ต๋๋ค. ์ฌ๊ธฐ์์๋ ์ฝ์ ์ ์๋ ๋ด์ฅ FontColor()์ด ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
Notice("Supplies checked", 0x0044);
Notice("Restock needed", 0x0021);
return null;
}
void Notice(dynamic text, dynamic hue)
{
UO.FontColor(hue);
UO.UOAMessage(text);
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 0x03B2 โ ์ ๋ฐํ์์ ์ด๊ธฐ ๊ฐ FontColor. ๋ง์ง๋ง์ผ๋ก ์ ์์ ์ธ ์๋ฃ/์ค๋ฅ ์ฒ๋ฆฌ ์ ์ ํํ ๊ธฐ๋ฐ์ ์ ํํ๊ฒ ๋ฐํํฉ๋๋ค. ์ ์ ์๋ ์ด์ ๊ฐ์ ๋ณต์๋์ง ์์ต๋๋ค.
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 baseHue = 0x03B2;
try
{
UO.FontColor(0x0021);
UO.UOAMessage("Check the route before moving");
}
finally
{
UO.FontColor(baseHue);
}
UO.UOAMessage("Ready");
UO.Print("Regular Print keeps its own color");
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: text (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Print:bridge.Print(state.FontColor, Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Text:Text(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "uoamessage": bridge.Print(state.FontColor, Text(0)); break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.UOSay(object? text);์บ๋ฆญํฐ์ ์ผ๋ฐ์ ์ธ ๋ง์ ์๋ฒ์ ๋ณด๋ ๋๋ค. ์๋ฅผ ๋ค์ด ์ํ์์๊ฒ ์ฃผ์๋ฅผ ๋ณด๋ด๊ฑฐ๋ ์ ์๋๋ฌผ์๊ฒ ๋ช ๋ น์ ๋ณด๋ ๋๋ค.
๋ฐํ ์ ํ์ด void์ธ ๋ฉ์๋์ ๋ํ ํธ์ถ์ ๋
๋ฆฝ ์คํํ ๋ฌธ C#๋ก ์์ฑ๋ฉ๋๋ค. ๊ฒฐ๊ณผ๋ฅผ ํ ๋นํ๊ฑฐ๋ ํ์ธํ ์ ์์ต๋๋ค. ๋ช
์ธ์๋ฅผ ์์ฑํ๋ค๊ณ ํด์ ๊ฒ์ ์๋ฒ์ ํ์ธ์ด ์ด๋ฃจ์ด์ง๋ ๊ฒ์ ์๋๋๋ค.
- ํ๋กํ ์ฝ ๋ฒ์ 2.0.0 ์ด์์ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ๋ ์ ๋์ฝ๋ ์์ฑ์ ๋ณด๋ ๋๋ค. ๋์ด๊ฐ ๋ง์ ์ฌ๋์ ๊ฒฝ์ฐ - ASCII ์ฐ์ค. SayU๋ผ๋ ์ด๋ฆ์ ์ด์ ํ๋กํ ์ฝ์ ์ ๋์ฝ๋๋ก ๊ฐ์ ํ์ง ์์ต๋๋ค. ๋ช ์์ ์ธ ์์์ด ์์ผ๋ฉด ํ๋กํ์ SpeechHue์ด ์ดฌ์๋ฉ๋๋ค. UO.UOSayColor์ 0xFFFF๋ ์ด ์์์ ์ ํํฉ๋๋ค. ํ ์คํธ๊ฐ ์๋ฒ๋ก ์ ์ก๋์ง๋ง ์คํฌ๋ฆฝํธ๋ ์ด๋ฅผ ์ฝ๋๋ก ์คํํ์ง ์์ต๋๋ค.
- UO.Print ยท UO.CharPrint ยท UO.Say ยท UO.ConColor
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.UOSay");
UO.UOSay("bank");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Connected๋ ๋ฐ์ก ์ ํ์ธ๋ฉ๋๋ค. ์ํ์ ์ด๋ฆ API์ด ์๋๋ผ ํ ์ค์ ์ฐ์ค์ ๋๋ค. ์ํ์ ๊ฐ์คํ๋ ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๊ทผ์ฒ์ ์ ํฉํ NPC์ด ํ์ํฉ๋๋ค. ์๋ฒ๊ฐ ๋ค๋ฅธ ๋ฌธ๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด๋ฅผ ๋ฐ๊พธ์ญ์์ค.
if (Truth(UO.Connected()))
{
UO.UOSay("bank");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- petName๋ ์ ์๋๋ฌผ์ ์ด๋ฆ์ ๋๋ค. ์ฌ๊ธฐ์๋ Shadow์ ๋๋ค. ํ ์ค๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. Shadow follow me. ์บ๋ฆญํฐ๋ฅผ ์์ง์ด๋ UO.Follow์ด ์๋ ํซ์ด ๋ฐ๋ผ์ค๋๋ก ํ๋ ๋ช ๋ น์ ๋๋ค.
return RunScenario();
object? RunScenario()
{
var petName = "Shadow";
if (Truth(UO.Connected()))
{
UO.UOSay(petName + " follow me");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- RequestBankIfHeavy ์ฐ๊ฒฐ๊ณผ ์์ ์ ์ธ ์์ ์ต๋ ์ค๋์ ํ์ธํฉ๋๋ค. ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆฐ ๊ฒฝ์ฐ์๋ง ๋ฑ ํฌ๋ฅผ ๋ณด๋ด๊ณ ์ ์ก๋ ์์ฒญ์ ํ์๋ก 1๋ฅผ ๋ฐํํฉ๋๋ค. 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()
{
return RequestBankIfHeavy();
return null;
}
dynamic RequestBankIfHeavy()
{
if (!(Truth(UO.Connected())))
{
return 0;
}
var maximum = UO.MaxWeight();
if (Truth(maximum <= 0) || Truth(UO.Weight() < maximum))
{
return 0;
}
UO.UOSay("bank");
return 1;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: text (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.Say:Say(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "uosay": Say(Text(0)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.UOSayColor(object? text, object? color);์บ๋ฆญํฐ์ ์ผ๋ฐ์ ์ธ ๋ง์ ์๋ฒ์ ๋ณด๋ ๋๋ค. ์๋ฅผ ๋ค์ด ์ํ์์๊ฒ ์ฃผ์๋ฅผ ๋ณด๋ด๊ฑฐ๋ ์ ์๋๋ฌผ์๊ฒ ๋ช ๋ น์ ๋ณด๋ ๋๋ค.
-
color- UO hue, RGB ์๋. ์ซ์ ๋๋ 16์ง์ ๋ฌธ์์ด. ๋ธ๋ฆฌ์ง๋ ๋ฎ์ 16 ๋นํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. graphic/type์ ํผ๋ํ์ง ๋ง์ธ์. ์์์์๋ 0x0044๊ฐ ์ ํ๋ hue์ ๋๋ค. ํ๋กํ ์ฝ ๋ฒ์ 2.0.0 ์ด์์ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ๋ ์ ๋์ฝ๋ ์์ฑ์ ๋ณด๋ ๋๋ค. ๋์ด๊ฐ ๋ง์ ์ฌ๋์ ๊ฒฝ์ฐ - ASCII ์ฐ์ค. SayU์ด๋ผ๋ ์ด๋ฆ์ ์ด์ ํ๋กํ ์ฝ์ ์ ๋์ฝ๋๋ก ๊ฐ์ ์ง์ ํ์ง ์์ต๋๋ค. ๋๋ ทํ ์์์ด ์์ผ๋ฉด ํ๋กํ์ SpeechHue๊ฐ ์ดฌ์๋ฉ๋๋ค. UO.UOSayColor์ 0xFFFF๋ ์ด ์์์ ์ ํํฉ๋๋ค. ํ ์คํธ๊ฐ ์๋ฒ๋ก ์ ์ก๋์ง๋ง ์คํฌ๋ฆฝํธ๋ ์ด๋ฅผ ์ฝ๋๋ก ์คํํ์ง ์์ต๋๋ค.
๋ฐํ ์ ํ์ด void์ธ ๋ฉ์๋์ ๋ํ ํธ์ถ์ ๋
๋ฆฝ ์คํํ ๋ฌธ C#๋ก ์์ฑ๋ฉ๋๋ค. ๊ฒฐ๊ณผ๋ฅผ ํ ๋นํ๊ฑฐ๋ ํ์ธํ ์ ์์ต๋๋ค. ๋ช
์ธ์๋ฅผ ์์ฑํ๋ค๊ณ ํด์ ๊ฒ์ ์๋ฒ์ ํ์ธ์ด ์ด๋ฃจ์ด์ง๋ ๊ฒ์ ์๋๋๋ค.
- ํ๋กํ ์ฝ ๋ฒ์ 2.0.0 ์ด์์ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ๋ ์ ๋์ฝ๋ ์์ฑ์ ๋ณด๋ ๋๋ค. ๋์ด๊ฐ ๋ง์ ์ฌ๋์ ๊ฒฝ์ฐ - ASCII ์ฐ์ค. SayU๋ผ๋ ์ด๋ฆ์ ์ด์ ํ๋กํ ์ฝ์ ์ ๋์ฝ๋๋ก ๊ฐ์ ํ์ง ์์ต๋๋ค. ๋ช ์์ ์ธ ์์์ด ์์ผ๋ฉด ํ๋กํ์ SpeechHue์ด ์ดฌ์๋ฉ๋๋ค. UO.UOSayColor์ 0xFFFF๋ ์ด ์์์ ์ ํํฉ๋๋ค. ํ ์คํธ๊ฐ ์๋ฒ๋ก ์ ์ก๋์ง๋ง ์คํฌ๋ฆฝํธ๋ ์ด๋ฅผ ์ฝ๋๋ก ์คํํ์ง ์์ต๋๋ค.
- UO.Print ยท UO.CharPrint ยท UO.Say ยท UO.ConColor
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.UOSayColor");
UO.UOSayColor("bank", 0x0044);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Connected๋ ๋ฐ์ก ์ ํ์ธ๋ฉ๋๋ค. ์ํ์ ์ด๋ฆ API์ด ์๋๋ผ ํ ์ค์ ์ฐ์ค์ ๋๋ค. ์ํ์ ๊ฐ์คํ๋ ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๊ทผ์ฒ์ ์ ํฉํ NPC์ด ํ์ํฉ๋๋ค. ์๋ฒ๊ฐ ๋ค๋ฅธ ๋ฌธ๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด๋ฅผ ๋ฐ๊พธ์ญ์์ค.
if (Truth(UO.Connected()))
{
UO.UOSayColor("bank", 0x0044);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- petName๋ ์ ์๋๋ฌผ์ ์ด๋ฆ์ ๋๋ค. ์ฌ๊ธฐ์๋ Shadow์ ๋๋ค. ํ ์ค๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. Shadow follow me. ์บ๋ฆญํฐ๋ฅผ ์์ง์ด๋ UO.Follow์ด ์๋ ํซ์ด ๋ฐ๋ผ์ค๋๋ก ํ๋ ๋ช ๋ น์ ๋๋ค.
return RunScenario();
object? RunScenario()
{
var petName = "Shadow";
if (Truth(UO.Connected()))
{
UO.UOSayColor(petName + " follow me", 0x0044);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- RequestBankIfHeavy ์ฐ๊ฒฐ๊ณผ ์์ ์ ์ธ ์์ ์ต๋ ์ค๋์ ํ์ธํฉ๋๋ค. ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆฐ ๊ฒฝ์ฐ์๋ง ๋ฑ ํฌ๋ฅผ ๋ณด๋ด๊ณ ์ ์ก๋ ์์ฒญ์ ํ์๋ก 1๋ฅผ ๋ฐํํฉ๋๋ค. 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()
{
return RequestBankIfHeavy();
return null;
}
dynamic RequestBankIfHeavy()
{
if (!(Truth(UO.Connected())))
{
return 0;
}
var maximum = UO.MaxWeight();
if (Truth(maximum <= 0) || Truth(UO.Weight() < maximum))
{
return 0;
}
UO.UOSayColor("bank", 0x0044);
return 1;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: text (Any), color (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Say:bridge.Say(Text(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "uosaycolor": bridge.Say(Text(0), Arg(1)); return InjectionValue.Unit;