KO UO Topic character Part 4 - 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.MaxStamina();๋ก์ปฌ ๋ชจ๋ธ์์ ์ต๋ ๋ด๊ตฌ์ฑ์ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
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๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.MaxStamina();
UO.Print("MaxStamina: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ก ํ์๋ฉ๋๋ค. ๊ฐ์ ํ๋์ ์ซ์๋ฅผ ์ ์ฅํ๊ณ ๋ณํํฉ๋๋ค.ToString๋ ๋ฉ์์ง์ฉ์ผ๋ก๋ง ๋ณํํฉ๋๋ค.
var value = UO.MaxStamina();
UO.Print("MaxStamina: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ํ๋์ ์ ์ฉ๋ ์๊ณ๊ฐ ๋๋ ๊ณ์ฐ์ด ํ์๋ฉ๋๋ค. ์กฐ๊ฑด์ ์ซ์๋ ์๋ฒ ์ ํ์ด ์๋ ์์ ์ค์ ์ ๋๋ค. ์ต๋๊ฐ์ผ๋ก ๋๋๊ธฐ ์ ์ ์์ฑ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.MaxStamina();
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.MaxStamina();
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [MaxStamina]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.MaxStamina:bridge.MaxStamina.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.MaxStaminaAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.MaxWeight();์บ๋ฆญํฐ์ ์ํ ์นด์ดํฐ(๋์ ์ต๋ ๋ฌด๊ฒ)๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์์๋ ๋์ ์ต๋ ๋ฌด๊ฒ, 0..65535. 0๋ ์ค์ ๊ฐ์ด๊ฑฐ๋, ๋ฐ์ดํฐ๊ฐ ์๊ฑฐ๋, ๋๋ฝ/ํ๊ดด๋ ํ๋ ์ด์ด์ผ ์ ์์ต๋๋ค. ์ด๋ bool, ID ๋๋ type๊ฐ ์๋ ์๋์ ๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋๋ผ ํ๋์ ๋จ์๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด ๋ช ๋ น์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณตํ์ง ์์ผ๋ฉฐ ๋ฐฐ์ด์ ๋ฐํํ์ง ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.WeightMax ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- MaxWeight๋ WeightMax ์บ์๋ฅผ ์ฝ์ต๋๋ค. ๊ธฐ๋ณธ ์ํ type >= 5๋ 0์ ๋์ผํ๋๋ผ๋ ์๋ฒ ์ ํ์ โโUInt16์ผ๋ก ์ค์ ํฉ๋๋ค. ์ด์ ํ์ฅ ์ํ๋ ์์ ์ ์ด๋ฅผ ํ ๋ฒ ๊ณ์ฐํฉ๋๋ค. ํ๋กํ ์ฝ UO >= 5.0.0a - 7 * Floor(Strength / 2) + 40; ์ค๋๋ ๊ฒ์ ๋ณํ์ ๋๋ค.ToString * 4 + 25. ๊ฒฐ๊ณผ๋ UInt16์ผ๋ก ์ ์ฅ๋ฉ๋๋ค. ๊ทน๋จ๊ฐ์ ๋ชจ๋๋ก 65536๋ก ๋ํ๋ฉ๋๋ค. ๋ณํํฉ๋๋ค.ToString=101๋ ๊ฐ๊ฐ 390 ๋๋ 429๋ฅผ ์ ๊ณตํฉ๋๋ค. Strength๋ฅผ ๋ณ๋๋ก ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ getter ์์ฒด๋ ํ๋๋ฅผ ๋ค์ ๊ณ์ฐํ์ง ์์ต๋๋ค.
- 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.MaxWeight();
UO.Print("MaxWeight: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- value๋ ์์ ์ ๋ฌธ์์ ๋ํ ์ธ์ ์๋ ํธ์ถ์ ํ ๋ฒ ์ ์ฅํฉ๋๋ค. Convert.ToString๋ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ก๊ทธ ๋ฒํธ์ ํ์์ ์ง์ ํฉ๋๋ค.
var value = UO.MaxWeight();
UO.Print("WeightMax: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UO.Wait(500)๋ 500 ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ ํ๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ฐจ์ด๋ ์์, 0 ๋๋ ์์์ผ ์ ์์ต๋๋ค. ์ค๊ฐ ์ ๋ฐ์ดํธ ๋ฐ ์บ๋ฆญํฐ ๋ณ๊ฒฝ์ ์๋ต๋ ์ ์์ต๋๋ค. ์ผ์ ์ ์ง๊ฐ ๊ทธ ์์ ๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.MaxWeight();
await Delay(500);
var after = UO.MaxWeight();
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.Weight();
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.MaxWeight. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.MaxWeight:bridge.MaxWeight.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int MaxWeight() => bridge.MaxWeight;int UO.Mount();
int UO.Mount(object? mount);Mount์ Dismount๋ ์๋ ๋๋ธ ํด๋ฆญ์ด๋ ์ ํฌ ๋ชจ๋ ๊ณต๊ฒฉ ์ฒ๋ฆฌ๋ฅผ ๊ฑฐ์น์ง ์๊ณ ๊ฐ์ฒด ์ฌ์ฉ ์์ฒญ์ ์ ์กํฉ๋๋ค. int๋ Mount ๋ ์ด์ด์ ํ์ฌ ์์ดํ serial์ด๋ฉฐ ์ฑ๊ณต ์ฌ๋ถ๊ฐ ์๋๋๋ค. ์๋ฒ ์๋ต์ ๋น๋๊ธฐ์ด๋ฏ๋ก Mount๊ฐ ์์ง 0, Dismount๊ฐ ์ ๊ฑฐ ์ serial์ ๋ฐํํ ์ ์์ต๋๋ค. ์๋ต ํ ObjAtLayer("Mount")๋ฅผ ํ์ธํ์ธ์.
-
mountโ ํ๊ฒ ์๋ฆฌ์ผ ๋ฒํธ. ์๋ตํ๋ฉด ๋ง์ง๋ง ๋์.
๊ฐ ์ฝ๋ ๋ธ๋ก์ ์์ ํ ๋ ๋ฆฝ .csx์ ๋๋ค. ์์ serial, type๊ณผ ์ขํ๋ฅผ ๋ฐ๊พธ์ธ์. ์ธ์ ์์์ C# ๋ช ๋ช ๋ ์ธ์๋ ์๊ทธ๋์ฒ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
#mount 0x00001234
#mount
๊ฐ ์ฝ๋ ๋ธ๋ก์ ์์ ํ ๋ ๋ฆฝ .csx์ ๋๋ค. ์์ serial, type๊ณผ ์ขํ๋ฅผ ๋ฐ๊พธ์ธ์. ์ธ์ ์์์ C# ๋ช ๋ช ๋ ์ธ์๋ ์๊ทธ๋์ฒ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
int mountLayerSerial = UO.Mount(0x00001234);
UO.Print(UO.Int2Hex(mountLayerSerial));int currentSerial = UO.Mount();
UO.Print(UO.Int2Hex(currentSerial));UO.Mount(0x00001234);
for (int attempt = 0; attempt < 40; attempt++)
{
var serial = UO.ObjAtLayer("Mount");
if (Convert.ToString(serial) != "0" && Convert.ToString(serial) != "0x00000000")
{
UO.Print(Convert.ToString(serial));
break;
}
await WaitAsync(50);
}new CommandSample().Execute(UO);
sealed class CommandSample
{
public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
{
int mountLayerSerial = api.Mount(0x00001234);
api.Print(api.Int2Hex(mountLayerSerial));
}
}CSharpGameApi.Mount
-> CSharpScriptGlobals
-> InjectionScript.Runtime.InjectionApiUO.Mount
ClassicUOInjectionApiBridge -> NativeMountController.Request
-> OutgoingPackets.Send_UseObjectRequest (0x06)
-> MountedLayerSerialUnsafe -> Player.FindItemByLayer(Layer.Mount)
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.ObjAtLayer(object? layer);์์ ์ ์บ๋ฆญํฐ ์ฅ๋น ์ค ์ง์ ๋ ๋ ์ด์ด์ ์๋ ์์ดํ ์ ์ฐพ์ต๋๋ค.
-
layerโ ํ๋์ ํ์ ์ธ์: ๋ ์ด์ด ๋ฒํธ 1..29 ๋๋ ์๋ ๋ชฉ๋ก์ ๋ฌธ์์ด ์ด๋ฆ. ์ซ์ 0 ๋ฐ ์ด๋ฆ Invalid๋ 0๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฆ์ ๋์๋ฌธ์ ๋ฐ ํํ ๊ณต๋ฐฑ์ ๋ฌด์๋ฉ๋๋ค. ์ ์ ์๋ ๋ฌธ์์ด ์ด๋ฆ์ผ๋ก ์ธํด ์คํฌ๋ฆฝํธ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ซ์ ๋ฌธ์์ด "1"์ ์ซ์ 1๋ฅผ ๋์ฒดํ์ง ์์ต๋๋ค.
์ซ์ ํ์์ ํญ๋ชฉ์ ๊ฒฝ์ฐ int - serial๋ฅผ ๋ฐํํ๊ณ , ๋น์ด ์๊ฑฐ๋ ์ ํจํ์ง ์์ ๋ ์ด์ด์ ๊ฒฝ์ฐ 0๋ฅผ ๋ฐํํฉ๋๋ค. ํญ๋ชฉ์ด ๋ฐ๊ฒฌ๋๋ฉด ๋ฌธ์์ด ํ์์ "0x40001001" ํ์์ string๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด int 0๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ ๋ ์ด์ด ๋ฒํธ, graphic/type ๋๋ ์๋์ด ์๋ ํญ๋ชฉ์ ID์ ๋๋ค. ๋ฉํ๋ฐ์ดํฐ object? ๋ฌธ์์ด ํ์์ ๋ ๊ฐ์ง ๊ฐ๋ฅํ ๊ฒฐ๊ณผ ์ ํ์ ๋ฐ์ํฉ๋๋ค.
- ๋ก์ปฌ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค. ์๋ฒ์ ๋ํ ์์ฒญ๋ ์๊ณ ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ ์ด๋ํ ํ์๋ ์์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ ์ฝ๋ ์๊ฐ์ ๊ฐ๋ฆฌํจ๋ค. UO.Wait ๋๋ ๋ค๋ฅธ ์์ ํ์ ๊ฐ์ฒด์ ํด๋น ํ๋๊ทธ๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- ์ฅ๋น ๋ฐ์ดํฐ self๋ฅผ ํ์ธํฉ๋๋ค. ํ์์๋ ๊ฐ๋ฐฉ์ ๊ฐ๋ดํ๊ฑฐ๋, ๋ฌผํ์ ์ฌ๋ ค ๋๊ฑฐ๋, ๊ฒ์ฌ ์์ฒญ์ ๋ณด๋ด์ง ์์ต๋๋ค.
- 1..29 ์ธ๋ถ์ ์ซ์๋ ๋ชจ๋๋ก ๋ณํ ์์ด 0 256๋ฅผ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด 257๋ ์ค๋ฅธ์์ ์ ํํ ์ ์์ต๋๋ค.
- ์ง์๋๋ ๋ชจ๋ ์ซ์ ๋ ์ด์ด ๋ฐ ๋ฌธ์์ด ์ด๋ฆ:
- 1 OneHanded/Rhand/RightHand; 2 TwoHanded/Lhand/LeftHand; 3 Shoes; 4 Pants; 5 Shirt; 6 Helmet/Hat; 7 Gloves; 8 Ring; 9 Talisman; 10 Necklace/Neck.
- 11 Hair; 12 Waist; 13 Torso; 14 Bracelet/Brace; 15 Face; 16 Beard; 17 Tunic; 18 Earrings/Ear; 19 Arms; 20 Cloak.
- 21 Backpack/Bpack/BackpackLayer; 22 Robe; 23 Skirt; 24 Legs; 25 Mount; 26 ShopBuyRestock/Rstk; 27 ShopBuy/NRstk; 28 ShopSell/Sell; 29 Bank.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
object? item = UO.ObjAtLayer("Rhand");
if (item is string serial) UO.Print("Equipped serial: " + serial);
else UO.Print("The layer is empty");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Rhand๋ ๋ ์ด์ด 1๋ฅผ ์ ํํฉ๋๋ค. ์ฑ๊ณตํ๋ฉด hand๋ 16์ง์ ๋ฌธ์์ด์ ๋๋ค. ์๋ ๊ฒฝ์ฐ ์ซ์ 0.
- Convert.ToString๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๊ฐ์ง ๊ฐ๋ฅํ ์ ํ์ ๋ชจ๋ ์ถ๋ ฅํ ์ ์์ต๋๋ค. ๊ฒฐ๊ณผ๋ ๋ฌด๊ธฐ์ graphic๋ก ๊ฐ์ฃผํ ์ ์์ต๋๋ค.
object? hand = UO.ObjAtLayer("Rhand");
if (hand is string serial)
{
UO.Print("Right hand serial: " + serial);
}
else
{
UO.Print("Right hand is empty or unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ซ์ 2๋ TwoHanded๋ฅผ ์ ํํฉ๋๋ค. ์ด ์์์ ํญ์ int๋ฅผ ๋ฐํํฉ๋๋ค.
- Exists๋ ํญ๋ชฉ์ ์์ฑ์ ์ฝ์ ์ ์๋์ง ํ์ธํฉ๋๋ค. GetGraphic๋ ๋ณ๋์ type๋ฅผ ๋ฐํํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var item = UO.ObjAtLayer(2);
if (Truth(UO.Exists(item)))
{
UO.Print("Two-handed layer serial: " + Convert.ToString(item));
UO.Print("Graphic: " + UO.GetGraphic(item));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 21โ๋ ์ด์ด Backpack; ๊ฒฐ๊ณผ์ ์ผ๋ก ์ฅ๋น๋ฅผ ์ ์ฌํ๊ธฐ ์ ์๋ 0๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
- 257๋ ๋ชฉ๋ก ์ธ๋ถ์ ์์ผ๋ฉฐ ํญ์ 0์ ์ ๊ณตํฉ๋๋ค. ์ด๋ 1 ๋ ์ด์ด์ ๋ํ ๋์ฒด ์ง์ ์ด ์๋๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var bag = UO.ObjAtLayer(21);
var invalid = UO.ObjAtLayer(257);
UO.Print("Backpack serial: " + Convert.ToString(bag));
UO.Print("Invalid layer: " + Convert.ToString(invalid));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: layer (Any/String)
๊ฒฐ๊ณผ: dynamic / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(ObjAtLayer(Text(0))). -
InjectionScript.Runtime.InjectionApiUO.ObjAtLayer:ObjAtLayer(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ObjAtLayer:bridge.ObjAtLayer(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "objatlayer":
return new InjectionValue(arguments[0].Kind == InjectionValueKind.String
? GetObject(ObjAtLayer(Text(0))) : bridge.ObjAtLayer(Arg(0)));๋งค๊ฐ๋ณ์: layer (Any/String)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ObjAtLayer. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ObjAtLayer:bridge.ObjAtLayer(ConvertLayer(layer)). -
InjectionScript.Runtime.InjectionApiUO.ConvertLayer:ConvertLayer(layer).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public InjectionValue ObjAtLayer(string layer)
{
var id = bridge.ObjAtLayer(ConvertLayer(layer));
if (id == 0)
return InjectionValue.Zero;
return new InjectionValue("0x" + id.ToString("X8"));
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.ObjAtLayerEx(object? layerType, object? playerID);์ง์ ๋ ๋ก๋๋ ์บ๋ฆญํฐ์ ๋ํด ์ง์ ๋ ๋ ์ด์ด์ ํญ๋ชฉ/์ปจํ ์ด๋๋ฅผ ์ฝ์ต๋๋ค.
-
layerTypeโ ๋ ์ด์ด์ ์ซ์ ๋ฒํธ 1..29. 26 ๋๋ "0x1A"์ ๊ฐ์ ์ ์ ๋๋ ์ซ์ ๋ฌธ์์ด์ ํ์ฉํฉ๋๋ค. ๋ฌธ์์ด ์ด๋ฆ Rhand/ShopBuyRestock ๋ฐ ๋ฒ ์ด ๋ ์ด์ด ์์๋ ์ฌ๊ธฐ์ ์ซ์๋ก ๋ณํ๋์ง ์์ต๋๋ค. ์ซ์๋ฅผ ์ฌ์ฉํ์ธ์. -
playerIDโ ๋ฌธ์ ์ผ๋ จ/mobile, ์ซ์, 16์ง์ ๋ฌธ์์ด ๋๋ "self"/"lasttarget"์ ๊ฐ์ ํ์ธ ๊ฐ๋ฅํ ๊ฐ์ฒด ์ด๋ฆ์ ๋๋ค. ์์ดํ ์ ๊ทธ๋ํฝ/type ๋๋ ์ฉ๊ธฐ ์์ฒด์ ID๋ ์ ํฉํ์ง ์์ต๋๋ค.
int: ๋ ์ด์ด์ ์๋ ํญ๋ชฉ/์ปจํ ์ด๋์ serial ๋๋ 0 ๋ ์ด์ด๊ฐ ๋น์ด ์๊ฑฐ๋ ์ ์ ์๋ ๊ฒฝ์ฐ ๋ฒํธ๊ฐ ์ ํจํ์ง ์๊ฑฐ๋ ๋ก๋๋ ๋ชจ๋ฐ์ผ์ด ์์ต๋๋ค. ์ด๋ bool ๋๋ ๋ ์ด์ด ๋ฒํธ๊ฐ ์๋๋๋ค.
- ์ฝ๊ธฐ๋ ๋์, ๊ตฌ๋งค, ์ปจํ ์ด๋ ๊ฐ๋ด ๋ฐ ๋คํธ์ํฌ ์์ฒญ ์์ด ๋ก์ปฌ์ ๋๋ค.
- 1..29 ๋ฒ์๊ฐ ํ์ธ๋ฉ๋๋ค. ๋ถ์ ์ ํ ๋ฌธ์์ด ๋งค๊ฐ๋ณ์๋ฅผ ๋ณํํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ซ์ ๋์ ์์์ ๋ ์ด์ด ์ด๋ฆ์ ์ ๋ฌํ๋ฉด ์ ๋ฉ๋๋ค.
- ๋ฌธ์์ด ๋ ์ด์ด ์ด๋ฆ์ด ์๋ ์ฌ์ฉ์ ์ ์ ๋ฌธ์์๋ ๋ณ๋์ UO.ObjAtLayer์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ ์ด์ด๋ฅผ ์ ์ ์ธ๋ฑ์ค ๋๋ ๊ฒํ ์ขํ์ธ world Z์ ํผ๋ํ์ง ๋ง์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.ObjAtLayerEx(26, UO.GetSerial("lasttarget"));
UO.Print("ObjAtLayerEx: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- LayerType=26; ํ๋ ์ด์ดID=๊ณต๊ธ์ ์ฒด; ์์ โ serial ์ปจํ ์ด๋. GetContent์ ๊ฒฝ์ฐ ๋ ์ด์ด ๋ฒํธ๊ฐ ์๋ ์์ ์ด ์ ๋ฌ๋ฉ๋๋ค.
- ๋ฐฐ์ด์ 0๋ถํฐ ๊ธธ์ด์์ 1๋ฅผ ๋บ ๊ธธ์ด๊น์ง ์ธ๋ฑ์ฑ๋ฉ๋๋ค. ๊ฐ ์์๋ serial์ ๋๋ค. ๋น ๋ฐฐ์ด์ ๋ก๋๋ ์ง์ ์์๊ฐ ์์์ ์๋ฏธํฉ๋๋ค. ๊ตฌ๋งค๊ฐ ์๋ฃ๋์ง ์์์ต๋๋ค.
var vendor = UO.GetSerial("lasttarget");
if (Truth(vendor == "0x00000000"))
{
UO.Print("Vendor not selected");
return null;
}
var shop = UO.ObjAtLayerEx(26, vendor);
if (Truth(shop == 0))
{
UO.Print("ShopBuyRestock container is not loaded");
return null;
}
UO.Print("Shop container ID: " + Convert.ToString(shop));
var items = UO.GetContent(shop);
var i = 0;
while (Truth(i < ArrayLength(items)))
{
var item = items[i];
UO.Print(UO.GetName(item) + " | ID: " + Convert.ToString(item));
UO.Print("Graphic: " + Convert.ToString(UO.GetType(item)));
i = i + 1;
}
UO.Print("Loaded entries: " + Convert.ToString(ArrayLength(items)));
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- wantedType๋ graphic์ด๊ณ , ์์ดํ ์ ๊ฐ๋ณ ์์ดํ ์ ID์ ๋๋ค. ์คํ์ ๋ ์ฝ๋/์คํ ์๋ฅผ ๊ณ์ฐํฉ๋๋ค. ๋จ์๋ ์ซ์๋ฅผ ์ถ๊ฐํฉ๋๋ค.
- ์ด๋ ํฅํ ๊ตฌ๋งค ์ ๋ณด์ฅ๋๋ ์์ก์ด ์๋๋ผ ์ด๋ฏธ ๋ฐ์ ์๋์ ์ฝ๋ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์๋ ์ง์ ๋ ๊ฐ๊ฒฉ์ด ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var vendor = UO.GetSerial("lasttarget");
if (Truth(vendor == "0x00000000"))
{
UO.Print("Vendor not selected");
return null;
}
var shop = UO.ObjAtLayerEx(26, vendor);
if (Truth(shop == 0))
{
UO.Print("Shop layer is not loaded");
return null;
}
var wantedType = 0x1766;
var stacks = 0;
var units = 0;
var items = UO.GetContent(shop);
var i = 0;
while (Truth(i < ArrayLength(items)))
{
var item = items[i];
if (Truth(UO.GetType(item) == wantedType))
{
stacks = stacks + 1;
units = units + UO.GetQuantity(item);
}
i = i + 1;
}
UO.Print("Stacks: " + Convert.ToString(stacks) + " | Units: " + Convert.ToString(units));
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ShowVendorLayer ์ ์ฒด๊ฐ ์ ์ธ๋ฉ๋๋ค. ๊ณต๊ธ์ ์ฒด - ID NPC, layerNumber - 26/27/28, ์บก์ - ์๋ช ๋ง ๊ฐ๋ฅํฉ๋๋ค.
- ์ปจํ ์ด๋๊ฐ ํด๋ผ์ด์ธํธ์ ์๋ ค์ง์ง ์์์ ์ ์์ต๋๋ค. 0๋ GetContent ์ด์ ์ ํ์ธ๋ฉ๋๋ค. ๋ช ์์ ์ธ GetContent(0)์ ์ง์์ ์๋ ํญ๋ชฉ์ ์์ฒญํ๋ ๊ฒ์ ์๋ฏธํ์ง๋ง ์ฌ๊ธฐ์๋ ํ์ํ์ง ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var vendor = UO.GetSerial("lasttarget");
if (Truth(vendor == "0x00000000"))
{
UO.Print("Vendor not selected");
return null;
}
ShowVendorLayer(vendor, 26, "ShopBuyRestock / Rstk");
ShowVendorLayer(vendor, 27, "ShopBuy / NRstk");
ShowVendorLayer(vendor, 28, "ShopSell / Sell");
return null;
}
void ShowVendorLayer(dynamic vendor, dynamic layerNumber, dynamic caption)
{
var container = UO.ObjAtLayerEx(layerNumber, vendor);
if (Truth(container == 0))
{
UO.Print(caption + ": not loaded");
return;
}
var items = UO.GetContent(container);
UO.Print(caption + " | Container ID: " + Convert.ToString(container));
UO.Print("Loaded entries: " + Convert.ToString(ArrayLength(items)));
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: layerType (Any), playerID (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ObjAtLayerEx:bridge.ObjAtLayerEx(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "objatlayerex": return new InjectionValue(bridge.ObjAtLayerEx(Arg(0), Arg(1)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Paralyzed();
int UO.Paralyzed(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.Paralyzed();
UO.Print("Paralyzed: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ๊ดํธ๋ self๋ฅผ ์ ํํฉ๋๋ค. ์ํ๋ ํ๋๊ทธ์ ํ๋์ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. true์ ์์น์์ 1์ ๋๋ค.
- false ๊ฒฐ๊ณผ๋ ๋ฒฝ, ์ฒด๋ ฅ ๋ถ์กฑ ๋๋ ๊ธฐํ ์ ์ง ์ด์ ๋ฅผ ๋ฐฐ์ ํ์ง ์์ต๋๋ค.
var state = UO.Paralyzed();
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.Paralyzed(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.Paralyzed()) == true) && Truth(attempts < 10))
{
await Delay(100);
attempts = attempts + 1;
}
if (Truth(UO.IsNPC("self")))
{
if (Truth(Truth(UO.Paralyzed()) == 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.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLocked:bridge.GetLocked(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "paralyzed": return new InjectionValue(bridge.GetLocked(bridge.Self));๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [Paralyzed]. -
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.PhysicalResist();ํ์ฌ ์บ๋ฆญํฐ์ ์ ํญ ํ๋(๋ฌผ๋ฆฌ ๋ฐฉ์ด๊ตฌ/์ ํญ)๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int๋ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์๋ช ๋ ์ํ ๊ฐ, -32768..32767์ ๋๋ค. ์์ ๊ฐ์ด ์ ์ง๋ฉ๋๋ค. 0๋ ์ค์ ์ ํญ, ๋ฐ์ดํฐ ๋ถ์กฑ ๋๋ ํ๋ ์ด์ด ๋๋ฝ/ํ๊ดด์ผ ์ ์์ต๋๋ค. GetResist๋ ์ ์ ์๋ ์ ํ๊ธฐ์ ๋ํด 0๋ ์ ๊ณตํฉ๋๋ค. bool, ID, ์คํฌ ํ๊ณ๋ ์ ํญ ํ๊ณ๊ฐ ์๋๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋ 1์ ์ ์๋ฏธํฉ๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.PhysicalResistance ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- PhysicalResistance - ์๋ฒ ๊ฐ์ท/์ํ ํ๋: ํด๋์ ์๋ฒ๋ ๊ฐ์ท ๋ฑ๊ธ์ ์ ์กํ ์ ์์ผ๋ฉฐ, ์ ํญ์ด ์๋ ๊ท์น์ ๋ฌผ๋ฆฌ์ ์ ํญ์ ์ ์กํ ์ ์์ต๋๋ค. API๋ ์๋ก ๋ณํ๋์ง ์์ผ๋ฉฐ ํผํด ๊ฐ์์จ์ ๊ณ์ฐํ์ง ์์ต๋๋ค. Armor ๋ฐ ๋ฌผ๋ฆฌ์ ๋ณ์นญ์ ๋์ผํ ํ๋๋ฅผ ์ฝ์ต๋๋ค.
- CharacterStatus๋ ์ด๋ฆ, ์ฒด๋ ฅ, ์์ ์ ํน์ฑ์ ๋ณ๊ฒฝํ๊ธฐ ์ ์ ํ์ํ ์ ์ฒด๋ฅผ ํ์ธํ ๋ค์ ๊ฐ ์ ํญ ๋จ์ด๋ฅผ ์๋ช ๋ Int16์ผ๋ก ๋ณํํฉ๋๋ค. ์๋ฆฐ ํ์ ๋ณธ๋ฌธ์ ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ ํ์ ๊ผฌ๋ฆฌ type 6๋ ๋์ผํ ๊ท์น์ ์ ์งํฉ๋๋ค. ์ ํญ ๋ช ๋ น์ ์ต๋ ํ๊ณ๋ฅผ ์ฝ์ง ์์ต๋๋ค.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
- ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค. C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.PhysicalResist();
UO.Print("PhysicalResist: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. Convert.ToString๋ ๋ก๊ทธ ๋ฒํธ์ ํ์์ ์ง์ ํฉ๋๋ค. ๋ ผ์์ ์์ต๋๋ค. ์์ ์ ์ฑ๊ฒฉ์ ์ฝ์ ์ ์์ต๋๋ค.
var value = UO.PhysicalResist();
UO.Print("PhysicalResistance: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ํ ์ฌ์ด์๋ UO.Wait(500) ๋ฐ๋ฆฌ์ด๊ฐ ์์ต๋๋ค. ์ฐจ์ด๋ ์์๊ฐ ๋ ์ ์์ต๋๋ค. ์ค๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค. ์ผ์ ์ ์ง๋ ์ง์ฐ API์ด ์๋ ์๋ฅผ ๋ํ๋ ๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.PhysicalResist();
await Delay(500);
var after = UO.PhysicalResist();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์=50๋ ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋ ์๊ตฌ ์ฌํญ์ ์์ ๋๋ค. ResistanceAtLeast๋ ๋๋ฝ๋ ํ๋ ์ด์ด๋ฅผ ๊ฑฐ๋ถํ๊ณ ํ๋์ ๊ฐ์ ์ฝ๊ณ 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(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.PhysicalResist();
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 [PhysicalResist]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Armor:bridge.Armor.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.ArmorAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.Poison();
void UO.Poison(object? target);ํ์ํ ๊ฒฝ์ฐ ํน์ ๋์์๊ฒ ์ค๋ ๊ธฐ์ ์ ์ฌ์ฉํฉ๋๋ค.
-
target- ์ ํ ์ฌํญ serial/๋์ ๋ณ์นญ. ์ธ์ ์์ - UseSkill("์ค๋ ")๋ง ๊ฐ๋ฅํฉ๋๋ค. ์ธ์ ์ฌ์ฉ - UseSkillAtTarget("์ค๋ ", ๋์).
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ๋ฑ๋ก๋ ๋ ๊ฑฐ์ ๋ช ๋ น์ด๋ ๋ ์ ํญ์ด๋ ๋ ์ํ์ ๋ํ ๊ฒํฐ๊ฐ ์๋๋๋ค. ๊ฐ์ง๋ ์คํฌ์ ์ํํ๊ณ 1/0 ๋ฒ๋ฆฝ๋๋ค.
- ๋์์ด ์๋ ํํ์์ UseSkillAtTarget๋ ๊ธ์ ์ ์ธ serial์ ํ์ธํ๊ณ ๊ธฐ์ ์ ์์ฒญํ๊ธฐ ์ ์ ๋์์ ์ค๋นํฉ๋๋ค. ์คํฌ์ด ์๋ฝ๋์ง ์์ผ๋ฉด ๋์์ ์ทจ์ํฉ๋๋ค. ์๋ฒ์ ์ํ ๋์ ์ค๋ ์ ๋ณด์ฅ๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.Poison");
UO.Poison();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ํ ๊ฒฝ์ฐ ํน์ ๋์์๊ฒ ์ค๋ ๊ธฐ์ ์ ์ฌ์ฉํฉ๋๋ค.
UO.Poison();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฑ๋ก๋ ๋ ๊ฑฐ์ ๋ช ๋ น์ด๋ ๋ ์ ํญ์ด๋ ๋ ์ํ์ ๋ํ ๊ฒํฐ๊ฐ ์๋๋๋ค. ๊ฐ์ง๋ ์คํฌ์ ์ํํ๊ณ 1/0 ๋ฒ๋ฆฝ๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Exists("lasttarget")))
{
UO.Poison("lasttarget");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋์์ด ์๋ ํํ์์ UseSkillAtTarget๋ ๊ธ์ ์ ์ธ 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 id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
UO.Poison(id);
UO.Print(UO.Waiting());
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.UseSkillAtTarget:UseSkillAtTarget(new InjectionValue("Poisoning"), arguments[0]). -
InjectionScript.Runtime.InjectionApiUO.UseSkill:UseSkill("Poisoning").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "poison":
if (arguments.Length > 0) UseSkillAtTarget(new InjectionValue("Poisoning"), arguments[0]);
else UseSkill("Poisoning");
break;๋งค๊ฐ๋ณ์: target (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.UseSkillAtTarget:UseSkillAtTarget(new InjectionValue("Poisoning"), arguments[0]). -
InjectionScript.Runtime.InjectionApiUO.UseSkill:UseSkill("Poisoning").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "poison":
if (arguments.Length > 0) UseSkillAtTarget(new InjectionValue("Poisoning"), arguments[0]);
else UseSkill("Poisoning");
break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.PoisonResist();ํ์ฌ ์บ๋ฆญํฐ์ ์ ํญ ํ๋์ธ ๋ ์ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int๋ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์๋ช ๋ ์ํ ๊ฐ, -32768..32767์ ๋๋ค. ์์ ๊ฐ์ด ์ ์ง๋ฉ๋๋ค. 0๋ ์ค์ ์ ํญ, ๋ฐ์ดํฐ ๋ถ์กฑ ๋๋ ํ๋ ์ด์ด ๋๋ฝ/ํ๊ดด์ผ ์ ์์ต๋๋ค. GetResist๋ ์ ์ ์๋ ์ ํ๊ธฐ์ ๋ํด 0๋ ์ ๊ณตํฉ๋๋ค. bool, ID, ์คํฌ ํ๊ณ๋ ์ ํญ ํ๊ณ๊ฐ ์๋๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋ 1์ ์ ์๋ฏธํฉ๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.PoisonResistance ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- ์์ ํ๋๋ ํ์ฅ๋ CharacterStatus (0x11), type >= 4๋ก ์ ๊ณต๋ฉ๋๋ค. ๋ช ๋ น ์์ฒด๋ ์๋ฒ ์๋๋ฅผ ํ์ธํ์ง ์์ต๋๋ค. ์ด๋ฌํ ํ๋๊ฐ ์๋ ์์ถ/์ด์ ์ํ๋ ์ด์ ์บ์๋ฅผ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค. ์ ํ๋ ์ด์ด๋ ์ฒ์์๋ 0์ ๋๋ค. ๋ ์ ํญ์ Poisoned ํ๋๊ทธ๊ฐ ์๋๋๋ค. ๋ํ ์ฃผ๋ฌธ ์ ํญ ์คํฌ๋ ์๋๋๋ค.
- CharacterStatus๋ ์ด๋ฆ, ์ฒด๋ ฅ, ์์ ์ ํน์ฑ์ ๋ณ๊ฒฝํ๊ธฐ ์ ์ ํ์ํ ์ ์ฒด๋ฅผ ํ์ธํ ๋ค์ ๊ฐ ์ ํญ ๋จ์ด๋ฅผ ์๋ช ๋ Int16์ผ๋ก ๋ณํํฉ๋๋ค. ์๋ฆฐ ํ์ ๋ณธ๋ฌธ์ ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ ํ์ ๊ผฌ๋ฆฌ type 6๋ ๋์ผํ ๊ท์น์ ์ ์งํฉ๋๋ค. ์ ํญ ๋ช ๋ น์ ์ต๋ ํ๊ณ๋ฅผ ์ฝ์ง ์์ต๋๋ค.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
- ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค. C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.PoisonResist();
UO.Print("PoisonResist: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. Convert.ToString๋ ๋ก๊ทธ ๋ฒํธ์ ํ์์ ์ง์ ํฉ๋๋ค. ๋ ผ์์ ์์ต๋๋ค. ์์ ์ ์ฑ๊ฒฉ์ ์ฝ์ ์ ์์ต๋๋ค.
var value = UO.PoisonResist();
UO.Print("PoisonResistance: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ํ ์ฌ์ด์๋ UO.Wait(500) ๋ฐ๋ฆฌ์ด๊ฐ ์์ต๋๋ค. ์ฐจ์ด๋ ์์๊ฐ ๋ ์ ์์ต๋๋ค. ์ค๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค. ์ผ์ ์ ์ง๋ ์ง์ฐ API์ด ์๋ ์๋ฅผ ๋ํ๋ ๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.PoisonResist();
await Delay(500);
var after = UO.PoisonResist();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์=50๋ ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋ ์๊ตฌ ์ฌํญ์ ์์ ๋๋ค. ResistanceAtLeast๋ ๋๋ฝ๋ ํ๋ ์ด์ด๋ฅผ ๊ฑฐ๋ถํ๊ณ ํ๋์ ๊ฐ์ ์ฝ๊ณ 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(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.PoisonResist();
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.PoisonResistance:bridge.PoisonResistance.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "poisonresist": return new InjectionValue(bridge.PoisonResistance);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Poisoned();
int UO.Poisoned(object? id);์บ๋ฆญํฐ์ ์ค๋ ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
-
idโ ํ์๋ ํ์์ ์ ํ์ ๊ฐ์ฒด: 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.Poisoned();
UO.Print("Poisoned: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ๊ดํธ๋ self๋ก ์ฝ์ต๋๋ค. active๋ ๊ฒฐ๊ณผ๋ฅผ ํ ๋ฒ ์ ์ฅํฉ๋๋ค. true ๋ฐ false๋ ๋ ๊ฐ์ ๋ถ๊ธฐ๋ฅผ ์ ์ํฉ๋๋ค. Print ์์ ๋ฉ์์ง๋ง ํ์๋ฉ๋๋ค.
var active = UO.Poisoned();
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.Poisoned(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.Poisoned();
await Delay(500);
var after = UO.Poisoned();
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.Poisoned. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Poisoned:bridge.Poisoned(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Poisoned() => bridge.Poisoned(bridge.Self);๋งค๊ฐ๋ณ์: id (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Poisoned. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Poisoned:bridge.Poisoned(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Poisoned(InjectionValue id) => bridge.Poisoned(GetObject(id));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.Race();ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์์ ์บ๋ฆญํฐ์ ์ธ์ข ์ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ 1=์ธ๊ฐ, 2=์์ , 3=๊ฐ๊ณ ์ผ(ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ๋ฐ๋ฆ). 0๋ ๋ก๋๋ ๋ฌธ์๊ฐ ์์์ ์๋ฏธํฉ๋๋ค. body/graphic๋ ์๋๊ณ serial๋ ์๋๋๋ค.
- ์ด๋ฏธ ์์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์์ฒญ์ ๊ณต๊ฐ ์ํ๊ฐ ์๋๋ฉฐ ์๋ฒ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๋ด๋๋ก ๊ฐ์ ํ์ง ์์ต๋๋ค. ์ฌ๋ง, ๋งต ์ ํ ๋๋ ๊ฐ์ฒด ์ญ์ ํ ๋ ํธ์ถ ์ฌ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.Race();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ์บ๋ฆญํฐ์ ์ข ์กฑ์ ๊ฐ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค.
- Convert.ToString๋ ์ถ๋ ฅํ ์ซ์๋ฅผ ๋ณํํ๋ฉฐ ๊ฒฐ๊ณผ์ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
var value = UO.Race();
UO.Print("Race: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์ ์์ด ๊ฐ์ ํ ๋ฒ ์ฝ์ต๋๋ค. ์บ๋ฆญํฐ์ ์ธ์ข ์ ํ์๋ ๊ณ์ฐ์ด๋ ์กฐ๊ฑด์ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ซ์ ์๊ณ๊ฐ์ ์คํฌ๋ฆฝํธ ์กฐ๊ฑด์ ์์ด๋ฉฐ ์๋ก์ด ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋๋๋ค. ํ๋์๋ ์์ ์ค๋ช ๋ ์๋ฒ ๋จ์ ๋ฐ ์ ํ ์ฌํญ์ด ์ ์ฅ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.Race();
if (Truth(value == 3))
{
UO.Print("Player race is gargoyle");
}
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.Race();
await Delay(1000);
var after = UO.Race();
if (Truth(before != after))
{
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Race:bridge.Race.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "race": return new InjectionValue(bridge.Race);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.RemoveEarrings();Ear ๋ ์ด์ด์์ ํญ๋ชฉ ์ ๊ฑฐ๋ฅผ ์์ฒญํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ExecuteLegacyManualAlias๊ฐ Unequip("๊ท")๋ฅผ ํธ์ถํฉ๋๋ค. ConvertLayer ์ซ์ ๋ ์ด์ด์ธ ๋ธ๋ฆฌ์ง๋ฅผ ์ ํํฉ๋๋ค. Unequip ๋ฐฐ๋ญ์ผ๋ก ์ด๋์ ์์ฒญํฉ๋๋ค.
- ๋ ๊ฑฐ์ ๋ช ๋ น์ ๋ด๋ถ Unequip(1/0) ๊ฒฐ๊ณผ๋ ์ญ์ ๋ฉ๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์์ดํ /๋ฐฐ๋ญ์ด ์์ ๊ฒฝ์ฐ ์์ฒญ์ด ์คํ๋์ง ์์ ์ ์์ต๋๋ค. ํธ์ถ ํ ObjAtLayer ๊ฒ์ฌ๋ ๋ก์ปฌ ์ํ๋ง ์ฝ์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.RemoveEarrings");
UO.RemoveEarrings();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Ear ๋ ์ด์ด์์ ํญ๋ชฉ ์ ๊ฑฐ๋ฅผ ์์ฒญํฉ๋๋ค.
UO.RemoveEarrings();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ExecuteLegacyManualAlias๊ฐ Unequip("๊ท")๋ฅผ ํธ์ถํฉ๋๋ค. ConvertLayer ์ซ์ ๋ ์ด์ด์ธ ๋ธ๋ฆฌ์ง๋ฅผ ์ ํํฉ๋๋ค. Unequip ๋ฐฐ๋ญ์ผ๋ก ์ด๋์ ์์ฒญํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.ObjAtLayer("Ear"));
UO.RemoveEarrings();
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ๊ฑฐ์ ๋ช ๋ น์ ๋ด๋ถ Unequip(1/0) ๊ฒฐ๊ณผ๋ ์ญ์ ๋ฉ๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์์ดํ /๋ฐฐ๋ญ์ด ์์ ๊ฒฝ์ฐ ์์ฒญ์ด ์คํ๋์ง ์์ ์ ์์ต๋๋ค. ํธ์ถ ํ ObjAtLayer ๊ฒ์ฌ๋ ๋ก์ปฌ ์ํ๋ง ์ฝ์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.RemoveEarrings();
UO.Wait(500);
UO.Print(UO.ObjAtLayer("Ear"));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.Unequip:Unequip("Ear").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "removeearrings": Unequip("Ear"); break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.RemoveHat();๋ชจ์ ๋ ์ด์ด์์ ํญ๋ชฉ ์ ๊ฑฐ๋ฅผ ์์ฒญํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ExecuteLegacyManualAlias๊ฐ Unequip("๋ชจ์")๋ฅผ ํธ์ถํฉ๋๋ค. ConvertLayer ์ซ์ ๋ ์ด์ด์ธ ๋ธ๋ฆฌ์ง๋ฅผ ์ ํํฉ๋๋ค. Unequip ๋ฐฐ๋ญ์ผ๋ก ์ด๋์ ์์ฒญํฉ๋๋ค.
- ๋ ๊ฑฐ์ ๋ช ๋ น์ ๋ด๋ถ Unequip(1/0) ๊ฒฐ๊ณผ๋ ์ญ์ ๋ฉ๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์์ดํ /๋ฐฐ๋ญ์ด ์์ ๊ฒฝ์ฐ ์์ฒญ์ด ์คํ๋์ง ์์ ์ ์์ต๋๋ค. ํธ์ถ ํ ObjAtLayer ๊ฒ์ฌ๋ ๋ก์ปฌ ์ํ๋ง ์ฝ์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.RemoveHat");
UO.RemoveHat();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ชจ์ ๋ ์ด์ด์์ ํญ๋ชฉ ์ ๊ฑฐ๋ฅผ ์์ฒญํฉ๋๋ค.
UO.RemoveHat();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ExecuteLegacyManualAlias๊ฐ Unequip("๋ชจ์")๋ฅผ ํธ์ถํฉ๋๋ค. ConvertLayer ์ซ์ ๋ ์ด์ด์ธ ๋ธ๋ฆฌ์ง๋ฅผ ์ ํํฉ๋๋ค. Unequip ๋ฐฐ๋ญ์ผ๋ก ์ด๋์ ์์ฒญํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.ObjAtLayer("Hat"));
UO.RemoveHat();
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ๊ฑฐ์ ๋ช ๋ น์ ๋ด๋ถ Unequip(1/0) ๊ฒฐ๊ณผ๋ ์ญ์ ๋ฉ๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์์ดํ /๋ฐฐ๋ญ์ด ์์ ๊ฒฝ์ฐ ์์ฒญ์ด ์คํ๋์ง ์์ ์ ์์ต๋๋ค. ํธ์ถ ํ ObjAtLayer ๊ฒ์ฌ๋ ๋ก์ปฌ ์ํ๋ง ์ฝ์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.RemoveHat();
UO.Wait(500);
UO.Print(UO.ObjAtLayer("Hat"));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.Unequip:Unequip("Hat").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "removehat": Unequip("Hat"); break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.RemoveNeckless();Neck ๋ ์ด์ด์์ ํญ๋ชฉ์ ์ ๊ฑฐํ๋๋ก ์์ฒญํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ExecuteLegacyManualAlias๋ Unequip("๋ชฉ")์ ํธ์ถํฉ๋๋ค. ConvertLayer ์ซ์ ๋ ์ด์ด์ธ ๋ธ๋ฆฌ์ง๋ฅผ ์ ํํฉ๋๋ค. Unequip ๋ฐฐ๋ญ์ผ๋ก ์ด๋์ ์์ฒญํฉ๋๋ค.
- ๋ ๊ฑฐ์ ๋ช ๋ น์ ๋ด๋ถ Unequip(1/0) ๊ฒฐ๊ณผ๋ ์ญ์ ๋ฉ๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์์ดํ /๋ฐฐ๋ญ์ด ์์ ๊ฒฝ์ฐ ์์ฒญ์ด ์คํ๋์ง ์์ ์ ์์ต๋๋ค. ํธ์ถ ํ ObjAtLayer ๊ฒ์ฌ๋ ๋ก์ปฌ ์ํ๋ง ์ฝ์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.RemoveNeckless");
UO.RemoveNeckless();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Neck ๋ ์ด์ด์์ ํญ๋ชฉ์ ์ ๊ฑฐํ๋๋ก ์์ฒญํฉ๋๋ค.
UO.RemoveNeckless();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ExecuteLegacyManualAlias๋ Unequip("๋ชฉ")์ ํธ์ถํฉ๋๋ค. ConvertLayer ์ซ์ ๋ ์ด์ด์ธ ๋ธ๋ฆฌ์ง๋ฅผ ์ ํํฉ๋๋ค. Unequip ๋ฐฐ๋ญ์ผ๋ก ์ด๋์ ์์ฒญํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.ObjAtLayer("Neck"));
UO.RemoveNeckless();
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ๊ฑฐ์ ๋ช ๋ น์ ๋ด๋ถ Unequip(1/0) ๊ฒฐ๊ณผ๋ ์ญ์ ๋ฉ๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์์ดํ /๋ฐฐ๋ญ์ด ์์ ๊ฒฝ์ฐ ์์ฒญ์ด ์คํ๋์ง ์์ ์ ์์ต๋๋ค. ํธ์ถ ํ ObjAtLayer ๊ฒ์ฌ๋ ๋ก์ปฌ ์ํ๋ง ์ฝ์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.RemoveNeckless();
UO.Wait(500);
UO.Print(UO.ObjAtLayer("Neck"));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.Unequip:Unequip("Neck").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "removeneckless": Unequip("Neck"); break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.RemoveRing();๋ง ๋ ์ด์ด์์ ํญ๋ชฉ ์ ๊ฑฐ๋ฅผ ์์ฒญํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ExecuteLegacyManualAlias๊ฐ Unequip("๋ฒจ์๋ฆฌ")๋ฅผ ํธ์ถํฉ๋๋ค. ConvertLayer ์ซ์ ๋ ์ด์ด์ธ ๋ธ๋ฆฌ์ง๋ฅผ ์ ํํฉ๋๋ค. Unequip ๋ฐฐ๋ญ์ผ๋ก ์ด๋์ ์์ฒญํฉ๋๋ค.
- ๋ ๊ฑฐ์ ๋ช ๋ น์ ๋ด๋ถ Unequip(1/0) ๊ฒฐ๊ณผ๋ ์ญ์ ๋ฉ๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์์ดํ /๋ฐฐ๋ญ์ด ์์ ๊ฒฝ์ฐ ์์ฒญ์ด ์คํ๋์ง ์์ ์ ์์ต๋๋ค. ํธ์ถ ํ ObjAtLayer ๊ฒ์ฌ๋ ๋ก์ปฌ ์ํ๋ง ์ฝ์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.RemoveRing");
UO.RemoveRing();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ง ๋ ์ด์ด์์ ํญ๋ชฉ ์ ๊ฑฐ๋ฅผ ์์ฒญํฉ๋๋ค.
UO.RemoveRing();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ExecuteLegacyManualAlias๊ฐ Unequip("๋ฒจ์๋ฆฌ")๋ฅผ ํธ์ถํฉ๋๋ค. ConvertLayer ์ซ์ ๋ ์ด์ด์ธ ๋ธ๋ฆฌ์ง๋ฅผ ์ ํํฉ๋๋ค. Unequip ๋ฐฐ๋ญ์ผ๋ก ์ด๋์ ์์ฒญํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.ObjAtLayer("Ring"));
UO.RemoveRing();
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ๊ฑฐ์ ๋ช ๋ น์ ๋ด๋ถ Unequip(1/0) ๊ฒฐ๊ณผ๋ ์ญ์ ๋ฉ๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์์ดํ /๋ฐฐ๋ญ์ด ์์ ๊ฒฝ์ฐ ์์ฒญ์ด ์คํ๋์ง ์์ ์ ์์ต๋๋ค. ํธ์ถ ํ ObjAtLayer ๊ฒ์ฌ๋ ๋ก์ปฌ ์ํ๋ง ์ฝ์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.RemoveRing();
UO.Wait(500);
UO.Print(UO.ObjAtLayer("Ring"));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.Unequip:Unequip("Ring").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "removering": Unequip("Ring"); break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.RequestStats(object? objID);serial๋ก ์บ๋ฆญํฐ์ ์ํ๋ฅผ ์์ฒญํฉ๋๋ค.
-
objIDโ ์ง๋ ฌ/ID ๊ฐ์ฒด: int, ์ซ์/16์ง์ ๋ฌธ์์ด ๋๋ ์ค์ ๋ ๋ณ์นญ(์: "lasttarget"). ์ด๊ฒ์ graphic/type๊ฐ ์๋๋๋ค. ์กฐ์น๋ฅผ ์ทจํ๊ธฐ ์ ์ ๋ก๋๋ ๊ฐ์ฒด๋ฅผ ํ์ธํ์ญ์์ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- RequestStats๋ RequestMobileStatus(_world, serial, true)์ ํธ์ถํฉ๋๋ค. ํธ์ถ์ ํน์ฑ ๋ฐฐ์ด์ ๋ฐํํ์ง ์์ผ๋ฉฐ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. GetHP/GetStr ๋ค์์ ๋ก์ปฌ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค.
- Bridge๋ ๊ฒ์ ์คํธ๋ฆผ์ ๋ํ ์์ฒญ์ ๋ณด๋ ๋๋ค. ์๋ฒ ๊ท์น์ด ์ ์ฉ๋ฉ๋๋ค. ํ์ธ์ ๊ธฐ๋ค๋ฆฌ๋ ๋ด์ฅ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.RequestStats");
UO.RequestStats(UO.GetSerial("lasttarget"));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- serial๋ก ์บ๋ฆญํฐ์ ์ํ๋ฅผ ์์ฒญํฉ๋๋ค.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
UO.RequestStats(id);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- RequestStats๋ RequestMobileStatus(_world, serial, true)์ ํธ์ถํฉ๋๋ค. ํธ์ถ์ ํน์ฑ ๋ฐฐ์ด์ ๋ฐํํ์ง ์์ผ๋ฉฐ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. GetHP/GetStr ๋ค์์ ๋ก์ปฌ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var id = UO.GetSerial("self");
if (Truth(UO.Exists(id)))
{
UO.RequestStats(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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Bridge๋ ๊ฒ์ ์คํธ๋ฆผ์ ๋ํ ์์ฒญ์ ๋ณด๋ ๋๋ค. ์๋ฒ ๊ท์น์ด ์ ์ฉ๋ฉ๋๋ค. ํ์ธ์ ๊ธฐ๋ค๋ฆฌ๋ ๋ด์ฅ์ ์์ต๋๋ค.
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()
{
ApplyToLoaded(UO.GetSerial("lasttarget"));
return null;
}
void ApplyToLoaded(dynamic id)
{
if (Truth(UO.Exists(id)))
{
UO.RequestStats(id);
}
}
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)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.RequestStats:bridge.RequestStats(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "requeststats": bridge.RequestStats(Arg(0)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.ResistCold();ํ์ฌ ์บ๋ฆญํฐ์ ์ ํญ ํ๋: ์ฝ๋๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int๋ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์๋ช ๋ ์ํ ๊ฐ, -32768..32767์ ๋๋ค. ์์ ๊ฐ์ด ์ ์ง๋ฉ๋๋ค. 0๋ ์ค์ ์ ํญ, ๋ฐ์ดํฐ ๋ถ์กฑ ๋๋ ํ๋ ์ด์ด ๋๋ฝ/ํ๊ดด์ผ ์ ์์ต๋๋ค. GetResist๋ ์ ์ ์๋ ์ ํ๊ธฐ์ ๋ํด 0๋ ์ ๊ณตํฉ๋๋ค. bool, ID, ์คํฌ ํ๊ณ๋ ์ ํญ ํ๊ณ๊ฐ ์๋๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋ 1์ ์ ์๋ฏธํฉ๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.ColdResistance ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- ์์ ํ๋๋ ํ์ฅ๋ CharacterStatus (0x11), type >= 4๋ก ์ ๊ณต๋ฉ๋๋ค. ๋ช ๋ น ์์ฒด๋ ์๋ฒ ์๋๋ฅผ ํ์ธํ์ง ์์ต๋๋ค. ์ด๋ฌํ ํ๋๊ฐ ์๋ ์์ถ/์ด์ ์ํ๋ ์ด์ ์บ์๋ฅผ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค. ์ ํ๋ ์ด์ด๋ ์ฒ์์๋ 0์ ๋๋ค. ๋ ์ ํญ์ Poisoned ํ๋๊ทธ๊ฐ ์๋๋๋ค. ๋ํ ์ฃผ๋ฌธ ์ ํญ ์คํฌ๋ ์๋๋๋ค.
- CharacterStatus๋ ์ด๋ฆ, ์ฒด๋ ฅ, ์์ ์ ํน์ฑ์ ๋ณ๊ฒฝํ๊ธฐ ์ ์ ํ์ํ ์ ์ฒด๋ฅผ ํ์ธํ ๋ค์ ๊ฐ ์ ํญ ๋จ์ด๋ฅผ ์๋ช ๋ Int16์ผ๋ก ๋ณํํฉ๋๋ค. ์๋ฆฐ ํ์ ๋ณธ๋ฌธ์ ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ ํ์ ๊ผฌ๋ฆฌ type 6๋ ๋์ผํ ๊ท์น์ ์ ์งํฉ๋๋ค. ์ ํญ ๋ช ๋ น์ ์ต๋ ํ๊ณ๋ฅผ ์ฝ์ง ์์ต๋๋ค.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
- ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค. C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.ResistCold();
UO.Print("ResistCold: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. Convert.ToString๋ ๋ก๊ทธ ๋ฒํธ์ ํ์์ ์ง์ ํฉ๋๋ค. ๋ ผ์์ ์์ต๋๋ค. ์์ ์ ์ฑ๊ฒฉ์ ์ฝ์ ์ ์์ต๋๋ค.
var value = UO.ResistCold();
UO.Print("ColdResistance: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ํ ์ฌ์ด์๋ UO.Wait(500) ๋ฐ๋ฆฌ์ด๊ฐ ์์ต๋๋ค. ์ฐจ์ด๋ ์์๊ฐ ๋ ์ ์์ต๋๋ค. ์ค๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค. ์ผ์ ์ ์ง๋ ์ง์ฐ API์ด ์๋ ์๋ฅผ ๋ํ๋ ๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.ResistCold();
await Delay(500);
var after = UO.ResistCold();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์=50๋ ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋ ์๊ตฌ ์ฌํญ์ ์์ ๋๋ค. ResistanceAtLeast๋ ๋๋ฝ๋ ํ๋ ์ด์ด๋ฅผ ๊ฑฐ๋ถํ๊ณ ํ๋์ ๊ฐ์ ์ฝ๊ณ 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(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.ResistCold();
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 [ResistCold]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ColdResistance:bridge.ColdResistance.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.ColdResistanceAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.ResistEnergy();ํ์ฌ ์บ๋ฆญํฐ์ ์ ํญ์ฅ์ธ ์๋์ง๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int๋ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์๋ช ๋ ์ํ ๊ฐ, -32768..32767์ ๋๋ค. ์์ ๊ฐ์ด ์ ์ง๋ฉ๋๋ค. 0๋ ์ค์ ์ ํญ, ๋ฐ์ดํฐ ๋ถ์กฑ ๋๋ ํ๋ ์ด์ด ๋๋ฝ/ํ๊ดด์ผ ์ ์์ต๋๋ค. GetResist๋ ์ ์ ์๋ ์ ํ๊ธฐ์ ๋ํด 0๋ ์ ๊ณตํฉ๋๋ค. bool, ID, ์คํฌ ํ๊ณ๋ ์ ํญ ํ๊ณ๊ฐ ์๋๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋ 1์ ์ ์๋ฏธํฉ๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.EnergyResistance ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- ์์ ํ๋๋ ํ์ฅ๋ CharacterStatus (0x11), type >= 4๋ก ์ ๊ณต๋ฉ๋๋ค. ๋ช ๋ น ์์ฒด๋ ์๋ฒ ์๋๋ฅผ ํ์ธํ์ง ์์ต๋๋ค. ์ด๋ฌํ ํ๋๊ฐ ์๋ ์์ถ/์ด์ ์ํ๋ ์ด์ ์บ์๋ฅผ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค. ์ ํ๋ ์ด์ด๋ ์ฒ์์๋ 0์ ๋๋ค. ๋ ์ ํญ์ Poisoned ํ๋๊ทธ๊ฐ ์๋๋๋ค. ๋ํ ์ฃผ๋ฌธ ์ ํญ ์คํฌ๋ ์๋๋๋ค.
- CharacterStatus๋ ์ด๋ฆ, ์ฒด๋ ฅ, ์์ ์ ํน์ฑ์ ๋ณ๊ฒฝํ๊ธฐ ์ ์ ํ์ํ ์ ์ฒด๋ฅผ ํ์ธํ ๋ค์ ๊ฐ ์ ํญ ๋จ์ด๋ฅผ ์๋ช ๋ Int16์ผ๋ก ๋ณํํฉ๋๋ค. ์๋ฆฐ ํ์ ๋ณธ๋ฌธ์ ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ ํ์ ๊ผฌ๋ฆฌ type 6๋ ๋์ผํ ๊ท์น์ ์ ์งํฉ๋๋ค. ์ ํญ ๋ช ๋ น์ ์ต๋ ํ๊ณ๋ฅผ ์ฝ์ง ์์ต๋๋ค.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
- ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค. C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.ResistEnergy();
UO.Print("ResistEnergy: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. Convert.ToString๋ ๋ก๊ทธ ๋ฒํธ์ ํ์์ ์ง์ ํฉ๋๋ค. ๋ ผ์์ ์์ต๋๋ค. ์์ ์ ์ฑ๊ฒฉ์ ์ฝ์ ์ ์์ต๋๋ค.
var value = UO.ResistEnergy();
UO.Print("EnergyResistance: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ํ ์ฌ์ด์๋ UO.Wait(500) ๋ฐ๋ฆฌ์ด๊ฐ ์์ต๋๋ค. ์ฐจ์ด๋ ์์๊ฐ ๋ ์ ์์ต๋๋ค. ์ค๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค. ์ผ์ ์ ์ง๋ ์ง์ฐ API์ด ์๋ ์๋ฅผ ๋ํ๋ ๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.ResistEnergy();
await Delay(500);
var after = UO.ResistEnergy();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์=50๋ ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋ ์๊ตฌ ์ฌํญ์ ์์ ๋๋ค. ResistanceAtLeast๋ ๋๋ฝ๋ ํ๋ ์ด์ด๋ฅผ ๊ฑฐ๋ถํ๊ณ ํ๋์ ๊ฐ์ ์ฝ๊ณ 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(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.ResistEnergy();
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 [ResistEnergy]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.EnergyResistance:bridge.EnergyResistance.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.EnergyResistanceAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.ResistFire();ํ์ฌ ์บ๋ฆญํฐ์ ์ ํญ ํ๋์ธ ๋ถ์ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int๋ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์๋ช ๋ ์ํ ๊ฐ, -32768..32767์ ๋๋ค. ์์ ๊ฐ์ด ์ ์ง๋ฉ๋๋ค. 0๋ ์ค์ ์ ํญ, ๋ฐ์ดํฐ ๋ถ์กฑ ๋๋ ํ๋ ์ด์ด ๋๋ฝ/ํ๊ดด์ผ ์ ์์ต๋๋ค. GetResist๋ ์ ์ ์๋ ์ ํ๊ธฐ์ ๋ํด 0๋ ์ ๊ณตํฉ๋๋ค. bool, ID, ์คํฌ ํ๊ณ๋ ์ ํญ ํ๊ณ๊ฐ ์๋๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋ 1์ ์ ์๋ฏธํฉ๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.FireResistance ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- ์์ ํ๋๋ ํ์ฅ๋ CharacterStatus (0x11), type >= 4๋ก ์ ๊ณต๋ฉ๋๋ค. ๋ช ๋ น ์์ฒด๋ ์๋ฒ ์๋๋ฅผ ํ์ธํ์ง ์์ต๋๋ค. ์ด๋ฌํ ํ๋๊ฐ ์๋ ์์ถ/์ด์ ์ํ๋ ์ด์ ์บ์๋ฅผ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค. ์ ํ๋ ์ด์ด๋ ์ฒ์์๋ 0์ ๋๋ค. ๋ ์ ํญ์ Poisoned ํ๋๊ทธ๊ฐ ์๋๋๋ค. ๋ํ ์ฃผ๋ฌธ ์ ํญ ์คํฌ๋ ์๋๋๋ค.
- CharacterStatus๋ ์ด๋ฆ, ์ฒด๋ ฅ, ์์ ์ ํน์ฑ์ ๋ณ๊ฒฝํ๊ธฐ ์ ์ ํ์ํ ์ ์ฒด๋ฅผ ํ์ธํ ๋ค์ ๊ฐ ์ ํญ ๋จ์ด๋ฅผ ์๋ช ๋ Int16์ผ๋ก ๋ณํํฉ๋๋ค. ์๋ฆฐ ํ์ ๋ณธ๋ฌธ์ ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ ํ์ ๊ผฌ๋ฆฌ type 6๋ ๋์ผํ ๊ท์น์ ์ ์งํฉ๋๋ค. ์ ํญ ๋ช ๋ น์ ์ต๋ ํ๊ณ๋ฅผ ์ฝ์ง ์์ต๋๋ค.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
- ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค. C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.ResistFire();
UO.Print("ResistFire: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. Convert.ToString๋ ๋ก๊ทธ ๋ฒํธ์ ํ์์ ์ง์ ํฉ๋๋ค. ๋ ผ์์ ์์ต๋๋ค. ์์ ์ ์ฑ๊ฒฉ์ ์ฝ์ ์ ์์ต๋๋ค.
var value = UO.ResistFire();
UO.Print("FireResistance: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ํ ์ฌ์ด์๋ UO.Wait(500) ๋ฐ๋ฆฌ์ด๊ฐ ์์ต๋๋ค. ์ฐจ์ด๋ ์์๊ฐ ๋ ์ ์์ต๋๋ค. ์ค๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค. ์ผ์ ์ ์ง๋ ์ง์ฐ API์ด ์๋ ์๋ฅผ ๋ํ๋ ๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.ResistFire();
await Delay(500);
var after = UO.ResistFire();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์=50๋ ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋ ์๊ตฌ ์ฌํญ์ ์์ ๋๋ค. ResistanceAtLeast๋ ๋๋ฝ๋ ํ๋ ์ด์ด๋ฅผ ๊ฑฐ๋ถํ๊ณ ํ๋์ ๊ฐ์ ์ฝ๊ณ 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(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.ResistFire();
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 [ResistFire]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.FireResistance:bridge.FireResistance.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.FireResistanceAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.ResistPhysical();ํ์ฌ ์บ๋ฆญํฐ์ ์ ํญ ํ๋(๋ฌผ๋ฆฌ ๋ฐฉ์ด๊ตฌ/์ ํญ)๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int๋ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์๋ช ๋ ์ํ ๊ฐ, -32768..32767์ ๋๋ค. ์์ ๊ฐ์ด ์ ์ง๋ฉ๋๋ค. 0๋ ์ค์ ์ ํญ, ๋ฐ์ดํฐ ๋ถ์กฑ ๋๋ ํ๋ ์ด์ด ๋๋ฝ/ํ๊ดด์ผ ์ ์์ต๋๋ค. GetResist๋ ์ ์ ์๋ ์ ํ๊ธฐ์ ๋ํด 0๋ ์ ๊ณตํฉ๋๋ค. bool, ID, ์คํฌ ํ๊ณ๋ ์ ํญ ํ๊ณ๊ฐ ์๋๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋ 1์ ์ ์๋ฏธํฉ๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.PhysicalResistance ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- PhysicalResistance - ์๋ฒ ๊ฐ์ท/์ํ ํ๋: ํด๋์ ์๋ฒ๋ ๊ฐ์ท ๋ฑ๊ธ์ ์ ์กํ ์ ์์ผ๋ฉฐ, ์ ํญ์ด ์๋ ๊ท์น์ ๋ฌผ๋ฆฌ์ ์ ํญ์ ์ ์กํ ์ ์์ต๋๋ค. API๋ ์๋ก ๋ณํ๋์ง ์์ผ๋ฉฐ ํผํด ๊ฐ์์จ์ ๊ณ์ฐํ์ง ์์ต๋๋ค. Armor ๋ฐ ๋ฌผ๋ฆฌ์ ๋ณ์นญ์ ๋์ผํ ํ๋๋ฅผ ์ฝ์ต๋๋ค.
- CharacterStatus๋ ์ด๋ฆ, ์ฒด๋ ฅ, ์์ ์ ํน์ฑ์ ๋ณ๊ฒฝํ๊ธฐ ์ ์ ํ์ํ ์ ์ฒด๋ฅผ ํ์ธํ ๋ค์ ๊ฐ ์ ํญ ๋จ์ด๋ฅผ ์๋ช ๋ Int16์ผ๋ก ๋ณํํฉ๋๋ค. ์๋ฆฐ ํ์ ๋ณธ๋ฌธ์ ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ ํ์ ๊ผฌ๋ฆฌ type 6๋ ๋์ผํ ๊ท์น์ ์ ์งํฉ๋๋ค. ์ ํญ ๋ช ๋ น์ ์ต๋ ํ๊ณ๋ฅผ ์ฝ์ง ์์ต๋๋ค.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
- ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค. C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.ResistPhysical();
UO.Print("ResistPhysical: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. Convert.ToString๋ ๋ก๊ทธ ๋ฒํธ์ ํ์์ ์ง์ ํฉ๋๋ค. ๋ ผ์์ ์์ต๋๋ค. ์์ ์ ์ฑ๊ฒฉ์ ์ฝ์ ์ ์์ต๋๋ค.
var value = UO.ResistPhysical();
UO.Print("PhysicalResistance: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ํ ์ฌ์ด์๋ UO.Wait(500) ๋ฐ๋ฆฌ์ด๊ฐ ์์ต๋๋ค. ์ฐจ์ด๋ ์์๊ฐ ๋ ์ ์์ต๋๋ค. ์ค๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค. ์ผ์ ์ ์ง๋ ์ง์ฐ API์ด ์๋ ์๋ฅผ ๋ํ๋ ๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.ResistPhysical();
await Delay(500);
var after = UO.ResistPhysical();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์=50๋ ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋ ์๊ตฌ ์ฌํญ์ ์์ ๋๋ค. ResistanceAtLeast๋ ๋๋ฝ๋ ํ๋ ์ด์ด๋ฅผ ๊ฑฐ๋ถํ๊ณ ํ๋์ ๊ฐ์ ์ฝ๊ณ 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(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.ResistPhysical();
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 [ResistPhysical]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Armor:bridge.Armor.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.ArmorAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.ResistPoison();ํ์ฌ ์บ๋ฆญํฐ์ ์ ํญ ํ๋์ธ ๋ ์ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int๋ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์๋ช ๋ ์ํ ๊ฐ, -32768..32767์ ๋๋ค. ์์ ๊ฐ์ด ์ ์ง๋ฉ๋๋ค. 0๋ ์ค์ ์ ํญ, ๋ฐ์ดํฐ ๋ถ์กฑ ๋๋ ํ๋ ์ด์ด ๋๋ฝ/ํ๊ดด์ผ ์ ์์ต๋๋ค. GetResist๋ ์ ์ ์๋ ์ ํ๊ธฐ์ ๋ํด 0๋ ์ ๊ณตํฉ๋๋ค. bool, ID, ์คํฌ ํ๊ณ๋ ์ ํญ ํ๊ณ๊ฐ ์๋๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋ 1์ ์ ์๋ฏธํฉ๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.PoisonResistance ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- ์์ ํ๋๋ ํ์ฅ๋ CharacterStatus (0x11), type >= 4๋ก ์ ๊ณต๋ฉ๋๋ค. ๋ช ๋ น ์์ฒด๋ ์๋ฒ ์๋๋ฅผ ํ์ธํ์ง ์์ต๋๋ค. ์ด๋ฌํ ํ๋๊ฐ ์๋ ์์ถ/์ด์ ์ํ๋ ์ด์ ์บ์๋ฅผ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค. ์ ํ๋ ์ด์ด๋ ์ฒ์์๋ 0์ ๋๋ค. ๋ ์ ํญ์ Poisoned ํ๋๊ทธ๊ฐ ์๋๋๋ค. ๋ํ ์ฃผ๋ฌธ ์ ํญ ์คํฌ๋ ์๋๋๋ค.
- CharacterStatus๋ ์ด๋ฆ, ์ฒด๋ ฅ, ์์ ์ ํน์ฑ์ ๋ณ๊ฒฝํ๊ธฐ ์ ์ ํ์ํ ์ ์ฒด๋ฅผ ํ์ธํ ๋ค์ ๊ฐ ์ ํญ ๋จ์ด๋ฅผ ์๋ช ๋ Int16์ผ๋ก ๋ณํํฉ๋๋ค. ์๋ฆฐ ํ์ ๋ณธ๋ฌธ์ ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ ํ์ ๊ผฌ๋ฆฌ type 6๋ ๋์ผํ ๊ท์น์ ์ ์งํฉ๋๋ค. ์ ํญ ๋ช ๋ น์ ์ต๋ ํ๊ณ๋ฅผ ์ฝ์ง ์์ต๋๋ค.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
- ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค. C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.ResistPoison();
UO.Print("ResistPoison: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. Convert.ToString๋ ๋ก๊ทธ ๋ฒํธ์ ํ์์ ์ง์ ํฉ๋๋ค. ๋ ผ์์ ์์ต๋๋ค. ์์ ์ ์ฑ๊ฒฉ์ ์ฝ์ ์ ์์ต๋๋ค.
var value = UO.ResistPoison();
UO.Print("PoisonResistance: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ํ ์ฌ์ด์๋ UO.Wait(500) ๋ฐ๋ฆฌ์ด๊ฐ ์์ต๋๋ค. ์ฐจ์ด๋ ์์๊ฐ ๋ ์ ์์ต๋๋ค. ์ค๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค. ์ผ์ ์ ์ง๋ ์ง์ฐ API์ด ์๋ ์๋ฅผ ๋ํ๋ ๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.ResistPoison();
await Delay(500);
var after = UO.ResistPoison();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์=50๋ ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋ ์๊ตฌ ์ฌํญ์ ์์ ๋๋ค. ResistanceAtLeast๋ ๋๋ฝ๋ ํ๋ ์ด์ด๋ฅผ ๊ฑฐ๋ถํ๊ณ ํ๋์ ๊ฐ์ ์ฝ๊ณ 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(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.ResistPoison();
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 [ResistPoison]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.PoisonResistance:bridge.PoisonResistance.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.PoisonResistanceAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Self();ํ์ฌ ๋ฌธ์์ ID๋ฅผ ๋ฐํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int - serial/ID, graphic/type, ๋ ์ด์ด, ํญ๋ชฉ ์ ๋๋ bool๊ฐ ์๋. 0โํ์ฌ ๊ฐ์ฒด๊ฐ ์์ต๋๋ค. ๋ชจ๋ 32 ๋นํธ serial๊ฐ ์ ์ฅ๋ฉ๋๋ค. != 0๋ฅผ ํ์ธํ์ธ์. == true ๋๋ > 0๊ฐ ์๋๋๋ค. ์ ์ฅ๋ ๊ฒฐ๊ณผ๋ ์์ฒด์ ์ผ๋ก ์ ๋ฐ์ดํธ๋์ง ์์ต๋๋ค. World.Player.Serial์ ์ฝ์ต๋๋ค. ์ค์ข ๋๊ฑฐ๋ ํ๊ดด๋ ํ๋ ์ด์ด๋ 0๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ฃฝ์์ ์ ๊ฑฐ์ ๋ค๋ฆ ๋๋ค. ์กด์ฌํ๋ ์ ๋ น์ ์บ๋ฆญํฐ์ ID์ ์ ์งํฉ๋๋ค.
- ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค. ๊ฒ์ ์คํธ๋ฆผ์์ Invoke๋ฅผ ํตํด ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์คํฌ๋ฆฝํธ๋ฅผ ์ทจ์ํ๋ฉด ํด๋น ์ค๋ ๋์ ๋ํ ๋๊ธฐ๊ฐ ์ค๋จ๋ฉ๋๋ค. ํจํค์ง๋ฅผ ๋ณด๋ด์ง ์๊ณ , ์ปจํ ์ด๋/๋์์ ์ด์ง ์์ผ๋ฉฐ, ์์ดํ ์ ์ ์กํ์ง ์์ต๋๋ค.
- ๊ดํธ ์์ด ๋ด์ฅ๋ self/backpack๋ ์คํฌ๋ฆฝํธ ๋ณ์๋ก ์ฌ์ ์๋์ง ์๋ ํ ๋ค์ ์ฝํ์ง๋๋ค. ๋ฌธ์์ด ์ด๋ฆ์ ์์ ๋ช ๋ น์ ์ํด ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ด๋ฐ ๋์์์ "self"๋ ๋ฐฐ๋ญ์ ์๋ฏธํ๊ณ , UO.Self()๋ ์บ๋ฆญํฐ์ serial๋ฅผ ๋ฐํํฉ๋๋ค. ID ์ปจํ ์ด๋์ ๊ฒฝ์ฐ UO.Backpack()๋ฅผ ๋ช ์์ ์ผ๋ก ์ฌ์ฉํ์ธ์.
- World.Clear๋ ํ๋ ์ด์ด๋ฅผ ์ ๊ฑฐํฉ๋๋ค. ํ์ ํ๋ ๊ฒฐ๊ณผ๋ 0์ ๋๋ค. ์ธ๊ณ์ ์ ์ฅํ๊ฑฐ๋ ์ฅ์ฐฉํ ๊ฐ๋ฐฉ์ ๋ฐ๊พธ๋ฉด ID๊ฐ ๋ฐ๋ ์ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ์์์ ์ด์ง ์์ต๋๋ค. 0์ด ์๋ ID๋ ์ฐ๊ฒฐ, ์๋ฒ ํ์ธ ๋๋ ์ฝํ ์ธ ๋ก๋ฉ์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Self();
UO.Print("Self: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- id๋ ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ก๊ทธ์ฉ HEX ํ์ serial. ์ด ์์์๋ ์๋ฌด ๊ฒ๋ ์ ํํ๊ฑฐ๋ ์ฌ์ฉํ์ง ์์ต๋๋ค.
var id = UO.Self();
UO.Print("ID: " + Hex(id));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด์ /์ดํ๋ 250 ms ๊ฐ๊ฒฉ์ผ๋ก ์ฝํ์ง๋๋ค. UO.Wait๋ ์์์ฉ์ผ๋ก๋ง ์ถ๊ฐ๋์์ต๋๋ค. ํ๋ฑ์ ๋์ผํ ์ต์ข ID์ ์๋ฏธํฉ๋๋ค. ์ค๊ฐ ๋ณ๊ฒฝ์ฌํญ์ด ๋๋ฝ๋ ์ ์์ต๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.Self();
await Delay(250);
var after = UO.Self();
if (Truth(before != after))
{
UO.Print("ID changed: " + Hex(after));
}
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ๋ณด์ - ์ ์ฅ๋จ ID LastTarget. IsOwnSerial(ํ๋ณด์)๋ ํ๋์ serial๋ฅผ ์ทจํ๊ณ bool๋ฅผ ๋ฐํํฉ๋๋ค. ํ์ฌ 0์ด ์๋ ์์ฒด ID์ ๋ํด 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()
{
var candidate = UO.LastTarget();
if (Truth(Truth(IsOwnSerial(candidate)) == true))
{
UO.Print("Own object selected");
}
else
{
UO.Print("Different object or no own object");
}
return null;
}
dynamic IsOwnSerial(dynamic candidate)
{
var current = UO.Self();
return Truth(current != 0) && Truth(current == candidate);
}
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.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "self": return new InjectionValue(bridge.Self);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.SetARExtParams();
void UO.SetARExtParams(object? shardName);
void UO.SetARExtParams(object? shardName, object? charName);
void UO.SetARExtParams(object? shardName, object? charName, object? useAtEveryConnect);์ค๋ ๋ชฉ๋ก์์ ์๋ฒ๋ฅผ ์ง์ ํ๊ณ ํ์ ๋ก๊ทธ์ธ์ ์ํ ์บ๋ฆญํฐ๋ฅผ ์ง์ ํฉ๋๋ค. ๋์ผํ ๊ณ์ ์ ํน์ ์บ๋ฆญํฐ๋ก ์คํฌ๋ฆฝํธ๋ฅผ ๋ค์ ์ฐ๊ฒฐํด์ผ ํ ๋ ์ ์ฉํฉ๋๋ค.
-
shardNameโ IP ๋๋ ํฌํธ๊ฐ ์๋ ๋ก๊ทธ์ธ ๋ชฉ๋ก์ ์๋ฒ ํ์ ์ด๋ฆ(์ ํ ์ฌํญ)์ ๋๋ค. ๋น์ด ์๊ฑฐ๋ ๋๋ฝ๋ ๊ฐ์ ํ์ฌ ShardName์์ ์ฌ์ฉ๋ฉ๋๋ค. ๊ฐ์ฅ์๋ฆฌ ์ฃผ๋ณ์ ๊ณต๋ฐฑ์ด ์ ๊ฑฐ๋ฉ๋๋ค. -
charName- ๊ธฐ์กด ๊ณ์ ์บ๋ฆญํฐ์ ์ ํ์ ์ด๋ฆ์ ๋๋ค. ๋น์ด ์๊ฑฐ๋ ๋๋ฝ๋ ๊ฐ์ ์๋ ค์ง ๊ฒฝ์ฐ self๋ผ๋ ์ด๋ฆ์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ์ฌ๋กฏ ๋ฒํธ๋ serial๊ฐ ์๋ ์ด๋ฆ์ ๋๋ค. ๋น์ด ์์ง ์์ ์ด๋ฆ์ ํ๋กํ ์ฌ๋กฏ๋ณด๋ค ์ฐ์ ํฉ๋๋ค. -
useAtEveryConnect- ์ ํ์ ํ๋๊ทธ: false/0 ๊ธฐ๋ณธ์ ์ผ๋ก - ์ผํ์ฑ ์ ํ; true/1 ๋๋ ๊ธฐํ 0์ด ์๋ ์ ์โ์ด ์ธ์ ์์ ํฅํ ๋ก๊ทธ์ธ์ ์ํด ์ ํ ํญ๋ชฉ์ ์ ์ฅํฉ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ์ด๋ ์บ๋ฆญํฐ์ ์ฐ๊ฒฐ์ด๋ ์กด์ฌ๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์๋๋ผ ๋ค์ ์ ๋ ฅ์ ์ค์ ํ๋ ๊ฒ์ ๋๋ค.
- ๊ด๋ฆฌ์์์ nonce๋ ์คํจํ ๋คํธ์ํฌ ์๋์ ๋ํด ์ ์ฅ๋๋ฉฐ ์ธ๊ณ์ ๋ค์ด๊ฐ ํ์๋ง ์๋น๋ฉ๋๋ค. ๋ค์ ์ฐ๊ฒฐ์ ํ๋กํ ์ค์ ์ผ๋ก ๋์๊ฐ๋๋ค. ์ง์์ ์ธ ์ ํ์ ์๋ก์ด ์ค์ ์ด๋ ์ธ์ ์์ ์๊ฐ ์ข ๋ฃ๋ ๋๊น์ง ์ง์๋ฉ๋๋ค. ๊ด๋ฆฌ์ ํ๋กํ ํ์ผ์ ๋ฎ์ด์ฐ์ง ์์ต๋๋ค. ๋ก๊ทธ์ธ ์ค ์๋ก์ด ์ค์ ์ ๋ค์ ๋ก๊ทธ์ธ์ ์ ์ฉ๋๋ฉฐ ํ์ฌ ๋ก๊ทธ์ธ์ด ์๋ฃ๋์ด๋ ์์ค๋์ง ์์ต๋๋ค.
- ๋ณ๋์ ๊ทธ๋ํฝ ํด๋ผ์ด์ธํธ์์๋ ์๋ฒ๋ LastServerName, ์บ๋ฆญํฐ๋ LastCharacterManager๋ก ์ ์ฅ๋ฉ๋๋ค. ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด ํด๋น ์บ๋ฆญํฐ๋ ๋ง์ง๋ง์ผ๋ก ์ฌ์ฉํ ์บ๋ฆญํฐ๊ฐ ๋ฉ๋๋ค. ์ผํ์ฉ์ด ์ด์ ์บ๋ฆญํฐ๋ก ์๋์ผ๋ก ๋์๊ฐ๋ ๊ฒ์ ์๋ฏธํ์ง๋ ์์ต๋๋ค. ์๊ตฌ ์ฌ์ ์๋ ํ์ฌ ํ๋ก์ธ์ค์ ์ ์ฉ๋ฉ๋๋ค.
- ๋ช ๋ น ์์ฒด๋ ์๋ ์ฌ์ฐ๊ฒฐ์ ํ์ฑํํ์ง ์์ผ๋ฉฐ ์ฐ๊ฒฐ์ ๋์ง ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด SetARStatus, Connect ๋ฐ Disconnect๋ฅผ ๋ณ๋๋ก ์ฌ์ฉํ์ธ์. ์๋ฒ ๋ชฉ๋ก์ ์ด๋ฆ์ด ์์ด์ผ ํฉ๋๋ค. ๋น๊ต์์๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค. ๊ด๋ฆฌ์์์ ์๋ ๋ฌธ์ ์ ๋ ฅ์ด ๋นํ์ฑํ๋ ๊ฒฝ์ฐ ์๋ ์ ํ์ด ์ ์ง๋ฉ๋๋ค. ์คํ๋ผ์ธ ์ด๋ฆ self์ ์ ์ ์์ต๋๋ค. ์ด๋ฆ์ ๋ช ์์ ์ผ๋ก ์ง์ ํ์ธ์. ์ด ๋ช ๋ น์ ๊ณ์ , ๋น๋ฐ๋ฒํธ, IP, ํฌํธ ๋ฐ ์ํธํ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ํ์ฌ ์ด๋ฆ์ ์ฌ์ฉํ ์ ์๋ ๋น ๊ฐ์ ์ด์ ์ ์ค์ ๋ ์ ํ์ ์ง์ฐ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SetARExtParams");
UO.SetARExtParams("", "", true);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒซ ๋ฒ์งธ ์๋ ์จ๋ผ์ธ์์๋ง ์๋ํฉ๋๋ค. ๋ ๊ฐ์ ๋น ์ค์ ํ์ฌ ์ด๋ฆ์ ์ฌ์ฉํฉ๋๋ค. true๋ ์ฌ๋ก๊ทธ์ธ์ ์ํด ์ ์ฅํ๊ณ , SetARStatus(true)๋ ์๋ ์ฌ์ฐ๊ฒฐ ์ ์ฑ ์ ํ์ฑํํฉ๋๋ค. ์ฆ๊ฐ์ ์ธ ์ฌ์ ์์ ์์ต๋๋ค.
if (!(Truth(UO.Connected())))
{
return null;
}
UO.SetARExtParams("", "", true);
UO.SetARStatus(true);
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ๋ฒ์งธ ์์์๋ ์ด ์ด๋ฆ์ด ์ค์ GetCharsListForShard์ธ ๊ฒฝ์ฐ์๋ง ์์ ๋ฌธ์๋ฅผ ์ ํํฉ๋๋ค. ๋ฐฐ์ด์ 0๋ก ์ธ๋ฑ์ฑ๋ฉ๋๋ค. ToLowerInvariant๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๊ณ ์ด๋ฆ์ ๋น๊ตํฉ๋๋ค. false๋ ํ ๋ฒ์ ์ฑ๊ณต์ ์ธ ์ ๋ ฅ์ ์๋ฏธํ๋ฉฐ, ๊ตฌ์ฑ ํ ์๋ ์ฌ์ฐ๊ฒฐ์ด ํ์ฑํ๋๊ณ Disconnect๊ฐ ํธ์ถ๋ฉ๋๋ค. ์ด๋ฆ์ ๊ทํ์ ์ด๋ฆ์ผ๋ก ๋ฐ๊พธ์ญ์์ค. ์ด๋ฆ์ด ์์ผ๋ฉด ์ฐ๊ฒฐ์ด ์ ์ง๋ฉ๋๋ค. ์๋ ์ผ์์ค์ง๋ ์ฐ๊ฒฐ์ด ๋ณต์๋ ๋๊น์ง ๋ณต๊ท๋ฅผ ์ง์ฐ์ํฌ ์ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (!(Truth(UO.Connected())))
{
return null;
}
var wanted = "Example Character";
var names = UO.GetCharsListForShard();
var i = 0;
while (Truth(i < ArrayLength(names)))
{
if (Truth(Convert.ToString(names[i]) == Convert.ToString(wanted)))
{
UO.SetARExtParams("", names[i], false);
UO.SetARStatus(true);
UO.Disconnect();
return null;
}
i += 1;
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ ๋ฒ์งธ ์๋ ์คํ ์ค์ธ ์คํ๋ผ์ธ ์คํฌ๋ฆฝํธ์์ ์์๋ฉ๋๋ค. ์์ ์ค๋์ ์์ ์บ๋ฆญํฐ๊ฐ ๋ช ์์ ์ผ๋ก ์ง์ ๋ฉ๋๋ค. ์ค์ ์ด๋ฆ์ผ๋ก ๋ฐ๊พธ์ญ์์ค. true๋ ์ ํ ์ฌํญ์ ์ ์ฅํ๊ณ , SetARStatus์ false๋ ์๋ ๋ฐ๋ณต์ ๋นํ์ฑํํ๊ณ , Connect๋ ํ๋์ ์ ๋ ฅ์ ์์ฒญํฉ๋๋ค. ์ ์ฅ๋ ๊ณ์ ์ธ๋ถ์ ๋ณด๊ฐ ํ์ํฉ๋๋ค. Connect๋ ์ธ์์ด ์ค๋น๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ์๋์ผ๋ก ์ผ์ ์ค์ง๋ ์คํฌ๋ฆฝํธ๋ ๋ค์ ์์ํ์ง ์์ผ๋ฉด ์ด ์ค์ ๋๋ฌํ์ง ์์ต๋๋ค.
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.Connected()))
{
return null;
}
UO.SetARExtParams("Example Shard", "Example Character", true);
UO.SetARStatus(false);
UO.Connect();
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetName:bridge.GetName(bridge.Self). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(2). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetReconnectSelection:bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ShardName:bridge.ShardName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "setarextparams":
{
string requestedShard = arguments.Length > 0 ? Text(0) : string.Empty;
string requestedCharacter = arguments.Length > 1 ? Text(1) : string.Empty;
state.AutoReconnectShard = string.IsNullOrWhiteSpace(requestedShard)
? bridge.ShardName
: requestedShard;
state.AutoReconnectCharacter = string.IsNullOrWhiteSpace(requestedCharacter)
? bridge.GetName(bridge.Self) ?? string.Empty
: requestedCharacter;
int useAtEveryConnect = arguments.Length > 2 ? Arg(2) : 0;
bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect);
return InjectionValue.Unit;
}๋งค๊ฐ๋ณ์: shardName (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetName:bridge.GetName(bridge.Self). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(2). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetReconnectSelection:bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ShardName:bridge.ShardName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "setarextparams":
{
string requestedShard = arguments.Length > 0 ? Text(0) : string.Empty;
string requestedCharacter = arguments.Length > 1 ? Text(1) : string.Empty;
state.AutoReconnectShard = string.IsNullOrWhiteSpace(requestedShard)
? bridge.ShardName
: requestedShard;
state.AutoReconnectCharacter = string.IsNullOrWhiteSpace(requestedCharacter)
? bridge.GetName(bridge.Self) ?? string.Empty
: requestedCharacter;
int useAtEveryConnect = arguments.Length > 2 ? Arg(2) : 0;
bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect);
return InjectionValue.Unit;
}๋งค๊ฐ๋ณ์: shardName (Any), charName (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetName:bridge.GetName(bridge.Self). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(2). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetReconnectSelection:bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ShardName:bridge.ShardName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "setarextparams":
{
string requestedShard = arguments.Length > 0 ? Text(0) : string.Empty;
string requestedCharacter = arguments.Length > 1 ? Text(1) : string.Empty;
state.AutoReconnectShard = string.IsNullOrWhiteSpace(requestedShard)
? bridge.ShardName
: requestedShard;
state.AutoReconnectCharacter = string.IsNullOrWhiteSpace(requestedCharacter)
? bridge.GetName(bridge.Self) ?? string.Empty
: requestedCharacter;
int useAtEveryConnect = arguments.Length > 2 ? Arg(2) : 0;
bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect);
return InjectionValue.Unit;
}๋งค๊ฐ๋ณ์: shardName (Any), charName (Any), useAtEveryConnect (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetName:bridge.GetName(bridge.Self). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(2). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetReconnectSelection:bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ShardName:bridge.ShardName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "setarextparams":
{
string requestedShard = arguments.Length > 0 ? Text(0) : string.Empty;
string requestedCharacter = arguments.Length > 1 ? Text(1) : string.Empty;
state.AutoReconnectShard = string.IsNullOrWhiteSpace(requestedShard)
? bridge.ShardName
: requestedShard;
state.AutoReconnectCharacter = string.IsNullOrWhiteSpace(requestedCharacter)
? bridge.GetName(bridge.Self) ?? string.Empty
: requestedCharacter;
int useAtEveryConnect = arguments.Length > 2 ? Arg(2) : 0;
bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect);
return InjectionValue.Unit;
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.SetARStatus(object? value);์๋ ์ฌ์ฐ๊ฒฐ์ ํ์ฑํํ๊ฑฐ๋ ๋นํ์ฑํํฉ๋๋ค.
-
value- 0๊ฐ ๊บผ์ง๋๋ค. 0์ด ์๋ ๋ชจ๋ ์ ์๊ฐ ํฌํจ๋ฉ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- Bridge.SetAutoReconnect๋ ์๋ ์ฌ์ฐ๊ฒฐ ์ค์ ์ ๋ณ๊ฒฝํฉ๋๋ค. ๊ฐ์ ํ์ฑํ๋ ๊ฒ์ผ๋ก ํด์๋ฉ๋๋ค != 0; ์๋ฒ์ ์ฆ์ ๋ก๊ทธ์ธ/๋ก๊ทธ์์๋์ง ์์ต๋๋ค.
- ํด๋ผ์ด์ธํธ ์ค์ ์ ๋ณ๊ฒฝํฉ๋๋ค. ์ด ๊ฐ์ ์ฐ๊ฒฐ ํ ์คํธ์ ๊ฒฐ๊ณผ๊ฐ ์๋๋ฉฐ ์๋ฒ์ ์ฒ๋ฆฌ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SetARStatus");
UO.SetARStatus(1);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๋ ์ฌ์ฐ๊ฒฐ์ ํ์ฑํํ๊ฑฐ๋ ๋นํ์ฑํํฉ๋๋ค.
UO.SetARStatus(1);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Bridge.SetAutoReconnect๋ ์๋ ์ฌ์ฐ๊ฒฐ ์ค์ ์ ๋ณ๊ฒฝํฉ๋๋ค. ๊ฐ์ ํ์ฑํ๋ ๊ฒ์ผ๋ก ํด์๋ฉ๋๋ค != 0; ์๋ฒ์ ์ฆ์ ๋ก๊ทธ์ธ/๋ก๊ทธ์์๋์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.SetARStatus(0);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํด๋ผ์ด์ธํธ ์ค์ ์ ๋ณ๊ฒฝํฉ๋๋ค. ์ด ๊ฐ์ ์ฐ๊ฒฐ ํ ์คํธ์ ๊ฒฐ๊ณผ๊ฐ ์๋๋ฉฐ ์๋ฒ์ ์ฒ๋ฆฌ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
ApplyMode(1);
return null;
}
void ApplyMode(dynamic mode)
{
UO.SetARStatus(mode);
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetAutoReconnect:bridge.SetAutoReconnect(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "setarstatus": bridge.SetAutoReconnect(Arg(0)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.SetArm(object? name);๋ช ๋ช ๋ ์ธํธ์ ํ์ฌ ๋ฌด๊ธฐ์ ๋ฐฉํจ๋ฅผ ๊ธฐ์ตํฉ๋๋ค.
-
nameโ "travel" ๋๋ "battle"๊ณผ ๊ฐ์ ์ธํธ์ ๋ฌธ์์ด ์ด๋ฆ์ ๋๋ค. ์ด๋ฆ์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์๋ฅ์ ๋ฌด๊ธฐ ์ธํธ๋ ๋ณ๋๋ก ์ ์ฅ๋ฉ๋๋ค. ๋ ๋ค์ ๋์ผํ ์ด๋ฆ์ด ํ์ฉ๋ฉ๋๋ค. ์ด๊ฒ์ ID ์ฌ๋ฌผ์ด๋ ํ์ผ ์ด๋ฆ์ด ์๋๋๋ค. SetDress๋ง ์ด๋ฆ์ด ์๋ ๊ฒ์ ํ์ฉํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ DressSavedSet/EquipDressSet์ ๋ํด ๋ณ๋์ ์ธํธ๊ฐ ๊ธฐ๋ก๋ฉ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ๊ฒฐ๊ณผ๋ฅผ ํ ๋นํ๊ฑฐ๋ true์ ๋น๊ตํ์ง ๋ง์ธ์. ์ ์ฅํ๊ณ ์ญ์ ํ๋ฉด ์ฅ๋น๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ด ์๋๋ผ ํญ๋ชฉ์ด ๋ณ๊ฒฝ๋ฉ๋๋ค.
- ์๋ฅ: ๋ ์ด์ด๋ 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. ๋ฌด๊ธฐ: 1 ๋ฐ 2๋ง ํด๋น. ๋จธ๋ฆฌ์นด๋ฝ, ์์ผ, ๋ฐฐ๋ญ, ๋๋ฌผ, ์ํ์ ์ด ์ธํธ์ ํฌํจ๋์ง ์์ต๋๋ค.
- ์ด๋ฏธ ๋ก๋๋ ํน์ serial ํญ๋ชฉ์ ์์ฒด ๋ ์ด์ด์ ๊ธฐ๋ก๋ฉ๋๋ค. ๋์ผํ ์ด๋ฆ์ ๋ค์ ์ ์ฅํ๋ฉด ํญ๋ชฉ์ด ๋์ฒด๋ฉ๋๋ค. ๋น ๋ ์ด์ด๋ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋ณต์๋๋ฉด ํด๋น ์ ์ ๋ ์ด์ด๊ฐ ์์ฒด ๋ฐฑํฉ์ผ๋ก ํด์ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ ์ฅ๋ ์์ ํ ๋น์ด ์๋ ์ธํธ๋ ํด๋น ๋ ์ด์ด์์ ํญ๋ชฉ์ ์ ๊ฑฐํฉ๋๋ค.
- ์ธํธ๋ ๋ฐํ์ ์ํ๋ก ์ ์ฅ๋ฉ๋๋ค. ํธ์ถ ์์ฒด๋ ํ์ผ์ ์์ฑํ์ง ์์ผ๋ฉฐ ์ธํธ๊ฐ ๋ค๋ฅธ ํ๋กํ์ด๋ ์ ๋ฐํ์์ผ๋ก ์ ์ก๋๋ค๋ ๊ฒ์ ๋ณด์ฅํ์ง ์์ต๋๋ค. ๋จผ์ ์ํ๋ ์ธํธ๋ฅผ ์ฌ์ฉ๋ ์ํ๋ก ์ ์ฅํฉ๋๋ค. ํด๋ผ์ด์ธํธ์ ์ผ๋ฐ ์ํ๋ฅผ ๋ก๋/์ ์ฅํ๋ ๊ฒ์ ๋ณ๋์ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
- UO.SetDress ยท UO.Dress ยท UO.DressSavedSet ยท UO.SetArm ยท UO.Arm ยท UO.DressSpeed
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SetArm");
UO.SetArm("battle");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ํ ๊ฒ๋ค์ด ์ด๋ฏธ ์ฅ์ฐฉ๋์์ ๋ ์ฌ์ง์ด ์ดฌ์๋ฉ๋๋ค. ์ด ์ฑ๋ฆฐ์ง๋ ๋ฐฐ๋ญ์ ์๋ ์์ดํ ์ ์ฅ์ฐฉํ์ง ์์ต๋๋ค.
UO.SetArm("battle");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋์ผํ ์ด๋ฆ์ด ๋ค๋ฅธ ์ ์ฅ์์์ ์ฌ์ฉ๋ฉ๋๋ค. SetDress()๋ ์ด๋ฆ์ด ์ง์ ๋์ง ์์ ์ธํธ๋ ๋ณ๋๋ก ์ ์ฅํฉ๋๋ค. ์ด์ ์ ๋ น์๋ ์ด๋ฆ์ ์ ํํ๋ ๊ฒ์ด ์๋๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.SetArm("battle");
UO.SetDress("battle");
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- SaveIfReady๋ ์ปจํธ๋กค ๋ ์ด์ด๋ฅผ ํ์ธํฉ๋๋ค. 3 - ์ท์ ์ ๋ฐ, 1 - ๋ฌด๊ธฐ๋ ์ค๋ฅธ์. ๋น์ด ์์ผ๋ฉด ์ค๋ ์ท์ ๋ฎ์ด์ฐ์ง ์์ต๋๋ค. ๋ฐํ๋ 1/0๋ SetDress/SetArm๊ฐ ์๋ ๋์ฐ๋ฏธ์ ์ํฉ๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
return SaveIfReady("battle");
return null;
}
dynamic SaveIfReady(dynamic name)
{
if (Truth(UO.ObjAtLayerEx(1, UO.Self()) == 0))
{
return 0;
}
UO.SetArm(name);
return 1;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: name (String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.SetArm. -
InjectionScript.Runtime.InjectionApiUO.SetEquip:SetEquip(name, armSets, weaponLayers, "Arm set.").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void SetArm(string name)
=> SetEquip(name, armSets, weaponLayers, "Arm set.");ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.SetDress();
void UO.SetDress(object? name);์ดํ์ ๋ณต์์ ์ํด ํ์ฌ ์ฐฉ์ฉํ๊ณ ์๋ ์๋ณต๊ณผ ๊ฐ์ท์ ๊ธฐ์ตํฉ๋๋ค.
-
nameโ "travel" ๋๋ "battle"๊ณผ ๊ฐ์ ์ธํธ์ ๋ฌธ์์ด ์ด๋ฆ์ ๋๋ค. ์ด๋ฆ์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์๋ฅ์ ๋ฌด๊ธฐ ์ธํธ๋ ๋ณ๋๋ก ์ ์ฅ๋ฉ๋๋ค. ๋ ๋ค์ ๋์ผํ ์ด๋ฆ์ด ํ์ฉ๋ฉ๋๋ค. ์ด๊ฒ์ ID ์ฌ๋ฌผ์ด๋ ํ์ผ ์ด๋ฆ์ด ์๋๋๋ค. SetDress๋ง ์ด๋ฆ์ด ์๋ ๊ฒ์ ํ์ฉํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ DressSavedSet/EquipDressSet์ ๋ํด ๋ณ๋์ ์ธํธ๊ฐ ๊ธฐ๋ก๋ฉ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ๊ฒฐ๊ณผ๋ฅผ ํ ๋นํ๊ฑฐ๋ true์ ๋น๊ตํ์ง ๋ง์ธ์. ์ ์ฅํ๊ณ ์ญ์ ํ๋ฉด ์ฅ๋น๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ด ์๋๋ผ ํญ๋ชฉ์ด ๋ณ๊ฒฝ๋ฉ๋๋ค.
- ์๋ฅ: ๋ ์ด์ด๋ 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. ๋ฌด๊ธฐ: 1 ๋ฐ 2๋ง ํด๋น. ๋จธ๋ฆฌ์นด๋ฝ, ์์ผ, ๋ฐฐ๋ญ, ๋๋ฌผ, ์ํ์ ์ด ์ธํธ์ ํฌํจ๋์ง ์์ต๋๋ค.
- ์ด๋ฏธ ๋ก๋๋ ํน์ serial ํญ๋ชฉ์ ์์ฒด ๋ ์ด์ด์ ๊ธฐ๋ก๋ฉ๋๋ค. ๋์ผํ ์ด๋ฆ์ ๋ค์ ์ ์ฅํ๋ฉด ํญ๋ชฉ์ด ๋์ฒด๋ฉ๋๋ค. ๋น ๋ ์ด์ด๋ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋ณต์๋๋ฉด ํด๋น ์ ์ ๋ ์ด์ด๊ฐ ์์ฒด ๋ฐฑํฉ์ผ๋ก ํด์ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ ์ฅ๋ ์์ ํ ๋น์ด ์๋ ์ธํธ๋ ํด๋น ๋ ์ด์ด์์ ํญ๋ชฉ์ ์ ๊ฑฐํฉ๋๋ค.
- ์ธํธ๋ ๋ฐํ์ ์ํ๋ก ์ ์ฅ๋ฉ๋๋ค. ํธ์ถ ์์ฒด๋ ํ์ผ์ ์์ฑํ์ง ์์ผ๋ฉฐ ์ธํธ๊ฐ ๋ค๋ฅธ ํ๋กํ์ด๋ ์ ๋ฐํ์์ผ๋ก ์ ์ก๋๋ค๋ ๊ฒ์ ๋ณด์ฅํ์ง ์์ต๋๋ค. ๋จผ์ ์ํ๋ ์ธํธ๋ฅผ ์ฌ์ฉ๋ ์ํ๋ก ์ ์ฅํฉ๋๋ค. ํด๋ผ์ด์ธํธ์ ์ผ๋ฐ ์ํ๋ฅผ ๋ก๋/์ ์ฅํ๋ ๊ฒ์ ๋ณ๋์ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
- UO.SetDress ยท UO.Dress ยท UO.DressSavedSet ยท UO.SetArm ยท UO.Arm ยท UO.DressSpeed
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SetDress");
UO.SetDress();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ํ ๊ฒ๋ค์ด ์ด๋ฏธ ์ฅ์ฐฉ๋์์ ๋ ์ฌ์ง์ด ์ดฌ์๋ฉ๋๋ค. ์ด ์ฑ๋ฆฐ์ง๋ ๋ฐฐ๋ญ์ ์๋ ์์ดํ ์ ์ฅ์ฐฉํ์ง ์์ต๋๋ค.
UO.SetDress("travel");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋์ผํ ์ด๋ฆ์ด ๋ค๋ฅธ ์ ์ฅ์์์ ์ฌ์ฉ๋ฉ๋๋ค. SetDress()๋ ์ด๋ฆ์ด ์ง์ ๋์ง ์์ ์ธํธ๋ ๋ณ๋๋ก ์ ์ฅํฉ๋๋ค. ์ด์ ์ ๋ น์๋ ์ด๋ฆ์ ์ ํํ๋ ๊ฒ์ด ์๋๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.SetArm("battle");
UO.SetDress("battle");
UO.SetDress();
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- SaveIfReady๋ ์ปจํธ๋กค ๋ ์ด์ด๋ฅผ ํ์ธํฉ๋๋ค. 3 - ์ท์ ์ ๋ฐ, 1 - ๋ฌด๊ธฐ๋ ์ค๋ฅธ์. ๋น์ด ์์ผ๋ฉด ์ค๋ ์ท์ ๋ฎ์ด์ฐ์ง ์์ต๋๋ค. ๋ฐํ๋ 1/0๋ SetDress/SetArm๊ฐ ์๋ ๋์ฐ๋ฏธ์ ์ํฉ๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
return SaveIfReady("travel");
return null;
}
dynamic SaveIfReady(dynamic name)
{
if (Truth(UO.ObjAtLayerEx(3, UO.Self()) == 0))
{
return 0;
}
UO.SetDress(name);
return 1;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.SetDress:SetDress("__stealth_saved_set__").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "setdress": SetDress("__stealth_saved_set__"); return InjectionValue.Unit;๋งค๊ฐ๋ณ์: name (String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.SetDress. -
InjectionScript.Runtime.InjectionApiUO.SetEquip:SetEquip(name, dressSets, dressLayers, "Clothing set.").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void SetDress(string name)
=> SetEquip(name, dressSets, dressLayers, "Clothing set.");ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.SetDressSpeed(object? delayms);์ท ๊ฐ์์ ๊ธฐ ์์ฒญ ์ฌ์ด์ ์ผ์ ์ค์ง๋ฅผ ์ค์ ํฉ๋๋ค.
-
delayms- int, ๋ฐ๋ฆฌ์ด. ๊ฐ์ 10..10000 ํฌํจ์ผ๋ก ์ ํ๋ฉ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- SetDressSpeed๋ ์ํ๋ฅผ ์ ์ฅํฉ๋๋ค.DressSpeed = max(10, min(10000, Delayms)). ์ ์ฅ๋ ์ธํธ ์์ ์ ์ด๋ฅผ ํ์ฉํฉ๋๋ค. ์๋ฒ์์ ํ์ฉํ๋ ์์ ์๋๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
- 10๋ณด๋ค ์์ ๊ฐ์ 10๊ฐ ๋๊ณ , 10000๋ณด๋ค ํฐ ๊ฐ์ 10000๊ฐ ๋ฉ๋๋ค. ํ์์๋ ๋ฌผ๊ฑด์ ์ฐฉ์ฉํ๊ฑฐ๋ ๋ฒ์ง ์์ต๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SetDressSpeed");
UO.SetDressSpeed(250);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ท ๊ฐ์์ ๊ธฐ ์์ฒญ ์ฌ์ด์ ์ผ์ ์ค์ง๋ฅผ ์ค์ ํฉ๋๋ค.
UO.SetDressSpeed(250);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- SetDressSpeed๋ ์ํ๋ฅผ ์ ์ฅํฉ๋๋ค.DressSpeed = max(10, min(10000, Delayms)). ์ ์ฅ๋ ์ธํธ ์์ ์ ์ด๋ฅผ ํ์ฉํฉ๋๋ค. ์๋ฒ์์ ํ์ฉํ๋ ์์ ์๋๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.SetDressSpeed(0);
UO.Print(UO.DressSpeed());
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 10๋ณด๋ค ์์ ๊ฐ์ 10๊ฐ ๋๊ณ , 10000๋ณด๋ค ํฐ ๊ฐ์ 10000๊ฐ ๋ฉ๋๋ค. ํ์์๋ ๋ฌผ๊ฑด์ ์ฐฉ์ฉํ๊ฑฐ๋ ๋ฒ์ง ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.SetDressSpeed(20000);
UO.Print(UO.DressSpeed());
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: delayms (Integer)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void SetDressSpeed(int delayms) => state.DressSpeed = Math.Max(10, Math.Min(10_000, delayms));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.SetStatLockState(object? statNum, object? statState);ํน์ฑ ๋ชจ๋๋ก์ ๋ณ๊ฒฝ์ ์์ฒญํฉ๋๋ค.
-
statNum- ํ์ ํน์ฑ๋ฒํธ: 0 - ๋ณํ.ToString, 1 - DEX, 2 - INT. ์ด๋ ํ์ฌ ๊ฐ์ด ์๋๋ฉฐ ๋ฌธ์์ด ์ด๋ฆ๋ ์๋๋๋ค. -
statStateโ ํ์ ๋ชจ๋: 0 โ ์ฆ๊ฐ, 1 โ ๊ฐ์, 2 โ ์ฐจ๋จ. ์ด๋ bool์ด ์๋ ์ธ ๊ฐ์ง ์ฝ๋์ ๋๋ค. true/false ๋ชจ๋ ๋ชจ๋์ ์ด๋ฆ์ ๋ฐ๊พธ์ง ๋ง์ธ์.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค. ๊ฒฐ๊ณผ๋ ์ฑ๊ณต/์คํจ๋ก ์ฌ์ฉ๋๊ฑฐ๋ true์ ๋น๊ตํ ์ ์์ต๋๋ค. ํ์ ์ฝ๊ธฐ์์๋ ์๋ฒ์ ํ์ธ์ด ์๋ ๋ก์ปฌ ๋ชจ๋ธ์ ๋ณด์ฌ์ค๋๋ค.
- ์ ํจํ ์์ฒญ์ GameActions๋ฅผ ํตํด ํ๋์ ํจํท์ ์ ์กํ๊ณ ์ฆ์ ๋ก์ปฌ ๋ชจ๋๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค. ์๋ฒ๋ ์์ฒด ์ ํ ์ฌํญ์ ์ ์ฉํ ์ ์์ต๋๋ค. ์คํฌ์ด๋ ์คํ ์ ์ฆ๊ฐ๋ ๋ณด์ฅ๋์ง ์์ต๋๋ค. ์ ์ ์๋ ์คํฌ, ์๋ชป๋ ์ธ๋ฑ์ค/๋ชจ๋ ๋ฐ ๋๋ฝ๋ ๋ฌธ์๋ ํจํค์ง ์์ด ๋ฌด์๋ฉ๋๋ค.
- ํ์ ํน์ฑ ๋ฒํธ: 0 - ๋ณํ.ToString, 1 - DEX, 2 - INT. ์ด๋ ํ์ฌ ๊ฐ์ด ์๋๋ฉฐ ๋ฌธ์์ด ์ด๋ฆ๋ ์๋๋๋ค.
- ExecuteClientApiCompatibility๋ ๋ช ๋ น ๋ถ๊ธฐ๋ฅผ ์ ํํฉ๋๋ค. Text๋ ์คํฌ ์ ํ๊ธฐ๋ฅผ ์ฝ๊ณ , Arg๋ ์ซ์์ ๋ชจ๋๋ฅผ ์ฝ์ต๋๋ค. ๋ณํํ ์ ์๋ ์ธ์๋ ๋ณํ ์ค๋ฅ๋ก ์ธํด ํธ์ถ์ด ์คํจํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SetStatLockState");
UO.SetStatLockState(0, 2);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ์์์๋ ์ ํ๊ธฐ์ ๋ น์ ์ ๋ชจ๋๊ฐ ๋ช ์์ ์ผ๋ก ์ง์ ๋ฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ค์์๋ ์ด๋ฆ์ผ๋ก ์คํฌ์ ์ ํํ๊ฑฐ๋ ์ซ์๋ก ํน์ฑ์ ์ ํํฉ๋๋ค. Print ๊ฒฐ๊ณผ๋ง ํ์๋ฉ๋๋ค.
var selector = 0;
var mode = 2;
UO.SetStatLockState(selector, mode);
UO.Print(Convert.ToString(UO.GetStatLockState(selector)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๊ณ๊ฐ 95.1 ๋ฐ ๋ชจ๋ 0/1/2๊ฐ ์๋ก ์ ๊ณต๋ฉ๋๋ค. โ1๋ ๋ชจ๋ ๋ณ๊ฒฝ ์ ํ์ธ๋ฉ๋๋ค. ์ด ํ์๋ ๋ก์ปฌ ๋ณต์ฌ๋ณธ๋ง ์ฝํ์ง๋๋ค. ์๋ฒ๊ฐ ์๋ตํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var selector = 0;
var before = UO.GetStatLockState(selector);
if (Truth(before >= 0) && Truth(before <= 2))
{
UO.SetStatLockState(selector, 0);
UO.Print(Convert.ToString(UO.GetStatLockState(selector)));
}
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 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()
{
ApplyMode(0, 2);
return null;
}
void ApplyMode(dynamic selector, dynamic mode)
{
if (Truth(mode < 0) || Truth(mode > 2))
{
return;
}
if (Truth(UO.GetStatLockState(selector) < 0))
{
return;
}
UO.SetStatLockState(selector, mode);
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: statNum (Any), statState (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetStatLockState:bridge.SetStatLockState(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "setstatlockstate":
case "setstatstate": bridge.SetStatLockState(Arg(0), Arg(1)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.SetStatState(object? statNum, object? statState);ํน์ฑ ๋ชจ๋๋ก์ ๋ณ๊ฒฝ์ ์์ฒญํฉ๋๋ค.
-
statNum- ํ์ ํน์ฑ๋ฒํธ: 0 - ๋ณํ.ToString, 1 - DEX, 2 - INT. ์ด๋ ํ์ฌ ๊ฐ์ด ์๋๋ฉฐ ๋ฌธ์์ด ์ด๋ฆ๋ ์๋๋๋ค. -
statStateโ ํ์ ๋ชจ๋: 0 โ ์ฆ๊ฐ, 1 โ ๊ฐ์, 2 โ ์ฐจ๋จ. ์ด๋ bool์ด ์๋ ์ธ ๊ฐ์ง ์ฝ๋์ ๋๋ค. true/false ๋ชจ๋ ๋ชจ๋์ ์ด๋ฆ์ ๋ฐ๊พธ์ง ๋ง์ธ์.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค. ๊ฒฐ๊ณผ๋ ์ฑ๊ณต/์คํจ๋ก ์ฌ์ฉ๋๊ฑฐ๋ true์ ๋น๊ตํ ์ ์์ต๋๋ค. ํ์ ์ฝ๊ธฐ์์๋ ์๋ฒ์ ํ์ธ์ด ์๋ ๋ก์ปฌ ๋ชจ๋ธ์ ๋ณด์ฌ์ค๋๋ค.
- ์ ํจํ ์์ฒญ์ GameActions๋ฅผ ํตํด ํ๋์ ํจํท์ ์ ์กํ๊ณ ์ฆ์ ๋ก์ปฌ ๋ชจ๋๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค. ์๋ฒ๋ ์์ฒด ์ ํ ์ฌํญ์ ์ ์ฉํ ์ ์์ต๋๋ค. ์คํฌ์ด๋ ์คํ ์ ์ฆ๊ฐ๋ ๋ณด์ฅ๋์ง ์์ต๋๋ค. ์ ์ ์๋ ์คํฌ, ์๋ชป๋ ์ธ๋ฑ์ค/๋ชจ๋ ๋ฐ ๋๋ฝ๋ ๋ฌธ์๋ ํจํค์ง ์์ด ๋ฌด์๋ฉ๋๋ค.
- ํ์ ํน์ฑ ๋ฒํธ: 0 - ๋ณํ.ToString, 1 - DEX, 2 - INT. ์ด๋ ํ์ฌ ๊ฐ์ด ์๋๋ฉฐ ๋ฌธ์์ด ์ด๋ฆ๋ ์๋๋๋ค.
- ExecuteClientApiCompatibility๋ ๋ช ๋ น ๋ถ๊ธฐ๋ฅผ ์ ํํฉ๋๋ค. Text๋ ์คํฌ ์ ํ๊ธฐ๋ฅผ ์ฝ๊ณ , Arg๋ ์ซ์์ ๋ชจ๋๋ฅผ ์ฝ์ต๋๋ค. ๋ณํํ ์ ์๋ ์ธ์๋ ๋ณํ ์ค๋ฅ๋ก ์ธํด ํธ์ถ์ด ์คํจํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SetStatState");
UO.SetStatState(0, 2);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ์์์๋ ์ ํ๊ธฐ์ ๋ น์ ์ ๋ชจ๋๊ฐ ๋ช ์์ ์ผ๋ก ์ง์ ๋ฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ค์์๋ ์ด๋ฆ์ผ๋ก ์คํฌ์ ์ ํํ๊ฑฐ๋ ์ซ์๋ก ํน์ฑ์ ์ ํํฉ๋๋ค. Print ๊ฒฐ๊ณผ๋ง ํ์๋ฉ๋๋ค.
var selector = 0;
var mode = 2;
UO.SetStatState(selector, mode);
UO.Print(Convert.ToString(UO.GetStatLockState(selector)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๊ณ๊ฐ 95.1 ๋ฐ ๋ชจ๋ 0/1/2๊ฐ ์๋ก ์ ๊ณต๋ฉ๋๋ค. โ1๋ ๋ชจ๋ ๋ณ๊ฒฝ ์ ํ์ธ๋ฉ๋๋ค. ์ด ํ์๋ ๋ก์ปฌ ๋ณต์ฌ๋ณธ๋ง ์ฝํ์ง๋๋ค. ์๋ฒ๊ฐ ์๋ตํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var selector = 0;
var before = UO.GetStatLockState(selector);
if (Truth(before >= 0) && Truth(before <= 2))
{
UO.SetStatState(selector, 0);
UO.Print(Convert.ToString(UO.GetStatLockState(selector)));
}
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 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()
{
ApplyMode(0, 2);
return null;
}
void ApplyMode(dynamic selector, dynamic mode)
{
if (Truth(mode < 0) || Truth(mode > 2))
{
return;
}
if (Truth(UO.GetStatLockState(selector) < 0))
{
return;
}
UO.SetStatState(selector, mode);
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: statNum (Any), statState (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetStatLockState:bridge.SetStatLockState(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "setstatlockstate":
case "setstatstate": bridge.SetStatLockState(Arg(0), Arg(1)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.Sex();ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์์ ์ฑ๋ณ ๋ฐ ์ธ์ข ์ฝ๋๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int - ํธํ ์ฝ๋: 0=์ธ๊ฐ ๋จ์ฑ, 1=์ธ๊ฐ ์ฌ์ฑ, 2=์ํ ๋จ์ฑ, 3=์ํ ์ฌ์ฑ, 4=๊ฐ๊ณ ์ผ ๋จ์ฑ, 5=๊ฐ๊ณ ์ผ ์ฌ์ฑ. ๋ฌธ์๊ฐ ์๋ ๊ฒฝ์ฐ์๋ 0์ด๋ฏ๋ก Exists(self)์์ ์ฌ์ฉ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ์ธํ์ธ์. ์ด๊ฒ์ ๋จ์ํ bool ์์ปท์ด ์๋๋๋ค.
- ์ด๋ฏธ ์์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์์ฒญ์ ๊ณต๊ฐ ์ํ๊ฐ ์๋๋ฉฐ ์๋ฒ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๋ด๋๋ก ๊ฐ์ ํ์ง ์์ต๋๋ค. ์ฌ๋ง, ๋งต ์ ํ ๋๋ ๊ฐ์ฒด ์ญ์ ํ ๋ ํธ์ถ ์ฌ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.Sex();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ์ฑ๋ณ๊ณผ ์ธ์ข ์ฝ๋๋ ๊ฐ์ ์ ์ฅ๋ฉ๋๋ค.
- Convert.ToString๋ ์ถ๋ ฅํ ์ซ์๋ฅผ ๋ณํํ๋ฉฐ ๊ฒฐ๊ณผ์ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
var value = UO.Sex();
UO.Print("Sex: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์ ์์ด ๊ฐ์ ํ ๋ฒ ์ฝ์ต๋๋ค. ์ฑ๋ณ ๋ฐ ์ธ์ข ์ฝ๋๋ ํ์๋ ๊ณ์ฐ ๋๋ ์กฐ๊ฑด์ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ซ์ ์๊ณ๊ฐ์ ์คํฌ๋ฆฝํธ ์กฐ๊ฑด์ ์์ด๋ฉฐ ์๋ก์ด ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋๋๋ค. ํ๋์๋ ์์ ์ค๋ช ๋ ์๋ฒ ๋จ์ ๋ฐ ์ ํ ์ฌํญ์ด ์ ์ฅ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.Sex();
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.Sex();
await Delay(1000);
var after = UO.Sex();
if (Truth(before != after))
{
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Sex:bridge.Sex.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "sex": return new InjectionValue(bridge.Sex);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.Stam();๋ก์ปฌ ๋ชจ๋ธ์์ ํ์ฌ ์ฒด๋ ฅ์ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
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๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.Stam();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ก ํ์๋ฉ๋๋ค. ๊ฐ์ ํ๋์ ์ซ์๋ฅผ ์ ์ฅํ๊ณ ๋ณํํฉ๋๋ค.ToString๋ ๋ฉ์์ง์ฉ์ผ๋ก๋ง ๋ณํํฉ๋๋ค.
var value = UO.Stam();
UO.Print("Stam: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ํ๋์ ์ ์ฉ๋ ์๊ณ๊ฐ ๋๋ ๊ณ์ฐ์ด ํ์๋ฉ๋๋ค. ์กฐ๊ฑด์ ์ซ์๋ ์๋ฒ ์ ํ์ด ์๋ ์์ ์ค์ ์ ๋๋ค. ์ต๋๊ฐ์ผ๋ก ๋๋๊ธฐ ์ ์ ์์ฑ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.Stam();
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.Stam();
}
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.Stamina:bridge.Stamina.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "stam": return new InjectionValue(bridge.Stamina);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Stamina();๋ก์ปฌ ๋ชจ๋ธ์์ ํ์ฌ ์ฒด๋ ฅ์ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
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.Stamina();
UO.Print("Stamina: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ก ํ์๋ฉ๋๋ค. ๊ฐ์ ํ๋์ ์ซ์๋ฅผ ์ ์ฅํ๊ณ ๋ณํํฉ๋๋ค.ToString๋ ๋ฉ์์ง์ฉ์ผ๋ก๋ง ๋ณํํฉ๋๋ค.
var value = UO.Stamina();
UO.Print("Stamina: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ํ๋์ ์ ์ฉ๋ ์๊ณ๊ฐ ๋๋ ๊ณ์ฐ์ด ํ์๋ฉ๋๋ค. ์กฐ๊ฑด์ ์ซ์๋ ์๋ฒ ์ ํ์ด ์๋ ์์ ์ค์ ์ ๋๋ค. ์ต๋๊ฐ์ผ๋ก ๋๋๊ธฐ ์ ์ ์์ฑ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.Stamina();
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.Stamina();
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [Stamina]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Stamina:bridge.Stamina.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.StaminaAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Str();์บ๋ฆญํฐ์ ํ์ฌ ํ(Strength)์ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
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.Str(),UO.Strength(),UO.GetStr()๋๋UO.GetStrength(). C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Str();
UO.Print("Str: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- value๋ ์ซ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ณํํฉ๋๋ค.ToString ์ก์ง์ฉ์ผ๋ก ํฌ๋งทํฉ๋๋ค. ๋ ผ์์ด๋ ์บ๋ฆญํฐ ํ๋์ด ์์ต๋๋ค.
var value = UO.Str();
UO.Print("Strength: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ณ๋์ 1000 ms ์ ํ; UO.Wait ์์์ ์ถ๊ฐ๋์์ต๋๋ค. Change=after-before๋ ์์, 0 ๋๋ ์์์ผ ์ ์์ต๋๋ค. ๊ทธ ์์ฒด๋ก๋ ๋ชจ๋ ์ค๊ฐ ์ ๋ฐ์ดํธ์ ์๋ ์ข ๋ฃ๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.Str();
await Delay(1000);
var after = UO.Str();
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.Str();
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.Strength:bridge.Strength.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "str": return new InjectionValue(bridge.Strength);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Strength();์บ๋ฆญํฐ์ ํ์ฌ ํ์(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.Strength();
UO.Print("Strength: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- value๋ ์ซ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ณํํฉ๋๋ค.ToString ์ก์ง์ฉ์ผ๋ก ํฌ๋งทํฉ๋๋ค. ๋ ผ์์ด๋ ์บ๋ฆญํฐ ํ๋์ด ์์ต๋๋ค.
var value = UO.Strength();
UO.Print("Strength: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ณ๋์ 1000 ms ์ ํ; UO.Wait ์์์ ์ถ๊ฐ๋์์ต๋๋ค. Change=after-before๋ ์์, 0 ๋๋ ์์์ผ ์ ์์ต๋๋ค. ๊ทธ ์์ฒด๋ก๋ ๋ชจ๋ ์ค๊ฐ ์ ๋ฐ์ดํธ์ ์๋ ์ข ๋ฃ๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.Strength();
await Delay(1000);
var after = UO.Strength();
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.Strength();
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 [Strength]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Strength:bridge.Strength.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.StrengthAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.TicksDead();์ฒ์์ผ๋ก ์ธ์ง๋ ์ฃฝ์์ ์ฝ๊ฑฐ๋ ํ์ํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ UO.Timer ๋ฐํ์ ์์ ํ 10๋ถ์ 1์ด, ์ฒ์์๋ 0์ ๋๋ค. ์ฌ๋ง์ ์๋ ์ฌ๋ง ๊ธฐ๊ฐ์ด ์๋๋๋ค.
- ํธ์ถํ ๋๋ง๋ค bridge.Dead()!=0 ๋ฐ ticksDead==0์ด๋ฉด Timer()๊ฐ ์ ์ฅ๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ด์ ticksDead์ ๋ฐํํฉ๋๋ค. ๋ถํ ํ์๋ ์ด ๋ฐฉ๋ฒ์ผ๋ก ํ๋๊ฐ ์ฌ์ค์ ๋์ง ์์ต๋๋ค.
- ์ด๋ ์๋ฒ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์ ํํ ์๊ฐ์ด ์๋๋ผ ์ฌ๋ง์ด ๊ด์ธก๋ ์์ ์ ์ฒซ ๋ฒ์งธ ํธ์ถ TicksDead ํ์์ ๋๋ค. ์ฒ์ 10๋ถ์ 1์ด ์์ 0 ๊ฐ์ ์ฌ์ค์ ํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.TicksDead();
UO.Print("TicksDead: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒ์์ผ๋ก ์ธ์ง๋ ์ฃฝ์์ ์ฝ๊ฑฐ๋ ํ์ํฉ๋๋ค.
UO.Print(UO.TicksDead());๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํธ์ถํ ๋๋ง๋ค bridge.Dead()!=0 ๋ฐ ticksDead==0์ด๋ฉด Timer()๊ฐ ์ ์ฅ๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ด์ ticksDead์ ๋ฐํํฉ๋๋ค. ๋ถํ ํ์๋ ์ด ๋ฐฉ๋ฒ์ผ๋ก ํ๋๊ฐ ์ฌ์ค์ ๋์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.IsDead()))
{
var stamp = UO.TicksDead();
UO.Print(UO.Timer() - stamp);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด๋ ์๋ฒ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์ ํํ ์๊ฐ์ด ์๋๋ผ ์ฌ๋ง์ด ๊ด์ธก๋ ์์ ์ ์ฒซ ๋ฒ์งธ ํธ์ถ TicksDead ํ์์ ๋๋ค. ์ฒ์ 10๋ถ์ 1์ด ์์ 0 ๊ฐ์ ์ฌ์ค์ ํ ์ ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var before = UO.TicksDead();
UO.Wait(500);
UO.Print(before = UO.TicksDead());
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.TicksDead. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Dead:bridge.Dead(). -
InjectionScript.Runtime.InjectionApiUO.Timer:Timer().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int TicksDead()
{
if (bridge.Dead() != 0 && ticksDead == 0)
ticksDead = Timer();
return ticksDead;
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ToggleFly();์์ ์ ๊ฐ๊ณ ์ผ ๋นํ์ ์ง์์์ ๋นํ์ผ๋ก, ๋นํ์์ ์ง์์ผ๋ก ์ ํํ๋๋ก ์์ฒญํฉ๋๋ค. ์ด๋ ์ก์ ์ด๋ฉฐ, UO.Flying()๋ ์ํ๋ง ํ์ธํฉ๋๋ค. ์ด ๋ช ๋ น์ ํน์ ๋ชจ๋๊ฐ ํ์ํ ๊ฒฝ๋ก ์ด์ ์ ์ ์ฉํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. true/false๋ ์๋ฒ ํ์ธ์ด ์๋๋๋ค. ์๋ฒ ์๋ต ์ฒ๋ฆฌ ํ UO.Flying()๋ฅผ ํตํด ์ค์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํฉ๋๋ค.
- ์ ์ผํ ํ์์ UO.ToggleFly()์ด๋ฉฐ ID์ด ์๊ณ ์ขํ์ ๋งค๊ฐ๋ณ์ true/false๊ฐ ์์ต๋๋ค. ๊ทํ์ ์ฑ๊ฒฉ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. ๋ค๋ฅธ mobile ํญ๊ณตํธ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
- ํ์ ๋ช ๋ น 0x0032๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ 0xBF์ ๋ณด๋ ๋๋ค. ํธ์ถ ์์ฒด๋ ์ธ์ข , ํ๋กํ ์ฝ ๋ฒ์ , ์๋ฒ ๊ถํ ๋๋ ํ์ฌ ๋ชจ๋๋ฅผ ํ์ธํ์ง ์์ต๋๋ค. ๋นํ ๊ฐ๋ฅ ์๋ฒ์์ ์์ ๋ง์ ๊ฐ๊ณ ์ผ์ ์ ํํ์ธ์.
- ์๋ฒ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฉฐ ์ํ ์ ๋ฐ์ดํธ๋ ๋์ค์ ์ ๊ณต๋ฉ๋๋ค. ๋๊ธฐ ๋ฃจํ์์ ToggleFly๋ฅผ ํธ์ถํ์ง ๋ง์ธ์. ๋ค์ ํธ์ถํ๋ฉด ์ด์ ์ค์์น๊ฐ ์ทจ์๋ ์ ์์ต๋๋ค. ํ๋์ ์์ฒญ์ ๋ณด๋ด๊ณ ์๊ฐ์ด ์ด๊ณผ๋ ๋๊น์ง Flying์ ์ฝ์ต๋๋ค.
- ๊ณ ๋ Z์ ๋นํ ํ์๋ ๋ค๋ฅธ ๋ฐ์ดํฐ์ ๋๋ค. UO.Flying()๋ int 1/true ๋๋ 0/false๋ฅผ ๋ฐํํฉ๋๋ค. false๋ ๋ฌธ์๊ฐ ์๊ฑฐ๋ ์ด์ ํ๋กํ ์ฝ์ธ ๊ฒฝ์ฐ์๋ ๊ฐ๋ฅํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.ToggleFly");
UO.ToggleFly();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋นํ ์ง์ ์๋ฒ์ ๊ฐ๊ณ ์ผ์ ๋ํ ์์ ๋๋ค. EnsureFlight(timeoutMs)๋ ๋นํ์ด ๊ด์ฐฐ๋๋ฉด 1/true๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด 0/false๋ฅผ ๋ฐํํฉ๋๋ค. 2000 โ ๋๊ธฐ ์ ํ(๋ฐ๋ฆฌ์ด); 50 ms๋ง๋ค ํ์ธํฉ๋๋ค. ์ด๋ฏธ ๋นํ ์ค์ด๋ผ๋ฉด ToggleFly๊ฐ ํธ์ถ๋์ง ์์ต๋๋ค. ์ต๋ 1๊ฐ์ ์์ฒญ์ด ์ ์ก๋๋ฉด ์๋ต ์ํ๊ฐ ํ์ธ๋ฉ๋๋ค. ์คํฌ๋ฆฝํธ ์ผ์ ์ค์ง/์ค์ผ์ค๋ฌ ์ง์ฐ์ผ๋ก ์ธํด ์ค์๊ฐ์ด ๋์ด๋ ์ ์์ต๋๋ค.
if (Truth(await EnsureFlight(2000)))
{
UO.Print("Flight confirmed; ready for the next stage");
}
else
{
UO.Print("Flight not confirmed; route was not started");
}
async Task<dynamic> EnsureFlight(dynamic timeoutMs)
{
if (!(Truth(UO.Connected())) || Truth(UO.Dead()))
{
return false;
}
if (Truth(UO.Flying()))
{
return true;
}
UO.ToggleFly();
var waited = 0;
while (Truth(waited < timeoutMs))
{
if (!(Truth(UO.Connected())))
{
return false;
}
if (Truth(UO.Flying()))
{
return true;
}
await Delay(50);
waited += 50;
}
return UO.Flying();
}
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต๋ 40์ 50 ms ๋์ ๋๊ธฐํ๋ฉฐ ์์ฒญ์ ๋จ ํ ๋ฒ์ ๋๋ค. Connected ํ์ธ์ ์ ์ง๊ฐ ์ฑ๊ณต์ ์ธ ์ฐฉ๋ฅ์ผ๋ก ๋ฐ์๋ค์ฌ์ง๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. ์คํฌ๋ฆฝํธ๋ฅผ ์ผ์ ์ค์งํ๋ฉด ์ค์ ์๊ฐ์ด ๋์ด๋ ์ ์์ต๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
if (Truth(UO.Connected()) && Truth(UO.Flying()))
{
UO.ToggleFly();
var checks = 0;
while (Truth(UO.Connected()) && Truth(UO.Flying()) && Truth(checks < 40))
{
await Delay(50);
checks += 1;
}
if (Truth(UO.Connected()) && !(Truth(UO.Flying())))
{
UO.Print("Landing state observed");
}
else
{
UO.Print("Landing not confirmed");
}
}
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ๋์ ์ ํ ์์ฒญ์ ๋ํด ํค์ Main์ ํ ๋นํฉ๋๋ค. EnsureFlight์ด ์๋๋๋ค. ๋นํ ์์ฒญ ์ค์ ๋ค์ ๋๋ฅด์ธ์. ํค ๋ฐ๋ณต ๋๋ ๋ ๊ฐ์ ๋ณ๋ ฌ ์คํฌ๋ฆฝํธ๋ ์ฌ๋ฌ ์์ฒญ์ ๋ณด๋ผ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ๋ฆฌ๋ฏธํฐ๊ฐ ์ค์น๋์ด ์์ง ์์ต๋๋ค.
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.Connected()) && !(Truth(UO.Dead())))
{
UO.ToggleFly();
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ToggleFly:bridge.ToggleFly().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "togglefly": bridge.ToggleFly(); return InjectionValue.Unit;