KO UO Topic conversion compatibility - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
ํ ยท C# ยท IDE ยท UO API ยท AโZ ยท ์ ยท ์ธ์ด
์ซ์, serial ๋ฐ ๋ ๊ฑฐ์ ์คํฌ๋ฆฝํธ ํ์์ ๋ณํํฉ๋๋ค. ํธํ ๊ฐ๋ฅํ ์ด๋ฆ์๋ ์ ํ ์ฌํญ์ด ์๊ฑฐ๋ ๋ช ์์ ์ผ๋ก ๊ธ์ง๋ ์์ ์ด ์์ ์ ์์ต๋๋ค. ์ด๋ ์นด๋์ ํ์๋์ด ์์ต๋๋ค.
| ์ฃผ์ | ๋ช ๋ น ๋ฐ ์ค๋ช |
|---|---|
| Hex / int | UO.Hex2Int ยท UO.Int2Hex |
| EUO โ Injection | UO.EUO2ID ยท UO.EUO2Type ยท UO.EUO2Inj ยท UO.Inj2EUO |
| EasyUO | UO.GetEasyUO ยท UO.SetEasyUO |
| ์ ํ ๋ณํ | C# ๋ฐ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ C# ๋ฐ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ C# ๋ฐ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ C# ๋ฐ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ C# ๋ฐ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ยท C# ๋ฐ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ |
UO.Hex2Int ยท UO.Int2Hex ยท UO.ScanInt ยท UO.EUO2ID ยท UO.EUO2Inj ยท UO.EUO2Type ยท UO.Inj2EUO
UO.BoxHack ยท UO.ShutdownWindows
๊ฐ ๋ช ๋ น ์นด๋์๋ ์ง์ ์ฝ๋, ํจ์ ๋ฐ ํด๋์ค ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๋ค์์ ์ ํ๋ ์งง์ ์๋๋ฆฌ์ค์ ๋๋ค. ์ ํ์ฌํญ๊ณผ ์ ์ฒด ๋ถ์์ด ์นด๋์ ํฌํจ๋์ด ์์ต๋๋ค.
๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
UO.Print(UO.Int2Hex(1073746484));๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
var value = UO.EUO2ID("B");
UO.Print(Convert.ToString(value));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.BoxHack();๋ ๊ฑฐ์ ๋ค์ดํฐ๋ธ ํด๋ผ์ด์ธํธ ํจ์น BoxHack๊ฐ ํ์ํ์ง ์์ ClassicUO์ ์๋ฆฌ๋ ์๋ฆผ์ ์ธ์ํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- ExecuteLegacyManualAlias ๋ถ๊ธฐ๋ SystemMessage๋ง ํธ์ถํฉ๋๋ค. ๋์, ์์ฑ, ์ปจํ ์ด๋ ๋๋ ๋คํธ์ํฌ ํ๋กํ ์ฝ์ ์์ ๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.BoxHack");
UO.BoxHack();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฉ์์ง๋ ์ด์ ํจ์น๊ฐ ํ์ํ์ง ์์์ ์ค๋ช ํฉ๋๋ค.
UO.BoxHack();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํธํ์ฑ ์ ์ฐจ๋ ๊ฒ์ ์ธ๊ณ๋ฅผ ๋ฐ๊พธ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
CompatibilityNotice();
return null;
}
void CompatibilityNotice()
{
UO.BoxHack();
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ง๋จ ๋ฉ์์ง ํ์ ์คํ์ด ๊ณ์๋ฉ๋๋ค.
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.BoxHack();
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.EUO2ID(object? euo);A=0๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ์ 26์ EasyUO ๋ฆฌํฐ๋ด ํ๊ธฐ๋ฒ์ ๋์ฝ๋ฉํฉ๋๋ค.
-
euoโ EasyUO ๋ฌธ์์ด/๊ฐ. ๋ฌธ์๋ ๋๋ฌธ์๋ก ๋ณํ๋ฉ๋๋ค. ๋ฌธ์๊ฐ ์๋ ๋ฌธ์๋ ๊ฑด๋๋๋๋ค.
int โ ๊ฒฐ๊ณผ 32 ๋นํธ ์ซ์ ๊ฐ; ์ด๊ฒ์ 16์ง์ ๋ฌธ์์ด์ด ์๋๋๋ค.
- value=value*26+(letter-A)๋ฅผ ์์ฐจ์ ์ผ๋ก ๊ณ์ฐํฉ๋๋ค. ๋์ฐ๊ธฐ uint๋ ๊ฒ์ฌ๋์ง ์์ ์ํ๋ก ์คํ๋๋ฏ๋ก ์ค๋ฒํ๋ก๋ 32 ๋นํธ๋ฅผ ๋๋ฌ์๋๋ค. ๋น ๋ฌธ์์ด๊ณผ ๋ฌธ์๊ฐ ์๋ ๋ฌธ์์ด์ 0์ ์ ๊ณตํฉ๋๋ค. ์ธ์์ ์ด๋ค ๋ฌผ๊ฑด๋ ์ฐพ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.EUO2ID("B");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- B๋ ์ซ์ 1๋ฅผ ์ธ์ฝ๋ฉํฉ๋๋ค.
var value = UO.EUO2ID("B");
UO.Print(Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋์๋ฌธ์๋ ์ค์ํ์ง ์์ต๋๋ค. ํ์ดํ๊ณผ ๋๋ํ๋ ๊ฑด๋๋๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.EUO2ID("b-!");
UO.Print(Convert.ToString(value));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฝ๋ 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 value = UO.EUO2ID("A");
UO.Print(Convert.ToString(value));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: euo (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.DecodeEasyUoId:DecodeEasyUoId(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "euo2id":
case "euo2type": return new InjectionValue(DecodeEasyUoId(Text(0)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
string UO.EUO2Inj(object? easyValue);A=0๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ์ 26์ EasyUO ๋ฆฌํฐ๋ด ํ๊ธฐ๋ฒ์ ๋์ฝ๋ฉํฉ๋๋ค.
-
easyValueโ EasyUO ๋ฌธ์์ด/๊ฐ. ๋ฌธ์๋ ๋๋ฌธ์๋ก ๋ณํ๋ฉ๋๋ค. ๋ฌธ์๊ฐ ์๋ ๋ฌธ์๋ ๊ฑด๋๋๋๋ค.
string๋ ๊ฒฐ๊ณผ serial ์ฃผ์ ์ 16์ง์ ๋ฌธ์์ด์ ๋๋ค.
- value=value*26+(letter-A)๋ฅผ ์์ฐจ์ ์ผ๋ก ๊ณ์ฐํฉ๋๋ค. ๋์ฐ๊ธฐ uint๋ ๊ฒ์ฌ๋์ง ์์ ์ํ๋ก ์คํ๋๋ฏ๋ก ์ค๋ฒํ๋ก๋ 32 ๋นํธ๋ฅผ ๋๋ฌ์๋๋ค. ๋น ๋ฌธ์์ด๊ณผ ๋ฌธ์๊ฐ ์๋ ๋ฌธ์์ด์ 0์ ์ ๊ณตํฉ๋๋ค. ์ธ์์ ์ด๋ค ๋ฌผ๊ฑด๋ ์ฐพ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.EUO2Inj("B");
UO.Print("EUO2Inj: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- B๋ ์ซ์ 1๋ฅผ ์ธ์ฝ๋ฉํฉ๋๋ค.
var value = UO.EUO2Inj("B");
UO.Print(Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋์๋ฌธ์๋ ์ค์ํ์ง ์์ต๋๋ค. ํ์ดํ๊ณผ ๋๋ํ๋ ๊ฑด๋๋๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.EUO2Inj("b-!");
UO.Print(Convert.ToString(value));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฝ๋ 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 value = UO.EUO2Inj("A");
UO.Print(Convert.ToString(value));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: easyValue (Any)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.EUO2Inj. -
InjectionScript.Runtime.InjectionValue.ToString:easyValue.ToString(). -
InjectionScript.Runtime.NumberConversions.ToHex:NumberConversions.ToHex(unchecked((int)value)).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string EUO2Inj(InjectionValue easyValue)
{
uint value = 0;
foreach (char c in easyValue.ToString().ToUpperInvariant())
{
if (c < 'A' || c > 'Z')
continue;
value = unchecked(value * 26 + (uint)(c - 'A'));
}
return NumberConversions.ToHex(unchecked((int)value));
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.EUO2Type(object? euo);A=0๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ์ 26์ EasyUO ๋ฆฌํฐ๋ด ํ๊ธฐ๋ฒ์ ๋์ฝ๋ฉํฉ๋๋ค.
-
euoโ EasyUO ๋ฌธ์์ด/๊ฐ. ๋ฌธ์๋ ๋๋ฌธ์๋ก ๋ณํ๋ฉ๋๋ค. ๋ฌธ์๊ฐ ์๋ ๋ฌธ์๋ ๊ฑด๋๋๋๋ค.
int โ ๊ฒฐ๊ณผ 32 ๋นํธ ์ซ์ ๊ฐ; ์ด๊ฒ์ 16์ง์ ๋ฌธ์์ด์ด ์๋๋๋ค.
- value=value*26+(letter-A)๋ฅผ ์์ฐจ์ ์ผ๋ก ๊ณ์ฐํฉ๋๋ค. ๋์ฐ๊ธฐ uint๋ ๊ฒ์ฌ๋์ง ์์ ์ํ๋ก ์คํ๋๋ฏ๋ก ์ค๋ฒํ๋ก๋ 32 ๋นํธ๋ฅผ ๋๋ฌ์๋๋ค. ๋น ๋ฌธ์์ด๊ณผ ๋ฌธ์๊ฐ ์๋ ๋ฌธ์์ด์ 0์ ์ ๊ณตํฉ๋๋ค. ์ธ์์ ์ด๋ค ๋ฌผ๊ฑด๋ ์ฐพ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.EUO2Type("B");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- B๋ ์ซ์ 1๋ฅผ ์ธ์ฝ๋ฉํฉ๋๋ค.
var value = UO.EUO2Type("B");
UO.Print(Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋์๋ฌธ์๋ ์ค์ํ์ง ์์ต๋๋ค. ํ์ดํ๊ณผ ๋๋ํ๋ ๊ฑด๋๋๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.EUO2Type("b-!");
UO.Print(Convert.ToString(value));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฝ๋ 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 value = UO.EUO2Type("A");
UO.Print(Convert.ToString(value));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: euo (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.DecodeEasyUoId:DecodeEasyUoId(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "euo2id":
case "euo2type": return new InjectionValue(DecodeEasyUoId(Text(0)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Hex2Int(object? value);์ซ์ ๊ฐ์ด๋ ์ซ์ ํ ์คํธ๋ฅผ int๋ก ๋ณํํฉ๋๋ค.
-
valueโ int, double, double-ํ ์คํธ ๋๋ 0x๊ฐ ์๋ 16์ง์ ํ ์คํธ. ๊ฐ์ฅ์๋ฆฌ์ ๊ธฐํธ ์ฃผ๋ณ์ ๊ณต๋ฐฑ์ด ํ์ฉ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ณ์นญ ๋ฌธ์์ด "self"/"lasttarget"์ด ํ์ฉ๋์ง ์์ต๋๋ค.
int(32 ๋นํธ ํฌํจ); 16์ง์ 0xFFFFFFFF๋ -1์ ์ ๊ณตํฉ๋๋ค. double๋ ๋ฒ์ ๊ฒ์ฌ๋ฅผ ํตํด 0์ผ๋ก ์๋ฆฝ๋๋ค. NumberConversions.ToInt์ ๋ฐฐ์ด๊ณผ null๋ 0์ ์ ๊ณตํฉ๋๋ค.
- ์ด๋ฆ์๋ ๋ถ๊ตฌํ๊ณ 10์ง์ ํ ์คํธ๊ฐ ํ์ฉ๋ฉ๋๋ค. ์๋ชป๋ ํ ์คํธ๋ FormatException์ ์ ๊ณตํ๊ณ , ์ง์๋์ง ์๋ ์ ํ์ InvalidCastException๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ค๋ฒํ๋ก doubleโ๋ณํ ์ค๋ฅ.
- ์ญ๋ฐฉํฅ ์์์ UO.Int2Hex์ ๋๋ค. ๋ณํ์ ๊ฐ์ฒด์ ์กด์ฌ๋ฅผ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Hex2Int("0x40001234");
UO.Print("Hex2Int: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ซ์ ๊ฐ์ด๋ ์ซ์ ํ ์คํธ๋ฅผ int๋ก ๋ณํํฉ๋๋ค.
UO.Print(UO.Hex2Int("0x40001234"));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด๋ฆ์๋ ๋ถ๊ตฌํ๊ณ 10์ง์ ํ ์คํธ๊ฐ ํ์ฉ๋ฉ๋๋ค. ์๋ชป๋ ํ ์คํธ๋ FormatException์ ์ ๊ณตํ๊ณ , ์ง์๋์ง ์๋ ์ ํ์ InvalidCastException๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ค๋ฒํ๋ก doubleโ๋ณํ ์ค๋ฅ.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.Hex2Int("255"));
UO.Print(UO.Hex2Int("0xFFFFFFFF"));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ญ๋ฐฉํฅ ์์์ UO.Int2Hex์ ๋๋ค. ๋ณํ์ ๊ฐ์ฒด์ ์กด์ฌ๋ฅผ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var number = UO.Hex2Int("0x000000FF");
UO.Print(UO.Int2Hex(number));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Hex2Int. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(value).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Hex2Int(InjectionValue value) => NumberConversions.ToInt(value);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
string UO.Inj2EUO(object? serialValue);EasyUO์ ๊ฒฝ์ฐ 32๋นํธ ์ซ์ serial๋ฅผ ๋ฌธ์ A..Z๋ก ์ธ์ฝ๋ฉํฉ๋๋ค.
-
serialValueโ NumberConversions.ToInt๊น์ง์ ์ซ์, ๋นํธ๊ฐ ๋ณด์กด๋ ๋ถํธ ์๋ uint. ๋ณ์นญ์ ๊ฒฝ์ฐ ๋จผ์ GetSerial/Hex2Int๋ฅผ ์ป์ผ์ธ์.
string๋ A=0..Z=25์ธ ์ผ๋ฐ์ ์ธ ๊ธฐ๋ณธ ์ซ์ 26์ ๋๋ค. 0์ "A"๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ 16์ง์๋ ๊ฐ์ฒด ์ด๋ฆ์ด ์๋๋๋ค.
- ์๊ณ ๋ฆฌ์ฆ์ ๋ฌธ์ A + ๊ฐ % 26๋ฅผ ์ผ์ชฝ์ ์ฝ์ ํ๊ณ uint๋ฅผ 26๋ก 0์ผ๋ก ๋๋๋๋ค. ์ด๋ Excel A1 ์ด ๋ฒํธ๊ฐ ์๋ ํ๋ก์ ํธ ์์ฒด ๋ณํ์ ๋๋ค.
- EUO2Inj๋ 16์ง์ ๋ฌธ์์ด๋ก ์ญ๋ณํ์ ์ํํฉ๋๋ค. ์ธ์ฝ๋ฉ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์์ผ๋ฉฐ ํด๋ผ์ด์ธํธ์์ ๊ฐ์ฒด๋ฅผ ์์ฒญํ์ง๋ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Inj2EUO(0);
UO.Print("Inj2EUO: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- EasyUO์ ๊ฒฝ์ฐ 32๋นํธ ์ซ์ serial๋ฅผ ๋ฌธ์ A..Z๋ก ์ธ์ฝ๋ฉํฉ๋๋ค.
UO.Print(UO.Inj2EUO(0));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๊ณ ๋ฆฌ์ฆ์ ๋ฌธ์ A + ๊ฐ % 26๋ฅผ ์ผ์ชฝ์ ์ฝ์ ํ๊ณ uint๋ฅผ 26๋ก 0์ผ๋ก ๋๋๋๋ค. ์ด๋ Excel A1 ์ด ๋ฒํธ๊ฐ ์๋ ํ๋ก์ ํธ ์์ฒด ๋ณํ์ ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.Inj2EUO(26));
UO.Print(UO.Inj2EUO(25));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- EUO2Inj๋ 16์ง์ ๋ฌธ์์ด๋ก ์ญ๋ณํ์ ์ํํฉ๋๋ค. ์ธ์ฝ๋ฉ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์์ผ๋ฉฐ ํด๋ผ์ด์ธํธ์์ ๊ฐ์ฒด๋ฅผ ์์ฒญํ์ง๋ ์์ต๋๋ค.
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 value = UO.Hex2Int("0x40001234");
var encoded = UO.Inj2EUO(value);
UO.Print(encoded);
UO.Print(UO.EUO2Inj(encoded));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: serialValue (Any)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Inj2EUO. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(serialValue).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string Inj2EUO(InjectionValue serialValue)
{
uint value = unchecked((uint)NumberConversions.ToInt(serialValue));
if (value == 0)
return "A";
var result = new StringBuilder();
while (value > 0)
{
result.Insert(0, (char)('A' + value % 26));
value /= 26;
}
return result.ToString();
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
string UO.Int2Hex(object? value);int ํ์์ 16์ง์ serial ๋ฌธ์์ด๋ก ์ง์ ํฉ๋๋ค.
-
value- int ๋๋ ์ซ์/16์ง์ ํ ์คํธ; double๋ ์ค๋ฒํ๋ก ๊ฒ์ฌ๋ฅผ ํตํด 0์ผ๋ก ์๋ฆฝ๋๋ค. ๊ฐ์ฒด ๋ณ์นญ์ ์ฐพ์ ์ ์์ต๋๋ค.
string "0xXXXXXXXX": 8์๋ฆฌ 16์ง์, ๋ชจ๋ 32 ๋นํธ int. ์์ ๊ฐ์ 2์ ๋ณด์๋ก ํ์๋ฉ๋๋ค.
- NumberConversions.ToInt๊ฐ ๋ณํ์ ์ํํ ๋ค์ ToHex๊ฐ X8 ํ์์ ์ฌ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด -1๋ "0xFFFFFFFF"๋ฅผ ์ ๊ณตํฉ๋๋ค. ์๋ชป๋ ์ซ์ ํ ์คํธ๋ก ์ธํด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๊ฒ์ serial์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ ์คํธํ๋ ๊ฒ์ด ์๋๋๋ค.
- ์ซ์๋ฅผ ํํํ๋ ค๋ฉด ๋ณํ๋ง์ผ๋ก ์ถฉ๋ถํฉ๋๋ค. ๋ฌผ์ฒด์ ์กด์ฌ ์ฌ๋ถ๋ UO.Exists๋ก ๋ณ๋๋ก ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Int2Hex(1073746484);
UO.Print("Int2Hex: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- int ํ์์ 16์ง์ serial ๋ฌธ์์ด๋ก ์ง์ ํฉ๋๋ค.
UO.Print(UO.Int2Hex(1073746484));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- NumberConversions.ToInt๊ฐ ๋ณํ์ ์ํํ ๋ค์ ToHex๊ฐ X8 ํ์์ ์ฌ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด -1๋ "0xFFFFFFFF"๋ฅผ ์ ๊ณตํฉ๋๋ค. ์๋ชป๋ ์ซ์ ํ ์คํธ๋ก ์ธํด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๊ฒ์ serial์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ ์คํธํ๋ ๊ฒ์ด ์๋๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.Int2Hex(-1));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ซ์๋ฅผ ํํํ๋ ค๋ฉด ๋ณํ๋ง์ผ๋ก ์ถฉ๋ถํฉ๋๋ค. ๋ฌผ์ฒด์ ์กด์ฌ ์ฌ๋ถ๋ UO.Exists๋ก ๋ณ๋๋ก ํ์ธ๋ฉ๋๋ค.
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 encoded = UO.Int2Hex(255);
UO.Print(encoded);
UO.Print(UO.Hex2Int(encoded));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Int2Hex. -
InjectionScript.Runtime.NumberConversions.ToHex:NumberConversions.ToHex(NumberConversions.ToInt(value)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(value).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string Int2Hex(InjectionValue value) => NumberConversions.ToHex(NumberConversions.ToInt(value));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.ScanInt(object? textValue, object? startValue);๋ฌธ์์ด์ position์์ ์์ํ์ฌ ์ฒซ ๋ฒ์งธ ๋ถํธ ์๋ double/hex ์ซ์๋ฅผ ์ฐพ์ต๋๋ค.
-
textValueโ ToString์ ํตํ ๋ฌธ์ ๋ฉ์์ง. ์ ๊ท์ [-+]?(?:0[xX][0-9A-Fa-f]+|\d+)์ ์ผ์นํ๋ ์ฒซ ๋ฒ์งธ ํญ๋ชฉ์ ๊ฒ์ํฉ๋๋ค. -
startValue- int, ์ ๋ก ์์น UTF-16. 0..text.Length๋ก ์ ํ๋ฉ๋๋ค. 1์ ์์ธ์ด ์๋๋๋ค.
int๋ ์ธ์๋๋ ์ฒซ ๋ฒ์งธ 32๋นํธ ์ซ์์ ๋๋ค. ์ผ์นํ๋ ํญ๋ชฉ์ด ์๊ฑฐ๋ ์ซ์๊ฐ ๋ง์ง ์์ต๋๋ค. - 0; ์ค์ 0์ 0๋ ์ ๊ณตํฉ๋๋ค.
- Regex.Match๋ ํ์ ๋ฌธ์์ด(์์)์ ์ ์ฉ๋ฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ผ์น ํญ๋ชฉ์ด TryStr2Int ๋ณํ์ ์คํจํ๋ฉด ๋ค์ ์ซ์๋ ๊ฒ์๋์ง ์์ต๋๋ค. .5์ ๊ฐ์ ๋ถ์ ๋ถ๋ถ์ ์ซ์ ํ ํฐ์ ํฌํจ๋์ง ์์ต๋๋ค.
- ์์ ์์์ 0๊ฐ ๋๊ณ ์ค ๋ ์ดํ์ ์์์ text.Length๊ฐ ๋๋ฉฐ ๊ฒฐ๊ณผ๋ 0์ ๋๋ค. ์๋ ์ค์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.ScanInt("gold=123", 0);
UO.Print("ScanInt: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฌธ์์ด์ position์์ ์์ํ์ฌ ์ฒซ ๋ฒ์งธ ๋ถํธ ์๋ double/hex ์ซ์๋ฅผ ์ฐพ์ต๋๋ค.
UO.Print(UO.ScanInt("gold=123", 0));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Regex.Match๋ ํ์ ๋ฌธ์์ด(์์)์ ์ ์ฉ๋ฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ผ์น ํญ๋ชฉ์ด TryStr2Int ๋ณํ์ ์คํจํ๋ฉด ๋ค์ ์ซ์๋ ๊ฒ์๋์ง ์์ต๋๋ค. .5์ ๊ฐ์ ๋ถ์ ๋ถ๋ถ์ ์ซ์ ํ ํฐ์ ํฌํจ๋์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.ScanInt("-7 0xFF", 3));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ ์์์ 0๊ฐ ๋๊ณ ์ค ๋ ์ดํ์ ์์์ text.Length๊ฐ ๋๋ฉฐ ๊ฒฐ๊ณผ๋ 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 text = "count=0x20";
var amount = UO.ScanInt(text, 6);
UO.Print(amount);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: textValue (Any), startValue (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ScanInt. -
InjectionScript.Runtime.InjectionValue.ToString:textValue.ToString(). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(startValue). -
InjectionScript.Runtime.NumberConversions.TryStr2Int:NumberConversions.TryStr2Int(match.Value, out int value).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int ScanInt(InjectionValue textValue, InjectionValue startValue)
{
string text = textValue.ToString() ?? string.Empty;
int start = Math.Max(0, Math.Min(text.Length, NumberConversions.ToInt(startValue)));
Match match = Regex.Match(text.Substring(start), @"[-+]?(?:0[xX][0-9A-Fa-f]+|\d+)", RegexOptions.CultureInvariant);
return match.Success && NumberConversions.TryStr2Int(match.Value, out int value) ? value : 0;
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ShutdownWindows(object? state);์คํฌ๋ฆฝํธ์์ Windows๋ฅผ ์ข ๋ฃํ๋ ค๋ ์๋๋ฅผ ํญ์ ๊ฑฐ๋ถํฉ๋๋ค.
-
state- ๋ ๊ฑฐ์ ์ธ์๊ฐ ์๋ช ์ ์ ์ฅ๋์ง๋ง ์ฌ์ฉ๋์ง ์์ต๋๋ค. ๋ชจ๋ ํธ์ถ์ด ์ฐจ๋จ๋ฉ๋๋ค.
์ ์์ ์ธ ๊ฒฐ๊ณผ๋ ์์ต๋๋ค. NativeSubrutineException์ "shutdownwindows๊ฐ ์๋์ ์ผ๋ก ์ฐจ๋จ๋์์ต๋๋ค. ์คํฌ๋ฆฝํธ๊ฐ Windows๋ฅผ ์ข ๋ฃํ ์ ์์ต๋๋ค."๋ผ๋ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค.
- ExecuteLegacyManualAlias๋ ์ฆ์ ์์ธ๋ฅผ ๋ฐ์์ํต๋๋ค. ์ข ๋ฃ, ์ฌ๋ถํ ๋๋ ์ธ๋ถ ํ๋ก์ธ์ค ์์์ด ์ํ๋์ง ์์ต๋๋ค.
- ์ธ ๊ฐ์ง ์์ ๋ชจ๋ ์๋์ ์ผ๋ก ๊ธ์ง๋ ํธ์ถ์ ํ์ํ๊ณ ์คํ ์ ์คํจํฉ๋๋ค. ์ฑ๊ณต์ ์ธ ์ข ๋ฃ๋ฅผ ์ํ ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
try { UO.ShutdownWindows(0); }
catch (Exception error) { UO.Print(error.Message); }๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์คํฌ๋ฆฝํธ์์ Windows๋ฅผ ์ข ๋ฃํ๋ ค๋ ์๋๋ฅผ ํญ์ ๊ฑฐ๋ถํฉ๋๋ค.
UO.ShutdownWindows(0);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ExecuteLegacyManualAlias๋ ์ฆ์ ์์ธ๋ฅผ ๋ฐ์์ํต๋๋ค. ์ข ๋ฃ, ์ฌ๋ถํ ๋๋ ์ธ๋ถ ํ๋ก์ธ์ค ์์์ด ์ํ๋์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.ShutdownWindows(1);
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.Print("The next command is expected to fail");
UO.ShutdownWindows(0);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: state (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "shutdownwindows":
throw new NativeSubrutineException("shutdownwindows is intentionally blocked: scripts may not shut down Windows.");