KO UO Topic character Part 3 - 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.GetSex();ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์์ ์ฑ๋ณ ๋ฐ ์ธ์ข ์ฝ๋๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int - ํธํ ์ฝ๋: 0=์ธ๊ฐ ๋จ์ฑ, 1=์ธ๊ฐ ์ฌ์ฑ, 2=์ํ ๋จ์ฑ, 3=์ํ ์ฌ์ฑ, 4=๊ฐ๊ณ ์ผ ๋จ์ฑ, 5=๊ฐ๊ณ ์ผ ์ฌ์ฑ. ๋ฌธ์๊ฐ ์๋ ๊ฒฝ์ฐ์๋ 0์ด๋ฏ๋ก Exists(self)์์ ์ฌ์ฉ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ์ธํ์ธ์. ์ด๊ฒ์ ๋จ์ํ bool ์์ปท์ด ์๋๋๋ค.
- ์ด๋ฏธ ์์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์์ฒญ์ ๊ณต๊ฐ ์ํ๊ฐ ์๋๋ฉฐ ์๋ฒ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๋ด๋๋ก ๊ฐ์ ํ์ง ์์ต๋๋ค. ์ฌ๋ง, ๋งต ์ ํ ๋๋ ๊ฐ์ฒด ์ญ์ ํ ๋ ํธ์ถ ์ฌ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetSex();
UO.Print("GetSex: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ์ฑ๋ณ๊ณผ ์ธ์ข ์ฝ๋๋ ๊ฐ์ ์ ์ฅ๋ฉ๋๋ค.
- Convert.ToString๋ ์ถ๋ ฅํ ์ซ์๋ฅผ ๋ณํํ๋ฉฐ ๊ฒฐ๊ณผ์ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
var value = UO.GetSex();
UO.Print("GetSex: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์ ์์ด ๊ฐ์ ํ ๋ฒ ์ฝ์ต๋๋ค. ์ฑ๋ณ ๋ฐ ์ธ์ข ์ฝ๋๋ ํ์๋ ๊ณ์ฐ ๋๋ ์กฐ๊ฑด์ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ซ์ ์๊ณ๊ฐ์ ์คํฌ๋ฆฝํธ ์กฐ๊ฑด์ ์์ด๋ฉฐ ์๋ก์ด ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋๋๋ค. ํ๋์๋ ์์ ์ค๋ช ๋ ์๋ฒ ๋จ์ ๋ฐ ์ ํ ์ฌํญ์ด ์ ์ฅ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.GetSex();
if (Truth(value == 4) || Truth(value == 5))
{
UO.Print("Gargoyle sex/race code");
}
return null;
}
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)๋ ์ท ์ฌ์ด์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ผ์ ์ค์ง๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๋ณ๊ฒฝ ์ฌํญ์ด ๋น๊ต๋ฉ๋๋ค: ์ฑ๋ณ ๋ฐ ์ธ์ข ์ฝ๋. ์๋ ์ธ์์ ์ด๋ค ๊ฒ๋ ๋ฐ๊พธ์ง ์์ผ๋ฉฐ ๋์์ด ๊ธฐ๋ค๋ฆฌ์ง๋ ์์ต๋๋ค. ์ด ์ด ๋ด์ ์ด๋ฒคํธ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค.
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.GetSex();
await Delay(1000);
var after = UO.GetSex();
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 [GetSex]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Sex:bridge.Sex.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.SexAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetStam();
dynamic UO.GetStam(object? objID);๋ก์ปฌ ๋ชจ๋ธ์์ ํ์ฌ ์ฒด๋ ฅ์ ์ฝ์ต๋๋ค.
-
objIDโ ํ์๋ ํ์์ ์ ํ์ ๊ฐ์ฒด: serial ์ซ์/16์ง์ ๋ฌธ์์ด, self, lasttarget ๋๋ ๋ฑ๋ก๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ type๊ฐ ์๋๋๋ค. ๋ ผ์ ์์ด self์ ์ฝ์ผ์ธ์. ์ผ๋ถ ํ์์ ์ ์ ์๋ ํ ์คํธ๋ก ์ธํด ๋ณํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ ํํ๊ธฐ ์ ์ ์ด๋ฆ์ ํ์ธํ์ธ์.
int๋ ๋ฐฑ๋ถ์จ์ด๋ bool๊ฐ ์๋ Stamina ํ๋์ ๊ฐ์ ๋๋ค. 0๋ ์ค์ ๊ฐ์ด๊ฑฐ๋ ๋๋ฝ๋ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค. ์ต๋๊ฐ 0์ ์ ์๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋์ mobile์ ๊ฒฝ์ฐ ์๋ฏธ๊ฐ ์๋ ค์ง์ง ์์์ ์ ์์ต๋๋ค. HP/HitsMax์๋ ์ ํํ ํฌ์ธํธ ๋์ ์๋์ ์ธ ์๋ฒ ๊ท๋ชจ๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค. HP=0๋ ์ฌ๋ง์ ์ฆ๋ช ํ์ง ์์ต๋๋ค. Dead/IsDead๊ฐ ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ์ํ๋ฅผ ์ด์ง ์์ผ๋ฉฐ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ์์ฒญํ์ง ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ์ด๋ฏธ ๋ก๋๋ ๋ฐ์ดํฐ๋ง ์ฝ์ต๋๋ค. ํน์ฑ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ ๋ณ๋์ ๋ ์์ ๋๋ค. Exists์ ๋ค์ ๋์ ์ฌ์ด์ ์ธ์์ด ๋ฐ๋ ์๋ ์์ต๋๋ค. ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ ์์์ฑ ์ค๋ ์ท์ ํ์ฑํ์ง ์์ต๋๋ค.
- ๊ฐ์ฒด๋ฅผ ์ฝ์ ๋ World.Get์ ๋๋ฝ๋ ๋๋ IsDestroyed๋ฅผ ๊ฑฐ๋ถํ๊ณ ๊ฒฐ๊ณผ๋ 0์ ๋๋ค. HP/HitsMax๋ ์ด๋ฌํ ํ๋๊ฐ ์๋ ํญ๋ชฉ์ ํฌํจํ์ฌ ์ํฐํฐ์์ ์ฝ์ต๋๋ค. Mana/Stamina - ๋ชจ๋ฐ์ผ ์ ์ฉ์ ๋๋ค. ๋ ผ์ ์์ด self์ ์ฝ์ผ์ธ์. ๋งค๊ฐ๋ณ์๊ฐ ์๋ ๋์ผํ ์ด๋ฆ์ ๋ณํ์ด ๋ฐ๋์ ID๋ฅผ ํฌํจํ ๋ณํ์ ๊ฐ์ง ํ์๋ ์์ต๋๋ค. ์๋ช ์ ์ฐธ์กฐํ์ธ์.
- ์ธ์ ์์ด ์ฝ์ผ๋ฉด ๋๋ฝ๋๊ฑฐ๋ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋ํด 0๋ ๋ฐํ๋ฉ๋๋ค. ์ด๋ World.Get์ ํตํ ํ์๋ฟ๋ง ์๋๋ผ ์ง์ Mana/Stamina ๋ฐ ์ต๋๊ฐ์ ์ ์ฉ๋ฉ๋๋ค. ํ์ฌ ์ฃฝ์ ์บ๋ฆญํฐ๋ ๊ฐ์ ์ ์งํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetStam();
UO.Print("GetStam: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ก ํ์๋ฉ๋๋ค. ๊ฐ์ ํ๋์ ์ซ์๋ฅผ ์ ์ฅํ๊ณ ๋ณํํฉ๋๋ค.ToString๋ ๋ฉ์์ง์ฉ์ผ๋ก๋ง ๋ณํํฉ๋๋ค.
var value = UO.GetStam();
UO.Print("GetStam: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ํ๋์ ์ ์ฉ๋ ์๊ณ๊ฐ ๋๋ ๊ณ์ฐ์ด ํ์๋ฉ๋๋ค. ์กฐ๊ฑด์ ์ซ์๋ ์๋ฒ ์ ํ์ด ์๋ ์์ ์ค์ ์ ๋๋ค. ์ต๋๊ฐ์ผ๋ก ๋๋๊ธฐ ์ ์ ์์ฑ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.GetStam();
if (Truth(value < 15))
{
UO.Print("Known stamina is below the movement threshold of 15");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- lasttarget โ ์ด์ ์ ์ ํํ ๊ฐ์ฒด; Exists๋ ๊ฐ์ฉ์ฑ์ ํ์ธํฉ๋๋ค. obj๋ ReadValue์ ์ ์ผํ ๋งค๊ฐ๋ณ์์ ๋๋ค. ์ด ํจ์๋ ๋ช ๋ น ๋ฒํธ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ฐํํ๋ฉฐ ์ ์ฒด ๋ด์ฉ์ด ์ ๊ณต๋ฉ๋๋ค.
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(UO.Exists("lasttarget")))
{
var value = ReadValue("lasttarget");
UO.Print("Selected value: " + Convert.ToString(value));
}
return null;
}
dynamic ReadValue(dynamic obj)
{
return UO.GetStam(obj);
}
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 [GetStam]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Stamina:bridge.Stamina.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.StaminaAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetStamina:bridge.GetStamina(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Stamina:bridge.Stamina.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getstam": return new InjectionValue(arguments.Length > 0 ? bridge.GetStamina(Arg(0)) : bridge.Stamina);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetStamina();๋ก์ปฌ ๋ชจ๋ธ์์ ํ์ฌ ์ฒด๋ ฅ์ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int๋ ๋ฐฑ๋ถ์จ์ด๋ bool๊ฐ ์๋ Stamina ํ๋์ ๊ฐ์ ๋๋ค. 0๋ ์ค์ ๊ฐ์ด๊ฑฐ๋ ๋๋ฝ๋ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค. ์ต๋๊ฐ 0์ ์ ์๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋์ mobile์ ๊ฒฝ์ฐ ์๋ฏธ๊ฐ ์๋ ค์ง์ง ์์์ ์ ์์ต๋๋ค. HP/HitsMax์๋ ์ ํํ ํฌ์ธํธ ๋์ ์๋์ ์ธ ์๋ฒ ๊ท๋ชจ๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค. HP=0๋ ์ฌ๋ง์ ์ฆ๋ช ํ์ง ์์ต๋๋ค. Dead/IsDead๊ฐ ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ์ํ๋ฅผ ์ด์ง ์์ผ๋ฉฐ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ์์ฒญํ์ง ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ์ด๋ฏธ ๋ก๋๋ ๋ฐ์ดํฐ๋ง ์ฝ์ต๋๋ค. ํน์ฑ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ ๋ณ๋์ ๋ ์์ ๋๋ค. Exists์ ๋ค์ ๋์ ์ฌ์ด์ ์ธ์์ด ๋ฐ๋ ์๋ ์์ต๋๋ค. ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ ์์์ฑ ์ค๋ ์ท์ ํ์ฑํ์ง ์์ต๋๋ค.
- ๊ฐ์ฒด๋ฅผ ์ฝ์ ๋ World.Get์ ๋๋ฝ๋ ๋๋ IsDestroyed๋ฅผ ๊ฑฐ๋ถํ๊ณ ๊ฒฐ๊ณผ๋ 0์ ๋๋ค. HP/HitsMax๋ ์ด๋ฌํ ํ๋๊ฐ ์๋ ํญ๋ชฉ์ ํฌํจํ์ฌ ์ํฐํฐ์์ ์ฝ์ต๋๋ค. Mana/Stamina - ๋ชจ๋ฐ์ผ ์ ์ฉ์ ๋๋ค. ๋ ผ์ ์์ด self์ ์ฝ์ผ์ธ์. ๋งค๊ฐ๋ณ์๊ฐ ์๋ ๋์ผํ ์ด๋ฆ์ ๋ณํ์ด ๋ฐ๋์ ID๋ฅผ ํฌํจํ ๋ณํ์ ๊ฐ์ง ํ์๋ ์์ต๋๋ค. ์๋ช ์ ์ฐธ์กฐํ์ธ์.
- ์ธ์ ์์ด ์ฝ์ผ๋ฉด ๋๋ฝ๋๊ฑฐ๋ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋ํด 0๋ ๋ฐํ๋ฉ๋๋ค. ์ด๋ World.Get์ ํตํ ํ์๋ฟ๋ง ์๋๋ผ ์ง์ Mana/Stamina ๋ฐ ์ต๋๊ฐ์ ์ ์ฉ๋ฉ๋๋ค. ํ์ฌ ์ฃฝ์ ์บ๋ฆญํฐ๋ ๊ฐ์ ์ ์งํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetStamina();
UO.Print("GetStamina: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ก ํ์๋ฉ๋๋ค. ๊ฐ์ ํ๋์ ์ซ์๋ฅผ ์ ์ฅํ๊ณ ๋ณํํฉ๋๋ค.ToString๋ ๋ฉ์์ง์ฉ์ผ๋ก๋ง ๋ณํํฉ๋๋ค.
var value = UO.GetStamina();
UO.Print("GetStamina: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ํ๋์ ์ ์ฉ๋ ์๊ณ๊ฐ ๋๋ ๊ณ์ฐ์ด ํ์๋ฉ๋๋ค. ์กฐ๊ฑด์ ์ซ์๋ ์๋ฒ ์ ํ์ด ์๋ ์์ ์ค์ ์ ๋๋ค. ์ต๋๊ฐ์ผ๋ก ๋๋๊ธฐ ์ ์ ์์ฑ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.GetStamina();
if (Truth(value < 15))
{
UO.Print("Known stamina is below the movement threshold of 15");
}
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 ํ์์ด ์์ต๋๋ค. ReadValue ๋งค๊ฐ๋ณ์๊ฐ ์์ผ๋ฉด self๋ฅผ ์ฝ์ต๋๋ค. ๋ ํธ์ถ์ 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 = ReadValue();
await Delay(1000);
var after = ReadValue();
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
return null;
}
dynamic ReadValue()
{
return UO.GetStamina();
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [GetStamina]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Stamina:bridge.Stamina.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.StaminaAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetStatLockState(object? statNum);๊ตญ๋ถ์ ์ธ ํน์ฑ ๋ณํ ๋ชจ๋๋ฅผ ์ฝ์ต๋๋ค.
-
statNum- ํ์ ํน์ฑ๋ฒํธ: 0 - ๋ณํ.ToString, 1 - DEX, 2 - INT. ์ด๋ ํ์ฌ ๊ฐ์ด ์๋๋ฉฐ ๋ฌธ์์ด ์ด๋ฆ๋ ์๋๋๋ค.
int: 0 - ์ฆ๊ฐ, 1 - ๊ฐ์, 2 - ์ฐจ๋จ. true/false๊ฐ ์๋ ๋ชจ๋ ์ฝ๋์ ๋๋ค. 0..2 ์ด์ธ์ ์ซ์์ ๋ํด์๋ โ1์ ๋ฐํํฉ๋๋ค. ๋ฌธ์๊ฐ ๋๋ฝ๋ ๊ฒฝ์ฐ ์ ํจํ ์ซ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก 0๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ ์๋ฒ ์ํ๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์๋๋๋ค.
- ์ด๋ฏธ ์์ ๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฒ์ ์ค๋ ๋์์ Invoke๋ฅผ ํตํด ์ฝ๊ธฐ๊ฐ ์ํ๋ฉ๋๋ค. ๋คํธ์ํฌ ํจํท์ ์ ์ก๋์ง ์์ต๋๋ค. ์คํฌ์ ์ฌ์ฉํ๊ฑฐ๋ ํ๋ จํ์ง ์์ต๋๋ค. ๋ ๊ฐ์ ์์ฒญ - ๋ ๊ฐ์ ๊ฐ๋ณ ์ค๋ ์ท.
- ํ์ ํน์ฑ ๋ฒํธ: 0 - ๋ณํ.ToString, 1 - DEX, 2 - INT. ์ด๋ ํ์ฌ ๊ฐ์ด ์๋๋ฉฐ ๋ฌธ์์ด ์ด๋ฆ๋ ์๋๋๋ค.
- ExecuteClientApiCompatibility๋ ๋ช ๋ น ๋ถ๊ธฐ๋ฅผ ์ ํํฉ๋๋ค. Text๋ ์คํฌ ์ ํ๊ธฐ๋ฅผ ์ฝ๊ณ , Arg๋ ์ซ์์ ๋ชจ๋๋ฅผ ์ฝ์ต๋๋ค. ๋ณํํ ์ ์๋ ์ธ์๋ ๋ณํ ์ค๋ฅ๋ก ์ธํด ํธ์ถ์ด ์คํจํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetStatLockState(0);
UO.Print("GetStatLockState: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ์์์๋ ์ ํ๊ธฐ์ ๋ น์ ์ ๋ชจ๋๊ฐ ๋ช ์์ ์ผ๋ก ์ง์ ๋ฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ค์์๋ ์ด๋ฆ์ผ๋ก ์คํฌ์ ์ ํํ๊ฑฐ๋ ์ซ์๋ก ํน์ฑ์ ์ ํํฉ๋๋ค. Print ๊ฒฐ๊ณผ๋ง ํ์๋ฉ๋๋ค.
var selector = 0;
var mode = UO.GetStatLockState(selector);
UO.Print(Convert.ToString(mode));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๊ณ๊ฐ 95.1 ๋ฐ ๋ชจ๋ 0/1/2๊ฐ ์๋ก ์ ๊ณต๋ฉ๋๋ค. โ1๋ ๋ชจ๋ ๋ณ๊ฒฝ ์ ํ์ธ๋ฉ๋๋ค. ์ด ํ์๋ ๋ก์ปฌ ๋ณต์ฌ๋ณธ๋ง ์ฝํ์ง๋๋ค. ์๋ฒ๊ฐ ์๋ตํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var mode = UO.GetStatLockState(0);
if (Truth(mode == 2))
{
UO.Print("Locked");
}
else
{
if (Truth(mode == -1))
{
UO.Print("Unknown selector");
}
else
{
UO.Print("Mode: " + Convert.ToString(mode));
}
}
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 ์๋์ ์ ๊ณต๋ฉ๋๋ค. ์ ๋ ํฐ๋ ์คํฌ/ํน์ฑ์ ์ ํํ๊ณ , ๋ชจ๋๋ ๋ นํ ๋ชจ๋๋ฅผ ์ค์ ํฉ๋๋ค. ReadValue/ReadMode ์๋ ๋ฒํธ๋ฅผ ๋ฐํํฉ๋๋ค. ApplyMode๋ ์ธ์๋ฅผ ํ์ธํ๊ณ ์์ ์ ์ํํ๋ฉฐ ๊ฐ์ ๋ฐํํ์ง ์์ต๋๋ค. ์ฝ๊ธฐ ์์์์ 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 = ReadMode(0);
await Delay(1000);
var after = ReadMode(0);
UO.Print(Convert.ToString(before) + " -> " + Convert.ToString(after));
return null;
}
dynamic ReadMode(dynamic selector)
{
return UO.GetStatLockState(selector);
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: statNum (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetStatLockState:bridge.GetStatLockState(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getstatlockstate": return new InjectionValue(bridge.GetStatLockState(Arg(0)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.GetStatus(object? id);์ง์ ๋ mobile์ ์ํ์ ๋ํ ์๋ฒ ์์ฒญ์ ๋ณด๋ ๋๋ค.
-
idโ self/backpack/lasttarget/์ ์ฅ๋ ๊ฐ์ฒด์ ๊ฐ์ฒด ์ผ๋ จ๋ฒํธ ๋๋ ์ง์๋๋ ์ด๋ฆ์ ๋๋ค. ์ซ์ ๋ฌธ์์ด๊ณผ 0x ๋ฌธ์์ด์ ๋ฐํ์์ ์ํด ํด๊ฒฐ๋ฉ๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- string-์์์ GetObject๋ฅผ ํตํด ์ด๋ฆ์ ํ์ธํฉ๋๋ค. int ํ์์ serial๋ฅผ ์ง์ ๋ ๋๋งํฉ๋๋ค. ๋ธ๋ฆฌ์ง ํธ์ถ GameActions.RequestMobileStatus(world,serial,true). ๋ช ๋ น์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ์ง ์์ผ๋ฉฐ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ์๋ ์ ๋ฐ์ดํธ ํ GetHP/GetMaxHP ๋ฐ ๊ธฐํ getter๋ฅผ ๋ณ๋๋ก ์ฝ์ด๋ณด์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.GetStatus");
UO.GetStatus("self");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ํ ์์ฒญ์ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ ์ก๋ฉ๋๋ค.
UO.GetStatus("self");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- int ์์์ ๋์ผํ ์์ฒญ์ ๋ณด๋ ๋๋ค.
return RunScenario();
object? RunScenario()
{
var id = UO.Self();
UO.GetStatus(id);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ผ์ ์ค์ง๊ฐ ์๋ก์ด ๋ต๋ณ์ ๋ณด์ฅํ์ง๋ ์์ต๋๋ค. getter๋ ํ์ฌ ๋ก์ปฌ ๋ชจ๋ธ์ ๋ฐํํฉ๋๋ค.
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.GetStatus("self");
await Delay(500);
UO.Print(Convert.ToString(UO.GetHP()) + "/" + Convert.ToString(UO.GetMaxHP()));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: id (Integer/String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetStatus. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetStatus:bridge.GetStatus(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void GetStatus(int id) => bridge.GetStatus(id);๋งค๊ฐ๋ณ์: id (Integer/String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetStatus. -
InjectionScript.Runtime.InjectionApiUO.GetStatus:GetStatus(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void GetStatus(string id) => GetStatus(GetObject(id));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetStr();
int UO.GetStr(object? objID);์บ๋ฆญํฐ์ ํ์ฌ ํ์(Strength, Str)๋ฅผ ์ฝ์ด์ต๋๋ค.
-
objIDโ ํ๋์ ์ธ์(serial ๋ฌธ์ ๋ฒํธ, 10์ง์/0x 16์ง์ ๋ฌธ์์ด, "self", "lasttarget" ๋๋ ์ด๋ฆ AddObject)๊ฐ ํฌํจ๋ ํ์๋ ํ์์ ObjID์ ๋๋ค. graphic/type ์ด์ธ์ ๊ฐ์ฒด๋ฅผ ์ ํํฉ๋๋ค. ์ธ์๊ฐ ์์ผ๋ฉด ํ์ฌ ๋ฌธ์๋ฅผ ์ฝ์ต๋๋ค.
int โ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ํ์ฌ ํต๊ณ ํฌ์ธํธ, 0..65535; ๋ฐฑ๋ถ์จ, ID, ์คํฌ, ์ ๊ธ ๋ชจ๋ ๋๋ bool๊ฐ ์๋๋๋ค. 0๋ ๋๋ฝ/์ญ์ ๋ ๋ฌธ์ ๋๋ ์ ๊ทผํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๊ธฐ๋ ํฉ๋๋ค. == true๊ฐ ์๋ ์์น ์๊ตฌ ์ฌํญ๊ณผ ๋น๊ตํ์ญ์์ค. ์ด๋ ์คํ ํ๋๋ ์์ ์์ด ๋ณด์ฅ๋ ๊ธฐ๋ณธ ๊ฐ์ด ์๋๋๋ค.
- self์ ๊ฒฝ์ฐ (), ๋ช ์์ ๊ฐ์ฒด์ ๊ฒฝ์ฐ (ObjID)๊ฐ ์ง์๋ฉ๋๋ค. ๋ค๋ฅธ ์ ํ์ ์ธ์๋ ์์ต๋๋ค.
- Player๋ฅผ ์ฝ์ต๋๋ค.Strength Player๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์กด์ฌํ๋ ์ฃฝ์ ์บ๋ฆญํฐ๋ ์ ๊ฑฐ๋ ๊ฐ์ฒด๊ฐ ์๋๋๋ค. ์คํ ์ HP, ๋ง๋, ์ฒด๋ ฅ์ผ๋ก ๊ณ์ฐ๋์ง ์์ต๋๋ค.
- GetStr/GetInt/GetDex ObjID๋ฅผ ์๋ฝํฉ๋๋ค. PlayerMobile ๋ฐ์ดํฐ๋ self์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ฅธ serial - 0์ ๊ฒฝ์ฐ, ๋ก๋๋ mobile์ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ํน์ฑ์ ๋์ฒด๋๊ฑฐ๋ ์ถ์ธก๋์ง ์์ต๋๋ค.
- Invoke๋ ์คํฌ๋ฆฝํธ๋ก ๋๊ธฐ๋ฅผ ์ทจ์ํ๋ ๊ธฐ๋ฅ์ ํตํด ๊ฒ์ ์คํธ๋ฆผ์์ ์ฝ๊ธฐ๋ฅผ ์ํํฉ๋๋ค. ์ํ๋ฅผ ์ฟผ๋ฆฌํ์ง ์์ผ๋ฉฐ, ๋์์ ์ด์ง ์์ผ๋ฉฐ, ํจํท์ ๋ณด๋ด์ง ์์ผ๋ฉฐ, ํน์ฑ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ ์ง์ฐ์ ์ถ๊ฐํ์ง ์์ต๋๋ค.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
UO.Str(),UO.Strength(),UO.GetStr(),UO.GetStrength(). - ExecuteClientApiCompatibility.Arg๋ ๋จผ์ ๊ฐ์ฒด ์ด๋ฆ์ ํ์ธํ ๋ค์ ์ซ์๋ฅผ ๋ณํํฉ๋๋ค. ์ ์ ์๋ ์ซ์๊ฐ ์๋ ๋ฌธ์์ด๋ก ์ธํด ๋์์ด ์๋ ๋ณํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. double์ int๋ก ์ค์ด๋ค๊ณ , Array/void๋ 0๋ก ์ค์ด๋ญ๋๋ค. ๋ฌธ์๋ฅผ ์ ํํ๋ ค๋ฉด ์ด๋ฌํ ๋ณํ์ด ์๋ ์ฌ๋ฐ๋ฅธ serial๋ฅผ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetStr();
UO.Print("GetStr: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- value๋ ์ซ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ณํํฉ๋๋ค.ToString ์ก์ง์ฉ์ผ๋ก ํฌ๋งทํฉ๋๋ค. ๋ ผ์์ด๋ ์บ๋ฆญํฐ ํ๋์ด ์์ต๋๋ค.
var value = UO.GetStr();
UO.Print("Strength: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ณ๋์ 1000 ms ์ ํ; UO.Wait ์์์ ์ถ๊ฐ๋์์ต๋๋ค. Change=after-before๋ ์์, 0 ๋๋ ์์์ผ ์ ์์ต๋๋ค. ๊ทธ ์์ฒด๋ก๋ ๋ชจ๋ ์ค๊ฐ ์ ๋ฐ์ดํธ์ ์๋ ์ข ๋ฃ๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.GetStr();
await Delay(1000);
var after = UO.GetStr();
var change = after - before;
UO.Print("Change: " + Convert.ToString(change));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์=80๋ ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋ ์๊ตฌ ์ฌํญ์ ์์ ๋๋ค. AttributeAtLeast(์ต์)๋ ๋๋ฝ๋ ๋ฌธ์๋ฅผ ๊ฑฐ๋ถํ๊ณ ํน์ฑ์ ํ ๋ฒ ์ฝ๊ณ bool๋ฅผ ๋ฐํํฉ๋๋ค: 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(Truth(AttributeAtLeast(80)) == true))
{
UO.Print("Requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic AttributeAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.GetStr();
return value >= minimum;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- id๋ type๊ฐ ์๋๋ผ UO.Self()์ ๊ฒฐ๊ณผ์ ๋๋ค. AddObject๋ ๋ ๋ฒ์งธ ์ธ์๊ฐ ์ง์ ๋์๊ธฐ ๋๋ฌธ์ ID๋ฅผ ๋ฒ์ ์์ด statSubject๋ก ์ ์ฅํฉ๋๋ค. ๋ ํธ์ถ ๋ชจ๋ ๋์ผํ ๋ฌธ์๋ฅผ ์ ํํ์ง๋ง ํ๋ ๊ฐ์ ์์์ ์ด์ง ์์ต๋๋ค.
var id = UO.Self();
if (Truth(id != 0))
{
UO.AddObject("statSubject", id);
var direct = UO.GetStr(id);
var byName = UO.GetStr("statSubject");
UO.Print("Direct: " + Convert.ToString(direct) + "; alias: " + Convert.ToString(byName));
}
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 [GetStr]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Strength:bridge.Strength.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.StrengthAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetStrength:bridge.GetStrength(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Strength:bridge.Strength.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getstr": return new InjectionValue(arguments.Length > 0 ? bridge.GetStrength(Arg(0)) : bridge.Strength);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetStrength();์บ๋ฆญํฐ์ ํ์ฌ ํ์(Strength, Str)๋ฅผ ์ฝ์ด์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ํ์ฌ ํต๊ณ ํฌ์ธํธ, 0..65535; ๋ฐฑ๋ถ์จ, ID, ์คํฌ, ์ ๊ธ ๋ชจ๋ ๋๋ bool๊ฐ ์๋๋๋ค. 0๋ ๋๋ฝ/์ญ์ ๋ ๋ฌธ์ ๋๋ ์ ๊ทผํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๊ธฐ๋ ํฉ๋๋ค. == true๊ฐ ์๋ ์์น ์๊ตฌ ์ฌํญ๊ณผ ๋น๊ตํ์ญ์์ค. ์ด๋ ์คํ ํ๋๋ ์์ ์์ด ๋ณด์ฅ๋ ๊ธฐ๋ณธ ๊ฐ์ด ์๋๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- Player๋ฅผ ์ฝ์ต๋๋ค.Strength Player๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์กด์ฌํ๋ ์ฃฝ์ ์บ๋ฆญํฐ๋ ์ ๊ฑฐ๋ ๊ฐ์ฒด๊ฐ ์๋๋๋ค. ์คํ ์ HP, ๋ง๋, ์ฒด๋ ฅ์ผ๋ก ๊ณ์ฐ๋์ง ์์ต๋๋ค.
- GetStr/GetInt/GetDex ObjID๋ฅผ ์๋ฝํฉ๋๋ค. PlayerMobile ๋ฐ์ดํฐ๋ self์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ฅธ serial - 0์ ๊ฒฝ์ฐ, ๋ก๋๋ mobile์ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ํน์ฑ์ ๋์ฒด๋๊ฑฐ๋ ์ถ์ธก๋์ง ์์ต๋๋ค.
- Invoke๋ ์คํฌ๋ฆฝํธ๋ก ๋๊ธฐ๋ฅผ ์ทจ์ํ๋ ๊ธฐ๋ฅ์ ํตํด ๊ฒ์ ์คํธ๋ฆผ์์ ์ฝ๊ธฐ๋ฅผ ์ํํฉ๋๋ค. ์ํ๋ฅผ ์ฟผ๋ฆฌํ์ง ์์ผ๋ฉฐ, ๋์์ ์ด์ง ์์ผ๋ฉฐ, ํจํท์ ๋ณด๋ด์ง ์์ผ๋ฉฐ, ํน์ฑ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ ์ง์ฐ์ ์ถ๊ฐํ์ง ์์ต๋๋ค.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
UO.Str(),UO.Strength(),UO.GetStr(),UO.GetStrength().
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetStrength();
UO.Print("GetStrength: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- value๋ ์ซ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ณํํฉ๋๋ค.ToString ์ก์ง์ฉ์ผ๋ก ํฌ๋งทํฉ๋๋ค. ๋ ผ์์ด๋ ์บ๋ฆญํฐ ํ๋์ด ์์ต๋๋ค.
var value = UO.GetStrength();
UO.Print("Strength: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ณ๋์ 1000 ms ์ ํ; UO.Wait ์์์ ์ถ๊ฐ๋์์ต๋๋ค. Change=after-before๋ ์์, 0 ๋๋ ์์์ผ ์ ์์ต๋๋ค. ๊ทธ ์์ฒด๋ก๋ ๋ชจ๋ ์ค๊ฐ ์ ๋ฐ์ดํธ์ ์๋ ์ข ๋ฃ๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.GetStrength();
await Delay(1000);
var after = UO.GetStrength();
var change = after - before;
UO.Print("Change: " + Convert.ToString(change));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์=80๋ ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋ ์๊ตฌ ์ฌํญ์ ์์ ๋๋ค. AttributeAtLeast(์ต์)๋ ๋๋ฝ๋ ๋ฌธ์๋ฅผ ๊ฑฐ๋ถํ๊ณ ํน์ฑ์ ํ ๋ฒ ์ฝ๊ณ bool๋ฅผ ๋ฐํํฉ๋๋ค: 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(Truth(AttributeAtLeast(80)) == true))
{
UO.Print("Requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic AttributeAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.GetStrength();
return value >= minimum;
}
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 [GetStrength]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Strength:bridge.Strength.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.StrengthAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetTitle(object? objID);ํด๋ผ์ด์ธํธ์๊ฒ ์๋ ค์ง ์บ๋ฆญํฐ์ ์งํจ(์: ์ด๋ฆ ๋ค์ ์ง์ ๋๋ ์๋ช )์ ์ฝ์ต๋๋ค.
-
objIDโ ํ์ serial/ID ๊ฐ์ฒด. type๋ ์๋๊ณ cliloc๋ ์๋๋๋ค. int, 10์ง์/16์ง์ ๋ฌธ์์ด, self, backpack, lasttarget, finditem ๋๋ ์ด๋ฆ AddObject๋ฅผ ํ์ฉํฉ๋๋ค. 0๋ ๊ฐ์ฒด๊ฐ ์์์ ์๋ฏธํฉ๋๋ค.
string โ ๋ชจ๋ฐ์ผ์ฉ ์ ๋ชฉ ํ๋์ ํ ์คํธ์ ๋๋ค. ์ ๋ชฉ์ ์ ์ ์๊ฑฐ๋ ๊ฐ์ฒด๊ฐ ๋ฌธ์๊ฐ ์๋๊ฑฐ๋ ID๊ฐ ๋๋ฝ๋ ๊ฒฝ์ฐ ๋น ๋ฌธ์์ด์ ๋๋ค. serial, ์ ์ฒด ์ด๋ฆ ๋๋ ์์ฑ ๋ฐฐ์ด์ด ์๋๋๋ค. GetAltName์ GetTitle์ ๋์ผํ ํ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ํธ์ถ ์์ฒด๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์๋ฒ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ผ๋ฉฐ ๋จ์ผ ํด๋ฆญ์ ๋ณด๋ด์ง ์์ต๋๋ค. ์ด๋ฆ/์งํจ์ ์์ฒญํ๋ ค๋ฉด ClickOnObject๋ง ์ฌ์ฉํ์ธ์. ์๋ต์ ๋น๋๊ธฐ์ ์ผ๋ก ์ต๋๋ค.
- ๊ธฐ์กด ๋ฌธ์์๋ ๋น ๋ฌธ์์ด๋ ํ์ฉ๋ฉ๋๋ค. Exists ๊ฒ์ฌ๋ ๊ฐ์ฒด๊ฐ ๋ก๋๋์๋์ง ์ฌ๋ถ๋ผ๋ ๋ ๋ค๋ฅธ ์ง๋ฌธ์ ๋ตํฉ๋๋ค.
- ์ด ๊ตฌํ์์๋ ๋์ฒด ์ด๋ฆ์ด ์บ๋ฆญํฐ์ ์ ๋ชฉ ํ๋์ ๋งคํ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetTitle("self");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ObjID=self โ ํ์ฌ ํด๋ผ์ด์ธํธ์ ๋ฌธ์์ ๋๋ค.
- ์ ๋ชฉ์๋ ์ ๋ชฉ๋ง ํฌํจ๋ฉ๋๋ค. ๋น ํ๋๋ ์คํฌ๋ฆฝํธ ์ค๋ฅ๋ฅผ โโ์๋ฏธํ์ง ์์ต๋๋ค.
var title = UO.GetTitle("self");
UO.Print(title);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ObjID=id โ ๋ง์ง๋ง ๋์์ serial GetName์ ์ ๋ชฉ์ ๋ฐ๋ก ์ฝ์ต๋๋ค.
- ํญ๋ชฉ ๋์์๋ ์ ๋ชฉ ํ๋๊ฐ ์์ผ๋ฉฐ ๋น ๋ฌธ์์ด์ ์ ๊ณตํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
var title = UO.GetTitle(id);
if (Truth(title != ""))
{
UO.Print(UO.GetName(id) + " " + title);
}
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 350 โ ํ ๋ฒ ํด๋ฆญํ ํ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ผ์ ์ค์ง๋๋ ์; ์ด๋ getter ๋งค๊ฐ๋ณ์๊ฐ ์๋๋๋ค.
- ์๋ฒ๊ฐ ๋์ค์ ์๋ตํ ์๋ ์๊ณ ์์ ๊ถ์ ์ ์กํ์ง ์์ ์๋ ์์ต๋๋ค. ๋น ๋ฌธ์์ด ์ฒ๋ฆฌ๋ฅผ ์ ์งํฉ๋๋ค.
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.ClickOnObject(id);
UO.Wait(350);
UO.Print(UO.GetTitle(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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTitle:bridge.GetTitle(Arg(0, bridge.Self)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0, bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "gettitle": return new InjectionValue(bridge.GetTitle(Arg(0, bridge.Self)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetWeight();์บ๋ฆญํฐ์ ์ํ ์นด์ดํฐ(ํ์ฌ ๋์ ๋ฌด๊ฒ)๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ ๋์ ํ์ฌ ๋ฌด๊ฒ, ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ 0..65535. 0๋ ์ค์ ๊ฐ์ด๊ฑฐ๋, ๋ฐ์ดํฐ๊ฐ ์๊ฑฐ๋, ๋๋ฝ/ํ๊ดด๋ ํ๋ ์ด์ด์ผ ์ ์์ต๋๋ค. ์ด๋ bool, ID ๋๋ type๊ฐ ์๋ ์๋์ ๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋๋ผ ํ๋์ ๋จ์๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด ๋ช ๋ น์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณตํ์ง ์์ผ๋ฉฐ ๋ฐฐ์ด์ ๋ฐํํ์ง ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.Weight ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- Weight๋ ์๋ฒ๊ฐ ๋ณด๊ณ ํ ์ด ๋ฌด๊ฒ๋ฅผ ๋๋ก ์ฝ์ต๋๋ค. ๊ธ์ก์ ํฌํจ๋๋ ์ ์ฒด, ์ฅ๋น ๋ฐ ๊ฐ๋ฐฉ์ ๋ฌด๊ฒ๋ ์ค๋์ ๊ท์น์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค. ํ์ ์ปจํ ์ด๋๋ฅผ ์ดํด๋ณด๊ฑฐ๋ ํ๋ชฉ ์ค๋์ ํฉ์ฐํ๊ฑฐ๋ ๋ซํ ๊ฐ๋ฐฉ์ ์ ๋ฐ์ดํธํ์ง ์์ต๋๋ค. ์ด๋ ๊ฐ๋ณ ํญ๋ชฉ์ Weight ์์ฑ๋ ์๋๊ณ ํญ๋ชฉ ๊ฐ์๋ ์๋๋๋ค.
- CharacterStatus๋ ์ ๋ฐ์ดํธํ๊ธฐ ์ ์ ํ์ํ ๋ณธ๋ฌธ์ ํ์ธํฉ๋๋ค. Weight๋ ์์ฒด ํ์ฅ ์ํ์ธ ์ฌ๋กฏ - type 3, Luck - type 4, ์๋ฒ WeightMax - type 5์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ํ์ ์นด์ดํฐ๊ฐ ์๋ ์ปดํฉํธ/์ค๋๋ ํจํค์ง๋ ์ด์ ์บ์๋ฅผ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค. ์ ํ๋ ์ด์ด๋ ์ฒ์๋ถํฐ ์์๋ฉ๋๋ค. ํตํ๋ ์๋ก์ด ์ํ๋ฅผ ๋ฐ์๋ค๋ ๊ฒ์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
- ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค. C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetWeight();
UO.Print("GetWeight: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- value๋ ์์ ์ ๋ฌธ์์ ๋ํ ์ธ์ ์๋ ํธ์ถ์ ํ ๋ฒ ์ ์ฅํฉ๋๋ค. Convert.ToString๋ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ก๊ทธ ๋ฒํธ์ ํ์์ ์ง์ ํฉ๋๋ค.
var value = UO.GetWeight();
UO.Print("Weight: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UO.Wait(500)๋ 500 ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ ํ๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ฐจ์ด๋ ์์, 0 ๋๋ ์์์ผ ์ ์์ต๋๋ค. ์ค๊ฐ ์ ๋ฐ์ดํธ ๋ฐ ์บ๋ฆญํฐ ๋ณ๊ฒฝ์ ์๋ต๋ ์ ์์ต๋๋ค. ์ผ์ ์ ์ง๊ฐ ๊ทธ ์์ ๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.GetWeight();
await Delay(500);
var after = UO.GetWeight();
var difference = after - before;
UO.Print("Counter change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- CanCarry(extra)๋ ์คํค์ ์ถ๊ฐ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํฉ๋๋ค. 10๋ ์์์ด๋ฉฐ ์คํ ๊ฐ์๋ ์๋๋๋ค. ์์ ์ถ๊ฐ, ํ๋ ์ด์ด ์์ ๋๋ ์ต๋ <= 0๋ฅผ ๊ฑฐ๋ถํ๊ณ ํ์ฌ ๋ฌด๊ฒ์ ์ ํ์ ์ฝ์ ๋ค์ bool๋ฅผ ๋ฐํํฉ๋๋ค: true ๋๋ false๋ฅผ ์ถ๊ฐ <= ์ต๋ - ํ์ฌ๋ก ๋ฐํํฉ๋๋ค. ๋นผ๊ธฐ๋ ํ์ฌ + ์ถ๊ฐ ์ค๋ฒํ๋ก๋ฅผ ๋ฐฉ์งํฉ๋๋ค. ์ค๋ฒ๋ก๋๋๋ฉด extra=0์ ๊ฒฝ์ฐ์๋ ๊ฒฐ๊ณผ๋ false์ ๋๋ค. ์ด๋ ์๋ฒ ํ์ธ์ด ์๋ ๋ก์ปฌ ํ๊ฐ์ ๋๋ค. ์ฝ๊ธฐ๋ ์์์ ์ด์ง ์์ผ๋ฉฐ 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()
{
if (Truth(Truth(CanCarry(10)) == true))
{
UO.Print("Local check passed");
}
else
{
UO.Print("Local check failed or data unavailable");
}
return null;
}
dynamic CanCarry(dynamic extra)
{
if (Truth(extra < 0) || Truth(UO.Self() == 0))
{
return false;
}
var current = UO.GetWeight();
var maximum = UO.MaxWeight();
if (Truth(maximum <= 0))
{
return false;
}
return extra <= maximum - current;
}
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.Weight. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Weight:bridge.Weight.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Weight() => bridge.Weight;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetYellowBar(object? id);๋ ธ๋์ ์ฒด๋ ฅ ๋ฐ ํ๋๊ทธ mobile๋ฅผ ํ์ธํฉ๋๋ค.
-
idโ ํน์ ๊ฐ์ฒด์ ํ์ serial/ID: int, 16์ง์ ๋ฌธ์์ด ๋๋ ๋ณ์นญ self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse ๋๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ graphic/type์ด ์๋๋๋ค. ์ง์ ๋์ง ์์ ์ด๋ฆ์ 0๋ก ํด์๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ์ ๋์์ ์ด์ง ์์ต๋๋ค. ์ธ์๋ ํ์์ ๋๋ค. ์ง์ self๋ฅผ ํต๊ณผํ์ธ์.
int 1 - ๋ก๋๋ mobile์๋ IsYellowHits ์์ฑ์ด ์์ต๋๋ค. int 0 - ์์ฑ์ด ๋๋ฝ๋์๊ฑฐ๋ ๊ฐ์ฒด๊ฐ mobile์ด ์๋๊ฑฐ๋ ์ ์ ์๊ฑฐ๋ ์ญ์ ๋์์ต๋๋ค. ์ด๋ ํ ๋ง ์์ IDE ๋๋ ์๋ HP์ด ์๋ ์๋ฒ/ํธํ ํ๋๊ทธ์ ๋๋ค. ํ๋๊ทธ๊ฐ ์๋ค๊ณ ํด์ ์ทจ์ฝ์ฑ์ด ์ ์ฆ๋๋ ๊ฒ์ ์๋๋๋ค. ์๋ฒ๊ฐ ๋ณดํธ๋ฅผ ๋ค๋ฅด๊ฒ ๋ํ๋ผ ์ ์์ต๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก์ปฌ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค. ์๋ฒ์ ๋ํ ์์ฒญ๋ ์๊ณ ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ ์ด๋ํ ํ์๋ ์์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ ์ฝ๋ ์๊ฐ์ ๊ฐ๋ฆฌํจ๋ค. UO.Wait ๋๋ ๋ค๋ฅธ ์์ ํ์ ๊ฐ์ฒด์ ํด๋น ํ๋๊ทธ๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- ์ด๊ฒ์ ํ ๋ง ์์ IDE ๋๋ ์๋ HP์ด ์๋ ์๋ฒ/ํธํ ํ๋๊ทธ์ ๋๋ค. ํ๋๊ทธ๊ฐ ์๋ค๊ณ ํด์ ์ทจ์ฝ์ฑ์ด ์ ์ฆ๋๋ ๊ฒ์ ์๋๋๋ค. ์๋ฒ๊ฐ ๋ณดํธ๋ฅผ ๋ค๋ฅด๊ฒ ๋ํ๋ผ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetYellowBar("self");
UO.Print("GetYellowBar: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- self ์ธ์๋ ํด๋น ๋ฌธ์๋ฅผ ๋ช ์์ ์ผ๋ก ์ ํํฉ๋๋ค. ์ํ - 1/0์๋ง ํด๋น๋ฉ๋๋ค.
- ์ด๊ฒ์ ํ ๋ง ์์ IDE ๋๋ ์๋ HP์ด ์๋ ์๋ฒ/ํธํ ํ๋๊ทธ์ ๋๋ค. ํ๋๊ทธ๊ฐ ์๋ค๊ณ ํด์ ์ทจ์ฝ์ฑ์ด ์ ์ฆ๋๋ ๊ฒ์ ์๋๋๋ค. ์๋ฒ๊ฐ ๋ณดํธ๋ฅผ ๋ค๋ฅด๊ฒ ๋ํ๋ผ ์ ์์ต๋๋ค.
var state = UO.GetYellowBar("self");
var hp = UO.GetHP("self");
UO.Print("Yellow flag: " + Convert.ToString(state));
UO.Print("Known HP: " + Convert.ToString(hp));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- IsNpc ์ ๋ชฉ ๋ฐ ์ ์ ์๋ ๊ฐ์ฒด๋ ์ ์ธ๋ฉ๋๋ค. target์ ๋ณ๊ฒฝ๋๋ lasttarget์ ๋ํ ์ค์๊ฐ ์ฐธ์กฐ๊ฐ ์๋ ๋จ์ผ serial์ ์ ์ฅํฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ IsYellowHits ํ๋๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์ ์ ํ ์ํ๋ฅผ ์์ ํ ํ์๋ง ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var state = UO.GetYellowBar(target);
UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
}
else
{
UO.Print("No loaded mobile selected");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UO.Wait(500) โ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ผ์ ์ค์ง๋ฉ๋๋ค. ์ดํ์๋ mobile์ด ์ฌ์ ํ ์กด์ฌํ๋์ง ๋ณ๋๋ก ํ์ธํฉ๋๋ค.
- ๋ ์ด๋ฏธ์ง๊ฐ ๋น๊ต๋ฉ๋๋ค. ์ค๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ด ๋๋ฝ๋ ์ ์์ผ๋ฉฐ ์ด๋ ์๋ฒ ์ด๋ฒคํธ์ ๋ํ ์ง์์ ์ธ ๊ตฌ๋ ์ด ์๋๋๋ค.
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 target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var before = UO.GetYellowBar(target);
await Delay(500);
if (Truth(UO.IsNPC(target)))
{
var after = UO.GetYellowBar(target);
if (Truth(before != after))
{
UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
}
}
else
{
UO.Print("Mobile left the local world");
}
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: id (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetYellowBar. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetYellowBar:bridge.GetYellowBar(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetYellowBar(InjectionValue id) => bridge.GetYellowBar(GetObject(id));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.Gold();ํ์ฌ ์บ๋ฆญํฐ์ ์ํ์์ ๊ณจ๋์ ์์ ์ฝ์ด์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int/double๋ ์์๊ฐ ์๋ ํฉ 0..4294967295์ ๋๋ค. 2147483647 int๊น์ง double(Double) ์๊น์ง ๋ฐํ๋๋ฉฐ, ์ด๋ 32๋นํธ ๋ถํธ ์๋ ์ ์๋ฅผ ์ ํํ๊ฒ ๋ํ๋ ๋๋ค. 0์ ๋ํ ํ์ฌ ์ญ์ ์ทจ์๋ ํ๋ ์ด์ด๋ ๋ฐ์ ๊ธ์ก์ด ์์์ ์๋ฏธํฉ๋๋ค. bool, ID, ์คํ ์ ๋๋ ๋ฐฑํฉ/๋ฑ ํฌ ๋ฐ์ดํจ์ค๊ฐ ์๋๋๋ค.
- ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค. CharacterStatus(0x11)์์ Player.Gold ์บ์๋ฅผ ์ฝ์ต๋๋ค. ์๋ฒ๋ ์นด์ดํฐ์ ์ด๋ค ๊ธ์ด ํฌํจ๋์ด ์๋์ง ๊ฒฐ์ ํฉ๋๋ค. ํ์ ๊ฐ๋ฐฉ์ ๋ค์ง๊ฑฐ๋ ์ํ ์๊ณ ๋ฅผ ์๊ตฌํ์ง ์์ต๋๋ค. ์์/ํ๊ดด๋ ํ๋ ์ด์ด - 0; ์ ๋ น ์กด์ฌ๋ ์ํ ์์ ์ ์งํ ์ ์์ต๋๋ค.
- ReadGoldValue ๋ธ๋ฆฌ์ง๋ฅผ ํ ๋ฒ ์ฝ์ต๋๋ค.Gold. ์ด์ C# ๋ธ๋ฆฌ์ง๋ Int32 ์๋ช ์ ์ ์งํ๊ณ UInt32 ๋นํธ๋ฅผ ์ ์กํฉ๋๋ค. ํ์ธ๋์ง ์์ ๋ณํ์ ๋ถํธ ์๋ ํฉ๊ณ๋ฅผ ๋ณต์ํฉ๋๋ค. ์ ์ ์์ int๋ก, ๋ง์ ์์ double๋ก ๋ณํฉ๋๋ค. ๊ฐ์ฅ ์ค์ํ ๋นํธ๊ฐ ๋ ์ด์ ์์ก์ ๋ง์ด๋์ค๋ก ๋ฐ๊พธ์ง ์์ต๋๋ค. ๋ณํ์ ๋ก์ปฌ์ด๋ฉฐ ํจํค์ง๊ฐ ์์ต๋๋ค.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.Gold();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- amount๋ ํ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ณํํฉ๋๋ค.ToString ์ก์ง์ฉ์ผ๋ก ํฌ๋งทํฉ๋๋ค. ๊ธ์ ์ถ๊ตฌํ๊ฑฐ๋ ์ด๋ฐํ๊ฑฐ๋ ์๋นํ์ง ์์ต๋๋ค.
var amount = UO.Gold();
UO.Print("Status gold: " + Convert.ToString(amount));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ๊ฒฉ=3000000000.0๋ ํ๋๊ฐ ์๋ ๊ฐ๊ฒฉ ์์์ ๋๋ค. CanAfford(๊ฐ๊ฒฉ)์ ์์ ๊ฐ๊ฒฉ์ ๊ฑฐ๋ถํ๊ฑฐ๋ ํ๋ ์ด์ด๊ฐ ์๋ ๊ฒฝ์ฐ ๊ธ์ก์ ํ ๋ฒ ์ฝ๊ณ bool๋ฅผ ๋ฐํํฉ๋๋ค. true ๋๋ ๊ธ์ก >= ๊ฐ๊ฒฉ์ธ ๊ฒฝ์ฐ false. ๊ธ์ก ์์ฒด๋ bool๊ฐ ์๋๋๋ค. ์ด ๊ธฐ๋ฅ์ ์๋์ ์์ ํ ์ ์๋์ด ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var price = 3000000000.0;
if (Truth(Truth(CanAfford(price)) == true))
{
UO.Print("Local balance is sufficient");
}
else
{
UO.Print("Local check failed");
}
return null;
}
dynamic CanAfford(dynamic price)
{
if (Truth(price < 0) || Truth(UO.Self() == 0))
{
return false;
}
var amount = UO.Gold();
return amount >= price;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ /ํ๋ UO.Wait(500) ๋ฐ๋ฆฌ์ด๋ก ๊ตฌ๋ถ๋ฉ๋๋ค. ์ฐจ์ด=์ดํ-์ด์ ์ ์๊ณ ๊ฐ ๊ฐ์ํ ๋ ์์์ผ ์ ์์ต๋๋ค. ์ด๋ ๊ณ ์ ๋ ๋ถํธ ์๋ ์นด์ดํฐ ์ค๋ฒํ๋ก๊ฐ ์๋๋๋ค. ์ค๊ฐ ์ ๋ฐ์ดํธ ๋ฐ ์บ๋ฆญํฐ ๋ณ๊ฒฝ ์ฌํญ์ด ๋๋ฝ๋ ์ ์์ต๋๋ค.
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.Gold();
await Delay(500);
var after = UO.Gold();
var difference = after - before;
UO.Print("Balance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ReadGoldValue:ReadGoldValue().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "gold": return ReadGoldValue();ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.HP();๋ก์ปฌ ๋ชจ๋ธ์์ ํ์ฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int๋ bool๋ ๋ฐฑ๋ถ์จ์ด ์๋ Hits ํ๋์ ๊ฐ์ ๋๋ค. 0๋ ์ค์ ๊ฐ์ด๊ฑฐ๋ ๋๋ฝ๋ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค. ์ต๋๊ฐ 0์ ์ ์๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋์ mobile์ ๊ฒฝ์ฐ ์๋ฏธ๊ฐ ์๋ ค์ง์ง ์์์ ์ ์์ต๋๋ค. HP/HitsMax์๋ ์ ํํ ํฌ์ธํธ ๋์ ์๋์ ์ธ ์๋ฒ ๊ท๋ชจ๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค. HP=0๋ ์ฌ๋ง์ ์ฆ๋ช ํ์ง ์์ต๋๋ค. ์ด์ ๋ํ Dead/IsDead์ด ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ์ํ๋ฅผ ์ด์ง ์์ผ๋ฉฐ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ์์ฒญํ์ง ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ์ด๋ฏธ ๋ก๋๋ ๋ฐ์ดํฐ๋ง ์ฝ์ต๋๋ค. ํน์ฑ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ ๋ณ๋์ ๋ ์์ ๋๋ค. Exists์ ๋ค์ ๋์ ์ฌ์ด์ ์ธ์์ด ๋ฐ๋ ์๋ ์์ต๋๋ค. ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ ์์์ฑ ์ค๋ ์ท์ ํ์ฑํ์ง ์์ต๋๋ค.
- ๊ฐ์ฒด๋ฅผ ์ฝ์ ๋ World.Get์ ๋๋ฝ๋ ๋๋ IsDestroyed๋ฅผ ๊ฑฐ๋ถํ๊ณ ๊ฒฐ๊ณผ๋ 0์ ๋๋ค. HP/HitsMax๋ ์ด๋ฌํ ํ๋๊ฐ ์๋ ํญ๋ชฉ์ ํฌํจํ์ฌ ์ํฐํฐ์์ ์ฝ์ต๋๋ค. Mana/Stamina - ๋ชจ๋ฐ์ผ ์ ์ฉ์ ๋๋ค. ๋ ผ์ ์์ด self์ ์ฝ์ผ์ธ์. ๋งค๊ฐ๋ณ์๊ฐ ์๋ ๋์ผํ ์ด๋ฆ์ ๋ณํ์ด ๋ฐ๋์ ID๋ฅผ ํฌํจํ ๋ณํ์ ๊ฐ์ง ํ์๋ ์์ต๋๋ค. ์๋ช ์ ์ฐธ์กฐํ์ธ์.
- ์ธ์ ์์ด ์ฝ์ผ๋ฉด ๋๋ฝ๋๊ฑฐ๋ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋ํด 0๋ ๋ฐํ๋ฉ๋๋ค. ์ด๋ World.Get์ ํตํ ํ์๋ฟ๋ง ์๋๋ผ ์ง์ Mana/Stamina ๋ฐ ์ต๋๊ฐ์ ์ ์ฉ๋ฉ๋๋ค. ํ์ฌ ์ฃฝ์ ์บ๋ฆญํฐ๋ ๊ฐ์ ์ ์งํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.HP();
UO.Print("HP: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ก ํ์๋ฉ๋๋ค. ๊ฐ์ ํ๋์ ์ซ์๋ฅผ ์ ์ฅํ๊ณ ๋ณํํฉ๋๋ค.ToString๋ ๋ฉ์์ง์ฉ์ผ๋ก๋ง ๋ณํํฉ๋๋ค.
var value = UO.HP();
UO.Print("HP: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ํ๋์ ์ ์ฉ๋ ์๊ณ๊ฐ ๋๋ ๊ณ์ฐ์ด ํ์๋ฉ๋๋ค. ์กฐ๊ฑด์ ์ซ์๋ ์๋ฒ ์ ํ์ด ์๋ ์์ ์ค์ ์ ๋๋ค. ์ต๋๊ฐ์ผ๋ก ๋๋๊ธฐ ์ ์ ์์ฑ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.HP();
var maximum = UO.GetMaxHP();
if (Truth(maximum > 0) && Truth(value * 100 / maximum < 50))
{
UO.Print("Health below half of the known maximum");
}
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 ํ์์ด ์์ต๋๋ค. ReadValue ๋งค๊ฐ๋ณ์๊ฐ ์์ผ๋ฉด self๋ฅผ ์ฝ์ต๋๋ค. ๋ ํธ์ถ์ 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 = ReadValue();
await Delay(1000);
var after = ReadValue();
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
return null;
}
dynamic ReadValue()
{
return UO.HP();
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [HP]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetHP:bridge.GetHP(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.GetHP(bridge.Self)API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
UO.Hidden
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Hidden();
int UO.Hidden(object? id);์บ๋ฆญํฐ์ ์คํ ์ค๋ฅผ ํ ์คํธํฉ๋๋ค.
-
idโ ํ์๋ ํ์์ ์ ํ์ ๊ฐ์ฒด: serial ์ซ์/16์ง์ ๋ฌธ์์ด, self, lasttarget ๋๋ ๋ฑ๋ก๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ type๊ฐ ์๋๋๋ค. ๋ ผ์ ์์ด self์ ์ฝ์ผ์ธ์. ์ผ๋ถ ํ์์ ์ ์ ์๋ ํ ์คํธ๋ก ์ธํด ๋ณํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ ํํ๊ธฐ ์ ์ ์ด๋ฆ์ ํ์ธํ์ธ์.
์ซ์ ํ๋๊ทธ int: 1(์กฐ๊ฑด ์ถฉ์กฑ), 0(์กฐ๊ฑด ์ถฉ์กฑ๋์ง ์์). ์ด๊ฒ์ ์ซ์ ํ๋๊ทธ์ ๋๋ค. C#์์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์ธ์!= 0 ๋๋ ๊ฒฐ๊ณผ == 0์ ๋๋ค. int์ true/false ๋ฐ if(๊ฒฐ๊ณผ)๋ฅผ ์ง์ ๋น๊ตํ๋ ๊ฒ์ ํ์ฉ๋์ง ์์ต๋๋ค. 1 - mobile์๋ IsHidden์ด ์๊ณ , 0์๋ ํ๋๊ทธ๊ฐ ์๊ฑฐ๋ mobile๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ ๋ฒฝ ๋ค์ ๊ฐ์์ฑ์ด ์๋ ์๋ฒ ํ๋๊ทธ์ ๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก์ปฌ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค. ๋์์ ์ด์ง ์๊ณ , ์ํ๋ฅผ ์์ฒญํ์ง ์์ผ๋ฉฐ, ํ๋๊ทธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ, ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค. ์ญ์ ๋ ๊ฐ์ฒด๋ ํด๋น ํญ๋ชฉ์ด ์ฌ์ ์์ ์ญ์ ๋๊ธฐ ์ ์๋ ๋๋ฝ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ ๋ณ๋์ ๋ ์์ ๋๋ค. Exists์ ๋ค์ ๋์ ์ฌ์ด์ ์ธ์์ด ๋ฐ๋ ์๋ ์์ต๋๋ค. ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ ์์์ฑ ์ค๋ ์ท์ ํ์ฑํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Hidden();
UO.Print("Hidden: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ๊ดํธ๋ self๋ก ์ฝ์ต๋๋ค. active๋ ๊ฒฐ๊ณผ๋ฅผ ํ ๋ฒ ์ ์ฅํฉ๋๋ค. true ๋ฐ false๋ ๋ ๊ฐ์ ๋ถ๊ธฐ๋ฅผ ์ ์ํฉ๋๋ค. Print ์์ ๋ฉ์์ง๋ง ํ์๋ฉ๋๋ค.
var active = UO.Hidden();
if (Truth(Truth(active) == true))
{
UO.Print("State is active");
}
else
{
UO.Print("State is inactive or unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- lasttarget โ ์ด์ ์ ์ ํํ ๊ฐ์ฒด. Exists๋ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค. obj๊ฐ ์ ์ผํ ๋งค๊ฐ๋ณ์ ReadState์ ๋๋ค. ์ด ํจ์๋ ์์ ์์ด ๋ช ๋ น ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ํด๋น ์ ์๋ ๋ณต์ฌ๋ ์ฝ๋์ ํฌํจ๋์ด ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Exists("lasttarget")))
{
var observed = ReadState("lasttarget");
UO.Print("State 1/0: " + Convert.ToString(observed));
}
return null;
}
dynamic ReadState(dynamic obj)
{
return UO.Hidden(obj);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ๋ ๋ฒ์ ํธ์ถ์ self, UO.Wait(500)๋ฅผ ์ฝ๊ณ 500 ๋ฐ๋ฆฌ์ด๋ฅผ ์ค์ ํฉ๋๋ค. ๋ ์ด๋ฏธ์ง๊ฐ ๋น๊ต๋ฉ๋๋ค. ์ค๊ฐ ์ ํ์ ๊ฑด๋๋ธ ์ ์์ต๋๋ค. ๋์๋ ๊ธฐ๋ค๋ฆผ์ ์์ต๋๋ค.
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.Hidden();
await Delay(500);
var after = UO.Hidden();
if (Truth(before != after))
{
UO.Print("State changed: " + Convert.ToString(before) + " -> " + 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์ ์ฌ์ฉํ์ธ์.
UO.Hidden() โ UO.Hidden()
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Hidden. -
InjectionScript.Runtime.InjectionApiUO.Hidden:Hidden("self").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Hidden() => Hidden("self");
UO.Hidden(id) โ UO.Hidden(Integer)
๋งค๊ฐ๋ณ์: id (Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Hidden. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Hidden:bridge.Hidden(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Hidden(int id) => bridge.Hidden(id);
UO.Hidden(id) โ UO.Hidden(String)
๋งค๊ฐ๋ณ์: id (Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Hidden. -
InjectionScript.Runtime.InjectionApiUO.Hidden:Hidden(GetObject(idText)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(idText).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Hidden(string idText) => Hidden(GetObject(idText));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Int();์บ๋ฆญํฐ์ ํ์ฌ ์ง๋ฅ(Intelligence, INT)์ ์ฝ์ด์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ํ์ฌ ํต๊ณ ํฌ์ธํธ, 0..65535; ๋ฐฑ๋ถ์จ, ID, ์คํฌ, ์ ๊ธ ๋ชจ๋ ๋๋ bool๊ฐ ์๋๋๋ค. 0๋ ๋๋ฝ/์ญ์ ๋ ๋ฌธ์ ๋๋ ์ ๊ทผํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๊ธฐ๋ ํฉ๋๋ค. == true๊ฐ ์๋ ์์น ์๊ตฌ ์ฌํญ๊ณผ ๋น๊ตํ์ญ์์ค. ์ด๋ ์คํ ํ๋๋ ์์ ์์ด ๋ณด์ฅ๋ ๊ธฐ๋ณธ ๊ฐ์ด ์๋๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- Player๋ฅผ ์ฝ์ต๋๋ค.Intelligence Player๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์กด์ฌํ๋ ์ฃฝ์ ์บ๋ฆญํฐ๋ ์ ๊ฑฐ๋ ๊ฐ์ฒด๊ฐ ์๋๋๋ค. ์คํ ์ HP, ๋ง๋, ์ฒด๋ ฅ์ผ๋ก ๊ณ์ฐ๋์ง ์์ต๋๋ค.
- GetStr/GetInt/GetDex ObjID๋ฅผ ์๋ฝํฉ๋๋ค. PlayerMobile ๋ฐ์ดํฐ๋ self์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ฅธ serial - 0์ ๊ฒฝ์ฐ, ๋ก๋๋ mobile์ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ํน์ฑ์ ๋์ฒด๋๊ฑฐ๋ ์ถ์ธก๋์ง ์์ต๋๋ค.
- Invoke๋ ์คํฌ๋ฆฝํธ๋ก ๋๊ธฐ๋ฅผ ์ทจ์ํ๋ ๊ธฐ๋ฅ์ ํตํด ๊ฒ์ ์คํธ๋ฆผ์์ ์ฝ๊ธฐ๋ฅผ ์ํํฉ๋๋ค. ์ํ๋ฅผ ์ฟผ๋ฆฌํ์ง ์์ผ๋ฉฐ, ๋์์ ์ด์ง ์์ผ๋ฉฐ, ํจํท์ ๋ณด๋ด์ง ์์ผ๋ฉฐ, ํน์ฑ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ ์ง์ฐ์ ์ถ๊ฐํ์ง ์์ต๋๋ค.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
UO.Int(),UO.Intelligence(),UO.GetInt(),UO.GetIntelligence().
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Int();
UO.Print("Int: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- value๋ ์ซ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ณํํฉ๋๋ค.ToString ์ก์ง์ฉ์ผ๋ก ํฌ๋งทํฉ๋๋ค. ๋ ผ์์ด๋ ์บ๋ฆญํฐ ํ๋์ด ์์ต๋๋ค.
var value = UO.Int();
UO.Print("Intelligence: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ณ๋์ 1000 ms ์ ํ; UO.Wait ์์์ ์ถ๊ฐ๋์์ต๋๋ค. Change=after-before๋ ์์, 0 ๋๋ ์์์ผ ์ ์์ต๋๋ค. ๊ทธ ์์ฒด๋ก๋ ๋ชจ๋ ์ค๊ฐ ์ ๋ฐ์ดํธ์ ์๋ ์ข ๋ฃ๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.Int();
await Delay(1000);
var after = UO.Int();
var change = after - before;
UO.Print("Change: " + Convert.ToString(change));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์=80๋ ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋ ์๊ตฌ ์ฌํญ์ ์์ ๋๋ค. AttributeAtLeast(์ต์)๋ ๋๋ฝ๋ ๋ฌธ์๋ฅผ ๊ฑฐ๋ถํ๊ณ ํน์ฑ์ ํ ๋ฒ ์ฝ๊ณ bool๋ฅผ ๋ฐํํฉ๋๋ค: 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(Truth(AttributeAtLeast(80)) == true))
{
UO.Print("Requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic AttributeAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.Int();
return value >= minimum;
}
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.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Intelligence:bridge.Intelligence.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "int": return new InjectionValue(bridge.Intelligence);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Intelligence();์บ๋ฆญํฐ์ ํ์ฌ ์ง๋ฅ(Intelligence, INT)์ ์ฝ์ด์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ํ์ฌ ํต๊ณ ํฌ์ธํธ, 0..65535; ๋ฐฑ๋ถ์จ, ID, ์คํฌ, ์ ๊ธ ๋ชจ๋ ๋๋ bool๊ฐ ์๋๋๋ค. 0๋ ๋๋ฝ/์ญ์ ๋ ๋ฌธ์ ๋๋ ์ ๊ทผํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๊ธฐ๋ ํฉ๋๋ค. == true๊ฐ ์๋ ์์น ์๊ตฌ ์ฌํญ๊ณผ ๋น๊ตํ์ญ์์ค. ์ด๋ ์คํ ํ๋๋ ์์ ์์ด ๋ณด์ฅ๋ ๊ธฐ๋ณธ ๊ฐ์ด ์๋๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- Player๋ฅผ ์ฝ์ต๋๋ค.Intelligence Player๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์กด์ฌํ๋ ์ฃฝ์ ์บ๋ฆญํฐ๋ ์ ๊ฑฐ๋ ๊ฐ์ฒด๊ฐ ์๋๋๋ค. ์คํ ์ HP, ๋ง๋, ์ฒด๋ ฅ์ผ๋ก ๊ณ์ฐ๋์ง ์์ต๋๋ค.
- GetStr/GetInt/GetDex ObjID๋ฅผ ์๋ฝํฉ๋๋ค. PlayerMobile ๋ฐ์ดํฐ๋ self์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ฅธ serial - 0์ ๊ฒฝ์ฐ, ๋ก๋๋ mobile์ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ํน์ฑ์ ๋์ฒด๋๊ฑฐ๋ ์ถ์ธก๋์ง ์์ต๋๋ค.
- Invoke๋ ์คํฌ๋ฆฝํธ๋ก ๋๊ธฐ๋ฅผ ์ทจ์ํ๋ ๊ธฐ๋ฅ์ ํตํด ๊ฒ์ ์คํธ๋ฆผ์์ ์ฝ๊ธฐ๋ฅผ ์ํํฉ๋๋ค. ์ํ๋ฅผ ์ฟผ๋ฆฌํ์ง ์์ผ๋ฉฐ, ๋์์ ์ด์ง ์์ผ๋ฉฐ, ํจํท์ ๋ณด๋ด์ง ์์ผ๋ฉฐ, ํน์ฑ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ ์ง์ฐ์ ์ถ๊ฐํ์ง ์์ต๋๋ค.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
UO.Int(),UO.Intelligence(),UO.GetInt(),UO.GetIntelligence().
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Intelligence();
UO.Print("Intelligence: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- value๋ ์ซ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ณํํฉ๋๋ค.ToString ์ก์ง์ฉ์ผ๋ก ํฌ๋งทํฉ๋๋ค. ๋ ผ์์ด๋ ์บ๋ฆญํฐ ํ๋์ด ์์ต๋๋ค.
var value = UO.Intelligence();
UO.Print("Intelligence: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ณ๋์ 1000 ms ์ ํ; UO.Wait ์์์ ์ถ๊ฐ๋์์ต๋๋ค. Change=after-before๋ ์์, 0 ๋๋ ์์์ผ ์ ์์ต๋๋ค. ๊ทธ ์์ฒด๋ก๋ ๋ชจ๋ ์ค๊ฐ ์ ๋ฐ์ดํธ์ ์๋ ์ข ๋ฃ๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.Intelligence();
await Delay(1000);
var after = UO.Intelligence();
var change = after - before;
UO.Print("Change: " + Convert.ToString(change));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์=80๋ ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋ ์๊ตฌ ์ฌํญ์ ์์ ๋๋ค. AttributeAtLeast(์ต์)๋ ๋๋ฝ๋ ๋ฌธ์๋ฅผ ๊ฑฐ๋ถํ๊ณ ํน์ฑ์ ํ ๋ฒ ์ฝ๊ณ bool๋ฅผ ๋ฐํํฉ๋๋ค: 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(Truth(AttributeAtLeast(80)) == true))
{
UO.Print("Requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic AttributeAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.Intelligence();
return value >= minimum;
}
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 [Intelligence]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Intelligence:bridge.Intelligence.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.IntelligenceAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.IsAlive();
int UO.IsAlive(object? value);์ฌ๋ง ํ์ ์ด ์๋ ๋ฌผ์ฒด์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
-
valueโ ํ์๋ ํ์์ ์ ํ์ ๊ฐ์ฒด: serial ์ซ์/16์ง์ ๋ฌธ์์ด, self, lasttarget ๋๋ ๋ฑ๋ก๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ type๊ฐ ์๋๋๋ค. ๋ ผ์ ์์ด self์ ์ฝ์ผ์ธ์. ์ผ๋ถ ํ์์ ์ ์ ์๋ ํ ์คํธ๋ก ์ธํด ๋ณํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ ํํ๊ธฐ ์ ์ ์ด๋ฆ์ ํ์ธํ์ธ์.
์ซ์ ํ๋๊ทธ int: 1(์กฐ๊ฑด ์ถฉ์กฑ), 0(์กฐ๊ฑด ์ถฉ์กฑ๋์ง ์์). ์ด๊ฒ์ ์ซ์ ํ๋๊ทธ์ ๋๋ค: C#์์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์ธ์!= 0 ๋๋ ๊ฒฐ๊ณผ == 0. int์ true/false ๋ฐ if(๊ฒฐ๊ณผ)๋ฅผ ์ง์ ๋น๊ตํ๋ ๊ฒ์ ํ์ฉ๋์ง ์์ต๋๋ค. 1 - ์์ฑ serial์ด ์กด์ฌํ๋ฉฐ ์ฃฝ์ ๊ฒ์ผ๋ก ํ์๋์ง ์์ต๋๋ค. ์ ๋ช ํ ํญ๋ชฉ์ 1๋ ์ ๊ณตํฉ๋๋ค. ์ด๋ mobile ํํฐ๊ฐ ์๋๋๋ค. ์ฃฝ์๊ฑฐ๋ ์์ด์ง ๊ฐ์ฒด๋ 0์ ์ ๊ณตํฉ๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก์ปฌ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค. ๋์์ ์ด์ง ์๊ณ , ์ํ๋ฅผ ์์ฒญํ์ง ์์ผ๋ฉฐ, ํ๋๊ทธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ, ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค. ์ญ์ ๋ ๊ฐ์ฒด๋ ํด๋น ํญ๋ชฉ์ด ์ฌ์ ์์ ์ญ์ ๋๊ธฐ ์ ์๋ ๋๋ฝ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ ๋ณ๋์ ๋ ์์ ๋๋ค. Exists์ ๋ค์ ๋์ ์ฌ์ด์ ์ธ์์ด ๋ฐ๋ ์๋ ์์ต๋๋ค. ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ ์์์ฑ ์ค๋ ์ท์ ํ์ฑํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.IsAlive();
UO.Print("IsAlive: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ๊ดํธ๋ self๋ก ์ฝ์ต๋๋ค. active๋ ๊ฒฐ๊ณผ๋ฅผ ํ ๋ฒ ์ ์ฅํฉ๋๋ค. true ๋ฐ false๋ ๋ ๊ฐ์ ๋ถ๊ธฐ๋ฅผ ์ ์ํฉ๋๋ค. Print ์์ ๋ฉ์์ง๋ง ํ์๋ฉ๋๋ค.
var active = UO.IsAlive();
if (Truth(Truth(active) == true))
{
UO.Print("State is active");
}
else
{
UO.Print("State is inactive or unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- lasttarget โ ์ด์ ์ ์ ํํ ๊ฐ์ฒด. Exists๋ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค. obj๊ฐ ์ ์ผํ ๋งค๊ฐ๋ณ์ ReadState์ ๋๋ค. ์ด ํจ์๋ ์์ ์์ด ๋ช ๋ น ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ํด๋น ์ ์๋ ๋ณต์ฌ๋ ์ฝ๋์ ํฌํจ๋์ด ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Exists("lasttarget")))
{
var observed = ReadState("lasttarget");
UO.Print("State 1/0: " + Convert.ToString(observed));
}
return null;
}
dynamic ReadState(dynamic obj)
{
return UO.IsAlive(obj);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ๋ ๋ฒ์ ํธ์ถ์ self, UO.Wait(500)๋ฅผ ์ฝ๊ณ 500 ๋ฐ๋ฆฌ์ด๋ฅผ ์ค์ ํฉ๋๋ค. ๋ ์ด๋ฏธ์ง๊ฐ ๋น๊ต๋ฉ๋๋ค. ์ค๊ฐ ์ ํ์ ๊ฑด๋๋ธ ์ ์์ต๋๋ค. ๋์๋ ๊ธฐ๋ค๋ฆผ์ ์์ต๋๋ค.
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.IsAlive();
await Delay(500);
var after = UO.IsAlive();
if (Truth(before != after))
{
UO.Print("State changed: " + Convert.ToString(before) + " -> " + 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 [IsAlive]. -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Exists:bridge.Exists(serial). -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases::IsDeadState:IsDeadState(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
serial => serial > 0 && bridge.Exists(serial) != 0 && IsDeadState(serial) == 0 ? 1 : 0๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => getter(bridge.Self)API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [IsAlive]. -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Exists:bridge.Exists(serial). -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases::IsDeadState:IsDeadState(serial). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(value).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
serial => serial > 0 && bridge.Exists(serial) != 0 && IsDeadState(serial) == 0 ? 1 : 0๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
value => getter(GetObject(value))API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.IsDead();
dynamic UO.IsDead(object? objID);์บ๋ฆญํฐ ์ฌ๋ง์ ํ์ธํฉ๋๋ค.
-
objIDโ ํ์๋ ํ์์ ์ ํ์ ๊ฐ์ฒด: serial ์ซ์/16์ง์ ๋ฌธ์์ด, self, lasttarget ๋๋ ๋ฑ๋ก๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ type๊ฐ ์๋๋๋ค. ๋ ผ์ ์์ด self์ ์ฝ์ผ์ธ์. ์ผ๋ถ ํ์์ ์ ์ ์๋ ํ ์คํธ๋ก ์ธํด ๋ณํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ ํํ๊ธฐ ์ ์ ์ด๋ฆ์ ํ์ธํ์ธ์.
์ซ์ ํ๋๊ทธ int: 1(์กฐ๊ฑด ์ถฉ์กฑ), 0(์กฐ๊ฑด ์ถฉ์กฑ ์ ๋จ). ์ด๊ฒ์ ์ซ์ ํ๋๊ทธ์ ๋๋ค: C#์์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์ธ์!= 0 ๋๋ ๊ฒฐ๊ณผ == 0. int์ true/false ๋ฐ if(๊ฒฐ๊ณผ)๋ฅผ ์ง์ ๋น๊ตํ๋ ๊ฒ์ ํ์ฉ๋์ง ์์ต๋๋ค. 1 - mobile์๋ IsDead์ด ์๊ณ , 0์๋ ๋ถํธ๊ฐ ์๊ฑฐ๋ mobile๊ฐ ์์ต๋๋ค. HP=0 ๊ทธ ์์ฒด๊ฐ ์ฃฝ์์ ์๋ฏธํ๋ ๊ฒ์ ์๋๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก์ปฌ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค. ๋์์ ์ด์ง ์๊ณ , ์ํ๋ฅผ ์์ฒญํ์ง ์์ผ๋ฉฐ, ํ๋๊ทธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ, ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค. ์ญ์ ๋ ๊ฐ์ฒด๋ ํด๋น ํญ๋ชฉ์ด ์ฌ์ ์์ ์ญ์ ๋๊ธฐ ์ ์๋ ๋๋ฝ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ ๋ณ๋์ ๋ ์์ ๋๋ค. Exists์ ๋ค์ ๋์ ์ฌ์ด์ ์ธ์์ด ๋ฐ๋ ์๋ ์์ต๋๋ค. ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ ์์์ฑ ์ค๋ ์ท์ ํ์ฑํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.IsDead();
UO.Print("IsDead: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ๊ดํธ๋ self๋ก ์ฝ์ต๋๋ค. active๋ ๊ฒฐ๊ณผ๋ฅผ ํ ๋ฒ ์ ์ฅํฉ๋๋ค. true ๋ฐ false๋ ๋ ๊ฐ์ ๋ถ๊ธฐ๋ฅผ ์ ์ํฉ๋๋ค. Print ์์ ๋ฉ์์ง๋ง ํ์๋ฉ๋๋ค.
var active = UO.IsDead();
if (Truth(Truth(active) == true))
{
UO.Print("State is active");
}
else
{
UO.Print("State is inactive or unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- lasttarget โ ์ด์ ์ ์ ํํ ๊ฐ์ฒด. Exists๋ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค. obj๊ฐ ์ ์ผํ ๋งค๊ฐ๋ณ์ ReadState์ ๋๋ค. ์ด ํจ์๋ ์์ ์์ด ๋ช ๋ น ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ํด๋น ์ ์๋ ๋ณต์ฌ๋ ์ฝ๋์ ํฌํจ๋์ด ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Exists("lasttarget")))
{
var observed = ReadState("lasttarget");
UO.Print("State 1/0: " + Convert.ToString(observed));
}
return null;
}
dynamic ReadState(dynamic obj)
{
return UO.IsDead(obj);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ๋ ๋ฒ์ ํธ์ถ์ self, UO.Wait(500)๋ฅผ ์ฝ๊ณ 500 ๋ฐ๋ฆฌ์ด๋ฅผ ์ค์ ํฉ๋๋ค. ๋ ์ด๋ฏธ์ง๊ฐ ๋น๊ต๋ฉ๋๋ค. ์ค๊ฐ ์ ํ์ ๊ฑด๋๋ธ ์ ์์ต๋๋ค. ๋์๋ ๊ธฐ๋ค๋ฆผ์ ์์ต๋๋ค.
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.IsDead();
await Delay(500);
var after = UO.IsDead();
if (Truth(before != after))
{
UO.Print("State changed: " + Convert.ToString(before) + " -> " + 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 [IsDead]. -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
IsDeadState๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => getter(bridge.Self)API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsDead:bridge.IsDead(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Dead:bridge.Dead().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "isdead": return new InjectionValue(arguments.Length > 0 ? bridge.IsDead(Arg(0)) : bridge.Dead());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.IsFemale(object? objID);์ฌ์ฑ ์ฑ๋ณ ์์ฑ mobile์ ํ์ธํฉ๋๋ค.
-
objIDโ ํน์ ๊ฐ์ฒด์ ํ์ serial/ID: int, 16์ง์ ๋ฌธ์์ด ๋๋ ๋ณ์นญ self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse ๋๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ graphic/type์ด ์๋๋๋ค. ์ง์ ๋์ง ์์ ์ด๋ฆ์ 0๋ก ํด์๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ์ ๋์์ ์ด์ง ์์ต๋๋ค. ์ธ์๋ ํ์์ ๋๋ค. ์ง์ self๋ฅผ ํต๊ณผํ์ธ์.
int 1 - ๋ก๋๋จ mobile์๋ IsFemale ์์ฑ์ด ์์ต๋๋ค. int 0 - ์์ฑ์ด ๋๋ฝ๋์๊ฑฐ๋ ๊ฐ์ฒด๊ฐ mobile๊ฐ ์๋๊ฑฐ๋ ์ ์ ์๊ฑฐ๋ ์ญ์ ๋์์ต๋๋ค. ๊ฐ์ฒด ์์ ์์ ์ธ์ข , ์ด๋ฆ, ๋์ด ๋๋ ์ ํ์ ๊ฒฐ์ ํ์ง ์์ต๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก์ปฌ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค. ์๋ฒ์ ๋ํ ์์ฒญ๋ ์๊ณ ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ ์ด๋ํ ํ์๋ ์์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ ์ฝ๋ ์๊ฐ์ ๊ฐ๋ฆฌํจ๋ค. UO.Wait ๋๋ ๋ค๋ฅธ ์์ ํ์ ๊ฐ์ฒด์ ํด๋น ํ๋๊ทธ๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- ๊ฐ์ฒด ์์ ์์ ์ธ์ข , ์ด๋ฆ, ๋์ด ๋๋ ์ ํ์ ๊ฒฐ์ ํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.IsFemale("self");
UO.Print("IsFemale: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- self ์ธ์๋ ํด๋น ๋ฌธ์๋ฅผ ๋ช ์์ ์ผ๋ก ์ ํํฉ๋๋ค. ์ํ - 1/0์๋ง ํด๋น๋ฉ๋๋ค.
- ๊ฐ์ฒด ์์ ์์ ์ธ์ข , ์ด๋ฆ, ๋์ด ๋๋ ์ ํ์ ๊ฒฐ์ ํ์ง ์์ต๋๋ค.
var state = UO.IsFemale("self");
if (Truth(state))
{
UO.Print("Female flag is set");
}
else
{
UO.Print("Female flag is not set");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- IsNpc ์ ๋ชฉ ๋ฐ ์ ์ ์๋ ๊ฐ์ฒด๋ ์ ์ธ๋ฉ๋๋ค. target์ ๋ณ๊ฒฝ๋๋ lasttarget์ ๋ํ ์ค์๊ฐ ์ฐธ์กฐ๊ฐ ์๋ ๋จ์ผ serial์ ์ ์ฅํฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ IsFemale ํ๋๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์ ์ ํ ์ํ๋ฅผ ์์ ํ ํ์๋ง ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var state = UO.IsFemale(target);
UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
}
else
{
UO.Print("No loaded mobile selected");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UO.Wait(500) โ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ผ์ ์ค์ง๋ฉ๋๋ค. ์ดํ์๋ mobile์ด ์ฌ์ ํ ์กด์ฌํ๋์ง ๋ณ๋๋ก ํ์ธํฉ๋๋ค.
- ๋ ์ด๋ฏธ์ง๊ฐ ๋น๊ต๋ฉ๋๋ค. ์ค๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ด ๋๋ฝ๋ ์ ์์ผ๋ฉฐ ์ด๋ ์๋ฒ ์ด๋ฒคํธ์ ๋ํ ์ง์์ ์ธ ๊ตฌ๋ ์ด ์๋๋๋ค.
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 target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var before = UO.IsFemale(target);
await Delay(500);
if (Truth(UO.IsNPC(target)))
{
var after = UO.IsFemale(target);
if (Truth(before != after))
{
UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
}
}
else
{
UO.Print("Mobile left the local world");
}
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsFemale:bridge.IsFemale(Arg(0, bridge.Self)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0, bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "isfemale": return new InjectionValue(bridge.IsFemale(Arg(0, bridge.Self)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.IsFlying();
int UO.IsFlying(object? value);์บ๋ฆญํฐ๊ฐ ํ์ฌ ๋ ๊ณ ์๋์ง ํ์ธํฉ๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก Gargoyle์ ํ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๊ฒฝ๋ก๋ฅผ ์์ํ๊ธฐ ์ ์ด๋ ๋นํ ํ์ฑํ๋ฅผ ์์ฒญํ๊ธฐ ์ ์ ๋๋ค. "๋ด ์บ๋ฆญํฐ๊ฐ ์ง๊ธ ๋ ๊ณ ์๋์?"๋ผ๋ ์ง๋ฌธ์ ๋ตํฉ๋๋ค. ๋ ผ์์์ด. ์ด ๋ช ๋ น์ ์ํ๋ง ์ฝ์ต๋๋ค. ๋นํ, ์ฐฉ๋ฅ ๋๋ ์บ๋ฆญํฐ ์ด๋์ ํ์ฑํํ์ง ์์ต๋๋ค.
-
value- ์ ํ ์ฌํญ serial ๋ฌธ์: ์ซ์, 16์ง์ ๋ฌธ์์ด, self, lasttarget ๋๋ UO.AddObject์ ํตํด ์ ์ฅ๋ ์ด๋ฆ. ์ธ์๊ฐ ์์ผ๋ฉด ๊ทํ์ ์บ๋ฆญํฐ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๊ฒ์ ํน์ mobile์ ID์ด๋ฉฐ, graphic/type๋ ์๋๊ณ Z์ ์ขํ๋ ์๋๋๋ค. ์ ์ ์๋ ์ด๋ฆ, ๋๋ฝ/์ ๊ฑฐ๋ mobile ๋๋ ํญ๋ชฉ์ 0์ด ํ์๋ฉ๋๋ค.
์ซ์ ํ๋๊ทธ int: 1(์กฐ๊ฑด ์ถฉ์กฑ), 0(์กฐ๊ฑด ์ถฉ์กฑ๋์ง ์์). ์ด๊ฒ์ ์ซ์ ํ๋๊ทธ์ ๋๋ค: C#์์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์ธ์!= 0 ๋๋ ๊ฒฐ๊ณผ == 0. int์ true/false ๋ฐ if(๊ฒฐ๊ณผ)๋ฅผ ์ง์ ๋น๊ตํ๋ ๊ฒ์ ํ์ฉ๋์ง ์์ต๋๋ค. 1 - mobile์๋ IsFlying์ด ์๊ณ , 0์๋ ํ๋๊ทธ๊ฐ ์๊ฑฐ๋ mobile๊ฐ ์์ต๋๋ค. ๊ณ ๋ Z ์์ฒด๊ฐ ๋นํ์ ์๋ฏธํ๋ ๊ฒ์ ์๋๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ์ฃผ์ ๊ฒ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฐ๊ณ ์ผ์ ๋นํ์ ๋๋ค. ๊ทธ๋ฌ๋ getter๋ ๊ฒฝํฉ์ ํ์ธํ์ง ์์ต๋๋ค. ์ด ํด๋ผ์ด์ธํธ์์๋ ํ๋กํ ์ฝ ๋ฒ์ 7.0.0.0 ์ด์์ ์ฌ์ฉํ์ฌ mobile์์ 0x04 ๋นํธ๋ฅผ ์ฝ์ต๋๋ค. ์ด์ ํ๋กํ ์ฝ์์๋ 0๋ฅผ ๋ฐํํฉ๋๋ค. ์ง๋ถ ์์ ์๊ธฐ, ๋์ Z, ๋ ๊ฐ ์ ๋๋ฉ์ด์ ๋๋ ๊ฐ๊ณ ์ผ ๊ฒฝ์ฃผ ์์ฒด๋ ๋นํ์ด ๊ฐ๋ฅํ๋ค๋ ์ฆ๊ฑฐ๊ฐ ์๋๋๋ค.
- ์ํ ๋ณ๊ฒฝ์ ์ํ ๋ณ๋์ UO.ToggleFly()๊ฐ ์์ต๋๋ค. "์ผ๊ธฐ" ๋ช ๋ น์ด ์๋ ์ค์์น ์์ฒญ์ ๋ณด๋ ๋๋ค. ์ด๋ฏธ ๋นํ ์ค์ด๋ผ๋ฉด ์ฐฉ๋ฅ์ ์์ฒญํ๋ ์ ํ๊ฐ ๋ฐ๋ณต๋ฉ๋๋ค. ์๋ฒ๊ฐ ์คํจํ ์ ์์ต๋๋ค. ๋ฉ์์ง๊ฐ ํ์๋ ํ ์ ํ์ ์ผ๋ก ๊ธฐ๋ค๋ฆฌ๋ฉด์ Flying์ ๋ค์ ์ฝ์ผ์ธ์. false๋ ์บ๋ฆญํฐ/๋ฐ์ดํฐ๊ฐ ์์ด๋ ๊ฐ๋ฅํ๋ฏ๋ก ์ก์ ํ๋ ์ด ์ Connected๋ฅผ ํ์ธํ์ธ์.
- ๋ก์ปฌ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค. ๋์์ ์ด์ง ์๊ณ , ์ํ๋ฅผ ์์ฒญํ์ง ์์ผ๋ฉฐ, ํ๋๊ทธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ, ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค. ์ญ์ ๋ ๊ฐ์ฒด๋ ํด๋น ํญ๋ชฉ์ด ์ฌ์ ์์ ์ญ์ ๋๊ธฐ ์ ์๋ ๋๋ฝ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ ๋ณ๋์ ๋ ์์ ๋๋ค. Exists์ ๋ค์ ๋์ ์ฌ์ด์ ์ธ์์ด ๋ฐ๋ ์๋ ์์ต๋๋ค. ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ ์์์ฑ ์ค๋ ์ท์ ํ์ฑํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.IsFlying();
UO.Print("IsFlying: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ๊ดํธ๋ self์ ๋ํ๋ ๋๋ค. true๋ 1์ ๊ฐ๊ณ , false๋ 0์ ๊ฐ์ต๋๋ค. UO.Flying() { ... }๊ฐ ํ์ฉ๋๋ ๊ฒฝ์ฐ. ์ด ์์์๋ ์๋ฌด๊ฒ๋ ์ ํํ์ง ์์ต๋๋ค.
var active = UO.IsFlying();
if (Truth(Truth(active) == true))
{
UO.Print("Flying mode active");
}
else
{
UO.Print("Ground mode or character data unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ReadState(obj)๋ serial/alias๋ฅผ ์ทจํ๊ณ ์ํ๋ฅผ ๋ฐํํฉ๋๋ค. ์ ์ฒด ์ ์๋ ์๋์ ๊ฐ์ต๋๋ค. ๊ฐ์ฒด๊ฐ ์์ผ๋ฉด ์ฝ๊ธฐ ์ ์ ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ์บ๋ฆญํฐ๋ ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ฏธ ๋ฐ์ ๋ฐ์ดํฐ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var target = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(target != 0) && Truth(UO.Exists(target)))
{
if (Truth(ReadState(target)))
{
UO.AddObject("flying_mobile", target);
}
}
return null;
}
dynamic ReadState(dynamic obj)
{
if (!(Truth(UO.Exists(obj))))
{
return false;
}
return UO.IsFlying(obj);
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋นํ ์ง์ ์๋ฒ์ ๊ฐ๊ณ ์ผ์ ๋ํ ์์ ๋๋ค. EnsureFlight(timeoutMs)๋ ๋นํ์ด ๊ด์ฐฐ๋๋ฉด 1/true๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด 0/false๋ฅผ ๋ฐํํฉ๋๋ค. 2000 โ ๋๊ธฐ ์ ํ(๋ฐ๋ฆฌ์ด); 50 ms๋ง๋ค ํ์ธํฉ๋๋ค. ์ด๋ฏธ ๋นํ ์ค์ด๋ผ๋ฉด ToggleFly๊ฐ ํธ์ถ๋์ง ์์ต๋๋ค. ์ต๋ 1๊ฐ์ ์์ฒญ์ด ์ ์ก๋๋ฉด ์๋ต ์ํ๊ฐ ํ์ธ๋ฉ๋๋ค. ์คํฌ๋ฆฝํธ ์ผ์ ์ค์ง/์ค์ผ์ค๋ฌ ์ง์ฐ์ผ๋ก ์ธํด ์ค์๊ฐ์ด ๋์ด๋ ์ ์์ต๋๋ค.
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()
{
if (Truth(await EnsureFlight(2000)))
{
UO.Print("Flight confirmed; ready for the next stage");
}
else
{
UO.Print("Flight not confirmed; route was not started");
}
return null;
}
async Task<dynamic> EnsureFlight(dynamic timeoutMs)
{
if (!(Truth(UO.Connected())) || Truth(UO.Dead()))
{
return false;
}
if (Truth(UO.IsFlying()))
{
return true;
}
UO.ToggleFly();
var waited = 0;
while (Truth(waited < timeoutMs))
{
if (!(Truth(UO.Connected())))
{
return false;
}
if (Truth(UO.IsFlying()))
{
return true;
}
await Delay(50);
waited += 50;
}
return UO.IsFlying();
}
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 [IsFlying]. -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Flying:bridge.Flying(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
serial => bridge.Flying(serial)๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => getter(bridge.Self)API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [IsFlying]. -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Flying:bridge.Flying(serial). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(value).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
serial => bridge.Flying(serial)๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
value => getter(GetObject(value))API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.IsFrozen();
int UO.IsFrozen(object? value);ํด๋ผ์ด์ธํธ์ ์๋ ค์ง ์บ๋ฆญํฐ์ ๋ง๋น ํ๋๊ทธ๋ฅผ ํ์ธํฉ๋๋ค.
-
value- ์ ํ ์ฌํญ serial/ID mobile: ์ซ์, 16์ง์ ๋ฌธ์์ด, self, lasttarget ๋๋ ๊ธฐํ ํ์ค ๊ฐ์ฒด ์ด๋ฆ ๋๋ AddObject ์ด๋ฆ. ์ด๊ฒ์ graphic/type์ด ์๋๋๋ค. ์ธ์๊ฐ ์์ผ๋ฉด self๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ ์ ์๋ ์ด๋ฆ์ 0์์ ํด๊ฒฐ๋ฉ๋๋ค. ํ๊ฒ์ด ์ด๋ฆฌ์ง ์์ต๋๋ค.
์ซ์ ํ๋๊ทธ int: 1 (์กฐ๊ฑด ์ถฉ์กฑ) - ๋ก๋๋จ mobile์๋ ํ๋๊ทธ IsParalyzed์ด ์์ต๋๋ค. 0 (์กฐ๊ฑด์ด ์ถฉ์กฑ๋์ง ์์) - ํ๋๊ทธ ์์, mobile ์ ์ ์์, ์ญ์ ๋์๊ฑฐ๋ ๊ฐ์ฒด๊ฐ ํญ๋ชฉ์ ๋๋ค. ์ด๋ ๋ง๋น ์๊ฐ์ด ์๋๋ฉฐ 0 ๊ฒฐ๊ณผ๋ก ์ด๋ ๋ฅ๋ ฅ์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
- ๋ง๋น ํ๋๊ทธ๋ฅผ ํ์ธํ๋ ค๋ฉด Paralyzed๋ฅผ ์ฌ์ฉํ์ธ์. Is/Get, GetParalisa, Frozen ๋ฐ GetLocked ์ต์ ์ ๋์ผํ ํ๋๊ทธ๋ฅผ ์ฝ์ต๋๋ค.
- ์ด ๋ช ๋ น์ ๋ก์ปฌ ๋ฐ์ดํฐ๋ง ์ฝ์ต๋๋ค. ๋ง๋น๋ฅผ ์ ์ฉํ๊ฑฐ๋ ์ ๊ฑฐํ์ง ์์ผ๋ฉฐ, ๋ง๋น๊ฐ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ผ๋ฉฐ, ์๋ฒ์ ์ ๋ฐ์ดํธ ์์ฒญ์ ๋ณด๋ด์ง ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ๊ฒฐ๊ณผ๋ int ์ ํ์ ๋๋ค. if (value != 0) ๋๋ if (value == 0)๋ฅผ ์ฌ์ฉํ์ธ์. true/false ๋ฐ C#์ if (๊ฐ)๊ณผ์ ์ง์ ๋น๊ต๋ ํ์ฉ๋์ง ์์ต๋๋ค. ๊ฐ์ ์๋์ด๋ ID์ด ์๋ ํ๋๊ทธ์ ์๋ฏธ๋ฅผ ์ ์งํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.IsFrozen();
UO.Print("IsFrozen: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ๊ดํธ๋ self๋ฅผ ์ ํํฉ๋๋ค. ์ํ๋ ํ๋๊ทธ์ ํ๋์ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. true์ ์์น์์ 1์ ๋๋ค.
- false ๊ฒฐ๊ณผ๋ ๋ฒฝ, ์ฒด๋ ฅ ๋ถ์กฑ ๋๋ ๊ธฐํ ์ ์ง ์ด์ ๋ฅผ ๋ฐฐ์ ํ์ง ์์ต๋๋ค.
var state = UO.IsFrozen();
if (Truth(Truth(state) == true))
{
UO.Print("Paralysis flag is set");
}
else
{
UO.Print("Paralysis flag is absent or unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- target์ ๋ง์ง๋ง ํ๊ฒ์ 16์ง์ ๋ฌธ์์ด serial์ ์ ์ฅํฉ๋๋ค. IsNpc๋ ํ๋ ์ด์ด๋ฅผ ํฌํจํ์ฌ ๋ก๋๋ mobile์ธ์ง ํ์ธํฉ๋๋ค.
- ์ธ์๊ฐ ํฌํจ๋ ๋ช ๋ น์ ๋์์ ์ฝ์ต๋๋ค. ๊ทธ๋ ๋ ์๋ก์ด ์บ๋ฆญํฐ๋ฅผ ์ ํํ๊ฑฐ๋ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค lasttarget.
return RunScenario();
object? RunScenario()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var state = UO.IsFrozen(target);
UO.Print("Selected mobile paralysis 1/0: " + Convert.ToString(state));
}
else
{
UO.Print("No loaded mobile selected");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 100ms ๋์ 10 ์ด์ ์ผ์ ์ค์ง๋์ง ์์ต๋๋ค. ์ธ์ ์์ด ํธ์ถํ ๋๋ง๋ค self๋ฅผ ๋ค์ ์ฝ์ต๋๋ค.
- ๋ฃจํ ํ์๋ self ์กด์ฌ ์ฌ๋ถ๋ฅผ ๋ณ๋๋ก ํ์ธํฉ๋๋ค. ์ด๋ ์ฝ 1์ด ๋์์ ๊ด์ฐฐ๊ณผ ๋ช ๋ น ์คํ์ ํฉํ ๊ฒ์ด๋ฉฐ ๋ง๋น๊ฐ ์์ ํ ์ ๊ฑฐ๋๋ค๋ ๋ณด์ฅ์ ์์ต๋๋ค.
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 attempts = 0;
while (Truth(Truth(UO.IsFrozen()) == true) && Truth(attempts < 10))
{
await Delay(100);
attempts = attempts + 1;
}
if (Truth(UO.IsNPC("self")))
{
if (Truth(Truth(UO.IsFrozen()) == false))
{
UO.Print("Paralysis flag is clear");
}
else
{
UO.Print("Still paralyzed");
}
}
else
{
UO.Print("Self is unavailable");
}
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 [IsFrozen]. -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLocked:bridge.GetLocked(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
serial => bridge.GetLocked(serial)๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => getter(bridge.Self)API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [IsFrozen]. -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLocked:bridge.GetLocked(serial). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(value).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
serial => bridge.GetLocked(serial)๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
value => getter(GetObject(value))API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
UO.IsHidden
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.IsHidden();
dynamic UO.IsHidden(object? objID);์บ๋ฆญํฐ์ ์คํ ์ค๋ฅผ ํ ์คํธํฉ๋๋ค.
-
objIDโ ํ์๋ ํ์์ ์ ํ์ ๊ฐ์ฒด: serial ์ซ์/16์ง์ ๋ฌธ์์ด, self, lasttarget ๋๋ ๋ฑ๋ก๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ type๊ฐ ์๋๋๋ค. ๋ ผ์ ์์ด self์ ์ฝ์ผ์ธ์. ์ผ๋ถ ํ์์ ์ ์ ์๋ ํ ์คํธ๋ก ์ธํด ๋ณํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ ํํ๊ธฐ ์ ์ ์ด๋ฆ์ ํ์ธํ์ธ์.
์ซ์ ํ๋๊ทธ int: 1(์กฐ๊ฑด ์ถฉ์กฑ), 0(์กฐ๊ฑด ์ถฉ์กฑ๋์ง ์์). ์ด๊ฒ์ ์ซ์ ํ๋๊ทธ์ ๋๋ค. C#์์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์ธ์!= 0 ๋๋ ๊ฒฐ๊ณผ == 0์ ๋๋ค. int์ true/false ๋ฐ if(๊ฒฐ๊ณผ)๋ฅผ ์ง์ ๋น๊ตํ๋ ๊ฒ์ ํ์ฉ๋์ง ์์ต๋๋ค. 1 - mobile์๋ IsHidden์ด ์๊ณ , 0์๋ ํ๋๊ทธ๊ฐ ์๊ฑฐ๋ mobile๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ ๋ฒฝ ๋ค์ ๊ฐ์์ฑ์ด ์๋ ์๋ฒ ํ๋๊ทธ์ ๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก์ปฌ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค. ๋์์ ์ด์ง ์๊ณ , ์ํ๋ฅผ ์์ฒญํ์ง ์์ผ๋ฉฐ, ํ๋๊ทธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ, ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค. ์ญ์ ๋ ๊ฐ์ฒด๋ ํด๋น ํญ๋ชฉ์ด ์ฌ์ ์์ ์ญ์ ๋๊ธฐ ์ ์๋ ๋๋ฝ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ ๋ณ๋์ ๋ ์์ ๋๋ค. Exists์ ๋ค์ ๋์ ์ฌ์ด์ ์ธ์์ด ๋ฐ๋ ์๋ ์์ต๋๋ค. ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ ์์์ฑ ์ค๋ ์ท์ ํ์ฑํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.IsHidden();
UO.Print("IsHidden: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ๊ดํธ๋ self๋ก ์ฝ์ต๋๋ค. active๋ ๊ฒฐ๊ณผ๋ฅผ ํ ๋ฒ ์ ์ฅํฉ๋๋ค. true ๋ฐ false๋ ๋ ๊ฐ์ ๋ถ๊ธฐ๋ฅผ ์ ์ํฉ๋๋ค. Print ์์ ๋ฉ์์ง๋ง ํ์๋ฉ๋๋ค.
var active = UO.IsHidden();
if (Truth(Truth(active) == true))
{
UO.Print("State is active");
}
else
{
UO.Print("State is inactive or unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- lasttarget โ ์ด์ ์ ์ ํํ ๊ฐ์ฒด. Exists๋ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค. obj๊ฐ ์ ์ผํ ๋งค๊ฐ๋ณ์ ReadState์ ๋๋ค. ์ด ํจ์๋ ์์ ์์ด ๋ช ๋ น ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ํด๋น ์ ์๋ ๋ณต์ฌ๋ ์ฝ๋์ ํฌํจ๋์ด ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Exists("lasttarget")))
{
var observed = ReadState("lasttarget");
UO.Print("State 1/0: " + Convert.ToString(observed));
}
return null;
}
dynamic ReadState(dynamic obj)
{
return UO.IsHidden(obj);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ๋ ๋ฒ์ ํธ์ถ์ self, UO.Wait(500)๋ฅผ ์ฝ๊ณ 500 ๋ฐ๋ฆฌ์ด๋ฅผ ์ค์ ํฉ๋๋ค. ๋ ์ด๋ฏธ์ง๊ฐ ๋น๊ต๋ฉ๋๋ค. ์ค๊ฐ ์ ํ์ ๊ฑด๋๋ธ ์ ์์ต๋๋ค. ๋์๋ ๊ธฐ๋ค๋ฆผ์ ์์ต๋๋ค.
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.IsHidden();
await Delay(500);
var after = UO.IsHidden();
if (Truth(before != after))
{
UO.Print("State changed: " + Convert.ToString(before) + " -> " + 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์ ์ฌ์ฉํ์ธ์.
UO.IsHidden() โ UO.IsHidden()
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [IsHidden]. -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Hidden:bridge.Hidden(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
serial => bridge.Hidden(serial)๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => getter(bridge.Self)API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
UO.IsHidden(objID) โ UO.IsHidden(Any)
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Hidden:bridge.Hidden(Arg(0, bridge.Self)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0, bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "ishidden": return new InjectionValue(bridge.Hidden(Arg(0, bridge.Self)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.IsParalysed();
int UO.IsParalysed(object? value);ํด๋ผ์ด์ธํธ์ ์๋ ค์ง ์บ๋ฆญํฐ์ ๋ง๋น ํ๋๊ทธ๋ฅผ ํ์ธํฉ๋๋ค.
-
value- ์ ํ ์ฌํญ serial/ID mobile: ์ซ์, 16์ง์ ๋ฌธ์์ด, self, lasttarget ๋๋ ๊ธฐํ ํ์ค ๊ฐ์ฒด ์ด๋ฆ ๋๋ AddObject ์ด๋ฆ. ์ด๊ฒ์ graphic/type์ด ์๋๋๋ค. ์ธ์๊ฐ ์์ผ๋ฉด self๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ ์ ์๋ ์ด๋ฆ์ 0์์ ํด๊ฒฐ๋ฉ๋๋ค. ํ๊ฒ์ด ์ด๋ฆฌ์ง ์์ต๋๋ค.
์ซ์ ํ๋๊ทธ int: 1 (์กฐ๊ฑด ์ถฉ์กฑ) - ๋ก๋๋จ mobile์๋ ํ๋๊ทธ IsParalyzed์ด ์์ต๋๋ค. 0 (์กฐ๊ฑด์ด ์ถฉ์กฑ๋์ง ์์) - ํ๋๊ทธ ์์, mobile ์ ์ ์์, ์ญ์ ๋์๊ฑฐ๋ ๊ฐ์ฒด๊ฐ ํญ๋ชฉ์ ๋๋ค. ์ด๋ ๋ง๋น ์๊ฐ์ด ์๋๋ฉฐ 0 ๊ฒฐ๊ณผ๋ก ์ด๋ ๋ฅ๋ ฅ์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
- ๋ง๋น ํ๋๊ทธ๋ฅผ ํ์ธํ๋ ค๋ฉด Paralyzed๋ฅผ ์ฌ์ฉํ์ธ์. Is/Get, GetParalisa, Frozen ๋ฐ GetLocked ์ต์ ์ ๋์ผํ ํ๋๊ทธ๋ฅผ ์ฝ์ต๋๋ค.
- ์ด ๋ช ๋ น์ ๋ก์ปฌ ๋ฐ์ดํฐ๋ง ์ฝ์ต๋๋ค. ๋ง๋น๋ฅผ ์ ์ฉํ๊ฑฐ๋ ์ ๊ฑฐํ์ง ์์ผ๋ฉฐ, ๋ง๋น๊ฐ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ผ๋ฉฐ, ์๋ฒ์ ์ ๋ฐ์ดํธ ์์ฒญ์ ๋ณด๋ด์ง ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ๊ฒฐ๊ณผ๋ int ์ ํ์ ๋๋ค. if (value != 0) ๋๋ if (value == 0)๋ฅผ ์ฌ์ฉํ์ธ์. true/false ๋ฐ C#์ if (๊ฐ)๊ณผ์ ์ง์ ๋น๊ต๋ ํ์ฉ๋์ง ์์ต๋๋ค. ๊ฐ์ ์๋์ด๋ ID์ด ์๋ ํ๋๊ทธ์ ์๋ฏธ๋ฅผ ์ ์งํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.IsParalysed();
UO.Print("IsParalysed: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ๊ดํธ๋ self๋ฅผ ์ ํํฉ๋๋ค. ์ํ๋ ํ๋๊ทธ์ ํ๋์ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. true์ ์์น์์ 1์ ๋๋ค.
- false ๊ฒฐ๊ณผ๋ ๋ฒฝ, ์ฒด๋ ฅ ๋ถ์กฑ ๋๋ ๊ธฐํ ์ ์ง ์ด์ ๋ฅผ ๋ฐฐ์ ํ์ง ์์ต๋๋ค.
var state = UO.IsParalysed();
if (Truth(Truth(state) == true))
{
UO.Print("Paralysis flag is set");
}
else
{
UO.Print("Paralysis flag is absent or unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- target์ ๋ง์ง๋ง ํ๊ฒ์ 16์ง์ ๋ฌธ์์ด serial์ ์ ์ฅํฉ๋๋ค. IsNpc๋ ํ๋ ์ด์ด๋ฅผ ํฌํจํ์ฌ ๋ก๋๋ mobile์ธ์ง ํ์ธํฉ๋๋ค.
- ์ธ์๊ฐ ํฌํจ๋ ๋ช ๋ น์ ๋์์ ์ฝ์ต๋๋ค. ๊ทธ๋ ๋ ์๋ก์ด ์บ๋ฆญํฐ๋ฅผ ์ ํํ๊ฑฐ๋ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค lasttarget.
return RunScenario();
object? RunScenario()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var state = UO.IsParalysed(target);
UO.Print("Selected mobile paralysis 1/0: " + Convert.ToString(state));
}
else
{
UO.Print("No loaded mobile selected");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 100ms ๋์ 10 ์ด์ ์ผ์ ์ค์ง๋์ง ์์ต๋๋ค. ์ธ์ ์์ด ํธ์ถํ ๋๋ง๋ค self๋ฅผ ๋ค์ ์ฝ์ต๋๋ค.
- ๋ฃจํ ํ์๋ self ์กด์ฌ ์ฌ๋ถ๋ฅผ ๋ณ๋๋ก ํ์ธํฉ๋๋ค. ์ด๋ ์ฝ 1์ด ๋์์ ๊ด์ฐฐ๊ณผ ๋ช ๋ น ์คํ์ ํฉํ ๊ฒ์ด๋ฉฐ ๋ง๋น๊ฐ ์์ ํ ์ ๊ฑฐ๋๋ค๋ ๋ณด์ฅ์ ์์ต๋๋ค.
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 attempts = 0;
while (Truth(Truth(UO.IsParalysed()) == true) && Truth(attempts < 10))
{
await Delay(100);
attempts = attempts + 1;
}
if (Truth(UO.IsNPC("self")))
{
if (Truth(Truth(UO.IsParalysed()) == false))
{
UO.Print("Paralysis flag is clear");
}
else
{
UO.Print("Still paralyzed");
}
}
else
{
UO.Print("Self is unavailable");
}
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 [IsParalysed]. -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLocked:bridge.GetLocked(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
serial => bridge.GetLocked(serial)๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => getter(bridge.Self)API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [IsParalysed]. -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLocked:bridge.GetLocked(serial). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(value).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
serial => bridge.GetLocked(serial)๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
value => getter(GetObject(value))API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.IsParalyzed();
int UO.IsParalyzed(object? objID);ํด๋ผ์ด์ธํธ์ ์๋ ค์ง ์บ๋ฆญํฐ์ ๋ง๋น ํ๋๊ทธ๋ฅผ ํ์ธํฉ๋๋ค.
-
objID- ์ ํ ์ฌํญ serial/ID mobile: ์ซ์, 16์ง์ ๋ฌธ์์ด, self, lasttarget ๋๋ ๊ธฐํ ํ์ค ๊ฐ์ฒด ์ด๋ฆ ๋๋ AddObject ์ด๋ฆ. ์ด๊ฒ์ graphic/type์ด ์๋๋๋ค. ์ธ์๊ฐ ์์ผ๋ฉด self๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ ์ ์๋ ์ด๋ฆ์ 0์์ ํด๊ฒฐ๋ฉ๋๋ค. ํ๊ฒ์ด ์ด๋ฆฌ์ง ์์ต๋๋ค.
์ซ์ ํ๋๊ทธ int: 1 (์กฐ๊ฑด ์ถฉ์กฑ) - ๋ก๋๋จ mobile์๋ ํ๋๊ทธ IsParalyzed์ด ์์ต๋๋ค. 0 (์กฐ๊ฑด์ด ์ถฉ์กฑ๋์ง ์์) - ํ๋๊ทธ ์์, mobile ์ ์ ์์, ์ญ์ ๋์๊ฑฐ๋ ๊ฐ์ฒด๊ฐ ํญ๋ชฉ์ ๋๋ค. ์ด๋ ๋ง๋น ์๊ฐ์ด ์๋๋ฉฐ 0 ๊ฒฐ๊ณผ๋ก ์ด๋ ๋ฅ๋ ฅ์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
- ๋ง๋น ํ๋๊ทธ๋ฅผ ํ์ธํ๋ ค๋ฉด Paralyzed๋ฅผ ์ฌ์ฉํ์ธ์. Is/Get, GetParalisa, Frozen ๋ฐ GetLocked ์ต์ ์ ๋์ผํ ํ๋๊ทธ๋ฅผ ์ฝ์ต๋๋ค.
- ์ด ๋ช ๋ น์ ๋ก์ปฌ ๋ฐ์ดํฐ๋ง ์ฝ์ต๋๋ค. ๋ง๋น๋ฅผ ์ ์ฉํ๊ฑฐ๋ ์ ๊ฑฐํ์ง ์์ผ๋ฉฐ, ๋ง๋น๊ฐ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ผ๋ฉฐ, ์๋ฒ์ ์ ๋ฐ์ดํธ ์์ฒญ์ ๋ณด๋ด์ง ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ๊ฒฐ๊ณผ๋ int ์ ํ์ ๋๋ค. if (value != 0) ๋๋ if (value == 0)๋ฅผ ์ฌ์ฉํ์ธ์. true/false ๋ฐ C#์ if (๊ฐ)๊ณผ์ ์ง์ ๋น๊ต๋ ํ์ฉ๋์ง ์์ต๋๋ค. ๊ฐ์ ์๋์ด๋ ID์ด ์๋ ํ๋๊ทธ์ ์๋ฏธ๋ฅผ ์ ์งํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.IsParalyzed();
UO.Print("IsParalyzed: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ๊ดํธ๋ self๋ฅผ ์ ํํฉ๋๋ค. ์ํ๋ ํ๋๊ทธ์ ํ๋์ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. true์ ์์น์์ 1์ ๋๋ค.
- false ๊ฒฐ๊ณผ๋ ๋ฒฝ, ์ฒด๋ ฅ ๋ถ์กฑ ๋๋ ๊ธฐํ ์ ์ง ์ด์ ๋ฅผ ๋ฐฐ์ ํ์ง ์์ต๋๋ค.
var state = UO.IsParalyzed();
if (Truth(Truth(state) == true))
{
UO.Print("Paralysis flag is set");
}
else
{
UO.Print("Paralysis flag is absent or unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- target์ ๋ง์ง๋ง ํ๊ฒ์ 16์ง์ ๋ฌธ์์ด serial์ ์ ์ฅํฉ๋๋ค. IsNpc๋ ํ๋ ์ด์ด๋ฅผ ํฌํจํ์ฌ ๋ก๋๋ mobile์ธ์ง ํ์ธํฉ๋๋ค.
- ์ธ์๊ฐ ํฌํจ๋ ๋ช ๋ น์ ๋์์ ์ฝ์ต๋๋ค. ๊ทธ๋ ๋ ์๋ก์ด ์บ๋ฆญํฐ๋ฅผ ์ ํํ๊ฑฐ๋ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค lasttarget.
return RunScenario();
object? RunScenario()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var state = UO.IsParalyzed(target);
UO.Print("Selected mobile paralysis 1/0: " + Convert.ToString(state));
}
else
{
UO.Print("No loaded mobile selected");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 100ms ๋์ 10 ์ด์ ์ผ์ ์ค์ง๋์ง ์์ต๋๋ค. ์ธ์ ์์ด ํธ์ถํ ๋๋ง๋ค self๋ฅผ ๋ค์ ์ฝ์ต๋๋ค.
- ๋ฃจํ ํ์๋ self ์กด์ฌ ์ฌ๋ถ๋ฅผ ๋ณ๋๋ก ํ์ธํฉ๋๋ค. ์ด๋ ์ฝ 1์ด ๋์์ ๊ด์ฐฐ๊ณผ ๋ช ๋ น ์คํ์ ํฉํ ๊ฒ์ด๋ฉฐ ๋ง๋น๊ฐ ์์ ํ ์ ๊ฑฐ๋๋ค๋ ๋ณด์ฅ์ ์์ต๋๋ค.
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 attempts = 0;
while (Truth(Truth(UO.IsParalyzed()) == true) && Truth(attempts < 10))
{
await Delay(100);
attempts = attempts + 1;
}
if (Truth(UO.IsNPC("self")))
{
if (Truth(Truth(UO.IsParalyzed()) == false))
{
UO.Print("Paralysis flag is clear");
}
else
{
UO.Print("Still paralyzed");
}
}
else
{
UO.Print("Self is unavailable");
}
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 [IsParalyzed]. -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLocked:bridge.GetLocked(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
serial => bridge.GetLocked(serial)๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => getter(bridge.Self)API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLocked:bridge.GetLocked(Arg(0, bridge.Self)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0, bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "isparalyzed": return new InjectionValue(bridge.GetLocked(Arg(0, bridge.Self)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.IsPoisoned();
dynamic UO.IsPoisoned(object? objID);์บ๋ฆญํฐ์ ์ค๋ ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
-
objIDโ ํ์๋ ํ์์ ์ ํ์ ๊ฐ์ฒด: serial ์ซ์/16์ง์ ๋ฌธ์์ด, self, lasttarget ๋๋ ๋ฑ๋ก๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ type๊ฐ ์๋๋๋ค. ๋ ผ์ ์์ด self์ ์ฝ์ผ์ธ์. ์ผ๋ถ ํ์์ ์ ์ ์๋ ํ ์คํธ๋ก ์ธํด ๋ณํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ ํํ๊ธฐ ์ ์ ์ด๋ฆ์ ํ์ธํ์ธ์.
์ซ์ ํ๋๊ทธ int: 1(์กฐ๊ฑด ์ถฉ์กฑ), 0(์กฐ๊ฑด ์ถฉ์กฑ๋์ง ์์). ์ด๊ฒ์ ์ซ์ ํ๋๊ทธ์ ๋๋ค. C#์์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์ธ์!= 0 ๋๋ ๊ฒฐ๊ณผ == 0์ ๋๋ค. int์ true/false ๋ฐ if(๊ฒฐ๊ณผ)๋ฅผ ์ง์ ๋น๊ตํ๋ ๊ฒ์ ํ์ฉ๋์ง ์์ต๋๋ค. 1 - mobile์๋ IsPoisoned์ด ์๊ณ , 0์๋ ํ๋๊ทธ๊ฐ ์๊ฑฐ๋ mobile๊ฐ ์์ต๋๋ค. ๋ ์ ์ ๋์ ๋จ์ ์๊ฐ์ ๋ฐํ๋์ง ์์ต๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก์ปฌ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค. ๋์์ ์ด์ง ์๊ณ , ์ํ๋ฅผ ์์ฒญํ์ง ์์ผ๋ฉฐ, ํ๋๊ทธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ, ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค. ์ญ์ ๋ ๊ฐ์ฒด๋ ํด๋น ํญ๋ชฉ์ด ์ฌ์ ์์ ์ญ์ ๋๊ธฐ ์ ์๋ ๋๋ฝ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ ๋ณ๋์ ๋ ์์ ๋๋ค. Exists์ ๋ค์ ๋์ ์ฌ์ด์ ์ธ์์ด ๋ฐ๋ ์๋ ์์ต๋๋ค. ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ ์์์ฑ ์ค๋ ์ท์ ํ์ฑํ์ง ์์ต๋๋ค.
- Poisoned/Flying์ ๊ฒฝ์ฐ ํ๋กํ ์ฝ ๋ฒ์ ์ด ๊ณ ๋ ค๋ฉ๋๋ค. ์ต๋ 7.0.0.0๊น์ง 0x04 ๋นํธ๋ ๋ ์ ์๋ฏธํฉ๋๋ค. 7.0.0.0๋ก ์์ํ๋ฉด ๋นํ์ ์๋ฏธํ๋ฉฐ, ๋ ์ ๋ณ๋๋ก ๋ณด๊ด๋ฉ๋๋ค. Z์์ ํญ๊ณตํธ์ด ๊ณ์ฐ๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.IsPoisoned();
UO.Print("IsPoisoned: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ๊ดํธ๋ self๋ก ์ฝ์ต๋๋ค. active๋ ๊ฒฐ๊ณผ๋ฅผ ํ ๋ฒ ์ ์ฅํฉ๋๋ค. true ๋ฐ false๋ ๋ ๊ฐ์ ๋ถ๊ธฐ๋ฅผ ์ ์ํฉ๋๋ค. Print ์์ ๋ฉ์์ง๋ง ํ์๋ฉ๋๋ค.
var active = UO.IsPoisoned();
if (Truth(Truth(active) == true))
{
UO.Print("State is active");
}
else
{
UO.Print("State is inactive or unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- lasttarget โ ์ด์ ์ ์ ํํ ๊ฐ์ฒด. Exists๋ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค. obj๊ฐ ์ ์ผํ ๋งค๊ฐ๋ณ์ ReadState์ ๋๋ค. ์ด ํจ์๋ ์์ ์์ด ๋ช ๋ น ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ํด๋น ์ ์๋ ๋ณต์ฌ๋ ์ฝ๋์ ํฌํจ๋์ด ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Exists("lasttarget")))
{
var observed = ReadState("lasttarget");
UO.Print("State 1/0: " + Convert.ToString(observed));
}
return null;
}
dynamic ReadState(dynamic obj)
{
return UO.IsPoisoned(obj);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ๋ ๋ฒ์ ํธ์ถ์ self, UO.Wait(500)๋ฅผ ์ฝ๊ณ 500 ๋ฐ๋ฆฌ์ด๋ฅผ ์ค์ ํฉ๋๋ค. ๋ ์ด๋ฏธ์ง๊ฐ ๋น๊ต๋ฉ๋๋ค. ์ค๊ฐ ์ ํ์ ๊ฑด๋๋ธ ์ ์์ต๋๋ค. ๋์๋ ๊ธฐ๋ค๋ฆผ์ ์์ต๋๋ค.
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.IsPoisoned();
await Delay(500);
var after = UO.IsPoisoned();
if (Truth(before != after))
{
UO.Print("State changed: " + Convert.ToString(before) + " -> " + 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 [IsPoisoned]. -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Poisoned:bridge.Poisoned(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
serial => bridge.Poisoned(serial)๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => getter(bridge.Self)API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Poisoned:bridge.Poisoned(Arg(0, bridge.Self)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0, bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "ispoisoned": return new InjectionValue(bridge.Poisoned(Arg(0, bridge.Self)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.IsYellowHits(object? objID);๋ ธ๋์ ์ฒด๋ ฅ ๋ฐ ํ๋๊ทธ mobile๋ฅผ ํ์ธํฉ๋๋ค.
-
objIDโ ํน์ ๊ฐ์ฒด์ ํ์ serial/ID: int, 16์ง์ ๋ฌธ์์ด ๋๋ ๋ณ์นญ self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse ๋๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ graphic/type์ด ์๋๋๋ค. ์ง์ ๋์ง ์์ ์ด๋ฆ์ 0๋ก ํด์๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ์ ๋์์ ์ด์ง ์์ต๋๋ค. ์ธ์๋ ํ์์ ๋๋ค. ์ง์ self๋ฅผ ํต๊ณผํ์ธ์.
int 1 - ๋ก๋๋ mobile์๋ IsYellowHits ์์ฑ์ด ์์ต๋๋ค. int 0 - ์์ฑ์ด ๋๋ฝ๋์๊ฑฐ๋ ๊ฐ์ฒด๊ฐ mobile์ด ์๋๊ฑฐ๋ ์ ์ ์๊ฑฐ๋ ์ญ์ ๋์์ต๋๋ค. ์ด๋ ํ ๋ง ์์ IDE ๋๋ ์๋ HP์ด ์๋ ์๋ฒ/ํธํ ํ๋๊ทธ์ ๋๋ค. ํ๋๊ทธ๊ฐ ์๋ค๊ณ ํด์ ์ทจ์ฝ์ฑ์ด ์ ์ฆ๋๋ ๊ฒ์ ์๋๋๋ค. ์๋ฒ๊ฐ ๋ณดํธ๋ฅผ ๋ค๋ฅด๊ฒ ๋ํ๋ผ ์ ์์ต๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก์ปฌ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค. ์๋ฒ์ ๋ํ ์์ฒญ๋ ์๊ณ ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ ์ด๋ํ ํ์๋ ์์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ ์ฝ๋ ์๊ฐ์ ๊ฐ๋ฆฌํจ๋ค. UO.Wait ๋๋ ๋ค๋ฅธ ์์ ํ์ ๊ฐ์ฒด์ ํด๋น ํ๋๊ทธ๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- ์ด๊ฒ์ ํ ๋ง ์์ IDE ๋๋ ์๋ HP์ด ์๋ ์๋ฒ/ํธํ ํ๋๊ทธ์ ๋๋ค. ํ๋๊ทธ๊ฐ ์๋ค๊ณ ํด์ ์ทจ์ฝ์ฑ์ด ์ ์ฆ๋๋ ๊ฒ์ ์๋๋๋ค. ์๋ฒ๊ฐ ๋ณดํธ๋ฅผ ๋ค๋ฅด๊ฒ ๋ํ๋ผ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.IsYellowHits("self");
UO.Print("IsYellowHits: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- self ์ธ์๋ ํด๋น ๋ฌธ์๋ฅผ ๋ช ์์ ์ผ๋ก ์ ํํฉ๋๋ค. ์ํ - 1/0์๋ง ํด๋น๋ฉ๋๋ค.
- ์ด๊ฒ์ ํ ๋ง ์์ IDE ๋๋ ์๋ HP์ด ์๋ ์๋ฒ/ํธํ ํ๋๊ทธ์ ๋๋ค. ํ๋๊ทธ๊ฐ ์๋ค๊ณ ํด์ ์ทจ์ฝ์ฑ์ด ์ ์ฆ๋๋ ๊ฒ์ ์๋๋๋ค. ์๋ฒ๊ฐ ๋ณดํธ๋ฅผ ๋ค๋ฅด๊ฒ ๋ํ๋ผ ์ ์์ต๋๋ค.
var state = UO.IsYellowHits("self");
var hp = UO.GetHP("self");
UO.Print("Yellow flag: " + Convert.ToString(state));
UO.Print("Known HP: " + Convert.ToString(hp));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- IsNpc ์ ๋ชฉ ๋ฐ ์ ์ ์๋ ๊ฐ์ฒด๋ ์ ์ธ๋ฉ๋๋ค. target์ ๋ณ๊ฒฝ๋๋ lasttarget์ ๋ํ ์ค์๊ฐ ์ฐธ์กฐ๊ฐ ์๋ ๋จ์ผ serial์ ์ ์ฅํฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ IsYellowHits ํ๋๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์ ์ ํ ์ํ๋ฅผ ์์ ํ ํ์๋ง ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var state = UO.IsYellowHits(target);
UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
}
else
{
UO.Print("No loaded mobile selected");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UO.Wait(500) โ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ผ์ ์ค์ง๋ฉ๋๋ค. ์ดํ์๋ mobile์ด ์ฌ์ ํ ์กด์ฌํ๋์ง ๋ณ๋๋ก ํ์ธํฉ๋๋ค.
- ๋ ์ด๋ฏธ์ง๊ฐ ๋น๊ต๋ฉ๋๋ค. ์ค๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ด ๋๋ฝ๋ ์ ์์ผ๋ฉฐ ์ด๋ ์๋ฒ ์ด๋ฒคํธ์ ๋ํ ์ง์์ ์ธ ๊ตฌ๋ ์ด ์๋๋๋ค.
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 target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var before = UO.IsYellowHits(target);
await Delay(500);
if (Truth(UO.IsNPC(target)))
{
var after = UO.IsYellowHits(target);
if (Truth(before != after))
{
UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
}
}
else
{
UO.Print("Mobile left the local world");
}
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetYellowBar:bridge.GetYellowBar(Arg(0, bridge.Self)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0, bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "isyellowhits": return new InjectionValue(bridge.GetYellowBar(Arg(0, bridge.Self)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.LastStatus();ํด๋ผ์ด์ธํธ๊ฐ ์ํ๋ฅผ ์๋ฝํ ๋ง์ง๋ง ๊ฐ์ฒด์ serial๋ฅผ ๋ฐํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int๋ 32 ๋นํธ serial์ด๋ฉฐ, type๋ ์๋๊ณ ๋ ผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ ์๋๋๋ค. 0: ์์ง ์น์ธ๋ ์ํ๊ฐ ์๊ฑฐ๋ ์๋๊ฐ ํด๋ฆฌ์ด๋์์ต๋๋ค. ๊ฐ์ฅ ์ค์ํ ๋นํธ๊ฐ ์ ์ง๋ฉ๋๋ค. ์์๋ serial๋ฅผ ๋ํ๋ผ ์๋ ์์ต๋๋ค. != 0๋ฅผ ํ์ธํ์ธ์. > 0์ด ์๋๊ณ == true๊ฐ ์๋๋๋ค.
- ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค. ์ฝ๊ธฐ๋ ํจํท์ ๋ณด๋ด๊ฑฐ๋ ์ฐฝ์ ์ด๊ฑฐ๋ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. UO.GetStatus(id), RequestStats ๋ฐ UpdateObject๋ ๋ฐ์ดํฐ๋ง ์์ฒญํฉ๋๋ค. ์ ์ก์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค LastStatus.
- ์์ ๋ ํจํค์ง 0x11๋ ๋ชจ๋ ์คํฌ๋ฆฝํธ์ ๋ํด serial ๋ฐ ํด๋ผ์ด์ธํธ์ ์๋ ค์ง X/Y๋ฅผ World์ ํจ๊ป ์ ์ฅํฉ๋๋ค. ์ ์ ์๊ฑฐ๋ ํ๊ดด๋ ๊ฐ์ฒด ๋ฐ ๋ถ์์ ํ ๊ธฐ๋ณธ ํจํค์ง๋ ํญ๋ชฉ์ ๋์ฒดํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ๊ฐ์ฒด์ ํ์ ํจํค์ง๊ฐ ์ด๋ฅผ ๋์ฒดํ ์ ์์ต๋๋ค.
- X/Y๋ ํ์ฌ ์์น๊ฐ ์๋ ์์ ๋น์ ์ํฐํฐ์ ์ค๋ ์ท์ ๋๋ค. mobile์ ๊ฒฝ์ฐ ์ด๋ ์๋ ์ ์ ๋๋ค. ์ปจํ ์ด๋ ๋ด๋ถ ํญ๋ชฉ์ ๊ฒฝ์ฐ ์ด๋ ๋ด์ฉ์ ์ขํ๊ฐ ๋ ์ ์์ต๋๋ค. ์ํ ํจํค์ง ์์ฒด๋ X/Y๋ฅผ ์ ์กํ์ง ์์ต๋๋ค. ์์ ํ ๋ฌผ์ฒด๋ฅผ ์ด๋/์ ๊ฑฐํด๋ ์ด๋ฏธ์ง๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. World.Clear๊ฐ ์ฌ์ค์ ๋ฉ๋๋ค. ๊ธฐ์กด ์งํ์ง๋ฌผ์ ํ์ฌ ์ขํ๋ฅผ ๋ณด๋ ค๋ฉด GetX/GetY๋ฅผ ์ฌ์ฉํ์ธ์.
- ๊ฐ๋ณ ํธ์ถ์ ์์์ ์ค๋ ์ท์ ํ์ฑํ์ง ์์ต๋๋ค. ์๋ฒ๋ ๊ทธ๋ค ์ฌ์ด์ ๊ธฐ๋ก์ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค. ๋๋ฑ์ฑ serial์ ๊ทํ์ ์ฟผ๋ฆฌ์ ๋ํ ์๋ก์ด ๋ต๋ณ์ ๊ตฌ์ฒด์ ์ผ๋ก ์ฆ๋ช ํ์ง ์์ต๋๋ค. ๊ดํธ๊ฐ ์๋ laststatus๋ ์คํฌ๋ฆฝํธ๊ฐ ๋ณ์๋ก ์ฌ์ ์ํ์ง ์์ ๊ฒฝ์ฐ ๋ผ์ด๋ธ ๋ด์ฅ ๊ฐ์ ๋๋ค. UO.LastStatus()๋ ๋ฑ๋ก๋ ๊ธฐ๋ฅ์ ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.LastStatus();
UO.Print("LastStatus: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ ํ ๋ฒ ์ฝํ์ง๋๋ค. serial์ ๊ฒฝ์ฐ HEX๋ ํธ๋ฆฌํ 16์ง์ ํ๊ธฐ๋ฒ์ ์ ์งํฉ๋๋ค. ์ขํ Convert.ToString์ ๊ฒฝ์ฐ ์ซ์๋ฅผ ์ธ์ํฉ๋๋ค. ํธ์ถ์ ๊ฐ์ฒด๋ฅผ ์ ํํ์ง ์์ต๋๋ค.
var value = UO.LastStatus();
UO.Print("Saved value: " + Hex(value));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ๋ชฉ โ serial self. 500๋ ๋ฐ๋ฆฌ์ด ๋จ์์ ์ผ์ ์ค์ง์ด๋ฉฐ ์์๋ก๋ง ์ ํ๋์์ต๋๋ค. ์ด๋ ๋ต๋ณ์ ๋ณด์ฅํ์ง ์์ต๋๋ค. ํ์ฌ ๋ ์ฝ๋๊ฐ ํ์๋๋ฉฐ, ์ด๋ ์ค๋๋์๊ฑฐ๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ์ํ ์ ์์ต๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var subject = UO.Self();
if (Truth(subject != 0))
{
UO.GetStatus(subject);
await Delay(500);
var value = UO.LastStatus();
UO.Print("Known value: " + Hex(value));
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- expectedId - serial, ๋ฉ์ธ์ ์ ์ฅ๋จ. ๋์ฐ๋ฏธ๋ ์๋์ ์์ ํ ์ ์๋์ด ์์ต๋๋ค. -1๋ ์ ํํ ํญ๋ชฉ์ด ๋ ์ด์ ์กด์ฌํ์ง ์์ผ๋ฉฐ ๋ช ๋ น ์์ฒด์ ๊ฒฐ๊ณผ๊ฐ ์๋์ ์๋ฏธํฉ๋๋ค. ๊ฒ์ฌ ์ /ํ๋ ๊ฐ์ฒด๊ฐ ์์ด๋ ์ํ์ ์ค์ฌ์ฃผ์ง๋ง, ๋์ผํ 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 expectedId = UO.LastStatus();
if (Truth(expectedId != 0))
{
var value = ReadSavedStatus(expectedId);
UO.Print("Checked value: " + Convert.ToString(value));
}
return null;
}
dynamic ReadSavedStatus(dynamic expectedId)
{
if (Truth(expectedId == 0) || Truth(UO.LastStatus() != expectedId))
{
return -1;
}
var value = UO.LastStatus();
if (Truth(UO.LastStatus() != expectedId))
{
return -1;
}
return value;
}
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.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastStatus:bridge.LastStatus.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "laststatus": return new InjectionValue(bridge.LastStatus);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.LastStatusX();๋ง์ง๋ง์ผ๋ก ์น์ธ๋ ์ํ ๊ฐ์ฒด์ ์ ์ฅ๋ X ์ขํ๋ฅผ ๋ฐํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int์ X์ ์ ์ฅ๋ ์ขํ์ด๋ฉฐ, ์ํ์ฐฝ์ ํฝ์ ๋ ์๋๊ณ bool๋ ์๋๋๋ค. ์ฒซ ๋ฒ์งธ ์ํ ์ ๋๋ ์๋ ํด๋ฆฌ์ด ํ - 0; ์ขํ 0 ์์ฒด๋ ํ์ฉ๋ฉ๋๋ค. ๋๋ฝ๋ ํญ๋ชฉ์ ๊ตฌ๋ณํ๋ ค๋ฉด UO.LastStatus()๋ฅผ ํ์ธํ์ธ์.
- ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค. ์ฝ๊ธฐ๋ ํจํท์ ๋ณด๋ด๊ฑฐ๋ ์ฐฝ์ ์ด๊ฑฐ๋ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. UO.GetStatus(id), RequestStats ๋ฐ UpdateObject๋ ๋ฐ์ดํฐ๋ง ์์ฒญํฉ๋๋ค. ์ ์ก์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค LastStatus.
- ์์ ๋ ํจํค์ง 0x11๋ ๋ชจ๋ ์คํฌ๋ฆฝํธ์ ๋ํด serial ๋ฐ ํด๋ผ์ด์ธํธ์ ์๋ ค์ง X/Y๋ฅผ World์ ํจ๊ป ์ ์ฅํฉ๋๋ค. ์ ์ ์๊ฑฐ๋ ํ๊ดด๋ ๊ฐ์ฒด ๋ฐ ๋ถ์์ ํ ๊ธฐ๋ณธ ํจํค์ง๋ ํญ๋ชฉ์ ๋์ฒดํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ๊ฐ์ฒด์ ํ์ ํจํค์ง๊ฐ ์ด๋ฅผ ๋์ฒดํ ์ ์์ต๋๋ค.
- X/Y๋ ํ์ฌ ์์น๊ฐ ์๋ ์์ ๋น์ ์ํฐํฐ์ ์ค๋ ์ท์ ๋๋ค. mobile์ ๊ฒฝ์ฐ ์ด๋ ์๋ ์ ์ ๋๋ค. ์ปจํ ์ด๋ ๋ด๋ถ ํญ๋ชฉ์ ๊ฒฝ์ฐ ์ด๋ ๋ด์ฉ์ ์ขํ๊ฐ ๋ ์ ์์ต๋๋ค. ์ํ ํจํค์ง ์์ฒด๋ X/Y๋ฅผ ์ ์กํ์ง ์์ต๋๋ค. ์์ ํ ๋ฌผ์ฒด๋ฅผ ์ด๋/์ ๊ฑฐํด๋ ์ด๋ฏธ์ง๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. World.Clear๊ฐ ์ฌ์ค์ ๋ฉ๋๋ค. ๊ธฐ์กด ์งํ์ง๋ฌผ์ ํ์ฌ ์ขํ๋ฅผ ๋ณด๋ ค๋ฉด GetX/GetY๋ฅผ ์ฌ์ฉํ์ธ์.
- ๊ฐ๋ณ ํธ์ถ์ ์์์ ์ค๋ ์ท์ ํ์ฑํ์ง ์์ต๋๋ค. ์๋ฒ๋ ๊ทธ๋ค ์ฌ์ด์ ๊ธฐ๋ก์ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค. ๋๋ฑ์ฑ serial์ ๊ทํ์ ์ฟผ๋ฆฌ์ ๋ํ ์๋ก์ด ๋ต๋ณ์ ๊ตฌ์ฒด์ ์ผ๋ก ์ฆ๋ช ํ์ง ์์ต๋๋ค. ๊ดํธ๊ฐ ์๋ laststatus๋ ์คํฌ๋ฆฝํธ๊ฐ ๋ณ์๋ก ์ฌ์ ์ํ์ง ์์ ๊ฒฝ์ฐ ๋ผ์ด๋ธ ๋ด์ฅ ๊ฐ์ ๋๋ค. UO.LastStatus()๋ ๋ฑ๋ก๋ ๊ธฐ๋ฅ์ ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.LastStatusX();
UO.Print("LastStatusX: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ ํ ๋ฒ ์ฝํ์ง๋๋ค. serial์ ๊ฒฝ์ฐ HEX๋ ํธ๋ฆฌํ 16์ง์ ํ๊ธฐ๋ฒ์ ์ ์งํฉ๋๋ค. ์ขํ Convert.ToString์ ๊ฒฝ์ฐ ์ซ์๋ฅผ ์ธ์ํฉ๋๋ค. ํธ์ถ์ ๊ฐ์ฒด๋ฅผ ์ ํํ์ง ์์ต๋๋ค.
var value = UO.LastStatusX();
UO.Print("Saved value: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ๋ชฉ โ serial self. 500๋ ๋ฐ๋ฆฌ์ด ๋จ์์ ์ผ์ ์ค์ง์ด๋ฉฐ ์์๋ก๋ง ์ ํ๋์์ต๋๋ค. ์ด๋ ๋ต๋ณ์ ๋ณด์ฅํ์ง ์์ต๋๋ค. ํ์ฌ ๋ ์ฝ๋๊ฐ ํ์๋๋ฉฐ, ์ด๋ ์ค๋๋์๊ฑฐ๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ์ํ ์ ์์ต๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var subject = UO.Self();
if (Truth(subject != 0))
{
UO.GetStatus(subject);
await Delay(500);
var value = UO.LastStatusX();
UO.Print("Known value: " + Convert.ToString(value));
}
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- expectedId - serial, ๋ฉ์ธ์ ์ ์ฅ๋จ. ๋์ฐ๋ฏธ๋ ์๋์ ์์ ํ ์ ์๋์ด ์์ต๋๋ค. -1๋ ์ ํํ ํญ๋ชฉ์ด ๋ ์ด์ ์กด์ฌํ์ง ์์ผ๋ฉฐ ๋ช ๋ น ์์ฒด์ ๊ฒฐ๊ณผ๊ฐ ์๋์ ์๋ฏธํฉ๋๋ค. ๊ฒ์ฌ ์ /ํ๋ ๊ฐ์ฒด๊ฐ ์์ด๋ ์ํ์ ์ค์ฌ์ฃผ์ง๋ง, ๋์ผํ 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 expectedId = UO.LastStatus();
if (Truth(expectedId != 0))
{
var value = ReadSavedStatus(expectedId);
UO.Print("Checked value: " + Convert.ToString(value));
}
return null;
}
dynamic ReadSavedStatus(dynamic expectedId)
{
if (Truth(expectedId == 0) || Truth(UO.LastStatus() != expectedId))
{
return -1;
}
var value = UO.LastStatusX();
if (Truth(UO.LastStatus() != expectedId))
{
return -1;
}
return value;
}
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.LastStatusX. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(bridge.LastStatus). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastStatus:bridge.LastStatus.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int LastStatusX() => bridge is IStatusSnapshotBridge snapshot ? snapshot.LastStatusX : bridge.GetX(bridge.LastStatus);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.LastStatusY();๋ง์ง๋ง์ผ๋ก ์น์ธ๋ ์ํ ๊ฐ์ฒด์ ์ ์ฅ๋ Y ์ขํ๋ฅผ ๋ฐํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int์ Y์ ์ ์ฅ๋ ์ขํ์ด๋ฉฐ, ์ํ์ฐฝ์ ํฝ์ ๋ ์๋๊ณ bool๋ ์๋๋๋ค. ์ฒซ ๋ฒ์งธ ์ํ ์ ๋๋ ์๋ ํด๋ฆฌ์ด ํ - 0; ์ขํ 0 ์์ฒด๋ ํ์ฉ๋ฉ๋๋ค. ๋๋ฝ๋ ํญ๋ชฉ์ ๊ตฌ๋ณํ๋ ค๋ฉด UO.LastStatus()๋ฅผ ํ์ธํ์ธ์.
- ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค. ์ฝ๊ธฐ๋ ํจํท์ ๋ณด๋ด๊ฑฐ๋ ์ฐฝ์ ์ด๊ฑฐ๋ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. UO.GetStatus(id), RequestStats ๋ฐ UpdateObject๋ ๋ฐ์ดํฐ๋ง ์์ฒญํฉ๋๋ค. ์ ์ก์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค LastStatus.
- ์์ ๋ ํจํค์ง 0x11๋ ๋ชจ๋ ์คํฌ๋ฆฝํธ์ ๋ํด serial ๋ฐ ํด๋ผ์ด์ธํธ์ ์๋ ค์ง X/Y๋ฅผ World์ ํจ๊ป ์ ์ฅํฉ๋๋ค. ์ ์ ์๊ฑฐ๋ ํ๊ดด๋ ๊ฐ์ฒด ๋ฐ ๋ถ์์ ํ ๊ธฐ๋ณธ ํจํค์ง๋ ํญ๋ชฉ์ ๋์ฒดํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ๊ฐ์ฒด์ ํ์ ํจํค์ง๊ฐ ์ด๋ฅผ ๋์ฒดํ ์ ์์ต๋๋ค.
- X/Y๋ ํ์ฌ ์์น๊ฐ ์๋ ์์ ๋น์ ์ํฐํฐ์ ์ค๋ ์ท์ ๋๋ค. mobile์ ๊ฒฝ์ฐ ์ด๋ ์๋ ์ ์ ๋๋ค. ์ปจํ ์ด๋ ๋ด๋ถ ํญ๋ชฉ์ ๊ฒฝ์ฐ ์ด๋ ๋ด์ฉ์ ์ขํ๊ฐ ๋ ์ ์์ต๋๋ค. ์ํ ํจํค์ง ์์ฒด๋ X/Y๋ฅผ ์ ์กํ์ง ์์ต๋๋ค. ์์ ํ ๋ฌผ์ฒด๋ฅผ ์ด๋/์ ๊ฑฐํด๋ ์ด๋ฏธ์ง๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. World.Clear๊ฐ ์ฌ์ค์ ๋ฉ๋๋ค. ๊ธฐ์กด ์งํ์ง๋ฌผ์ ํ์ฌ ์ขํ๋ฅผ ๋ณด๋ ค๋ฉด GetX/GetY๋ฅผ ์ฌ์ฉํ์ธ์.
- ๊ฐ๋ณ ํธ์ถ์ ์์์ ์ค๋ ์ท์ ํ์ฑํ์ง ์์ต๋๋ค. ์๋ฒ๋ ๊ทธ๋ค ์ฌ์ด์ ๊ธฐ๋ก์ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค. ๋๋ฑ์ฑ serial์ ๊ทํ์ ์ฟผ๋ฆฌ์ ๋ํ ์๋ก์ด ๋ต๋ณ์ ๊ตฌ์ฒด์ ์ผ๋ก ์ฆ๋ช ํ์ง ์์ต๋๋ค. ๊ดํธ๊ฐ ์๋ laststatus๋ ์คํฌ๋ฆฝํธ๊ฐ ๋ณ์๋ก ์ฌ์ ์ํ์ง ์์ ๊ฒฝ์ฐ ๋ผ์ด๋ธ ๋ด์ฅ ๊ฐ์ ๋๋ค. UO.LastStatus()๋ ๋ฑ๋ก๋ ๊ธฐ๋ฅ์ ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.LastStatusY();
UO.Print("LastStatusY: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ ํ ๋ฒ ์ฝํ์ง๋๋ค. serial์ ๊ฒฝ์ฐ HEX๋ ํธ๋ฆฌํ 16์ง์ ํ๊ธฐ๋ฒ์ ์ ์งํฉ๋๋ค. ์ขํ Convert.ToString์ ๊ฒฝ์ฐ ์ซ์๋ฅผ ์ธ์ํฉ๋๋ค. ํธ์ถ์ ๊ฐ์ฒด๋ฅผ ์ ํํ์ง ์์ต๋๋ค.
var value = UO.LastStatusY();
UO.Print("Saved value: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ๋ชฉ โ serial self. 500๋ ๋ฐ๋ฆฌ์ด ๋จ์์ ์ผ์ ์ค์ง์ด๋ฉฐ ์์๋ก๋ง ์ ํ๋์์ต๋๋ค. ์ด๋ ๋ต๋ณ์ ๋ณด์ฅํ์ง ์์ต๋๋ค. ํ์ฌ ๋ ์ฝ๋๊ฐ ํ์๋๋ฉฐ, ์ด๋ ์ค๋๋์๊ฑฐ๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ์ํ ์ ์์ต๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var subject = UO.Self();
if (Truth(subject != 0))
{
UO.GetStatus(subject);
await Delay(500);
var value = UO.LastStatusY();
UO.Print("Known value: " + Convert.ToString(value));
}
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- expectedId - serial, ๋ฉ์ธ์ ์ ์ฅ๋จ. ๋์ฐ๋ฏธ๋ ์๋์ ์์ ํ ์ ์๋์ด ์์ต๋๋ค. -1๋ ์ ํํ ํญ๋ชฉ์ด ๋ ์ด์ ์กด์ฌํ์ง ์์ผ๋ฉฐ ๋ช ๋ น ์์ฒด์ ๊ฒฐ๊ณผ๊ฐ ์๋์ ์๋ฏธํฉ๋๋ค. ๊ฒ์ฌ ์ /ํ๋ ๊ฐ์ฒด๊ฐ ์์ด๋ ์ํ์ ์ค์ฌ์ฃผ์ง๋ง, ๋์ผํ 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 expectedId = UO.LastStatus();
if (Truth(expectedId != 0))
{
var value = ReadSavedStatus(expectedId);
UO.Print("Checked value: " + Convert.ToString(value));
}
return null;
}
dynamic ReadSavedStatus(dynamic expectedId)
{
if (Truth(expectedId == 0) || Truth(UO.LastStatus() != expectedId))
{
return -1;
}
var value = UO.LastStatusY();
if (Truth(UO.LastStatus() != expectedId))
{
return -1;
}
return value;
}
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.LastStatusY. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(bridge.LastStatus). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastStatus:bridge.LastStatus.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int LastStatusY() => bridge is IStatusSnapshotBridge snapshot ? snapshot.LastStatusY : bridge.GetY(bridge.LastStatus);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.Life();๋ก์ปฌ ๋ชจ๋ธ์์ ํ์ฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int๋ bool๋ ๋ฐฑ๋ถ์จ์ด ์๋ Hits ํ๋์ ๊ฐ์ ๋๋ค. 0๋ ์ค์ ๊ฐ์ด๊ฑฐ๋ ๋๋ฝ๋ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค. ์ต๋๊ฐ 0์ ์ ์๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋์ mobile์ ๊ฒฝ์ฐ ์๋ฏธ๊ฐ ์๋ ค์ง์ง ์์์ ์ ์์ต๋๋ค. HP/HitsMax์๋ ์ ํํ ํฌ์ธํธ ๋์ ์๋์ ์ธ ์๋ฒ ๊ท๋ชจ๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค. HP=0๋ ์ฌ๋ง์ ์ฆ๋ช ํ์ง ์์ต๋๋ค. ์ด์ ๋ํ Dead/IsDead์ด ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ์ํ๋ฅผ ์ด์ง ์์ผ๋ฉฐ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ์์ฒญํ์ง ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ์ด๋ฏธ ๋ก๋๋ ๋ฐ์ดํฐ๋ง ์ฝ์ต๋๋ค. ํน์ฑ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ ๋ณ๋์ ๋ ์์ ๋๋ค. Exists์ ๋ค์ ๋์ ์ฌ์ด์ ์ธ์์ด ๋ฐ๋ ์๋ ์์ต๋๋ค. ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ ์์์ฑ ์ค๋ ์ท์ ํ์ฑํ์ง ์์ต๋๋ค.
- ๊ฐ์ฒด๋ฅผ ์ฝ์ ๋ World.Get์ ๋๋ฝ๋ ๋๋ IsDestroyed๋ฅผ ๊ฑฐ๋ถํ๊ณ ๊ฒฐ๊ณผ๋ 0์ ๋๋ค. HP/HitsMax๋ ์ด๋ฌํ ํ๋๊ฐ ์๋ ํญ๋ชฉ์ ํฌํจํ์ฌ ์ํฐํฐ์์ ์ฝ์ต๋๋ค. Mana/Stamina - ๋ชจ๋ฐ์ผ ์ ์ฉ์ ๋๋ค. ๋ ผ์ ์์ด self์ ์ฝ์ผ์ธ์. ๋งค๊ฐ๋ณ์๊ฐ ์๋ ๋์ผํ ์ด๋ฆ์ ๋ณํ์ด ๋ฐ๋์ ID๋ฅผ ํฌํจํ ๋ณํ์ ๊ฐ์ง ํ์๋ ์์ต๋๋ค. ์๋ช ์ ์ฐธ์กฐํ์ธ์.
- ์ธ์ ์์ด ์ฝ์ผ๋ฉด ๋๋ฝ๋๊ฑฐ๋ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋ํด 0๋ ๋ฐํ๋ฉ๋๋ค. ์ด๋ World.Get์ ํตํ ํ์๋ฟ๋ง ์๋๋ผ ์ง์ Mana/Stamina ๋ฐ ์ต๋๊ฐ์ ์ ์ฉ๋ฉ๋๋ค. ํ์ฌ ์ฃฝ์ ์บ๋ฆญํฐ๋ ๊ฐ์ ์ ์งํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.Life();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ก ํ์๋ฉ๋๋ค. ๊ฐ์ ํ๋์ ์ซ์๋ฅผ ์ ์ฅํ๊ณ ๋ณํํฉ๋๋ค.ToString๋ ๋ฉ์์ง์ฉ์ผ๋ก๋ง ๋ณํํฉ๋๋ค.
var value = UO.Life();
UO.Print("Life: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ํ๋์ ์ ์ฉ๋ ์๊ณ๊ฐ ๋๋ ๊ณ์ฐ์ด ํ์๋ฉ๋๋ค. ์กฐ๊ฑด์ ์ซ์๋ ์๋ฒ ์ ํ์ด ์๋ ์์ ์ค์ ์ ๋๋ค. ์ต๋๊ฐ์ผ๋ก ๋๋๊ธฐ ์ ์ ์์ฑ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.Life();
var maximum = UO.GetMaxHP();
if (Truth(maximum > 0) && Truth(value * 100 / maximum < 50))
{
UO.Print("Health below half of the known maximum");
}
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 ํ์์ด ์์ต๋๋ค. ReadValue ๋งค๊ฐ๋ณ์๊ฐ ์์ผ๋ฉด self๋ฅผ ์ฝ์ต๋๋ค. ๋ ํธ์ถ์ 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 = ReadValue();
await Delay(1000);
var after = ReadValue();
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
return null;
}
dynamic ReadValue()
{
return UO.Life();
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetHP:bridge.GetHP(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "life": return new InjectionValue(bridge.GetHP(bridge.Self));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Luck();์บ๋ฆญํฐ์ ์ํ ์นด์ดํฐ(ํ์ด ํฌ์ธํธ)๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ ํ์ด ํฌ์ธํธ, ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ 0..65535. 0๋ ์ค์ ๊ฐ์ด๊ฑฐ๋, ๋ฐ์ดํฐ๊ฐ ์๊ฑฐ๋, ๋๋ฝ/ํ๊ดด๋ ํ๋ ์ด์ด์ผ ์ ์์ต๋๋ค. ์ด๋ bool, ID ๋๋ type๊ฐ ์๋ ์๋์ ๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋๋ผ ํ๋์ ๋จ์๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด ๋ช ๋ น์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณตํ์ง ์์ผ๋ฉฐ ๋ฐฐ์ด์ ๋ฐํํ์ง ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.Luck ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- Luck ์ํ type >= 4์์ UInt16์ผ๋ก ์ ์ฅ๋ ์๋ฒ ํ์ด ํฌ์ธํธ๋ฅผ ์ฝ์ต๋๋ค. ์ด๋ ๋ฐฑ๋ถ์จ, ์์์ ์ซ์ ๋๋ ์ ๋ฆฌํ ํ์ง์ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์ฝ์ ๋ ํด๋ผ์ด์ธํธ๋ ๋๋กญ๋ฅ ์ ๊ณ์ฐํ์ง ์์ผ๋ฉฐ ์ฅ๋น ๋ณด๋์ค๋ฅผ ์ถ๊ฐํ์ง ์์ต๋๋ค.
- CharacterStatus๋ ์ ๋ฐ์ดํธํ๊ธฐ ์ ์ ํ์ํ ๋ณธ๋ฌธ์ ํ์ธํฉ๋๋ค. Weight๋ ์์ฒด ํ์ฅ ์ํ์ธ ์ฌ๋กฏ - type 3, Luck - type 4, ์๋ฒ WeightMax - type 5์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ํ์ ์นด์ดํฐ๊ฐ ์๋ ์ปดํฉํธ/์ค๋๋ ํจํค์ง๋ ์ด์ ์บ์๋ฅผ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค. ์ ํ๋ ์ด์ด๋ ์ฒ์๋ถํฐ ์์๋ฉ๋๋ค. ํตํ๋ ์๋ก์ด ์ํ๋ฅผ ๋ฐ์๋ค๋ ๊ฒ์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
- ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค. C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Luck();
UO.Print("Luck: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- value๋ ์์ ์ ๋ฌธ์์ ๋ํ ์ธ์ ์๋ ํธ์ถ์ ํ ๋ฒ ์ ์ฅํฉ๋๋ค. Convert.ToString๋ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ก๊ทธ ๋ฒํธ์ ํ์์ ์ง์ ํฉ๋๋ค.
var value = UO.Luck();
UO.Print("Luck: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UO.Wait(500)๋ 500 ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ ํ๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ฐจ์ด๋ ์์, 0 ๋๋ ์์์ผ ์ ์์ต๋๋ค. ์ค๊ฐ ์ ๋ฐ์ดํธ ๋ฐ ์บ๋ฆญํฐ ๋ณ๊ฒฝ์ ์๋ต๋ ์ ์์ต๋๋ค. ์ผ์ ์ ์ง๊ฐ ๊ทธ ์์ ๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.Luck();
await Delay(500);
var after = UO.Luck();
var difference = after - before;
UO.Print("Counter change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- LuckAtLeast(์ต์) ์ซ์ ์๊ตฌ ์ฌํญ์ ๋ฐ์ต๋๋ค. 1000๋ ์์์ด์ง ํ๋๋ ๋น์จ์ด ์๋๋๋ค. ํ๋ ์ด์ด ๋ถ์ฌ๋ฅผ ๊ฑฐ๋ถํ๊ณ ํ์ด์ ํ ๋ฒ ์ฝ๊ณ bool: true ๋๋ false ๊ฐ >= ์ต์๊ฐ์ผ๋ก ๋ฐํํฉ๋๋ค. ํ์ด ์์ฒด๋ bool๊ฐ ์๋๋๋ค. ์บ์๋ ํฌ์ธํธ๋ฅผ ๋น๊ตํ์ฌ ์ ๋ฆฌํ ๋๋กญ์ ์์ธกํ์ง ์์ต๋๋ค.
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(Truth(LuckAtLeast(1000)) == true))
{
UO.Print("Local check passed");
}
else
{
UO.Print("Local check failed or data unavailable");
}
return null;
}
dynamic LuckAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.Luck();
return value >= minimum;
}
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.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Luck:bridge.Luck.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "luck": return new InjectionValue(bridge.Luck);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.Mana();๋ก์ปฌ ๋ชจ๋ธ์์ ํ์ฌ ๋ง๋๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int๋ ๋ฐฑ๋ถ์จ์ด๋ bool๊ฐ ์๋ Mana ํ๋์ ๊ฐ์ ๋๋ค. 0๋ ์ค์ ๊ฐ์ด๊ฑฐ๋ ๋๋ฝ๋ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค. ์ต๋๊ฐ 0์ ์ ์๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋์ mobile์ ๊ฒฝ์ฐ ์๋ฏธ๊ฐ ์๋ ค์ง์ง ์์์ ์ ์์ต๋๋ค. HP/HitsMax์๋ ์ ํํ ํฌ์ธํธ ๋์ ์๋์ ์ธ ์๋ฒ ๊ท๋ชจ๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค. HP=0๋ ์ฌ๋ง์ ์ฆ๋ช ํ์ง ์์ต๋๋ค. Dead/IsDead๊ฐ ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ์ํ๋ฅผ ์ด์ง ์์ผ๋ฉฐ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ์์ฒญํ์ง ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ์ด๋ฏธ ๋ก๋๋ ๋ฐ์ดํฐ๋ง ์ฝ์ต๋๋ค. ํน์ฑ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ ๋ณ๋์ ๋ ์์ ๋๋ค. Exists์ ๋ค์ ๋์ ์ฌ์ด์ ์ธ์์ด ๋ฐ๋ ์๋ ์์ต๋๋ค. ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ ์์์ฑ ์ค๋ ์ท์ ํ์ฑํ์ง ์์ต๋๋ค.
- ๊ฐ์ฒด๋ฅผ ์ฝ์ ๋ World.Get์ ๋๋ฝ๋ ๋๋ IsDestroyed๋ฅผ ๊ฑฐ๋ถํ๊ณ ๊ฒฐ๊ณผ๋ 0์ ๋๋ค. HP/HitsMax๋ ์ด๋ฌํ ํ๋๊ฐ ์๋ ํญ๋ชฉ์ ํฌํจํ์ฌ ์ํฐํฐ์์ ์ฝ์ต๋๋ค. Mana/Stamina - ๋ชจ๋ฐ์ผ ์ ์ฉ์ ๋๋ค. ๋ ผ์ ์์ด self์ ์ฝ์ผ์ธ์. ๋งค๊ฐ๋ณ์๊ฐ ์๋ ๋์ผํ ์ด๋ฆ์ ๋ณํ์ด ๋ฐ๋์ ID๋ฅผ ํฌํจํ ๋ณํ์ ๊ฐ์ง ํ์๋ ์์ต๋๋ค. ์๋ช ์ ์ฐธ์กฐํ์ธ์.
- ์ธ์ ์์ด ์ฝ์ผ๋ฉด ๋๋ฝ๋๊ฑฐ๋ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋ํด 0๋ ๋ฐํ๋ฉ๋๋ค. ์ด๋ World.Get์ ํตํ ํ์๋ฟ๋ง ์๋๋ผ ์ง์ Mana/Stamina ๋ฐ ์ต๋๊ฐ์ ์ ์ฉ๋ฉ๋๋ค. ํ์ฌ ์ฃฝ์ ์บ๋ฆญํฐ๋ ๊ฐ์ ์ ์งํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.Mana();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ก ํ์๋ฉ๋๋ค. ๊ฐ์ ํ๋์ ์ซ์๋ฅผ ์ ์ฅํ๊ณ ๋ณํํฉ๋๋ค.ToString๋ ๋ฉ์์ง์ฉ์ผ๋ก๋ง ๋ณํํฉ๋๋ค.
var value = UO.Mana();
UO.Print("Mana: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ํ๋์ ์ ์ฉ๋ ์๊ณ๊ฐ ๋๋ ๊ณ์ฐ์ด ํ์๋ฉ๋๋ค. ์กฐ๊ฑด์ ์ซ์๋ ์๋ฒ ์ ํ์ด ์๋ ์์ ์ค์ ์ ๋๋ค. ์ต๋๊ฐ์ผ๋ก ๋๋๊ธฐ ์ ์ ์์ฑ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.Mana();
if (Truth(value >= 10))
{
UO.Print("At least ten mana points are known");
}
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 ํ์์ด ์์ต๋๋ค. ReadValue ๋งค๊ฐ๋ณ์๊ฐ ์์ผ๋ฉด self๋ฅผ ์ฝ์ต๋๋ค. ๋ ํธ์ถ์ 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 = ReadValue();
await Delay(1000);
var after = ReadValue();
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
return null;
}
dynamic ReadValue()
{
return UO.Mana();
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Mana:bridge.Mana.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "mana": return new InjectionValue(bridge.Mana);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.MaxHP();๋ก์ปฌ ๋ชจ๋ธ์์ ์ต๋ ์ํ๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int๋ ๋ฐฑ๋ถ์จ์ด๋ bool๊ฐ ์๋ HitsMax ํ๋์ ๊ฐ์ ๋๋ค. 0๋ ์ค์ ๊ฐ์ด๊ฑฐ๋ ๋๋ฝ๋ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค. ์ต๋๊ฐ 0์ ์ ์๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋์ mobile์ ๊ฒฝ์ฐ ์๋ฏธ๊ฐ ์๋ ค์ง์ง ์์์ ์ ์์ต๋๋ค. HP/HitsMax์๋ ์ ํํ ํฌ์ธํธ ๋์ ์๋์ ์ธ ์๋ฒ ๊ท๋ชจ๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค. HP=0๋ ์ฌ๋ง์ ์ฆ๋ช ํ์ง ์์ต๋๋ค. Dead/IsDead๊ฐ ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ์ํ๋ฅผ ์ด์ง ์์ผ๋ฉฐ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ์์ฒญํ์ง ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ์ด๋ฏธ ๋ก๋๋ ๋ฐ์ดํฐ๋ง ์ฝ์ต๋๋ค. ํน์ฑ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ ๋ณ๋์ ๋ ์์ ๋๋ค. Exists์ ๋ค์ ๋์ ์ฌ์ด์ ์ธ์์ด ๋ฐ๋ ์๋ ์์ต๋๋ค. ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ ์์์ฑ ์ค๋ ์ท์ ํ์ฑํ์ง ์์ต๋๋ค.
- ๊ฐ์ฒด๋ฅผ ์ฝ์ ๋ World.Get์ ๋๋ฝ๋ ๋๋ IsDestroyed๋ฅผ ๊ฑฐ๋ถํ๊ณ ๊ฒฐ๊ณผ๋ 0์ ๋๋ค. HP/HitsMax๋ ์ด๋ฌํ ํ๋๊ฐ ์๋ ํญ๋ชฉ์ ํฌํจํ์ฌ ์ํฐํฐ์์ ์ฝ์ต๋๋ค. Mana/Stamina - ๋ชจ๋ฐ์ผ ์ ์ฉ์ ๋๋ค. ๋ ผ์ ์์ด self์ ์ฝ์ผ์ธ์. ๋งค๊ฐ๋ณ์๊ฐ ์๋ ๋์ผํ ์ด๋ฆ์ ๋ณํ์ด ๋ฐ๋์ ID๋ฅผ ํฌํจํ ๋ณํ์ ๊ฐ์ง ํ์๋ ์์ต๋๋ค. ์๋ช ์ ์ฐธ์กฐํ์ธ์.
- ์ธ์ ์์ด ์ฝ์ผ๋ฉด ๋๋ฝ๋๊ฑฐ๋ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋ํด 0๋ ๋ฐํ๋ฉ๋๋ค. ์ด๋ World.Get์ ํตํ ํ์๋ฟ๋ง ์๋๋ผ ์ง์ Mana/Stamina ๋ฐ ์ต๋๊ฐ์ ์ ์ฉ๋ฉ๋๋ค. ํ์ฌ ์ฃฝ์ ์บ๋ฆญํฐ๋ ๊ฐ์ ์ ์งํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.MaxHP();
UO.Print("MaxHP: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ก ํ์๋ฉ๋๋ค. ๊ฐ์ ํ๋์ ์ซ์๋ฅผ ์ ์ฅํ๊ณ ๋ณํํฉ๋๋ค.ToString๋ ๋ฉ์์ง์ฉ์ผ๋ก๋ง ๋ณํํฉ๋๋ค.
var value = UO.MaxHP();
UO.Print("MaxHP: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ํ๋์ ์ ์ฉ๋ ์๊ณ๊ฐ ๋๋ ๊ณ์ฐ์ด ํ์๋ฉ๋๋ค. ์กฐ๊ฑด์ ์ซ์๋ ์๋ฒ ์ ํ์ด ์๋ ์์ ์ค์ ์ ๋๋ค. ์ต๋๊ฐ์ผ๋ก ๋๋๊ธฐ ์ ์ ์์ฑ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.MaxHP();
if (Truth(value > 0))
{
UO.Print("Known HP percent: " + Convert.ToString(UO.GetHP() * 100 / value));
}
else
{
UO.Print("HP maximum unavailable");
}
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 ํ์์ด ์์ต๋๋ค. ReadValue ๋งค๊ฐ๋ณ์๊ฐ ์์ผ๋ฉด self๋ฅผ ์ฝ์ต๋๋ค. ๋ ํธ์ถ์ 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 = ReadValue();
await Delay(1000);
var after = ReadValue();
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
return null;
}
dynamic ReadValue()
{
return UO.MaxHP();
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [MaxHP]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetMaxHP:bridge.GetMaxHP(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.GetMaxHP(bridge.Self)API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.MaxLife();๋ก์ปฌ ๋ชจ๋ธ์์ ์ต๋ ์ํ๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int๋ ๋ฐฑ๋ถ์จ์ด๋ bool๊ฐ ์๋ HitsMax ํ๋์ ๊ฐ์ ๋๋ค. 0๋ ์ค์ ๊ฐ์ด๊ฑฐ๋ ๋๋ฝ๋ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค. ์ต๋๊ฐ 0์ ์ ์๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋์ mobile์ ๊ฒฝ์ฐ ์๋ฏธ๊ฐ ์๋ ค์ง์ง ์์์ ์ ์์ต๋๋ค. HP/HitsMax์๋ ์ ํํ ํฌ์ธํธ ๋์ ์๋์ ์ธ ์๋ฒ ๊ท๋ชจ๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค. HP=0๋ ์ฌ๋ง์ ์ฆ๋ช ํ์ง ์์ต๋๋ค. Dead/IsDead๊ฐ ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ์ํ๋ฅผ ์ด์ง ์์ผ๋ฉฐ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ์์ฒญํ์ง ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ์ด๋ฏธ ๋ก๋๋ ๋ฐ์ดํฐ๋ง ์ฝ์ต๋๋ค. ํน์ฑ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ ๋ณ๋์ ๋ ์์ ๋๋ค. Exists์ ๋ค์ ๋์ ์ฌ์ด์ ์ธ์์ด ๋ฐ๋ ์๋ ์์ต๋๋ค. ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ ์์์ฑ ์ค๋ ์ท์ ํ์ฑํ์ง ์์ต๋๋ค.
- ๊ฐ์ฒด๋ฅผ ์ฝ์ ๋ World.Get์ ๋๋ฝ๋ ๋๋ IsDestroyed๋ฅผ ๊ฑฐ๋ถํ๊ณ ๊ฒฐ๊ณผ๋ 0์ ๋๋ค. HP/HitsMax๋ ์ด๋ฌํ ํ๋๊ฐ ์๋ ํญ๋ชฉ์ ํฌํจํ์ฌ ์ํฐํฐ์์ ์ฝ์ต๋๋ค. Mana/Stamina - ๋ชจ๋ฐ์ผ ์ ์ฉ์ ๋๋ค. ๋ ผ์ ์์ด self์ ์ฝ์ผ์ธ์. ๋งค๊ฐ๋ณ์๊ฐ ์๋ ๋์ผํ ์ด๋ฆ์ ๋ณํ์ด ๋ฐ๋์ ID๋ฅผ ํฌํจํ ๋ณํ์ ๊ฐ์ง ํ์๋ ์์ต๋๋ค. ์๋ช ์ ์ฐธ์กฐํ์ธ์.
- ์ธ์ ์์ด ์ฝ์ผ๋ฉด ๋๋ฝ๋๊ฑฐ๋ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋ํด 0๋ ๋ฐํ๋ฉ๋๋ค. ์ด๋ World.Get์ ํตํ ํ์๋ฟ๋ง ์๋๋ผ ์ง์ Mana/Stamina ๋ฐ ์ต๋๊ฐ์ ์ ์ฉ๋ฉ๋๋ค. ํ์ฌ ์ฃฝ์ ์บ๋ฆญํฐ๋ ๊ฐ์ ์ ์งํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.MaxLife();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ก ํ์๋ฉ๋๋ค. ๊ฐ์ ํ๋์ ์ซ์๋ฅผ ์ ์ฅํ๊ณ ๋ณํํฉ๋๋ค.ToString๋ ๋ฉ์์ง์ฉ์ผ๋ก๋ง ๋ณํํฉ๋๋ค.
var value = UO.MaxLife();
UO.Print("MaxLife: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ํ๋์ ์ ์ฉ๋ ์๊ณ๊ฐ ๋๋ ๊ณ์ฐ์ด ํ์๋ฉ๋๋ค. ์กฐ๊ฑด์ ์ซ์๋ ์๋ฒ ์ ํ์ด ์๋ ์์ ์ค์ ์ ๋๋ค. ์ต๋๊ฐ์ผ๋ก ๋๋๊ธฐ ์ ์ ์์ฑ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.MaxLife();
if (Truth(value > 0))
{
UO.Print("Known HP percent: " + Convert.ToString(UO.GetHP() * 100 / value));
}
else
{
UO.Print("HP maximum unavailable");
}
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 ํ์์ด ์์ต๋๋ค. ReadValue ๋งค๊ฐ๋ณ์๊ฐ ์์ผ๋ฉด self๋ฅผ ์ฝ์ต๋๋ค. ๋ ํธ์ถ์ 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 = ReadValue();
await Delay(1000);
var after = ReadValue();
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
return null;
}
dynamic ReadValue()
{
return UO.MaxLife();
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetMaxHP:bridge.GetMaxHP(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "maxlife": return new InjectionValue(bridge.GetMaxHP(bridge.Self));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.MaxMana();๋ก์ปฌ ๋ชจ๋ธ์์ ์ต๋ ๋ง๋๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int๋ ๋ฐฑ๋ถ์จ์ด๋ bool๊ฐ ์๋ ManaMax ํ๋์ ๊ฐ์ ๋๋ค. 0๋ ์ค์ ๊ฐ์ด๊ฑฐ๋ ๋๋ฝ๋ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค. ์ต๋๊ฐ 0์ ์ ์๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋์ mobile์ ๊ฒฝ์ฐ ์๋ฏธ๊ฐ ์๋ ค์ง์ง ์์์ ์ ์์ต๋๋ค. HP/HitsMax์๋ ์ ํํ ํฌ์ธํธ ๋์ ์๋์ ์ธ ์๋ฒ ๊ท๋ชจ๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค. HP=0๋ ์ฌ๋ง์ ์ฆ๋ช ํ์ง ์์ต๋๋ค. Dead/IsDead๊ฐ ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ์ํ๋ฅผ ์ด์ง ์์ผ๋ฉฐ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ์์ฒญํ์ง ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ์ด๋ฏธ ๋ก๋๋ ๋ฐ์ดํฐ๋ง ์ฝ์ต๋๋ค. ํน์ฑ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ ๋ณ๋์ ๋ ์์ ๋๋ค. Exists์ ๋ค์ ๋์ ์ฌ์ด์ ์ธ์์ด ๋ฐ๋ ์๋ ์์ต๋๋ค. ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ ์์์ฑ ์ค๋ ์ท์ ํ์ฑํ์ง ์์ต๋๋ค.
- ๊ฐ์ฒด๋ฅผ ์ฝ์ ๋ World.Get์ ๋๋ฝ๋ ๋๋ IsDestroyed๋ฅผ ๊ฑฐ๋ถํ๊ณ ๊ฒฐ๊ณผ๋ 0์ ๋๋ค. HP/HitsMax๋ ์ด๋ฌํ ํ๋๊ฐ ์๋ ํญ๋ชฉ์ ํฌํจํ์ฌ ์ํฐํฐ์์ ์ฝ์ต๋๋ค. Mana/Stamina - ๋ชจ๋ฐ์ผ ์ ์ฉ์ ๋๋ค. ๋ ผ์ ์์ด self์ ์ฝ์ผ์ธ์. ๋งค๊ฐ๋ณ์๊ฐ ์๋ ๋์ผํ ์ด๋ฆ์ ๋ณํ์ด ๋ฐ๋์ ID๋ฅผ ํฌํจํ ๋ณํ์ ๊ฐ์ง ํ์๋ ์์ต๋๋ค. ์๋ช ์ ์ฐธ์กฐํ์ธ์.
- ์ธ์ ์์ด ์ฝ์ผ๋ฉด ๋๋ฝ๋๊ฑฐ๋ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋ํด 0๋ ๋ฐํ๋ฉ๋๋ค. ์ด๋ World.Get์ ํตํ ํ์๋ฟ๋ง ์๋๋ผ ์ง์ Mana/Stamina ๋ฐ ์ต๋๊ฐ์ ์ ์ฉ๋ฉ๋๋ค. ํ์ฌ ์ฃฝ์ ์บ๋ฆญํฐ๋ ๊ฐ์ ์ ์งํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.MaxMana();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ก ํ์๋ฉ๋๋ค. ๊ฐ์ ํ๋์ ์ซ์๋ฅผ ์ ์ฅํ๊ณ ๋ณํํฉ๋๋ค.ToString๋ ๋ฉ์์ง์ฉ์ผ๋ก๋ง ๋ณํํฉ๋๋ค.
var value = UO.MaxMana();
UO.Print("MaxMana: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ํ๋์ ์ ์ฉ๋ ์๊ณ๊ฐ ๋๋ ๊ณ์ฐ์ด ํ์๋ฉ๋๋ค. ์กฐ๊ฑด์ ์ซ์๋ ์๋ฒ ์ ํ์ด ์๋ ์์ ์ค์ ์ ๋๋ค. ์ต๋๊ฐ์ผ๋ก ๋๋๊ธฐ ์ ์ ์์ฑ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.MaxMana();
if (Truth(value > 0))
{
UO.Print("Mana percent: " + Convert.ToString(UO.Mana() * 100 / value));
}
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 ํ์์ด ์์ต๋๋ค. ReadValue ๋งค๊ฐ๋ณ์๊ฐ ์์ผ๋ฉด self๋ฅผ ์ฝ์ต๋๋ค. ๋ ํธ์ถ์ 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 = ReadValue();
await Delay(1000);
var after = ReadValue();
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
return null;
}
dynamic ReadValue()
{
return UO.MaxMana();
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.MaxMana:bridge.MaxMana.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "maxmana": return new InjectionValue(bridge.MaxMana);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.MaxStam();๋ก์ปฌ ๋ชจ๋ธ์์ ์ต๋ ๋ด๊ตฌ์ฑ์ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int๋ ๋ฐฑ๋ถ์จ์ด๋ bool๊ฐ ์๋ StaminaMax ํ๋์ ๊ฐ์ ๋๋ค. 0๋ ์ค์ ๊ฐ์ด๊ฑฐ๋ ๋๋ฝ๋ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค. ์ต๋๊ฐ 0์ ์ ์๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋์ mobile์ ๊ฒฝ์ฐ ์๋ฏธ๊ฐ ์๋ ค์ง์ง ์์์ ์ ์์ต๋๋ค. HP/HitsMax์๋ ์ ํํ ํฌ์ธํธ ๋์ ์๋์ ์ธ ์๋ฒ ๊ท๋ชจ๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค. HP=0๋ ์ฌ๋ง์ ์ฆ๋ช ํ์ง ์์ต๋๋ค. Dead/IsDead๊ฐ ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ์ํ๋ฅผ ์ด์ง ์์ผ๋ฉฐ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ์์ฒญํ์ง ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ์ด๋ฏธ ๋ก๋๋ ๋ฐ์ดํฐ๋ง ์ฝ์ต๋๋ค. ํน์ฑ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ ๋ณ๋์ ๋ ์์ ๋๋ค. Exists์ ๋ค์ ๋์ ์ฌ์ด์ ์ธ์์ด ๋ฐ๋ ์๋ ์์ต๋๋ค. ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ ์์์ฑ ์ค๋ ์ท์ ํ์ฑํ์ง ์์ต๋๋ค.
- ๊ฐ์ฒด๋ฅผ ์ฝ์ ๋ World.Get์ ๋๋ฝ๋ ๋๋ IsDestroyed๋ฅผ ๊ฑฐ๋ถํ๊ณ ๊ฒฐ๊ณผ๋ 0์ ๋๋ค. HP/HitsMax๋ ์ด๋ฌํ ํ๋๊ฐ ์๋ ํญ๋ชฉ์ ํฌํจํ์ฌ ์ํฐํฐ์์ ์ฝ์ต๋๋ค. Mana/Stamina - ๋ชจ๋ฐ์ผ ์ ์ฉ์ ๋๋ค. ๋ ผ์ ์์ด self์ ์ฝ์ผ์ธ์. ๋งค๊ฐ๋ณ์๊ฐ ์๋ ๋์ผํ ์ด๋ฆ์ ๋ณํ์ด ๋ฐ๋์ ID๋ฅผ ํฌํจํ ๋ณํ์ ๊ฐ์ง ํ์๋ ์์ต๋๋ค. ์๋ช ์ ์ฐธ์กฐํ์ธ์.
- ์ธ์ ์์ด ์ฝ์ผ๋ฉด ๋๋ฝ๋๊ฑฐ๋ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋ํด 0๋ ๋ฐํ๋ฉ๋๋ค. ์ด๋ World.Get์ ํตํ ํ์๋ฟ๋ง ์๋๋ผ ์ง์ Mana/Stamina ๋ฐ ์ต๋๊ฐ์ ์ ์ฉ๋ฉ๋๋ค. ํ์ฌ ์ฃฝ์ ์บ๋ฆญํฐ๋ ๊ฐ์ ์ ์งํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.MaxStam();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ก ํ์๋ฉ๋๋ค. ๊ฐ์ ํ๋์ ์ซ์๋ฅผ ์ ์ฅํ๊ณ ๋ณํํฉ๋๋ค.ToString๋ ๋ฉ์์ง์ฉ์ผ๋ก๋ง ๋ณํํฉ๋๋ค.
var value = UO.MaxStam();
UO.Print("MaxStam: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ํ๋์ ์ ์ฉ๋ ์๊ณ๊ฐ ๋๋ ๊ณ์ฐ์ด ํ์๋ฉ๋๋ค. ์กฐ๊ฑด์ ์ซ์๋ ์๋ฒ ์ ํ์ด ์๋ ์์ ์ค์ ์ ๋๋ค. ์ต๋๊ฐ์ผ๋ก ๋๋๊ธฐ ์ ์ ์์ฑ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.MaxStam();
if (Truth(value > 0))
{
UO.Print("Stamina percent: " + Convert.ToString(UO.Stamina() * 100 / value));
}
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 ํ์์ด ์์ต๋๋ค. ReadValue ๋งค๊ฐ๋ณ์๊ฐ ์์ผ๋ฉด self๋ฅผ ์ฝ์ต๋๋ค. ๋ ํธ์ถ์ 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 = ReadValue();
await Delay(1000);
var after = ReadValue();
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
return null;
}
dynamic ReadValue()
{
return UO.MaxStam();
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.MaxStamina:bridge.MaxStamina.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "maxstam": return new InjectionValue(bridge.MaxStamina);