KO UO Topic proxy - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
ํ ยท C# ยท IDE ยท UO API ยท AโZ ยท ์ ยท ์ธ์ด
ํ๋ก์์ ๋ํด ํธํ ๊ฐ๋ฅํ ์ด๋ฆ API. ๋ฑ๋ก๋ถ์ ์ด๋ฆ์ด ์๋ค๋ ๊ฒ๋ง์ผ๋ก๋ ์ด์ก ์ง์์ ์ฆ๋ช ํ ์ ์์ต๋๋ค. ์ค์ ์ ํ์ฌํญ์ ๊ฐ ์นด๋์ ํ์๋์ด ์์ต๋๋ค.
| ์ฃผ์ | ๋ช ๋ น ๋ฐ ์ค๋ช |
|---|---|
| UseProxy | UO.UseProxy |
| ProxyIP | UO.ProxyIP |
| ProxyPort | UO.ProxyPort |
| Authentication | UO.UseProxy |
UO.UseProxy ยท UO.ProxyIP ยท UO.ProxyPort
๊ฐ ๋ช ๋ น ์นด๋์๋ ์ง์ ์ฝ๋, ํจ์ ๋ฐ ํด๋์ค ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๋ค์์ ์ ํ๋ ์งง์ ์๋๋ฆฌ์ค์ ๋๋ค. ์ ํ์ฌํญ๊ณผ ์ ์ฒด ๋ถ์์ด ์นด๋์ ํฌํจ๋์ด ์์ต๋๋ค.
๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
return UO.ProxyIP();๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
return UO.ProxyPort();ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.ProxyIP();์ฐ๊ฒฐํ๊ธฐ ์ ์ ํ์ฌ ํ๋กํ์ ํ๋ก์ ์ฃผ์๋ฅผ ์ฝ์ด ์ ํํ ๊ฒฝ๋ก๋ฅผ ํ์ธํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
string: ์ง์ ๋ IP ๋๋ DNS์ ํ๋ก์ ์ด๋ฆ์ ๋๋ค. ์ง์ ์กฐ์ธ์ ๊ฒฝ์ฐ ๋น ๋ฌธ์์ด์ ๋๋ค. DNS-์ด๋ฆ์ ์ฌ๊ธฐ์ IP๋ก ๋ณํ๋์ง ์์ต๋๋ค. ๊ฒ์ ์๋ฒ ์ฃผ์๊ฐ ์๋๋๋ค.
- ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค. ์ฐ๊ฒฐ ์์ด๋ ์ด ์ธ์ ์์ ์์ ์ค์ ์ ์ฝ์ต๋๋ค. ํ๋ก์๋ฅผ ํ์ฑํ ๋๋ ๋นํ์ฑํํ์ง ์์ผ๋ฉฐ, ํ๋ก์์ ์ก์ธ์คํ์ง ์์ผ๋ฉฐ, ๋ค์ ์ฐ๊ฒฐํ๊ฑฐ๋ ๋น๋ฐ๋ฒํธ๋ฅผ ๊ณต๊ฐํ์ง ์์ต๋๋ค. ๊ด๋ฆฌ๋๋ ํ๋ก์๊ฐ ์๋ ์ผ๋ฐ ์ ์ฒด๋ ์ง์ ์ฐ๊ฒฐ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์ฐ๊ฒฐ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ๋ ค๋ฉด ํ๋กํ์ ๋ณ๊ฒฝํ๊ณ ํด๋น ์ธ์ ์ ๋ค์ ์์ํ์ธ์. ํ๋กํ์ ๋ก๊ทธ์ธ๊ณผ ๊ฒ์ ์ฐ๊ฒฐ์ ๋ชจ๋ ์ฌ์ฉ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.ProxyIP();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Main์ ํ์ฌ ์ค์ ์ ๋ฐํํฉ๋๋ค. Proxy.example.invalid:1080์ ๊ฒฝ์ฐ ์ฃผ์๋ "proxy.example.invalid"์ด๊ณ ํฌํธ๋ 1080, UseProxy == 1์ ๋๋ค. ์ง์ ์ฐ๊ฒฐ์ ๊ฒฝ์ฐ ๊ฐ๊ฐ "", 0, 0์ ๋๋ค. ์์ ๋๋ฉ์ธ์ ์๋ ์ค์ธ ํ๋ก์๊ฐ ์๋ ์คํ ์ ๋๋ค.
return UO.ProxyIP();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฐฐ์ด์๋ ์ ํํ ์ผ์นํ๋ ๋ ๊ฐ์ ํ์ธ๋ ์ฃผ์๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ๋ฃจํ๋ UseProxy == 1์ธ ๊ฒฝ์ฐ์๋ง ๊ตฌ์ฑ๋ ์ด๋ฆ์ ๋น๊ตํ๊ณ , ์ผ์นํ๋ ๊ฒ์ด ์์ผ๋ฉด 1๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด 0๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ฆ์ ์์ ์ ์ด๋ฆ์ผ๋ก ๋ฐ๊พธ์ญ์์ค. ์ด๋ ์๊ฒฉ ํ๋ก์์ ์ ๋ขฐ์ฑ์ด ์๋ ๊ตฌ์ฑ ํ์ธ์ ๋๋ค.
return RunScenario();
object? RunScenario()
{
dynamic[] allowed = new dynamic[checked((int)(1) + 1)];
allowed[0] = "proxy.example.invalid";
allowed[1] = "127.0.0.1";
if (Truth(UO.UseProxy()))
{
var index = 0;
while (Truth(index < ArrayLength(allowed)))
{
if (Truth(UO.ProxyIP() == allowed[index]))
{
return 1;
}
index = index + 1;
}
}
return 0;
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- RequireRoute๋ ์ฃผ์="proxy.example.invalid", ํฌํธ=1080๋ฅผ ์์ ํฉ๋๋ค. UO.Connect๊น์ง ์ธ ๊ฐ์ง ์ค์ ์ ๋ชจ๋ ํ์ธํฉ๋๋ค. ๋ถ์ผ์น๋ ์ฐ๊ฒฐ ์์ด 0๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋งค์น์์ ์ฐ๊ฒฐ์ ์์ฒญํ๊ณ 1๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ ์์ฒญ์ด์ง ๊ฒ์ ์ง์ ํ์ธ์ด ์๋๋๋ค. ๋ ํ๋ฌ๊ทธ๋ฅผ ๋ชจ๋ ๊ต์ฒดํ์ญ์์ค. UO.Connected ๋ฐ๋ก ํ์ธํ์ธ์.
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 RequireRoute("proxy.example.invalid", 1080);
return null;
}
dynamic RequireRoute(dynamic address, dynamic port)
{
if (!(Truth(UO.UseProxy())))
{
return 0;
}
if (Truth(UO.ProxyIP() != address) || Truth(UO.ProxyPort() != port))
{
return 0;
}
UO.Connect();
return 1;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "proxyip": return new InjectionValue((bridge as IProxyMetadataBridge)?.ProxyAddress ?? string.Empty);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.ProxyPort();ํ์ฌ ํ๋กํ์ ํ๋ก์ ํฌํธ๋ฅผ ์ฝ์ด ์ฃผ์/ํฌํธ ์์ ํ์ธํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int: 1..65535์ ๊ตฌ์ฑ๋ ํ๋ก์ ํฌํธ; 0 ์ง์ ์ฐ๊ฒฐ์ฉ. ์ด๊ฒ์ ๊ฒ์ ์๋ฒ ํฌํธ๊ฐ ์๋๋๋ค.
- ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค. ์ฐ๊ฒฐ ์์ด๋ ์ด ์ธ์ ์์ ์์ ์ค์ ์ ์ฝ์ต๋๋ค. ํ๋ก์๋ฅผ ํ์ฑํ ๋๋ ๋นํ์ฑํํ์ง ์์ผ๋ฉฐ, ํ๋ก์์ ์ก์ธ์คํ์ง ์์ผ๋ฉฐ, ๋ค์ ์ฐ๊ฒฐํ๊ฑฐ๋ ๋น๋ฐ๋ฒํธ๋ฅผ ๊ณต๊ฐํ์ง ์์ต๋๋ค. ๊ด๋ฆฌ๋๋ ํ๋ก์๊ฐ ์๋ ์ผ๋ฐ ์ ์ฒด๋ ์ง์ ์ฐ๊ฒฐ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์ฐ๊ฒฐ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ๋ ค๋ฉด ํ๋กํ์ ๋ณ๊ฒฝํ๊ณ ํด๋น ์ธ์ ์ ๋ค์ ์์ํ์ธ์. ํ๋กํ์ ๋ก๊ทธ์ธ๊ณผ ๊ฒ์ ์ฐ๊ฒฐ์ ๋ชจ๋ ์ฌ์ฉ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.ProxyPort();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Main์ ํ์ฌ ์ค์ ์ ๋ฐํํฉ๋๋ค. Proxy.example.invalid:1080์ ๊ฒฝ์ฐ ์ฃผ์๋ "proxy.example.invalid"์ด๊ณ ํฌํธ๋ 1080, UseProxy == 1์ ๋๋ค. ์ง์ ์ฐ๊ฒฐ์ ๊ฒฝ์ฐ ๊ฐ๊ฐ "", 0, 0์ ๋๋ค. ์์ ๋๋ฉ์ธ์ ์๋ ์ค์ธ ํ๋ก์๊ฐ ์๋ ์คํ ์ ๋๋ค.
return UO.ProxyPort();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- RouteLabel๋ ๊ตฌ์ฑ๋ ๊ฒฝ๋ก์ ์๋ช (์ฃผ์:ํฌํธ ๋๋ ์ง์ ์ฐ๊ฒฐ์ ์ํ "์ง์ ")์ ๊ตฌ์ถํฉ๋๋ค. ๋ก๊ทธ์ธ ๋ฐ ๋น๋ฐ๋ฒํธ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
return RouteLabel();
return null;
}
dynamic RouteLabel()
{
if (Truth(UO.UseProxy()))
{
return UO.ProxyIP() + ":" + Convert.ToString(UO.ProxyPort());
}
return "direct";
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- RequireRoute๋ ์ฃผ์="proxy.example.invalid", ํฌํธ=1080๋ฅผ ์์ ํฉ๋๋ค. UO.Connect๊น์ง ์ธ ๊ฐ์ง ์ค์ ์ ๋ชจ๋ ํ์ธํฉ๋๋ค. ๋ถ์ผ์น๋ ์ฐ๊ฒฐ ์์ด 0๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋งค์น์์ ์ฐ๊ฒฐ์ ์์ฒญํ๊ณ 1๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ ์์ฒญ์ด์ง ๊ฒ์ ์ง์ ํ์ธ์ด ์๋๋๋ค. ๋ ํ๋ฌ๊ทธ๋ฅผ ๋ชจ๋ ๊ต์ฒดํ์ญ์์ค. UO.Connected ๋ฐ๋ก ํ์ธํ์ธ์.
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 RequireRoute("proxy.example.invalid", 1080);
return null;
}
dynamic RequireRoute(dynamic address, dynamic port)
{
if (!(Truth(UO.UseProxy())))
{
return 0;
}
if (Truth(UO.ProxyIP() != address) || Truth(UO.ProxyPort() != port))
{
return 0;
}
UO.Connect();
return 1;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "proxyport": return new InjectionValue((bridge as IProxyMetadataBridge)?.ProxyPort ?? 0);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.UseProxy();์ด ์ธ์ ์ด ํ๋ก์๋ฅผ ํตํด ์ฐ๊ฒฐ๋๋๋ก ๊ตฌ์ฑ๋์๋์ง ํ์ธํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
ํ๋ก์๊ฐ ๊ตฌ์ฑ๋ ๊ฒฝ์ฐ int 1 (true), ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ 0 (false). C#์์ (๊ฒฐ๊ณผ != 0) ๋๋ if (๊ฒฐ๊ณผ == 1)๋ฅผ ํ์ธํ์ธ์. ๊ฒฐ๊ณผ๋ int ์ ํ์ด๋ฏ๋ก if (๊ฒฐ๊ณผ) ๋ฐ true์์ ๋น๊ต๋ ํ์ฉ๋์ง ์์ต๋๋ค. ์ฅ์น๋ ํ๋ก์ ๊ฐ์ฉ์ฑ์ด๋ ์ฑ๊ณต์ ์ธ ์น์ธ์ ํ์ธํ์ง ์์ต๋๋ค.
- ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค. ์ฐ๊ฒฐ ์์ด๋ ์ด ์ธ์ ์์ ์์ ์ค์ ์ ์ฝ์ต๋๋ค. ํ๋ก์๋ฅผ ํ์ฑํ ๋๋ ๋นํ์ฑํํ์ง ์์ผ๋ฉฐ, ํ๋ก์์ ์ก์ธ์คํ์ง ์์ผ๋ฉฐ, ๋ค์ ์ฐ๊ฒฐํ๊ฑฐ๋ ๋น๋ฐ๋ฒํธ๋ฅผ ๊ณต๊ฐํ์ง ์์ต๋๋ค. ๊ด๋ฆฌ๋๋ ํ๋ก์๊ฐ ์๋ ์ผ๋ฐ ์ ์ฒด๋ ์ง์ ์ฐ๊ฒฐ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์ฐ๊ฒฐ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ๋ ค๋ฉด ํ๋กํ์ ๋ณ๊ฒฝํ๊ณ ํด๋น ์ธ์ ์ ๋ค์ ์์ํ์ธ์. ํ๋กํ์ ๋ก๊ทธ์ธ๊ณผ ๊ฒ์ ์ฐ๊ฒฐ์ ๋ชจ๋ ์ฌ์ฉ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.UseProxy();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Main์ ํ์ฌ ์ค์ ์ ๋ฐํํฉ๋๋ค. Proxy.example.invalid:1080์ ๊ฒฝ์ฐ ์ฃผ์๋ "proxy.example.invalid"์ด๊ณ ํฌํธ๋ 1080, UseProxy == 1์ ๋๋ค. ์ง์ ์ฐ๊ฒฐ์ ๊ฒฝ์ฐ ๊ฐ๊ฐ "", 0, 0์ ๋๋ค. ์์ ๋๋ฉ์ธ์ ์๋ ์ค์ธ ํ๋ก์๊ฐ ์๋ ์คํ ์ ๋๋ค.
return UO.UseProxy();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- RouteLabel๋ ๊ตฌ์ฑ๋ ๊ฒฝ๋ก์ ์๋ช (์ฃผ์:ํฌํธ ๋๋ ์ง์ ์ฐ๊ฒฐ์ ์ํ "์ง์ ")์ ๊ตฌ์ถํฉ๋๋ค. ๋ก๊ทธ์ธ ๋ฐ ๋น๋ฐ๋ฒํธ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
return RouteLabel();
return null;
}
dynamic RouteLabel()
{
if (Truth(UO.UseProxy()))
{
return UO.ProxyIP() + ":" + Convert.ToString(UO.ProxyPort());
}
return "direct";
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- RequireRoute๋ ์ฃผ์="proxy.example.invalid", ํฌํธ=1080๋ฅผ ์์ ํฉ๋๋ค. UO.Connect๊น์ง ์ธ ๊ฐ์ง ์ค์ ์ ๋ชจ๋ ํ์ธํฉ๋๋ค. ๋ถ์ผ์น๋ ์ฐ๊ฒฐ ์์ด 0๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋งค์น์์ ์ฐ๊ฒฐ์ ์์ฒญํ๊ณ 1๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ ์์ฒญ์ด์ง ๊ฒ์ ์ง์ ํ์ธ์ด ์๋๋๋ค. ๋ ํ๋ฌ๊ทธ๋ฅผ ๋ชจ๋ ๊ต์ฒดํ์ญ์์ค. UO.Connected ๋ฐ๋ก ํ์ธํ์ธ์.
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 RequireRoute("proxy.example.invalid", 1080);
return null;
}
dynamic RequireRoute(dynamic address, dynamic port)
{
if (!(Truth(UO.UseProxy())))
{
return 0;
}
if (Truth(UO.ProxyIP() != address) || Truth(UO.ProxyPort() != port))
{
return 0;
}
UO.Connect();
return 1;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "useproxy": return new InjectionValue((bridge as IProxyMetadataBridge)?.UsesProxy == true ? 1 : 0);