KO UO Topic character Part 5 - 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.Undress();๋ ์ด์ด์์ ์ท๊ณผ ๊ฐ์ท์ ์ ๊ฑฐํฉ๋๋ค 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. ์, ๋จธ๋ฆฌ์นด๋ฝ, ์์ผ, ๋ฐฐ๋ญ, ํ๊ฒ, ๋ฑ ํฌ๋ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
์ซ์ ํ๋๊ทธ int: 1 (์กฐ๊ฑด ์ถฉ์กฑ) - ๋ก์ปฌ ์์ ํ์ฉ, 0 (์กฐ๊ฑด ์ถฉ์กฑ ์ ๋จ) - ๊ฑฐ๋ถ. ์ด๋ ์๋ฒ ํ์ธ๋ ์๋๊ณ ID๋ ์๋๊ณ , ์๋๋ ์๋๋๋ค. ๋์ค์ ์๋ฒ๊ฐ ์คํจํ ์ ์์ต๋๋ค. ๋ต๋ณ ํ ์ค์ ์ฅ๋น๋ฅผ ํ์ธํ์ธ์.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก๋๋ ํญ๋ชฉ๊ณผ ์์ ๋ก์ด ์ ๋๋๊ทธ๊ฐ ํ์ํฉ๋๋ค. ์ ๊ฑฐํ ๋๋ ์ค์ ๋ฐฐ๋ญ self๊ฐ ํ์ํ๋ฉฐ ์๋น ๋ฐฐ๋ญ GrabBag์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ์ ์ ์๊ฑฐ๋ ํ์๋์๊ฑฐ๋ ๋ถ์ ํฉํ ํ๋ชฉ์ ๊ฑฐ๋ถ๋ฉ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ํญ๋ชฉ์ UnequipItems๋ฅผ ํตํด ์ ๊ฑฐํ ์ ์์ต๋๋ค. ์ธํธ๋ ์์์ฑ ํธ๋์ญ์ ์ด ์๋๋๋ค.
- EquipItems/UnequipItems๋ ์น์ธ๋ ์์ ์ดํ ๋ค์ ์์ ์ด์ ์ DressSpeed๋ฅผ ์ ์ฉํฉ๋๋ค. Disarm/Undress - ๊ฐ ์ ์ ๋ ์ด์ด ๋ค์. ์ถ๊ธ์ ์บ๋ฆฌ๊ฐ ํ์ฉ๋๋ ๊ฒฝ์ฐ DropDelay๋ฅผ ์ถ๊ฐ๋ก ์กด์คํฉ๋๋ค. ๋ค๋ฅธ ๋ฐํ์์ ๋์ผํ ์ค์ ์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ๊ฐ์์ ์๋ฒ ์ ํ์ โโ๋ฌด์ํ์ง ์์ต๋๋ค.
- ์๋ชป๋ ํธ์ถ ํ์, ์ ์ ์๋ ๋ ์ด์ด ์ด๋ฆ ๋๋ ์ซ์๋ก ๋ณํํ ์ ์๋ ๊ฐ์ผ๋ก ์ธํด 0 ๋์ ์คํฌ๋ฆฝํธ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ฅ๋น ์ค๋ ์ท์๋ ์ด๋ฏธ ๋ก๋๋ ๋ฐ์ดํฐ๋ง ํฌํจ๋ฉ๋๋ค. ์ด์์คํดํธ์์๋ ChangeAndConfirm ๋ ์ด์ด=1๊ฐ ์ค๋ฅธ์์ ๋๋ค. ๋ ๋ค๋ฅธ ์ ์ ์ค์ ๋ ์ด์ด๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค.
- ๋ฐฐ์ด์ ๊ฒฝ์ฐ 1๋ ๋์ด๋ ๋ชจ๋ ์์ ์ด ํ์ฉ๋จ์ ์๋ฏธํฉ๋๋ค. ๊ฑฐ๋ถํ๋ ๊ฒฝ์ฐ 0๊ฐ ๋ฐํ๋ฉ๋๋ค. ๋๋จธ์ง ์์๋ ๊ณ์ ์ฒ๋ฆฌ๋๋ฉฐ ๋กค๋ฐฑ์ ์์ต๋๋ค. ๋น ๋ฐฐ์ด์ ์๋ฌด๋ฐ ์์ ์์ด 1๋ฅผ ์์ฑํฉ๋๋ค. Disarm/Undress ํ์ํ ๋ ์ด์ด๊ฐ ์ด๋ฏธ ๋น์ด ์๋ ๊ฒฝ์ฐ์๋ 1๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ถ๋ถ์ ์ธ ์คํจ๋ 0๋ฅผ ์ ๊ณตํฉ๋๋ค.
- UO.EquipItems ยท UO.UnequipItems ยท UO.DressSpeed ยท UO.DropDelay ยท UO.ObjAtLayerEx
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Undress();
UO.Print("Undress: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จผ์ , ๊ฒ์์์ ์ ์ ํ ํญ๋ชฉ์ ์ ํํ์ธ์: lasttarget - ID. Equip/WearItem ์์์ 1 ๋ ์ด์ด์๋ ๋ณด์กฐ ๋ฌด๊ธฐ๊ฐ ํ์ํฉ๋๋ค. Unequip(1)๋ ์ค๋ฅธ์์ ์ ๊ฑฐํฉ๋๋ค. Disarm/Undress ์์ฒด ๊ณ ์ ๋ ์ด์ด๋ฅผ ์ฌ์ฉํ์ฌ ์๋ํฉ๋๋ค. ๊ฑฐ์ ํ์๋ ์๋ ์ฌ์์ด ๋์ง ์์ต๋๋ค.
return UO.Undress();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฅ์ฐฉ ๋ฐฉ๋ฒ์ ์์ด์ 0x0F5E๋ ๊ฒ์ ์์์ด๊ณ , 0x1B76๋ ๋ฐฉํจ์ ์์์ ๋๋ค. FindType๋ ๋ฐฐ๋ญ์ ๋ก๋๋ ํญ๋ชฉ ์ค์์ ํด๋น ํญ๋ชฉ์ ์ฐพ๊ณ , ASC๋ ๋ฐํ๋ 16์ง์-ID๋ฅผ ๋ณํํฉ๋๋ค. ์ ๊ฑฐํ๋ ค๋ฉด ํ์ฌ ๋ ์ด์ด๋ฅผ ์ฝ์ด์ผ ํฉ๋๋ค. ํ์ํ ํญ๋ชฉ์ ์ฌ์ฉํ ์ ์์ผ๋ฉด ์คํฌ๋ฆฝํธ๊ฐ ์ข ๋ฃ๋ฉ๋๋ค. ๋ฐฐ์ด์ ๋ ๊ฐ์ ID๋ฅผ ์ ์ฅํฉ๋๋ค. ๊ฐ ํญ๋ชฉ์ ์์ ํ ์ ์ก๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var first = UO.ObjAtLayerEx(5, UO.Self());
var second = UO.ObjAtLayerEx(4, UO.Self());
if (Truth(first == 0) || Truth(second == 0))
{
return 0;
}
UO.AddObject("saved_first", first);
UO.AddObject("saved_second", second);
return UO.Undress();
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ChangeAndConfirm๋ ๋ช ๋ น์ ํ ๋ฒ ์คํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ 100ms์ ์ผ์ ์ค์ง๋ฅผ ํตํด ์ต๋ 20ํ๊น์ง ์ค์ ์ํ๋ฅผ ํ์ธํฉ๋๋ค. 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()
{
return ChangeAndConfirm();
return null;
}
dynamic ChangeAndConfirm()
{
if (!(Truth(UO.Undress())))
{
return 0;
}
dynamic[] layers = new dynamic[checked((int)(16) + 1)];
layers[0] = 3;
layers[1] = 4;
layers[2] = 5;
layers[3] = 6;
layers[4] = 7;
layers[5] = 8;
layers[6] = 10;
layers[7] = 12;
layers[8] = 13;
layers[9] = 14;
layers[10] = 17;
layers[11] = 18;
layers[12] = 19;
layers[13] = 20;
layers[14] = 22;
layers[15] = 23;
layers[16] = 24;
for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
{
dynamic empty = true;
for (int i = (int)(0); i <= ArrayLength(layers) - 1; i += (int)(1))
{
if (Truth(UO.ObjAtLayerEx(layers[i], UO.Self()) != 0))
{
empty = false;
}
}
if (Truth(empty))
{
return 1;
}
UO.Wait(100);
}
return 0;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Undress. -
InjectionScript.Runtime.InjectionApiUO.Unequip:Unequip(dressLayers, "Clothing removed.").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Undress()
=> Unequip(dressLayers, "Clothing removed.");ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Unequip(object? layer);์ง์ ๋ ๋ ์ด์ด์ ํญ๋ชฉ์ ์์ ์ ๋ฐฐ๋ญ์ผ๋ก ์ ๊ฑฐํฉ๋๋ค.
-
layer- ๋ ์ด์ด ๋ฒํธ(์: 1 - ์ค๋ฅธ์ชฝ, 2 - ์ผ์ชฝ) Equip ๋ฐ Unequip๋ "Rhand"์ ๊ฐ์ ๋ ์ด์ด ์ด๋ฆ์ ํ์ฉํฉ๋๋ค. WearItem๋ ์ซ์ ๋ ์ด์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ ์ด์ด๋ ์์ดํ ์ ์จ์ด๋ฌ๋ธ ๋ ์ด์ด์ ์ผ์นํด์ผ ํฉ๋๋ค. graphic๋ ์๋๊ณ ID๋ ์๋๋๋ค.
์ซ์ ํ๋๊ทธ int: 1 (์กฐ๊ฑด ์ถฉ์กฑ) - ๋ก์ปฌ ์์ ํ์ฉ, 0 (์กฐ๊ฑด ์ถฉ์กฑ ์ ๋จ) - ๊ฑฐ๋ถ. ์ด๋ ์๋ฒ ํ์ธ๋ ์๋๊ณ ID๋ ์๋๊ณ , ์๋๋ ์๋๋๋ค. ๋์ค์ ์๋ฒ๊ฐ ์คํจํ ์ ์์ต๋๋ค. ๋ต๋ณ ํ ์ค์ ์ฅ๋น๋ฅผ ํ์ธํ์ธ์.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก๋๋ ํญ๋ชฉ๊ณผ ์์ ๋ก์ด ์ ๋๋๊ทธ๊ฐ ํ์ํฉ๋๋ค. ์ ๊ฑฐํ ๋๋ ์ค์ ๋ฐฐ๋ญ self๊ฐ ํ์ํ๋ฉฐ ์๋น ๋ฐฐ๋ญ GrabBag์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ์ ์ ์๊ฑฐ๋ ํ์๋์๊ฑฐ๋ ๋ถ์ ํฉํ ํ๋ชฉ์ ๊ฑฐ๋ถ๋ฉ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ํญ๋ชฉ์ UnequipItems๋ฅผ ํตํด ์ ๊ฑฐํ ์ ์์ต๋๋ค. ์ธํธ๋ ์์์ฑ ํธ๋์ญ์ ์ด ์๋๋๋ค.
- EquipItems/UnequipItems๋ ์น์ธ๋ ์์ ์ดํ ๋ค์ ์์ ์ด์ ์ DressSpeed๋ฅผ ์ ์ฉํฉ๋๋ค. Disarm/Undress - ๊ฐ ์ ์ ๋ ์ด์ด ๋ค์. ์ถ๊ธ์ ์บ๋ฆฌ๊ฐ ํ์ฉ๋๋ ๊ฒฝ์ฐ DropDelay๋ฅผ ์ถ๊ฐ๋ก ์กด์คํฉ๋๋ค. ๋ค๋ฅธ ๋ฐํ์์ ๋์ผํ ์ค์ ์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ๊ฐ์์ ์๋ฒ ์ ํ์ โโ๋ฌด์ํ์ง ์์ต๋๋ค.
- ์๋ชป๋ ํธ์ถ ํ์, ์ ์ ์๋ ๋ ์ด์ด ์ด๋ฆ ๋๋ ์ซ์๋ก ๋ณํํ ์ ์๋ ๊ฐ์ผ๋ก ์ธํด 0 ๋์ ์คํฌ๋ฆฝํธ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ฅ๋น ์ค๋ ์ท์๋ ์ด๋ฏธ ๋ก๋๋ ๋ฐ์ดํฐ๋ง ํฌํจ๋ฉ๋๋ค. ์ด์์คํดํธ์์๋ ChangeAndConfirm ๋ ์ด์ด=1๊ฐ ์ค๋ฅธ์์ ๋๋ค. ๋ ๋ค๋ฅธ ์ ์ ์ค์ ๋ ์ด์ด๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค.
- UO.EquipItems ยท UO.UnequipItems ยท UO.DressSpeed ยท UO.DropDelay ยท UO.ObjAtLayerEx
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Unequip(1);
UO.Print("Unequip: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จผ์ , ๊ฒ์์์ ์ ์ ํ ํญ๋ชฉ์ ์ ํํ์ธ์: lasttarget - ID. Equip/WearItem ์์์ 1 ๋ ์ด์ด์๋ ๋ณด์กฐ ๋ฌด๊ธฐ๊ฐ ํ์ํฉ๋๋ค. Unequip(1)๋ ์ค๋ฅธ์์ ์ ๊ฑฐํฉ๋๋ค. Disarm/Undress ์์ฒด ๊ณ ์ ๋ ์ด์ด๋ฅผ ์ฌ์ฉํ์ฌ ์๋ํฉ๋๋ค. ๊ฑฐ์ ํ์๋ ์๋ ์ฌ์์ด ๋์ง ์์ต๋๋ค.
return UO.Unequip(1);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฅ์ฐฉ ๋ฐฉ๋ฒ์ ์์ด์ 0x0F5E๋ ๊ฒ์ ์์์ด๊ณ , 0x1B76๋ ๋ฐฉํจ์ ์์์ ๋๋ค. FindType๋ ๋ฐฐ๋ญ์ ๋ก๋๋ ํญ๋ชฉ ์ค์์ ํด๋น ํญ๋ชฉ์ ์ฐพ๊ณ , ASC๋ ๋ฐํ๋ 16์ง์-ID๋ฅผ ๋ณํํฉ๋๋ค. ์ ๊ฑฐํ๋ ค๋ฉด ํ์ฌ ๋ ์ด์ด๋ฅผ ์ฝ์ด์ผ ํฉ๋๋ค. ํ์ํ ํญ๋ชฉ์ ์ฌ์ฉํ ์ ์์ผ๋ฉด ์คํฌ๋ฆฝํธ๊ฐ ์ข ๋ฃ๋ฉ๋๋ค. ๋ฐฐ์ด์ ๋ ๊ฐ์ ID๋ฅผ ์ ์ฅํฉ๋๋ค. ๊ฐ ํญ๋ชฉ์ ์์ ํ ์ ์ก๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var first = UO.ObjAtLayerEx(1, UO.Self());
var second = UO.ObjAtLayerEx(2, UO.Self());
if (Truth(first == 0) || Truth(second == 0))
{
return 0;
}
UO.AddObject("saved_first", first);
UO.AddObject("saved_second", second);
var firstOk = UO.Unequip(1);
var secondOk = UO.Unequip(2);
return firstOk != 0 && secondOk != 0;
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ChangeAndConfirm๋ ๋ช ๋ น์ ํ ๋ฒ ์คํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ 100ms์ ์ผ์ ์ค์ง๋ฅผ ํตํด ์ต๋ 20ํ๊น์ง ์ค์ ์ํ๋ฅผ ํ์ธํฉ๋๋ค. 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 item = UO.ObjAtLayerEx(1, UO.Self());
return ChangeAndConfirm(1, item);
return null;
}
dynamic ChangeAndConfirm(dynamic layer, dynamic item)
{
if (Truth(item == 0))
{
return 0;
}
if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) != item))
{
return 0;
}
if (!(Truth(UO.Unequip(layer))))
{
return 0;
}
for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
{
if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == 0))
{
return 1;
}
UO.Wait(100);
}
return 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: layer (Any/String)
๊ฒฐ๊ณผ: int / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.Unequip:Unequip(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Unequip:bridge.Unequip(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "unequip":
return new InjectionValue(arguments[0].Kind == InjectionValueKind.String ? Unequip(Text(0)) : bridge.Unequip(Arg(0)));๋งค๊ฐ๋ณ์: layer (Any/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Unequip. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Unequip:bridge.Unequip(ConvertLayer(layer)). -
InjectionScript.Runtime.InjectionApiUO.ConvertLayer:ConvertLayer(layer).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Unequip(string layer) => bridge.Unequip(ConvertLayer(layer));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.UnequipItems(object? items);๋์ด๋ ๊ฐ์ธ ๋ฌผํ์ ๋ฐฐ๋ญ์ ๋ฃ์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ํญ๋ชฉ ID์ ๋์ผํ ๋ ์ด์ด์ ์๋ ํญ๋ชฉ์ ์ ๊ฑฐํ์ง ์์ต๋๋ค.
-
items- ํ์ ID ๋๋ ํญ๋ชฉ ๋ฐฐ์ด ID. ๋ฐฐ์ด ์์๋ ์ซ์ ๋๋ ์ซ์ํ 16์ง์ ๋ฌธ์์ด์ ๋๋ค. ๋จ์ผ ์ธ์์๋ "lasttarget"/name AddObject๋ ํ์ฉ๋ฉ๋๋ค. ๋ฐฐ์ด์ ๊ฒฝ์ฐ ์ธ๋ฑ์ค 0 ๋ฐ 1์ ์๋ ๋ ์์์ ๋ํด ๋ณ์ ์ ์ธ ํญ๋ชฉ[1]์ ์ฌ์ฉํฉ๋๋ค. ๋ ์ด์ด ๋ฒํธ๋ type๊ฐ ์๋ ์ฌ๋ฌผ์ด ์ ์ก๋ฉ๋๋ค.
์ซ์ ํ๋๊ทธ int: 1 (์กฐ๊ฑด ์ถฉ์กฑ) - ๋ก์ปฌ ์์ ํ์ฉ, 0 (์กฐ๊ฑด ์ถฉ์กฑ ์ ๋จ) - ๊ฑฐ๋ถ. ์ด๋ ์๋ฒ ํ์ธ๋ ์๋๊ณ ID๋ ์๋๊ณ , ์๋๋ ์๋๋๋ค. ๋์ค์ ์๋ฒ๊ฐ ์คํจํ ์ ์์ต๋๋ค. ๋ต๋ณ ํ ์ค์ ์ฅ๋น๋ฅผ ํ์ธํ์ธ์.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก๋๋ ํญ๋ชฉ๊ณผ ์์ ๋ก์ด ์ ๋๋๊ทธ๊ฐ ํ์ํฉ๋๋ค. ์ ๊ฑฐํ ๋๋ ์ค์ ๋ฐฐ๋ญ self๊ฐ ํ์ํ๋ฉฐ ์๋น ๋ฐฐ๋ญ GrabBag์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ์ ์ ์๊ฑฐ๋ ํ์๋์๊ฑฐ๋ ๋ถ์ ํฉํ ํ๋ชฉ์ ๊ฑฐ๋ถ๋ฉ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ํญ๋ชฉ์ UnequipItems๋ฅผ ํตํด ์ ๊ฑฐํ ์ ์์ต๋๋ค. ์ธํธ๋ ์์์ฑ ํธ๋์ญ์ ์ด ์๋๋๋ค.
- EquipItems/UnequipItems๋ ์น์ธ๋ ์์ ์ดํ ๋ค์ ์์ ์ด์ ์ DressSpeed๋ฅผ ์ ์ฉํฉ๋๋ค. Disarm/Undress - ๊ฐ ์ ์ ๋ ์ด์ด ๋ค์. ์ถ๊ธ์ ์บ๋ฆฌ๊ฐ ํ์ฉ๋๋ ๊ฒฝ์ฐ DropDelay๋ฅผ ์ถ๊ฐ๋ก ์กด์คํฉ๋๋ค. ๋ค๋ฅธ ๋ฐํ์์ ๋์ผํ ์ค์ ์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ๊ฐ์์ ์๋ฒ ์ ํ์ โโ๋ฌด์ํ์ง ์์ต๋๋ค.
- ์๋ชป๋ ํธ์ถ ํ์, ์ ์ ์๋ ๋ ์ด์ด ์ด๋ฆ ๋๋ ์ซ์๋ก ๋ณํํ ์ ์๋ ๊ฐ์ผ๋ก ์ธํด 0 ๋์ ์คํฌ๋ฆฝํธ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ฅ๋น ์ค๋ ์ท์๋ ์ด๋ฏธ ๋ก๋๋ ๋ฐ์ดํฐ๋ง ํฌํจ๋ฉ๋๋ค. ์ด์์คํดํธ์์๋ ChangeAndConfirm ๋ ์ด์ด=1๊ฐ ์ค๋ฅธ์์ ๋๋ค. ๋ ๋ค๋ฅธ ์ ์ ์ค์ ๋ ์ด์ด๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค.
- ๋ฐฐ์ด์ ๊ฒฝ์ฐ 1๋ ๋์ด๋ ๋ชจ๋ ์์ ์ด ํ์ฉ๋จ์ ์๋ฏธํฉ๋๋ค. ๊ฑฐ๋ถํ๋ ๊ฒฝ์ฐ 0๊ฐ ๋ฐํ๋ฉ๋๋ค. ๋๋จธ์ง ์์๋ ๊ณ์ ์ฒ๋ฆฌ๋๋ฉฐ ๋กค๋ฐฑ์ ์์ต๋๋ค. ๋น ๋ฐฐ์ด์ ์๋ฌด๋ฐ ์์ ์์ด 1๋ฅผ ์์ฑํฉ๋๋ค. Disarm/Undress ํ์ํ ๋ ์ด์ด๊ฐ ์ด๋ฏธ ๋น์ด ์๋ ๊ฒฝ์ฐ์๋ 1๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ถ๋ถ์ ์ธ ์คํจ๋ 0๋ฅผ ์ ๊ณตํฉ๋๋ค.
- UO.EquipItems ยท UO.UnequipItems ยท UO.DressSpeed ยท UO.DropDelay ยท UO.ObjAtLayerEx
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.UnequipItems(UO.ObjAtLayerEx(1, "self"));
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จผ์ , ๊ฒ์์์ ์ ์ ํ ํญ๋ชฉ์ ์ ํํ์ธ์: lasttarget - ID. Equip/WearItem ์์์ 1 ๋ ์ด์ด์๋ ๋ณด์กฐ ๋ฌด๊ธฐ๊ฐ ํ์ํฉ๋๋ค. Unequip(1)๋ ์ค๋ฅธ์์ ์ ๊ฑฐํฉ๋๋ค. Disarm/Undress ์์ฒด ๊ณ ์ ๋ ์ด์ด๋ฅผ ์ฌ์ฉํ์ฌ ์๋ํฉ๋๋ค. ๊ฑฐ์ ํ์๋ ์๋ ์ฌ์์ด ๋์ง ์์ต๋๋ค.
var item = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(item == 0))
{
return 0;
}
return UO.UnequipItems(item);
int Asc(object? value, int fallback = 0) { string text = Convert.ToString(value) ?? ""; if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback; return int.TryParse(text, out int number) ? number : fallback; }
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฅ์ฐฉ ๋ฐฉ๋ฒ์ ์์ด์ 0x0F5E๋ ๊ฒ์ ์์์ด๊ณ , 0x1B76๋ ๋ฐฉํจ์ ์์์ ๋๋ค. FindType๋ ๋ฐฐ๋ญ์ ๋ก๋๋ ํญ๋ชฉ ์ค์์ ํด๋น ํญ๋ชฉ์ ์ฐพ๊ณ , ASC๋ ๋ฐํ๋ 16์ง์-ID๋ฅผ ๋ณํํฉ๋๋ค. ์ ๊ฑฐํ๋ ค๋ฉด ํ์ฌ ๋ ์ด์ด๋ฅผ ์ฝ์ด์ผ ํฉ๋๋ค. ํ์ํ ํญ๋ชฉ์ ์ฌ์ฉํ ์ ์์ผ๋ฉด ์คํฌ๋ฆฝํธ๊ฐ ์ข ๋ฃ๋ฉ๋๋ค. ๋ฐฐ์ด์ ๋ ๊ฐ์ ID๋ฅผ ์ ์ฅํฉ๋๋ค. ๊ฐ ํญ๋ชฉ์ ์์ ํ ์ ์ก๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var first = UO.ObjAtLayerEx(1, UO.Self());
var second = UO.ObjAtLayerEx(2, UO.Self());
if (Truth(first == 0) || Truth(second == 0))
{
return 0;
}
UO.AddObject("saved_first", first);
UO.AddObject("saved_second", second);
dynamic[] items = new dynamic[checked((int)(1) + 1)];
items[0] = first;
items[1] = second;
return UO.UnequipItems(items);
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ChangeAndConfirm๋ ๋ช ๋ น์ ํ ๋ฒ ์คํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ 100ms์ ์ผ์ ์ค์ง๋ฅผ ํตํด ์ต๋ 20ํ๊น์ง ์ค์ ์ํ๋ฅผ ํ์ธํฉ๋๋ค. 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 item = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(item == 0))
{
return 0;
}
return ChangeAndConfirm(1, item);
return null;
}
dynamic ChangeAndConfirm(dynamic layer, dynamic item)
{
if (Truth(item == 0))
{
return 0;
}
if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) != item))
{
return 0;
}
if (!(Truth(UO.UnequipItems(item))))
{
return 0;
}
for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
{
if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == 0))
{
return 1;
}
UO.Wait(100);
}
return 0;
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: items (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ChangeEquipmentItems:ChangeEquipmentItems(ArrayArg(0), false). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::ArrayArg:ArrayArg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "unequipitems":
return new InjectionValue(ChangeEquipmentItems(ArrayArg(0), false));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.UnsetArm(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 ํญ๋ชฉ์ ์์ฒด ๋ ์ด์ด์ ๊ธฐ๋ก๋ฉ๋๋ค. ๋์ผํ ์ด๋ฆ์ ๋ค์ ์ ์ฅํ๋ฉด ํญ๋ชฉ์ด ๋์ฒด๋ฉ๋๋ค. ๋น ๋ ์ด์ด๋ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋ณต์๋๋ฉด ํด๋น ์ ์ ๋ ์ด์ด๊ฐ ์์ฒด ๋ฐฑํฉ์ผ๋ก ํด์ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ ์ฅ๋ ์์ ํ ๋น์ด ์๋ ์ธํธ๋ ํด๋น ๋ ์ด์ด์์ ํญ๋ชฉ์ ์ ๊ฑฐํฉ๋๋ค.
- ์ธํธ๋ ๋ฐํ์ ์ํ๋ก ์ ์ฅ๋ฉ๋๋ค. ํธ์ถ ์์ฒด๋ ํ์ผ์ ์์ฑํ์ง ์์ผ๋ฉฐ ์ธํธ๊ฐ ๋ค๋ฅธ ํ๋กํ์ด๋ ์ ๋ฐํ์์ผ๋ก ์ ์ก๋๋ค๋ ๊ฒ์ ๋ณด์ฅํ์ง ์์ต๋๋ค. ๋จผ์ ์ํ๋ ์ธํธ๋ฅผ ์ฌ์ฉ๋ ์ํ๋ก ์ ์ฅํฉ๋๋ค. ํด๋ผ์ด์ธํธ์ ์ผ๋ฐ ์ํ๋ฅผ ๋ก๋/์ ์ฅํ๋ ๊ฒ์ ๋ณ๋์ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
- ์ญ์ ๋ ์ ํํ ์ด๋ฆ์ ์ ๋ ฅ์๋ง ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์์ดํ ์ ์บ๋ฆญํฐ์ ๋จ์ ์์ผ๋ฉฐ, ๋ค๋ฅธ ์ด๋ฆ๊ณผ ๋ค๋ฅธ ์ธํธ ์ ํ์ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค. ๋๋ฝ๋ ํญ๋ชฉ์ ๋ค์ ์ญ์ ํ๋ ๊ฒ์ ํ์ฉ๋ฉ๋๋ค. UnsetDress ๋ฐ UnsetArm์๋ ์ด๋ฆ์ด ํ์ํฉ๋๋ค.
- 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.UnsetArm");
UO.UnsetArm("battle");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ง์ ๋ ํญ๋ชฉ๋ง ์ญ์ ๋ฉ๋๋ค. ์ท/๋ฌด๊ธฐ๋ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
UO.UnsetArm("battle");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฌํ, ์ ํฌ ์ด๋ฆ์ ๋ณ๋๋ก ์ญ์ ๋ฉ๋๋ค. ๋ค๋ฅธ ์ธํธ ์ ํ์ ๋์ผํ ์ด๋ฆ์ ์ ์ง๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.UnsetArm("travel");
UO.UnsetArm("battle");
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- CleanupSets๋ ๋ ๊ฐ์ ๊ณ ์ ๋ช ์ฌ๋ฅผ ์ ๋ฆฌํ๊ธฐ ์ํด ์์ ํ ์ ์ธ๋ ์ ์ฐจ์ ๋๋ค. ์ ๋์ฌ๋ ํ์ผ ๊ฒฝ๋ก๊ฐ ์๋ ํญ๋ชฉ ์ด๋ฆ์ ์์ฑํฉ๋๋ค.
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()
{
CleanupSets("mine_");
return null;
}
void CleanupSets(dynamic prefix)
{
UO.UnsetArm(prefix + "travel");
UO.UnsetArm(prefix + "battle");
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: name (String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.UnsetArm. -
InjectionScript.Runtime.State.RuntimeDictionary.Remove:armSets.Remove(name). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("Arm set removed.").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void UnsetArm(string name)
{
armSets.Remove(name);
SystemMessage("Arm set removed.");
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.UnsetDress(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 ํญ๋ชฉ์ ์์ฒด ๋ ์ด์ด์ ๊ธฐ๋ก๋ฉ๋๋ค. ๋์ผํ ์ด๋ฆ์ ๋ค์ ์ ์ฅํ๋ฉด ํญ๋ชฉ์ด ๋์ฒด๋ฉ๋๋ค. ๋น ๋ ์ด์ด๋ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋ณต์๋๋ฉด ํด๋น ์ ์ ๋ ์ด์ด๊ฐ ์์ฒด ๋ฐฑํฉ์ผ๋ก ํด์ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ ์ฅ๋ ์์ ํ ๋น์ด ์๋ ์ธํธ๋ ํด๋น ๋ ์ด์ด์์ ํญ๋ชฉ์ ์ ๊ฑฐํฉ๋๋ค.
- ์ธํธ๋ ๋ฐํ์ ์ํ๋ก ์ ์ฅ๋ฉ๋๋ค. ํธ์ถ ์์ฒด๋ ํ์ผ์ ์์ฑํ์ง ์์ผ๋ฉฐ ์ธํธ๊ฐ ๋ค๋ฅธ ํ๋กํ์ด๋ ์ ๋ฐํ์์ผ๋ก ์ ์ก๋๋ค๋ ๊ฒ์ ๋ณด์ฅํ์ง ์์ต๋๋ค. ๋จผ์ ์ํ๋ ์ธํธ๋ฅผ ์ฌ์ฉ๋ ์ํ๋ก ์ ์ฅํฉ๋๋ค. ํด๋ผ์ด์ธํธ์ ์ผ๋ฐ ์ํ๋ฅผ ๋ก๋/์ ์ฅํ๋ ๊ฒ์ ๋ณ๋์ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
- ์ญ์ ๋ ์ ํํ ์ด๋ฆ์ ์ ๋ ฅ์๋ง ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์์ดํ ์ ์บ๋ฆญํฐ์ ๋จ์ ์์ผ๋ฉฐ, ๋ค๋ฅธ ์ด๋ฆ๊ณผ ๋ค๋ฅธ ์ธํธ ์ ํ์ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค. ๋๋ฝ๋ ํญ๋ชฉ์ ๋ค์ ์ญ์ ํ๋ ๊ฒ์ ํ์ฉ๋ฉ๋๋ค. UnsetDress ๋ฐ UnsetArm์๋ ์ด๋ฆ์ด ํ์ํฉ๋๋ค.
- 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.UnsetDress");
UO.UnsetDress("travel");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ง์ ๋ ํญ๋ชฉ๋ง ์ญ์ ๋ฉ๋๋ค. ์ท/๋ฌด๊ธฐ๋ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
UO.UnsetDress("travel");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฌํ, ์ ํฌ ์ด๋ฆ์ ๋ณ๋๋ก ์ญ์ ๋ฉ๋๋ค. ๋ค๋ฅธ ์ธํธ ์ ํ์ ๋์ผํ ์ด๋ฆ์ ์ ์ง๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.UnsetDress("travel");
UO.UnsetDress("battle");
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- CleanupSets๋ ๋ ๊ฐ์ ๊ณ ์ ๋ช ์ฌ๋ฅผ ์ ๋ฆฌํ๊ธฐ ์ํด ์์ ํ ์ ์ธ๋ ์ ์ฐจ์ ๋๋ค. ์ ๋์ฌ๋ ํ์ผ ๊ฒฝ๋ก๊ฐ ์๋ ํญ๋ชฉ ์ด๋ฆ์ ์์ฑํฉ๋๋ค.
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()
{
CleanupSets("mine_");
return null;
}
void CleanupSets(dynamic prefix)
{
UO.UnsetDress(prefix + "travel");
UO.UnsetDress(prefix + "battle");
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: name (String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.UnsetDress. -
InjectionScript.Runtime.State.RuntimeDictionary.Remove:dressSets.Remove(name). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("Dress set removed.").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void UnsetDress(string name)
{
dressSets.Remove(name);
SystemMessage("Dress set removed.");
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.UseOtherPaperdollScroll(object? objID);๋ธ๋ฆฌ์ง๋ฅผ ํตํด ์ง์ ๋ serial์ ์ฌ์ฉํฉ๋๋ค.UseObject, ์ผ๋ฐ์ ์ผ๋ก ์บ๋ฆญํฐ์ ์ข ์ด์ธํ์ ์ฝ๋๋ค.
-
objIDโ ์ง๋ ฌ/ID ๊ฐ์ฒด: int, ์ซ์/16์ง์ ๋ฌธ์์ด ๋๋ ์ค์ ๋ ๋ณ์นญ(์: "lasttarget"). ์ด๊ฒ์ graphic/type๊ฐ ์๋๋๋ค. ์กฐ์น๋ฅผ ์ทจํ๊ธฐ ์ ์ ๋ก๋๋ ๊ฐ์ฒด๋ฅผ ํ์ธํ์ญ์์ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ObjID๋ ID ์คํฌ๋กค ๋ฒํผ์ด ์๋ ๋ฌธ์๋ฅผ ๋ํ๋ ๋๋ค. ํธ์ถ์ ์ข ์ด์ธํ ๊ตฌ์กฐ๋ฅผ ์ฝ์ง ์์ผ๋ฉฐ ๊ทธ๊ฒ์ด ์ด๋ฆด ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
- Bridge๋ ๊ฒ์ ์คํธ๋ฆผ์ ๋ํ ์์ฒญ์ ๋ณด๋ ๋๋ค. ์๋ฒ ๊ท์น์ด ์ ์ฉ๋ฉ๋๋ค. ํ์ธ์ ๊ธฐ๋ค๋ฆฌ๋ ๋ด์ฅ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.UseOtherPaperdollScroll");
UO.UseOtherPaperdollScroll(UO.GetSerial("lasttarget"));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ธ๋ฆฌ์ง๋ฅผ ํตํด ์ง์ ๋ serial์ ์ฌ์ฉํฉ๋๋ค.UseObject, ์ผ๋ฐ์ ์ผ๋ก ์บ๋ฆญํฐ์ ์ข ์ด์ธํ์ ์ฝ๋๋ค.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
UO.UseOtherPaperdollScroll(id);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ObjID๋ ID ์คํฌ๋กค ๋ฒํผ์ด ์๋ ๋ฌธ์๋ฅผ ๋ํ๋ ๋๋ค. ํธ์ถ์ ์ข ์ด์ธํ ๊ตฌ์กฐ๋ฅผ ์ฝ์ง ์์ผ๋ฉฐ ๊ทธ๊ฒ์ด ์ด๋ฆด ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var id = UO.GetSerial("self");
if (Truth(UO.Exists(id)))
{
UO.UseOtherPaperdollScroll(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.UseOtherPaperdollScroll(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.UseObject:bridge.UseObject(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "useotherpaperdollscroll": bridge.UseObject(Arg(0)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.UseSelfPaperdollScroll();ํ์ฌ ์บ๋ฆญํฐ๋ฅผ ์ฌ์ฉํ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ์ข ์ด์ธํ์ ์ฝ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ExecuteClientApiCompatibility๋ ๋ธ๋ฆฌ์ง.UseObject(๋ธ๋ฆฌ์ง.Self)์ ํธ์ถํฉ๋๋ค. ์ข ์ด์ธํ ์์๋ฅผ ๋ณ๋๋ก ์ฝ๊ฑฐ๋ ํด๋ฆญํ์ง ์์ต๋๋ค. ์ด๋ self์ ๋ํ ์ผ๋ฐ์ ์ธ ์์ฒญ UseObject์ ๋๋ค.
- ์์ ์์ UO.Wait๋ ์คํฌ๋ฆฝํธ ์ผ์ ์ค์ง๋ง ์ง์ ํฉ๋๋ค. ์ผ์ ์ค์ง๊ฐ ๋๋ฌ๋ค๊ณ ํด์ ์๋ฒ๊ฐ ์์ฒญ์ ์๋ฃํ์์ ์ฆ๋ช ํ๋ ๊ฒ์ ์๋๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.UseSelfPaperdollScroll");
UO.UseSelfPaperdollScroll();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ์บ๋ฆญํฐ๋ฅผ ์ฌ์ฉํ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ์ข ์ด์ธํ์ ์ฝ๋๋ค.
UO.UseSelfPaperdollScroll();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ExecuteClientApiCompatibility๋ ๋ธ๋ฆฌ์ง.UseObject(๋ธ๋ฆฌ์ง.Self)์ ํธ์ถํฉ๋๋ค. ์ข ์ด์ธํ ์์๋ฅผ ๋ณ๋๋ก ์ฝ๊ฑฐ๋ ํด๋ฆญํ์ง ์์ต๋๋ค. ์ด๋ self์ ๋ํ ์ผ๋ฐ์ ์ธ ์์ฒญ UseObject์ ๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Self() != 0))
{
UO.UseSelfPaperdollScroll();
}
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๋ ์คํฌ๋ฆฝํธ ์ผ์ ์ค์ง๋ง ์ง์ ํฉ๋๋ค. ์ผ์ ์ค์ง๊ฐ ๋๋ฌ๋ค๊ณ ํด์ ์๋ฒ๊ฐ ์์ฒญ์ ์๋ฃํ์์ ์ฆ๋ช ํ๋ ๊ฒ์ ์๋๋๋ค.
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.UseSelfPaperdollScroll();
UO.Wait(500);
UO.Print(UO.Name());
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseObject:bridge.UseObject(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "useselfpaperdollscroll": bridge.UseObject(bridge.Self); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.WearItem(object? layer, object? objID);์ ํํ ์์ดํ ์ ์บ๋ฆญํฐ์ ๋๋ฒ ๋ ์ด์ด์ ์ฅ์ฐฉํฉ๋๋ค.
-
layer- ๋ ์ด์ด ๋ฒํธ(์: 1 - ์ค๋ฅธ์ชฝ, 2 - ์ผ์ชฝ) Equip ๋ฐ Unequip๋ "Rhand"์ ๊ฐ์ ๋ ์ด์ด ์ด๋ฆ์ ํ์ฉํฉ๋๋ค. WearItem๋ ์ซ์ ๋ ์ด์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ ์ด์ด๋ ์์ดํ ์ ์จ์ด๋ฌ๋ธ ๋ ์ด์ด์ ์ผ์นํด์ผ ํฉ๋๋ค. graphic๋ ์๋๊ณ ID๋ ์๋๋๋ค. -
objID- ๋ก๋๋ ํน์ ํญ๋ชฉ์ ID: ์ ์, 16์ง์ ๋ฌธ์์ด, "lasttarget" ๋๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ type๊ฐ ์๋๋๋ค. 0x0F5E๊ฐ ๋จผ์ graphic์ ๊ฒ์ ์ฐพ๊ณ ID๋ก ๊ฐ์ ธ์ค๋ ์์ ๋๋ค.
์ซ์ ํ๋๊ทธ int: 1 (์กฐ๊ฑด ์ถฉ์กฑ) - ๋ก์ปฌ ์์ ํ์ฉ, 0 (์กฐ๊ฑด ์ถฉ์กฑ ์ ๋จ) - ๊ฑฐ๋ถ. ์ด๋ ์๋ฒ ํ์ธ๋ ์๋๊ณ ID๋ ์๋๊ณ , ์๋๋ ์๋๋๋ค. ๋์ค์ ์๋ฒ๊ฐ ์คํจํ ์ ์์ต๋๋ค. ๋ต๋ณ ํ ์ค์ ์ฅ๋น๋ฅผ ํ์ธํ์ธ์.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก๋๋ ํญ๋ชฉ๊ณผ ์์ ๋ก์ด ์ ๋๋๊ทธ๊ฐ ํ์ํฉ๋๋ค. ์ ๊ฑฐํ ๋๋ ์ค์ ๋ฐฐ๋ญ self๊ฐ ํ์ํ๋ฉฐ ์๋น ๋ฐฐ๋ญ GrabBag์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ์ ์ ์๊ฑฐ๋ ํ์๋์๊ฑฐ๋ ๋ถ์ ํฉํ ํ๋ชฉ์ ๊ฑฐ๋ถ๋ฉ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ํญ๋ชฉ์ UnequipItems๋ฅผ ํตํด ์ ๊ฑฐํ ์ ์์ต๋๋ค. ์ธํธ๋ ์์์ฑ ํธ๋์ญ์ ์ด ์๋๋๋ค.
- EquipItems/UnequipItems๋ ์น์ธ๋ ์์ ์ดํ ๋ค์ ์์ ์ด์ ์ DressSpeed๋ฅผ ์ ์ฉํฉ๋๋ค. Disarm/Undress - ๊ฐ ์ ์ ๋ ์ด์ด ๋ค์. ์ถ๊ธ์ ์บ๋ฆฌ๊ฐ ํ์ฉ๋๋ ๊ฒฝ์ฐ DropDelay๋ฅผ ์ถ๊ฐ๋ก ์กด์คํฉ๋๋ค. ๋ค๋ฅธ ๋ฐํ์์ ๋์ผํ ์ค์ ์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ๊ฐ์์ ์๋ฒ ์ ํ์ โโ๋ฌด์ํ์ง ์์ต๋๋ค.
- ์๋ชป๋ ํธ์ถ ํ์, ์ ์ ์๋ ๋ ์ด์ด ์ด๋ฆ ๋๋ ์ซ์๋ก ๋ณํํ ์ ์๋ ๊ฐ์ผ๋ก ์ธํด 0 ๋์ ์คํฌ๋ฆฝํธ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ฅ๋น ์ค๋ ์ท์๋ ์ด๋ฏธ ๋ก๋๋ ๋ฐ์ดํฐ๋ง ํฌํจ๋ฉ๋๋ค. ์ด์์คํดํธ์์๋ ChangeAndConfirm ๋ ์ด์ด=1๊ฐ ์ค๋ฅธ์์ ๋๋ค. ๋ ๋ค๋ฅธ ์ ์ ์ค์ ๋ ์ด์ด๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค.
- UO.EquipItems ยท UO.UnequipItems ยท UO.DressSpeed ยท UO.DropDelay ยท UO.ObjAtLayerEx
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
int item = UO.LastTarget();
if (item != 0)
UO.Print("Accepted flag: " + Convert.ToString(UO.WearItem(1, item)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จผ์ , ๊ฒ์์์ ์ ์ ํ ํญ๋ชฉ์ ์ ํํ์ธ์: lasttarget - ID. Equip/WearItem ์์์ 1 ๋ ์ด์ด์๋ ๋ณด์กฐ ๋ฌด๊ธฐ๊ฐ ํ์ํฉ๋๋ค. Unequip(1)๋ ์ค๋ฅธ์์ ์ ๊ฑฐํฉ๋๋ค. Disarm/Undress ์์ฒด ๊ณ ์ ๋ ์ด์ด๋ฅผ ์ฌ์ฉํ์ฌ ์๋ํฉ๋๋ค. ๊ฑฐ์ ํ์๋ ์๋ ์ฌ์์ด ๋์ง ์์ต๋๋ค.
var item = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(item == 0))
{
return 0;
}
return UO.WearItem(1, item);
int Asc(object? value, int fallback = 0) { string text = Convert.ToString(value) ?? ""; if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback; return int.TryParse(text, out int number) ? number : fallback; }
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฅ์ฐฉ ๋ฐฉ๋ฒ์ ์์ด์ 0x0F5E๋ ๊ฒ์ ์์์ด๊ณ , 0x1B76๋ ๋ฐฉํจ์ ์์์ ๋๋ค. FindType๋ ๋ฐฐ๋ญ์ ๋ก๋๋ ํญ๋ชฉ ์ค์์ ํด๋น ํญ๋ชฉ์ ์ฐพ๊ณ , ASC๋ ๋ฐํ๋ 16์ง์-ID๋ฅผ ๋ณํํฉ๋๋ค. ์ ๊ฑฐํ๋ ค๋ฉด ํ์ฌ ๋ ์ด์ด๋ฅผ ์ฝ์ด์ผ ํฉ๋๋ค. ํ์ํ ํญ๋ชฉ์ ์ฌ์ฉํ ์ ์์ผ๋ฉด ์คํฌ๋ฆฝํธ๊ฐ ์ข ๋ฃ๋ฉ๋๋ค. ๋ฐฐ์ด์ ๋ ๊ฐ์ ID๋ฅผ ์ ์ฅํฉ๋๋ค. ๊ฐ ํญ๋ชฉ์ ์์ ํ ์ ์ก๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var first = Asc(UO.FindType(0x0F5E, -1, "backpack"), 0);
var second = Asc(UO.FindType(0x1B76, -1, "backpack"), 0);
if (Truth(first == 0) || Truth(second == 0))
{
return 0;
}
UO.AddObject("saved_first", first);
UO.AddObject("saved_second", second);
var firstOk = UO.WearItem(1, first);
var secondOk = UO.WearItem(2, second);
return firstOk != 0 && secondOk != 0;
return null;
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ChangeAndConfirm๋ ๋ช ๋ น์ ํ ๋ฒ ์คํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ 100ms์ ์ผ์ ์ค์ง๋ฅผ ํตํด ์ต๋ 20ํ๊น์ง ์ค์ ์ํ๋ฅผ ํ์ธํฉ๋๋ค. 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 item = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(item == 0))
{
return 0;
}
return ChangeAndConfirm(1, item);
return null;
}
dynamic ChangeAndConfirm(dynamic layer, dynamic item)
{
if (Truth(item == 0))
{
return 0;
}
if (!(Truth(UO.WearItem(layer, item))))
{
return 0;
}
for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
{
if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == item))
{
return 1;
}
UO.Wait(100);
}
return 0;
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: layer (Any), objID (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Equip:bridge.Equip(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "wearitem": return new InjectionValue(bridge.Equip(Arg(0), Arg(1)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Weight();์บ๋ฆญํฐ์ ์ํ ์นด์ดํฐ(ํ์ฌ ๋์ ๋ฌด๊ฒ)๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ ๋์ ํ์ฌ ๋ฌด๊ฒ, ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ 0..65535. 0๋ ์ค์ ๊ฐ์ด๊ฑฐ๋, ๋ฐ์ดํฐ๊ฐ ์๊ฑฐ๋, ๋๋ฝ/ํ๊ดด๋ ํ๋ ์ด์ด์ผ ์ ์์ต๋๋ค. ์ด๋ bool, ID ๋๋ type๊ฐ ์๋ ์๋์ ๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋๋ผ ํ๋์ ๋จ์๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด ๋ช ๋ น์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณตํ์ง ์์ผ๋ฉฐ ๋ฐฐ์ด์ ๋ฐํํ์ง ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.Weight ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- Weight๋ ์๋ฒ๊ฐ ๋ณด๊ณ ํ ์ด ๋ฌด๊ฒ๋ฅผ ๋๋ก ์ฝ์ต๋๋ค. ๊ธ์ก์ ํฌํจ๋๋ ์ ์ฒด, ์ฅ๋น ๋ฐ ๊ฐ๋ฐฉ์ ๋ฌด๊ฒ๋ ์ค๋์ ๊ท์น์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค. ํ์ ์ปจํ ์ด๋๋ฅผ ์ดํด๋ณด๊ฑฐ๋ ํ๋ชฉ ์ค๋์ ํฉ์ฐํ๊ฑฐ๋ ๋ซํ ๊ฐ๋ฐฉ์ ์ ๋ฐ์ดํธํ์ง ์์ต๋๋ค. ์ด๋ ๊ฐ๋ณ ํญ๋ชฉ์ Weight ์์ฑ๋ ์๋๊ณ ํญ๋ชฉ ๊ฐ์๋ ์๋๋๋ค.
- CharacterStatus๋ ์ ๋ฐ์ดํธํ๊ธฐ ์ ์ ํ์ํ ๋ณธ๋ฌธ์ ํ์ธํฉ๋๋ค. Weight๋ ์์ฒด ํ์ฅ ์ํ์ธ ์ฌ๋กฏ - type 3, Luck - type 4, ์๋ฒ WeightMax - type 5์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ํ์ ์นด์ดํฐ๊ฐ ์๋ ์ปดํฉํธ/์ค๋๋ ํจํค์ง๋ ์ด์ ์บ์๋ฅผ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค. ์ ํ๋ ์ด์ด๋ ์ฒ์๋ถํฐ ์์๋ฉ๋๋ค. ํตํ๋ ์๋ก์ด ์ํ๋ฅผ ๋ฐ์๋ค๋ ๊ฒ์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
- ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค. C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Weight();
UO.Print("Weight: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- value๋ ์์ ์ ๋ฌธ์์ ๋ํ ์ธ์ ์๋ ํธ์ถ์ ํ ๋ฒ ์ ์ฅํฉ๋๋ค. Convert.ToString๋ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ก๊ทธ ๋ฒํธ์ ํ์์ ์ง์ ํฉ๋๋ค.
var value = UO.Weight();
UO.Print("Weight: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UO.Wait(500)๋ 500 ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ ํ๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ฐจ์ด๋ ์์, 0 ๋๋ ์์์ผ ์ ์์ต๋๋ค. ์ค๊ฐ ์ ๋ฐ์ดํธ ๋ฐ ์บ๋ฆญํฐ ๋ณ๊ฒฝ์ ์๋ต๋ ์ ์์ต๋๋ค. ์ผ์ ์ ์ง๊ฐ ๊ทธ ์์ ๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.Weight();
await Delay(500);
var after = UO.Weight();
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.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Weight:bridge.Weight.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "weight": return new InjectionValue(bridge.Weight);