KO UO Topic profiles configuration - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
ํ ยท C# ยท IDE ยท UO API ยท AโZ ยท ์ ยท ์ธ์ด
ํ๋กํ, ์ค์ ์ ์ฅ, ์ ์ญ ๊ฐ ๋ฐ ๋จ์ถํค. ์ ์ญ ๋ฐํ์ ๊ฐ๊ณผ ๋ก์ปฌ ํ๋ก์์ ๋ณ์์ ์๋ช ์ ๋ค๋ฆ ๋๋ค.
| ์ฃผ์ | ๋ช ๋ น ๋ฐ ์ค๋ช |
|---|---|
| GetProfile | UO.GetProfile |
| ProfileName | UO.ProfileName |
| ProfileShardName | UO.ProfileShardName |
| ChangeProfile | UO.ChangeProfile |
| ExtChangeProfile | UO.ExtChangeProfile |
| ResetProfile | UO.ResetProfile |
| SaveConfig | UO.SaveConfig |
| Global Variables | UO.GetGlobal ยท UO.SetGlobal ยท UO.GListGet ยท UO.GListSet ยท UO.GListSize |
| EasyUO Variables | UO.GetEasyUO ยท UO.SetEasyUO |
| MUL Path | UO.SetMulPath |
UO.GetProfile ยท UO.ProfileName ยท UO.ProfileShardName ยท UO.ChangeProfile ยท UO.ExtChangeProfile ยท UO.ResetProfile ยท UO.SaveConfig ยท UO.ReqProfile ยท UO.ClientProfilePath ยท UO.ClientPath ยท UO.SetMulPath
UO.GetGlobal ยท UO.SetGlobal ยท UO.GetEasyUO ยท UO.SetEasyUO ยท UO.GListClear ยท UO.GListGet ยท UO.GListPosName ยท UO.GListPosValue ยท UO.GListSet ยท UO.GListSize
UO.LoadHotkeys ยท UO.SaveHotkeys ยท UO.Set ยท UO.SetDefault
๊ฐ ๋ช ๋ น ์นด๋์๋ ์ง์ ์ฝ๋, ํจ์ ๋ฐ ํด๋์ค ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๋ค์์ ์ ํ๋ ์งง์ ์๋๋ฆฌ์ค์ ๋๋ค. ์ ํ์ฌํญ๊ณผ ์ ์ฒด ๋ถ์์ด ์นด๋์ ํฌํจ๋์ด ์์ต๋๋ค.
๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
var text = UO.GetGlobal("manual.delay");
var delayMs = 350;
if (Truth(text != "N/A") && Truth(IsNumeric(text)))
{
var parsed = Val(text);
if (Truth(parsed >= 50) && Truth(parsed <= 5000))
{
delayMs = checked((int)parsed);
}
}
await Delay(delayMs);
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool IsNumeric(object? value) => double.TryParse(Convert.ToString(value), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out _);
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
double Val(object? value) => double.TryParse(Convert.ToString(value), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out var number) ? number : 0;๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
UO.SetGlobal("manual.delay", 350);
UO.SetGlobal("manual.delay", 600);
var text = UO.GetGlobal("manual.delay");
if (Truth(IsNumeric(text)))
{
await Delay(Val(text));
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool IsNumeric(object? value) => double.TryParse(Convert.ToString(value), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out _);
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
double Val(object? value) => double.TryParse(Convert.ToString(value), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out var number) ? number : 0;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.ChangeProfile(object? name);์ธ์ ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ๋ค์ ์ ํ ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ์ ์ํด ์ ํํ ํ๋กํ์ ๋ณ๊ฒฝํฉ๋๋ค.
-
nameโ ์ ํ๋ ์ค๋์ ๋ํด TryResolveProfileCharacter๋ก ํ์ธ๋ ์ ์ฅ๋ ํ๋กํ/์บ๋ฆญํฐ ์ด๋ฆ์ ๋๋ค. ๋น์ด ์๊ฑฐ๋ ์ ์ ์๋ ์ด๋ฆ์ -4๋ฅผ ์ ๊ณตํฉ๋๋ค.
int: 0 โ ์ ํ ํญ๋ชฉ์ด ์ค๋น๋์์ต๋๋ค. -2 โ ๊ด๋ฆฌ์ ์ธ์ ๋๋ ์ฐ๊ฒฐ/๊ฒ์ ์ธ๊ณ๊ฐ ํ์ฑํ๋์ด ์์ต๋๋ค. -3 โ ๋ ์ด์์ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋ฉ๋๋ค. -4 - ํ๋กํ ์ด๋ฆ/์ค๋๊ฐ ํ์ฉ๋์ง ์์ต๋๋ค.
- ChangeProfile๋ ๋น ์ค๋/๋ฌธ์๋ฅผ ์ ๋ฌํฉ๋๋ค. ExtChangeProfile๋ ๋ช ์์ ์ธ ์ค๋์ ๋ฌธ์๋ฅผ ํ์ฉํฉ๋๋ค. ๊ด๋ฆฌ์ ์ธ์ ์์๋ ClassicUO Manager์์ ๋ค๋ฅธ ์ธ์ ์ ์ ํํด์ผ ํฉ๋๋ค. ์คํ ์ค์ธ ์ธ์ ์ ํด๋น ํ๋กํ์ ์ ์ฅํฉ๋๋ค.
- ์ฑ๊ณตํ๋ฉด ํ์ฌ ํ๋กํ์ ์ ์ฅ ๋ฐ ์ธ๋ก๋ํ๊ณ LastServerName๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ค์ ์ ์ ์ฅํ๊ณ ๋ค์ ๋ฌธ์๋ฅผ ํ ๋นํฉ๋๋ค. ์ฐ๊ฒฐ ์์ฒด๊ฐ ์์๋์ง ์์ต๋๋ค. Connect๋ ๋ณ๋๋ก ํธ์ถ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.ChangeProfile("ExampleProfile");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ค์ ์ ์ฅ๋ ํ๋กํ ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์์ ์ฝ๋๋ ์คํจ๋ฅผ ๋ํ๋ ๋๋ค.
var status = UO.ChangeProfile("ExampleProfile");
UO.Print(Convert.ToString(status));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ค๋ฅธ ์๋ฐ ์ฌํญ์ด ์๋ ๋นํ์ฑํ๋ ๋ ๋ฆฝ ์คํํ ํด๋ผ์ด์ธํธ๋ ๋น ์ด๋ฆ์ ๋ํด -4๋ฅผ ๋ฐํํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var status = UO.ChangeProfile("");
UO.Print(Convert.ToString(status));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Connect๋ ์ฝ๋ 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 status = UO.ChangeProfile("ExampleProfile");
if (Truth(status == 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;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: name (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ChangeProfileSelection:bridge.ChangeProfileSelection(Text(0), string.Empty, string.Empty). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "changeprofile":
return new InjectionValue(bridge.ChangeProfileSelection(Text(0), string.Empty, string.Empty));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
string UO.ClientPath();ํด๋ผ์ด์ธํธ ์ค์น/์คํ ๊ฐ๋ฅ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ฐํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
string โ ๋๋ ํฐ๋ฆฌ ๊ฒฝ๋ก. bool๋ ์๋๊ณ , ๋ฐฐ์ด๋ ์๋๊ณ , ID๋ ์๋๋๋ค. ๋น ๊ฒฝ๋ก๋ ๊ฐ์ ์ฌ์ฉํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ๊ธฐ๋ณธ ํ์ฌ ์์ ํด๋๋ก ์ฌ์ฉํ์ง ๋ง์ญ์์ค.
- CUOEnviroment.ExecutablePath๋ฅผ ์ฝ์ด๋ณด์ธ์. ์ด๋ ์ด์ ๊ฒฝ๋ก, ๊ฒฝ์ ์ง ๋ชฉ๋ก, ์คํฌ๋ฆฝํธ ํด๋ ๋๋ ๊ฒ์ ๋ฐ์ดํฐ ๊ฒฝ๋ก๊ฐ ์๋๋๋ค.
- ์ด ๋ช ๋ น์ ๊ฒฝ๋ก๋ฅผ ์ฝ๊ธฐ๋ง ํ๊ณ ์๋ฌด๊ฒ๋ ์ด๊ฑฐ๋ ์์ฑํ๊ฑฐ๋ ์ ์ฅํ์ง ์์ต๋๋ค. ํํ ๊ตฌ๋ถ ๊ธฐํธ๋ฅผ ๊ฐ์ ํ๋ฉด ์ ๋ฉ๋๋ค. ๋์ฐ๋ฏธ ์์ ์์๋ ํ์ํ ๊ฒฝ์ฐ ์ด๋ฅผ ์ถ๊ฐํฉ๋๋ค.
- ์ด๋ฆ์ ๊ฒ์/ํด๋ผ์ด์ธํธ ์ด๋ฆ API์ด๊ณ ์ฒ ์๋ UO์ ๋๋ค. ClientPath๋ ํด๋ผ์ด์ธํธ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ฐํํ๊ณ , ClientProfilePath๋ ํ์ฑ ํ๋กํ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ฐํํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.ClientPath();
UO.Print("ClientPath: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ผ์์ด ์์ต๋๋ค. ํด๋ - ๋ฌธ์์ด; ๋น ๊ฐ์ ๋ณ๋๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
var folder = UO.ClientPath();
if (Truth(folder == ""))
{
UO.Print("Folder is not available");
return null;
}
UO.Print(folder);
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด๋ฌํ ํด๋๋ ๋ค๋ฅธ ๋ชฉ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์คํฌ๋ฆฝํธ๋ ๊ตฌ์ฑ์ด๋ ํ๋กํ์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ์ค์ ๋ชจ๋ ์ถ๋ ฅํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var client = UO.ClientPath();
var profile = UO.ClientProfilePath();
UO.Print("Client: " + client);
if (Truth(profile == ""))
{
UO.Print("No current profile");
}
else
{
UO.Print("Profile: " + profile);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ChildPath ์ ์ฒด๊ฐ ํ์๋ฉ๋๋ค. ํด๋๋ ๊ฒฐ๊ณผ ๋๋ ํฐ๋ฆฌ์ด๊ณ ๋ฆฌํ๋ ํ์ผ ์ด๋ฆ์ ๋๋ค. ์ด๋ ๋ฒ์ฉ ๊ฒฝ๋ก ์ ๊ทํ๊ฐ ์๋ ํน์ ์ด๋ฆ์ ๋ํ ๋ฌธ์์ด ์ฐ๊ฒฐ์ ๋๋ค.
- ํ์ผ์ด ์์ฑ๋๊ฑฐ๋ ์ฝํ์ง์ง ์์ต๋๋ค. ๋จผ์ ๊ฒฐ๊ณผ ๋ฌธ์์ด์ ํ์ธํ ์ ์์ต๋๋ค.
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 folder = UO.ClientPath();
var filePath = ChildPath(folder, "sample.json");
if (Truth(filePath != ""))
{
UO.Print("Example path: " + filePath);
}
return null;
}
dynamic ChildPath(dynamic folder, dynamic leaf)
{
if (Truth(folder == ""))
{
return "";
}
var last = Right(folder, 1);
if (Truth(last == "/") || Truth(last == "\\"))
{
return folder + leaf;
}
return folder + "/" + leaf;
}
string Right(object? value, int count)
{
string text = Convert.ToString(value) ?? "";
return text[Math.Max(0, text.Length - count)..];
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ClientPath:bridge.ClientPath.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "clientpath": return new InjectionValue(bridge.ClientPath);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
string UO.ClientProfilePath();ํ์ฌ ํด๋ผ์ด์ธํธ ํ๋กํ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ฐํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
string โ ๋๋ ํฐ๋ฆฌ ๊ฒฝ๋ก. bool๋ ์๋๊ณ , ๋ฐฐ์ด๋ ์๋๊ณ , ID๋ ์๋๋๋ค. ๋น ๊ฒฝ๋ก๋ ๊ฐ์ ์ฌ์ฉํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ๊ธฐ๋ณธ ํ์ฌ ์์ ํด๋๋ก ์ฌ์ฉํ์ง ๋ง์ญ์์ค.
- ProfileManager.ProfilePath ์ฝ๊ธฐ; ํ๋กํ์ด ์์ง ์ ํ๋์ง ์์ ๊ฒฝ์ฐ ๋น ๋ฌธ์์ด์ด ๋ฐํ๋ฉ๋๋ค. ํตํ ์์ฒด๋ ํ๋กํ์ ์์ฑํ์ง ์์ผ๋ฉฐ ์ค์ ์ ์ ์กํ์ง ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ๊ฒฝ๋ก๋ฅผ ์ฝ๊ธฐ๋ง ํ๊ณ ์๋ฌด๊ฒ๋ ์ด๊ฑฐ๋ ์์ฑํ๊ฑฐ๋ ์ ์ฅํ์ง ์์ต๋๋ค. ํํ ๊ตฌ๋ถ ๊ธฐํธ๋ฅผ ๊ฐ์ ํ๋ฉด ์ ๋ฉ๋๋ค. ๋์ฐ๋ฏธ ์์ ์์๋ ํ์ํ ๊ฒฝ์ฐ ์ด๋ฅผ ์ถ๊ฐํฉ๋๋ค.
- ์ด๋ฆ์ ๊ฒ์/ํด๋ผ์ด์ธํธ ์ด๋ฆ API์ด๊ณ ์ฒ ์๋ UO์ ๋๋ค. ClientPath๋ ํด๋ผ์ด์ธํธ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ฐํํ๊ณ , ClientProfilePath๋ ํ์ฑ ํ๋กํ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ฐํํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.ClientProfilePath();
UO.Print("ClientProfilePath: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ผ์์ด ์์ต๋๋ค. ํด๋ - ๋ฌธ์์ด; ๋น ๊ฐ์ ๋ณ๋๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
var folder = UO.ClientProfilePath();
if (Truth(folder == ""))
{
UO.Print("Folder is not available");
return null;
}
UO.Print(folder);
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด๋ฌํ ํด๋๋ ๋ค๋ฅธ ๋ชฉ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์คํฌ๋ฆฝํธ๋ ๊ตฌ์ฑ์ด๋ ํ๋กํ์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ์ค์ ๋ชจ๋ ์ถ๋ ฅํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var client = UO.ClientPath();
var profile = UO.ClientProfilePath();
UO.Print("Client: " + client);
if (Truth(profile == ""))
{
UO.Print("No current profile");
}
else
{
UO.Print("Profile: " + profile);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ChildPath ์ ์ฒด๊ฐ ํ์๋ฉ๋๋ค. ํด๋๋ ๊ฒฐ๊ณผ ๋๋ ํฐ๋ฆฌ์ด๊ณ ๋ฆฌํ๋ ํ์ผ ์ด๋ฆ์ ๋๋ค. ์ด๋ ๋ฒ์ฉ ๊ฒฝ๋ก ์ ๊ทํ๊ฐ ์๋ ํน์ ์ด๋ฆ์ ๋ํ ๋ฌธ์์ด ์ฐ๊ฒฐ์ ๋๋ค.
- ํ์ผ์ด ์์ฑ๋๊ฑฐ๋ ์ฝํ์ง์ง ์์ต๋๋ค. ๋จผ์ ๊ฒฐ๊ณผ ๋ฌธ์์ด์ ํ์ธํ ์ ์์ต๋๋ค.
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 folder = UO.ClientProfilePath();
var filePath = ChildPath(folder, "sample.json");
if (Truth(filePath != ""))
{
UO.Print("Example path: " + filePath);
}
return null;
}
dynamic ChildPath(dynamic folder, dynamic leaf)
{
if (Truth(folder == ""))
{
return "";
}
var last = Right(folder, 1);
if (Truth(last == "/") || Truth(last == "\\"))
{
return folder + leaf;
}
return folder + "/" + leaf;
}
string Right(object? value, int count)
{
string text = Convert.ToString(value) ?? "";
return text[Math.Max(0, text.Length - count)..];
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CurrentProfilePath:bridge.CurrentProfilePath.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "shardpath":
case "clientprofilepath": return new InjectionValue(bridge.CurrentProfilePath);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.ExtChangeProfile(object? profileName);
dynamic UO.ExtChangeProfile(object? profileName, object? shardName);
dynamic UO.ExtChangeProfile(object? profileName, object? shardName, object? charName);์ธ์ ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ๋ค์ ์ ํ ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ์ ์ํด ์ ํํ ํ๋กํ์ ๋ณ๊ฒฝํฉ๋๋ค.
-
profileNameโ ์ ํ๋ ์ค๋์ ๋ํด TryResolveProfileCharacter๋ก ํ์ธ๋ ์ ์ฅ๋ ํ๋กํ/์บ๋ฆญํฐ ์ด๋ฆ์ ๋๋ค. ๋น์ด ์๊ฑฐ๋ ์ ์ ์๋ ์ด๋ฆ์ -4๋ฅผ ์ ๊ณตํฉ๋๋ค. -
shardNameโ ์ ํ์ ์ค๋ ์ด๋ฆ. ๋น ๊ฐ์ CurrentProfile.ServerName, World.ServerName ๋๋ LastServerName๋ฅผ ์ฌ์ฉํฉ๋๋ค. -
charName- ์ ํ์ ์ธ ์บ๋ฆญํฐ ์ด๋ฆ์ ๋๋ค. ๋น ๊ฐ์ ์ ์ฅ๋ ํ๋กํ ์ด๋ฆ์ ์ฌ์ฉํฉ๋๋ค.
int: 0 โ ์ ํ ํญ๋ชฉ์ด ์ค๋น๋์์ต๋๋ค. -2 โ ๊ด๋ฆฌ์ ์ธ์ ๋๋ ์ฐ๊ฒฐ/๊ฒ์ ์ธ๊ณ๊ฐ ํ์ฑํ๋์ด ์์ต๋๋ค. -3 โ ๋ ์ด์์ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋ฉ๋๋ค. -4 - ํ๋กํ ์ด๋ฆ/์ค๋๊ฐ ํ์ฉ๋์ง ์์ต๋๋ค.
- ChangeProfile๋ ๋น ์ค๋/๋ฌธ์๋ฅผ ์ ๋ฌํฉ๋๋ค. ExtChangeProfile๋ ๋ช ์์ ์ธ ์ค๋์ ๋ฌธ์๋ฅผ ํ์ฉํฉ๋๋ค. ๊ด๋ฆฌ์ ์ธ์ ์์๋ ClassicUO Manager์์ ๋ค๋ฅธ ์ธ์ ์ ์ ํํด์ผ ํฉ๋๋ค. ์คํ ์ค์ธ ์ธ์ ์ ํด๋น ํ๋กํ์ ์ ์ฅํฉ๋๋ค.
- ์ฑ๊ณตํ๋ฉด ํ์ฌ ํ๋กํ์ ์ ์ฅ ๋ฐ ์ธ๋ก๋ํ๊ณ LastServerName๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ค์ ์ ์ ์ฅํ๊ณ ๋ค์ ๋ฌธ์๋ฅผ ํ ๋นํฉ๋๋ค. ์ฐ๊ฒฐ ์์ฒด๊ฐ ์์๋์ง ์์ต๋๋ค. Connect๋ ๋ณ๋๋ก ํธ์ถ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.ExtChangeProfile("ExampleProfile");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ค์ ์ ์ฅ๋ ํ๋กํ ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์์ ์ฝ๋๋ ์คํจ๋ฅผ ๋ํ๋ ๋๋ค.
var status = UO.ExtChangeProfile("ExampleProfile");
UO.Print(Convert.ToString(status));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ค๋ฅธ ์๋ฐ ์ฌํญ์ด ์๋ ๋นํ์ฑํ๋ ๋ ๋ฆฝ ์คํํ ํด๋ผ์ด์ธํธ๋ ๋น ์ด๋ฆ์ ๋ํด -4๋ฅผ ๋ฐํํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var status = UO.ExtChangeProfile("");
UO.Print(Convert.ToString(status));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Connect๋ ์ฝ๋ 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 status = UO.ExtChangeProfile("ExampleProfile");
if (Truth(status == 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;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: profileName (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ChangeProfileSelection:bridge.ChangeProfileSelection(requestedProfile, requestedShard, requestedCharacter).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "extchangeprofile":
{
string requestedProfile = Text(0);
string requestedShard = arguments.Length > 1 ? Text(1) : string.Empty;
string requestedCharacter = arguments.Length > 2 ? Text(2) : string.Empty;
return new InjectionValue(bridge.ChangeProfileSelection(requestedProfile, requestedShard, requestedCharacter));
}๋งค๊ฐ๋ณ์: profileName (Any), shardName (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ChangeProfileSelection:bridge.ChangeProfileSelection(requestedProfile, requestedShard, requestedCharacter).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "extchangeprofile":
{
string requestedProfile = Text(0);
string requestedShard = arguments.Length > 1 ? Text(1) : string.Empty;
string requestedCharacter = arguments.Length > 2 ? Text(2) : string.Empty;
return new InjectionValue(bridge.ChangeProfileSelection(requestedProfile, requestedShard, requestedCharacter));
}๋งค๊ฐ๋ณ์: profileName (Any), shardName (Any), charName (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ChangeProfileSelection:bridge.ChangeProfileSelection(requestedProfile, requestedShard, requestedCharacter).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "extchangeprofile":
{
string requestedProfile = Text(0);
string requestedShard = arguments.Length > 1 ? Text(1) : string.Empty;
string requestedCharacter = arguments.Length > 2 ? Text(2) : string.Empty;
return new InjectionValue(bridge.ChangeProfileSelection(requestedProfile, requestedShard, requestedCharacter));
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.GListClear();์๋ก์ด ์ผ๋ จ์ ์์ ์ ์ํํ๊ธฐ ์ ์ ์ ์ฒด ์์ ๋ชฉ๋ก์ ์ง์๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฒฐ๊ณผ๊ฐ ์์ต๋๋ค. ์ง์ฐ๊ณ ๋๋ฉด GListSize()๋ 0๋ฅผ ๋ฐํํฉ๋๋ค.
- ๋ชฉ๋ก์ ๋ฐํ์ ์ธ์คํด์ค์ ์ํฉ๋๋ค. ๋ค๋ฅธ ์คํฌ๋ฆฝํธ ์คํ์๋ ์์ฒด ๋ชฉ๋ก์ด ์์ต๋๋ค. GList๋ ๊ณต์ ๋ ํ๋กํ ๊ฐ ์ ์ฅ์๊ฐ ์๋๋๋ค. ์ด๋ฌํ ๋ช ๋ น์ ํ์ผ์ ์ฐ์ง ์์ผ๋ฉฐ ์ ์ฅ๋ ํ๋กํ ์ํ๋ก ๋ค์ด๊ฐ์ง ์์ต๋๋ค. ์ ๋ฐํ์์ ๋น ๋ชฉ๋ก์ ๊ฐ์ ธ์ต๋๋ค. ๋ํ var/๋ณ์ ์ ์ธ๋ ์๋๊ณ UO.SetGlobal๋ ์๋๋๋ค.
- ์ ์ด๋ฆ์ด ๋์ ์ถ๊ฐ๋ฉ๋๋ค. ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋ ์ด๋ฆ์ ๋ฐ๋ณตํ๋ฉด ์๋ ์์น์์ ์ด๋ฆ์ ์๋ฏธ์ ์ฒ ์๊ฐ ๋์ฒด๋ฉ๋๋ค. ์ฝ์ด๋ ์๋ฌด๊ฒ๋ ์ญ์ ๋์ง ์์ต๋๋ค. ์์ ์ ์ธ ์์ธ์ด ํ์ํ ๊ฒฝ์ฐ ๊ฒ์ ๋์ค์ ๋ ์ฝ๋๋ฅผ ์ญ์ ํ๊ฑฐ๋ ์ถ๊ฐํ ์ ์์ต๋๋ค.
- ์์ ์ ๋ก์ปฌ์์ ์ํ๋ฉ๋๋ค. ํจํท์ด ์๊ณ ๊ฐ์ฒด ๊ฒ์์ด ์์ผ๋ฉฐ ๋๊ธฐ ์๊ฐ์ด ์์ต๋๋ค. Set/์ด๋ฆ์ ์์ฐจ์ ์ผ๋ก ๊ฒ์ํฉ๋๋ค. ๋ ํฐ ์ธํธ์ ๊ฒฝ์ฐ ์ฌ์ ์ ์ฌ์ฉํ์ญ์์ค. ์ด ๊ณ์ด์์ ํ๋์ ํค๋ฅผ ์ญ์ ํ๊ธฐ ์ํ ๋ณ๋์ ๋ช ๋ น์ ์์ต๋๋ค. ์ง์ฐ๊ธฐ๋ ๋ชจ๋ ํญ๋ชฉ์ ์ง์๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.GListClear");
UO.GListClear();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Clear๋ ๋ ๊ท์น์ ๋ชจ๋ ์ ๊ฑฐํ๊ณ Size๋ ๋น์ด ์์์ ํ์ธํฉ๋๋ค. ์บ๋ฆญํฐ์ ์์ดํ ์ ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค.
UO.GListClear();
UO.GListSet("bandage", 0x0E21);
UO.GListSet("gold", 0x0EED);
UO.GListClear();
if (Truth(UO.GListSize() == 0))
{
UO.Print("Batch rules cleared");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ด์์ด ์ถ๊ฐ๋๊ธฐ ์ ์ ์ด์ ๊ท์น์ด ์ ๊ฑฐ๋ฉ๋๋ค. ๊ฒ์์๋ graphic 0x19B9๊ฐ ํฌํจ๋ ์ ๊ท์น๋ง ํ์๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.GListClear();
UO.GListSet("bandage", 0x0E21);
UO.GListSet("gold", 0x0EED);
UO.GListClear();
UO.GListSet("ore", 0x19B9);
var i = 0;
while (Truth(i < UO.GListSize()))
{
var name = UO.GListPosName(i);
var graphic = UO.GListPosValue(i);
UO.Print(name + " | graphic: " + Convert.ToString(graphic));
i = i + 1;
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด์ ์ ์ฝ์ ์ซ์๋ ๋ชฉ๋ก์ด ์ง์์ง ํ์๋ ๊ณ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ชฉ๋ก์ ์ด๋ฏธ 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()
{
UO.GListClear();
UO.GListSet("bandage", 0x0E21);
UO.GListSet("gold", 0x0EED);
var retained = UO.GListGet("bandage");
UO.GListClear();
UO.Print("Retained graphic: " + Convert.ToString(retained));
UO.Print("Remaining entries: " + Convert.ToString(UO.GListSize()));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void GListClear() => globalList.Clear();ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GListGet(object? nameValue);๊ท์น ๋๋ ์นด์ดํฐ ์ด๋ฆ๋ณ๋ก ์์ ๋ชฉ๋ก์์ ๊ฐ์ ์ฝ์ต๋๋ค.
-
nameValueโ object? ๋ฌธ์์ด๋ก ๋ณํ๋ฉ๋๋ค. ์ด๋ฆ์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๊ณ ๋น๊ต๋ฉ๋๋ค. "bandage"์ "BANDAGE"๊ฐ ํ๋์ ํค์ ๋๋ค. ๋น์ด ์์ง ์์ ๋ฌธ์์ด ์ด๋ฆ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋น ์ด๋ฆ๋ ํ์ฉ๋ฉ๋๋ค.
object? โ ๋์ผํ ์ ํ์ ์ ์ฅ๋ ๊ฐ์ ๋๋ค. ์ด์ ๊ฐ ์์ผ๋ฉด int 0. ๋ณด์กด๋ 0๋ ์๋ GListGet์ ๊ตฌ๋ณํ ์ ์์ต๋๋ค. ์ด๋ฆ์ ํ์ธํ์ธ์.
- ๋ชฉ๋ก์ ๋ฐํ์ ์ธ์คํด์ค์ ์ํฉ๋๋ค. ๋ค๋ฅธ ์คํฌ๋ฆฝํธ ์คํ์๋ ์์ฒด ๋ชฉ๋ก์ด ์์ต๋๋ค. GList๋ ๊ณต์ ๋ ํ๋กํ ๊ฐ ์ ์ฅ์๊ฐ ์๋๋๋ค. ์ด๋ฌํ ๋ช ๋ น์ ํ์ผ์ ์ฐ์ง ์์ผ๋ฉฐ ์ ์ฅ๋ ํ๋กํ ์ํ๋ก ๋ค์ด๊ฐ์ง ์์ต๋๋ค. ์ ๋ฐํ์์ ๋น ๋ชฉ๋ก์ ๊ฐ์ ธ์ต๋๋ค. ๋ํ var/๋ณ์ ์ ์ธ๋ ์๋๊ณ UO.SetGlobal๋ ์๋๋๋ค.
- ์ ์ด๋ฆ์ด ๋์ ์ถ๊ฐ๋ฉ๋๋ค. ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋ ์ด๋ฆ์ ๋ฐ๋ณตํ๋ฉด ์๋ ์์น์์ ์ด๋ฆ์ ์๋ฏธ์ ์ฒ ์๊ฐ ๋์ฒด๋ฉ๋๋ค. ์ฝ์ด๋ ์๋ฌด๊ฒ๋ ์ญ์ ๋์ง ์์ต๋๋ค. ์์ ์ ์ธ ์์ธ์ด ํ์ํ ๊ฒฝ์ฐ ๊ฒ์ ๋์ค์ ๋ ์ฝ๋๋ฅผ ์ญ์ ํ๊ฑฐ๋ ์ถ๊ฐํ ์ ์์ต๋๋ค.
- ์์ ์ ๋ก์ปฌ์์ ์ํ๋ฉ๋๋ค. ํจํท์ด ์๊ณ ๊ฐ์ฒด ๊ฒ์์ด ์์ผ๋ฉฐ ๋๊ธฐ ์๊ฐ์ด ์์ต๋๋ค. Set/์ด๋ฆ์ ์์ฐจ์ ์ผ๋ก ๊ฒ์ํฉ๋๋ค. ๋ ํฐ ์ธํธ์ ๊ฒฝ์ฐ ์ฌ์ ์ ์ฌ์ฉํ์ญ์์ค. ์ด ๊ณ์ด์์ ํ๋์ ํค๋ฅผ ์ญ์ ํ๊ธฐ ์ํ ๋ณ๋์ ๋ช ๋ น์ ์์ต๋๋ค. ์ง์ฐ๊ธฐ๋ ๋ชจ๋ ํญ๋ชฉ์ ์ง์๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
UO.GListSet("simple_value", 42);
object? result = UO.GListGet("simple_value");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- BANDAGE๋ ๋ถ๋ ์ด์ ๋ฅผ ์ฐพ์ต๋๋ค. 0x0E21 - graphic ๋ถ๋, ๊ทธ์ ๊ณ ์ ํ serial๊ฐ ์๋.
UO.GListClear();
UO.GListSet("bandage", 0x0E21);
UO.GListSet("gold", 0x0EED);
var graphic = UO.GListGet("BANDAGE");
if (Truth(graphic == 0x0E21))
{
UO.Print("Bandage rule selected");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ ํ ํจ์ HasEntry๋ ์ด๋ฆ์ ํตํด ๋ฐ๋ณต๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ฒ๋ฆฌ๋ 0๋ ๋๋ฝ๋ ๊ฒ๊ณผ ๋ค๋ฆ ๋๋ค. ์์ฒด ํค์ ๊ฒฝ์ฐ ์ฌ๊ธฐ์์ ASCII ์ด๋ฆ์ด ์ฌ์ฉ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.GListClear();
UO.GListSet("processed", 0);
if (Truth(HasEntry("processed")))
{
var count = UO.GListGet("processed");
UO.Print("Recorded count: " + Convert.ToString(count));
}
if (!(Truth(HasEntry("missing"))))
{
UO.Print("No entry named missing");
}
return null;
}
dynamic HasEntry(dynamic name)
{
var i = 0;
while (Truth(i < UO.GListSize()))
{
if (Truth(Convert.ToString(UO.GListPosName(i)) == Convert.ToString(name)))
{
return true;
}
i = i + 1;
}
return false;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ง์ฐ โ ๋ฐ๋ฆฌ์ด ์; UO.Wait๋ 50โ5000 ๋ฒ์์ ๊ฐ์ ๋ํด์๋ง ํธ์ถ๋ฉ๋๋ค. ์ด ์์์๋ 350ms ๋์ ๊ธฐ๋ค๋ฆฝ๋๋ค.
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.GListClear();
UO.GListSet("delay", 350);
var delayMs = UO.GListGet("delay");
if (Truth(delayMs >= 50) && Truth(delayMs <= 5000))
{
await Delay(delayMs);
}
else
{
UO.Print("Delay outside the accepted range");
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: nameValue (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GListGet. -
InjectionScript.Runtime.InjectionValue.ToString:nameValue.ToString().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public InjectionValue GListGet(InjectionValue nameValue)
{
string name = nameValue.ToString();
int index = globalList.FindIndex(pair => pair.Key.Equals(name, StringComparison.OrdinalIgnoreCase));
return index >= 0 ? globalList[index].Value : InjectionValue.Zero;
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
string UO.GListPosName(object? index);๊ท์น์ ์ด๊ฑฐํ๊ธฐ ์ํด ์์น๋ณ๋ก ๋ ์ฝ๋ ์ด๋ฆ์ ์ฝ์ต๋๋ค.
-
index- int: 0๋ถํฐ GListSize()-1๊น์ง์ ์ธ๋ฑ์ค์ ๋๋ค. serial, graphic ๋๋ ์คํ์ ๋จ์ ์๊ฐ ์๋๋๋ค.
string๋ ๋ฑ๋ก๋ถ์ ๋ง์ง๋ง ๊ธฐ๋ก ํ์์ ์๋ ์ด๋ฆ์ ๋๋ค. ์๋ชป๋ ์ธ๋ฑ์ค๋ ""๋ฅผ ๋ฐํํฉ๋๋ค. ๋น ํค๋ ""๋ฅผ ๋ฐํํฉ๋๋ค.
- ๋ชฉ๋ก์ ๋ฐํ์ ์ธ์คํด์ค์ ์ํฉ๋๋ค. ๋ค๋ฅธ ์คํฌ๋ฆฝํธ ์คํ์๋ ์์ฒด ๋ชฉ๋ก์ด ์์ต๋๋ค. GList๋ ๊ณต์ ๋ ํ๋กํ ๊ฐ ์ ์ฅ์๊ฐ ์๋๋๋ค. ์ด๋ฌํ ๋ช ๋ น์ ํ์ผ์ ์ฐ์ง ์์ผ๋ฉฐ ์ ์ฅ๋ ํ๋กํ ์ํ๋ก ๋ค์ด๊ฐ์ง ์์ต๋๋ค. ์ ๋ฐํ์์ ๋น ๋ชฉ๋ก์ ๊ฐ์ ธ์ต๋๋ค. ๋ํ var/๋ณ์ ์ ์ธ๋ ์๋๊ณ UO.SetGlobal๋ ์๋๋๋ค.
- ์ ์ด๋ฆ์ด ๋์ ์ถ๊ฐ๋ฉ๋๋ค. ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋ ์ด๋ฆ์ ๋ฐ๋ณตํ๋ฉด ์๋ ์์น์์ ์ด๋ฆ์ ์๋ฏธ์ ์ฒ ์๊ฐ ๋์ฒด๋ฉ๋๋ค. ์ฝ์ด๋ ์๋ฌด๊ฒ๋ ์ญ์ ๋์ง ์์ต๋๋ค. ์์ ์ ์ธ ์์ธ์ด ํ์ํ ๊ฒฝ์ฐ ๊ฒ์ ๋์ค์ ๋ ์ฝ๋๋ฅผ ์ญ์ ํ๊ฑฐ๋ ์ถ๊ฐํ ์ ์์ต๋๋ค.
- ์์ ์ ๋ก์ปฌ์์ ์ํ๋ฉ๋๋ค. ํจํท์ด ์๊ณ ๊ฐ์ฒด ๊ฒ์์ด ์์ผ๋ฉฐ ๋๊ธฐ ์๊ฐ์ด ์์ต๋๋ค. Set/์ด๋ฆ์ ์์ฐจ์ ์ผ๋ก ๊ฒ์ํฉ๋๋ค. ๋ ํฐ ์ธํธ์ ๊ฒฝ์ฐ ์ฌ์ ์ ์ฌ์ฉํ์ญ์์ค. ์ด ๊ณ์ด์์ ํ๋์ ํค๋ฅผ ์ญ์ ํ๊ธฐ ์ํ ๋ณ๋์ ๋ช ๋ น์ ์์ต๋๋ค. ์ง์ฐ๊ธฐ๋ ๋ชจ๋ ํญ๋ชฉ์ ์ง์๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
UO.GListClear();
UO.GListSet("simple_value", 42);
var result = UO.GListPosName(0);
UO.Print("GListPosName: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ธ 0์ ์ฒซ ๋ฒ์งธ ๊ท์น์ ์๋ฏธํฉ๋๋ค. ์ฝ๊ธฐ ์ ์ ๋ชฉ๋ก์ด ๋น์ด ์์ง ์์์ง ํ์ธํฉ๋๋ค.
UO.GListClear();
UO.GListSet("bandage", 0x0E21);
UO.GListSet("gold", 0x0EED);
if (Truth(UO.GListSize() > 0))
{
var first = UO.GListPosName(0);
UO.Print("First rule: " + first);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- HasEntry๋ ๊ธฐ๋ก๋ 0 ์นด์ดํฐ์ ๋ํด true๋ฅผ ๋ฐํํ๊ณ ์ด๋ฆ์ด ๋๋ฝ๋ ๊ฒฝ์ฐ false๋ฅผ ๋ฐํํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.GListClear();
UO.GListSet("processed", 0);
if (Truth(HasEntry("processed")))
{
var count = UO.GListGet("processed");
UO.Print("Recorded count: " + Convert.ToString(count));
}
if (!(Truth(HasEntry("missing"))))
{
UO.Print("No entry named missing");
}
return null;
}
dynamic HasEntry(dynamic name)
{
var i = 0;
while (Truth(i < UO.GListSize()))
{
if (Truth(Convert.ToString(UO.GListPosName(i)) == Convert.ToString(name)))
{
return true;
}
i = i + 1;
}
return false;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- BANDAGE๋ฅผ ๋ฐ๋ณตํ๋ฉด ์ฒซ ๋ฒ์งธ ์์น์ ์๋ ์ด๋ฆ์ ์ฒ ์๊ฐ ๋ณ๊ฒฝ๋ฉ๋๋ค. ๊ธ์ ์ฌ์ ํ โโ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()
{
UO.GListClear();
UO.GListSet("bandage", 0x0E21);
UO.GListSet("gold", 0x0EED);
UO.GListSet("BANDAGE", 0x0E21);
var i = 0;
while (Truth(i < UO.GListSize()))
{
var name = UO.GListPosName(i);
var graphic = UO.GListPosValue(i);
UO.Print(name + " | graphic: " + Convert.ToString(graphic));
i = i + 1;
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: index (Integer)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string GListPosName(int index) => index >= 0 && index < globalList.Count ? globalList[index].Key : string.Empty;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GListPosValue(object? index);๋ฏธ๋ฆฌ ์ฑ์์ง ๋ชฉ๋ก์์ graphic์ ๊ฐ์ ์์น๋ณ ํญ๋ชฉ ๊ฐ์ ์ฝ์ต๋๋ค.
-
index- int: 0๋ถํฐ GListSize()-1๊น์ง์ ์ธ๋ฑ์ค์ ๋๋ค. serial, graphic ๋๋ ์คํ์ ๋จ์ ์๊ฐ ์๋๋๋ค.
object? โ ๋ณด์กด๋ ์ ํ์ ๊ฐ; ์๋ชป๋ ์ธ๋ฑ์ค๋ int 0๋ฅผ ๋ฐํํฉ๋๋ค. true 0๊ฐ ํ์ฉ๋๋ฏ๋ก ๊ฒฝ๊ณ๋ฅผ ํ์ธํ์ธ์.
- ๋ชฉ๋ก์ ๋ฐํ์ ์ธ์คํด์ค์ ์ํฉ๋๋ค. ๋ค๋ฅธ ์คํฌ๋ฆฝํธ ์คํ์๋ ์์ฒด ๋ชฉ๋ก์ด ์์ต๋๋ค. GList๋ ๊ณต์ ๋ ํ๋กํ ๊ฐ ์ ์ฅ์๊ฐ ์๋๋๋ค. ์ด๋ฌํ ๋ช ๋ น์ ํ์ผ์ ์ฐ์ง ์์ผ๋ฉฐ ์ ์ฅ๋ ํ๋กํ ์ํ๋ก ๋ค์ด๊ฐ์ง ์์ต๋๋ค. ์ ๋ฐํ์์ ๋น ๋ชฉ๋ก์ ๊ฐ์ ธ์ต๋๋ค. ๋ํ var/๋ณ์ ์ ์ธ๋ ์๋๊ณ UO.SetGlobal๋ ์๋๋๋ค.
- ์ ์ด๋ฆ์ด ๋์ ์ถ๊ฐ๋ฉ๋๋ค. ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋ ์ด๋ฆ์ ๋ฐ๋ณตํ๋ฉด ์๋ ์์น์์ ์ด๋ฆ์ ์๋ฏธ์ ์ฒ ์๊ฐ ๋์ฒด๋ฉ๋๋ค. ์ฝ์ด๋ ์๋ฌด๊ฒ๋ ์ญ์ ๋์ง ์์ต๋๋ค. ์์ ์ ์ธ ์์ธ์ด ํ์ํ ๊ฒฝ์ฐ ๊ฒ์ ๋์ค์ ๋ ์ฝ๋๋ฅผ ์ญ์ ํ๊ฑฐ๋ ์ถ๊ฐํ ์ ์์ต๋๋ค.
- ์์ ์ ๋ก์ปฌ์์ ์ํ๋ฉ๋๋ค. ํจํท์ด ์๊ณ ๊ฐ์ฒด ๊ฒ์์ด ์์ผ๋ฉฐ ๋๊ธฐ ์๊ฐ์ด ์์ต๋๋ค. Set/์ด๋ฆ์ ์์ฐจ์ ์ผ๋ก ๊ฒ์ํฉ๋๋ค. ๋ ํฐ ์ธํธ์ ๊ฒฝ์ฐ ์ฌ์ ์ ์ฌ์ฉํ์ญ์์ค. ์ด ๊ณ์ด์์ ํ๋์ ํค๋ฅผ ์ญ์ ํ๊ธฐ ์ํ ๋ณ๋์ ๋ช ๋ น์ ์์ต๋๋ค. ์ง์ฐ๊ธฐ๋ ๋ชจ๋ ํญ๋ชฉ์ ์ง์๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
UO.GListClear();
UO.GListSet("simple_value", 42);
object? result = UO.GListPosValue(0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ง์ 1๋ ๋ ๋ฒ์งธ ๊ธ์น์น์ ์ ํํฉ๋๋ค. ๊ฐ์ ์ฝ๊ธฐ ์ ์ ๊ฒฝ๊ณ ๊ฒ์ฌ๋ฅผ ์ํํฉ๋๋ค.
UO.GListClear();
UO.GListSet("bandage", 0x0E21);
UO.GListSet("gold", 0x0EED);
var index = 1;
if (Truth(index >= 0) && Truth(index < UO.GListSize()))
{
var graphic = UO.GListPosValue(index);
UO.Print("Second rule graphic: " + Convert.ToString(graphic));
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- graphic ๋ถ๋๋ ์๋์ ์๋ ์์ดํ ์ด ์๋ ๊ท์น์ ์๋ ๋ฌด์ฐจ๋ณ ๋์ ๊ฒ์์ ๋๋ค. ๊ฒ์ ์์ฒญ์ด ์ ์ก๋์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.GListClear();
UO.GListSet("bandage", 0x0E21);
UO.GListSet("gold", 0x0EED);
var total = UO.GListSize();
var i = 0;
while (Truth(i < total))
{
var graphic = UO.GListPosValue(i);
if (Truth(graphic == 0x0E21))
{
UO.Print("Bandage rule at index " + Convert.ToString(i));
}
i = i + 1;
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ๋ฑ์ค 0๊ฐ ์กด์ฌํ๋ฏ๋ก 0 ๊ฐ์ด ์ ํจํ ์นด์ดํฐ์ ๋๋ค. ์ฌ๊ธฐ์๋ 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.GListClear();
UO.GListSet("processed", 0);
var index = 0;
if (Truth(index < UO.GListSize()))
{
var count = UO.GListPosValue(index);
UO.Print("Valid zero count: " + Convert.ToString(count));
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: index (Integer)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public InjectionValue GListPosValue(int index) => index >= 0 && index < globalList.Count ? globalList[index].Value : InjectionValue.Zero;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.GListSet(object? nameValue, object? value);์์ ๋ชฉ๋ก์ ๋ช ๋ช ๋ ๊ฐ์ ์๋๋ค(์: graphic ์ ๋ฆฌํ ๊ท์น ๋๋ ํญ๋ชฉ ์ฒ๋ฆฌ ์นด์ดํฐ).
-
nameValueโ object? ๋ฌธ์์ด๋ก ๋ณํ๋ฉ๋๋ค. ์ด๋ฆ์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๊ณ ๋น๊ต๋ฉ๋๋ค. "bandage"์ "BANDAGE"๊ฐ ํ๋์ ํค์ ๋๋ค. ๋น์ด ์์ง ์์ ๋ฌธ์์ด ์ด๋ฆ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋น ์ด๋ฆ๋ ํ์ฉ๋ฉ๋๋ค.
void - ๊ฒฐ๊ณผ๊ฐ ์์ต๋๋ค. ํ ๋น ์์ด ๋ณ๋์ ๋ช ๋ น์ ์ฌ์ฉํฉ๋๋ค.
- ๋ชฉ๋ก์ ๋ฐํ์ ์ธ์คํด์ค์ ์ํฉ๋๋ค. ๋ค๋ฅธ ์คํฌ๋ฆฝํธ ์คํ์๋ ์์ฒด ๋ชฉ๋ก์ด ์์ต๋๋ค. GList๋ ๊ณต์ ๋ ํ๋กํ ๊ฐ ์ ์ฅ์๊ฐ ์๋๋๋ค. ์ด๋ฌํ ๋ช ๋ น์ ํ์ผ์ ์ฐ์ง ์์ผ๋ฉฐ ์ ์ฅ๋ ํ๋กํ ์ํ๋ก ๋ค์ด๊ฐ์ง ์์ต๋๋ค. ์ ๋ฐํ์์ ๋น ๋ชฉ๋ก์ ๊ฐ์ ธ์ต๋๋ค. ๋ํ var/๋ณ์ ์ ์ธ๋ ์๋๊ณ UO.SetGlobal๋ ์๋๋๋ค.
- ์ ์ด๋ฆ์ด ๋์ ์ถ๊ฐ๋ฉ๋๋ค. ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋ ์ด๋ฆ์ ๋ฐ๋ณตํ๋ฉด ์๋ ์์น์์ ์ด๋ฆ์ ์๋ฏธ์ ์ฒ ์๊ฐ ๋์ฒด๋ฉ๋๋ค. ์ฝ์ด๋ ์๋ฌด๊ฒ๋ ์ญ์ ๋์ง ์์ต๋๋ค. ์์ ์ ์ธ ์์ธ์ด ํ์ํ ๊ฒฝ์ฐ ๊ฒ์ ๋์ค์ ๋ ์ฝ๋๋ฅผ ์ญ์ ํ๊ฑฐ๋ ์ถ๊ฐํ ์ ์์ต๋๋ค.
- ์์ ์ ๋ก์ปฌ์์ ์ํ๋ฉ๋๋ค. ํจํท์ด ์๊ณ ๊ฐ์ฒด ๊ฒ์์ด ์์ผ๋ฉฐ ๋๊ธฐ ์๊ฐ์ด ์์ต๋๋ค. Set/์ด๋ฆ์ ์์ฐจ์ ์ผ๋ก ๊ฒ์ํฉ๋๋ค. ๋ ํฐ ์ธํธ์ ๊ฒฝ์ฐ ์ฌ์ ์ ์ฌ์ฉํ์ญ์์ค. ์ด ๊ณ์ด์์ ํ๋์ ํค๋ฅผ ์ญ์ ํ๊ธฐ ์ํ ๋ณ๋์ ๋ช ๋ น์ ์์ต๋๋ค. ์ง์ฐ๊ธฐ๋ ๋ชจ๋ ํญ๋ชฉ์ ์ง์๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.GListSet");
UO.GListSet("gold", 0x0EED);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ถ๋์ ๊ธ์ ๊ท์น์ ์ด๋ฆ์ด๊ณ ์ซ์๋ graphic์ ๋๋ค. BANDAGE๋ ์ฒซ ๋ฒ์งธ ํญ๋ชฉ์ ๋์ฒดํ๊ณ ์ธ ๋ฒ์งธ ํญ๋ชฉ์ ์์ฑํ์ง ์์ต๋๋ค. ์ถ๋ ฅ์ ์์๊ฐ ํ์๋ฉ๋๋ค.
UO.GListClear();
UO.GListSet("bandage", 0x0E21);
UO.GListSet("gold", 0x0EED);
UO.GListSet("BANDAGE", 0x0E21);
var i = 0;
while (Truth(i < UO.GListSize()))
{
var name = UO.GListPosName(i);
var graphic = UO.GListPosValue(i);
UO.Print(name + " | graphic: " + Convert.ToString(graphic));
i = i + 1;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒ๋ฆฌ๋ 0๋ก ์์๋ฉ๋๋ค. 3๋จ๊ณ๋ ์ ์ฅ๋ ์นด์ดํฐ๋ฅผ 3๋ก ์ฆ๊ฐ์ํต๋๋ค. ๊ฒ์ ์์ดํ ์ ์ฌ๊ธฐ๋ก ์ด๋ํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.GListClear();
UO.GListSet("processed", 0);
for (int i = (int)(1); i <= 3; i += (int)(1))
{
UO.GListSet("processed", UO.GListGet("processed") + 1);
}
UO.Print("Recorded count: " + Convert.ToString(UO.GListGet("processed")));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ชจ๋ โ ๋ฌธ์์ด, ์ ํ โ ์ซ์ 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()
{
UO.GListClear();
UO.GListSet("mode", "inspect");
UO.GListSet("limit", 2);
if (Truth(UO.GListGet("mode") == "inspect"))
{
for (int i = (int)(1); i <= UO.GListGet("limit"); i += (int)(1))
{
UO.Print("Inspect batch: " + Convert.ToString(i));
}
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: nameValue (Any), value (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GListSet. -
InjectionScript.Runtime.InjectionValue.ToString:nameValue.ToString().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void GListSet(InjectionValue nameValue, InjectionValue value)
{
string name = nameValue.ToString();
int index = globalList.FindIndex(pair => pair.Key.Equals(name, StringComparison.OrdinalIgnoreCase));
var entry = new KeyValuePair<string, InjectionValue>(name, value);
if (index >= 0)
globalList[index] = entry;
else
globalList.Add(entry);
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GListSize();๋น์ด ์๋์ง ํ์ธํ๊ฑฐ๋ ๋ฌด์ฐจ๋ณ ๋์ ์ ์ ํํ๊ธฐ ์ํด ์์ ๋ชฉ๋ก์์ ๋ช ๋ช ๋ ํญ๋ชฉ์ ์๋ฅผ ๊ณ์ฐํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int >= 0 โ ์คํ์ ์๋ ์์ดํ ์ด๋ ์ ๋์ ์๊ฐ ์๋๋ผ ๊ณ ์ ํ ์ด๋ฆ์ ์์ ๋๋ค.
- ๋ชฉ๋ก์ ๋ฐํ์ ์ธ์คํด์ค์ ์ํฉ๋๋ค. ๋ค๋ฅธ ์คํฌ๋ฆฝํธ ์คํ์๋ ์์ฒด ๋ชฉ๋ก์ด ์์ต๋๋ค. GList๋ ๊ณต์ ๋ ํ๋กํ ๊ฐ ์ ์ฅ์๊ฐ ์๋๋๋ค. ์ด๋ฌํ ๋ช ๋ น์ ํ์ผ์ ์ฐ์ง ์์ผ๋ฉฐ ์ ์ฅ๋ ํ๋กํ ์ํ๋ก ๋ค์ด๊ฐ์ง ์์ต๋๋ค. ์ ๋ฐํ์์ ๋น ๋ชฉ๋ก์ ๊ฐ์ ธ์ต๋๋ค. ๋ํ var/๋ณ์ ์ ์ธ๋ ์๋๊ณ UO.SetGlobal๋ ์๋๋๋ค.
- ์ ์ด๋ฆ์ด ๋์ ์ถ๊ฐ๋ฉ๋๋ค. ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋ ์ด๋ฆ์ ๋ฐ๋ณตํ๋ฉด ์๋ ์์น์์ ์ด๋ฆ์ ์๋ฏธ์ ์ฒ ์๊ฐ ๋์ฒด๋ฉ๋๋ค. ์ฝ์ด๋ ์๋ฌด๊ฒ๋ ์ญ์ ๋์ง ์์ต๋๋ค. ์์ ์ ์ธ ์์ธ์ด ํ์ํ ๊ฒฝ์ฐ ๊ฒ์ ๋์ค์ ๋ ์ฝ๋๋ฅผ ์ญ์ ํ๊ฑฐ๋ ์ถ๊ฐํ ์ ์์ต๋๋ค.
- ์์ ์ ๋ก์ปฌ์์ ์ํ๋ฉ๋๋ค. ํจํท์ด ์๊ณ ๊ฐ์ฒด ๊ฒ์์ด ์์ผ๋ฉฐ ๋๊ธฐ ์๊ฐ์ด ์์ต๋๋ค. Set/์ด๋ฆ์ ์์ฐจ์ ์ผ๋ก ๊ฒ์ํฉ๋๋ค. ๋ ํฐ ์ธํธ์ ๊ฒฝ์ฐ ์ฌ์ ์ ์ฌ์ฉํ์ญ์์ค. ์ด ๊ณ์ด์์ ํ๋์ ํค๋ฅผ ์ญ์ ํ๊ธฐ ์ํ ๋ณ๋์ ๋ช ๋ น์ ์์ต๋๋ค. ์ง์ฐ๊ธฐ๋ ๋ชจ๋ ํญ๋ชฉ์ ์ง์๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GListSize();
UO.Print("GListSize: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ์ธํธ๋ ๊ท์น์ด ์ฒ๋ฆฌ๋๊ธฐ ์ ์ ์ ์ฐจ๋ฅผ ์ค์งํฉ๋๋ค.
UO.GListClear();
if (Truth(UO.GListSize() == 0))
{
UO.Print("No batch rules; stop here");
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ๊ท์น์ ์ธ๋ฑ์ค 0 ๋ฐ 1์ ๋ํด ๋ฐ๋ณต๋ฉ๋๋ค. i < Size ์กฐ๊ฑด์ ์ธ๋ฑ์ค 2์ ๋ํ ์ก์ธ์ค๋ฅผ ํ์ฉํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.GListClear();
UO.GListSet("bandage", 0x0E21);
UO.GListSet("gold", 0x0EED);
var i = 0;
while (Truth(i < UO.GListSize()))
{
var name = UO.GListPosName(i);
var graphic = UO.GListPosValue(i);
UO.Print(name + " | graphic: " + Convert.ToString(graphic));
i = i + 1;
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋์ฒด BANDAGE๋ ์ด๋ฆ ์๋ฅผ ๋๋ฆฌ์ง ์์ต๋๋ค. ์ ํ ํฌ๊ธฐ๋ 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()
{
UO.GListClear();
UO.GListSet("bandage", 0x0E21);
UO.GListSet("gold", 0x0EED);
var before = UO.GListSize();
UO.GListSet("BANDAGE", 0x0E21);
if (Truth(UO.GListSize() == before))
{
UO.Print("Existing rule updated without an extra entry");
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GListSize() => globalList.Count;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
string UO.GetEasyUO(object? number);์ฌ์ฉ์์ Windows ๋ ์ง์คํธ๋ฆฌ EasyUO์์ ๋ฌธ์์ด์ ์ฝ์ต๋๋ค.
-
number- int/NumberConversions.ToInt๋ก ๋ณํ๋ ๊ฐ. 10์ง์ ์ด๋ฆ ๋ ์ง์คํธ๋ฆฌ ๊ฐ์ ๊ตฌ์ฑํฉ๋๋ค.
string โ ๊ฐ HKCU\Software\EasyUO<๋ฒํธ>; ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ * ์ด๋ฆ์ด ํ์ธ๋ฉ๋๋ค. ํค/๊ฐ์ด ๋๋ฝ๋์๊ฑฐ๋ Windows ์ธ๋ถ์ ์๋ ๊ฒฝ์ฐ ๋น ๋ฌธ์์ด์ด ๋ฐํ๋ฉ๋๋ค.
- ๋ ์๋ ์ด์ ๋ฅผ ์์ฑํ๊ฑฐ๋ ๊ฒ์ ์ธ๊ณ์ ์ ๊ทผํ์ง ์์ต๋๋ค. ๋ ๊ฑฐ์ ๋ ์ง์คํธ๋ฆฌ ์ธํฐํ์ด์ค๋ GetGlobal์ ๋ค๋ฆ ๋๋ค. ์์คํ ๋ ์ง์คํธ๋ฆฌ ์ก์ธ์ค ์ค๋ฅ๊ฐ ํผ์ง ์ ์์ต๋๋ค. ๋ธ๋ฆฟ์ง์๋ ๋ณ๋์ ์บ์น๊ฐ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetEasyUO(1);
UO.Print("GetEasyUO: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด๋ฆ์ ๋จผ์ ์ฝ๊ณ (1), ๊ทธ ๋ค์ *1์ ์ฝ์ต๋๋ค.
var value = UO.GetEasyUO(1);
UO.Print(value);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ๋ฌธ์์ด์ ๊ฐ์ด ์๊ฑฐ๋ ๋น ํ ์คํธ๋ก ์ ์ฅ๋ ์ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.GetEasyUO(999);
if (Truth(Len(value) == 0))
{
UO.Print("empty");
}
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ซ์๋ ๊ฐ์ฒด์ serial๊ฐ ์๋ ๋ ์ง์คํธ๋ฆฌ ๊ฐ์ ์ ์ํฉ๋๋ค.
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 = 2;
var value = UO.GetEasyUO(number);
UO.Print(value);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: number (Any)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetEasyUO. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetEasyUO:bridge.GetEasyUO(NumberConversions.ToInt(number)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(number).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string GetEasyUO(InjectionValue number) => bridge.GetEasyUO(NumberConversions.ToInt(number));string UO.GetGlobal(object? name);
dynamic UO.GetGlobal(object? globalRegion, object? varName);SetGlobal๊ณผ GetGlobal์ ๋ชจ๋ ์คํฌ๋ฆฝํธ, ํ๋กํ๊ณผ Full Client/Client ํ๋ก์ธ์ค์์ ๊ณต์ ํฉ๋๋ค. ๊ฐ์ ๋ฌธ์์ด์ด๊ณ ์๋ ํค๋ "N/A"์ ๋๋ค. ํค๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๋ฉฐ region ํ์์ region/name ์์ ๋๋ค. Manager/Game Manager/CSharp/globals.json์ ํ๋ก์ธ์ค ๊ฐ ์ ๊ธ์ผ๋ก ์๋ก ์ฝ๊ณ ์ฌ์์ ํ์๋ ๋ณด์กดํฉ๋๋ค. Shared ํ์๋ ๊ฐ์ ์ ์ฅ์์ ๋๋ค.
-
globalRegionโ ํค ์ด๋ฆ๊ณผ ๊ฒฐํฉํ๋ ๋ค์์คํ์ด์ค. -
nameโ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๋ ๊ณต์ ํค ์ด๋ฆ. -
varNameโ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๋ ๊ณต์ ํค ์ด๋ฆ.
๊ฐ ์ฝ๋ ๋ธ๋ก์ ์์ ํ ๋ ๋ฆฝ .csx์ ๋๋ค. ์์ serial, type๊ณผ ์ขํ๋ฅผ ๋ฐ๊พธ์ธ์. ์ธ์ ์์์ C# ๋ช ๋ช ๋ ์ธ์๋ ์๊ทธ๋์ฒ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
#getglobal team.target
#get global team.message
๊ฐ ์ฝ๋ ๋ธ๋ก์ ์์ ํ ๋ ๋ฆฝ .csx์ ๋๋ค. ์์ serial, type๊ณผ ์ขํ๋ฅผ ๋ฐ๊พธ์ธ์. ์ธ์ ์์์ C# ๋ช ๋ช ๋ ์ธ์๋ ์๊ทธ๋์ฒ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
string value = UO.GetGlobal("team.target");
UO.Print(value);string value = UO.GetGlobal("team.delay");
if (int.TryParse(value, out int milliseconds))
UO.Print(milliseconds.ToString());UO.Print(Convert.ToString(UO.GetGlobal("team", "delay")));new CommandSample().Execute(UO);
sealed class CommandSample
{
public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
{
string value = api.GetGlobal("team.target");
api.Print(value);
}
}CSharpGameApi.GetGlobal
-> CSharpScriptGlobals
-> InjectionScript.Runtime.InjectionApiUO.RegisterClientApiCompatibility
-> InjectionScript.Runtime.State.Globals.GetGlobal
Globals -> SharedGlobalStore -> named mutex -> atomic JSON replacement
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
string UO.GetProfile(object? serial);ํ๋กํ ์ฐฝ์ ๋ํด ์๋ฒ๊ฐ ๋ณด๋ด๋ ๊ณต๊ฐ ๋ฌธ์ ์ค๋ช ์ ์ฝ์ต๋๋ค. ๋ฉ๋ชจ๋ฅผ ์ฝ๊ฑฐ๋ ์ ํํ ์บ๋ฆญํฐ์ ์ค๋ช ์์ ํ ์คํธ๋ฅผ ๊ฒ์ํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค. ์ด๋ ๊ด๋ฆฌ์ ํ๋กํ ์ค์ ์ด ์๋๋๋ค.
-
serialโ ์ฐ์ ๋ฌธ์: ์ซ์, ID 0x๊ฐ ํฌํจ๋ ๋ฌธ์์ด... ๋๋ "self" ๋๋ "lasttarget"๊ณผ ๊ฐ์ ๊ฐ์ฒด ์ ํ๊ธฐ. ์ด๊ฒ์ ์ฒดํ๋, ํ์ผ๋ช ๋, ๊ด๋ฆฌ์ ํ๋กํ๋ ์๋๋๋ค.
string โ ์ ๋ชฉ๊ณผ ์๋ช ์ด ์๋ ๊ธฐ๋ณธ ์ค๋ช ํ ์คํธ์ ๋๋ค. ๋น ์ค๋ช ์ ํ์ฉ๋ฉ๋๋ค. 3์ด ๋์ ์๋ต์ด ์์ผ๋ฉด ๊ณต๋ฐฑ ๊ฒฐ๊ณผ๋ ๊ฐ๋ฅํฉ๋๋ค. ์ด๊ฒ์ true/false๊ฐ ์๋๋๋ค. ํธ์ถํ ๋๋ง๋ค ์์ฒญ์ด ์ ์ก๋ฉ๋๋ค. ์ค๋ช ์ด ์ด๋ฏธ ์ธ์ ์ ์ ์ฅ๋์ด ์๋ ๊ฒฝ์ฐ ์ด๋ ค ์๋ ์ฐฝ์ ์ด์์ ํฌํจํ์ฌ ์ฆ์ ๋ฐํ๋ฉ๋๋ค. ์ด๋ ์๋ก์ด ์๋ฒ ์๋ต์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
- ์ค๋ช ๊ณผ ์ด์์ ์ธ์ ์ ์ํฉ๋๋ค. ๊ฒ์ ์ฐฝ์ ๋ซ์ผ๋ฉด ๊ฒ์ํ์ง ์๊ณ ์ ์ฅ๋๋ฉฐ, ์ด๋ฉด ํ๋กํ ์ฐฝ์ด ๋ณต์๋ฉ๋๋ค. ์์ ์ ํ๋กํ์ ๋ช ์์ ์ผ๋ก ๋ซ์ผ๋ฉด ์์ ๋ ํ ์คํธ๊ฐ ํ ๋ฒ ์ ์ก๋ฉ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ๋ฌธ์๋ ์ ์ก๋์ง ์์ต๋๋ค. ์ ์๋ฒ ์๋ต์ ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋์ฒดํ๊ณ ์ฐ๊ฒฐ์ ๋์ผ๋ฉด ๋ฐ์ดํฐ๊ฐ ์ง์์ง๋๋ค. GetProfile ์์ฒด๋ ์๋ฌด๊ฒ๋ ํธ์งํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetProfile("self");
UO.Print("GetProfile: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- "self" - ์บ๋ฆญํฐ์ ๋ํ ์ค๋ช ์ ๋๋ค. ๊ณ์ ๊ตฌ์ฑ์ด ์๋๋๋ค. ์๋ฒ๋ก๋ถํฐ ์์ ๋์๊ฑฐ๋ ์ด๋ฏธ ์ธ์ ์ ์ ์ฅ๋ ํ ์คํธ๊ฐ ํ์๋ฉ๋๋ค.
var note = UO.GetProfile("self");
if (Truth(note != ""))
{
UO.Print(note);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ธฐ์กด lasttarget๊ฐ ํ์ํฉ๋๋ค. FindText ์์ ํ ์คํธ์์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ฌ "Healer"๋ผ๋ ๋จ์ด๋ฅผ ๊ฒ์ํฉ๋๋ค. ์ผ์นํ๋ ํญ๋ชฉ์ด ์์ผ๋ฉด AddObject๋ ์ ํํ serial๋ฅผ healerNote๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ์ฅํฉ๋๋ค. ์ด๊ฒ์ ์ง์ ์ฆ๋ช ์ด ์๋ ์ฌ์ฉ์ ๋ฉ๋ชจ์ ๋๋ค NPC.
return RunScenario();
object? RunScenario()
{
if (!(Truth(UO.Exists("lasttarget"))))
{
return null;
}
var note = UO.GetProfile("lasttarget");
if (Truth(FindText(note, "Healer") > 0))
{
UO.AddObject("healerNote", "lasttarget");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
int FindText(object? text, object? value) => (Convert.ToString(text) ?? "").IndexOf(Convert.ToString(value) ?? "", StringComparison.Ordinal) + 1;
int FindText(int start, object? text, object? value)
{
string input = Convert.ToString(text) ?? "";
return input.IndexOf(Convert.ToString(value) ?? "", Math.Clamp(start - 1, 0, input.Length), StringComparison.Ordinal) + 1;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ์ฒด ๊ธฐ๋ฅ HasPublicNote์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๊ฐ์ฒด์ ํ์ ๋ฌธ์์ด์ ์กด์ฌ๋ฅผ ํ ์คํธํ์ฌ true/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()
{
if (Truth(HasPublicNote("lasttarget", "Guild")))
{
UO.AddObject("guildNote", "lasttarget");
}
return null;
}
dynamic HasPublicNote(dynamic serial, dynamic phrase)
{
if (!(Truth(UO.Exists(serial))))
{
return false;
}
return FindText(UO.GetProfile(serial), phrase) > 0;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
int FindText(object? text, object? value) => (Convert.ToString(text) ?? "").IndexOf(Convert.ToString(value) ?? "", StringComparison.Ordinal) + 1;
int FindText(int start, object? text, object? value)
{
string input = Convert.ToString(text) ?? "";
return input.IndexOf(Convert.ToString(value) ?? "", Math.Clamp(start - 1, 0, input.Length), StringComparison.Ordinal) + 1;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: serial (Any)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetProfile. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetProfile:bridge.GetProfile(GetObject(serial)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(serial).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string GetProfile(InjectionValue serial) => bridge.GetProfile(GetObject(serial));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.LoadHotkeys();์ ์ฅ๋ ๋งคํฌ๋ก์ ๋จ์ถํค๋ฅผ ๋ก๋ํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- LoadHotkeys๋ Invoke๋ฅผ ํตํด _world.Macros.Load๋ฅผ ํธ์ถํฉ๋๋ค. ํ์ฌ ๋งคํฌ๋ก ํ ์ด๋ธ์ ๋ก์ปฌ ํ๋กํ ๋ฐ์ดํฐ๋ก ๋์ฒด๋ฉ๋๋ค.
- ์ง์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ง ์์ ํ๊ฑฐ๋ ํ์ํฉ๋๋ค. ์ด ๋ช ๋ น์๋ ์๋ฒ ํ์ธ์ด ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.LoadHotkeys");
UO.LoadHotkeys();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ์ฅ๋ ๋งคํฌ๋ก์ ๋จ์ถํค๋ฅผ ๋ก๋ํฉ๋๋ค.
UO.LoadHotkeys();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- LoadHotkeys๋ Invoke๋ฅผ ํตํด _world.Macros.Load๋ฅผ ํธ์ถํฉ๋๋ค. ํ์ฌ ๋งคํฌ๋ก ํ ์ด๋ธ์ ๋ก์ปฌ ํ๋กํ ๋ฐ์ดํฐ๋ก ๋์ฒด๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.ProfileName());
UO.LoadHotkeys();
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.LoadHotkeys();
UO.Print("Macros loaded");
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LoadHotkeys:bridge.LoadHotkeys().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "loadhotkeys": bridge.LoadHotkeys(); break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.ProfileName();ํ์ฌ ํ๋กํ์ ์ด๋ฆ์ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
string โ ๋ธ๋ฆฌ์ง ํ๋์ ํ ์คํธ.ProfileName; ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ๋น ๋ฌธ์์ด์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด๊ฒ์ ์ฐ๊ฒฐ ๊ธฐํธ๊ฐ ์๋๋ฉฐ ์ซ์ ID๋ ์๋๋๋ค.
- ExecuteClientApiCompatibility๋ ํ๋กํ์ด๋ ์๋ฒ ์ ํ์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ธ๋ฆฌ์ง๋ฅผ ๋ฐํํฉ๋๋ค.ProfileName.
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.ProfileName();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ํ๋กํ์ ์ด๋ฆ์ ์ฝ์ต๋๋ค.
var value = UO.ProfileName();
UO.Print(value);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ExecuteClientApiCompatibility๋ ํ๋กํ์ด๋ ์๋ฒ ์ ํ์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ธ๋ฆฌ์ง๋ฅผ ๋ฐํํฉ๋๋ค.ProfileName.
return RunScenario();
object? RunScenario()
{
var value = UO.ProfileName();
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.ProfileName();
UO.Wait(500);
var after = UO.ProfileName();
UO.Print(before = after);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ProfileName:bridge.ProfileName.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "profilename": return new InjectionValue(bridge.ProfileName);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.ProfileShardName();์ค๋ ์ด๋ฆ์ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
string โ ๋ธ๋ฆฌ์ง ํ๋์ ํ ์คํธ.ShardName; ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ๋น ๋ฌธ์์ด์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด๊ฒ์ ์ฐ๊ฒฐ ๊ธฐํธ๊ฐ ์๋๋ฉฐ ์ซ์ ID๋ ์๋๋๋ค.
- ExecuteClientApiCompatibility๋ ํ๋กํ์ด๋ ์๋ฒ ์ ํ์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ธ๋ฆฌ์ง๋ฅผ ๋ฐํํฉ๋๋ค.ShardName.
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.ProfileShardName();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ค๋ ์ด๋ฆ์ ์ฝ์ต๋๋ค.
var value = UO.ProfileShardName();
UO.Print(value);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ExecuteClientApiCompatibility๋ ํ๋กํ์ด๋ ์๋ฒ ์ ํ์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ธ๋ฆฌ์ง๋ฅผ ๋ฐํํฉ๋๋ค.ShardName.
return RunScenario();
object? RunScenario()
{
var value = UO.ProfileShardName();
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.ProfileShardName();
UO.Wait(500);
var after = UO.ProfileShardName();
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 ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ReqProfile();
void UO.ReqProfile(object? mobile);์บ๋ฆญํฐ์ ์๋ ค์ง ํ๋กํ ํ ์คํธ๋ฅผ ์ธ์ํฉ๋๋ค.
-
mobile- ์ ํ์ฌํญ serial/๋ณ์นญ. ์ธ์ ์์ - "lasttarget". ์ด๊ฒ์ ๋ก์ปฌ ์ค์ ํ๋กํ ClassicUO์ด ์๋๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ExecuteLegacyManualAlias๊ฐ GetProfile์ ํธ์ถํ ๋ค์ SystemMessage๋ฅผ ํธ์ถํฉ๋๋ค. Bridge.GetProfile๋ RequestProfile๋ฅผ ๋ณด๋ธ ๋ค์ ์ต๋ 3์ด ๋์ CharacterPanels.Profile.CurrentText๋ฅผ ํ์ธํ๊ณ 25 ms๋ฅผ ์ผ์ ์ค์งํฉ๋๋ค. ์ด๋ฏธ ์กด์ฌํ๋ ํ ์คํธ๋ ์ฆ์ ๋ฐํ๋ ์ ์์ต๋๋ค. ์๊ฐ ์ด๊ณผ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ์์ง๊ฐ ํ์๋๊ณ ๋น ์ค์ด ํ์๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ํ ์คํธ๋ฅผ ์ธ์ํ์ง๋ง ๋ฐํํ์ง๋ ์์ต๋๋ค.
- string ๊ฐ์๋ UO.GetProfile๋ฅผ ์ฌ์ฉํ์ธ์. ํ ์คํธ์ ์กด์ฌ๋ ์ฑ๊ณต์ ์ธ ์ด๋ฆ ๋ณ๊ฒฝ์ด๋ ์บ๋ฆญํฐ ์ํ์ ์ฆ๊ฑฐ๊ฐ ์๋๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.ReqProfile");
UO.ReqProfile();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์บ๋ฆญํฐ์ ์๋ ค์ง ํ๋กํ ํ ์คํธ๋ฅผ ์ธ์ํฉ๋๋ค.
UO.ReqProfile();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ExecuteLegacyManualAlias๊ฐ GetProfile์ ํธ์ถํ ๋ค์ SystemMessage๋ฅผ ํธ์ถํฉ๋๋ค. Bridge.GetProfile๋ RequestProfile๋ฅผ ๋ณด๋ธ ๋ค์ ์ต๋ 3์ด ๋์ CharacterPanels.Profile.CurrentText๋ฅผ ํ์ธํ๊ณ 25 ms๋ฅผ ์ผ์ ์ค์งํฉ๋๋ค. ์ด๋ฏธ ์กด์ฌํ๋ ํ ์คํธ๋ ์ฆ์ ๋ฐํ๋ ์ ์์ต๋๋ค. ์๊ฐ ์ด๊ณผ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ์์ง๊ฐ ํ์๋๊ณ ๋น ์ค์ด ํ์๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ํ ์คํธ๋ฅผ ์ธ์ํ์ง๋ง ๋ฐํํ์ง๋ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.ReqProfile("self");
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- string ๊ฐ์๋ UO.GetProfile๋ฅผ ์ฌ์ฉํ์ธ์. ํ ์คํธ์ ์กด์ฌ๋ ์ฑ๊ณต์ ์ธ ์ด๋ฆ ๋ณ๊ฒฝ์ด๋ ์บ๋ฆญํฐ ์ํ์ ์ฆ๊ฑฐ๊ฐ ์๋๋๋ค.
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.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
UO.ReqProfile(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.SystemMessage:SystemMessage(GetProfile(arguments.Length > 0 ? arguments[0] : new InjectionValue("lasttarget"))). -
InjectionScript.Runtime.InjectionApiUO.GetProfile:GetProfile(arguments.Length > 0 ? arguments[0] : new InjectionValue("lasttarget")).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "reqprofile":
SystemMessage(GetProfile(arguments.Length > 0 ? arguments[0] : new InjectionValue("lasttarget")));
break;๋งค๊ฐ๋ณ์: mobile (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage(GetProfile(arguments.Length > 0 ? arguments[0] : new InjectionValue("lasttarget"))). -
InjectionScript.Runtime.InjectionApiUO.GetProfile:GetProfile(arguments.Length > 0 ? arguments[0] : new InjectionValue("lasttarget")).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "reqprofile":
SystemMessage(GetProfile(arguments.Length > 0 ? arguments[0] : new InjectionValue("lasttarget")));
break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ResetProfile();ํ์ฑ ํ๋กํ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ์ค์ ํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ResetProfile๊ฐ ProfileManager.ResetCurrentProfileToDefault๋ฅผ ํธ์ถํฉ๋๋ค. ํ์ฑ ํ๋กํ์ด ์์ผ๋ฉด ์ค๋ฅ๊ฐ ํ์๋ฉ๋๋ค. ๋ก์ปฌ ์ค์ ์ ๋ณ๊ฒฝํ๋ฏ๋ก ์ ์ฅ๋ ์ฌ์ฉ์ ๊ฐ์ด ์์ค๋ ์ ์์ต๋๋ค.
- ์ง์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ง ์์ ํ๊ฑฐ๋ ํ์ํฉ๋๋ค. ์ด ๋ช ๋ น์๋ ์๋ฒ ํ์ธ์ด ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.ResetProfile");
UO.ResetProfile();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฑ ํ๋กํ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ์ค์ ํฉ๋๋ค.
UO.ResetProfile();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ResetProfile๊ฐ ProfileManager.ResetCurrentProfileToDefault๋ฅผ ํธ์ถํฉ๋๋ค. ํ์ฑ ํ๋กํ์ด ์์ผ๋ฉด ์ค๋ฅ๊ฐ ํ์๋ฉ๋๋ค. ๋ก์ปฌ ์ค์ ์ ๋ณ๊ฒฝํ๋ฏ๋ก ์ ์ฅ๋ ์ฌ์ฉ์ ๊ฐ์ด ์์ค๋ ์ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.ProfileName());
UO.ResetProfile();
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.ResetProfile();
UO.SaveConfig();
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ResetProfile:bridge.ResetProfile().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "resetprofile": bridge.ResetProfile(); break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.SaveConfig();ํ์ฌ ClassicUO ํ๋กํ์ ์ ์ฅํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- SaveConfig๋ Invoke๋ฅผ ํตํด ProfileManager.SaveCurrentProfile๋ฅผ ํธ์ถํฉ๋๋ค. ์ด ๋ช ๋ น์ ๋ก์ปฌ ํ๋กํ ์ค์ ์ ๊ธฐ๋กํฉ๋๋ค. ๊ฒฝ๋ก๋ ProfileManager์์ ๊ฐ์ ธ์ต๋๋ค.
- ์ง์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ง ์์ ํ๊ฑฐ๋ ํ์ํฉ๋๋ค. ์ด ๋ช ๋ น์๋ ์๋ฒ ํ์ธ์ด ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SaveConfig");
UO.SaveConfig();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ClassicUO ํ๋กํ์ ์ ์ฅํฉ๋๋ค.
UO.SaveConfig();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- SaveConfig๋ Invoke๋ฅผ ํตํด ProfileManager.SaveCurrentProfile๋ฅผ ํธ์ถํฉ๋๋ค. ์ด ๋ช ๋ น์ ๋ก์ปฌ ํ๋กํ ์ค์ ์ ๊ธฐ๋กํฉ๋๋ค. ๊ฒฝ๋ก๋ ProfileManager์์ ๊ฐ์ ธ์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.ProfileName());
UO.SaveConfig();
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.SaveConfig();
UO.Print(UO.ShardPath());
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.SaveConfig. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SaveConfig:bridge.SaveConfig().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void SaveConfig() => bridge.SaveConfig();ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.SaveHotkeys();๋งคํฌ๋ก์ ๋จ์ถํค๋ฅผ ์ ์ฅํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- SaveHotkeys๋ Invoke๋ฅผ ํตํด _world.Macros.Save๋ฅผ ํธ์ถํฉ๋๋ค. ํ์ฌ ํ๋กํ์ ๋ก์ปฌ ๋งคํฌ๋ก ํ ์ด๋ธ์ด ์ ์ฅ๋ฉ๋๋ค.
- ์ง์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ง ์์ ํ๊ฑฐ๋ ํ์ํฉ๋๋ค. ์ด ๋ช ๋ น์๋ ์๋ฒ ํ์ธ์ด ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SaveHotkeys");
UO.SaveHotkeys();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋งคํฌ๋ก์ ๋จ์ถํค๋ฅผ ์ ์ฅํฉ๋๋ค.
UO.SaveHotkeys();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- SaveHotkeys๋ Invoke๋ฅผ ํตํด _world.Macros.Save๋ฅผ ํธ์ถํฉ๋๋ค. ํ์ฌ ํ๋กํ์ ๋ก์ปฌ ๋งคํฌ๋ก ํ ์ด๋ธ์ด ์ ์ฅ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.ProfileName());
UO.SaveHotkeys();
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.SaveHotkeys();
UO.LoadHotkeys();
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SaveHotkeys:bridge.SaveHotkeys().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "savehotkeys": bridge.SaveHotkeys(); break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.Set(object? name, object? value);์ธ ๊ฐ์ง ๋ ๊ฑฐ์ ์ค์ ์ค ํ๋๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
-
nameโ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋ ๋ฌธ์์ด: "finddistance", "grabdelay" ๋๋ "equipfordress". ์ ์ ์๋ ์ด๋ฆ์ ์๋์ผ๋ก ๋ฌด์๋ฉ๋๋ค. -
value- int ๋๋ double/0x-ํ ์คํธ. ๋ฌธ์์ด ํ์์ ๊ฒฝ์ฐ TryStr2Int; ์๋ชป๋ ํ ์คํธ๋ ์ค๋ฅ๊ฐ ์๋ 0๊ฐ ๋ฉ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- finddistance๊ฐ ๋ธ๋ฆฌ์ง๋ฅผ ํธ์ถํฉ๋๋ค.SetFindDistance, Grabdelay๊ฐ ๋ธ๋ฆฌ์ง๋ฅผ ํธ์ถํฉ๋๋ค.SetGrabDelay, ์ฅ๋นfordress๊ฐ ์ํ๋ฅผ ํ ๋นํฉ๋๋ค.UseEquipForDress. ์ด๋ ์ธ ๊ฐ์ง ๊ฐ๋ณ ์ค์ ์ ๋๋ค. ์์์ ์์ฑ์ ๋ํ ๋ฒ์ฉ ์ค์ ์๋ ์์ต๋๋ค.
- ๋ฌธ์์ด ๊ฐ์ ๋จผ์ fallback=0๋ฅผ ์ฌ์ฉํ์ฌ TryStr2Int๋ก ๋ณํ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ธ์๋ ์ค์ ์ ์คํ๋ก ์ธํด 0๊ฐ ๊ธฐ๋ก๋ ์ ์์ต๋๋ค. Set ์์ ์ ๋ฌผ๊ฑด์ ์ฐพ์ง ์์ผ๋ฉฐ, ์ท๋ ๊ฐ์์ ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.Set");
UO.Set("finddistance", 10);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ ๊ฐ์ง ๋ ๊ฑฐ์ ์ค์ ์ค ํ๋๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
UO.Set("finddistance", 10);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- finddistance๊ฐ ๋ธ๋ฆฌ์ง๋ฅผ ํธ์ถํฉ๋๋ค.SetFindDistance, Grabdelay๊ฐ ๋ธ๋ฆฌ์ง๋ฅผ ํธ์ถํฉ๋๋ค.SetGrabDelay, ์ฅ๋นfordress๊ฐ ์ํ๋ฅผ ํ ๋นํฉ๋๋ค.UseEquipForDress. ์ด๋ ์ธ ๊ฐ์ง ๊ฐ๋ณ ์ค์ ์ ๋๋ค. ์์์ ์์ฑ์ ๋ํ ๋ฒ์ฉ ์ค์ ์๋ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Set("grabdelay", "250");
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฌธ์์ด ๊ฐ์ ๋จผ์ fallback=0๋ฅผ ์ฌ์ฉํ์ฌ TryStr2Int๋ก ๋ณํ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ธ์๋ ์ค์ ์ ์คํ๋ก ์ธํด 0๊ฐ ๊ธฐ๋ก๋ ์ ์์ต๋๋ค. Set ์์ ์ ๋ฌผ๊ฑด์ ์ฐพ์ง ์์ผ๋ฉฐ, ์ท๋ ๊ฐ์์ ์ง ์์ต๋๋ค.
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.Set("equipfordress", 1);
UO.Print(UO.FindDistance());
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: name (String), value (Integer/String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Set. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetFindDistance:bridge.SetFindDistance(value). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetGrabDelay:bridge.SetGrabDelay(value).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void Set(string name, int value)
{
if (name.Equals("finddistance", StringComparison.OrdinalIgnoreCase))
{
bridge.SetFindDistance(value);
}
else if (name.Equals("grabdelay", StringComparison.OrdinalIgnoreCase))
{
bridge.SetGrabDelay(value);
}
else if (name.Equals("equipfordress", StringComparison.OrdinalIgnoreCase))
{
state.UseEquipForDress = value;
}
}๋งค๊ฐ๋ณ์: name (String), value (Integer/String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Set. -
InjectionScript.Runtime.NumberConversions.TryStr2Int:NumberConversions.TryStr2Int(valueStr, out var value). -
InjectionScript.Runtime.InjectionApiUO.Set:Set(name, valueInt).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void Set(string name, string valueStr)
{
int valueInt = NumberConversions.TryStr2Int(valueStr, out var value) ? value : 0;
Set(name, valueInt);
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.SetDefault(object? name, object? @object);๋ฐํ์ ์ํ์ ๋ช ๋ช ๋ ๋ณ์นญ serial์ ์ ์ฅํฉ๋๋ค.
-
nameโ ๋ณ์นญ์ ํ ์คํธ๋ก ์ง์ ํ๊ณ ์ฌ๋ก๋ ๊ฐ์ฒด ์ฌ์ ์ ์ฒ๋ฆฌํฉ๋๋ค. -
objectโ Arg/GetObject์ ํตํ ์ง๋ ฌ/๋ณ์นญ. ์ด๋ฆ๊ณผ serial ์์๋๋ก ์ ๋ ฅํ์ธ์.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ExecuteLegacyManualAlias๋ state.Objects.Set(Text(0),Arg(1))๋ฅผ ํธ์ถํฉ๋๋ค. ๋ํ์ ์ ํ์ ์์ต๋๋ค. serial์ ์กด์ฌ๋ ํ์ธ๋์ง ์์์ต๋๋ค.
- ์ด๋ ํ๋กํ์ ์ฌ์ค์ ํ๊ฑฐ๋ ๋ชจ๋ ์ค์ ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ฒด ์ด๋ฆ์ ๊ธฐ๋กํ๋ ๊ฒ์ ๋๋ค. ํ์ ํธ์ถ์์๋ ๋ณ์นญ์ด ๋ค์ ํ์ธ๋ฉ๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SetDefault");
UO.SetDefault("manualObject", UO.Self());๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฐํ์ ์ํ์ ๋ช ๋ช ๋ ๋ณ์นญ serial์ ์ ์ฅํฉ๋๋ค.
UO.SetDefault("manualObject", UO.Self());๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ExecuteLegacyManualAlias๋ state.Objects.Set(Text(0),Arg(1))๋ฅผ ํธ์ถํฉ๋๋ค. ๋ํ์ ์ ํ์ ์์ต๋๋ค. serial์ ์กด์ฌ๋ ํ์ธ๋์ง ์์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.SetDefault("manualBag", UO.Backpack());
UO.Print(UO.GetSerial("manualBag"));
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 id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
UO.SetDefault("manualTarget", id);
UO.Print(UO.GetName("manualTarget"));
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: name (Any), object (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.State.RuntimeDictionary.Set:state.Objects.Set(Text(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Text:Text(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(1).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "setdefault":
if (arguments.Length > 1) state.Objects.Set(Text(0), Arg(1));
break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.SetEasyUO(object? number, object? value);Windows ๋ ์ง์คํธ๋ฆฌ EasyUO์ ๋ฌธ์์ด ๊ฐ์ ์๋๋ค.
-
numberโ int ๊ฐ ๋ฒํธ, *-์ ๋์ฌ ์์ด double ํ์. -
valueโ ToString์ ํตํ ํ ์คํธ; ์ ์ก๋ ์ํ๋ก ์ ์ฅ๋ฉ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- Windows์์๋ ์ฐ๊ธฐ ๊ถํ SetValue(decimalNumber,value,RegistryValueKind.string)์ด ์๋ HKCU\Software\EasyUO๋ฅผ ์ด๊ฑฐ๋ ์์ฑํฉ๋๋ค. ๋ค๋ฅธ OS์์๋ ๋ฉ์์ง๋ฅผ ํ์ํ๊ณ ๊ธฐ๋กํ์ง ์์ต๋๋ค.
- ์ด๋ ํ์ฌ ์ฌ์ฉ์ ๋ ์ง์คํธ๋ฆฌ์ ์ธ๋ถ ์๊ตฌ ํญ๋ชฉ์ด๋ฉฐ, ๋ฒ์๊ฐ ์ง์ ๋ ์ ์ญ ๋ฐํ์์ด ์๋๋ฉฐ ๊ฒ์ serial๋ ์๋๋๋ค. ์ด ๊ธฐ๋ฅ์ ๋ ์ง์คํธ๋ฆฌ ์ก์ธ์ค ์ค๋ฅ๋ฅผ ์จ๊ธฐ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SetEasyUO");
UO.SetEasyUO(9001, "manual-example");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Windows ๋ ์ง์คํธ๋ฆฌ EasyUO์ ๋ฌธ์์ด ๊ฐ์ ์๋๋ค.
UO.SetEasyUO(9001, "manual-example");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Windows์์๋ ์ฐ๊ธฐ ๊ถํ SetValue(decimalNumber,value,RegistryValueKind.String)์ด ์๋ HKCU\Software\EasyUO๋ฅผ ์ด๊ฑฐ๋ ์์ฑํฉ๋๋ค. ๋ค๋ฅธ OS์์๋ ๋ฉ์์ง๋ฅผ ํ์ํ๊ณ ๊ธฐ๋กํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.SetEasyUO(9001, "");
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด๋ ํ์ฌ ์ฌ์ฉ์ ๋ ์ง์คํธ๋ฆฌ์ ์ธ๋ถ ์๊ตฌ ํญ๋ชฉ์ด๋ฉฐ, ๋ฒ์๊ฐ ์ง์ ๋ ์ ์ญ ๋ฐํ์์ด ์๋๋ฉฐ ๊ฒ์ serial๋ ์๋๋๋ค. ์ด ๊ธฐ๋ฅ์ ๋ ์ง์คํธ๋ฆฌ ์ก์ธ์ค ์ค๋ฅ๋ฅผ ์จ๊ธฐ์ง ์์ต๋๋ค.
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.SetEasyUO(9001, "manual-example");
UO.Print(UO.GetEasyUO(9001));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: number (Any), value (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.SetEasyUO. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetEasyUO:bridge.SetEasyUO(NumberConversions.ToInt(number), value.ToString()). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(number). -
InjectionScript.Runtime.InjectionValue.ToString:value.ToString().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void SetEasyUO(InjectionValue number, InjectionValue value)
=> bridge.SetEasyUO(NumberConversions.ToInt(number), value.ToString());void UO.SetGlobal(object? name, object? value);
void UO.SetGlobal(object? globalRegion, object? varName, object? varValue);SetGlobal๊ณผ GetGlobal์ ๋ชจ๋ ์คํฌ๋ฆฝํธ, ํ๋กํ๊ณผ Full Client/Client ํ๋ก์ธ์ค์์ ๊ณต์ ํฉ๋๋ค. ๊ฐ์ ๋ฌธ์์ด์ด๊ณ ์๋ ํค๋ "N/A"์ ๋๋ค. ํค๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๋ฉฐ region ํ์์ region/name ์์ ๋๋ค. Manager/Game Manager/CSharp/globals.json์ ํ๋ก์ธ์ค ๊ฐ ์ ๊ธ์ผ๋ก ์๋ก ์ฝ๊ณ ์ฌ์์ ํ์๋ ๋ณด์กดํฉ๋๋ค. Shared ํ์๋ ๊ฐ์ ์ ์ฅ์์ ๋๋ค.
-
globalRegionโ ํค ์ด๋ฆ๊ณผ ๊ฒฐํฉํ๋ ๋ค์์คํ์ด์ค. -
nameโ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๋ ๊ณต์ ํค ์ด๋ฆ. -
valueโ ํ ์คํธ๋ก ์ ์ฅ๋๋ ๊ฐ. -
varNameโ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๋ ๊ณต์ ํค ์ด๋ฆ. -
varValueโ ํ ์คํธ๋ก ์ ์ฅ๋๋ ๊ฐ.
๊ฐ ์ฝ๋ ๋ธ๋ก์ ์์ ํ ๋ ๋ฆฝ .csx์ ๋๋ค. ์์ serial, type๊ณผ ์ขํ๋ฅผ ๋ฐ๊พธ์ธ์. ์ธ์ ์์์ C# ๋ช ๋ช ๋ ์ธ์๋ ์๊ทธ๋์ฒ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
#setglobal team.target 0x40001234
#set global team.message ะัะธะฒัั ัััะผ
๊ฐ ์ฝ๋ ๋ธ๋ก์ ์์ ํ ๋ ๋ฆฝ .csx์ ๋๋ค. ์์ serial, type๊ณผ ์ขํ๋ฅผ ๋ฐ๊พธ์ธ์. ์ธ์ ์์์ C# ๋ช ๋ช ๋ ์ธ์๋ ์๊ทธ๋์ฒ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
UO.SetGlobal("team.target", 0x40001234);
UO.Print(UO.GetGlobal("team.target"));UO.SetGlobal("team.message", "ะัะธะฒัั");
UO.Print(UO.GetGlobal("team.message"));UO.SetGlobal("team", "delay", "350");
UO.Print(Convert.ToString(UO.GetGlobal("team", "delay")));new CommandSample().Execute(UO);
sealed class CommandSample
{
public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
{
api.SetGlobal("team.target", 0x40001234);
api.Print(api.GetGlobal("team.target"));
}
}CSharpGameApi.SetGlobal
-> CSharpScriptGlobals
-> InjectionScript.Runtime.InjectionApiUO.RegisterClientApiCompatibility
-> InjectionScript.Runtime.State.Globals.SetGlobal
Globals -> SharedGlobalStore -> named mutex -> atomic JSON replacement
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.SetMulPath(object? pathValue);๋ฐํ์์ ๊ฒฝ๋ก ๋ฌธ์์ด mulPath์ ์ ์ฅํฉ๋๋ค.
-
pathValueโ ToString์ ํตํ ํ ์คํธ; ์ ์ก๋ ์ํ๋ก ์ ์ฅ๋ฉ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- mulPath = ToString ๋๋ ๋น ๋ฌธ์์ด์ ํ ๋นํฉ๋๋ค. ํ์ผ์ด ์ด๋ฆฌ์ง ์๊ณ ์ง๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ ๋ก๋๋์ง ์์ผ๋ฉฐ ์ด ๊ธฐ๋ฅ์ผ๋ก ๊ฒฝ๋ก ๊ฐ์ฉ์ฑ์ ํ์ธํ์ง ์์ต๋๋ค.
- ์ด๋ ํ์ฌ ๋ฐํ์์ ํธํ์ฑ ์ ์ฅ์์ ๋๋ค. ํ๋ก์ ํธ ๋น๊ณต๊ฐ mulPath/showZ์๋ ์๋น์๊ฐ ์์ต๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ์์ฐ์ ๋ค์ ๋ก๋ํ๊ฑฐ๋ ๋์ด ํ์๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SetMulPath");
UO.SetMulPath("C:\\Ultima Online");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฐํ์์ ๊ฒฝ๋ก ๋ฌธ์์ด mulPath์ ์ ์ฅํฉ๋๋ค.
UO.SetMulPath("C:\\Ultima Online");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- mulPath = ToString ๋๋ ๋น ๋ฌธ์์ด์ ํ ๋นํฉ๋๋ค. ํ์ผ์ด ์ด๋ฆฌ์ง ์๊ณ ์ง๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ ๋ก๋๋์ง ์์ผ๋ฉฐ ์ด ๊ธฐ๋ฅ์ผ๋ก ๊ฒฝ๋ก ๊ฐ์ฉ์ฑ์ ํ์ธํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.SetMulPath("");
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด๋ ํ์ฌ ๋ฐํ์์ ํธํ์ฑ ์ ์ฅ์์ ๋๋ค. ํ๋ก์ ํธ ๋น๊ณต๊ฐ mulPath/showZ์๋ ์๋น์๊ฐ ์์ต๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ์์ฐ์ ๋ค์ ๋ก๋ํ๊ฑฐ๋ ๋์ด ํ์๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
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()
{
ApplyValue("C:\\Ultima Online");
return null;
}
void ApplyValue(dynamic value)
{
UO.SetMulPath(value);
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: pathValue (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.SetMulPath. -
InjectionScript.Runtime.InjectionValue.ToString:pathValue.ToString().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void SetMulPath(InjectionValue pathValue) => mulPath = pathValue.ToString() ?? string.Empty;