KO UO Topic magic - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

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

๋งˆ๋ฒ•

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

๋งˆ๋ฒ•์„ ์ด์šฉํ•œ ์ฃผ๋ฌธ, ๋Šฅ๋ ฅ ๋ฐ ์›€์ง์ž„. ํƒ€๊ฒŸ ์•ก์…˜์„ ์œ„ํ•ด์„œ๋Š” ํƒ€๊ฒŸ์„ ๋ฏธ๋ฆฌ ์„ค์ •ํ•˜๊ณ  ์ ์šฉ ์กฐ๊ฑด์„ ํ™•์ธํ•˜์„ธ์š”.

์ฃผ๋ฌธ: ๋ชจ๋“  ์ด๋ฆ„๊ณผ ์ˆซ์ž

์ „์ฒด ์นดํƒˆ๋กœ๊ทธ ๋ฐ ์˜ˆ์‹œ ์—ด๊ธฐ

์„น์…˜

์ฃผ์ œ ๋ช…๋ น ๋ฐ ์„ค๋ช…
Cast UO.Cast
CastToObject UO.CastToObject
CastAbility UO.CastAbility
Active Spell Ability UO.IsActiveSpellAbility
Spell Timers UO.TicksSpell

๋ชจ๋“  ํ…Œ๋งˆ ๋ช…๋ น

์ฃผ์กฐ

UO.Cast ยท UO.CastToObject ยท UO.CastAbility ยท UO.IsActiveSpellAbility ยท UO.TicksSpell

์—ฌํ–‰ํ•˜๋‹ค

UO.AddRecall ยท UO.AddGate

์ฃผ์ œ์— ๋Œ€ํ•œ ์˜ˆ

๊ฐ ๋ช…๋ น ์นด๋“œ์—๋Š” ์ง์ ‘ ์ฝ”๋“œ, ํ•จ์ˆ˜ ๋ฐ ํด๋ž˜์Šค ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋…๋ฆฝ์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์„ ํƒ๋œ ์งง์€ ์‹œ๋‚˜๋ฆฌ์˜ค์ž…๋‹ˆ๋‹ค. ์ œํ•œ์‚ฌํ•ญ๊ณผ ์ „์ฒด ๋ถ„์„์ด ์นด๋“œ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

UO.Cast

๋งค๊ฐœ๋ณ€์ˆ˜, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋“  ์‹œ๋‚˜๋ฆฌ์˜ค

UO.CancelWaitTarget();
if (Truth(UO.Cast("Cure")))
{
    UO.Print("Choose the character with the spell cursor");
}
else
{
    UO.Print("Cure request rejected");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

UO.CastToObject

๋งค๊ฐœ๋ณ€์ˆ˜, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋“  ์‹œ๋‚˜๋ฆฌ์˜ค

var accepted = UO.CastToObject("Heal", "self");
UO.Print(Convert.ToString(accepted));

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


UO.AddGate

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

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

void UO.AddGate(object? bookSerial);

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

  • bookSerial๋Š” ํ˜ธํ™˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ ˆ๊ฑฐ์‹œ ๋ชฉ๋ก ํ•ญ๋ชฉ์œผ๋กœ ์ €์žฅํ•˜๋Š” ์‹๋ณ„์ž ๊ฐ’์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ๋Ÿฐํƒ€์ž„์—์„œ๋Š” ๊ฐ’์ด ๋ฌธ์ž์—ด๋กœ ์ง๋ ฌํ™”๋ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์›”๋“œ์— ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void. ํŒ€์€ ์ฑ…์˜ ๊ฐ€์šฉ์„ฑ์ด๋‚˜ ๊ฒŒ์ž„ ํฌํ„ธ ์ƒ์„ฑ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ฐ’์€ ํ˜„์žฌ ๋Ÿฐํƒ€์ž„ ์ƒํƒœ์˜ ๋ชฉ๋ก AddGate์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ClassicUO์—์„œ ์ด ํ˜ธํ™˜์„ฑ ๋ชฉ๋ก์€ ๊ฒŒ์ž„ ์ž‘์—…์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์„œํ™”๋œ ๊ณต๊ฐœ getter๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.AddGate");
UO.AddGate("0x40012345");

1. ๊ฒŒ์ดํŠธ๋ฅผ ์—ด์ง€ ์•Š๊ณ ๋„ ID๋ฅผ ๋ ˆ๊ฑฐ์‹œ ๋ฐ์ดํ„ฐ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๊ฒŒ์ดํŠธ๋ฅผ ์—ด์ง€ ์•Š๊ณ ๋„ ID๋ฅผ ๋ ˆ๊ฑฐ์‹œ ๋ฐ์ดํ„ฐ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
UO.AddGate("0x40012345");

2. ํ˜ธํ™˜๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ์— ์ „๋‹ฌ๋œ ๋ฌธ์ž์—ด์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ํ˜ธํ™˜๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ์— ์ „๋‹ฌ๋œ ๋ฌธ์ž์—ด์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var bookSerial = "0x40012345";
    UO.AddGate(bookSerial);
    return null;
}

3. ๋Ÿฐํƒ€์ž„ ๋ชฉ๋ก AddGate์— ๊ฐ’์„ ์”๋‹ˆ๋‹ค. - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ๋Ÿฐํƒ€์ž„ ๋ชฉ๋ก AddGate์— ๊ฐ’์„ ์”๋‹ˆ๋‹ค.
  • ํ˜ธ์ถœ์€ ํ˜ธํ™˜์„ฑ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Š” ์„ธ์ƒ์—์„œ ์ฑ…์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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()
    {
        RememberGateBook("0x40012345");
        return null;
    }

    void RememberGateBook(dynamic bookSerial)
    {
        UO.AddGate(bookSerial);
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.AddGate(bookSerial) โ€” UO.AddGate(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "adddir":

                case "addfindlist":

                case "addgate":

                case "addrecall":

                case "addstep":

                    LegacyList(name).Add(string.Join("|", arguments.Select(value => value.ToString())));

                    break;

UO.AddRecall

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

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

void UO.AddRecall(object? bookSerial);

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

  • bookSerial๋Š” ํ˜ธํ™˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ ˆ๊ฑฐ์‹œ ๋ชฉ๋ก ํ•ญ๋ชฉ์œผ๋กœ ์ €์žฅํ•˜๋Š” ์‹๋ณ„์ž ๊ฐ’์ž…๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์€ ์ „๋‹ฌ๋œ ๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ์ง๋ ฌํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void. ํ˜ธ์ถœ์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ฑ…์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ฐ’์€ ํ˜„์žฌ ๋Ÿฐํƒ€์ž„ ์ƒํƒœ์˜ ๋ชฉ๋ก AddRecall์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ClassicUO์—์„œ ์ด ํ˜ธํ™˜์„ฑ ๋ชฉ๋ก ์ž์ฒด๋Š” ๊ฒŒ์ž„ ๋ช…๋ น์„ ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉฐ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์„œํ™”๋œ ๊ณต๊ฐœ getter๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.AddRecall");
UO.AddRecall("0x40012345");

1. ๊ฐ’์„ ํ˜ธํ™˜์„ฑ ๋ฐ์ดํ„ฐ๋กœ ์ €์žฅํ•˜๊ณ  Recall์„ ์‹คํ–‰ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๊ฐ’์„ ํ˜ธํ™˜์„ฑ ๋ฐ์ดํ„ฐ๋กœ ์ €์žฅํ•˜๊ณ  Recall์„ ์‹คํ–‰ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
UO.AddRecall("0x40012345");

2. ๋ฌธ์ž์—ด ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์‹๋ณ„์ž๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋ฌธ์ž์—ด ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์‹๋ณ„์ž๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var bookSerial = "0x40012345";
    UO.AddRecall(bookSerial);
    return null;
}

3. ๊ฐ ํ˜ธ์ถœ์€ ํ˜„์žฌ ๋Ÿฐํƒ€์ž„์˜ AddRecall์— ๋ณ„๋„์˜ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ๊ฐ ํ˜ธ์ถœ์€ ํ˜„์žฌ ๋Ÿฐํƒ€์ž„์˜ AddRecall์— ๋ณ„๋„์˜ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
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.AddRecall("0x40012345");
        UO.AddRecall("0x40012346");
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.AddRecall(bookSerial) โ€” UO.AddRecall(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "adddir":

                case "addfindlist":

                case "addgate":

                case "addrecall":

                case "addstep":

                    LegacyList(name).Add(string.Join("|", arguments.Select(value => value.ToString())));

                    break;

UO.Cast

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

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

int UO.Cast(object? spellName);

์ด๋ฆ„์œผ๋กœ ์ฃผ๋ฌธ์˜ ์‚ฌ์šฉ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜: spellName(์˜ˆ: UO.Cast("Heal")). ๋Œ€์ƒ์€ ๋ณ„๋„๋กœ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์šฐ์Šค๋กœ ํ‘œ์‹œ๋œ ์‹ญ์ž์„ ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ Cast ์ „ WaitTargetObject๋ฅผ ํ†ตํ•ด ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์„ ์ˆ˜๋ฝํ•œ๋‹ค๊ณ  ํ•ด์„œ ์„ฑ๊ณต์ ์ธ ํšจ๊ณผ๊ฐ€ ํ™•์ธ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

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

  • spellName - ํ•„์ˆ˜ ๋ผ์ธ - "Heal", "Cure", "Greater Heal"๊ณผ ๊ฐ™์ด ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์ธ ์ฃผ๋ฌธ์˜ ์˜์–ด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„์€ ์ธํ„ฐํŽ˜์ด์Šค์™€ ํ•จ๊ป˜ ๋ฒˆ์—ญ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์ „์€ ๋‚ด์žฅ๋œ ๋ณ„์นญ๊ณผ ์ฒ ์ž ๋‹จ์–ด๋„ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด "29"์„ ํฌํ•จํ•œ ์ˆซ์ž ID, ๋Œ€์ƒ, ๊ฑฐ๋ฆฌ, ์•…๋ช…, maxZ ๋ฐ ๋Œ€๊ธฐ๋Š” Cast ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ชจ๋“  ์ด๋ฆ„ ๋ฐ ํ•™๊ต.

๋ฐ˜ํ™˜๊ฐ’

int: 1/true โ€” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ์ˆ˜๋ฝํ–ˆ์Šต๋‹ˆ๋‹ค. 0/false - ์ด๋ฆ„์ด ์ธ์‹๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์š”์ฒญ์ด ๋กœ์ปฌ์—์„œ ๊ฑฐ๋ถ€๋ฉ๋‹ˆ๋‹ค. if UO.Cast("Heal") { ... }๋ผ๊ณ  ์“ฐ๊ฑฐ๋‚˜ 1/true์™€ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ID ์ฃผ๋ฌธ์ด๋‚˜ ์น˜์œ /ํ”ผํ•ด์˜ ์ฆ๊ฑฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ˆ„๋ฝ๋˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€๋œ ์ธ์ˆ˜๋กœ ์ธํ•ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ฃผ๋ฌธ์˜ ์กฐ์ค€ ๋ฐ ์™„๋ฃŒ๋ฅผ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋‹จ์ผ ํ˜•์‹: UO.Cast(spellName). ๋‘ ๋ฒˆ์งธ ๋˜๋Š” ํ›„์† ์ธ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์ƒ ๊ฒ€์ƒ‰, ์‘๋‹ต ์ค€๋น„, ๋Œ€๊ธฐ, ์‚ญ์ œ๋Š” ๋ณ„๋„์˜ ๋ช…๋ น์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ์ˆ˜๋™์œผ๋กœ ์„ ํƒํ•˜๋ ค๋ฉด ์ด์ „ ๋Œ€๊ธฐ์—ด CancelWaitTarget์„ ์ง€์šฐ๊ณ  Cast์„ ํ˜ธ์ถœํ•œ ๋‹ค์Œ ์‹ญ์ž์„ ์œผ๋กœ ์›ํ•˜๋Š” ๊ฐœ์ฒด๋ฅผ ํด๋ฆญํ•˜์„ธ์š”. Cast ์ž์ฒด๋Š” ๋Œ€๊ธฐ์—ด์„ ์ง€์šฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฏธ๋ฆฌ ๋Œ€๊ธฐ์—ด์„ ์ค€๋น„ํ–ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ž๋™ ๋Œ€์ƒ์˜ ๊ฒฝ์šฐ ๋จผ์ € WaitTargetObject(serial/alias)๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ Cast(์ด๋ฆ„)์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋ฒ„์˜ ๋น ๋ฅธ ์กฐ์ค€์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ”์œ„๊ฐ€ ์—†๋Š” ์ฃผ๋ฌธ์˜ ๊ฒฝ์šฐ ๋‹ต๋ณ€์„ ์ค€๋น„ํ•˜์ง€ ๋งˆ์„ธ์š”.
  • ์„œ๋ฒ„๋Š” ์ฃผ๋ฌธ์˜ ๊ฐ€์šฉ์„ฑ, ์ž์›, ์œ ํšจํ•œ ๋Œ€์ƒ, ๋ฒ”์œ„ ๋ฐ ํšจ๊ณผ๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธ์ •์ ์ธ ๊ฒฐ๊ณผ๋Š” ํ•ด๋‹น ์š”์ฒญ์ด ํ˜„์ง€์—์„œ ์ˆ˜๋ฝ๋˜์—ˆ์Œ์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ค€๋น„๋œ ๋Œ€๊ธฐ์—ด์ด ๋ฌด์ธ ์ƒํƒœ๋กœ ์œ ์ง€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œํ•œ๋œ ๋Œ€๊ธฐ ๋˜๋Š” ๋กœ์ปฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ํ›„์—๋Š” CancelWaitTarget๋ฅผ ์ œ๊ฑฐํ•˜์„ธ์š”. ๋Œ€์ƒ๊ณผ ๋™์‹œ์— ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
  • ์ˆ˜๋ฝ๋œ ์š”์ฒญ์ด TicksSpell๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. Cast๋Š” HP์ด ํ™œ์„ฑํ™”๋˜๊ฑฐ๋‚˜ ์น˜์œ ๋˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์นดํƒˆ๋กœ๊ทธ ID๋Š” ๋‚ด๋ถ€ ํ”„๋กœํ† ์ฝœ์„ ์„ค๋ช…ํ•˜์ง€๋งŒ ์ธ์ˆ˜์˜ ์ด๋ฆ„์„ ๋Œ€์ฒดํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์น˜๋ฃŒ: ๋งˆ์šฐ์Šค๋กœ ๋Œ€์ƒ ์„ ํƒ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์น˜๋ฃŒ๋Š” Cast์— ๋Œ€ํ•œ ์œ ์ผํ•œ ์ฃผ์žฅ์ž…๋‹ˆ๋‹ค. ์‹คํ–‰ ํ›„ ๊ฒŒ์ž„ ์กฐ์ค€๊ฒฝ์„ ์‚ฌ์šฉํ•˜์—ฌ ์บ๋ฆญํ„ฐ๋ฅผ ์„ ํƒํ•˜์„ธ์š”. ์„œ๋ฒ„ ์žฅ์•  ๋ฐ ๊ฒŒ์ž„ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด๋ณด์„ธ์š”.
UO.CancelWaitTarget();
if (Truth(UO.Cast("Cure")))
{
    UO.Print("Choose the character with the spell cursor");
}
else
{
    UO.Print("Cure request rejected");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. ํž๋ง: ์ž์‹ ์„ ์œ„ํ•œ ๋ณ„๋„์˜ ๋Œ€์ƒ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • self โ€” ์ธ์ˆ˜ WaitTargetObject; ์น˜์œ ๋Š” Cast์˜ ์œ ์ผํ•œ ์ฃผ์žฅ์ž…๋‹ˆ๋‹ค. 3000 - ์ด ์˜ˆ์—์„œ๋Š” ์กฐ์ค€ ์‹œ๊ฐ„์ด 3์ดˆ์ด๋ฉฐ, ์น˜์œ  ์™„๋ฃŒ๋ฅผ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ๋‚จ์€ ์‘๋‹ต๊ณผ ์‹คํŒจ ์‹œ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    UO.CancelWaitTarget();
    try
    {
        UO.WaitTargetObject("self");
        if (Truth(UO.Cast("Heal")))
        {
            await Delay(3000);
        }
    }
    finally
    {
        UO.CancelWaitTarget();
    }

    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. ์„ ํƒํ•œ ๋™๋งน์— ๋Œ€ํ•œ ์ „์ฒด ๊ธฐ๋Šฅ - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

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

  • spellName, ๋Œ€์ƒ, cleanupDelayMs - ํ•จ์ˆ˜ CastAtObject์˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ๊ณผ๋ถ€ํ•˜๊ฐ€ ์•„๋‹Œ UO.Cast. ๋‚ด๋ถ€์ ์œผ๋กœ Cast๋Š” spellName๋งŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ASC๋Š” ๋ฌธ์ž์—ด ID์„ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. 4000 โ€” ๋Œ€๊ธฐ์—ด ์‚ญ์ œ ์ง€์—ฐ. true์€ ์น˜๋ฃŒ์˜ ์„ฑ๊ณต์ด ์•„๋‹ˆ๋ผ ์š”์ฒญ์˜ ์ˆ˜๋ฝ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ฃผ๋ฌธ / ์ฃผ๋ฌธ

์ฃผ๋ฌธ/์ฃผ๋ฌธ

return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var target = Asc(UO.GetSerial("lasttarget"), 0);
        if (Truth(await CastAtObject("Greater Heal", target, 4000)))
        {
            UO.Print("Request sent; verify healing in the game");
        }

        return null;
    }

    async Task<dynamic> CastAtObject(dynamic spellName, dynamic target, dynamic cleanupDelayMs)
    {
        if (!(Truth(UO.Connected())) || Truth(UO.Dead()) || Truth(target <= 0) || !(Truth(UO.Exists(target))))
        {
            return false;
        }

        dynamic accepted = false;
        UO.CancelWaitTarget();
        try
        {
            UO.WaitTargetObject(target);
            accepted = UO.Cast(spellName);
            if (Truth(accepted))
            {
                await Delay(cleanupDelayMs);
            }
        }
        finally
        {
            UO.CancelWaitTarget();
        }

        return accepted;
    }

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

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Cast(spellName) โ€” UO.Cast(String)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int Cast(string spellName)

        {

            if (NumberConversions.TryStr2Int((spellName ?? string.Empty).Trim(), out _))

            {

                SystemMessage("UO.Cast: use one spell name, for example UO.Cast(\"Heal\").");

                return 0;

            }

            return CastCore(spellName) ? 1 : 0;

        }

UO.CastAbility

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

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

int UO.CastAbility(object? abilityId);

UseAbility๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ๋ฌด๊ธฐ์˜ ํ˜„์žฌ ์„ ํƒ๋œ ๋Šฅ๋ ฅ์„ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์„ ํƒํ•œ ๋Šฅ๋ ฅ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋ฉด ์„ ํƒ์ด ์ทจ์†Œ๋ฉ๋‹ˆ๋‹ค.

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

  • abilityId โ€” ResolveClassicUOAbilityId๋กœ ํ•ด๊ฒฐ๋˜๋Š” ๋Šฅ๋ ฅ ์ด๋ฆ„ ๋˜๋Š” ๋ฒˆํ˜ธ ๋ฌธ์ž์—ด; ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ’์€ 0๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int 1 โ€” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ˜„์žฌ ๊ธฐ๋ณธ/๋ณด์กฐ ๋Šฅ๋ ฅ์„ ํ˜ธ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค. 0 - ์บ๋ฆญํ„ฐ ์—†์Œ, ์•Œ ์ˆ˜ ์—†์Œ ID ๋˜๋Š” ๋Šฅ๋ ฅ์ด ํ˜„์žฌ ๋ฌด๊ธฐ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • 1๋Š” ์„œ๋ฒ„๊ฐ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์ ์ค‘ํ•˜๊ฑฐ๋‚˜ ์ƒ์‡„ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๋Š” ๊ฒƒ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ฃผ/๋ณด์กฐ ๋Šฅ๋ ฅ์ด ์•„๋‹Œ ID๋Š” ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ์–ด๋„ 0๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • GameActions.UsePrimaryAbility/UseSecondaryAbility 0x80 ๋น„ํŠธ๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ๋น„ํŠธ๊ฐ€ ๊บผ์ง€๋ฉด ๋‹ค๋ฅธ ์˜ต์…˜์„ ์„ ํƒ ์ทจ์†Œํ•˜๊ณ  ์„ ํƒํ•œ ๋Šฅ๋ ฅ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ด๋ฏธ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์œผ๋ฉด ID 0๋ฅผ ๋ณด๋‚ด ๋น„ํ™œ์„ฑํ™”ํ•˜์„ธ์š”. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋น„ํŠธ๊ฐ€ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค. 1๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์ข…๋ฃŒ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ด ํด๋ผ์ด์–ธํŠธ ๋ถ„๊ธฐ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์ด ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

var result = UO.CastAbility(UO.GetAbilityID("Armor Ignore"));
UO.Print("CastAbility: " + Convert.ToString(result));

1. ๋Šฅ๋ ฅ ์ด๋ฆ„ ํ•ด๊ฒฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์นดํƒˆ๋กœ๊ทธ์˜ ๊ฐ€์šฉ์„ฑ์€ ๋ฌด๊ธฐ ๋งค์นญ๊ณผ ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค.
var id = UO.GetAbilityID("Armor Ignore");
if (Truth(id > 0))
{
    var accepted = UO.CastAbility(id);
    UO.Print(Convert.ToString(accepted));
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. ์ด๋ฆ„์œผ๋กœ ๋ถ€๋ฅด๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ด๋ฆ„์€ ID๋กœ ํ™•์ธ๋˜๊ณ  ํ˜„์žฌ ๋ฌด๊ธฐ์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var accepted = UO.CastAbility("Armor Ignore");
    UO.Print(Convert.ToString(accepted));
    return null;
}

3. ์ž˜๋ชป๋œ ID - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • 0์€ ๋””๋ ‰ํ„ฐ๋ฆฌ ์™ธ๋ถ€์— ์žˆ์œผ๋ฉฐ ํ™œ์„ฑํ™” ์—†์ด 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 accepted = UO.CastAbility(0);
        UO.Print(Convert.ToString(accepted));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.CastAbility(abilityId) โ€” UO.CastAbility(Integer)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int UseAbility(int abilityId) => bridge.UseAbility(abilityId);

UO.CastAbility(abilityId) โ€” UO.CastAbility(String)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int UseAbility(string abilityName)

        {

            int abilityId = bridge.ResolveAbility(abilityName);

            return abilityId > 0 ? bridge.UseAbility(abilityId) : 0;

        }

UO.CastToObject

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

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

dynamic UO.CastToObject(object? spellName, object? objID);

๋Œ€๊ธฐ ์ค‘์ธ ๋Œ€์ƒ์„ ๋ฐฐ์น˜ํ•˜๊ณ  ์ด๋ฆ„์ด๋‚˜ ์ˆซ์ž ID๋กœ ์ฃผ๋ฌธ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

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

  • spellName - string ๊ณต๋ฐฑ ๋Œ€์‹  ๋ฐ‘์ค„์„ ํฌํ•จํ•œ ์ฃผ๋ฌธ ์ด๋ฆ„ ๋˜๋Š” ๋ธŒ๋ฆฌ์ง€์˜ ๊ฒฝ์šฐ ์ˆซ์ž ID.Cast.
  • objID โ€” self/backpack/lasttarget/์ €์žฅ๋œ ๊ฐ์ฒด์˜ ๊ฐ์ฒด ์ผ๋ จ๋ฒˆํ˜ธ ๋˜๋Š” ์ง€์›๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ˆซ์ž ๋ฌธ์ž์—ด๊ณผ 0x ๋ฌธ์ž์—ด์€ ๋Ÿฐํƒ€์ž„์— ์˜ํ•ด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int/boolean ๊ฒฐ๊ณผ 1 โ€” ํด๋ผ์ด์–ธํŠธ๊ฐ€ Cast ์š”์ฒญ์„ ์ˆ˜๋ฝํ–ˆ์Šต๋‹ˆ๋‹ค. 0 โ€” ์š”์ฒญ์ด ๊ฑฐ๋ถ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฃผ๋ฌธ์˜ ์„ฑ๊ณต ์—ฌ๋ถ€๋Š” ์„œ๋ฒ„์—์„œ ํ™•์ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋ฌธ์ž์—ด ํ˜•์‹์€ CastAtTarget๋ฅผ ๊ฑฐ์นฉ๋‹ˆ๋‹ค. ์ˆซ์ž ํ˜•์‹์—์„œ๋Š” WaitTargetObject์„ ์ž…๋ ฅํ•œ ๋‹ค์Œ ๋ธŒ๋ฆฌ์ง€Cast๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. Cast๊ฐ€ ์‹คํŒจํ•˜๋ฉด ๋ณด๋ฅ˜ ์ค‘์ธ ๋Œ€์ƒ์ด ์ทจ์†Œ๋ฉ๋‹ˆ๋‹ค. ์Šน์ธ๋˜๋ฉด ticksSpell๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.
  • Bridge๋Š” ๋น„์–‘์„ฑ spellId, ์—ฐ๊ฒฐ ์—†์Œ ๋ฐ ๋ฐ๋“œ ๋ฌธ์ž๋ฅผ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ด๋จธ๋Š” ์บ์ŠคํŠธ์˜ ๋์ด ์•„๋‹ˆ๋ผ ์ „์†ก์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์˜ํ–ฅ์˜ ๊ฒฐ๊ณผ๋Š” ์„œ๋ฒ„์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

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

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

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

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

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

object? result = UO.CastToObject("Heal", "self");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ์ž์‹ ์„ ๋Œ€์ ‘ํ•˜์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • Heal์€ self๋ฅผ ๋‹ค์Œ ์„œ๋ฒ„ ์ปค์„œ์˜ ๋Œ€์ƒ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
var accepted = UO.CastToObject("Heal", "self");
UO.Print(Convert.ToString(accepted));

2. ์ˆซ์ž ID - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ˆซ์ž ํ˜•์‹์€ ID 4๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. 1๋Š” ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var accepted = UO.CastToObject(4, UO.Self());
    UO.Print(Convert.ToString(accepted));
    return null;
}

3. ์„ ํƒํ•œ ๊ฐœ์ฒด ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ๋กœ์ปฌ ์กด์žฌ ํ™•์ธ์€ ๋ˆ„๋ฝ๋œ lasttarget ์‚ฌ์šฉ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์ฃผ๋ฌธ / ์ฃผ๋ฌธ

์ฃผ๋ฌธ/์ฃผ๋ฌธ

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 target = UO.LastTarget();
        if (Truth(UO.Exists(target)))
        {
            var accepted = UO.CastToObject("Greater Heal", target);
            UO.Print(Convert.ToString(accepted));
        }

        return null;
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.CastToObject(spellName, objID) โ€” UO.CastToObject(Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "casttoobject":

                    if (arguments[0].Kind == InjectionValueKind.String)

                        return CastAtTarget(arguments[0], arguments[1]) != 0 ? InjectionValue.True : InjectionValue.False;



                    WaitTargetObject(Arg(1));

                    int castAccepted = bridge.Cast(Arg(0));

                    if (castAccepted != 0)

                    {

                        ticksSpell = Timer();

                        return InjectionValue.True;

                    }



                    bridge.CancelTarget();

                    return InjectionValue.False;

UO.IsActiveSpellAbility

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

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

dynamic UO.IsActiveSpellAbility(object? spellName);

์„œ๋ฒ„๊ฐ€ ์„ ํƒํ•œ ๋Šฅ๋ ฅ/์ฃผ๋ฌธ์˜ ํ™œ์„ฑ ์ƒํƒœ๋ฅผ ๋ณด๊ณ ํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ฑ„๋„๋ง ๋Šฅ๋ ฅ์„ ๋‹ค์‹œ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์ „์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์•„๋ฌด ๊ฒƒ๋„ ์ผœ์ง€์ง€ ์•Š์œผ๋ฉฐ, ๋Œ€์ƒ์„ ์‹œ์ „ํ•˜๊ฑฐ๋‚˜ ์„ ํƒํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.

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

  • spellName - ์œ ์ผํ•œ ํ•„์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜: ์ฒ ์ž ์นดํƒˆ๋กœ๊ทธ์˜ ์˜์–ด ์ด๋ฆ„ ๋˜๋Š” ์ „์ฒด ID. ์˜ˆ๋ฅผ ๋“ค์–ด, "Confidence"์™€ 402๋Š” ๋™์ผํ•œ Bushido ์ฃผ๋ฌธ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋Œ€์†Œ๋ฌธ์ž๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„์˜ ๋ฐ‘์ค„์€ ๊ณต๋ฐฑ์œผ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ์ˆ˜์ง์„ ๋„ ์ธ์‹๋ฉ๋‹ˆ๋‹ค. ID ์บ๋ฆญํ„ฐ, type ์•„์ดํ…œ, ์Šคํ‚ฌ๋ฒˆํ˜ธ๋ฅผ ๋„˜๊ธฐ์ง€ ๋งˆ์„ธ์š”.

๋ฐ˜ํ™˜๊ฐ’

int: 1 - ์„œ๋ฒ„๊ฐ€ ์ด ID์˜ ํ™œ์„ฑ ์ƒํƒœ๋ฅผ ๋ณด๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. 0 - ํ˜„์žฌ๋Š” ๊ทธ๋Ÿฌํ•œ ํ™œ์„ฑ ์ƒํƒœ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. C#์—์„œ ์ˆซ์ž ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค: if (UO.IsActiveSpellAbility(402) != 0) { ... }. ์ด๋Š” ๋งˆ์ง€๋ง‰ ์‹œ์ „ ํšŸ์ˆ˜, ์‹œ๊ฐ„, ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹Œ ๋…ผ๋ฆฌ์  ๊ธฐํ˜ธ์ž…๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„, ID ์™ธ๋ถ€ 1โ€ฆ65535 ๋ฐ ๊ฒฐ๊ณผ ์ƒํƒœ๋„ 0๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋ชฉ๋ก์€ ์„œ๋ฒ„ ํŒจํ‚ค์ง€ 0xBF/0x25๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑํ™”ํ•˜๋ฉด ID๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ , ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”ฝ ์ฐฝ์ด๋‚˜ ํ™”๋ฉด์˜ ๋งž์ถค๋ฒ• ๋ฒ„ํŠผ ์—†์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ฐฝ์„ ๋‹ซ์œผ๋ฉด ์ƒํƒœ๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์„ ๋Š์œผ๋ฉด ์—ฐ๊ฒฐ์ด ์ง€์›Œ์ง‘๋‹ˆ๋‹ค. 0๋ผ๊ณ  ๋Œ€๋‹ตํ•œ๋‹ค๊ณ  ํ•ด์„œ ์บ๋ฆญํ„ฐ๊ฐ€ ์ฃผ๋ฌธ์„ ์‹œ์ „ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์ด ์ƒํƒœ๋ฅผ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋“  ๋ฒ„ํ”„์— ๋Œ€ํ•œ ๋ณดํŽธ์ ์ธ ๊ฒ€์‚ฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ฆ‰์‹œ ์น˜์œ /๊ท€ํ™˜์˜ ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ์˜ˆ์‹œ๋Š” ์‹œ์ „ ์„ฑ๊ณต์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฃผ๋ฌธ์˜ ์ง€์† ์‹œ๊ฐ„, ๋‚จ์€ ๋งˆ๋‚˜, ๊ฐ€์šฉ์„ฑ ๋ฐ ์„ฑ๊ณต ์—ฌ๋ถ€๋Š” ์ด ๋ช…๋ น์— ์˜ํ•ด ๊ฒฐ์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

object? result = UO.IsActiveSpellAbility(402);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ID๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ ํ™•์ธ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • 402 - ID ์ž์‹ ๊ฐ. ํ™œ์„ฑ ๋ณ€์ˆ˜์—๋Š” 1 ๋˜๋Š” 0๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ true์€ 1์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€๋Š” ์บ์ŠคํŠธ ์‹œ๋„์˜ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹ˆ๋ผ ์ˆ˜์‹ ๋œ ์ƒํƒœ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
var active = UO.IsActiveSpellAbility(402);
if (Truth(Truth(active) == true))
{
    UO.Print("Confidence is active");
}
else
{
    UO.Print("No active Confidence state received");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. ์•กํ‹ฐ๋ธŒ ๋Šฅ๋ ฅ์„ ๋ฐ˜๋ณตํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • "์‹ ๋ขฐ" - ๋™์ผ ID 402. Cast ์ด๋ฆ„๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑ ์ƒํƒœ๊ฐ€ ์—†์œผ๋ฉด ์š”์ฒญ์ด ํ•œ ๋ฒˆ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ์˜ ์„ฑ๊ณต์„ ๋ณด์žฅํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋น ๋ฅธ ๋ฃจํ”„์—์„œ ์ด ์ฝ”๋“œ ์กฐ๊ฐ์„ ์‹คํ–‰ํ•˜์ง€ ๋งˆ์„ธ์š”. ์„œ๋ฒ„ ์‘๋‹ต์ด ์ง€์—ฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.IsActiveSpellAbility("Confidence") == 0))
    {
        UO.Cast("Confidence");
    }

    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. ์ œํ•œ์ด ์žˆ๋Š” ์Šน์ธ ๋Œ€๊ธฐ ์ค‘ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ฒ ์ž - ์ด๋ฆ„ ๋˜๋Š” ID; ์˜ˆ์ƒ โ€” true ์ผœ๊ธฐ, false ๋„๊ธฐ; timeoutMs โ€” ๋Œ€๊ธฐ ์ œํ•œ(๋ฐ€๋ฆฌ์ดˆ). Main์€ 25ms๋งˆ๋‹ค ํ™•์ธํ•˜์—ฌ 500ms๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ์•„๋ฌด๊ฒƒ๋„ ์ „์†กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์žˆ์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ง€๋ฐฉ์ •๋ถ€์˜ ์ œํ•œ๋œ ๊ธฐ๋Œ€์ผ ๋ฟ, ๋ณ€๊ฒฝ ์ด์œ ๋ฅผ ์ž…์ฆํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ผ์‹œ ์ค‘์ง€๋˜๊ฑฐ๋‚˜ ๋กœ๋“œ ์ค‘์ธ ๊ฒฝ์šฐ ์‹ค์ œ ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ๋ฌธ / ์ฃผ๋ฌธ

์ฃผ๋ฌธ/์ฃผ๋ฌธ

return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(WaitAbilityState("Confidence", true, 500)))
        {
            UO.Print("Active state received");
        }
        else
        {
            UO.Print("No active state before timeout");
        }

        return null;
    }

    dynamic WaitAbilityState(dynamic spell, dynamic expected, dynamic timeoutMs)
    {
        var elapsed = 0;
        while (Truth(elapsed < timeoutMs))
        {
            if (Truth((UO.IsActiveSpellAbility(spell) == 1) == expected))
            {
                return true;
            }

            UO.Wait(25);
            elapsed = elapsed + 25;
        }

        return Truth((UO.IsActiveSpellAbility(spell) == 1) == expected);
    }

    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.IsActiveSpellAbility(spellName) โ€” UO.IsActiveSpellAbility(Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "isactivespellability":

                {

                    int? spellId = arguments[0].Kind == InjectionValueKind.String

                        ? ConvertSpellName(Text(0).Replace('_', ' '))

                        : (int?)Arg(0);

                    return new InjectionValue(spellId.HasValue ? bridge.IsActiveSpell(spellId.Value) : 0);

                }

UO.TicksSpell

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

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

int UO.TicksSpell();

์ €์žฅ๋œ ๋งˆํฌ TicksSpell๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int โ€” ๋Ÿฐํƒ€์ž„ ์‹œ์ž‘๋ถ€ํ„ฐ 10๋ถ„์˜ 1์ดˆ ์•ˆ์— UO.Timer๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. 0 - ๋งˆํฌ๊ฐ€ ์•„์ง ์„ค์ •๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ์ฒ˜์Œ 10๋ถ„์˜ 1์ดˆ์— ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ€๋ฆฌ์ดˆ๋‚˜ ๋‹ฌ๋ ฅ ์‹œ๊ฐ„์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ticksSpell ํ•„๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜๋ฝ๋œ Cast/CastAtTarget์— ์˜ํ•ด ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ˆ˜๋™/์„œ๋ฒ„ ํ™œ๋™์„ ์ž๋™์œผ๋กœ ๊ด€์ฐฐํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ช…๋ น ์ž์ฒด๋Š” ํ‘œ์‹œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • UO.Timer() - ์ด ํ‘œ์‹œ๋Š” 10๋ถ„์˜ 1์ดˆ ๋‹จ์œ„๋กœ ๋‚˜์ด๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๋งˆํฌ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋Ÿฐํƒ€์ž„ ๊ฐ„์— ๋น„๊ต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ์ €์žฅ๋œ ๋งˆํฌ TicksSpell๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
var stamp = UO.TicksSpell();
UO.Print(stamp);

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

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

  • ticksSpell ํ•„๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜๋ฝ๋œ Cast/CastAtTarget์— ์˜ํ•ด ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ˆ˜๋™/์„œ๋ฒ„ ํ™œ๋™์„ ์ž๋™์œผ๋กœ ๊ด€์ฐฐํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ช…๋ น ์ž์ฒด๋Š” ํ‘œ์‹œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var stamp = UO.TicksSpell();
    var ageTenths = UO.Timer() - stamp;
    UO.Print(ageTenths);
    return null;
}

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

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

  • UO.Timer() - ์ด ํ‘œ์‹œ๋Š” 10๋ถ„์˜ 1์ดˆ ๋‹จ์œ„๋กœ ๋‚˜์ด๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๋งˆํฌ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋Ÿฐํƒ€์ž„ ๊ฐ„์— ๋น„๊ต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฃผ๋ฌธ / ์ฃผ๋ฌธ

์ฃผ๋ฌธ/์ฃผ๋ฌธ

return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var before = UO.TicksSpell();
        UO.Wait(250);
        var after = UO.TicksSpell();
        UO.Print(before = after);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.TicksSpell() โ€” UO.TicksSpell()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int TicksSpell() => ticksSpell;
โš ๏ธ **GitHub.com Fallback** โš ๏ธ