KO UO Topic diagnostics introspection - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
ํ ยท C# ยท IDE ยท UO API ยท AโZ ยท ์ ยท ์ธ์ด
๋ฌผ์ฒด, ํ์ผ ๋ฐ ๊ฒํ ๊ฒ์ฌ, ์ด๋ฆ, ๋งค๊ฐ๋ณ์ ๋ฐ ์๋ช ํ์ธ API. ์๋ช ์ด ์๋ค๊ณ ํด์ ํ์ฌ ์ํ์์ ๊ฒ์ ์์ ์ ๊ฐ๋ฅ์ฑ์ด ํ์ธ๋๋ ๊ฒ์ ์๋๋๋ค.
| ์ฃผ์ | ๋ช ๋ น ๋ฐ ์ค๋ช |
|---|---|
| Help | UO.Help |
| Dump | UO.Dump |
| Info | UO.Info |
| InfoTile | UO.InfoTile |
| InfoGump | UO.InfoGump |
| API Name Exists | UO.ApiNameExists |
| API Signature Exists | UO.ApiSignatureExists |
| API Parameter Exists | UO.ApiParameterExists |
| Version | UO.Version |
UO.Help ยท UO.Dump ยท UO.Info ยท UO.InfoColor ยท UO.GetInfo ยท UO.ExtendedInfo ยท UO.InfoTile ยท UO.InfoGump ยท UO.InfoGumps ยท UO.ApiNameExists ยท UO.ApiParameterExists ยท UO.ApiSignatureExists ยท UO.Version ยท UO.ClientInfo
๊ฐ ๋ช ๋ น ์นด๋์๋ ์ง์ ์ฝ๋, ํจ์ ๋ฐ ํด๋์ค ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๋ค์์ ์ ํ๋ ์งง์ ์๋๋ฆฌ์ค์ ๋๋ค. ์ ํ์ฌํญ๊ณผ ์ ์ฒด ๋ถ์์ด ์นด๋์ ํฌํจ๋์ด ์์ต๋๋ค.
๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
UO.InfoGump();๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
return UO.ApiNameExists("UO.GetType");ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.ApiNameExists(object? name);ํธ์ถ๋๋ ๋ค์ดํฐ๋ธ ํจ์์ ์ด๋ฆ์ด ๋ฑ๋ก๋์๋์ง ํ์ธํฉ๋๋ค.
-
name- ํ์ string: ํธ์ถ ํํ์์ด ์๋ ๋ฑ๋ก๋ ์ ํํ ์ด๋ฆ์ ๋๋ค. ์ผ์ด์ค์ ๊ฐ์ฅ์๋ฆฌ ๊ณต๊ฐ์ ์ค์ํ์ง ์์ต๋๋ค. UO. ์๋์ผ๋ก ์ถ๊ฐ๋์ง ์์ต๋๋ค. ๋น์ด ์๊ฑฐ๋ ์ ์ ์๋ ์ด๋ฆ์ 0๋ฅผ ๋ํ๋ ๋๋ค. ์ฌ์ฉ์ ์ ์ฐจ๋ ๊ณ ๋ ค๋์ง ์์ต๋๋ค.
int: 1์ ์ด๋ฆ์ด ๋ฑ๋ก๋์๋ค๋ ๋ป์ด๊ณ 0์ ๋ฑ๋ก๋์ง ์์๋ค๋ ๋ป์
๋๋ค. C#์์๋ result != 0 ๋๋ result == 0์ ์ฌ์ฉํ์ธ์. int๋ฅผ true๋ false์ ๋น๊ตํ ์ ์์ต๋๋ค. ๋ฑ๋ก ์ฌ๋ถ๋ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.ApiNameExists("UO.GetType");
UO.Print("ApiNameExists: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒซ ๋ฒ์งธ ์์์๋ ๋ช ์์ ์ธ UO๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์ ์ด๋ฆ์ ํ ์คํธํฉ๋๋ค. 1์ ๋ฐํํฉ๋๋ค. ํ ์คํธ ์ค์ธ ์ ํํ ์ด๋ฆ๊ณผ ํ์ํ ๊ฒฝ์ฐ ์ธ์ ์๊ฐ ํธ์ถ์ ํ์๋ฉ๋๋ค.
return UO.ApiNameExists("UO.GetType");๋ค์ดํฐ๋ธ ์ด๋ฆ์ ๋ฑ๋ก๋ง ํ์ธํฉ๋๋ค. Convert.ToInt32๋ .NET ๋ฉ์๋์ด๋ฉฐ UO API ํญ๋ชฉ์ด ์๋๋ฏ๋ก ApiNameExists๋ 0์ ๋ฐํํฉ๋๋ค. ์ด ๋ฉ์๋๋ ์ผ๋ฐ C#์์ ๊ณ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var name = "Convert.ToInt32";
return UO.ApiNameExists(name);
return null;
}๊ฐ ์ซ์ ๊ฒฐ๊ณผ๋ฅผ 0๊ณผ ๋น๊ตํ ๋ค์ &&๋ก ๋ bool ๊ฐ์ ๊ฒฐํฉํฉ๋๋ค. ์ด ์ด๋ฆ๋ค์ ๊ฒฐ๊ณผ๋ false์
๋๋ค.
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 HasBoth("GetType", "UO.GetType");
return null;
}
dynamic HasBoth(dynamic first, dynamic second)
{
return UO.ApiNameExists(first) != 0 && UO.ApiNameExists(second) != 0;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: name (String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ApiNameExists. -
InjectionScript.Runtime.InjectionApiUO.NormalizeApiName:NormalizeApiName(name).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int ApiNameExists(string name)
{
string normalized = NormalizeApiName(name);
return metadata.NativeSubrutines.Any(definition =>
definition.Name.Equals(normalized, StringComparison.OrdinalIgnoreCase)) ? 1 : 0;
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.ApiParameterExists(object? name);๋ฐํ์ ๊ฐ์ด๋ ๋ช ๋ช ๋ ๊ฐ์ฒด๊ฐ ๋ฑ๋ก๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
-
name- ํ์ string: ํธ์ถ ํํ์์ด ์๋ ๋ฑ๋ก๋ ์ ํํ ์ด๋ฆ์ ๋๋ค. ์ผ์ด์ค์ ๊ฐ์ฅ์๋ฆฌ ๊ณต๊ฐ์ ์ค์ํ์ง ์์ต๋๋ค. UO. ์๋์ผ๋ก ์ถ๊ฐ๋์ง ์์ต๋๋ค. ๋น์ด ์๊ฑฐ๋ ์ ์ ์๋ ์ด๋ฆ์ 0๋ฅผ ๋ํ๋ ๋๋ค. ์ฌ์ฉ์ ์ ์ฐจ๋ ๊ณ ๋ ค๋์ง ์์ต๋๋ค.
int: 1์ ์ด๋ฆ์ด ๋ฑ๋ก๋์๋ค๋ ๋ป์ด๊ณ 0์ ๋ฑ๋ก๋์ง ์์๋ค๋ ๋ป์
๋๋ค. C#์์๋ result != 0 ๋๋ result == 0์ ์ฌ์ฉํ์ธ์. int๋ฅผ true๋ false์ ๋น๊ตํ ์ ์์ต๋๋ค. ๋ฑ๋ก ์ฌ๋ถ๋ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.ApiParameterExists("backpack");
UO.Print("ApiParameterExists: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒซ ๋ฒ์งธ ์์์๋ ๋ช ์์ ์ธ UO๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์ ์ด๋ฆ์ ํ ์คํธํฉ๋๋ค. 1์ ๋ฐํํฉ๋๋ค. ํ ์คํธ ์ค์ธ ์ ํํ ์ด๋ฆ๊ณผ ํ์ํ ๊ฒฝ์ฐ ์ธ์ ์๊ฐ ํธ์ถ์ ํ์๋ฉ๋๋ค.
return UO.ApiParameterExists("UO.GetHP");๋ฑ๋ก๋ backpack ์ ํ์๋ฅผ ํ์ธํ๋ฉฐ ๊ฒฐ๊ณผ๋ 1์
๋๋ค. C# ๋ฉ์๋์ ๋งค๊ฐ๋ณ์๋ ๊ฒ์ ์ธ๊ณ์์ ๋ฐฐ๋ญ์ ์กด์ฌ๋ฅผ ํ์ธํ๋ ๊ธฐ๋ฅ์ ์๋๋๋ค.
return RunScenario();
object? RunScenario()
{
var name = "backpack";
return UO.ApiParameterExists(name);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ ๋ฒ์งธ ์์๋ ์์ ํ ๋์ฐ๋ฏธ ํจ์๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ ๊ฑฐ๋ ์งง์ ํ์์ด๋ ์ง์๋์ง ์๋ ํ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ํ์๊ณผ ๋น๊ตํฉ๋๋ค. ๋งค๊ฐ๋ณ์ ์ด๋ฆ, ์ฒซ ๋ฒ์งธ, ๋ ๋ฒ์งธ ๋ฐ ๊ฐ์ ํจ์ค ์ด๋ฆ/๊ฐ์๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ๊ฒฐ๊ณผ๋ ํธ์ถ ํ์ธ์ ๊ฒฝ์ฐ 0์ด๊ณ ๊ฐ ํ์ธ์ ๊ฒฝ์ฐ 0:1์ ๋๋ค.
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 CompareNames("GetHP", "UO.GetHP");
return null;
}
dynamic CompareNames(dynamic first, dynamic second)
{
return Convert.ToString(UO.ApiParameterExists(first)) + ":" + Convert.ToString(UO.ApiParameterExists(second));
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: name (String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ApiParameterExists. -
InjectionScript.Runtime.Metadata.IntrinsicVariableExists:metadata.IntrinsicVariableExists(value).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int ApiParameterExists(string name)
{
string value = (name ?? string.Empty).Trim();
if (value.Length == 0)
return 0;
if (Metadata.ShortcutVariables.Any(item => item.Equals(value, StringComparison.OrdinalIgnoreCase)))
return 1;
return metadata.IntrinsicVariableExists(value) ? 1 : 0;
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.ApiSignatureExists(object? name, object? argumentCount);์ฃผ์ด์ง ๊ฐ์์ ์ธ์๋ก ์ด๋ฆ ๋ฑ๋ก์ ํ ์คํธํฉ๋๋ค.
-
name- ํ์ string: ํธ์ถ ํํ์์ด ์๋ ๋ฑ๋ก๋ ์ ํํ ์ด๋ฆ์ ๋๋ค. ์ผ์ด์ค์ ๊ฐ์ฅ์๋ฆฌ ๊ณต๊ฐ์ ์ค์ํ์ง ์์ต๋๋ค. UO. ์๋์ผ๋ก ์ถ๊ฐ๋์ง ์์ต๋๋ค. ๋น์ด ์๊ฑฐ๋ ์ ์ ์๋ ์ด๋ฆ์ 0๋ฅผ ๋ํ๋ ๋๋ค. ์ฌ์ฉ์ ์ ์ฐจ๋ ๊ณ ๋ ค๋์ง ์์ต๋๋ค. -
argumentCountโ ํ์ int: ๋ช ์์ ์ผ๋ก ์ ๋ฌ๋ ์ ํ์ ์ธ์๋ฅผ ํฌํจํ ์์น ์ธ์์ ์ด ๊ฐ์์ ๋๋ค. ์์์ด๊ฑฐ๋ ์ง์๋์ง ์๋ ์๋์ 0์ ๋๋ค. ์ธ์ ์์ฒด์ ์ ํ์ ํ์ธ๋์ง ์์ต๋๋ค.
int: 1์ ์ด๋ฆ์ด ๋ฑ๋ก๋์๋ค๋ ๋ป์ด๊ณ 0์ ๋ฑ๋ก๋์ง ์์๋ค๋ ๋ป์
๋๋ค. C#์์๋ result != 0 ๋๋ result == 0์ ์ฌ์ฉํ์ธ์. int๋ฅผ true๋ false์ ๋น๊ตํ ์ ์์ต๋๋ค. ๋ฑ๋ก ์ฌ๋ถ๋ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.ApiSignatureExists("UO.GetType", 1);
UO.Print("ApiSignatureExists: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒซ ๋ฒ์งธ ์์์๋ ๋ช ์์ ์ธ UO๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์ ์ด๋ฆ์ ํ ์คํธํฉ๋๋ค. 1์ ๋ฐํํฉ๋๋ค. ํ ์คํธ ์ค์ธ ์ ํํ ์ด๋ฆ๊ณผ ํ์ํ ๊ฒฝ์ฐ ์ธ์ ์๊ฐ ํธ์ถ์ ํ์๋ฉ๋๋ค.
return UO.ApiSignatureExists("UO.GetType",1);UO.FindType์ ์ธ์๊ฐ ํ๋์ธ ํ์๊ณผ ์๋ ํ์์ ํ์ธํฉ๋๋ค. ๊ฒฐ๊ณผ๋ ๋ฌธ์์ด "1:0"์ด๋ฉฐ, ์ธ์๊ฐ ์๋ ํ์์ ๋ฑ๋ก๋์ง ์์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
return Convert.ToString(UO.ApiSignatureExists("UO.FindType", 1)) + ":" + Convert.ToString(UO.ApiSignatureExists("UO.FindType", 0));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ ๋ฒ์งธ ์์๋ ์์ ํ ๋์ฐ๋ฏธ ํจ์๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ ๊ฑฐ๋ ์งง์ ํ์์ด๋ ์ง์๋์ง ์๋ ํ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ํ์๊ณผ ๋น๊ตํฉ๋๋ค. ๋งค๊ฐ๋ณ์ ์ด๋ฆ, ์ฒซ ๋ฒ์งธ, ๋ ๋ฒ์งธ ๋ฐ ๊ฐ์ ํจ์ค ์ด๋ฆ/๊ฐ์๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ๊ฒฐ๊ณผ๋ ํธ์ถ ํ์ธ์ ๊ฒฝ์ฐ 0์ด๊ณ ๊ฐ ํ์ธ์ ๊ฒฝ์ฐ 0:1์ ๋๋ค.
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 CheckForm("UO.GetType", 0);
return null;
}
dynamic CheckForm(dynamic name, dynamic count)
{
return UO.ApiSignatureExists(name, count);
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: name (String), argumentCount (Integer)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ApiSignatureExists. -
InjectionScript.Runtime.Metadata.NativeSubrutineExists:metadata.NativeSubrutineExists(NormalizeApiName(name), argumentCount). -
InjectionScript.Runtime.InjectionApiUO.NormalizeApiName:NormalizeApiName(name).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int ApiSignatureExists(string name, int argumentCount)
=> metadata.NativeSubrutineExists(NormalizeApiName(name), argumentCount) ? 1 : 0;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.ClientInfo();์คํ ์ค์ธ ํด๋ผ์ด์ธํธ์ ๋ํ ๊ฐ๋ตํ ์ ๋ณด๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
3๊ฐ์ ๋ฐฐ์ด string: [0] - ์ ํ ์ด๋ฆ, [1] - ์คํ ์ค์ธ ํด๋ผ์ด์ธํธ ๋ฒ์ , [2] - ํด๋ผ์ด์ธํธ ๋๋ ํฐ๋ฆฌ. ์ธ๋ฑ์ค๋ 0๋ก ์์ํฉ๋๋ค. ์ด๊ฒ์ ๋ฌธ์์ด JSON๋ ์๋๊ณ ์ฌ์ ๋ ์๋๋๋ค.
- RuntimeProductName, RuntimeProductVersion ๋ฐ ClientPath์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์ด ๋ช ๋ น์ ์๋ฌด๊ฒ๋ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ ์๋ฒ์ ์๋ฌด๊ฒ๋ ๋ณด๋ด์ง ์์ต๋๋ค.
- ์ผ๋ฐ ๋์ฐ๋ฏธ ํจ์์์ ์์ธ์ ์์ฑํ๊ธฐ ์ ์ ArrayLength๋ฅผ ์ฌ์ฉํ์ธ์. ํด๋ผ์ด์ธํธ ์ ๋ณด๋ฅผ ์บ๋ฆญํฐ ๋ฅ๋ ฅ์น๋ ์๋ฒ ๋ฒ์ ๊ณผ ํผ๋ํ์ง ๋ง์ธ์.
- ํ์ฌ ClassicUO ํด๋ผ์ด์ธํธ์ ๋ํ ์ ๋ณด๋ฅผ ์ฝ์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.ClientInfo();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 0 - ์ ํ, 1 - ๋ฒ์ , 2 - ์นดํ๋ก๊ทธ. ๋ฒ์ ๊ฐ์ ์์ ์ ๊ฐ์ ธ์ต๋๋ค. ์ด ์์์๋ ์์ ๋์ง ์์์ต๋๋ค.
var info = UO.ClientInfo();
UO.Print("Product: " + info[0]);
UO.Print("Client version: " + info[1]);
UO.Print("Client folder: " + info[2]);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ArrayLength๋ ํ๋ ์๋ฅผ ๋ฐํํฉ๋๋ค. ๋ง์ง๋ง ์ ํจํ ์ธ๋ฑ์ค๋ ๊ธธ์ด์์ 1์ ๋บ ๊ฐ๊ณผ ๊ฐ์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var info = UO.ClientInfo();
var i = 0;
while (Truth(i < ArrayLength(info)))
{
UO.Print(Convert.ToString(i) + ": " + info[i]);
i = i + 1;
}
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ClientCaption๋ ์ ๋ชฉ๊ณผ ๋ฒ์ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค. ์๋ ๋ฐฐ์ด์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
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(ClientCaption());
return null;
}
dynamic ClientCaption()
{
var info = UO.ClientInfo();
if (Truth(ArrayLength(info) < 2))
{
return "Client information unavailable";
}
return info[0] + " / " + info[1];
}
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;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Array.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.RuntimeProductName:bridge.RuntimeProductName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.RuntimeProductVersion:bridge.RuntimeProductVersion. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ClientPath:bridge.ClientPath.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "clientinfo":
return new InjectionValue(new[]
{
new InjectionValue(bridge.RuntimeProductName),
new InjectionValue(bridge.RuntimeProductVersion),
new InjectionValue(bridge.ClientPath)
});ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.Dump();
void UO.Dump(object? @object);ํด๋ผ์ด์ธํธ์ ์๋ ค์ง ๊ฐ์ฒด์ ์ง๋จ ์ค๋ ์ท์ ์ธ์ํฉ๋๋ค.
-
object- ์ ํ์ฌํญ serial/๋งํฌ. ์ธ์๊ฐ ์์ผ๋ฉด bridge.LastTarget๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- ๋ฉ์์ง์๋ serial(0xXXXXXXXX), ์ด๋ฆ, graphic/type, hue ๋ฐ X/Y/Z๊ฐ ํฌํจ๋ฉ๋๋ค. ํ๋๋ ๋ก์ปฌ ๋ชจ๋ธ์์ ์ฝํ์ง๋๋ค. ๋๋ฝ๋ ๊ฐ์ฒด๋ ๋น ์ด๋ฆ๊ณผ null ํ๋๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ๋ช ๋ น์ ์ต์ ์๋ฒ ์์ฑ์ ์์ฒญํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.Dump");
UO.Dump();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋๋ฝ๋ ์ธ์๋ LastTarget๋ฅผ ์๋ฏธํฉ๋๋ค.
UO.Dump();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ชจ๋ ํ๋๋ ์์ ์ ์บ๋ฆญํฐ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Dump("self");
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Exists ํ ์คํธ๋ ํ๋๊ฐ 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 id = UO.LastTarget();
if (Truth(UO.Exists(id)))
{
UO.Dump(id);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0, bridge.LastTarget). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage($"0x{id:X8} {bridge.GetName(id)} type=0x{bridge.GetGraphics(id):X4} hue=0x{bridge.GetColor(id):X4} xyz={bridge.GetX(id)},{bridge.GetY(id)},{bridge.GetZ(id)}"). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetName:bridge.GetName(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetGraphics:bridge.GetGraphics(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetColor:bridge.GetColor(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetZ:bridge.GetZ(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastTarget:bridge.LastTarget.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "dump":
{
int id = Arg(0, bridge.LastTarget);
SystemMessage($"0x{id:X8} {bridge.GetName(id)} type=0x{bridge.GetGraphics(id):X4} hue=0x{bridge.GetColor(id):X4} xyz={bridge.GetX(id)},{bridge.GetY(id)},{bridge.GetZ(id)}");
break;
}๋งค๊ฐ๋ณ์: object (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0, bridge.LastTarget). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage($"0x{id:X8} {bridge.GetName(id)} type=0x{bridge.GetGraphics(id):X4} hue=0x{bridge.GetColor(id):X4} xyz={bridge.GetX(id)},{bridge.GetY(id)},{bridge.GetZ(id)}"). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetName:bridge.GetName(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetGraphics:bridge.GetGraphics(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetColor:bridge.GetColor(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetZ:bridge.GetZ(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastTarget:bridge.LastTarget.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "dump":
{
int id = Arg(0, bridge.LastTarget);
SystemMessage($"0x{id:X8} {bridge.GetName(id)} type=0x{bridge.GetGraphics(id):X4} hue=0x{bridge.GetColor(id):X4} xyz={bridge.GetX(id)},{bridge.GetY(id)},{bridge.GetZ(id)}");
break;
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.ExtendedInfo();ํ์ฌ ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ ๊ตฌ์ฑ์ 4๊ฐ ํ๋๋ฅผ ๋ฐํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
Array [ClientPath:string, CurrentProfilePath:string, GameServerAddress:string, GameServerPort:int].
- ํ๋์ ์์๋ ๊ณ ์ ๋์ด ์์ต๋๋ค. ClientPath ๋ฐ CurrentProfilePath์ ํด๋ผ์ด์ธํธ ๊ฒฝ๋ก์ ๋๋ค. GameServerAddress ๋ฐ GameServerPort๋ ์ ์ญ ์ค์ ์ ์ฝ์ต๋๋ค.GlobalSettings.IP/Port: ์ค์ ํผ์ด ๊ด๋ฆฌ์ ์ธ์ ์ ํ์ธํ์ง ์๊ณ ๊ตฌ์ฑ๋ ์ฃผ์์ ๋๋ค. ๋ชฉ๋ก์๋ ๋น๋ฐ๋ฒํธ๊ฐ ํฌํจ๋์ด ์์ง ์์ผ๋ฉฐ ์๋ฒ์ ์ ๋ณด๋ฅผ ๋ฌป๋ ๋ฉ์์ง๋ฅผ ํ์ํ์ง ์์ต๋๋ค. ํ๋กํ/์ฐ๊ฒฐ์ ์ ํํ๊ธฐ ์ ์ ๊ณต๋ฐฑ ๊ฐ์ด ๊ฐ๋ฅํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.ExtendedInfo();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฐฐ์ด์๋ ํผํฉ ์ ํ์ด ํฌํจ๋์ด ์์ผ๋ฏ๋ก Convert.ToString๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
var info = UO.ExtendedInfo();
for (int i = (int)(0); i <= ArrayLength(info)-1; i += (int)(1))
{
UO.Print(Convert.ToString(info[i]));
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ธ 2 ๋ฐ 3์ ์ฃผ์์ ํฌํธ์ ๋๋ค.
return RunScenario();
object? RunScenario()
{
var info = UO.ExtendedInfo();
UO.Print(Convert.ToString(info[2]) + ":" + Convert.ToString(info[3]));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ธ 1 โ CurrentProfilePath, ClientPath ์๋.
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 info = UO.ExtendedInfo();
var path = info[1];
UO.Print(path);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ClientPath:bridge.ClientPath. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CurrentProfilePath:bridge.CurrentProfilePath. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GameServerAddress:bridge.GameServerAddress. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GameServerPort:bridge.GameServerPort.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "extendedinfo":
return new InjectionValue(new[] { new InjectionValue(bridge.ClientPath), new InjectionValue(bridge.CurrentProfilePath), new InjectionValue(bridge.GameServerAddress), new InjectionValue(bridge.GameServerPort) });ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
string UO.GetInfo(object? arg);์ ํํ ๋ฌธ์ ์ ํ๊ธฐ์ ๋ํด์๋ง ๋ฌธ์ ์ด๋ฆ์ ๋ฐํํฉ๋๋ค.
-
arg- string. ๋ฌธ์ ํธ์ถ์ ์ ํํ ๋์๋ฌธ์ ๊ตฌ๋ถ ๊ฐ GetName("self"); ๋ค๋ฅธ ๊ฐ์ ์ธ์๋์ง ์์ต๋๋ค.
string โ ์บ๋ฆญํฐ์ ์บ๋ฆญํฐ ์ด๋ฆ์ ๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ์ธ์์ ๊ฒฝ์ฐ ๋ฌธ์์ด ๋ฆฌํฐ๋ด UNKNOWN. ๋ฌธ์๊ฐ ์์ผ๋ฉด ์ด๋ฆ์ด ๋น์ด ์์ ์ ์์ต๋๋ค.
- ๋น๊ต StringComparison.Ordinal์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ๋ฌธ์ ์ ํ๊ธฐ๋ง ์ง์๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ๋คํธ์ํฌ๋ฅผ ์์ฒญํ์ง ์์ผ๋ฉฐ ๋ก์ปฌ ๋ฌธ์ ๋ชจ๋ธ์์ ์ด๋ฆ์ ์ฝ์ต๋๋ค. ์ฐฝ FillInfoWindow์ ๋ณ๋๋ก ์ ์ด๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetInfo("character");
UO.Print("GetInfo: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ํํ ๋ฌธ์ ๋ฆฌํฐ๋ด์ self์ ๋๋ค.
var name = UO.GetInfo("character");
UO.Print(name);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฌธ์๊ฐ ์ผ์นํ์ง ์๊ณ UNKNOWN๋ฅผ ๋ฐํํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.GetInfo("Character");
UO.Print(value);
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 value = UO.GetInfo("profile");
UO.Print(value);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: arg (String)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetInfo. -
InjectionScript.Runtime.InjectionApiUO.GetName:GetName("self").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
private string GetInfo(string arg)
{
if (arg.Equals("character", StringComparison.Ordinal))
return GetName("self");
return "UNKNOWN";
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.Help();๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ์ง์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ง ์์ ํ๊ฑฐ๋ ํ์ํฉ๋๋ค. ์ด ๋ช ๋ น์๋ ์๋ฒ ํ์ธ์ด ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.Help");
UO.Help();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- C# IDE์ ๋ํ ๋ก์ปฌ ํํธ๋ฅผ ํ์ํฉ๋๋ค.
UO.Help();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ExecuteLegacyManualAlias๋ UO.*, ๊ตฌ์ฑ๋ ์ฑํ ์ ๋์ฌ ๋ฐ ์ต์ > C# IDE > SystemMessage๋ฅผ ํตํ ์๋์ ๋ํ ์ค์ ํ์ํฉ๋๋ค. ๋์ ์์ฒญ์ ์๋ฒ๋ก ์ ์ก๋์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Help();
UO.OpenIDE();
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.Help();
UO.Print("Options > C# IDE > Manual");
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("C# Scripts IDE: use UO.* in scripts or the configured chat prefix. Open Options > C# Scripts IDE > Manual.").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "help": SystemMessage("C# Scripts IDE: use UO.* in scripts or the configured chat prefix. Open Options > C# Scripts IDE > Manual."); break;string UO.Info();
string UO.Info(object? serial);
string UO.Info(object? type, object? x, object? y);
string UO.Info(object? type, object? x, object? y, object? z);ํธ์ถ ์์น๊ฐ ํ์ ๋ฐฉ์์ ๊ฒฐ์ ํฉ๋๋ค. ๊ฒ์์ ๊ทธ๋ํฝ ์ฑํ ๋ช ๋ น์ ํ๋, ๊ฐ, Ctrl+C์ ์คํฌ๋กค์ด ์๋ ํ๋ฅผ ์ฝ๋๋ค. ์ผ๋ฐ C# ์คํฌ๋ฆฝํธ๋ ๊ฒ์ ์ฐฝ์ด ์ด๋ ค ์์ด๋ ์ฐฝ์ด๋ ํ๊น ์์ด ๋ณด๊ณ ์ ๋ฌธ์์ด๋ง ๋ฐ์ต๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์๊ณ ์๋ ๋ฐ์ดํฐ๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ํฝ ์ฑํ ์์ ์ธ์ ์๋ Info์ InfoTile์ ํ๊น์ ์์ํฉ๋๋ค. ์คํฌ๋ฆฝํธ์ Info()๋ ๋ง์ง๋ง ๋ฌผ์ฒด ํ๊น ๋๋ ํ๋ ์ด์ด๋ฅผ, InfoTile()์ ๋ฐ๋ฐ ์งํ์ ์ฝ์ต๋๋ค. serial, type, ์ขํ๋ก ๋์์ ์ง์ ํฉ๋๋ค. InfoTile(x,y,map)์ ์ธ ๋ฒ์งธ ์ธ์๋ ๋งต ๋ฒํธ์ ๋๋ค.
-
serialโ ๊ฐ์ฒด ์๋ฆฌ์ผ ๋ฒํธ ๋๋ ์ ์ฅ๋ ๋ณ์นญ. -
typeโ ์์ดํ ๊ทธ๋ํฝ ID. -1์ ์ง์ ์์น์ ๋ชจ๋ ์ข ๋ฅ์ ์ผ์น. -
xโ ์๋ X ์ขํ. -
yโ ์๋ Y ์ขํ. -
zโ Z ๋์ด. ์งง์ ํ์์ 0 ์ฌ์ฉ.
์ ๋์ฌ๋ C# Scripts IDE์์ ์ค์ ํ๋ฉฐ #์ ์์์ ๋๋ค. ์ธ์๋ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ๊ณ ๋ฐ์ดํ ์์ ํ ์คํธ๋ ํ๋์ ์ธ์์ ๋๋ค. id๋ serial, type์ graphic์ ๋๋ค. xy x y [z]๋ ํด๋น ์์น์ ์ฒซ ๋ก๋ ๊ฐ์ฒด, type๋ง ์ฐ๋ฉด ์ฒซ ์ผ์น ๊ฐ์ฒด๋ฅผ ์ ํํฉ๋๋ค. InfoTile(x,y,map)์ ์ธ ๋ฒ์งธ ์ธ์๋ Z๊ฐ ์๋๋ผ ์ง๋์ ๋๋ค.
#info
#UO.Info id 0x40001234
#info type 0x0EED
#info xy 1450 1690
#info type 0x0EED xy 1450 1690 0
๊ฐ ์ฝ๋ ๋ธ๋ก์ ์์ ํ ๋ ๋ฆฝ .csx์ ๋๋ค. ์์ serial, type๊ณผ ์ขํ๋ฅผ ๋ฐ๊พธ์ธ์. ์ธ์ ์์์ C# ๋ช ๋ช ๋ ์ธ์๋ ์๊ทธ๋์ฒ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
string report = UO.Info(0x40001234);
UO.Print(report);string InspectSelf() => UO.Info("self");
UO.Print(InspectSelf());foreach (int serial in new[] { 0x40001234, 0x40005678 })
{
string report = UO.Info(serial);
UO.Print(report);
}new CommandSample().Execute(UO);
sealed class CommandSample
{
public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
{
string report = api.Info(0x40001234);
api.Print(report);
}
}CSharpGameApi.Info
-> CSharpScriptGlobals
-> InjectionScript.Runtime.InjectionApiUO.Info
ClassicUOInjectionApiBridge -> YokoInfoReport -> YokoInfoGump
string UO.InfoColor();
string UO.InfoColor(object? serial);ํธ์ถ ์์น๊ฐ ํ์ ๋ฐฉ์์ ๊ฒฐ์ ํฉ๋๋ค. ๊ฒ์์ ๊ทธ๋ํฝ ์ฑํ ๋ช ๋ น์ ํ๋, ๊ฐ, Ctrl+C์ ์คํฌ๋กค์ด ์๋ ํ๋ฅผ ์ฝ๋๋ค. ์ผ๋ฐ C# ์คํฌ๋ฆฝํธ๋ ๊ฒ์ ์ฐฝ์ด ์ด๋ ค ์์ด๋ ์ฐฝ์ด๋ ํ๊น ์์ด ๋ณด๊ณ ์ ๋ฌธ์์ด๋ง ๋ฐ์ต๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์๊ณ ์๋ ๋ฐ์ดํฐ๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ํฝ ์ฑํ ์์ ์ธ์ ์๋ Info์ InfoTile์ ํ๊น์ ์์ํฉ๋๋ค. ์คํฌ๋ฆฝํธ์ Info()๋ ๋ง์ง๋ง ๋ฌผ์ฒด ํ๊น ๋๋ ํ๋ ์ด์ด๋ฅผ, InfoTile()์ ๋ฐ๋ฐ ์งํ์ ์ฝ์ต๋๋ค. serial, type, ์ขํ๋ก ๋์์ ์ง์ ํฉ๋๋ค. InfoTile(x,y,map)์ ์ธ ๋ฒ์งธ ์ธ์๋ ๋งต ๋ฒํธ์ ๋๋ค.
-
serialโ ๊ฐ์ฒด ์๋ฆฌ์ผ ๋ฒํธ ๋๋ ์ ์ฅ๋ ๋ณ์นญ.
์ ๋์ฌ๋ C# Scripts IDE์์ ์ค์ ํ๋ฉฐ #์ ์์์ ๋๋ค. ์ธ์๋ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ๊ณ ๋ฐ์ดํ ์์ ํ ์คํธ๋ ํ๋์ ์ธ์์ ๋๋ค. id๋ serial, type์ graphic์ ๋๋ค. xy x y [z]๋ ํด๋น ์์น์ ์ฒซ ๋ก๋ ๊ฐ์ฒด, type๋ง ์ฐ๋ฉด ์ฒซ ์ผ์น ๊ฐ์ฒด๋ฅผ ์ ํํฉ๋๋ค. InfoTile(x,y,map)์ ์ธ ๋ฒ์งธ ์ธ์๋ Z๊ฐ ์๋๋ผ ์ง๋์ ๋๋ค.
#infocolor 0x40001234
๊ฐ ์ฝ๋ ๋ธ๋ก์ ์์ ํ ๋ ๋ฆฝ .csx์ ๋๋ค. ์์ serial, type๊ณผ ์ขํ๋ฅผ ๋ฐ๊พธ์ธ์. ์ธ์ ์์์ C# ๋ช ๋ช ๋ ์ธ์๋ ์๊ทธ๋์ฒ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
UO.Print(UO.InfoColor(0x40001234));string report = UO.InfoColor();
UO.Print(report);foreach (int serial in new[] { 0x40001234, 0x40005678 })
UO.Print(UO.InfoColor(serial));new CommandSample().Execute(UO);
sealed class CommandSample
{
public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
{
api.Print(api.InfoColor(0x40001234));
}
}CSharpGameApi.InfoColor
-> CSharpScriptGlobals
-> InjectionScript.Runtime.InjectionApiUO.InfoColor
ClassicUOInjectionApiBridge -> YokoInfoReport -> YokoInfoGump
string UO.InfoGump();
string UO.InfoGump(object? gump);ํธ์ถ ์์น๊ฐ ํ์ ๋ฐฉ์์ ๊ฒฐ์ ํฉ๋๋ค. ๊ฒ์์ ๊ทธ๋ํฝ ์ฑํ ๋ช ๋ น์ ํ๋, ๊ฐ, Ctrl+C์ ์คํฌ๋กค์ด ์๋ ํ๋ฅผ ์ฝ๋๋ค. ์ผ๋ฐ C# ์คํฌ๋ฆฝํธ๋ ๊ฒ์ ์ฐฝ์ด ์ด๋ ค ์์ด๋ ์ฐฝ์ด๋ ํ๊น ์์ด ๋ณด๊ณ ์ ๋ฌธ์์ด๋ง ๋ฐ์ต๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์๊ณ ์๋ ๋ฐ์ดํฐ๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
InfoGump()๋ ์ต์ ์๋ฒ ๋ํ์์ ๋๋ ํด๋ผ์ด์ธํธ ์ฐฝ์ ์ฝ์ต๋๋ค. ID๋ ์ธ๋ฑ์ค๋ก ์ ํํ๋ฉฐ last, LastGump, Last Gump๋ ์ต์ ์ฐฝ์ ๋๋ค. InfoGumps๋ ๊ฒ์ฌ ์ฐฝ์ ์ ์ธํ ๋ชฉ๋ก์ ๋ฐํํฉ๋๋ค. ๊ทธ๋ํฝ ๋ช ๋ น๋ง ํ๋ฅผ ์ฝ๋๋ค.
-
gumpโ ์๋ฒ ์ฐฝ ID ๋๋ ์ธ๋ฑ์ค. -1์ ๋ง์ง๋ง ํ์ฑ ์ฐฝ.
์ ๋์ฌ๋ C# Scripts IDE์์ ์ค์ ํ๋ฉฐ #์ ์์์ ๋๋ค. ์ธ์๋ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ๊ณ ๋ฐ์ดํ ์์ ํ ์คํธ๋ ํ๋์ ์ธ์์ ๋๋ค. id๋ serial, type์ graphic์ ๋๋ค. xy x y [z]๋ ํด๋น ์์น์ ์ฒซ ๋ก๋ ๊ฐ์ฒด, type๋ง ์ฐ๋ฉด ์ฒซ ์ผ์น ๊ฐ์ฒด๋ฅผ ์ ํํฉ๋๋ค. InfoTile(x,y,map)์ ์ธ ๋ฒ์งธ ์ธ์๋ Z๊ฐ ์๋๋ผ ์ง๋์ ๋๋ค.
#infogump
#infogump last
#info gump last gump
#infogump 0x12345678
๊ฐ ์ฝ๋ ๋ธ๋ก์ ์์ ํ ๋ ๋ฆฝ .csx์ ๋๋ค. ์์ serial, type๊ณผ ์ขํ๋ฅผ ๋ฐ๊พธ์ธ์. ์ธ์ ์์์ C# ๋ช ๋ช ๋ ์ธ์๋ ์๊ทธ๋์ฒ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
string report = UO.InfoGump();
UO.Print(report);UO.Print(UO.InfoGump(0x12345678));string ReadLatestWindow() => UO.InfoGump();
UO.Print(ReadLatestWindow());new CommandSample().Execute(UO);
sealed class CommandSample
{
public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
{
string report = api.InfoGump();
api.Print(report);
}
}CSharpGameApi.InfoGump
-> CSharpScriptGlobals
-> InjectionScript.Runtime.InjectionApiUO.InfoGump
ClassicUOInjectionApiBridge -> YokoInfoReport -> YokoInfoGump
string UO.InfoGumps();
string UO.InfoGumps(object? gump);ํธ์ถ ์์น๊ฐ ํ์ ๋ฐฉ์์ ๊ฒฐ์ ํฉ๋๋ค. ๊ฒ์์ ๊ทธ๋ํฝ ์ฑํ ๋ช ๋ น์ ํ๋, ๊ฐ, Ctrl+C์ ์คํฌ๋กค์ด ์๋ ํ๋ฅผ ์ฝ๋๋ค. ์ผ๋ฐ C# ์คํฌ๋ฆฝํธ๋ ๊ฒ์ ์ฐฝ์ด ์ด๋ ค ์์ด๋ ์ฐฝ์ด๋ ํ๊น ์์ด ๋ณด๊ณ ์ ๋ฌธ์์ด๋ง ๋ฐ์ต๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์๊ณ ์๋ ๋ฐ์ดํฐ๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
InfoGump()๋ ์ต์ ์๋ฒ ๋ํ์์ ๋๋ ํด๋ผ์ด์ธํธ ์ฐฝ์ ์ฝ์ต๋๋ค. ID๋ ์ธ๋ฑ์ค๋ก ์ ํํ๋ฉฐ last, LastGump, Last Gump๋ ์ต์ ์ฐฝ์ ๋๋ค. InfoGumps๋ ๊ฒ์ฌ ์ฐฝ์ ์ ์ธํ ๋ชฉ๋ก์ ๋ฐํํฉ๋๋ค. ๊ทธ๋ํฝ ๋ช ๋ น๋ง ํ๋ฅผ ์ฝ๋๋ค.
-
gumpโ ์๋ฒ ์ฐฝ ID ๋๋ ์ธ๋ฑ์ค. -1์ ๋ง์ง๋ง ํ์ฑ ์ฐฝ.
์ ๋์ฌ๋ C# Scripts IDE์์ ์ค์ ํ๋ฉฐ #์ ์์์ ๋๋ค. ์ธ์๋ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ๊ณ ๋ฐ์ดํ ์์ ํ ์คํธ๋ ํ๋์ ์ธ์์ ๋๋ค. id๋ serial, type์ graphic์ ๋๋ค. xy x y [z]๋ ํด๋น ์์น์ ์ฒซ ๋ก๋ ๊ฐ์ฒด, type๋ง ์ฐ๋ฉด ์ฒซ ์ผ์น ๊ฐ์ฒด๋ฅผ ์ ํํฉ๋๋ค. InfoTile(x,y,map)์ ์ธ ๋ฒ์งธ ์ธ์๋ Z๊ฐ ์๋๋ผ ์ง๋์ ๋๋ค.
#infogumps
๊ฐ ์ฝ๋ ๋ธ๋ก์ ์์ ํ ๋ ๋ฆฝ .csx์ ๋๋ค. ์์ serial, type๊ณผ ์ขํ๋ฅผ ๋ฐ๊พธ์ธ์. ์ธ์ ์์์ C# ๋ช ๋ช ๋ ์ธ์๋ ์๊ทธ๋์ฒ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
UO.Print(UO.InfoGumps());string report = UO.InfoGumps(0x12345678);
UO.Print(report);string ReadAllWindows() => UO.InfoGumps();
UO.Print(ReadAllWindows());new CommandSample().Execute(UO);
sealed class CommandSample
{
public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
{
api.Print(api.InfoGumps());
}
}CSharpGameApi.InfoGumps
-> CSharpScriptGlobals
-> InjectionScript.Runtime.InjectionApiUO.InfoGumps
ClassicUOInjectionApiBridge -> YokoInfoReport -> YokoInfoGump
string UO.InfoTile();
string UO.InfoTile(object? x);
string UO.InfoTile(object? x, object? y);
string UO.InfoTile(object? x, object? y, object? map);
string UO.InfoTile(object? type, object? x, object? y, object? z);
string UO.InfoTile(object? type, object? x, object? y, object? z, object? map);ํธ์ถ ์์น๊ฐ ํ์ ๋ฐฉ์์ ๊ฒฐ์ ํฉ๋๋ค. ๊ฒ์์ ๊ทธ๋ํฝ ์ฑํ ๋ช ๋ น์ ํ๋, ๊ฐ, Ctrl+C์ ์คํฌ๋กค์ด ์๋ ํ๋ฅผ ์ฝ๋๋ค. ์ผ๋ฐ C# ์คํฌ๋ฆฝํธ๋ ๊ฒ์ ์ฐฝ์ด ์ด๋ ค ์์ด๋ ์ฐฝ์ด๋ ํ๊น ์์ด ๋ณด๊ณ ์ ๋ฌธ์์ด๋ง ๋ฐ์ต๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์๊ณ ์๋ ๋ฐ์ดํฐ๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ํฝ ์ฑํ ์์ ์ธ์ ์๋ Info์ InfoTile์ ํ๊น์ ์์ํฉ๋๋ค. ์คํฌ๋ฆฝํธ์ Info()๋ ๋ง์ง๋ง ๋ฌผ์ฒด ํ๊น ๋๋ ํ๋ ์ด์ด๋ฅผ, InfoTile()์ ๋ฐ๋ฐ ์งํ์ ์ฝ์ต๋๋ค. serial, type, ์ขํ๋ก ๋์์ ์ง์ ํฉ๋๋ค. InfoTile(x,y,map)์ ์ธ ๋ฒ์งธ ์ธ์๋ ๋งต ๋ฒํธ์ ๋๋ค.
-
mapโ ๋งต ๋ฒํธ. ์๋ตํ๋ฉด ํ์ฌ ๋งต ์ฌ์ฉ. -
typeโ ์์ดํ ๊ทธ๋ํฝ ID. -1์ ์ง์ ์์น์ ๋ชจ๋ ์ข ๋ฅ์ ์ผ์น. -
xโ ์๋ X ์ขํ. -
yโ ์๋ Y ์ขํ. -
zโ Z ๋์ด. ์งง์ ํ์์ 0 ์ฌ์ฉ.
์ ๋์ฌ๋ C# Scripts IDE์์ ์ค์ ํ๋ฉฐ #์ ์์์ ๋๋ค. ์ธ์๋ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ๊ณ ๋ฐ์ดํ ์์ ํ ์คํธ๋ ํ๋์ ์ธ์์ ๋๋ค. id๋ serial, type์ graphic์ ๋๋ค. xy x y [z]๋ ํด๋น ์์น์ ์ฒซ ๋ก๋ ๊ฐ์ฒด, type๋ง ์ฐ๋ฉด ์ฒซ ์ผ์น ๊ฐ์ฒด๋ฅผ ์ ํํฉ๋๋ค. InfoTile(x,y,map)์ ์ธ ๋ฒ์งธ ์ธ์๋ Z๊ฐ ์๋๋ผ ์ง๋์ ๋๋ค.
#infotile
#info tile xy 1450 1690
#infotile 1450 1690 0
#infotile type 0x0EED 1450 1690 0 0
๊ฐ ์ฝ๋ ๋ธ๋ก์ ์์ ํ ๋ ๋ฆฝ .csx์ ๋๋ค. ์์ serial, type๊ณผ ์ขํ๋ฅผ ๋ฐ๊พธ์ธ์. ์ธ์ ์์์ C# ๋ช ๋ช ๋ ์ธ์๋ ์๊ทธ๋์ฒ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
UO.Print(UO.InfoTile(1450, 1690));string report = UO.InfoTile(1450, 1690, 0);
UO.Print(report);UO.Print(UO.InfoTile(0x0EED, 1450, 1690, 0, 0));new CommandSample().Execute(UO);
sealed class CommandSample
{
public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
{
api.Print(api.InfoTile(1450, 1690));
}
}CSharpGameApi.InfoTile
-> CSharpScriptGlobals
-> InjectionScript.Runtime.InjectionApiUO.InfoTile
ClassicUOInjectionApiBridge -> YokoInfoReport -> YokoInfoGump
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.Version();์ ํ์ ์ด๋ฆ๊ณผ ๋ฐํ์ ๋ฒ์ ์ ์ธ์ํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ExecuteLegacyManualAlias๋ ๋ธ๋ฆฌ์งRuntimeProductName ๋ฐ ๋ธ๋ฆฌ์งRuntimeProductVersion๋ฅผ SystemMessage๋ฅผ ํตํด ์ถ๋ ฅํฉ๋๋ค. ์ด๋ ๋ฐํ๋ ๋ฒ์ ๋ฒํธ๊ฐ ์๋ ๋ก๊ทธ ๋ฌธ์์ด์ ๋๋ค.
- ์ง์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ง ์์ ํ๊ฑฐ๋ ํ์ํฉ๋๋ค. ์ด ๋ช ๋ น์๋ ์๋ฒ ํ์ธ์ด ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.Version");
UO.Version();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ํ์ ์ด๋ฆ๊ณผ ๋ฐํ์ ๋ฒ์ ์ ์ธ์ํฉ๋๋ค.
UO.Version();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ExecuteLegacyManualAlias๋ ๋ธ๋ฆฌ์งRuntimeProductName ๋ฐ ๋ธ๋ฆฌ์งRuntimeProductVersion๋ฅผ SystemMessage๋ฅผ ํตํด ์ถ๋ ฅํฉ๋๋ค. ์ด๋ ๋ฐํ๋ ๋ฒ์ ๋ฒํธ๊ฐ ์๋ ๋ก๊ทธ ๋ฌธ์์ด์ ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Version();
UO.Help();
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.Version();
UO.Print(UO.GetUserCodepage());
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage($"{bridge.RuntimeProductName} v{bridge.RuntimeProductVersion}"). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.RuntimeProductName:bridge.RuntimeProductName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.RuntimeProductVersion:bridge.RuntimeProductVersion.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "version": SystemMessage($"{bridge.RuntimeProductName} v{bridge.RuntimeProductVersion}"); break;