KO UO Topic client connection - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
ํ ยท C# ยท IDE ยท UO API ยท AโZ ยท ์ ยท ์ธ์ด
์ฐ๊ฒฐ, ์๋ ์ ์ฅ ์ํ, ๋๊ธฐ ์๊ฐ, ์๋ฒ ์ฃผ์ ๋ฐ ์บ๋ฆญํฐ ๋ชฉ๋ก์ ๋๋ค.
| ์ฃผ์ | ๋ช ๋ น ๋ฐ ์ค๋ช |
|---|---|
| Connect | UO.Connect |
| Disconnect | UO.Disconnect |
| Connected | UO.Connected |
| Online | UO.Online |
| Ping | UO.GetPing |
| Server IP | UO.GameServerIPString |
| Shard Name | UO.ShardName |
| Shard Path | UO.ShardPath |
| ์บ๋ฆญํฐ ๋ชฉ๋ก | UO.GetCharsListForShard |
| Resend | UO.Resend |
| CheckLag | UO.CheckLag |
UO.Connect ยท UO.Disconnect ยท UO.Connected ยท UO.Online ยท UO.IsOnline ยท UO.ConnectedTime ยท UO.DisconnectedTime ยท UO.GetPing ยท UO.CheckLag ยท UO.GameServerIPString ยท UO.ShardName ยท UO.ShardPath ยท UO.GetCharsListForShard ยท UO.Resend ยท UO.CloseUO
๊ฐ ๋ช ๋ น ์นด๋์๋ ์ง์ ์ฝ๋, ํจ์ ๋ฐ ํด๋์ค ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๋ค์์ ์ ํ๋ ์งง์ ์๋๋ฆฌ์ค์ ๋๋ค. ์ ํ์ฌํญ๊ณผ ์ ์ฒด ๋ถ์์ด ์นด๋์ ํฌํจ๋์ด ์์ต๋๋ค.
๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
if (Truth(Truth(UO.Connected()) == false))
{
return null;
}
UO.UseSkill("Hiding");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
var address = UO.GameServerIPString();
UO.Print(address);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.CheckLag();
dynamic UO.CheckLag(object? timeoutMS);
int UO.CheckLag(object? timeout, object? retries);ํ ๋น๋ ์๊ฐ ๋ด์ ๊ฒ์ ์๋ฒ๋ก๋ถํฐ ์๋ก์ด ์๋ต์ ๋ฐ์๋์ง ํ์ธํฉ๋๋ค. ๋คํธ์ํฌ ์ง์ฐ ํ ์คํฌ๋ฆฝํธ๋ฅผ ๊ณ์ํ๊ธฐ ์ ์ ํธ๋ฆฌํฉ๋๋ค.
-
timeout- ์๊ฐ ์ด๊ณผ / timeoutMS - ํ ๋ฒ์ ์๋์ ๋ํ ๋๊ธฐ ์๊ฐ(๋ฐ๋ฆฌ์ด)์ผ๋ก, int๋ก ๋ณํ๋ฉ๋๋ค. ์์ ๊ฐ์ 0์ผ๋ก ์ ํ๋ฉ๋๋ค. 0๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฒญ์ด ์ ์ก๋ ์ ์์ง๋ง ์๋ต์ ๊ธฐ๋ํ ์๋ ์์ต๋๋ค. ๋ฌดํ์ ํ์์์์ด ์๋๋๋ค. -
timeoutMS- ์๊ฐ ์ด๊ณผ / timeoutMS - ํ ๋ฒ์ ์๋์ ๋ํ ๋๊ธฐ ์๊ฐ(๋ฐ๋ฆฌ์ด)์ผ๋ก, int๋ก ๋ณํ๋ฉ๋๋ค. ์์ ๊ฐ์ 0์ผ๋ก ์ ํ๋ฉ๋๋ค. 0๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฒญ์ด ์ ์ก๋ ์ ์์ง๋ง ์๋ต์ ๊ธฐ๋ํ ์๋ ์์ต๋๋ค. ๋ฌดํ์ ํ์์์์ด ์๋๋๋ค. -
retries- ์ฌ์๋ - ์ถ๊ฐ ๋ฐ๋ณต ํ์๊ฐ ์๋ ์ด ์๋ ํ์์ ๋๋ค. int๋ก ๋ณํ๋๋ฉฐ ์๋๋ 1๋ก ์ ํ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด (250, 3) - 250ms์์ ์ต๋ 3๋ฒ ์๋ํฉ๋๋ค. ์ฑ๊ณต์ ์ธ ์๋ต์ ๊ฒ์ฌ๋ฅผ ์กฐ๊ธฐ์ ์๋ฃํฉ๋๋ค.
์ซ์ ํ๋๊ทธ int: 1 (์กฐ๊ฑด ์ถฉ์กฑ) - ์๋ก์ด ์๋ต์ ๋ฐ์์ต๋๋ค. 0 (์กฐ๊ฑด ๋ฏธ์ถฉ์กฑ) - ์์ฒญ์ด ๋ถ๊ฐ๋ฅํ๊ฑฐ๋ ์ ํ ์๊ฐ์ด ๋ง๋ฃ๋์์ต๋๋ค. ๋จ์ผ ๋งค๊ฐ๋ณ์ ๋ฑ๋ก object? ์ค์ ๋ก๋ ์ด๊ฒ์ int๋ก ๋ฐํํฉ๋๋ค. ์ด๋ ํ ๊ฐ์ด๋ ์๋ ํ์๊ฐ ์๋๋๋ค.
- CheckLag()๋ ํ ๋ฒ ์๋ํ๊ณ ์ต๋ 10000ms ๋์ ๊ธฐ๋ค๋ฆฝ๋๋ค. CheckLag(timeoutMS) - ์ง์ ๋ ๊ธฐ๋์น๋ฅผ ๊ฐ์ง๊ณ ํ ๋ฒ ์๋ํฉ๋๋ค. CheckLag(timeout, retries)๋ ์ฑ๊ณตํ๊ฑฐ๋ ์ด ์๋ ํ์๊ฐ ์์ง๋ ๋๊น์ง ํ์ธ์ ๋ฐ๋ณตํฉ๋๋ค.
- ๊ธฐ๋ค๋ฆฌ๋ฉด ๊ฒ์ ๋์์ ํ์ธํ๋ ๋์ ํธ์ถ ์คํฌ๋ฆฝํธ๊ฐ ์ง์ฐ๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ๋ค์ ์ฐ๊ฒฐ๋์ง ์์ผ๋ฉฐ ๋คํธ์ํฌ ์ค์ ์ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์๋ฒ๊ฐ ์์ฝ์ ์๋ตํ์ง ์์ ์ ์์ต๋๋ค. ์คํจ ์์ฒด๋ก๋ ์ฐ๊ฒฐ์ด ๋์ด์ก๋ค๋ ๊ฒ์ ์ฆ๋ช ํ ์ ์์ต๋๋ค. ํ์ด๋ฐ์ ํ๋ฆ ์ผ์ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ๋ชจ๋ ํ๋ ์์์ ํ์ฑ ๊ฒ์ฌ๋ฅผ ํธ์ถํ์ง ๋ง์ธ์. ์คํฌ๋ฆฝํธ๋ฅผ ์ค์งํ๋ฉด ๋๊ธฐ๊ฐ ์ค๋จ๋ฉ๋๋ค.
- UO.GetPing ยท UO.CheckLag ยท UO.IsOnline
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.CheckLag();
UO.Print("CheckLag: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋งค๊ฐ๋ณ์๊ฐ ์๋ ์์์ ์ต๋ 10์ด๊น์ง ๊ธฐ๋ค๋ฆด ์ ์์ต๋๋ค. true๋ ์๋ก์ด ์์ฝ ์๋ต์ ์๋ฏธํฉ๋๋ค. ์จ๊ธฐ๊ธฐ๋ ๋ณ๋์ ๋ช ๋ น์ผ๋ก ํธ์ถ๋๋ฉฐ ๊ฒ์ ๋ฉ์ปค๋์ฆ์ ์ํด ๋ฌด์๋ ์ ์์ต๋๋ค.
if (Truth(Truth(UO.CheckLag()) == true))
{
UO.UseSkill("Hiding");
}
else
{
UO.Print("No fresh server response");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 250 โ ํ ๋ฒ์ ์๋๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์ค, 3 โ ์ด ์๋ ํ์. ์ฑ๊ณตํ๋ฉด ๋ ์ด์ ์๋ํ์ง ์์ต๋๋ค. 0๋ฅผ ์ฌ์ฉํ๋ฉด ์คํฌ๋ฆฝํธ๊ฐ ๊ณ์๋์ง ์์ต๋๋ค. ์ด๋ 250 ms ํ ์ธก์ ์ด๋ ์ธ ๋ฒ์ ์ถ๊ฐ ๋ฐ๋ณต์ด ์๋๋๋ค.
return RunScenario();
object? RunScenario()
{
var responsive = UO.CheckLag(250, 3);
if (Truth(responsive == 0))
{
UO.Print("No response after the allowed attempts");
return null;
}
UO.Print("Fresh response received; the script can continue");
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- CanContinue(timeoutMs, ์๋)๋ ๋จผ์ UO.IsOnline๋ฅผ ํ์ธํ ๋ค์ ์ต์ ๋ต๋ณ์ ํ์ธํฉ๋๋ค. false ๋ฐ 0๋ ์ด ์ ์ด์ ๋์ผํฉ๋๋ค. 500 ms ๋ฐ 2 ์๋๋ ๋ณ๋๋ก ์ง์ ๋ฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ์๋ ์ฌ์ฐ๊ฒฐ์ ํธ๋ฆฌ๊ฑฐํ์ง ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
if (!(Truth(CanContinue(500, 2))))
{
return null;
}
UO.UseSkill("Hiding");
return null;
}
dynamic CanContinue(dynamic timeoutMs, dynamic attempts)
{
if (Truth(Truth(UO.IsOnline()) == false))
{
return false;
}
return Truth(Truth(UO.CheckLag(timeoutMs, attempts)) == true);
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.CheckLag. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CheckLag:bridge.CheckLag(10_000).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int CheckLag() => bridge.CheckLag(10_000);๋งค๊ฐ๋ณ์: timeoutMS (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CheckLag:bridge.CheckLag(Arg(0, 10_000)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0, 10_000).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "checklag": return new InjectionValue(bridge.CheckLag(Arg(0, 10_000)));๋งค๊ฐ๋ณ์: timeout (Any), retries (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.CheckLag. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(timeout). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CheckLag:bridge.CheckLag(timeoutMs).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int CheckLag(InjectionValue timeout, InjectionValue retries)
{
int timeoutMs = Math.Max(0, NumberConversions.ToInt(timeout));
int attempts = Math.Max(1, NumberConversions.ToInt(retries));
for (int attempt = 0; attempt < attempts; attempt++)
{
if (bridge.CheckLag(timeoutMs) != 0)
return 1;
}
return 0;
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.CloseUO();Client.Game.Exit๋ฅผ ํตํด ํ์ฌ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ๋ฃํ๋๋ก ์์ฒญํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- CloseUO์ ๊ฐ์ ๋ค๋ฆฌ๋ก ํฅํ๊ณ ์์ต๋๋ค. CloseHandle. ์ข ๋ฃ๋ ๊ฒ์ ์ค๋ ๋์์ ์คํ๋ฉ๋๋ค. Client.Game์ด ๋๋ฝ๋ ๊ฒฝ์ฐ ์๋ฌด๋ฐ ์กฐ์น๋ ์ทจํ์ง ์์ต๋๋ค. ์ด ๋ช ๋ น์ ๋ณ๋์ ๊ฒํ๋ฅผ ์ข ๋ฃํ๋ ๊ฒ์ด ์๋๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.CloseUO");
UO.CloseUO();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํธ์ถ์ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ข ๋ฃ๋ฅผ ์์ฒญํฉ๋๋ค.
UO.CloseUO();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ์์์๋ ์ ์ด๋ ์กฐ๊ฑด์ ๋ณด์ฌ์ค๋๋ค. 0 ๊ฐ์ ํด๋ผ์ด์ธํธ๋ฅผ ์ด๋ฆฐ ์ํ๋ก ์ ์งํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var finishClient = 0;
if (Truth(finishClient))
{
UO.CloseUO();
}
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()
{
FinishClient(0);
return null;
}
void FinishClient(dynamic enabled)
{
if (Truth(enabled))
{
UO.CloseUO();
}
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CloseHandle:bridge.CloseHandle().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "closeuo": bridge.CloseHandle(); break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.Connect();ํ์ฌ ํด๋ผ์ด์ธํธ ์ธ์ ์ ์ฐ๊ฒฐ ๋๋ ์ฌ์ฐ๊ฒฐ์ ์์ฒญํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- ๊ด๋ฆฌ์ ์ธ์ ์์ SessionControl.RequestConnect์ ํธ์ถํฉ๋๋ค. ๋ ๋ฆฝ ์คํํ ํด๋ผ์ด์ธํธ์์๋ ํ์ฑ/์ค๋น๋ ์ฐ๊ฒฐ์ด ๋ณ๊ฒฝ๋์ง ์์ ์ํ๋ก ์ ์ง๋ฉ๋๋ค.
- GameScene์ ๊ฒฝ์ฐ ์ ๋ฐ์ดํธ ์ค์ ์ฅ๋ฉด์ด ๋ณ๊ฒฝ๋์ง ์๋๋ก ์ ์ฅ๋ ์ฌ์ ์์ ๊ณํํฉ๋๋ค. LoginScene๋ ํ์ฌ ๊ณ์ ๊ณผ ์ ์ฅ๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์ฌ์ฉํ์ฌ Reconnect๋ฅผ ์ผ๊ณ ์๋ ์ฌ์ฐ๊ฒฐ์ด ๊บผ์ง ๊ฒฝ์ฐ์๋ ๊ธฐ์ต๋ ์ค๋/์บ๋ฆญํฐ๋ก Connect๋ฅผ ํธ์ถํฉ๋๋ค.
- ํ์ ์ธ์์ ๋ค์ด๊ฐ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ง ์์ต๋๋ค. ์ถ๊ฐ ์์ ์ ์ฐ๊ฒฐ์ด ํ์ํ ๊ฒฝ์ฐ ๋ณ๋์ ๋๊ธฐ ํ UO.Connected๋ฅผ ํ์ธํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.Connect");
UO.Connect();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํธ์ถ์ ์ฐ๊ฒฐ์ ์์ํ๊ธฐ๋ง ํฉ๋๋ค.
UO.Connect();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฒ์ฆ์ ํตํด ์ฌ์์ฒญ์ ํผํ ์ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (!(Truth(UO.Connected())))
{
UO.Connect();
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 1000ms๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค๊ณ ํด์ ์ง์ ์ด ๋ณด์ฅ๋๋ ๊ฒ์ ์๋๋๋ค. ์ถ๋ ฅ์๋ ์ค์ ํ์ฌ ํ๋๊ทธ๊ฐ ํ์๋ฉ๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
UO.Connect();
await Delay(1000);
UO.Print(Convert.ToString(UO.Connected()));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ConnectClient:bridge.ConnectClient().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "connect": bridge.ConnectClient(); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.Connected();ํ์ฌ ์ธ์ ์ด ๊ฒ์ ์ธ๊ณ์ ์๋์ง, ๊ฒ์ ์ฐ๊ฒฐ์ด ์ด๋ ค ์๋์ง ํ์ธํฉ๋๋ค. ์บ๋ฆญํฐ ํ๋ ์ ์ด๋ ์ ์ฅ ๋๊ธฐ ์ค์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int. 1 - ํ๋ ์ด์ด, ๋ก๋๋ ์นด๋ ๋ฐ ํ์ฑ ๊ฒ์ ์์ผ์ด ๋์์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ด๋ฆฐ ํด๋ผ์ด์ธํธ ์ฐฝ, ์บ๋ฆญํฐ ๋ชฉ๋ก ๋๋ ๋ก๊ทธ์ธ ๋จ๊ณ์ TCP ์ฐ๊ฒฐ์ 1๋ฅผ ์๋ฏธํ์ง ์์ต๋๋ค. ์ซ์ ํ๋๊ทธ int: 1(์กฐ๊ฑด ์ถฉ์กฑ), 0(์กฐ๊ฑด ์ถฉ์กฑ๋์ง ์์). ์ด๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. C#์์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์ธ์!= 0 ๋๋ ๊ฒฐ๊ณผ == 0์ ๋๋ค. int์ true/false ๋ฐ if(๊ฒฐ๊ณผ)๋ฅผ ์ง์ ๋น๊ตํ๋ ๊ฒ์ ํ์ฉ๋์ง ์์ต๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค: serial, type, ์บ๋ฆญํฐ ์ด๋ฆ ๋ฐ IP๋ ์ ์กํ ์ ์์ต๋๋ค. UO.Online(), UO.Connected(), UO.IsOnline()๋ ๊ฐ์ ๊ฒ์ ํ์ธํ์ธ์. ์ด๋ ๋ค๋ฅธ ๊ด๋ฆฌ์ ํ๋กํ์ด ์๋ ํด๋น ์ธ์ ์์ ์์ ์ํ์ ๋๋ค.
- ์ด ๋ช ๋ น์ ๋ก์ปฌ ์ํ๋ง ์ฝ์ต๋๋ค. ํ์ ๋ณด๋ด์ง ์๊ณ , ์ฐ๊ฒฐํ์ง ์๊ณ , ์ผ์ ์ค์งํ์ง ์์ผ๋ฉฐ, ์ธํฐ๋ท ๊ฐ์ฉ์ฑ์ ํ์ธํ์ง ์์ต๋๋ค. ์ฝ์ ํ ์ฐ๊ฒฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. 1๋ ๋ค์ ์์ ์ ์ฑ๊ณต์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
- UO.Wait์๋ ๋ฐ๋ฆฌ์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค. ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ์๋ ์ผ์ ์ค์งํ๊ณ ์์ ์คํ์ ์๋์ผ๋ก ์ผ์ ์ค์งํฉ๋๋ค. ์๊ฐ ์ด๊ณผ ํ์ธ์ ์ผ์ ์ค์ง๊ฐ ์ ๊ฑฐ๋ ํ์๋ง ๊ณ์๋ฉ๋๋ค. ์ด๋ฌํ ๋ช ๋ น์ ์ผ์ ์ค์ง๋ฅผ ํด์ ํ์ง ์์ผ๋ฉฐ ์๋ ์ฌ์ฐ๊ฒฐ์ ํ์ฑํํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.Connected();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- false๋ 0์ ๋์ผํฉ๋๋ค. return์ Main์ UseSkill๋ก ์ข ๋ฃํฉ๋๋ค. ์คํฌ ์ด๋ฆ์ธ UseSkill์ ์ ์ผํ ๋งค๊ฐ๋ณ์๋ ํ์ด๋์ ๋๋ค. 1๋ฅผ ์ฌ์ฉํ๋ฉด ์คํฌ๋ฆฝํธ๋ ์คํฌ ์ฌ์ฉ๋ง์ ์์ฒญํฉ๋๋ค. ๊ฒฐ๊ณผ๋ ์บ๋ฆญํฐ์ ์๋ฒ์ ์ํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
- ์ด ๋ช ๋ น์ ๋ก์ปฌ ์ํ๋ง ์ฝ์ต๋๋ค. ํ์ ๋ณด๋ด์ง ์๊ณ , ์ฐ๊ฒฐํ์ง ์๊ณ , ์ผ์ ์ค์งํ์ง ์์ผ๋ฉฐ, ์ธํฐ๋ท ๊ฐ์ฉ์ฑ์ ํ์ธํ์ง ์์ต๋๋ค. ์ฝ์ ํ ์ฐ๊ฒฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. 1๋ ๋ค์ ์์ ์ ์ฑ๊ณต์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
if (Truth(Truth(UO.Connected()) == false))
{
return null;
}
UO.UseSkill("Hiding");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 0๊ณผ์ ๋น๊ต๋ ์๋ ์ฌ์ฐ๊ฒฐ ์ค์ ์ด ์๋ ํ์ฌ ์ฐ๊ฒฐ ์ํ๋ฅผ ํ์ธํฉ๋๋ค. ์ธ์๊ฐ ์๋ Connect๋ ์ ์ฅ๋ ์ค์ ์ ์ฌ์ฉํ๊ณ ๋ก๊ทธ์ธ์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ์ด๋ฏธ ์์๋ ๋ก๊ทธ์ธ ์ค์ ๋ช ๋ น์ ๋ฐ๋ณตํด๋ ๋ ๋ฒ์งธ ์ธ์ ์ด ์์ฑ๋์ด์๋ ์ ๋ฉ๋๋ค.
- ์ด ๋ช ๋ น์ ๋ก์ปฌ ์ํ๋ง ์ฝ์ต๋๋ค. ํ์ ๋ณด๋ด์ง ์๊ณ , ์ฐ๊ฒฐํ์ง ์๊ณ , ์ผ์ ์ค์งํ์ง ์์ผ๋ฉฐ, ์ธํฐ๋ท ๊ฐ์ฉ์ฑ์ ํ์ธํ์ง ์์ต๋๋ค. ์ฝ์ ํ ์ฐ๊ฒฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. 1๋ ๋ค์ ์์ ์ ์ฑ๊ณต์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Connected() == 0))
{
UO.Connect();
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- WaitForWorld(timeoutMs)๋ ๋ด์ฅ ๋ช ๋ น์ด ์๋ ์์ ํ ํ์๋ ์ฌ์ฉ์ ์ ์ ํจ์์ ๋๋ค. 5000 โ ์์ฐ(๋ฐ๋ฆฌ์ด), UO.Wait(50) โ ํ์ธ ๊ฐ๊ฒฉ. ์์ ๊ฐ์ false๋ฅผ ์ ๊ณตํฉ๋๋ค. 0 ๊ธฐ์ฑ ์ธ๊ณ๋ง ํ์ฉ๋ฉ๋๋ค. Timer๋ ์ด๋ฅผ ์ธก์ ํ๋ฏ๋ก ๊ทธ ์ฐจ์ด์ 1000์ ๊ณฑํฉ๋๋ค. ์๋ ์ผ์์ค์ง๋ ๋ฏธ๋ฆฌ ๊บผ์ผ ํ๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ์ข ๋ฃ๋ฉ๋๋ค. ์ด ํจ์๋ Connect๋ฅผ ํธ์ถํ์ง ์์ผ๋ฉฐ ์๊ฐ์ด ๋ง๋ฃ๋์ด๋ ์์๋ ์ ๋ ฅ์ ์ทจ์ํ์ง ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ๋ก์ปฌ ์ํ๋ง ์ฝ์ต๋๋ค. ํ์ ๋ณด๋ด์ง ์๊ณ , ์ฐ๊ฒฐํ์ง ์๊ณ , ์ผ์ ์ค์งํ์ง ์์ผ๋ฉฐ, ์ธํฐ๋ท ๊ฐ์ฉ์ฑ์ ํ์ธํ์ง ์์ต๋๋ค. ์ฝ์ ํ ์ฐ๊ฒฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. 1๋ ๋ค์ ์์ ์ ์ฑ๊ณต์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
if (Truth(UO.GetPauseScriptOnDisconnectStatus()))
{
return null;
}
if (Truth(await WaitForWorld(5000)))
{
UO.UseSkill("Hiding");
}
return null;
}
async Task<dynamic> WaitForWorld(dynamic timeoutMs)
{
if (Truth(timeoutMs < 0))
{
return false;
}
var started = Environment.TickCount;
while (!(Truth(UO.Connected())))
{
if (Truth((Environment.TickCount - started) * 1000.0 >= timeoutMs))
{
return false;
}
await Delay(50);
}
return true;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsOnline:bridge.IsOnline().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "connected": return new InjectionValue(bridge.IsOnline());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.ConnectedTime();์บ๋ฆญํฐ๊ฐ ๋ง์ง๋ง์ผ๋ก ์๋์ ์ฑ๊ณต์ ์ผ๋ก ์ง์ ํ ๋ฌ๋ ฅ ์คํฌํ๋ฅผ ๋ฐํํฉ๋๋ค. ๋์ผํ ์์ ์ ๊ณ์ํ๊ธฐ ์ ์ ๋๊ธฐํ๊ฑฐ๋ ์ผ์ ์ค์งํ๋ ๋์ ์ฐ๊ฒฐ์ด ๋ณ๊ฒฝ๋์๋์ง ์ดํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
double: 1899-12-30์ ์ผ์, ์์๋ถ - ์๊ฐ(OLE ์๋ํ ๋ ์ง). 0๋ ํด๋น ์ธ์ ์์ ์๊ฐ ์์ง ์ธ์์ ๋ค์ด์ค์ง ์์์์ ์๋ฏธํฉ๋๋ค. ์ฐ๊ฒฐ์ด ๋๊ธด ํ์๋ ๋ง์ง๋ง ์ ๋ ฅ ํ์๊ฐ ์ ์ง๋ฉ๋๋ค. ์ด๊ฒ์ bool ๋๋ ์ด ๋จ์์ ๊ธฐ๊ฐ์ด ์๋๋๋ค.
- ๋ ผ์์ด ์์ต๋๋ค. ๊ธฐ๋ก์ ๋์ผํ ์ธ์ ์์ ์์ ์คํฌ๋ฆฝํธ์ ๊ณตํต๋ฉ๋๋ค. ๋ฆ์ ์์, ์ผ์ ์ค์ง ๋ฐ ๋ซ๊ธฐ IDE๋ ํ์๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์๋ก์ด ์ธ์ ํ๋ก์ธ์ค๋ ์๋ก์ด ์ด์ผ๊ธฐ๋ฅผ ์์ํฉ๋๋ค. ๋ชจ๋ ์ฐ๊ฒฐ์ ๋ํ ๋ก๊ทธ๋ ์๋๋๋ค.
- ์๋์ ์บ๋ฆญํฐ๊ฐ ๋ํ๋์ง ์๊ณ ๋ก๊ทธ์ธ ์๋์ ์คํจํ๋ฉด ๋ก๊ทธ์ธ ์ฑ๊ณต์ผ๋ก ๊ฐ์ฃผ๋์ง ์์ต๋๋ค. ์คํ๋ผ์ธ ํ์ธ์ ๋ฐ๋ณตํด๋ ์ข ๋ฃ ์๊ฐ์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ํ์ฌ ์ํ์ ๊ฒฝ์ฐ 0์ด ์๋ ๋ ์ง ๋์ UO.Connected()๋ฅผ ์ฌ์ฉํ์ธ์.
- ์๊ณ๋ ์ปดํจํฐ์ ๋ก์ปฌ ์๊ณ์์ ๊ฐ์ ธ์ต๋๋ค. ์ฐจ์ด์ 86400์ ๊ณฑํ๋ฉด ๋ฌ๋ ฅ ์ด๊ฐ ๋ฉ๋๋ค. ์๊ณ/์๊ฐ๋๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๊ฒฐ๊ณผ๊ฐ ์๊ณก๋ ์ ์์ต๋๋ค. ์๊ฐ ์ด๊ณผ์ ๊ฒฝ์ฐ ๋จ์กฐ๋ก์ด Timer()๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฐ๋ณ ํธ์ถ์ ์์์ ์ค๋ ์ท์ ํ์ฑํ์ง ์์ต๋๋ค. ๋์ผํ ํ์๋ ๊ณ ์ ํ ID ์ฐ๊ฒฐ์ด ์๋๋๋ค.
- UO.Wait์๋ ๋ฐ๋ฆฌ์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค. ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ์๋ ์ผ์ ์ค์งํ๊ณ ์์ ์คํ์ ์๋์ผ๋ก ์ผ์ ์ค์งํฉ๋๋ค. ์๊ฐ ์ด๊ณผ ํ์ธ์ ์ผ์ ์ค์ง๊ฐ ์ ๊ฑฐ๋ ํ์๋ง ๊ณ์๋ฉ๋๋ค. ์ด๋ฌํ ๋ช ๋ น์ ์ผ์ ์ค์ง๋ฅผ ํด์ ํ์ง ์์ผ๋ฉฐ ์๋ ์ฌ์ฐ๊ฒฐ์ ํ์ฑํํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.ConnectedTime();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 0๋ ์ด ํน์ ํ๋ก์ธ์ค์ ์ ๋ ฅ์ด ์๋์ง ํ์ธํฉ๋๋ค. Connect ์ ์ฅ๋ ํ๋กํ์ ์ฌ์ฉํ๋ฉฐ ๋ก๊ทธ์ธ๋ง ์์ฒญํฉ๋๋ค. ์ด ์์์๋ ์ด๋ฏธ ์ข ๋ฃ๋ ์ฐ๊ฒฐ์ ์๋์ ์ผ๋ก ๋ณต์ํ์ง ์์ต๋๋ค.
- UO.Wait์๋ ๋ฐ๋ฆฌ์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค. ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ์๋ ์ผ์ ์ค์งํ๊ณ ์์ ์คํ์ ์๋์ผ๋ก ์ผ์ ์ค์งํฉ๋๋ค. ์๊ฐ ์ด๊ณผ ํ์ธ์ ์ผ์ ์ค์ง๊ฐ ์ ๊ฑฐ๋ ํ์๋ง ๊ณ์๋ฉ๋๋ค. ์ด๋ฌํ ๋ช ๋ น์ ์ผ์ ์ค์ง๋ฅผ ํด์ ํ์ง ์์ผ๋ฉฐ ์๋ ์ฌ์ฐ๊ฒฐ์ ํ์ฑํํ์ง ์์ต๋๋ค.
if (Truth(UO.ConnectedTime() == 0))
{
UO.Connect();
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 30.0 โ ๋ช ์ด ๋ง์ ์์ฐ ๋ชจ๋ํฐ๋ง Timer; 250 โ ๊ฐ๊ฒฉ UO.Wait(๋ฐ๋ฆฌ์ด) ์ง์ ํ์๋ฅผ ๋ณ๊ฒฝํ ํ CancelWaitTarget๋ ์ด์ ์ง์ฐ ๋์์ ์ง์๋๋ค. ์๋ก์ด ์ ๋ ฅ์ด ์์ผ๋ฉด ์ด ์์ ์์ด ๋ฃจํ๊ฐ ์ข ๋ฃ๋ฉ๋๋ค.
- UO.Wait์๋ ๋ฐ๋ฆฌ์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค. ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ์๋ ์ผ์ ์ค์งํ๊ณ ์์ ์คํ์ ์๋์ผ๋ก ์ผ์ ์ค์งํฉ๋๋ค. ์๊ฐ ์ด๊ณผ ํ์ธ์ ์ผ์ ์ค์ง๊ฐ ์ ๊ฑฐ๋ ํ์๋ง ๊ณ์๋ฉ๋๋ค. ์ด๋ฌํ ๋ช ๋ น์ ์ผ์ ์ค์ง๋ฅผ ํด์ ํ์ง ์์ผ๋ฉฐ ์๋ ์ฌ์ฐ๊ฒฐ์ ํ์ฑํํ์ง ์์ต๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var login = UO.ConnectedTime();
var started = Environment.TickCount;
while (Truth(Environment.TickCount - started < 30.0))
{
if (Truth(UO.Connected()) && Truth(UO.ConnectedTime() != login))
{
UO.CancelWaitTarget();
return null;
}
await Delay(250);
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- SameConnection(๋ก๊ทธ์ธ)์ bool์ ๋ฐํํฉ๋๋ค. ํ์๋ฅผ ์ ์ฅํ๊ณ 500ms ๋์ ๊ธฐ๋ค๋ฆฐ ํ ์ฐ๊ฒฐ์ด ์๊ฑฐ๋ ์ ๋ ฅ์ด ๋ณ๊ฒฝ๋๋ฉด ๊ณ์์ ๊ธ์งํฉ๋๋ค. ์ด๋ ์ฌํ ์คํธ์ด๋ฉฐ ํฅํ ์๋ฒ ๊ฐ์ฉ์ฑ์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
- UO.Wait์๋ ๋ฐ๋ฆฌ์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค. ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ์๋ ์ผ์ ์ค์งํ๊ณ ์์ ์คํ์ ์๋์ผ๋ก ์ผ์ ์ค์งํฉ๋๋ค. ์๊ฐ ์ด๊ณผ ํ์ธ์ ์ผ์ ์ค์ง๊ฐ ์ ๊ฑฐ๋ ํ์๋ง ๊ณ์๋ฉ๋๋ค. ์ด๋ฌํ ๋ช ๋ น์ ์ผ์ ์ค์ง๋ฅผ ํด์ ํ์ง ์์ผ๋ฉฐ ์๋ ์ฌ์ฐ๊ฒฐ์ ํ์ฑํํ์ง ์์ต๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var login = UO.ConnectedTime();
await Delay(500);
if (!(Truth(SameConnection(login))))
{
return null;
}
UO.AddToSystemJournal("Same connection; continue this batch");
return null;
}
dynamic SameConnection(dynamic login)
{
return Truth(login != 0) && Truth(UO.Connected()) && Truth(UO.ConnectedTime() == login);
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.UpdateConnectionState:UpdateConnectionState().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "connectedtime":
UpdateConnectionState();
return new InjectionValue(state.ConnectedTime == default(DateTime) ? 0d : state.ConnectedTime.ToOADate());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.Disconnect();ํ์ฌ ๋๋ ์ค์น๋ ํด๋ผ์ด์ธํธ ์ ์ก์ ์ฐ๊ฒฐ์ ๋๊ณ ๋ค์ ์ฐ๊ฒฐํ๊ธฐ ์ํ ์คํฌ๋ฆฝํธ๋ฅผ ์ค๋นํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- ์๋ ์ฌ์ฐ๊ฒฐ์ด ๊บผ์ง ๊ฒฝ์ฐ BeginScriptControlledDisconnect๋ ์์ ์๊ฐ ๋์ค์ ์ ํํ ์ ์๋๋ก ์ ์ฅํฉ๋๋ค UO.Connect. ๊ด๋ฆฌ์ ์ธ์ ์ RequestDisconnect๋ฅผ ์์ ํฉ๋๋ค.
- ๋ ๋ฆฝํ ํด๋ผ์ด์ธํธ๋ Socket.Disconnect ๋ฐ PrepareForReconnect๋ฅผ ํธ์ถํฉ๋๋ค. ์ ์ญ ์ฌ์ฐ๊ฒฐ์ด ํ์ฑํ๋๋ฉด ์ ์ฅ๋ ์ฅ๋ฉด ์ ํ์ ๋ช ์์ ์ผ๋ก ์์ฝํฉ๋๋ค. LoginScene์์๋ ํ์ ์ ์ง์ฐ๊ณ Main์ ๋ฐํํฉ๋๋ค.
- void๋ฅผ ๋ฐํํ๋ฉด ์ฌ์ ์ ๊ฒฐ๊ณผ๊ฐ ๋ณด๊ณ ๋์ง ์์ต๋๋ค. ์ฐ๊ฒฐ ์ํ๋ ๋ณ๋๋ก ์ฝํ์ง๋๋ค. ์๋ ์ฌ์ฐ๊ฒฐ ์ค์ ์ ํตํด ์๋ก์ด ๋ก๊ทธ์ธ์ ์์ํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.Disconnect");
UO.Disconnect();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ๋ช ๋ น์ ํ์ฑ ์ ์ก๊ณผ ์ค์น๋ ์ ์ก์ ๋ชจ๋ ์ทจ์ํฉ๋๋ค.
UO.Disconnect();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- AR๊ฐ ๋นํ์ฑํ๋๋ฉด ํธ์ถ ์์ ์๋ ์ค์ค๋ก Connect์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
UO.Disconnect();
await Delay(1000);
UO.Connect();
return null;
}
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()
{
if (Truth(UO.Connected()))
{
UO.Disconnect();
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.DisconnectClient:bridge.DisconnectClient().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "disconnect": bridge.DisconnectClient(); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.DisconnectedTime();๋ง์ง๋ง์ผ๋ก ๊ฒ์ ์ฐ๊ฒฐ์ด ๋์ด์ก์ ๋์ ๋ฌ๋ ฅ ์คํฌํ๋ฅผ ๋ฐํํฉ๋๋ค. ์ค๋จ์ ์ง๋จํ๊ณ ์ฐ๊ฒฐ ์๋ฃ ๊ธฐ๊ฐ์ ์ถ์ ํ๋ ๋ฐ ํ์ํ๋ฉฐ ๋ก๊ทธ์ธ ์๋ ํ์๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐ๋ ํ์ํ์ง ์์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
double: ํ๋ฃจ ์ค ๋ถ์ ๋ถ๋ถ์ด ํฌํจ๋ 1899-12-30์ ์ผ์์ ๋๋ค. ํด์ ํ - ํด๋ผ์ด์ธํธ๊ฐ ์ค๋จ์ ์ธ์งํ ์๊ฐ์ ๋๋ค. ์ฒซ ๋ฒ์งธ ์ค๋จ ์ ์ ์ธ์ ์์ ์๊ฐ ์์ฑ๋ ์๊ฐ์ ๋๋ค. ์ด๋ ์คํ๋ผ์ธ ํ๋๊ทธ๊ฐ ์๋๋ฉฐ ๋ฐ๋ฆฌ์ด๋ ์๋๋๋ค.
- ๋ ผ์์ด ์์ต๋๋ค. ๊ธฐ๋ก์ ๋์ผํ ์ธ์ ์์ ์์ ์คํฌ๋ฆฝํธ์ ๊ณตํต๋ฉ๋๋ค. ๋ฆ์ ์์, ์ผ์ ์ค์ง ๋ฐ ๋ซ๊ธฐ IDE๋ ํ์๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์๋ก์ด ์ธ์ ํ๋ก์ธ์ค๋ ์๋ก์ด ์ด์ผ๊ธฐ๋ฅผ ์์ํฉ๋๋ค. ๋ชจ๋ ์ฐ๊ฒฐ์ ๋ํ ๋ก๊ทธ๋ ์๋๋๋ค.
- ์๋์ ์บ๋ฆญํฐ๊ฐ ๋ํ๋์ง ์๊ณ ๋ก๊ทธ์ธ ์๋์ ์คํจํ๋ฉด ๋ก๊ทธ์ธ ์ฑ๊ณต์ผ๋ก ๊ฐ์ฃผ๋์ง ์์ต๋๋ค. ์คํ๋ผ์ธ ํ์ธ์ ๋ฐ๋ณตํด๋ ์ข ๋ฃ ์๊ฐ์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ํ์ฌ ์ํ์ ๊ฒฝ์ฐ 0์ด ์๋ ๋ ์ง ๋์ UO.Connected()๋ฅผ ์ฌ์ฉํ์ธ์.
- ์๊ณ๋ ์ปดํจํฐ์ ๋ก์ปฌ ์๊ณ์์ ๊ฐ์ ธ์ต๋๋ค. ์ฐจ์ด์ 86400์ ๊ณฑํ๋ฉด ๋ฌ๋ ฅ ์ด๊ฐ ๋ฉ๋๋ค. ์๊ณ/์๊ฐ๋๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๊ฒฐ๊ณผ๊ฐ ์๊ณก๋ ์ ์์ต๋๋ค. ์๊ฐ ์ด๊ณผ์ ๊ฒฝ์ฐ ๋จ์กฐ๋ก์ด Timer()๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฐ๋ณ ํธ์ถ์ ์์์ ์ค๋ ์ท์ ํ์ฑํ์ง ์์ต๋๋ค. ๋์ผํ ํ์๋ ๊ณ ์ ํ ID ์ฐ๊ฒฐ์ด ์๋๋๋ค.
- UO.Wait์๋ ๋ฐ๋ฆฌ์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค. ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ์๋ ์ผ์ ์ค์งํ๊ณ ์์ ์คํ์ ์๋์ผ๋ก ์ผ์ ์ค์งํฉ๋๋ค. ์๊ฐ ์ด๊ณผ ํ์ธ์ ์ผ์ ์ค์ง๊ฐ ์ ๊ฑฐ๋ ํ์๋ง ๊ณ์๋ฉ๋๋ค. ์ด๋ฌํ ๋ช ๋ น์ ์ผ์ ์ค์ง๋ฅผ ํด์ ํ์ง ์์ผ๋ฉฐ ์๋ ์ฌ์ฐ๊ฒฐ์ ํ์ฑํํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.DisconnectedTime();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- CompletedConnectionSeconds()๋ ์ฐ๊ฒฐ์ด ์๋ฃ๋์ง ์์๊ฑฐ๋ ์ฝ๊ธฐ ์ฌ์ด์ ์ ๋ ฅ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ์ด ๋๋ -1๋ฅผ ๋ฐํํฉ๋๋ค. 86400 โ ํ๋ฃจ์ ์ด. ๋ง์ง๋ง ์ ๋ ฅ/์ค๋จ ์๋ง ๋ค์ ๊ณ์ฐ๋ฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ๋ชจ๋ ์ธ์ ์ ๊ธฐ๋ก์ ์์ฝํ์ง ์์ต๋๋ค.
- UO.Wait์๋ ๋ฐ๋ฆฌ์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค. ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ์๋ ์ผ์ ์ค์งํ๊ณ ์์ ์คํ์ ์๋์ผ๋ก ์ผ์ ์ค์งํฉ๋๋ค. ์๊ฐ ์ด๊ณผ ํ์ธ์ ์ผ์ ์ค์ง๊ฐ ์ ๊ฑฐ๋ ํ์๋ง ๊ณ์๋ฉ๋๋ค. ์ด๋ฌํ ๋ช ๋ น์ ์ผ์ ์ค์ง๋ฅผ ํด์ ํ์ง ์์ผ๋ฉฐ ์๋ ์ฌ์ฐ๊ฒฐ์ ํ์ฑํํ์ง ์์ต๋๋ค.
var seconds = CompletedConnectionSeconds();
if (Truth(seconds >= 0))
{
UO.AddToSystemJournal("Completed connection seconds: " + Convert.ToString(seconds));
}
dynamic CompletedConnectionSeconds()
{
var login = UO.ConnectedTime();
var loss = UO.DisconnectedTime();
if (Truth(login == 0) || Truth(loss < login) || Truth(UO.Connected()))
{
return -1;
}
if (Truth(UO.ConnectedTime() != login))
{
return -1;
}
return (loss - login) * 86400.0;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๋ ์ผ์ ์ค์ง๊ฐ ํ์ฑํ๋๋ฉด ์ด ์ปจํธ๋กค๋ฌ๋ ์ฆ์ ์ข ๋ฃ๋ฉ๋๋ค. ์คํ๋ผ์ธ์ผ๋ก ์์ ํ๋ ค๋ฉด ๋ฏธ๋ฆฌ ๊บผ์ผ ํฉ๋๋ค. UO.Wait(1000) ์คํ๋ผ์ธ ์ดํ ์ด์ ๊ตฌ๋ถ ๊ธฐํธ๋ฅผ ๋ค์ ํ์ธํฉ๋๋ค. Connect๋ ์ฑ๊ณต์ ๋ณด์ฅํ์ง ์์ผ๋ฉฐ ์๋ ์ฌ์ฐ๊ฒฐ ์ค์ ์ ๋์ฒดํ์ง ์์ต๋๋ค.
- UO.Wait์๋ ๋ฐ๋ฆฌ์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค. ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ์๋ ์ผ์ ์ค์งํ๊ณ ์์ ์คํ์ ์๋์ผ๋ก ์ผ์ ์ค์งํฉ๋๋ค. ์๊ฐ ์ด๊ณผ ํ์ธ์ ์ผ์ ์ค์ง๊ฐ ์ ๊ฑฐ๋ ํ์๋ง ๊ณ์๋ฉ๋๋ค. ์ด๋ฌํ ๋ช ๋ น์ ์ผ์ ์ค์ง๋ฅผ ํด์ ํ์ง ์์ผ๋ฉฐ ์๋ ์ฌ์ฐ๊ฒฐ์ ํ์ฑํํ์ง ์์ต๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
if (Truth(UO.GetPauseScriptOnDisconnectStatus()))
{
return null;
}
if (Truth(UO.Connected()))
{
return null;
}
var loss = UO.DisconnectedTime();
await Delay(1000);
if (!(Truth(UO.Connected())) && Truth(UO.DisconnectedTime() == loss))
{
UO.Connect();
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- previousLoss์ ๋น๊ตํ๋ฉด ์ด๋ฏธ ์ฌ์ง์ ์ด ๋ฐ์ํ ํ์๋ ์ค๋จ์ด ๋ฐ์ํจ์ ์ ์ ์์ต๋๋ค. 30์ด๋ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ ๋์ ๋ชจ๋ํฐ๋ง์ ์ ํํ๊ณ , WaitAsync(250)๋ ๊ฒ์ฌ ์ฌ์ด์ ์ค๋ ๋๋ฅผ ํด์ ํฉ๋๋ค. ์ฌ๋ฌ ๋ฐฉํด ์์๋ฅผ ํ๋์ ์๋ฆผ์ผ๋ก ๊ฒฐํฉํ ์ ์์ต๋๋ค.
- UO.Wait์๋ ๋ฐ๋ฆฌ์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค. ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ์๋ ์ผ์ ์ค์งํ๊ณ ์์ ์คํ์ ์๋์ผ๋ก ์ผ์ ์ค์งํฉ๋๋ค. ์๊ฐ ์ด๊ณผ ํ์ธ์ ์ผ์ ์ค์ง๊ฐ ์ ๊ฑฐ๋ ํ์๋ง ๊ณ์๋ฉ๋๋ค. ์ด๋ฌํ ๋ช ๋ น์ ์ผ์ ์ค์ง๋ฅผ ํด์ ํ์ง ์์ผ๋ฉฐ ์๋ ์ฌ์ฐ๊ฒฐ์ ํ์ฑํํ์ง ์์ต๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var previousLoss = UO.DisconnectedTime();
var started = Environment.TickCount;
while (Truth(Environment.TickCount - started < 30.0))
{
if (Truth(UO.DisconnectedTime() != previousLoss))
{
UO.AddToSystemJournal("A connection loss occurred; check the session");
return null;
}
await Delay(250);
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.UpdateConnectionState:UpdateConnectionState().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "disconnectedtime":
UpdateConnectionState();
return new InjectionValue(state.DisconnectedTime.ToOADate());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GameServerIPString();ํด๋ผ์ด์ธํธ์ ์ ์ญ ์ค์ ์์ ๊ตฌ์ฑ๋ ์๋ฒ ์ฃผ์๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
string โ Settings.GlobalSettings.IP ๋๋ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ๋น ๋ฌธ์์ด์ ๋๋ค.
- ํ์ฌ ๋ธ๋ฆฌ์ง์ GameServerAddress๋ ์ ์ญ ์ค์ IP์ ์ฝ์ต๋๋ค. ์ด๋ DNS/network ์์ฒญ๋ ์๋๊ณ ์ค์ ํผ์ด์ ์ฃผ์๋ฅผ ํ์ธํ๋ ๊ฒ๋ ์๋๋๋ค. ๊ด๋ฆฌ์ ์ธ์ ์ ์์ฒด ์ฐ๊ฒฐ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GameServerIPString();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ์ ์ญ ์ค์ IP์ด ๋ฐํ๋ฉ๋๋ค.
var address = UO.GameServerIPString();
UO.Print(address);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ณต๋ฐฑ ๊ฐ์ ๊ตฌ์ฑ์ด ์์์ ๋ํ๋ด๋ฉฐ ์ธก์ ๋ ๋คํธ์ํฌ ์ค๋ฅ๊ฐ ์๋์ ๋ํ๋ ๋๋ค.
return RunScenario();
object? RunScenario()
{
var address = UO.GameServerIPString();
if (Truth(Len(address) == 0))
{
UO.Print("no configured address");
}
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 await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var address = UO.GameServerIPString();
await Delay(100);
UO.Print(address);
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GameServerAddress:bridge.GameServerAddress.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "gameserveripstring": return new InjectionValue(bridge.GameServerAddress);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetCharsListForShard();ํด๋ผ์ด์ธํธ์ ์๋ ค์ง ํ์ฌ ์ค๋์ ์บ๋ฆญํฐ ์ด๋ฆ์ ๋ฐํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๋ฌธ์์ด ๋ฐฐ์ด. ์๋ ค์ง ์ด๋ฆ์ด ์์ผ๋ฉฐ ํ์ฌ ๋ฌธ์๋ ๋น ๋ฐฐ์ด์ ๋๋ค.
- ๊ด๋ฆฌ์ ์ธ์ ์ SessionControl.Characters๋ฅผ ์ฝ์ต๋๋ค. ๋ ๋ฆฝ ์คํํ์์๋ LastCharacterManager๊ฐ ๊ณ์ /์๋ฒ์ ๋จผ์ ์ฌ์ฉ๋ฉ๋๋ค. ๋ชฉ๋ก์ด ๋น์ด ์์ผ๋ฉด LoginScene.๋ฌธ์๊ฐ ์๋ ์ด๋ฆ์ ์ฝ์ผ์ธ์. ๊ทธ๋ฌ๋ฉด ํ์ฌ Player.Name๊ฐ ์ ์ผํ ์์๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- ์ด๋ ์ง์ญ์ ์ผ๋ก ์ ๋ช ํ ์ด๋ฆ์ ๋๋ค. ์ด ๋ช ๋ น์ ์๋ฒ์์ ์ ์ฒด ๋ชฉ๋ก์ ์์ฒญํ์ง ์์ผ๋ฉฐ ์บ์์ ์ต์ ์ฑ์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetCharsListForShard();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฃจํ๋ ์๋ ค์ง ์ด๋ฆ์ ์ค์ ๋ฐฐ์ด์์ ์๋ํฉ๋๋ค.
var names = UO.GetCharsListForShard();
for (int i = (int)(0); i <= ArrayLength(names)-1; i += (int)(1))
{
UO.Print(names[i]);
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ๋ฑ์ค 0๋ ๋น์ด ์์ง ์์ ๋ฐฐ์ด์๋ง ์ฌ์ฉ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var names = UO.GetCharsListForShard();
if (Truth(ArrayLength(names) > 0))
{
UO.Print(names[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 names = UO.GetCharsListForShard();
UO.Print(Convert.ToString(ArrayLength(names)));
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.GetCharactersForCurrentShard()). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetCharactersForCurrentShard:bridge.GetCharactersForCurrentShard().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getcharslistforshard": return StringArray(bridge.GetCharactersForCurrentShard());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetPing();
int UO.GetPing(object? timeout);๊ฒ์ ์๋ฒ ์๋ต ์ง์ฐ์ ์ฝ์ต๋๋ค. ์ธ์๊ฐ ์์ผ๋ฉด ๋ง์ง๋ง ์ฐจ์์ ์ฌ์ฉํฉ๋๋ค. ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ฉด ์๋ก์ด ์๋ต์ ์์ฒญํฉ๋๋ค.
-
timeout- ์๊ฐ ์ด๊ณผ / timeoutMS - ํ ๋ฒ์ ์๋์ ๋ํ ๋๊ธฐ ์๊ฐ(๋ฐ๋ฆฌ์ด)์ผ๋ก, int๋ก ๋ณํ๋ฉ๋๋ค. ์์ ๊ฐ์ 0์ผ๋ก ์ ํ๋ฉ๋๋ค. 0๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฒญ์ด ์ ์ก๋ ์ ์์ง๋ง ์๋ต์ ๊ธฐ๋ํ ์๋ ์์ต๋๋ค. ๋ฌดํ์ ํ์์์์ด ์๋๋๋ค.
int, ๋ฐ๋ฆฌ์ด. ๊ฐ >= 0 โ ์ธก์ ; 0 ms๋ ํ์ฉ๋ฉ๋๋ค. -1 - ์ธก์ ์์: ์ธ์๊ฐ ์๋ ์์์ ๊ฒฝ์ฐ ์์ฒญ์ด ์๋ฃ๋์ง ์์๊ฑฐ๋ ์๋ต์ด ์ ๋์ ์์ ๋์ง ์์์ต๋๋ค. ์ด๊ฒ์ bool์ด ์๋๋๋ค. 0๋ ์คํจ๋ก ๊ฐ์ฃผํ ์ ์์ผ๋ฉฐ -1๋ ์ฑ๊ณต์ผ๋ก ๊ฐ์ฃผํ ์ ์์ต๋๋ค.
- GetPing()๋ ์๋ฌด ๊ฒ๋ ๋ณด๋ด์ง ์๊ณ ์ฆ์ ๋ง์ง๋ง ServerPing์ ์ฝ์ต๋๋ค. ์ด์ ๊ฐ ์์ฒด๋ก๋ ์ฐ๊ฒฐ์ด ํ์ฌ ์๋ํ๊ณ ์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค. ์ด๊ฒ์ ํํํ/๋ฐฑ์ TCP ํ์๊ธฐ ping ๋ฐ ICMP Ping(ํธ์คํธ)์ด ์๋ ๋ง์ง๋ง ์๋ฒ ์์ฝ ์ธก์ ์ ๋๋ค. GetPing(timeout)์ ์๋ก์ด ์๋ต์ ๊ธฐ๋ค๋ฆฐ ํ ๋ง์ง๋ง ์๋ฒ ์ธก์ ๊ฐ์ ์ฝ์ต๋๋ค.
- ๊ธฐ๋ค๋ฆฌ๋ฉด ๊ฒ์ ๋์์ ํ์ธํ๋ ๋์ ํธ์ถ ์คํฌ๋ฆฝํธ๊ฐ ์ง์ฐ๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ๋ค์ ์ฐ๊ฒฐ๋์ง ์์ผ๋ฉฐ ๋คํธ์ํฌ ์ค์ ์ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์๋ฒ๊ฐ ์์ฝ์ ์๋ตํ์ง ์์ ์ ์์ต๋๋ค. ์คํจ ์์ฒด๋ก๋ ์ฐ๊ฒฐ์ด ๋์ด์ก๋ค๋ ๊ฒ์ ์ฆ๋ช ํ ์ ์์ต๋๋ค. ํ์ด๋ฐ์ ํ๋ฆ ์ผ์ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ๋ชจ๋ ํ๋ ์์์ ํ์ฑ ๊ฒ์ฌ๋ฅผ ํธ์ถํ์ง ๋ง์ธ์. ์คํฌ๋ฆฝํธ๋ฅผ ์ค์งํ๋ฉด ๋๊ธฐ๊ฐ ์ค๋จ๋ฉ๋๋ค.
- UO.GetPing ยท UO.CheckLag ยท UO.IsOnline
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetPing();
UO.Print("GetPing: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๋ก์ด ๋คํธ์ํฌ ์์ฒญ ์์ด ์บ์๋ฅผ ์ฝ์ต๋๋ค. ์ด ์์์๋ 50 ๋๋ 200ms๋ฅผ ์ ํํ์ฌ 250ms ์๊ณ๊ฐ์์ ์คํฌ๋ฆฝํธ ์์ฒด๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค. ์ ์ ์๋ ์ฐจ์์ ๋ณ๋๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ด ์ซ์๋ ๋ฒ์ฉ ์๋ฒ ์ ํ์ด ์๋ ์์ ์ค์ ์ ๋๋ค.
var pingMs = UO.GetPing();
if (Truth(pingMs < 0))
{
UO.Print("No server latency sample");
return null;
}
var delayMs = 50;
if (Truth(pingMs > 250))
{
delayMs = 200;
}
await Delay(delayMs);
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 1000 โ ์๋ก์ด ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ ์ต๋ ์๊ฐ(๋ฐ๋ฆฌ์ด)์ ๋๋ค. -1์์ ์ ์ฐจ๊ฐ ์ข ๋ฃ๋ฉ๋๋ค. ์ธก์ ์ด ์ฑ๊ณตํ๋ฉด Hiding์ด ์์ฒญ๋ฉ๋๋ค. ์์ฝ ์๋ต์ ํด๋น ์คํฌ์ ์ฑ๊ณต์ ์ธ ์ฌ์ฉ์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var pingMs = UO.GetPing(1000);
if (Truth(pingMs == -1))
{
UO.Print("No fresh server response");
return null;
}
UO.UseSkill("Hiding");
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- MeanPing(์ํ, timeoutMs) ์ ์ฒด๊ฐ ํ์๋จ: 3๋ 500ms๋ฅผ ์๋ํฉ๋๋ค. ์คํจํ ์ธก์ ์ ํ๊ท ์์ ์ ์ธ๋ฉ๋๋ค. ์ฑ๊ณตํ ๊ฒ์ด ์์ผ๋ฉด -1๊ฐ ๋ฐํ๋ฉ๋๋ค. ์ํ์ 1โ10๋ก ์ ํ๋ฉ๋๋ค. UO.Wait(100)๋ ์๋ ๊ฐ ์์ฒญ ๋น์จ์ ์ค์ ๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var meanMs = await MeanPing(3, 500);
if (Truth(meanMs < 0))
{
UO.Print("No successful samples");
}
else
{
UO.Print("Measured mean, ms: " + Convert.ToString(meanMs));
}
return null;
}
async Task<dynamic> MeanPing(dynamic samples, dynamic timeoutMs)
{
if (Truth(samples < 1) || Truth(samples > 10))
{
return -1;
}
var total = 0;
var count = 0;
for (int i = (int)(1); i <= samples; i += (int)(1))
{
var current = UO.GetPing(timeoutMs);
if (Truth(current >= 0))
{
total = total + current;
count = count + 1;
}
await Delay(100);
}
if (Truth(count == 0))
{
return -1;
}
return total / count;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetPing. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetPing:bridge.GetPing().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetPing() => bridge.GetPing();๋งค๊ฐ๋ณ์: timeout (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetPing. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetPing:bridge.GetPing(Math.Max(0, NumberConversions.ToInt(timeout))). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(timeout).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetPing(InjectionValue timeout) => bridge.GetPing(Math.Max(0, NumberConversions.ToInt(timeout)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.IsOnline();ํ์ฌ ์ธ์ ์ด ๊ฒ์ ์ธ๊ณ์ ์๋์ง, ๊ฒ์ ์ฐ๊ฒฐ์ด ์ด๋ ค ์๋์ง ํ์ธํฉ๋๋ค. ์บ๋ฆญํฐ ํ๋ ์ ์ด๋ ์ ์ฅ ๋๊ธฐ ์ค์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int. 1 - ํ๋ ์ด์ด, ๋ก๋๋ ์นด๋ ๋ฐ ํ์ฑ ๊ฒ์ ์์ผ์ด ๋์์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ด๋ฆฐ ํด๋ผ์ด์ธํธ ์ฐฝ, ์บ๋ฆญํฐ ๋ชฉ๋ก ๋๋ ๋ก๊ทธ์ธ ๋จ๊ณ์ TCP ์ฐ๊ฒฐ์ 1๋ฅผ ์๋ฏธํ์ง ์์ต๋๋ค. ์ซ์ ํ๋๊ทธ int: 1(์กฐ๊ฑด ์ถฉ์กฑ), 0(์กฐ๊ฑด ์ถฉ์กฑ๋์ง ์์). ์ด๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. C#์์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์ธ์!= 0 ๋๋ ๊ฒฐ๊ณผ == 0์ ๋๋ค. int์ true/false ๋ฐ if(๊ฒฐ๊ณผ)๋ฅผ ์ง์ ๋น๊ตํ๋ ๊ฒ์ ํ์ฉ๋์ง ์์ต๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค: serial, type, ์บ๋ฆญํฐ ์ด๋ฆ ๋ฐ IP๋ ์ ์กํ ์ ์์ต๋๋ค. UO.Online(), UO.Connected(), UO.IsOnline()๋ ๊ฐ์ ๊ฒ์ ํ์ธํ์ธ์. ์ด๋ ๋ค๋ฅธ ๊ด๋ฆฌ์ ํ๋กํ์ด ์๋ ํด๋น ์ธ์ ์์ ์์ ์ํ์ ๋๋ค.
- ์ด ๋ช ๋ น์ ๋ก์ปฌ ์ํ๋ง ์ฝ์ต๋๋ค. ํ์ ๋ณด๋ด์ง ์๊ณ , ์ฐ๊ฒฐํ์ง ์๊ณ , ์ผ์ ์ค์งํ์ง ์์ผ๋ฉฐ, ์ธํฐ๋ท ๊ฐ์ฉ์ฑ์ ํ์ธํ์ง ์์ต๋๋ค. ์ฝ์ ํ ์ฐ๊ฒฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. 1๋ ๋ค์ ์์ ์ ์ฑ๊ณต์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
- UO.Wait์๋ ๋ฐ๋ฆฌ์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค. ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ์๋ ์ผ์ ์ค์งํ๊ณ ์์ ์คํ์ ์๋์ผ๋ก ์ผ์ ์ค์งํฉ๋๋ค. ์๊ฐ ์ด๊ณผ ํ์ธ์ ์ผ์ ์ค์ง๊ฐ ์ ๊ฑฐ๋ ํ์๋ง ๊ณ์๋ฉ๋๋ค. ์ด๋ฌํ ๋ช ๋ น์ ์ผ์ ์ค์ง๋ฅผ ํด์ ํ์ง ์์ผ๋ฉฐ ์๋ ์ฌ์ฐ๊ฒฐ์ ํ์ฑํํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.IsOnline();
UO.Print("IsOnline: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- false๋ 0์ ๋์ผํฉ๋๋ค. return์ Main์ UseSkill๋ก ์ข ๋ฃํฉ๋๋ค. ์คํฌ ์ด๋ฆ์ธ UseSkill์ ์ ์ผํ ๋งค๊ฐ๋ณ์๋ ํ์ด๋์ ๋๋ค. 1๋ฅผ ์ฌ์ฉํ๋ฉด ์คํฌ๋ฆฝํธ๋ ์คํฌ ์ฌ์ฉ๋ง์ ์์ฒญํฉ๋๋ค. ๊ฒฐ๊ณผ๋ ์บ๋ฆญํฐ์ ์๋ฒ์ ์ํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
- ์ด ๋ช ๋ น์ ๋ก์ปฌ ์ํ๋ง ์ฝ์ต๋๋ค. ํ์ ๋ณด๋ด์ง ์๊ณ , ์ฐ๊ฒฐํ์ง ์๊ณ , ์ผ์ ์ค์งํ์ง ์์ผ๋ฉฐ, ์ธํฐ๋ท ๊ฐ์ฉ์ฑ์ ํ์ธํ์ง ์์ต๋๋ค. ์ฝ์ ํ ์ฐ๊ฒฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. 1๋ ๋ค์ ์์ ์ ์ฑ๊ณต์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
if (Truth(Truth(UO.IsOnline()) == false))
{
return null;
}
UO.UseSkill("Hiding");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 0๊ณผ์ ๋น๊ต๋ ์๋ ์ฌ์ฐ๊ฒฐ ์ค์ ์ด ์๋ ํ์ฌ ์ฐ๊ฒฐ ์ํ๋ฅผ ํ์ธํฉ๋๋ค. ์ธ์๊ฐ ์๋ Connect๋ ์ ์ฅ๋ ์ค์ ์ ์ฌ์ฉํ๊ณ ๋ก๊ทธ์ธ์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ์ด๋ฏธ ์์๋ ๋ก๊ทธ์ธ ์ค์ ๋ช ๋ น์ ๋ฐ๋ณตํด๋ ๋ ๋ฒ์งธ ์ธ์ ์ด ์์ฑ๋์ด์๋ ์ ๋ฉ๋๋ค.
- ์ด ๋ช ๋ น์ ๋ก์ปฌ ์ํ๋ง ์ฝ์ต๋๋ค. ํ์ ๋ณด๋ด์ง ์๊ณ , ์ฐ๊ฒฐํ์ง ์๊ณ , ์ผ์ ์ค์งํ์ง ์์ผ๋ฉฐ, ์ธํฐ๋ท ๊ฐ์ฉ์ฑ์ ํ์ธํ์ง ์์ต๋๋ค. ์ฝ์ ํ ์ฐ๊ฒฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. 1๋ ๋ค์ ์์ ์ ์ฑ๊ณต์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.IsOnline() == 0))
{
UO.Connect();
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- WaitForWorld(timeoutMs)๋ ๋ด์ฅ ๋ช ๋ น์ด ์๋ ์์ ํ ํ์๋ ์ฌ์ฉ์ ์ ์ ํจ์์ ๋๋ค. 5000 โ ์์ฐ(๋ฐ๋ฆฌ์ด), UO.Wait(50) โ ํ์ธ ๊ฐ๊ฒฉ. ์์ ๊ฐ์ false๋ฅผ ์ ๊ณตํฉ๋๋ค. 0 ๊ธฐ์ฑ ์ธ๊ณ๋ง ํ์ฉ๋ฉ๋๋ค. Timer๋ ์ด๋ฅผ ์ธก์ ํ๋ฏ๋ก ๊ทธ ์ฐจ์ด์ 1000์ ๊ณฑํฉ๋๋ค. ์๋ ์ผ์์ค์ง๋ ๋ฏธ๋ฆฌ ๊บผ์ผ ํ๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ์ข ๋ฃ๋ฉ๋๋ค. ์ด ํจ์๋ Connect๋ฅผ ํธ์ถํ์ง ์์ผ๋ฉฐ ์๊ฐ์ด ๋ง๋ฃ๋์ด๋ ์์๋ ์ ๋ ฅ์ ์ทจ์ํ์ง ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ๋ก์ปฌ ์ํ๋ง ์ฝ์ต๋๋ค. ํ์ ๋ณด๋ด์ง ์๊ณ , ์ฐ๊ฒฐํ์ง ์๊ณ , ์ผ์ ์ค์งํ์ง ์์ผ๋ฉฐ, ์ธํฐ๋ท ๊ฐ์ฉ์ฑ์ ํ์ธํ์ง ์์ต๋๋ค. ์ฝ์ ํ ์ฐ๊ฒฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. 1๋ ๋ค์ ์์ ์ ์ฑ๊ณต์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
if (Truth(UO.GetPauseScriptOnDisconnectStatus()))
{
return null;
}
if (Truth(await WaitForWorld(5000)))
{
UO.UseSkill("Hiding");
}
return null;
}
async Task<dynamic> WaitForWorld(dynamic timeoutMs)
{
if (Truth(timeoutMs < 0))
{
return false;
}
var started = Environment.TickCount;
while (!(Truth(UO.IsOnline())))
{
if (Truth((Environment.TickCount - started) * 1000.0 >= timeoutMs))
{
return false;
}
await Delay(50);
}
return true;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.IsOnline. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsOnline:bridge.IsOnline().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int IsOnline() => bridge.IsOnline();ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Online();ํ์ฌ ์ธ์ ์ด ๊ฒ์ ์ธ๊ณ์ ์๋์ง, ๊ฒ์ ์ฐ๊ฒฐ์ด ์ด๋ ค ์๋์ง ํ์ธํฉ๋๋ค. ์บ๋ฆญํฐ ํ๋ ์ ์ด๋ ์ ์ฅ ๋๊ธฐ ์ค์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int. 1 - ํ๋ ์ด์ด, ๋ก๋๋ ์นด๋ ๋ฐ ํ์ฑ ๊ฒ์ ์์ผ์ด ๋์์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ด๋ฆฐ ํด๋ผ์ด์ธํธ ์ฐฝ, ์บ๋ฆญํฐ ๋ชฉ๋ก ๋๋ ๋ก๊ทธ์ธ ๋จ๊ณ์ TCP ์ฐ๊ฒฐ์ 1๋ฅผ ์๋ฏธํ์ง ์์ต๋๋ค. ์ซ์ ํ๋๊ทธ int: 1(์กฐ๊ฑด ์ถฉ์กฑ), 0(์กฐ๊ฑด ์ถฉ์กฑ๋์ง ์์). ์ด๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. C#์์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์ธ์!= 0 ๋๋ ๊ฒฐ๊ณผ == 0์ ๋๋ค. int์ true/false ๋ฐ if(๊ฒฐ๊ณผ)๋ฅผ ์ง์ ๋น๊ตํ๋ ๊ฒ์ ํ์ฉ๋์ง ์์ต๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค: serial, type, ์บ๋ฆญํฐ ์ด๋ฆ ๋ฐ IP๋ ์ ์กํ ์ ์์ต๋๋ค. UO.Online(), UO.Connected(), UO.IsOnline()๋ ๊ฐ์ ๊ฒ์ ํ์ธํ์ธ์. ์ด๋ ๋ค๋ฅธ ๊ด๋ฆฌ์ ํ๋กํ์ด ์๋ ํด๋น ์ธ์ ์์ ์์ ์ํ์ ๋๋ค.
- ์ด ๋ช ๋ น์ ๋ก์ปฌ ์ํ๋ง ์ฝ์ต๋๋ค. ํ์ ๋ณด๋ด์ง ์๊ณ , ์ฐ๊ฒฐํ์ง ์๊ณ , ์ผ์ ์ค์งํ์ง ์์ผ๋ฉฐ, ์ธํฐ๋ท ๊ฐ์ฉ์ฑ์ ํ์ธํ์ง ์์ต๋๋ค. ์ฝ์ ํ ์ฐ๊ฒฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. 1๋ ๋ค์ ์์ ์ ์ฑ๊ณต์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
- UO.Wait์๋ ๋ฐ๋ฆฌ์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค. ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ์๋ ์ผ์ ์ค์งํ๊ณ ์์ ์คํ์ ์๋์ผ๋ก ์ผ์ ์ค์งํฉ๋๋ค. ์๊ฐ ์ด๊ณผ ํ์ธ์ ์ผ์ ์ค์ง๊ฐ ์ ๊ฑฐ๋ ํ์๋ง ๊ณ์๋ฉ๋๋ค. ์ด๋ฌํ ๋ช ๋ น์ ์ผ์ ์ค์ง๋ฅผ ํด์ ํ์ง ์์ผ๋ฉฐ ์๋ ์ฌ์ฐ๊ฒฐ์ ํ์ฑํํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Online();
UO.Print("Online: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- false๋ 0์ ๋์ผํฉ๋๋ค. return์ Main์ UseSkill๋ก ์ข ๋ฃํฉ๋๋ค. ์คํฌ ์ด๋ฆ์ธ UseSkill์ ์ ์ผํ ๋งค๊ฐ๋ณ์๋ ํ์ด๋์ ๋๋ค. 1๋ฅผ ์ฌ์ฉํ๋ฉด ์คํฌ๋ฆฝํธ๋ ์คํฌ ์ฌ์ฉ๋ง์ ์์ฒญํฉ๋๋ค. ๊ฒฐ๊ณผ๋ ์บ๋ฆญํฐ์ ์๋ฒ์ ์ํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
- ์ด ๋ช ๋ น์ ๋ก์ปฌ ์ํ๋ง ์ฝ์ต๋๋ค. ํ์ ๋ณด๋ด์ง ์๊ณ , ์ฐ๊ฒฐํ์ง ์๊ณ , ์ผ์ ์ค์งํ์ง ์์ผ๋ฉฐ, ์ธํฐ๋ท ๊ฐ์ฉ์ฑ์ ํ์ธํ์ง ์์ต๋๋ค. ์ฝ์ ํ ์ฐ๊ฒฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. 1๋ ๋ค์ ์์ ์ ์ฑ๊ณต์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
if (Truth(Truth(UO.Online()) == false))
{
return null;
}
UO.UseSkill("Hiding");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 0๊ณผ์ ๋น๊ต๋ ์๋ ์ฌ์ฐ๊ฒฐ ์ค์ ์ด ์๋ ํ์ฌ ์ฐ๊ฒฐ ์ํ๋ฅผ ํ์ธํฉ๋๋ค. ์ธ์๊ฐ ์๋ Connect๋ ์ ์ฅ๋ ์ค์ ์ ์ฌ์ฉํ๊ณ ๋ก๊ทธ์ธ์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ์ด๋ฏธ ์์๋ ๋ก๊ทธ์ธ ์ค์ ๋ช ๋ น์ ๋ฐ๋ณตํด๋ ๋ ๋ฒ์งธ ์ธ์ ์ด ์์ฑ๋์ด์๋ ์ ๋ฉ๋๋ค.
- ์ด ๋ช ๋ น์ ๋ก์ปฌ ์ํ๋ง ์ฝ์ต๋๋ค. ํ์ ๋ณด๋ด์ง ์๊ณ , ์ฐ๊ฒฐํ์ง ์๊ณ , ์ผ์ ์ค์งํ์ง ์์ผ๋ฉฐ, ์ธํฐ๋ท ๊ฐ์ฉ์ฑ์ ํ์ธํ์ง ์์ต๋๋ค. ์ฝ์ ํ ์ฐ๊ฒฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. 1๋ ๋ค์ ์์ ์ ์ฑ๊ณต์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Online() == 0))
{
UO.Connect();
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- WaitForWorld(timeoutMs)๋ ๋ด์ฅ ๋ช ๋ น์ด ์๋ ์์ ํ ํ์๋ ์ฌ์ฉ์ ์ ์ ํจ์์ ๋๋ค. 5000 โ ์์ฐ(๋ฐ๋ฆฌ์ด), UO.Wait(50) โ ํ์ธ ๊ฐ๊ฒฉ. ์์ ๊ฐ์ false๋ฅผ ์ ๊ณตํฉ๋๋ค. 0 ๊ธฐ์ฑ ์ธ๊ณ๋ง ํ์ฉ๋ฉ๋๋ค. Timer๋ ์ด๋ฅผ ์ธก์ ํ๋ฏ๋ก ๊ทธ ์ฐจ์ด์ 1000์ ๊ณฑํฉ๋๋ค. ์๋ ์ผ์์ค์ง๋ ๋ฏธ๋ฆฌ ๊บผ์ผ ํ๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ์ข ๋ฃ๋ฉ๋๋ค. ์ด ํจ์๋ Connect๋ฅผ ํธ์ถํ์ง ์์ผ๋ฉฐ ์๊ฐ์ด ๋ง๋ฃ๋์ด๋ ์์๋ ์ ๋ ฅ์ ์ทจ์ํ์ง ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ๋ก์ปฌ ์ํ๋ง ์ฝ์ต๋๋ค. ํ์ ๋ณด๋ด์ง ์๊ณ , ์ฐ๊ฒฐํ์ง ์๊ณ , ์ผ์ ์ค์งํ์ง ์์ผ๋ฉฐ, ์ธํฐ๋ท ๊ฐ์ฉ์ฑ์ ํ์ธํ์ง ์์ต๋๋ค. ์ฝ์ ํ ์ฐ๊ฒฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. 1๋ ๋ค์ ์์ ์ ์ฑ๊ณต์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
if (Truth(UO.GetPauseScriptOnDisconnectStatus()))
{
return null;
}
if (Truth(await WaitForWorld(5000)))
{
UO.UseSkill("Hiding");
}
return null;
}
async Task<dynamic> WaitForWorld(dynamic timeoutMs)
{
if (Truth(timeoutMs < 0))
{
return false;
}
var started = Environment.TickCount;
while (!(Truth(UO.Online())))
{
if (Truth((Environment.TickCount - started) * 1000.0 >= timeoutMs))
{
return false;
}
await Delay(50);
}
return true;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [Online]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsOnline:bridge.IsOnline().
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.IsOnline()API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.Resend();์ธ๊ณ๋ฅผ ๋ค์ ๋๊ธฐํํ๋ผ๋ ์์ฒญ์ ๋ณด๋ ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- Resync๋ ๊ฒ์ ์ค๋ ๋์์ NetClient.Socket.Send_Resync๋ฅผ ๋ณด๋ ๋๋ค. ์ด๋ ์ฌ์ฐ๊ฒฐ์ด๋ ๋ฐ์ดํฐ ์์ ํ์ธ์ด ์๋ ์ ๋ฐ์ดํธ ์์ฒญ์ ๋๋ค.
- ์์ ์์ UO.Wait๋ ์คํฌ๋ฆฝํธ ์ผ์ ์ค์ง๋ง ์ง์ ํฉ๋๋ค. ์ผ์ ์ค์ง๊ฐ ๋๋ฌ๋ค๊ณ ํด์ ์๋ฒ๊ฐ ์์ฒญ์ ์๋ฃํ์์ ์ฆ๋ช ํ๋ ๊ฒ์ ์๋๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.Resend");
UO.Resend();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ๊ณ๋ฅผ ๋ค์ ๋๊ธฐํํ๋ผ๋ ์์ฒญ์ ๋ณด๋ ๋๋ค.
UO.Resend();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Resync๋ ๊ฒ์ ์ค๋ ๋์์ NetClient.Socket.Send_Resync๋ฅผ ๋ณด๋ ๋๋ค. ์ด๋ ์ฌ์ฐ๊ฒฐ์ด๋ ๋ฐ์ดํฐ ์์ ํ์ธ์ด ์๋ ์ ๋ฐ์ดํธ ์์ฒญ์ ๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.IsOnline()))
{
UO.Resend();
}
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.Resend();
UO.Wait(500);
UO.Print(UO.GetX());
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Resync:bridge.Resync().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "resend": bridge.Resync(); break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.ShardName();์ค๋ ์ด๋ฆ์ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
string โ ๋ธ๋ฆฌ์ง ํ๋์ ํ ์คํธ.ShardName; ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ๋น ๋ฌธ์์ด์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด๊ฒ์ ์ฐ๊ฒฐ ๊ธฐํธ๊ฐ ์๋๋ฉฐ ์ซ์ ID๋ ์๋๋๋ค.
- ExecuteClientApiCompatibility๋ ํ๋กํ์ด๋ ์๋ฒ ์ ํ์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ธ๋ฆฌ์ง๋ฅผ ๋ฐํํฉ๋๋ค.ShardName.
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.ShardName();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ค๋ ์ด๋ฆ์ ์ฝ์ต๋๋ค.
var value = UO.ShardName();
UO.Print(value);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ExecuteClientApiCompatibility๋ ํ๋กํ์ด๋ ์๋ฒ ์ ํ์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ธ๋ฆฌ์ง๋ฅผ ๋ฐํํฉ๋๋ค.ShardName.
return RunScenario();
object? RunScenario()
{
var value = UO.ShardName();
if (Truth(Len(value) > 0))
{
UO.TextPrint(value);
}
return null;
}
int Len(object? value) => Convert.ToString(value)?.Length ?? 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
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.ShardName();
UO.Wait(500);
var after = UO.ShardName();
UO.Print(before = after);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ShardName:bridge.ShardName.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "shardname":
case "profileshardname": return new InjectionValue(bridge.ShardName);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.ShardPath();ํ์ฌ ํ๋กํ์ ๊ฒฝ๋ก๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
string โ ๋ธ๋ฆฌ์ง ํ๋์ ํ ์คํธ.CurrentProfilePath; ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ๋น ๋ฌธ์์ด์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด๊ฒ์ ์ฐ๊ฒฐ ๊ธฐํธ๊ฐ ์๋๋ฉฐ ์ซ์ ID๋ ์๋๋๋ค.
- ExecuteClientApiCompatibility๋ ํ๋กํ์ด๋ ์๋ฒ ์ ํ์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ธ๋ฆฌ์ง๋ฅผ ๋ฐํํฉ๋๋ค.CurrentProfilePath.
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.ShardPath();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ํ๋กํ์ ๊ฒฝ๋ก๋ฅผ ์ฝ์ต๋๋ค.
var value = UO.ShardPath();
UO.Print(value);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ExecuteClientApiCompatibility๋ ํ๋กํ์ด๋ ์๋ฒ ์ ํ์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ธ๋ฆฌ์ง๋ฅผ ๋ฐํํฉ๋๋ค.CurrentProfilePath.
return RunScenario();
object? RunScenario()
{
var value = UO.ShardPath();
if (Truth(Len(value) > 0))
{
UO.TextPrint(value);
}
return null;
}
int Len(object? value) => Convert.ToString(value)?.Length ?? 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
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.ShardPath();
UO.Wait(500);
var after = UO.ShardPath();
UO.Print(before = after);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CurrentProfilePath:bridge.CurrentProfilePath.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "shardpath":
case "clientprofilepath": return new InjectionValue(bridge.CurrentProfilePath);