KO UO Topic character Part 5 - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

์„ฑ๊ฒฉ โ€” 5

ํ™ˆ ยท C# ยท IDE ยท UO API ยท Aโ€“Z ยท ์˜ˆ ยท ์–ธ์–ด

์ฐธ์กฐ ๊ตฌ์„ฑ

1 ยท 2 ยท 3 ยท 4 ยท 5

์ „์ฒด ๋ช…๋ น ์ฐธ์กฐ


UO.Undress

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.Undress();
UO.Print("Undress: " + Convert.ToString(result));

1. Undress - ํ•˜๋‚˜์˜ ์„ ํƒ๋œ ํ•ญ๋ชฉ ๋˜๋Š” ๋ ˆ์ด์–ด - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋จผ์ €, ๊ฒŒ์ž„์—์„œ ์ ์ ˆํ•œ ํ•ญ๋ชฉ์„ ์„ ํƒํ•˜์„ธ์š”: lasttarget - ID. Equip/WearItem ์˜ˆ์—์„œ 1 ๋ ˆ์ด์–ด์—๋Š” ๋ณด์กฐ ๋ฌด๊ธฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Unequip(1)๋Š” ์˜ค๋ฅธ์†์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. Disarm/Undress ์ž์ฒด ๊ณ ์ • ๋ ˆ์ด์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ์ ˆ ํ›„์—๋Š” ์ž๋™ ์žฌ์ƒ์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return UO.Undress();

2. Undress - ๋‘ ๊ฐœ์˜ ํ•ญ๋ชฉ์„ ์ €์žฅํ•˜๊ณ  ID - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์žฅ์ฐฉ ๋ฐฉ๋ฒ•์— ์žˆ์–ด์„œ 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;

3. Undress - ๋Œ€๊ธฐ๊ฐ€ ์ œํ•œ๋œ ์ „์ฒด ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Undress() โ€” UO.Undress()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int Undress()

            => Unequip(dressLayers, "Clothing removed.");

UO.Unequip

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.Unequip(1);
UO.Print("Unequip: " + Convert.ToString(result));

1. Unequip - ํ•˜๋‚˜์˜ ์„ ํƒ๋œ ํ•ญ๋ชฉ ๋˜๋Š” ๋ ˆ์ด์–ด - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋จผ์ €, ๊ฒŒ์ž„์—์„œ ์ ์ ˆํ•œ ํ•ญ๋ชฉ์„ ์„ ํƒํ•˜์„ธ์š”: lasttarget - ID. Equip/WearItem ์˜ˆ์—์„œ 1 ๋ ˆ์ด์–ด์—๋Š” ๋ณด์กฐ ๋ฌด๊ธฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Unequip(1)๋Š” ์˜ค๋ฅธ์†์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. Disarm/Undress ์ž์ฒด ๊ณ ์ • ๋ ˆ์ด์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ์ ˆ ํ›„์—๋Š” ์ž๋™ ์žฌ์ƒ์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return UO.Unequip(1);

2. Unequip - ๋‘ ๊ฐœ์˜ ํ•ญ๋ชฉ์„ ์ €์žฅํ•˜๊ณ  ID - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์žฅ์ฐฉ ๋ฐฉ๋ฒ•์— ์žˆ์–ด์„œ 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;

3. Unequip - ๋Œ€๊ธฐ๊ฐ€ ์ œํ•œ๋œ ์ „์ฒด ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Unequip(layer) โ€” UO.Unequip(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: layer (Any/String)

๊ฒฐ๊ณผ: int / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "unequip":

                    return new InjectionValue(arguments[0].Kind == InjectionValueKind.String ? Unequip(Text(0)) : bridge.Unequip(Arg(0)));

UO.Unequip(layer) โ€” UO.Unequip(String)

๋งค๊ฐœ๋ณ€์ˆ˜: layer (Any/String)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int Unequip(string layer) => bridge.Unequip(ConvertLayer(layer));

UO.UnequipItems

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .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));

1. UnequipItems - ํ•˜๋‚˜์˜ ์„ ํƒ๋œ ํ•ญ๋ชฉ ๋˜๋Š” ๋ ˆ์ด์–ด - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋จผ์ €, ๊ฒŒ์ž„์—์„œ ์ ์ ˆํ•œ ํ•ญ๋ชฉ์„ ์„ ํƒํ•˜์„ธ์š”: 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;

2. UnequipItems - ๋‘ ๊ฐœ์˜ ํ•ญ๋ชฉ ๋ฐ ์ €์žฅ๋จ ID - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์žฅ์ฐฉ ๋ฐฉ๋ฒ•์— ์žˆ์–ด์„œ 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;

3. UnequipItems - ๋Œ€๊ธฐ๊ฐ€ ์ œํ•œ๋œ ์ „์ฒด ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.UnequipItems(items) โ€” UO.UnequipItems(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: items (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "unequipitems":

                    return new InjectionValue(ChangeEquipmentItems(ArrayArg(0), false));

UO.UnsetArm

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•ž์˜ ๋ฉ”์‹œ์ง€๋Š” ํ˜ธ์ถœ ์‹œ์ž‘์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์„œ๋ฒ„ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UO.Print("Calling UO.UnsetArm");
UO.UnsetArm("battle");

1. ์ง์ ‘ ์‚ฌ์šฉ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ง€์ •๋œ ํ•ญ๋ชฉ๋งŒ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ์˜ท/๋ฌด๊ธฐ๋Š” ์ œ๊ฑฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
UO.UnsetArm("battle");

2. ์ด๋ฆ„ ๋ฐ ์ฟผ๋ฆฌ ๋ชจ๋“œ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์—ฌํ–‰, ์ „ํˆฌ ์ด๋ฆ„์€ ๋ณ„๋„๋กœ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์„ธํŠธ ์œ ํ˜•์˜ ๋™์ผํ•œ ์ด๋ฆ„์€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.UnsetArm("travel");
    UO.UnsetArm("battle");
    return null;
}

3. ์™„์ „ํ•œ ๋„์šฐ๋ฏธ ์Šคํฌ๋ฆฝํŠธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.UnsetArm(name) โ€” UO.UnsetArm(String)

๋งค๊ฐœ๋ณ€์ˆ˜: name (String)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public void UnsetArm(string name)

        {

            armSets.Remove(name);

            SystemMessage("Arm set removed.");

        }

UO.UnsetDress

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•ž์˜ ๋ฉ”์‹œ์ง€๋Š” ํ˜ธ์ถœ ์‹œ์ž‘์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์„œ๋ฒ„ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UO.Print("Calling UO.UnsetDress");
UO.UnsetDress("travel");

1. ์ง์ ‘ ์‚ฌ์šฉ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ง€์ •๋œ ํ•ญ๋ชฉ๋งŒ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ์˜ท/๋ฌด๊ธฐ๋Š” ์ œ๊ฑฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
UO.UnsetDress("travel");

2. ์ด๋ฆ„ ๋ฐ ์ฟผ๋ฆฌ ๋ชจ๋“œ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์—ฌํ–‰, ์ „ํˆฌ ์ด๋ฆ„์€ ๋ณ„๋„๋กœ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์„ธํŠธ ์œ ํ˜•์˜ ๋™์ผํ•œ ์ด๋ฆ„์€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.UnsetDress("travel");
    UO.UnsetDress("battle");
    return null;
}

3. ์™„์ „ํ•œ ๋„์šฐ๋ฏธ ์Šคํฌ๋ฆฝํŠธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.UnsetDress(name) โ€” UO.UnsetDress(String)

๋งค๊ฐœ๋ณ€์ˆ˜: name (String)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public void UnsetDress(string name)

        {

            dressSets.Remove(name);

            SystemMessage("Dress set removed.");

        }

UO.UseOtherPaperdollScroll

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

void UO.UseOtherPaperdollScroll(object? objID);

๋ธŒ๋ฆฌ์ง€๋ฅผ ํ†ตํ•ด ์ง€์ •๋œ serial์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.UseObject, ์ผ๋ฐ˜์ ์œผ๋กœ ์บ๋ฆญํ„ฐ์˜ ์ข…์ด์ธํ˜•์„ ์—ฝ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

  • objID โ€” ์ง๋ ฌ/ID ๊ฐœ์ฒด: int, ์ˆซ์ž/16์ง„์ˆ˜ ๋ฌธ์ž์—ด ๋˜๋Š” ์„ค์ •๋œ ๋ณ„์นญ(์˜ˆ: "lasttarget"). ์ด๊ฒƒ์€ graphic/type๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ธฐ ์ „์— ๋กœ๋“œ๋œ ๊ฐœ์ฒด๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. ์™„๋ฃŒ๋Š” ์„œ๋ฒ„์˜ ์ž‘์—…์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ObjID๋Š” ID ์Šคํฌ๋กค ๋ฒ„ํŠผ์ด ์•„๋‹Œ ๋ฌธ์ž๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํ˜ธ์ถœ์€ ์ข…์ด์ธํ˜• ๊ตฌ์กฐ๋ฅผ ์ฝ์ง€ ์•Š์œผ๋ฉฐ ๊ทธ๊ฒƒ์ด ์—ด๋ฆด ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Bridge๋Š” ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‚ด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•ž์˜ ๋ฉ”์‹œ์ง€๋Š” ํ˜ธ์ถœ ์‹œ์ž‘์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์„œ๋ฒ„ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UO.Print("Calling UO.UseOtherPaperdollScroll");
UO.UseOtherPaperdollScroll(UO.GetSerial("lasttarget"));

1. ์ง์ ‘ ํ†ตํ™” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋ธŒ๋ฆฌ์ง€๋ฅผ ํ†ตํ•ด ์ง€์ •๋œ 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;

2. ๋ช…์‹œ์  ์˜ต์…˜ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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;

3. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.UseOtherPaperdollScroll(objID) โ€” UO.UseOtherPaperdollScroll(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: objID (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "useotherpaperdollscroll": bridge.UseObject(Arg(0)); return InjectionValue.Unit;

UO.UseSelfPaperdollScroll

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

void UO.UseSelfPaperdollScroll();

ํ˜„์žฌ ์บ๋ฆญํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์ข…์ด์ธํ˜•์„ ์—ฝ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. ์™„๋ฃŒ๋Š” ์„œ๋ฒ„์˜ ์ž‘์—…์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ExecuteClientApiCompatibility๋Š” ๋ธŒ๋ฆฌ์ง€.UseObject(๋ธŒ๋ฆฌ์ง€.Self)์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ข…์ด์ธํ˜• ์š”์†Œ๋ฅผ ๋ณ„๋„๋กœ ์ฝ๊ฑฐ๋‚˜ ํด๋ฆญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” self์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์š”์ฒญ UseObject์ž…๋‹ˆ๋‹ค.
  • ์˜ˆ์ œ์—์„œ UO.Wait๋Š” ์Šคํฌ๋ฆฝํŠธ ์ผ์‹œ ์ค‘์ง€๋งŒ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ผ์‹œ ์ค‘์ง€๊ฐ€ ๋๋‚ฌ๋‹ค๊ณ  ํ•ด์„œ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์™„๋ฃŒํ–ˆ์Œ์„ ์ฆ๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•ž์˜ ๋ฉ”์‹œ์ง€๋Š” ํ˜ธ์ถœ ์‹œ์ž‘์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์„œ๋ฒ„ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UO.Print("Calling UO.UseSelfPaperdollScroll");
UO.UseSelfPaperdollScroll();

1. ์ง์ ‘ ํ†ตํ™” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ˜„์žฌ ์บ๋ฆญํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์ข…์ด์ธํ˜•์„ ์—ฝ๋‹ˆ๋‹ค.
UO.UseSelfPaperdollScroll();

2. ๋ช…์‹œ์  ์˜ต์…˜ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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;

3. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์˜ˆ์ œ์—์„œ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.UseSelfPaperdollScroll() โ€” UO.UseSelfPaperdollScroll()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "useselfpaperdollscroll": bridge.UseObject(bridge.Self); return InjectionValue.Unit;

UO.WearItem

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

int item = UO.LastTarget();
if (item != 0)
    UO.Print("Accepted flag: " + Convert.ToString(UO.WearItem(1, item)));

1. WearItem - ํ•˜๋‚˜์˜ ์„ ํƒ๋œ ํ•ญ๋ชฉ ๋˜๋Š” ๋ ˆ์ด์–ด - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋จผ์ €, ๊ฒŒ์ž„์—์„œ ์ ์ ˆํ•œ ํ•ญ๋ชฉ์„ ์„ ํƒํ•˜์„ธ์š”: 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;

2. WearItem - ๋‘ ๊ฐœ์˜ ํ•ญ๋ชฉ ๋ฐ ์ €์žฅ๋จ ID - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์žฅ์ฐฉ ๋ฐฉ๋ฒ•์— ์žˆ์–ด์„œ 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;

3. WearItem - ๋Œ€๊ธฐ๊ฐ€ ์ œํ•œ๋œ ์ „์ฒด ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.WearItem(layer, objID) โ€” UO.WearItem(Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: layer (Any), objID (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "wearitem": return new InjectionValue(bridge.Equip(Arg(0), Arg(1)));

UO.Weight

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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์€ ๊ฐ’์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.Weight();
UO.Print("Weight: " + Convert.ToString(result));

1. ์ €์žฅ๋œ ์นด์šดํ„ฐ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • value๋Š” ์ž์‹ ์˜ ๋ฌธ์ž์— ๋Œ€ํ•œ ์ธ์ˆ˜ ์—†๋Š” ํ˜ธ์ถœ์„ ํ•œ ๋ฒˆ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. Convert.ToString๋Š” ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋กœ๊ทธ ๋ฒˆํ˜ธ์˜ ํ˜•์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
var value = UO.Weight();
UO.Print("Weight: " + Convert.ToString(value));

2. ๋ณ€ํ™” ๊ด€์ฐฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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)));

3. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Weight() โ€” UO.Weight()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "weight": return new InjectionValue(bridge.Weight);
โš ๏ธ **GitHub.com Fallback** โš ๏ธ