KO UO Topic world geometry Part 2 - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
ํ ยท C# ยท IDE ยท UO API ยท AโZ ยท ์ ยท ์ธ์ด
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetZ();
int UO.GetZ(object? id);๋ก๋๋ ๊ฐ์ฒด ๋๋ ํ์ฌ ๋ฌธ์์ Z ํ๋๋ฅผ ์ฝ์ต๋๋ค.
-
id๋ graphic/type๊ฐ ์๋๋ผ ๊ฐ์ฒด์ Serial/ID์ ๋๋ค. ์ซ์, 16์ง์ ๋ฌธ์์ด, ํ์ค ์ด๋ฆ self/backpack/lasttarget/lastobject/lastcontainer/laststatus/finditem/lastcorpse ๋๋ ์ด๋ฆ AddObject. ๋ณ์นญ์ ์ค์ ํด์ผ ํฉ๋๋ค. ์กด์ฌ ์ฌ๋ถ๋ Exists๋ก ํ์ธํฉ๋๋ค. ์ธ์๊ฐ ์๋ ๋ฑ๋ก ์์์ self์ ์ฌ์ฉํฉ๋๋ค.
int โ Z์ ๋์ด. ์ ์ ์๋ ๊ฐ์ฒด์ ๊ฒฝ์ฐ 0๊ฐ ๋ฐํ๋ฉ๋๋ค. 0๋ ์ ํจํ ์ขํ์ ๋๋ค. ๋์ด๋ ์์์ผ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ฅ๋น ๋ ์ด์ด๋ ์ ์ ์ธ๋ฑ์ค๊ฐ ์๋๋๋ค.
- ํด๋ผ์ด์ธํธ์ ์ด๋ฏธ ์๋ ค์ง ์ต์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์ ๋ฐ์ดํธ ์์ฒญ์ด ์๋ฒ๋ก ์ ์ก๋์ง ์์ต๋๋ค.
- ์ ์ ์๋ ๊ฐ์ฒด์ ์์ง ๊ฒ์๋์ง ์์ ์์ฑ์ null/๋น ๊ฐ์ ๊ฐ์ง ์ ์์ต๋๋ค. Exists์ ํน์ ๋์์ ์กฐ๊ฑด์ ํ์ธํ์ธ์.
- ์ง์์ ์๋ ์บ๋ฆญํฐ๋ ๋ฌผ์ฒด์ ๊ฒฝ์ฐ ์ด๋ ์ธ๊ณ ์ขํ์ ๋๋ค. ์ปจํ ์ด๋ ๋ด๋ถ์ ํญ๋ชฉ์ ๊ฒํ ๋ด๋ถ์ X/Y ์์น๋ฅผ ๊ฐ์ง๋๋ค. ๋ช ๋ น์ ์ด๋ฅผ ์์ ์์ ์ธ๊ณ ์ขํ๋ก ๋ณํํ์ง ์์ต๋๋ค.
- ๋ฌผ์ฒด์ ํ์ฌ ์ขํ๋ฅผ ์ฝ์ด์ต๋๋ค. ๋ณด๋ฅ ์ค์ธ ๋จ๊ณ๋ ์ด ๋ช ๋ น์ ์ํด ๊ฒฝ๋ก ๊ณ์ฐ์ผ๋ก ๋ณํ๋์ง ์์ต๋๋ค.
int z = UO.GetZ();
UO.Print($"Z = {z}");๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetZ();
UO.Print("GetZ: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํ์์ ํ์ฌ ๋ฌธ์์ธ self๋ฅผ ์ ํํฉ๋๋ค.
- ์์น์๋ serial์ด ์๋ Z ๋์ด๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
var position = UO.GetZ();
UO.Print("Z: " + Convert.ToString(position));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- lasttarget๋ ์ง๋ฉด์ ๋ก๋๋ ์บ๋ฆญํฐ๋ ์์ดํ ์ ๋ํ๋ด์ผ ํฉ๋๋ค.
- ๋ธํ - ํ ์ถ์ ๋ฐ๋ฅธ ์ฐจ์ด์ ๋๋ค. ๊ฒฝ๋ก์ ๊ธธ์ด๊ฐ ์๋๋๋ค. ๊ฐ์ ์์์ผ ์ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var other = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(other)))
{
var delta = UO.GetZ(other) - UO.GetZ();
UO.Print("Difference: " + Convert.ToString(delta));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- id="self"๋ ๋ฌธ์ ์ ํ์ ๋ช ์์ ์ธ ํ์์ ๋๋ค. UO.Wait=500 ๋ฐ๋ฆฌ์ด.
- ๋น๊ต์๋ Z์ถ์ ๋ณํ๋ง ํ์๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ค๋ฅธ ์ถ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ํ์ ํ๋ ๊ฒ์ ๊ณ ๋ คํ์ง ์์ต๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var before = UO.GetZ("self");
await Delay(500);
var after = UO.GetZ("self");
if (Truth(before != after))
{
UO.Print("Coordinate changed");
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetZ. -
InjectionScript.Runtime.InjectionApiUO.GetZ:GetZ("self").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetZ() => GetZ("self");๋งค๊ฐ๋ณ์: id (Any/Integer/String)
๊ฒฐ๊ณผ: int / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetZ:bridge.GetZ(Arg(0, bridge.Self)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0, bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getz": return new InjectionValue(bridge.GetZ(Arg(0, bridge.Self)));๋งค๊ฐ๋ณ์: id (Any/Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetZ. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetZ:bridge.GetZ(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetZ(int id) => bridge.GetZ(id);๋งค๊ฐ๋ณ์: id (Any/Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetZ. -
InjectionScript.Runtime.InjectionApiUO.GetZ:GetZ(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetZ(string id) => GetZ(GetObject(id));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.IsMineTile(object? x, object? y);๋ก์ปฌ ์ง๋ ๋ฐ์ดํฐ์ ๋น๊ตํ์ฌ ์ ์ ํน์ฑ์ ํ์ธํฉ๋๋ค.
-
xโ ํ์ฌ ์นด๋์ int X ์ ; ํ๋ฉด ํฝ์ ์ด ์๋ ์ธ๊ณ ์ขํ. -
yโ ํ์ฌ ์นด๋์ int Y ์ ; ํ๋ฉด ํฝ์ ์ด ์๋ ์ธ๊ณ ์ขํ.
์ซ์ ํ๋๊ทธ int: 1 โ ์กฐ๊ฑด๊ณผ ์ผ์นํ๋ ๊ฐ์ฒด๊ฐ ๋ฐ๊ฒฌ๋์์ต๋๋ค. 0 - ๊ทธ๋ฌํ ๋ฌผ์ฒด๊ฐ ์๊ฑฐ๋ ์ /์นด๋์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- AnyTileAt๋ ๋ก๋๋ ์ ์ TNext ์ฒด์ธ์ ์ฐํํฉ๋๋ค. ์กฐ๊ฑด IsMineTile: StaticFilters.IsRock ๋๋ ๋๊ตด, ์ฐ ๋๋ ๋ฐ์๊ฐ ํฌํจ๋ ์ด๋ฆ์ ์ ์ /๋ค์ค, ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค.
- ๊ฒ์ฌ์์๋ ๋ก์ปฌ ํ์ผ ๋ฐ์ดํฐ/ํํฐ๋ฅผ ์ค๋ช ํฉ๋๋ค. ์ฑ๊ตด๋ ์์์ ๊ฐ์ฉ์ฑ, ๊ตญ๊ฐ ๊ฐ ๋ฅ๋ ฅ, ์ฑ๊ตด ๋ฒ์ ๋๋ ์๋ฒ ๊ถํ์ ์ฝ์ํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.IsMineTile(UO.GetX(), UO.GetY());
UO.Print("IsMineTile: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ก์ปฌ ์ง๋ ๋ฐ์ดํฐ์ ๋น๊ตํ์ฌ ์ ์ ํน์ฑ์ ํ์ธํฉ๋๋ค.
UO.Print(UO.IsMineTile(UO.GetX(), UO.GetY()));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- AnyTileAt๋ ๋ก๋๋ ์ ์ TNext ์ฒด์ธ์ ์ฐํํฉ๋๋ค. ์กฐ๊ฑด IsMineTile: StaticFilters.IsRock ๋๋ ๋๊ตด, ์ฐ ๋๋ ๋ฐ์๊ฐ ํฌํจ๋ ์ด๋ฆ์ ์ ์ /๋ค์ค, ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var x = UO.GetX() + 1;
var y = UO.GetY();
if (Truth(UO.IsMineTile(x, y)))
{
UO.Print("Local tile predicate matched");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฒ์ฌ์์๋ ๋ก์ปฌ ํ์ผ ๋ฐ์ดํฐ/ํํฐ๋ฅผ ์ค๋ช ํฉ๋๋ค. ์ฑ๊ตด๋ ์์์ ๊ฐ์ฉ์ฑ, ๊ตญ๊ฐ ๊ฐ ๋ฅ๋ ฅ, ์ฑ๊ตด ๋ฒ์ ๋๋ ์๋ฒ ๊ถํ์ ์ฝ์ํ์ง ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var x = UO.GetX();
var y = UO.GetY();
var before = UO.IsMineTile(x, y);
UO.Wait(500);
UO.Print(before = UO.IsMineTile(x, y));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: x (Any), y (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.IsMineTile. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsMineTile:bridge.IsMineTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int IsMineTile(InjectionValue x, InjectionValue y) => bridge.IsMineTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.IsTreeTile(object? x, object? y);๋ก์ปฌ ์ง๋ ๋ฐ์ดํฐ์ ๋น๊ตํ์ฌ ์ ์ ํน์ฑ์ ํ์ธํฉ๋๋ค.
-
xโ ํ์ฌ ์นด๋์ int X ์ ; ํ๋ฉด ํฝ์ ์ด ์๋ ์ธ๊ณ ์ขํ. -
yโ ํ์ฌ ์นด๋์ int Y ์ ; ํ๋ฉด ํฝ์ ์ด ์๋ ์ธ๊ณ ์ขํ.
์ซ์ ํ๋๊ทธ int: 1 โ ์กฐ๊ฑด๊ณผ ์ผ์นํ๋ ๊ฐ์ฒด๊ฐ ๋ฐ๊ฒฌ๋์์ต๋๋ค. 0 - ๊ทธ๋ฌํ ๋ฌผ์ฒด๊ฐ ์๊ฑฐ๋ ์ /์นด๋์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- AnyTileAt๋ ๋ก๋๋ ์ ์ TNext ์ฒด์ธ์ ์ฐํํฉ๋๋ค. ์กฐ๊ฑด IsTreeTile: StaticFilters.IsTree์ ์ํด ์ธ์๋๋ ์ ์ /๋ค์ค.
- ๊ฒ์ฌ์์๋ ๋ก์ปฌ ํ์ผ ๋ฐ์ดํฐ/ํํฐ๋ฅผ ์ค๋ช ํฉ๋๋ค. ์ฑ๊ตด๋ ์์์ ๊ฐ์ฉ์ฑ, ๊ตญ๊ฐ ๊ฐ ๋ฅ๋ ฅ, ์ฑ๊ตด ๋ฒ์ ๋๋ ์๋ฒ ๊ถํ์ ์ฝ์ํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.IsTreeTile(UO.GetX(), UO.GetY());
UO.Print("IsTreeTile: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ก์ปฌ ์ง๋ ๋ฐ์ดํฐ์ ๋น๊ตํ์ฌ ์ ์ ํน์ฑ์ ํ์ธํฉ๋๋ค.
UO.Print(UO.IsTreeTile(UO.GetX(), UO.GetY()));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- AnyTileAt๋ ๋ก๋๋ ์ ์ TNext ์ฒด์ธ์ ์ฐํํฉ๋๋ค. ์กฐ๊ฑด IsTreeTile: StaticFilters.IsTree์ ์ํด ์ธ์๋๋ ์ ์ /๋ค์ค.
return RunScenario();
object? RunScenario()
{
var x = UO.GetX() + 1;
var y = UO.GetY();
if (Truth(UO.IsTreeTile(x, y)))
{
UO.Print("Local tile predicate matched");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฒ์ฌ์์๋ ๋ก์ปฌ ํ์ผ ๋ฐ์ดํฐ/ํํฐ๋ฅผ ์ค๋ช ํฉ๋๋ค. ์ฑ๊ตด๋ ์์์ ๊ฐ์ฉ์ฑ, ๊ตญ๊ฐ ๊ฐ ๋ฅ๋ ฅ, ์ฑ๊ตด ๋ฒ์ ๋๋ ์๋ฒ ๊ถํ์ ์ฝ์ํ์ง ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var x = UO.GetX();
var y = UO.GetY();
var before = UO.IsTreeTile(x, y);
UO.Wait(500);
UO.Print(before = UO.IsTreeTile(x, y));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: x (Any), y (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.IsTreeTile. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsTreeTile:bridge.IsTreeTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int IsTreeTile(InjectionValue x, InjectionValue y) => bridge.IsTreeTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.IsWaterTile(object? x, object? y);๋ก์ปฌ ์ง๋ ๋ฐ์ดํฐ์ ๋น๊ตํ์ฌ ์ ์ ํน์ฑ์ ํ์ธํฉ๋๋ค.
-
xโ ํ์ฌ ์นด๋์ int X ์ ; ํ๋ฉด ํฝ์ ์ด ์๋ ์ธ๊ณ ์ขํ. -
yโ ํ์ฌ ์นด๋์ int Y ์ ; ํ๋ฉด ํฝ์ ์ด ์๋ ์ธ๊ณ ์ขํ.
์ซ์ ํ๋๊ทธ int: 1 โ ์กฐ๊ฑด๊ณผ ์ผ์นํ๋ ๊ฐ์ฒด๊ฐ ๋ฐ๊ฒฌ๋์์ต๋๋ค. 0 - ๊ทธ๋ฌํ ๋ฌผ์ฒด๊ฐ ์๊ฑฐ๋ ์ /์นด๋์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- AnyTileAt๋ ๋ก๋๋ ์ ์ TNext ์ฒด์ธ์ ์ฐํํฉ๋๋ค. ์กฐ๊ฑด IsWaterTile: TileData.IsWet ๋๋ ์ ํจํ ์ ์ graphic ๋ฐ ํ๋๊ทธ IsWet๊ฐ ์๋ ๋ฌผ์ฒด์ ์ฐฉ๋ฅํฉ๋๋ค.
- ๊ฒ์ฌ์์๋ ๋ก์ปฌ ํ์ผ ๋ฐ์ดํฐ/ํํฐ๋ฅผ ์ค๋ช ํฉ๋๋ค. ์ฑ๊ตด๋ ์์์ ๊ฐ์ฉ์ฑ, ๊ตญ๊ฐ ๊ฐ ๋ฅ๋ ฅ, ์ฑ๊ตด ๋ฒ์ ๋๋ ์๋ฒ ๊ถํ์ ์ฝ์ํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.IsWaterTile(UO.GetX(), UO.GetY());
UO.Print("IsWaterTile: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ก์ปฌ ์ง๋ ๋ฐ์ดํฐ์ ๋น๊ตํ์ฌ ์ ์ ํน์ฑ์ ํ์ธํฉ๋๋ค.
UO.Print(UO.IsWaterTile(UO.GetX(), UO.GetY()));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- AnyTileAt๋ ๋ก๋๋ ์ ์ TNext ์ฒด์ธ์ ์ฐํํฉ๋๋ค. ์กฐ๊ฑด IsWaterTile: TileData.IsWet ๋๋ ์ ํจํ ์ ์ graphic ๋ฐ ํ๋๊ทธ IsWet๊ฐ ์๋ ๋ฌผ์ฒด์ ์ฐฉ๋ฅํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var x = UO.GetX() + 1;
var y = UO.GetY();
if (Truth(UO.IsWaterTile(x, y)))
{
UO.Print("Local tile predicate matched");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฒ์ฌ์์๋ ๋ก์ปฌ ํ์ผ ๋ฐ์ดํฐ/ํํฐ๋ฅผ ์ค๋ช ํฉ๋๋ค. ์ฑ๊ตด๋ ์์์ ๊ฐ์ฉ์ฑ, ๊ตญ๊ฐ ๊ฐ ๋ฅ๋ ฅ, ์ฑ๊ตด ๋ฒ์ ๋๋ ์๋ฒ ๊ถํ์ ์ฝ์ํ์ง ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var x = UO.GetX();
var y = UO.GetY();
var before = UO.IsWaterTile(x, y);
UO.Wait(500);
UO.Print(before = UO.IsWaterTile(x, y));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: x (Any), y (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.IsWaterTile. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsWaterTile:bridge.IsWaterTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int IsWaterTile(InjectionValue x, InjectionValue y) => bridge.IsWaterTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.IsWorldCellPassable(object? currX, object? currY, object? currZ, object? destX, object? destY, object? destZ, object? worldNum);์ธ์ ํ ์๋ ์ ๋ก์ ์ ํ ํ๋๋ฅผ ํ์ธํ๊ณ ๋์ด์ ํจ๊ป ํต๊ณผ ๊ฐ๋ฅํ ํ๋๊ทธ๋ฅผ ๋ฐํํฉ๋๋ค.
-
currXโ ์์ค ์ ์ ํ์ ์ธ๊ณ X ์ขํ์ ๋๋ค. ๋ก๋๋ ์ง๋ ๋ด์ ์ ์ 0..65535; ์ด๊ฒ์ ๊ฒํ ์ขํ๊ฐ ์๋๋๋ค. -
currYโ ์์ค ์ ์ ํ์ ์ธ๊ณ Y ์ขํ์ ๋๋ค. ๋ก๋๋ ์ง๋ ๋ด์ ์ ์ 0..65535; ์ด๊ฒ์ ๊ฒํ ์ขํ๊ฐ ์๋๋๋ค. -
currZโ ํ์ ์ด๊ธฐ ๋์ด โ128..127. ์ด๊ฒ์ ์ธต์๊ฐ ์๋ ์ธ๊ณ์ ๋์ด์ ๋๋ค. ์๋ชป๋ ๋์ด๋ ๊ฑฐ๋ถ๋๊ณ ์๋ฆฌ์ง ์์ต๋๋ค. -
destXโ ๋์ ์ ์ ํ์ ์ธ๊ณ X ์ขํ์ ๋๋ค. ๋ก๋๋ ์ง๋ ๋ด์ ์ ์ 0..65535; ์ด๊ฒ์ ๊ฒํ ์ขํ๊ฐ ์๋๋๋ค. -
destYโ ๋์ ์ ์ ํ์ ์ธ๊ณ Y ์ขํ์ ๋๋ค. ๋ก๋๋ ์ง๋ ๋ด์ ์ ์ 0..65535; ์ด๊ฒ์ ๊ฒํ ์ขํ๊ฐ ์๋๋๋ค. -
destZ- ํ์ ์ ๋ ฅ ์๋น Z, ์ผ๋ฐ์ ์ผ๋ก CurrZ. ์ด๋ var๊ฐ ์๋๋๋ค. ๋ณ์๊ฐ ๋ณ๊ฒฝ๋์ง ์๊ณ ํ์ํ ์ธต์ ์ค์ ํ์ง ์์ต๋๋ค. ๊ฒฐ๊ณผ[1]์์ ๊ณ์ฐ๋ ๋์ด๋ฅผ ์ฝ์ด์ต๋๋ค. ์ด ๋ค๋ฆฌ๋ ํญ์ ๋์ด๋ฅผ ๋ฐํํฉ๋๋ค. Pascal ํ์๊ณผ์ ํธํ์ฑ์ ์ํด์๋ ์ธ์๊ฐ ํ์ํฉ๋๋ค. -
worldNumโ ํ์ ์นด๋ ๋ฒํธ: UO.WorldNum(). ์๋ ค์ง ์น์๊ฐ ์๋ ํ์ฌ ์ง๋๋ง ํ์ธ๋ฉ๋๋ค. ๋ค๋ฅธ ์ง๋๋ ๋ก๋๋์ง ์์ต๋๋ค.
2๊ฐ์ ๋ฐฐ์ด int: [0] - ํต๊ณผ ๊ฐ๋ฅ์ฑ, 1(์กฐ๊ฑด ์ถฉ์กฑ), 0(์กฐ๊ฑด ์ถฉ์กฑ ์ ๋จ); [1] - Z์ ๊ณ์ฐํ์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์์๋ง ๋ ผ๋ฆฌ์ ์ ๋๋ค. ๋ฐฐ์ด ์์ฒด๋ true์ ๋น๊ตํ ์ ์์ต๋๋ค. ๋์ด 0/์์๋ ํ์ฉ๋ฉ๋๋ค. [0]=0์ ๊ฒฝ์ฐ ๋์ด๋ ๋๋ฌ ๊ฐ๋ฅ์ฑ์ ์ฆ๋ช ํ์ง ์์ต๋๋ค. ์ธ์๋ฅผ ๊ฑฐ๋ถํ๋ฉด [0, CurrZ]๊ฐ ๋ฐํ๋ฉ๋๋ค.
- ์์ง์, ๋ฌธ ์ด๋ฆผ, ์ญ์์ ๋๋ ๋คํธ์ํฌ ํจํท์ด ์์ต๋๋ค. ๊ธฐ์กด ๋ก์ปฌ ์ง์ค๋ฉํธ๋ฆฌ๋ฅผ ์ฝ์ต๋๋ค. ์๋ฒ๋ ๋์ค์ ๋จ๊ณ๋ฅผ ๊ฑฐ๋ถํ ์ ์์ต๋๋ค. ๋ ์์ฒญ์ด ์๋ก ๋ค๋ฅธ ์ํ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
- ์ธ์ ํ ์ ์ด ํ์ฉ๋ฉ๋๋ค(X/Y ์ฐจ์ด๋ 1 ์ดํ). ๋ ๋จผ ๋์, ์ง๋ ๋๋จธ, ์บ๋ฆญํฐ/์นด๋ ๋ถ์ฌ ๋ฐ IsDestroyed ๊ณ์ฐ ์ ๊ฑฐ๋ถ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ ์ฒด ๊ฒฝ๋ก๋ฅผ ํ์ธํ๋ ค๋ฉด GetPathArray ๋๋ NewMoveXY๋ฅผ ์ฌ์ฉํ์ธ์.
- ๋์ผ ์ ํจ X/Y๋ ์ถฉ๋ ๊ฒ์ฌ ์์ด [1, CurrZ]๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋จ๊ณ๊ฐ ํ์ํ์ง ์์ต๋๋ค. ์ด๊ฒ์ ์์ฅ์์ ํ์ถํ๋ ๋ฅ๋ ฅ์ ํ ์คํธํ๋ ๊ฒ์ด ์๋๋๋ค. ์บ๋ฆญํฐ์ ์ํ์ ํ์ฌ ํจ์คํ์ธ๋ ๊ท์น์ ์ธ์ ํ ๋จ๊ณ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ๋ก๋๋ ํ์์ด ์์ผ๋ฉด ๊ฑฐ๋ถ๋ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.IsWorldCellPassable(UO.GetX(), UO.GetY(), UO.GetZ(), UO.GetX() + 1, UO.GetY(), UO.GetZ(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- x/y/z๋ ์์ ์์น, x+1/y๋ ์ธ์ ์ , ์ฌ์ฏ ๋ฒ์งธ ๋งค๊ฐ๋ณ์ z๋ ์๋น Z, ๋ง์ง๋ง ๋งค๊ฐ๋ณ์๋ ํ์ฌ ์นด๋์ ๋๋ค. ๊ฒฐ๊ณผ[1]๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๊ฒฐ๊ณผ[0]๋ฅผ ํ์ธํฉ๋๋ค.
var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
var result = UO.IsWorldCellPassable(x,y,z,x+1,y,z,UO.WorldNum());
if (Truth(Truth(result[0]) == true))
{
UO.Print("Passable, Z=" + Convert.ToString(result[1]));
}
else
{
UO.Print("Blocked");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํธ์ถ ํ์๋ proposedZ๋ 0๋ก ์ ์ง๋ฉ๋๋ค. targetZ์ ์ธ์๊ฐ ์๋ ๊ฒฐ๊ณผ[1]์์ ๊ฐ์ ธ์ต๋๋ค. ์คํจ ์ ์์ ์์๋ ๋์ด์ ๋ํด ์ถ๋ก ํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
var proposedZ = 0;
var result = UO.IsWorldCellPassable(x, y, z, x, y + 1, proposedZ, UO.WorldNum());
if (Truth(result[0] == 1))
{
var targetZ = result[1];
UO.Print("Input=" + Convert.ToString(proposedZ) + "; result=" + Convert.ToString(targetZ));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Main ์๋์ ์ ์ฒด ๋์ฐ๋ฏธ๋ ์์ค X/Y/Z, ๋์ X/Y ๋ฐ ๋งต์ ํ์ฉํฉ๋๋ค. ํ์ํ ์ฌ์ฏ ๋ฒ์งธ ์ธ์๋ฅผ ์ถ๊ฐํ๊ณ ๋ฐฐ์ด์ด ์๋ int 1/0๋ง ๋ฐํํฉ๋๋ค. ๋ฐ๋ผ์ IsCellOpen์ ๊ฒฐ๊ณผ๋ true์ ๋น๊ตํ ์ ์์ต๋๋ค. ์ฝ๋๋ ๋ฌธ์๋ฅผ ์ด๋ํ์ง ์์ต๋๋ค.
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 x = UO.GetX();
var y = UO.GetY();
var openCell = IsCellOpen(x, y, UO.GetZ(), x + 1, y + 1, UO.WorldNum());
if (Truth(Truth(openCell) == true))
{
UO.Print("Diagonal cell is locally passable");
}
return null;
}
dynamic IsCellOpen(dynamic x, dynamic y, dynamic z, dynamic toX, dynamic toY, dynamic map)
{
var cellResult = UO.IsWorldCellPassable(x, y, z, toX, toY, z, map);
if (Truth(ArrayLength(cellResult) != 2))
{
return 0;
}
return cellResult[0];
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
UO.IsWorldCellPassable(currX, currY, currZ, destX, destY, destZ, worldNum) โ UO.IsWorldCellPassable(Any,Any,Any,Any,Any,Any,Any)
๋งค๊ฐ๋ณ์: currX (Any), currY (Any), currZ (Any), destX (Any), destY (Any), destZ (Any), worldNum (Any)
๊ฒฐ๊ณผ: dynamic / Array.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(5). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CheckWorldStep:bridge.CheckWorldStep(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), Arg(6)).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "isworldcellpassable":
{
int destinationZFallback = Arg(5);
int[] step = bridge.CheckWorldStep(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), Arg(6));
int passable = step.Length > 0 ? step[0] : 0;
int destinationZ = step.Length > 1 ? step[1] : destinationZFallback;
return new InjectionValue(new[] { new InjectionValue(passable), new InjectionValue(destinationZ) });
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.LOSOptions();
dynamic UO.LOSOptions(object? value);๋ก์ปฌ ๋งค๊ฐ๋ณ์ ๋ง์คํฌ LOS ๋ฐํ์์ ์ฝ๊ฑฐ๋ ์ ์ฅํฉ๋๋ค.
-
value- ์ ํ์ฌํญ int; ์ธ์ ์์ ์ฝ๊ธฐ ์ ์ฉ. ์ด ์ค๋ ๋์์๋ ๋ฒ์์ ๊ฐ๋ณ ๋นํธ๊ฐ ํ์ธ๋์ง ์์ต๋๋ค. ๋ณด์กฐ byte(๊ฐ & 0xFF)์ ์๊ณ ๋ฆฌ์ฆ 1..4์ ์ ํํฉ๋๋ค. CheckLosCell์ ๋ถ byte์ ๋ค๋ฅธ ๊ฐ์ 3 ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํฉ๋๋ค. ์๊ณ ๋ฆฌ์ฆ 1/2๋ ๋ฒฝ ๋ฐ ํตํ ๋ถ๊ฐ๋ฅ์ ์ฐจ๋จํ๊ณ , 3๋ NoShoot๋ฅผ ์ถ๊ฐ๋ก ์ฐจ๋จํ๊ณ , 4๋ 0x200๋ก๋ง NoShoot๋ฅผ ํ์ฑํํ๊ณ 0x400๋ก๋ง ์ฐฝ ์ฅ์ ๋ฌผ์ ํ์ฉํฉ๋๋ค. ๋นํธ 0x100๋ ์ ํํ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ๊ฐ ๋๊ฐ์ ๋น ๋จ๊ณ์ ์์ชฝ ์ธก๋ฉด ์ ์ ์ถ๊ฐ๋ก ํ์ธํฉ๋๋ค. value=0๋ ์ถ๊ฐ CheckLosCell/๋๊ฐ์ ๊ฒ์ฌ๋ฅผ ๋นํ์ฑํํ์ง๋ง BadLocations ๋ฐ CheckWorldStep๋ ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด 4+0x100+0x200+0x400๋ ์ธ ๊ฐ์ ํ๋๊ทธ๋ก ์ฌ์ฉ์ ์ ์๋ฅผ ์ ํํฉ๋๋ค. setter๋ ์ ๊ทํ๋ ์๊ณ ๋ฆฌ์ฆ์ด ์๋ ์๋ณธ int์ ์ ์งํฉ๋๋ค.
int - ์ํ.LosOptions ๋ นํ ๊ฐ๋ฅ ํ. ์ด๋ bool๊ฐ ์๋ ๋งค๊ฐ๋ณ์ ์ฝ๋/๋ง์คํฌ์ด๋ฉฐ ๊ฐ์์ฑ ๊ฒ์ฌ ๊ฒฐ๊ณผ๋ ์๋๋๋ค.
- ExecuteClientApiCompatibility๋ ์ํ๋ฅผ ํ ๋นํฉ๋๋ค. LosOptions ์ธ์๊ฐ ์ฃผ์ด์ง๋ฉด ๋์ผํ ํ๋๋ฅผ ๋ฐํํฉ๋๋ค. ํธ์ถ์ CheckLOS๋ฅผ ์คํํ์ง ์์ผ๋ฉฐ ๋ฒฝ์ ํ์ธํ์ง ์์ต๋๋ค.
- ์ค์ ์ ๋ฐํ์์ ์ํฉ๋๋ค. ์๋ฒ ๊ฐ์์ฑ์ ๋ณด์ฅํ์ง ์์ผ๋ฉฐ ์ฅ์ ๋ฌผ์ ํต๊ณผํ๋ ๋ฐฉ๋ฒ๋ ์๋๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
- ์ฌ์ํ byte(๊ฐ & 0xFF)์ ์๊ณ ๋ฆฌ์ฆ 1..4์ ์ ํํฉ๋๋ค. CheckLosCell์ ๋ถ byte์ ๋ค๋ฅธ ๊ฐ์ 3 ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํฉ๋๋ค. ์๊ณ ๋ฆฌ์ฆ 1/2๋ ๋ฒฝ ๋ฐ ํตํ ๋ถ๊ฐ๋ฅ์ ์ฐจ๋จํ๊ณ , 3๋ ์ถ๊ฐ๋ก NoShoot, 4๋ 0x200์์๋ง NoShoot๋ฅผ ํ์ฑํํ๊ณ 0x400์์๋ง ์ฐฝ ์ฅ์ ๋ฌผ์ ํ์ฉํฉ๋๋ค. ๋นํธ 0x100๋ ์ ํํ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ๊ฐ ๋๊ฐ์ ๋น ๋จ๊ณ์ ์์ชฝ ์ธก๋ฉด ์ ์ ์ถ๊ฐ๋ก ํ์ธํฉ๋๋ค. value=0๋ ์ถ๊ฐ CheckLosCell/๋๊ฐ์ ๊ฒ์ฌ๋ฅผ ๋นํ์ฑํํ์ง๋ง BadLocations ๋ฐ CheckWorldStep๋ ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด 4+0x100+0x200+0x400๋ ์ธ ๊ฐ์ ํ๋๊ทธ๋ก ์ฌ์ฉ์ ์ ์๋ฅผ ์ ํํฉ๋๋ค. setter๋ ์ ๊ทํ๋ ์๊ณ ๋ฆฌ์ฆ์ด ์๋ ์๋ณธ int์ ์ ์งํฉ๋๋ค.
- 0์ด ์๋ ๊ธธ์ด์ ๋น์ ํ์ฌ ๋ก๋๋ _world.Map/World.Map๋ง ์ฝ์ต๋๋ค. CheckWorldStep๋ฅผ ํตํด WorldNum == _world.MapIndex ๋ฐ ๋ผ์ด๋ธ Player.Pathfinder๊ฐ ํ์ํฉ๋๋ค. ๋ค๋ฅธ ํจ์ฏ์ ๋ก๋๋๊ฑฐ๋ ์์ฒญ๋์ง ์์ต๋๋ค. ์ง๋/์บ๋ฆญํฐ/ํจ์คํ์ธ๋๊ฐ ์๊ฑฐ๋ ํด๋น ๋จ๊ณ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. - 0. ๋์ผํ X/Y๋ฅผ ์ ์ธํ๋ฉด ์ ์ฒด ์ธํฌ ์ฃผ๊ธฐ๋ฅผ ๊ฑด๋๋๋๋ค. 0..65535์ X/Y, 0..255์ WorldNum ๋ฐ abs(Zfrom-Zto)<=20๋ ๋ก๋๋ ์นด๋๊ฐ ์๊ฑฐ๋ ๋ค๋ฅธ ์นด๋ ๋ฒํธ๋ฅผ ์ฌ์ฉํด๋ 1๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ ๊ธฐํํ์ด๋ ๋๋ฌ ๊ฐ๋ฅ์ฑ์ ๋ํ ์ฆ๊ฑฐ๊ฐ ์๋๋๋ค. ๊ฒฐ๊ณผ๋ LOS ์๋ฒ ์๋ฃจ์ ์ด ์๋ ๋ก์ปฌ์ ๋๋ค.
- CheckLosCell๋ ํ ์ ์ ๋ก๋๋ Land/Static/Multi/Item์ ์ฐํํฉ๋๋ค. ABS(rayZ-land.Z)<=20์ ์๋ ํต๊ณผํ ์ ์๋ ํ ์ง ๋ธ๋ก. ์ ์ /๋ค์ค/ํญ๋ชฉ ํ๋๊ทธ๋ ๋ฒ์ ํ์ผ์์๋ง ์ ํจํฉ๋๋ค.Z-2 .. ํ์ผ.Z+max(1,Height)+2; ํ์ฉ๋๋ ์ฌ์ฉ์ ์ ์ ์ฐฝ์ Wall/Impassable/NoShoot๊ฐ ์ ํ๋ ๋๊น์ง ๊ฑด๋๋๋๋ค. ๋น X/Y๋ Bresenham์ ์ฌ์ฉํ๋ฉฐ ์ต๋ 4096 ๋จ๊ณ์ ๋๋ค. Z๋ ํ๋ฉด CheckWorldStep์์ ๊ฐ์ ธ์ค๋ฉฐ Zto์ ๋ณด๊ฐ๋์ง ์๊ณ ์ต์ข ๋์ด ๊ณต์ฐจ๋ 20์ ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.LOSOptions();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ก์ปฌ ๋งค๊ฐ๋ณ์ ๋ง์คํฌ LOS ๋ฐํ์์ ์ฝ๊ฑฐ๋ ์ ์ฅํฉ๋๋ค.
UO.Print(UO.LOSOptions());๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ExecuteClientApiCompatibility๋ ์ํ๋ฅผ ํ ๋นํฉ๋๋ค. LosOptions ์ธ์๊ฐ ์ฃผ์ด์ง๋ฉด ๋์ผํ ํ๋๋ฅผ ๋ฐํํฉ๋๋ค. ํธ์ถ์ CheckLOS๋ฅผ ์คํํ์ง ์์ผ๋ฉฐ ๋ฒฝ์ ํ์ธํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var before = UO.LOSOptions();
UO.Print(UO.LOSOptions(0));
UO.LOSOptions(before);
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 original = UO.LOSOptions();
UO.LOSOptions(original);
UO.Print(Convert.ToString(UO.LOSOptions() == original));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "losoptions": if (arguments.Length > 0) state.LosOptions = Arg(0); return new InjectionValue(state.LosOptions);๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "losoptions": if (arguments.Length > 0) state.LosOptions = Arg(0); return new InjectionValue(state.LosOptions);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
string UO.PrivateGetTile(object? x, object? y, object? unknown, object? minTile, object? maxTile);๋ก์ปฌ ์ ์์ ์ฃผ์ด์ง ๋ฒ์์ ์ฒซ ๋ฒ์งธ graphic๋ฅผ ๊ฒ์ํฉ๋๋ค.
-
xโ int ํ์ฌ ์ง๋์ ์ธ๊ณ ์ขํ์ ๋๋ค. -
yโ int ํ์ฌ ์ง๋์ ์ธ๊ณ ์ขํ์ ๋๋ค. -
unknownโ ๋ ๊ฑฐ์ ๋งค๊ฐ๋ณ์ int๋ ๊ตฌ๋ฌธ์ ๋ณด์กด๋์ง๋ง ๋ธ๋ฆฌ์ง์์๋ ์ด๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. -
minTile- int ํฌํจ ๊ฒฝ๊ณ graphic. ์์๋ ์๋์ผ๋ก ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. minTile>maxTile๊ฐ ์ผ์นํ์ง ์์ต๋๋ค. -
maxTile- int ํฌํจ ๊ฒฝ๊ณ graphic. ์์๋ ์๋์ผ๋ก ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. minTile>maxTile๊ฐ ์ผ์นํ์ง ์์ต๋๋ค.
string ์ฒซ ๋ฒ์งธ ์ผ์น graphic์ "0xXXXX"; "0x0000" - ์ผ์น ํญ๋ชฉ์ด ์๊ฑฐ๋ ์ง๋๊ฐ ๋ก๋๋์ง ์์์ต๋๋ค. ์ค์ graphic=0์๋ ์ด ํํ์ด ์์ต๋๋ค.
- PrivateGetTile๋ ๋งต ์์์ ๋ฐ๋ผ ๋ชจ๋ ์ ๊ฐ์ฒด์ TNext ์ฒด์ธ์ ์ํํ๊ณ graphic>=minTile && graphic<=maxTile๋ฅผ ๋น๊ตํฉ๋๋ค. ์ ์ ๋ง ํํฐ๋งํ์ง ์๊ณ hue/๋์ด๋ฅผ ๊ณ ๋ คํ์ง ์์ต๋๋ค.
- ํจ์คํ์ธ๋/์๋ฒ ์์ฒญ์ด ์์ต๋๋ค. ์ ํํ ๊ตฌ์กฐํ๋ ๊ธฐํํ์ ์ํด์๋ GetWorldCell/ReadStaticsXY๋ฅผ ์ฌ์ฉํ์ธ์. ๋๋ฝ๋ ์นด๋์ ๊ฐ๋๋ ์ด์ ์ ์ผ์นํ์ง ์๋ ํ์๊พผ์ ๋ฐํํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.PrivateGetTile(UO.GetX(), UO.GetY(), 0, 0, 65535);
UO.Print("PrivateGetTile: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ก์ปฌ ์ ์์ ์ฃผ์ด์ง ๋ฒ์์ ์ฒซ ๋ฒ์งธ graphic๋ฅผ ๊ฒ์ํฉ๋๋ค.
UO.Print(UO.PrivateGetTile(UO.GetX(), UO.GetY(), 0, 0, 65535));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- PrivateGetTile๋ ๋งต ์์์ ๋ฐ๋ผ ๋ชจ๋ ์ ๊ฐ์ฒด์ TNext ์ฒด์ธ์ ์ํํ๊ณ graphic>=minTile && graphic<=maxTile๋ฅผ ๋น๊ตํฉ๋๋ค. ์ ์ ๋ง ํํฐ๋งํ์ง ์๊ณ hue/๋์ด๋ฅผ ๊ณ ๋ คํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.PrivateGetTile(UO.GetX(), UO.GetY(), 0, 0x0E21, 0x0E21));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํจ์คํ์ธ๋/์๋ฒ ์์ฒญ์ด ์์ต๋๋ค. ์ ํํ ๊ตฌ์กฐํ๋ ๊ธฐํํ์ ์ํด์๋ GetWorldCell/ReadStaticsXY๋ฅผ ์ฌ์ฉํ์ธ์. ๋๋ฝ๋ ์นด๋์ ๊ฐ๋๋ ์ด์ ์ ์ผ์นํ์ง ์๋ ํ์๊พผ์ ๋ฐํํฉ๋๋ค.
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 tile = UO.PrivateGetTile(UO.GetX(), UO.GetY(), 0, 0, 65535);
if (Truth(tile != "0x0000"))
{
UO.Print(tile);
}
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์ ์ฌ์ฉํ์ธ์.
UO.PrivateGetTile(x, y, unknown, minTile, maxTile) โ UO.PrivateGetTile(Integer,Integer,Integer,Integer,Integer)
๋งค๊ฐ๋ณ์: x (Integer), y (Integer), unknown (Integer), minTile (Integer), maxTile (Integer)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.PrivateGetTile. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.PrivateGetTile:bridge.PrivateGetTile(x, y, unknown, minTile, maxTile).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string PrivateGetTile(int x, int y, int unknown, int minTile, int maxTile)
=> bridge.PrivateGetTile(x, y, unknown, minTile, maxTile);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.ReadStaticsXY(object? x, object? y, object? worldNum);์ ์ ์๋ ํ์ฌ ์นด๋์ ํ๋ซ ์ ์ ๋ ์ฝ๋๋ฅผ ์ฝ์ต๋๋ค.
-
xโ ์ ์ int ์ธ๊ณ ์ขํ์ ๋๋ค. -
yโ ์ ์ int ์ธ๊ณ ์ขํ์ ๋๋ค. -
worldNumโ int ํ์ฌ ์นด๋ ๋ฒํธ. ๋ค๋ฅธ ๋งต์ ๋ก๋๋์ง ์๊ณ ๋น ๋ฐฐ์ด์ ์ ๊ณตํฉ๋๋ค.
๋ฐฐ์ด int, ์ผ์ค [graphic, Z, hue, graphic, Z, hue, ...]. ๋งต/๋ถ์ผ์น ์์ WorldNum์ ๋น ๋ฐฐ์ด์ ๋๋ค.
- Bridge.GetStaticTiles์๋ ์ ์ TNext ์ฒด์ธ์ Static, Multi ๋ฐ Item์ด ํฌํจ๋ฉ๋๋ค. ํ ์ง๋ ์ ์ธ๋ฉ๋๋ค. ์ด๋ ํ์ค์นผ ๋ ์ฝ๋๋ ์ค์ฒฉ๋ ์ธ ์์ ๋ ์ฝ๋์ ๋ฐฐ์ด์ด ์๋๋๋ค.
- ๋ ์ฝ๋ ์ = ArrayLength(๊ฒฐ๊ณผ)/3. ๋ค์ด๋ก๋ํ ๋ฐ์ดํฐ๋ง ์ฝ์ต๋๋ค. ์๋ฒ์ ์ ์ ์๋ ํ์์ ๋ํ ์์ฒญ์ด ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.ReadStaticsXY(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ์ ์๋ ํ์ฌ ์นด๋์ ํ๋ซ ์ ์ ๋ ์ฝ๋๋ฅผ ์ฝ์ต๋๋ค.
var records = UO.ReadStaticsXY(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(UO.GetArrayLength(records) / 3);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Bridge.GetStaticTiles์๋ ์ ์ TNext ์ฒด์ธ์ Static, Multi ๋ฐ Item์ด ํฌํจ๋ฉ๋๋ค. ํ ์ง๋ ์ ์ธ๋ฉ๋๋ค. ์ด๋ ํ์ค์นผ ๋ ์ฝ๋๋ ์ค์ฒฉ๋ ์ธ ์์ ๋ ์ฝ๋์ ๋ฐฐ์ด์ด ์๋๋๋ค.
return RunScenario();
object? RunScenario()
{
var records = UO.ReadStaticsXY(UO.GetX(), UO.GetY(), UO.WorldNum());
if (Truth(UO.GetArrayLength(records) >= 3))
{
UO.Print(records[0]);
UO.Print(records[1]);
UO.Print(records[2]);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ์ฝ๋ ์ = ArrayLength(๊ฒฐ๊ณผ)/3. ๋ค์ด๋ก๋ํ ๋ฐ์ดํฐ๋ง ์ฝ์ต๋๋ค. ์๋ฒ์ ์ ์ ์๋ ํ์์ ๋ํ ์์ฒญ์ด ์์ต๋๋ค.
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 map = UO.WorldNum();
var records = UO.ReadStaticsXY(UO.GetX(), UO.GetY(), map);
var i = 0;
while (Truth(i + 2 < UO.GetArrayLength(records)))
{
UO.Print(Convert.ToString(records[i]) + " " + Convert.ToString(records[i + 1]) + " " + Convert.ToString(records[i + 2]));
i = i + 3;
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: x (Any), y (Any), worldNum (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetStaticTiles:bridge.GetStaticTiles(Arg(0), Arg(1), Arg(2)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "readstaticsxy":
return new InjectionValue(bridge.GetStaticTiles(Arg(0), Arg(1), Arg(2)).Select(value => new InjectionValue(value)).ToArray());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.RemoveUserStatic(object? id);ID์์ ์ฌ์ฉ์ ์ ์ ๋ ์ฝ๋๋ฅผ ์ญ์ ํฉ๋๋ค.
-
id- int ID, AddUserStatic ๋ฐํ; graphic/type๊ฐ ์๋๋๋ค.
์ซ์ ํ๋๊ทธ int: 1 - ๊ธฐ๋ก์ด ์ญ์ ๋์์ต๋๋ค. 0 - ID๊ฐ ๋๋ฝ๋์์ต๋๋ค.
- ์ฒซ ๋ฒ์งธ ์ํ.UserStatics.์ ๊ฑฐ; ์ญ์ ๊ฐ ์ฑ๊ณตํ ๊ฒฝ์ฐ์๋ง bridge.RemoveUserStatic(id)๊ฐ ํธ์ถ๋ฉ๋๋ค. ํ์ค ์ ์ ์ง๋ ํ์ผ์๋ ์ญ์ ๊ฐ ์ ์ฉ๋์ง ์์ต๋๋ค.
- ๋ก์ปฌ ์ฌ์ฉ์ ์ ์ ํ์์ด ํ์ฌ ์ํ์์ ์ ๊ฑฐ๋ฉ๋๋ค. ์๋ฒ ์์ดํ ๋ฐ ๊ธฐํ ID ์์ดํ ์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.RemoveUserStatic(1);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ID์์ ์ฌ์ฉ์ ์ ์ ๋ ์ฝ๋๋ฅผ ์ญ์ ํฉ๋๋ค.
UO.Print(UO.RemoveUserStatic(1));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒซ ๋ฒ์งธ ์ํ.UserStatics.์ ๊ฑฐ; ์ญ์ ๊ฐ ์ฑ๊ณตํ ๊ฒฝ์ฐ์๋ง bridge.RemoveUserStatic(id)๊ฐ ํธ์ถ๋ฉ๋๋ค. ํ์ค ์ ์ ์ง๋ ํ์ผ์๋ ์ญ์ ๊ฐ ์ ์ฉ๋์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.UserStaticExists(1)))
{
UO.Print(UO.RemoveUserStatic(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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ก์ปฌ ์ฌ์ฉ์ ์ ์ ํ์์ด ํ์ฌ ์ํ์์ ์ ๊ฑฐ๋ฉ๋๋ค. ์๋ฒ ์์ดํ ๋ฐ ๊ธฐํ ID ์์ดํ ์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
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 records = UO.GetUserStatics();
if (Truth(UO.GetArrayLength(records) > 0))
{
var id = records[0][0];
UO.Print(UO.RemoveUserStatic(id));
UO.Print(UO.UserStaticExists(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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: id (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.RemoveUserStatic:bridge.RemoveUserStatic(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "removeuserstatic":
{
int id = Arg(0);
bool removed = state.UserStatics.Remove(id);
if (removed) bridge.RemoveUserStatic(id);
return new InjectionValue(removed ? 1 : 0);
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.UserStaticExists(object? id);์ฌ์ฉ์ ์ ์ ๋ ์ฝ๋์ ID๊ฐ ์๋์ง ํ์ธํฉ๋๋ค.
-
idโ int ID AddUserStatic; graphic/type๋ ์๋๊ณ serial๋ ์๋๋๋ค.
์ซ์ ํ๋๊ทธ int: 1 - ํค๊ฐ ์๋ ์ํ์ ๋๋ค. UserStatics, 0 - ์์.
- ๋ฐํ์ ์ฌ์ ์์๋ ContainsKey๋ง ํ์ธ๋ฉ๋๋ค. ์ง๋์์ ๊ฐ์ฒด ๊ฐ์์ฑ, ๊ต๋ ๊ฐ์ฒด์ ์ฑ๊ณต์ ์ธ ์์ฑ ๋ฐ ์๋ฒ ์๋๋ ํ์ธ๋์ง ์์ต๋๋ค.
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.UserStaticExists(1);
UO.Print("UserStaticExists: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฌ์ฉ์ ์ ์ ๋ ์ฝ๋์ ID๊ฐ ์๋์ง ํ์ธํฉ๋๋ค.
UO.Print(UO.UserStaticExists(1));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฐํ์ ์ฌ์ ์์๋ ContainsKey๋ง ํ์ธ๋ฉ๋๋ค. ์ง๋์์ ๊ฐ์ฒด ๊ฐ์์ฑ, ๊ต๋ ๊ฐ์ฒด์ ์ฑ๊ณต์ ์ธ ์์ฑ ๋ฐ ์๋ฒ ์๋๋ ํ์ธ๋์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.UserStaticExists(1)))
{
UO.Print(UO.GetUserStatic(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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
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 records = UO.GetUserStatics();
if (Truth(UO.GetArrayLength(records) > 0))
{
UO.Print(UO.UserStaticExists(records[0][0]));
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: id (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.UserStaticExists. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int UserStaticExists(InjectionValue id)
=> state.UserStatics.ContainsKey(NumberConversions.ToInt(id)) ? 1 : 0;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.WorldNum();ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์์ ํ์ฌ ์นด๋ ๋ฒํธ๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ ํด๋ผ์ด์ธํธ์ ํ์ฌ ์นด๋ ์์ธ, ์ผ๋ฐ์ ์ผ๋ก 0=Felucca, 1=Trammel, 2=Ilshenar, 3=Malas, 4=Tokuno, 5=Ter Mur. ์ฌ์ฉ์ ์๋ฒ๋ ๋ค๋ฅธ ์นด๋ ์ธํธ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. 0๋ ์ค๋ฅ ์งํ๊ฐ ์๋ ๋ณธ๊ฒฉ์ ์ธ ์ง๋์ ๋๋ค.
- ์ด๋ฏธ ์์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์์ฒญ์ ๊ณต๊ฐ ์ํ๊ฐ ์๋๋ฉฐ ์๋ฒ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๋ด๋๋ก ๊ฐ์ ํ์ง ์์ต๋๋ค. ์ฌ๋ง, ๋งต ์ ํ ๋๋ ๊ฐ์ฒด ์ญ์ ํ ๋ ํธ์ถ ์ฌ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.WorldNum();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ํ์ฌ ์นด๋ ๋ฒํธ๊ฐ ๊ฐ์ ์ ์ฅ๋ฉ๋๋ค.
- Convert.ToString๋ ์ถ๋ ฅํ ์ซ์๋ฅผ ๋ณํํ๋ฉฐ ๊ฒฐ๊ณผ์ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
var value = UO.WorldNum();
UO.Print("WorldNum: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์ ์์ด ๊ฐ์ ํ ๋ฒ ์ฝ์ต๋๋ค. ํ์๋ ๊ณ์ฐ์ด๋ ์กฐ๊ฑด์๋ ํ์ฌ ์นด๋ ๋ฒํธ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ซ์ ์๊ณ๊ฐ์ ์คํฌ๋ฆฝํธ ์กฐ๊ฑด์ ์์ด๋ฉฐ ์๋ก์ด ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋๋๋ค. ํ๋์๋ ์์ ์ค๋ช ๋ ์๋ฒ ๋จ์ ๋ฐ ์ ํ ์ฌํญ์ด ์ ์ฅ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.WorldNum();
var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), value);
UO.Print("Land record length: " + Convert.ToString(ArrayLength(land)));
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ๋ ํธ์ถ ๋ชจ๋ ํ์ฌ ๊ฐ์ ์ฝ์ต๋๋ค. UO.Wait(1000)๋ ์ท ์ฌ์ด์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ผ์ ์ค์ง๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๋น๊ต๋๋ ๋ณ๊ฒฝ ์ฌํญ์ ํ์ฌ ์นด๋์ ๋ฒํธ์ ๋๋ค. ์๋ ์ธ์์ ์ด๋ค ๊ฒ๋ ๋ฐ๊พธ์ง ์์ผ๋ฉฐ ๋์์ด ๊ธฐ๋ค๋ฆฌ์ง๋ ์์ต๋๋ค. ์ด ์ด ๋ด์ ์ด๋ฒคํธ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var before = UO.WorldNum();
await Delay(1000);
var after = UO.WorldNum();
if (Truth(before != after))
{
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "worldnum": return new InjectionValue(bridge.WorldNumber);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.X();ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์์ X ์ขํ๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ ๋ก๋๋ ๊ฐ์ฒด์ ์ขํ X. ์บ๋ฆญํฐ/์๋ ์์ดํ ์ ๊ฒฝ์ฐ ์ด๋ ์๋ ์ ์ ๋๋ค. ๊ฐ๋ฐฉ์ ๋ค์ด ์๋ ํ๋ชฉ์ ๊ฒฝ์ฐ ์ด๋ ์ปจํ ์ด๋ ๋ด๋ถ์ ์ขํ์ ๋๋ค. ์ ์ ์๋ ๊ฐ์ฒด๋ 0์ ์ ๊ณตํ์ง๋ง X=0๋ ํ์ฉ๋ฉ๋๋ค.
- ์ด๋ฏธ ์์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์์ฒญ์ ๊ณต๊ฐ ์ํ๊ฐ ์๋๋ฉฐ ์๋ฒ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๋ด๋๋ก ๊ฐ์ ํ์ง ์์ต๋๋ค. ์ฌ๋ง, ๋งต ์ ํ ๋๋ ๊ฐ์ฒด ์ญ์ ํ ๋ ํธ์ถ ์ฌ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.X();
UO.Print("X: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ฅผ ์ฐธ์กฐํฉ๋๋ค. x ์ขํ๋ value์ ์ ์ฅ๋ฉ๋๋ค.
- Convert.ToString๋ ์ถ๋ ฅํ ์ซ์๋ฅผ ๋ณํํ๋ฉฐ ๊ฒฐ๊ณผ์ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
var value = UO.X();
UO.Print("X: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์ ์์ด ๊ฐ์ ํ ๋ฒ ์ฝ์ต๋๋ค. x ์ขํ๋ ํ์๋ ๊ณ์ฐ ๋๋ ์กฐ๊ฑด์ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ซ์ ์๊ณ๊ฐ์ ์คํฌ๋ฆฝํธ ์กฐ๊ฑด์ ์์ด๋ฉฐ ์๋ก์ด ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋๋๋ค. ํ๋์๋ ์์ ์ค๋ช ๋ ์๋ฒ ๋จ์ ๋ฐ ์ ํ ์ฌํญ์ด ์ ์ฅ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.X();
UO.Print("Two tiles east would be X=" + Convert.ToString(value + 2));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ๋ ํธ์ถ ๋ชจ๋ ํ์ฌ ๊ฐ์ ์ฝ์ต๋๋ค. UO.Wait(1000)๋ ์ท ์ฌ์ด์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ผ์ ์ค์ง๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๋ณ๊ฒฝ ์ฌํญ์ X ์ขํ์ ๋น๊ต๋ฉ๋๋ค. ์ด ์๋ ์ธ์์ ์ด๋ค ๊ฒ๋ ๋ฐ๊พธ์ง ์์ผ๋ฉฐ ๋ฌดํ์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ์ด ์ด ๋ด์ ์ด๋ฒคํธ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var before = UO.X();
await Delay(1000);
var after = UO.X();
if (Truth(before != after))
{
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [X]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.GetX(bridge.Self)API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Y();ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์์ Y ์ขํ๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ ๋ก๋๋ ๊ฐ์ฒด์ Y ์ขํ์ ๋๋ค. ์บ๋ฆญํฐ/์๋ ์์ดํ ์ ๊ฒฝ์ฐ ์๋ ์ ์ด๊ณ , ๊ฐ๋ฐฉ์ ์๋ ์์ดํ ์ ๊ฒฝ์ฐ ์ปจํ ์ด๋ ๋ด๋ถ ์์น์ ๋๋ค. ์ ์ ์๋ ๊ฐ์ฒด๋ 0๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ด๋ฏธ ์์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์์ฒญ์ ๊ณต๊ฐ ์ํ๊ฐ ์๋๋ฉฐ ์๋ฒ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๋ด๋๋ก ๊ฐ์ ํ์ง ์์ต๋๋ค. ์ฌ๋ง, ๋งต ์ ํ ๋๋ ๊ฐ์ฒด ์ญ์ ํ ๋ ํธ์ถ ์ฌ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Y();
UO.Print("Y: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ฅผ ์ฐธ์กฐํฉ๋๋ค. y ์ขํ๋ ๊ฐ์ ์ ์ฅ๋ฉ๋๋ค.
- Convert.ToString๋ ์ถ๋ ฅํ ์ซ์๋ฅผ ๋ณํํ๋ฉฐ ๊ฒฐ๊ณผ์ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
var value = UO.Y();
UO.Print("Y: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์ ์์ด ๊ฐ์ ํ ๋ฒ ์ฝ์ต๋๋ค. y ์ขํ๋ ํ์๋ ๊ณ์ฐ ๋๋ ์กฐ๊ฑด์ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ซ์ ์๊ณ๊ฐ์ ์คํฌ๋ฆฝํธ ์กฐ๊ฑด์ ์์ด๋ฉฐ ์๋ก์ด ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋๋๋ค. ํ๋์๋ ์์ ์ค๋ช ๋ ์๋ฒ ๋จ์ ๋ฐ ์ ํ ์ฌํญ์ด ์ ์ฅ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.Y();
UO.Print("Two tiles south would be Y=" + Convert.ToString(value + 2));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ๋ ํธ์ถ ๋ชจ๋ ํ์ฌ ๊ฐ์ ์ฝ์ต๋๋ค. UO.Wait(1000)๋ ์ท ์ฌ์ด์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ผ์ ์ค์ง๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๋ณ๊ฒฝ ์ฌํญ์ Y ์ขํ์ ๋น๊ต๋ฉ๋๋ค. ์ด ์๋ ์ธ์์ ์ด๋ค ๊ฒ๋ ๋ฐ๊พธ์ง ์์ผ๋ฉฐ ๋ฌดํ์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ์ด ์ด ๋ด์ ์ด๋ฒคํธ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var before = UO.Y();
await Delay(1000);
var after = UO.Y();
if (Truth(before != after))
{
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [Y]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.GetY(bridge.Self)API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Z();ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์์ Z ๋์ด๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int๋ ์๋ ๋จ์๋ก ๋ํ๋ธ ๊ฐ์ฒด์ ๋์ด์ด๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก -128..127์ ๋๋ค. ์ด๊ฒ์ ์ธต์๋ ์ฅ๋น์ ๋ ์ด์ด๊ฐ ์๋๋๋ค. 0๋ ์ค์ ๋์ด์ผ ์๋ ์๊ณ ๋ฌผ์ฒด๊ฐ ์๋ ๊ฒฐ๊ณผ์ผ ์๋ ์์ต๋๋ค.
- ์ด๋ฏธ ์์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์์ฒญ์ ๊ณต๊ฐ ์ํ๊ฐ ์๋๋ฉฐ ์๋ฒ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๋ด๋๋ก ๊ฐ์ ํ์ง ์์ต๋๋ค. ์ฌ๋ง, ๋งต ์ ํ ๋๋ ๊ฐ์ฒด ์ญ์ ํ ๋ ํธ์ถ ์ฌ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Z();
UO.Print("Z: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ฅผ ์ฐธ์กฐํฉ๋๋ค. z ๋์ด๋ ๊ฐ์ ์ ์ฅ๋ฉ๋๋ค.
- Convert.ToString๋ ์ถ๋ ฅํ ์ซ์๋ฅผ ๋ณํํ๋ฉฐ ๊ฒฐ๊ณผ์ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
var value = UO.Z();
UO.Print("Z: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์ ์์ด ๊ฐ์ ํ ๋ฒ ์ฝ์ต๋๋ค. z ๋์ด๋ ํ์๋ ๊ณ์ฐ ๋๋ ์กฐ๊ฑด์ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ซ์ ์๊ณ๊ฐ์ ์คํฌ๋ฆฝํธ ์กฐ๊ฑด์ ์์ด๋ฉฐ ์๋ก์ด ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋๋๋ค. ํ๋์๋ ์์ ์ค๋ช ๋ ์๋ฒ ๋จ์ ๋ฐ ์ ํ ์ฌํญ์ด ์ ์ฅ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.Z();
var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
if (Truth(ArrayLength(land) >= 3))
{
UO.Print("Height above land: " + Convert.ToString(value - land[1]));
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ๋ ํธ์ถ ๋ชจ๋ ํ์ฌ ๊ฐ์ ์ฝ์ต๋๋ค. UO.Wait(1000)๋ ์ท ์ฌ์ด์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ผ์ ์ค์ง๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๋น๊ต๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋์ด Z์ ๋๋ค. ์๋ ์ธ์์ ์ด๋ค ๊ฒ๋ ๋ฐ๊พธ์ง ์์ผ๋ฉฐ ๋์์ด ๊ธฐ๋ค๋ฆฌ์ง๋ ์์ต๋๋ค. ์ด ์ด ๋ด์ ์ด๋ฒคํธ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var before = UO.Z();
await Delay(1000);
var after = UO.Z();
if (Truth(before != after))
{
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [Z]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetZ:bridge.GetZ(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.GetZ(bridge.Self)API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.