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

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

์ „ํˆฌ

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

๊ณต๊ฒฉ, ์ „ํˆฌ ๋ชจ๋“œ, ๋ฌด๊ธฐ ๋Šฅ๋ ฅ ๋ฐ ๋ถ•๋Œ€ ์น˜์œ . ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ๊ณผ ์„œ๋ฒ„๊ฐ€ ์ทจํ•˜๋Š” ์กฐ์น˜๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์„น์…˜

์ฃผ์ œ ๋ช…๋ น ๋ฐ ์„ค๋ช…
Attack UO.Attack
AttackNearest UO.AttackNearest
LastAttack UO.LastAttack
WarMode UO.WarMode
WarTarget UO.WarTargetID
๋ฌด๊ธฐ ๋Šฅ๋ ฅ UO.GetWeaponAbilities ยท UO.GetAbilityID ยท UO.GetAbilityName ยท UO.GetActiveAbility
Primary Ability UO.UsePrimaryAbility
Secondary Ability UO.UseSecondaryAbility
Special Moves UO.Specmove
BandageSelf UO.BandageSelf

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

Attack

UO.Attack ยท UO.AttackNearest ยท UO.LastAttack ยท UO.WarMode ยท UO.IsWarMode ยท UO.SetWarMode ยท UO.WarTargetID

๋ฌด๊ธฐ ๋Šฅ๋ ฅ

UO.GetWeaponAbilities ยท UO.GetAbilityID ยท UO.GetAbilityName ยท UO.GetActiveAbility ยท UO.UseAbility ยท UO.UsePrimaryAbility ยท UO.UseSecondaryAbility ยท UO.Specmove

BandageSelf

UO.BandageSelf

๋งž์ถคํ˜• ์žฅ๋น„ ๋“ฑ๊ธ‰

UO.SetClassMask ยท UO.ClearClassMask ยท UO.AttackNearest

๊ทธ๋ฃน์˜ ์ด๋ฆ„๊ณผ ์ฐฉ์šฉํ•˜๋Š” ์•„์ดํ…œ์˜ ์œ ํ˜•์€ ์Šคํฌ๋ฆฝํŠธ์— ์˜ํ•ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค. |๊นŒ์ง€์˜ ์ด๋ฆ„ ์ˆœ์„œ์— ๋”ฐ๋ผ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์ง€์ •๋ฉ๋‹ˆ๋‹ค.

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

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

UO.Attack

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

var selected = UO.LastTarget();
var allowed = UO.GetMobiles(10, "5|6", -1, 8, false, false, true, true);
var i = 0;
while (Truth(i < ArrayLength(allowed)))
{
    if (Truth(allowed[i] == selected))
    {
        UO.Attack(selected);
        return null;
    }
    i += 1;
}
UO.Print("Selected target does not pass the filters");

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;

UO.GetWeaponAbilities

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

var abilities = UO.GetWeaponAbilities();
UO.Print(UO.GetArrayLength(abilities));

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


UO.Attack

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

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

void UO.Attack(object? objID);

ํŠน์ • serial์— ๊ณต๊ฒฉ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ ๋Œ€์ƒ์„ ์„ ํƒํ–ˆ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ํŒ€์—์„œ ์ฐพ์€ ๊ฒฝ์šฐ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์˜๋ฅ˜/๊ฑฐ๋ฆฌ์— ๋”ฐ๋ฅธ ๋…๋ฆฝ์ ์ธ ๊ฒ€์ƒ‰์ด ์—†์Šต๋‹ˆ๋‹ค.

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

  • objID โ€” ์ง๋ ฌ mobile: int, 10์ง„์ˆ˜/16์ง„์ˆ˜ ๋ฌธ์ž์—ด ๋˜๋Š” ํ™•์ธ ๊ฐ€๋Šฅํ•œ ๊ฐœ์ฒด ์ด๋ฆ„(์˜ˆ: lasttarget ๋˜๋Š” ์ด๋ฆ„ AddObject). graphic/type ๋˜๋Š” ํด๋ž˜์Šค ์ด๋ฆ„์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ•„์ˆ˜ ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค. 0์€ ์‹ธ์›€์„ ๋ฉˆ์ถ”๋ผ๋Š” ๋ช…๋ น์ด ์•„๋‹™๋‹ˆ๋‹ค. ID ์—†์ด ๋Œ€์ƒ์„ ์„ ํƒํ•˜๋ ค๋ฉด ๊ฒ€์ƒ‰ ๋˜๋Š” ๊ฒŒ์ž„ ๋Œ€์ƒ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋ฐ˜ํ™˜๊ฐ’

void - ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. var result=UO.Attack(...)๊ฐ€ ์•„๋‹Œ UO.Attack(enemy)๋ฅผ ๋ณ„๋„์˜ ์ค„์— ์ž‘์„ฑํ•˜์„ธ์š”. ํ†ตํ™”๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค๊ณ  ํ•ด์„œ ํžˆํŠธ, ์†์ƒ ๋˜๋Š” ์„œ๋ฒ„ ์Šน์ธ์ด ํ™•์ธ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋„์ „ ์ž์ฒด๋Š” ์ฃฝ๊ฑฐ๋‚˜, ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ๊ฑฐ๋‚˜, self, ์•„๊ตฐ, ๋นˆ serial ๋˜๋Š” ์•„์ดํ…œ์„ ๋ฐ€์–ด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ ํƒํ•œ ๋Œ€์ƒ์„ ํ™•์ธํ•˜์„ธ์š”. ๋ฐ”๋žŒ์งํ•˜๊ฒŒ๋Š” GetMobiles/FindMan์—์„œ mobile๋ฅผ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.
  • ํ‘œ์ค€ GameActions.Attack๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. EnabledCriminalActionQuery๋ฅผ ์‚ฌ์šฉํ•œ ๋ฒ”์ฃ„ ๊ณต๊ฒฉ ๋ฌธ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ •์ƒ์ ์œผ๋กœ ์ง„ํ–‰๋˜๋ฉด LastAttack/NewTargetSystemSerial๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๊ณ  ๊ณต๊ฒฉ ์š”์ฒญ ํŒจํ‚ท์ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์€ WarMode๋ฅผ ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š๊ณ , ๋งˆ์šฐ์Šค๋ฅผ ๋”๋ธ” ํด๋ฆญํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐํ•˜๊ฑฐ๋‚˜ ๋ฐ˜๋ณต ๊ณต๊ฒฉ ๋ฃจํ”„๋ฅผ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ „ํˆฌ ๋ชจ๋“œ์™€ ์ดํ›„ ์ „ํˆฌ ์ฒ˜๋ฆฌ๋Š” ์„œ๋ฒ„์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
  • ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋ฌธ์ž์—ด์˜ ๊ฒฝ์šฐ ํ™•์ธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Exists ํ…Œ์ŠคํŠธ๋Š” ๊ฐ์ฒด์˜ ์กด์žฌ๋ฅผ ์ฆ๋ช…ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด mobile์ธ์ง€๋Š” ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. GetMobiles๋Š” ๋ชจ๋ฐ”์ผ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.Attack");
UO.Attack(UO.LastTarget());

1. ํ™•์ธ ํ›„ ๋งˆ์ง€๋ง‰์œผ๋กœ ์„ ํƒํ•œ ๋ผ์ด๋ธŒ ํƒ€๊ฒŸ ๊ณต๊ฒฉ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • lasttarget๋Š” ์•„์ดํ…œ์ผ ์ˆ˜๋„ ์žˆ๊ณ  ์นœ๊ทผํ•œ ์บ๋ฆญํ„ฐ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ—ˆ์šฉ ๋ชฉ๋ก์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. Attack์€ ์ตœ๋Œ€ ํ•œ ๋ฒˆ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
var selected = UO.LastTarget();
var allowed = UO.GetMobiles(10, "5|6", -1, 8, false, false, true, true);
var i = 0;
while (Truth(i < ArrayLength(allowed)))
{
    if (Truth(allowed[i] == selected))
    {
        UO.Attack(selected);
        return null;
    }
    i += 1;
}
UO.Print("Selected target does not pass the filters");

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;

2. ์ ์„ ๋จผ์ € ์ฐพ์€ ํ›„ ๊ณ ๋„๊ฐ€ ๊ฐ€๋Šฅํ•  ๋•Œ ๊ณต๊ฒฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • FindMan๋Š” serial๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๊ณต๊ฒฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. FindMan์—๋Š” aliveOnly๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— IsDead ๊ฒ€์‚ฌ๊ฐ€ ๋ณ„๋„๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var enemy = UO.FindMan(5, 6, true, 4, -1, -1, false);
    if (Truth(enemy == 0))
    {
        return null;
    }

    if (Truth(UO.IsDead(enemy) == 0))
    {
        UO.AddObject("enemy", enemy);
        UO.Attack(enemy);
    }

    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. ๋ณ„๋„์˜ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋Œ€์ƒ - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

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

  • GetMobiles๋Š” ์ด๋ฏธ Nearest=true๋กœ ์ฃผ๋ฌธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ชฉํ‘œ ์•ž์— ๋ฒฝ์ด ์žˆ์œผ๋ฉด ๋‹ค์Œ ๋ชฉํ‘œ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. visibleOnly์˜ ์กด์žฌ ์ž์ฒด๊ฐ€ CheckLOS๋ฅผ ๋Œ€์ฒดํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ํ™•์ธ์€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
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 targets = UO.GetMobiles(8, 5, -1, 10, true, false, true, true);
        var i = 0;
        while (Truth(i < ArrayLength(targets)))
        {
            var enemy = targets[i];
            if (Truth(UO.CheckLOS(UO.GetX("self"), UO.GetY("self"), UO.GetZ("self"), UO.GetX(enemy), UO.GetY(enemy), UO.GetZ(enemy), UO.WorldNum())))
            {
                UO.Attack(enemy);
                return null;
            }

            i += 1;
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "attack": bridge.Attack(Arg(0)); return InjectionValue.Unit;

UO.Attack(objID) โ€” UO.Attack(Integer)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void Attack(int id) => bridge.Attack(id);

UO.Attack(objID) โ€” UO.Attack(String)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void Attack(string id) => Attack(GetObject(id));

UO.AttackNearest

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

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

int UO.AttackNearest(object? notoriety);
int UO.AttackNearest(object? notoriety, object? distance);
int UO.AttackNearest(object? notoriety, object? distance, object? body);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color, object? classMask);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color, object? classMask, object? aliveOnly);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color, object? classMask, object? aliveOnly, object? visibleOnly);

ํ•˜๋‚˜์˜ ์ ํ•ฉํ•œ ์ „ํˆฌ ๋Œ€์ƒ์„ ์„ ํƒํ•˜๊ณ  ์ด๋ฅผ ๊ณต๊ฒฉ ์ฒ˜๋ฆฌ์ž์—๊ฒŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํ•„ํ„ฐ๋Š” ํ—ˆ์šฉ๋˜๋Š” ๋ฌธ์ž๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. custom classMask๋Š” ์žฅ๋น„์™€ ํด๋ž˜์Šค ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํด๋ž˜์Šค ๋‚ด ์„ ํƒ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

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

  • notoriety โ€” ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ์บ๋ฆญํ„ฐ์™€์˜ ๊ด€๊ณ„ ์ƒํƒœ: 0 โ€” ์•Œ ์ˆ˜ ์—†์Œ, 1 โ€” ๋ฌด์ฃ„, 2 โ€” ๋™๋งน, 3 โ€” ํšŒ์ƒ‰, 4 โ€” ๋ฒ”์ฃ„, 5 โ€” ์ , 6 โ€” ์‚ด์ธ์ž, 7 - ๋ฌด์ ์ž…๋‹ˆ๋‹ค. ์ˆซ์ž๋Š” ํ•˜๋‚˜์˜ ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. "5|6" ๋˜๋Š” ์ˆซ์ž ๋ฐฐ์—ด - ์œ„ ํ•ญ๋ชฉ ์ค‘ ํ•˜๋‚˜. ์˜ท์˜ ์ƒ‰๊น”์ด๋‚˜ ์ˆ˜์—…์˜ ์ƒ‰๊น”์ด ์•„๋‹™๋‹ˆ๋‹ค. ์Œ์ˆ˜(๋ณดํ†ต -1), 0xFFFF, "any", ๋นˆ ๋ฌธ์ž์—ด ๋˜๋Š” ๋นˆ ๋ฐฐ์—ด์€ ์ด ํ•„ํ„ฐ๋ฅผ ๋ณ„๋„๋กœ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์œ ํšจํ•œ ์ˆซ์ž๊ฐ€ ์—†๋Š” ์ž˜๋ชป๋œ ๋ฌธ์ž์—ด์€ ๋ˆ„๊ตฌ๋„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ƒํƒœ ์ˆœ์„œ์— ๋”ฐ๋ผ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 5 ํ•„ํ„ฐ๋Š” NPC/๋ชฌ์Šคํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ์„ ํƒํ•˜๋Š” ๋Œ€์‹  ์ ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๊ฐ’์€ ์„œ๋ฒ„์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
  • distance โ€” ์…€์„ ํฌํ•จํ•œ ์ˆ˜ํ‰ ๋ฐ˜๊ฒฝ: 5๋Š” ๊ฑฐ๋ฆฌ 0..5๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ฆฌ๋Š” max(abs(dx),abs(dy))์ด๋ฏ€๋กœ ์ธ์ ‘ํ•œ ๋Œ€๊ฐ์„ ๋„ 1์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆซ์ž๊ฐ€ ์Œ์ˆ˜์ธ ๊ฒฝ์šฐ์—๋Š” ๋ฌด์ œํ•œ ๊ฒ€์ƒ‰์ด ์•„๋‹Œ UO.FindDistance()์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. 0๋Š” ๋™์ผํ•œ X/Y ์…€์„ ๋‚จ๊น๋‹ˆ๋‹ค. ๊ฒฝ๋กœ์˜ ๊ธธ์ด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์žฅ์• ๋ฌผ๊ณผ ๋ฐ”๋‹ฅ์€ ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ™•์ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • body - ํŠน์ • ์บ๋ฆญํ„ฐ์˜ ID๋‚˜ ์ฐฉ์šฉํ•œ ๊ฐ‘์˜ท์˜ type๊ฐ€ ์•„๋‹Œ ์บ๋ฆญํ„ฐ์˜ ์‹ ์ฒด/NPC ๊ทธ๋ž˜ํ”ฝ์ž…๋‹ˆ๋‹ค. ์ˆซ์ž, 16์ง„์ˆ˜ ๋ฌธ์ž์—ด, ๋ฌธ์ž์—ด "0x0190|0x0191" ๋˜๋Š” ์ˆซ์ž ๋ฐฐ์—ด. 0x0190 (400) - ์ธ๊ฐ„ ๋‚จ์„ฑ; 0x0191 (401) - ์—ฌ์„ฑ ์ธ๊ฐ„. ๋งˆ์Šคํฌ๋Š” ๋‘ ๋ชธ์„ ํ•˜๋‚˜๋กœ ๋ฌถ์Šต๋‹ˆ๋‹ค. ๋ชฉ๋ก์—๋Š” ๋‹ค๋ฅธ ์ข…์กฑ, ์œ ๋ น ๋˜๋Š” ๋ณ€์‹ ์ด ์ž๋™์œผ๋กœ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ‘œ์ค€ ๊ทธ๋ž˜ํ”ฝ ์‹ ์ฒด ์œ ํ˜• ํ‘œ. ์Œ์ˆ˜(๊ธฐ๋ณธ์ ์œผ๋กœ -1), 0xFFFF, "any", ๋นˆ ๋ฌธ์ž์—ด ๋˜๋Š” ๋นˆ ๋ฐฐ์—ด๋งŒ - ๋ชจ๋“  ๋ณธ๋ฌธ. ์œ ํšจํ•œ ์ˆซ์ž๊ฐ€ ์—†๋Š” ์•Œ ์ˆ˜ ์—†๋Š” ํ…์ŠคํŠธ๋Š” ๋นˆ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • maxZ โ€” ์ตœ๋Œ€ ๋ณต๊ทผ(Z ๋Œ€์ƒ - ์บ๋ฆญํ„ฐ์˜ Z)์„ ํฌํ•จํ•˜๋ฉฐ, Z ์„ธ๊ณ„ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ธต์ˆ˜๋‚˜ ์…€์ˆ˜ X/Y๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. maxZ=4 Z ํ”Œ๋ ˆ์ด์–ด 10๋Š” Z ๋Œ€์ƒ 6..14๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. 0์—๋Š” ์ •ํ™•ํžˆ ๋™์ผํ•œ ๋†’์ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ/์Œ์ˆ˜์˜ ๊ฒฝ์šฐ UO.FindVertical()๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ณ„๋‹จ์—์„œ๋Š” Z๋กœ ์›ํ•˜๋Š” ๋Œ€์ƒ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์€ ์ฐจ์ด Z๋„ ๋ฐ”๋‹ฅ์˜ ์ ‘๊ทผ์„ฑ์„ ์ž…์ฆํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
  • nearest - true/1๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ผ์น˜ ๋ฌธ์ž๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋” ์ž‘์€ serial๋กœ ๋™์ผํ•œ ๊ฑฐ๋ฆฌ๊ฐ€ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. false/0 ํด๋ผ์ด์–ธํŠธ ๋ชฉ๋ก ์ˆœ์„œ์—์„œ ์ฒซ ๋ฒˆ์งธ๋กœ ์ผ์น˜ํ•˜๋Š” ๊ฐœ์ฒด๋ฅผ ์œ ์ง€ํ•˜๊ณ  ๊ฐ€์žฅ ๋จผ ๊ฐœ์ฒด๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. classMask์—์„œ๋Š” ํด๋ž˜์Šค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋จผ์ € ์ ์šฉ๋˜๊ณ  ํด๋ž˜์Šค ๋‚ด ๊ฑฐ๋ฆฌ๊ฐ€ ๊ทธ ๋‹ค์Œ์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • color โ€” mobile ์ž์ฒด์˜ ์ƒ‰์ƒ: int ๋˜๋Š” ์ˆซ์ž/16์ง„์ˆ˜ ๋ฌธ์ž์—ด. ์Œ์ˆ˜(๊ธฐ๋ณธ์ ์œผ๋กœ -1) ๋ฐ 0xFFFF - ๋ชจ๋“  hue; 0์€ ์ •ํ™•ํžˆ hue 0์ด๋ฉฐ ์–ด๋–ค ๊ฐ’๋„ ์•„๋‹™๋‹ˆ๋‹ค. ์•…๋ช… ๋†’์€ ์ŠคํŠธ๋ฆฝ์˜ ์ƒ‰์ƒ์ด๋‚˜ ์˜ท์˜ ์ƒ‰์ƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ฐฉ์šฉ ์ค‘์ธ ์•„์ดํ…œ์˜ ์ƒ‰์ƒ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • classMask โ€” ๋™์ผํ•œ ์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„์—์„œ UO.SetClassMask์— ์˜ํ•ด ์‚ฌ์ „ ์ •์˜๋œ ๊ทœ์น™์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "DTMH|hunter|spare" - ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ๋ฐฐ์—ด๋„ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ด๋ฆ„, ๋Œ€์†Œ๋ฌธ์ž๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ค„ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ: |, ์‰ผํ‘œ ๋˜๋Š” ;. ๋ชฉ๋ก ๋‚ด์˜ ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„/๋นˆ ์š”์†Œ๋Š” ์ „์ฒด ์„ ํƒ์„ ์„ ํƒ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” 0, ๊ณต๊ฒฉ ์—†์Œ. ์ด๋Š” ์ˆซ์ž ๋น„ํŠธ๋งˆ์Šคํฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. 7๋Š” ์„ธ ๊ฐ€์ง€ ํด๋ž˜์Šค๋ฅผ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ˆ„๋ฝ๋œ ์ธ์ˆ˜, -1, "-1", "any", "all" ๋˜๋Š” ๋นˆ ๋ฌธ์ž์—ด์€ ํด๋ž˜์Šค ํ•„ํ„ฐ๋ฅผ ๋ณ„๋„๋กœ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ๋ฒ•์‚ฌ/ํƒฑํฌ/๊ถ์ˆ˜๋Š” ๋‚ด์žฅ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ทœ์น™์„ ๋“ฑ๋กํ•˜์ง€ ์•Š์œผ๋ฉด ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • aliveOnly - true/1๋Š” IsDead != 0์ธ ๋ชจ๋ฐ”์ผ์„ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. false/0๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. HP๋ฅผ 0๊ณผ ๋น„๊ตํ•˜์ง€ ์•Š๊ณ , ์‹œ์ฒด ์•„์ดํ…œ์„ ๊ฒ€์ƒ‰ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋Œ€์ƒ์ด ์†Œํ™˜๋œ ํ›„์—๋„ ์‚ด์•„๋‚จ์„ ๊ฒƒ์ด๋ผ๊ณ  ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • visibleOnly - true/1์—๋Š” ํ˜„์žฌ ์ƒํƒœ ClassicUO์— ๋”ฐ๋ผ IsVisible=1๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. false/0๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฒฝ/์‹œ์„  ๊ฒ€์‚ฌ๊ฐ€ ์•„๋‹Œ ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ๋กœ๋“œ๋œ ๊ฐ์ฒด์˜ ๊ฐ€์‹œ์„ฑ์ž…๋‹ˆ๋‹ค. ๊ธฐํ•˜ํ•™์  ๊ฒ€์‚ฌ๋ฅผ ์œ„ํ•ด ์ขŒํ‘œ๊ฐ€ ํฌํ•จ๋œ ๋ณ„๋„์˜ UO.CheckLOS๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์—ฌ์ „ํžˆ ์ž‘์—…์„ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int - serial๊ฐ€ ์„ ํƒ๋จ mobile ๋˜๋Š” ์ ํ•ฉํ•œ ๋Œ€์ƒ์ด ์—†๊ฑฐ๋‚˜ classMask๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ 0. ์ด๊ฒƒ์€ 1/0 ํ”Œ๋ž˜๊ทธ๋„ ์•„๋‹ˆ๊ณ , body/type ํ”Œ๋ž˜๊ทธ๋„ ์•„๋‹ˆ๋ฉฐ, ๊ฑฐ๋ฆฌ๋‚˜ ํƒ€๊ฒฉ ํ™•์ธ๋„ ์•„๋‹™๋‹ˆ๋‹ค. ์ ์„ ํ™•์ธํ•˜์„ธ์š” != 0; ์  == true์€ C#์—์„œ๋Š” ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. int๋Š” bool์™€ ๋น„๊ต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ID๊ฐ€ 0์ด ์•„๋‹Œ ๊ฒฝ์šฐ ClassicUO ํ•ธ๋“ค๋Ÿฌ๋Š” ์—ฌ์ „ํžˆ ๋ฌด๊ณ ํ•œ ๊ณต๊ฒฉ์— ๋Œ€ํ•œ ํ™•์ธ์„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ์ž‘์—…์„ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ง€์—ญ ๊ฒ€์ƒ‰: ์ด๋ฏธ ๋‹ค์šด๋กœ๋“œํ•œ ๋ชจ๋ฐ”์ผ์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. Ignore์ด ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค. self๋Š” ์ง€์›ํ•˜๋Š” ๋ช…๋ น์—์„œ ๋ช…์‹œ์ ์œผ๋กœ includeSelf=true๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์™€ ์•„์ดํ…œ์€ ๋ชจ๋ฐ”์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • ์กฐ๊ฑด์ด ํ•จ๊ป˜ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค(AND). body/notoriety ๋‚ด์˜ ์œ ํšจํ•œ ๋Œ€์•ˆ์€ OR๋ฅผ ํ†ตํ•ด ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค. FindItem, FindCount ๋ฐ GetFoundItems์—์„œ๋Š” ๊ฒ€์ƒ‰์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • body/notoriety์—์„œ ์œ ํšจํ•œ ์ˆซ์ž๊ฐ€ ์žˆ๋Š” ๋งˆ์Šคํฌ๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. "any|5"๋Š” ์—ฌ์ „ํžˆ 5๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ์œ ํšจํ•œ ์ˆซ์ž ์˜†์— ์žˆ๋Š” ๊ณต๋ฐฑ/์ž˜๋ชป๋œ ์š”์†Œ๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ์ œํ•œ์ด ์—†์œผ๋ฉด -1๋ฅผ ๋ณ„๋„๋กœ ์ „๋‹ฌํ•˜์„ธ์š”. ์ด ๊ทœ์น™์„ classMask์— ์ ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ์•Œ ์ˆ˜ ์—†๋Š” ํด๋ž˜์Šค ์ด๋ฆ„์€ ์ „์ฒด ๋ชฉ๋ก์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.
  • ํŒ€์€ ์„ธ๊ณ„์˜ ์˜์—ญ์„ ์—ด์ง€ ์•Š์œผ๋ฉฐ ๋ชฉํ‘œ๋ฅผ ํ–ฅํ•ด ๋‹ฌ๋ฆฌ์ง€ ์•Š์œผ๋ฉฐ ๊ฒฝ๋กœ์˜ ํ†ต๊ณผ ๊ฐ€๋Šฅ์„ฑ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ ํƒ๊ณผ ์„œ๋ฒ„ ์ฒ˜๋ฆฌ ์‚ฌ์ด์— ์„ธ์ƒ์˜ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€” ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • true ๋ฐ 1์˜ ์ „์†ก์€ ํ”Œ๋ž˜๊ทธ false ๋ฐ 0์—๋„ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์ˆซ์ž๋„ true๋กœ ๋ณ€ํ™˜๋˜์ง€๋งŒ 8/9๋Š” ๋ณ„๋„์˜ ๋ชจ๋“œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํด๋ฆฌ์–ด true/false๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ์ด๋ฆ„์€ ์„œ๋ฒ„ ์ง์—…์ด ์•„๋‹Œ ์ปค์Šคํ…€ ๋ผ๋ฒจ์ž…๋‹ˆ๋‹ค. ๊ทœ์น™์„ DTMH, my_group ๋˜๋Š” ๋‹ค๋ฅธ ๋‹จ์–ด๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—”์ง„์€ ์„œ๋ฒ„์˜ ์Šคํ‚ฌ/ํด๋ž˜์Šค๋ฅผ ์บ๋ฆญํ„ฐ ์ด๋ฆ„์œผ๋กœ ๊ฒฐ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ•„์ˆ˜์—์„œ ํ•˜๋‚˜์˜ type ๋˜๋Š” ํ‰๋ฉด ๋ฐฐ์—ด์€ ๋ชฉ๋ก์—์„œ ์ตœ์†Œํ•œ ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฃน ๋ฐฐ์—ด์ด๋ž€ ๊ฐ ๊ทธ๋ฃน์—์„œ ์ตœ์†Œํ•œ ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ์ด ํ•„์š”ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, [leather, staves]์—๋Š” ๊ฐ€์ฃฝ๊ณผ ์ง€ํŒก์ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋Œ€์•ˆ ์„ธํŠธ์ด๋ฉฐ ๋‚˜์—ด๋œ ์˜ท์žฅ ์ „์ฒด๋ฅผ ์ฐฉ์šฉํ•ด์•ผ ํ•˜๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ๊ธˆ์ง€๋œ ํ•ญ๋ชฉ์„ ์ฐฉ์šฉํ•œ ๋ชจ๋“  ํ•ญ๋ชฉ์€ ํ•„์ˆ˜ ํ•ญ๋ชฉ์ด ์ถฉ์กฑ๋˜๋”๋ผ๋„ ์ด ๊ทœ์น™์—์„œ ์บ๋ฆญํ„ฐ๋ฅผ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ฃฝ๊ณผ ๊ธˆ์ง€๋œ ์ฒด์ธ์€ ๊ฐ€์ฃฝ ๊ทœ์ •์„ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ทœ์น™์€ ๊ณ„์† ํ…Œ์ŠคํŠธ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐฐ๋‚ญ 21์„ ์ œ์™ธํ•˜๊ณ  ๋ ˆ์ด์–ด 1..24์— ์ฐฉ์šฉํ•œ ์•„์ดํ…œ๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋ฐฐ๋‚ญ/๊ฐ€์Šด, ๋งˆ์šดํŠธ 25, ํƒ„์ฐฝ 26..28 ๋ฐ ์€ํ–‰ 29์˜ ๋‚ด์šฉ๋ฌผ์€ ์˜๋ฅ˜๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. graphic/type๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. serial, ์ด๋ฆ„ ๋ฐ hue ํ•ญ๋ชฉ์€ ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ ์ ˆํ•œ ์žฅ๋น„๊ฐ€ ๋กœ๋“œ๋˜์ง€ ์•Š์œผ๋ฉด ๋ชฉ๋ก์ด ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ์•„์ง ์žฅ๋น„๋ฅผ ์ „์†กํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ์— ๊ธˆ์ง€ ํ•ญ๋ชฉ์ด ์—†๋‹ค๊ณ  ํ•ด์„œ ์„œ๋ฒ„์— ํ•ด๋‹น ํ•ญ๋ชฉ์ด ์—†์Œ์„ ์ฆ๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ˆจ๊ฒจ์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ธกํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ทœ์น™์€ ํ•ด๋‹น ๊ธฐ๋Šฅ๊ณผ ํฌํ•จ์„ ํฌํ•จํ•˜์—ฌ ํ•˜๋‚˜์˜ ๋Ÿฐํƒ€์ž„ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋…๋ฆฝ์ ์ธ ์‹คํ–‰์œผ๋กœ ์ „์†ก๋˜์ง€ ์•Š์œผ๋ฉฐ ํ”„๋กœํ•„์— ์ €์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ์ž‘ํ•  ๋•Œ ์ผ๋ฐ˜ ์„ค์ • ์ ˆ์ฐจ ๋“ฑ์„ ํ†ตํ•ด ๋‹ค์‹œ ์ •์˜ํ•˜์‹ญ์‹œ์˜ค. ๋ฐ˜๋ณต๋˜๋Š” SetClassMask๋Š” ์ƒˆ ๋ฐ์ดํ„ฐ๊ฐ€ ์™„์ „ํžˆ ๊ฒ€์ฆ๋œ ํ›„์—๋งŒ ๊ทœ์น™์„ ๋™์ผํ•œ ์ด๋ฆ„์œผ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด์€ ๋“ฑ๋ก ์ค‘์— ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค. ์›๋ž˜ ๋ฐฐ์—ด์„ ๋ณ€๊ฒฝํ•ด๋„ ๊ทœ์น™์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. SetClassMask๋ฅผ ๋ฐ˜๋ณตํ•˜์„ธ์š”. ์—ฌ๋Ÿฌ ์ผ์น˜ ๊ทœ์น™์€ classMask์˜ ์ด๋ฆ„ ์ˆœ์„œ์— ๋”ฐ๋ผ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ํ‘œ์ค€ ์„œ๋ฒ„ ์˜๋ฅ˜ ํ…Œ์ด๋ธ”์€ ์—†์Šต๋‹ˆ๋‹ค.
  • 1..9 ์œ„์น˜ ์ธ์ˆ˜๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ๊ผฌ๋ฆฌ๋ฅผ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. classMask๋ฅผ ์„ค์ •ํ•˜๋ ค๋ฉด ์ฒ˜์Œ 6๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์œ„์น˜์˜ ์˜๋ฏธ๋ฅผ ๋ณด๋ ค๋ฉด var์ด๋ผ๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ํ•˜๋‚˜์˜ ๋Œ€์ƒ์ด ์„ ํƒ๋˜๊ณ  ๊ณต๊ฒฉ์ด ํ•œ ๋ฒˆ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž๋™ ์ „ํˆฌ ์ฃผ๊ธฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. classMask๊ฐ€ ์—†์œผ๋ฉด ์žฅ๋น„ ํ•„ํ„ฐ ๋ฐ ์•„์ดํ…œ ์ฝ๊ธฐ๊ฐ€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋จผ์ € ์ผ๋ฐ˜ ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•œ ๋‹ค์Œ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•œ ๋‹ค์Œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด=false๋Š” ์—ฌ์ „ํžˆ ํด๋ž˜์Šค ์šฐ์„ ์ˆœ์œ„๋ฅผ ์œ ์ง€ํ•˜์ง€๋งŒ ์ฒซ ๋ฒˆ์งธ๋กœ ์ผ์น˜ํ•˜๋Š” ํด๋ž˜์Šค ๋‚ด์—์„œ ํด๋ผ์ด์–ธํŠธ ๋ชฉ๋ก์˜ ์ฒซ ๋ฒˆ์งธ mobile๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฆ„/์ง์œ„์—์„œ ํ•˜์œ„ ๋ฌธ์ž์—ด์„ ๊ฒ€์ƒ‰ํ•˜๋ ค๋Š” ์ด์ „ ์‹œ๋„๊ฐ€ ์žฅ๋น„ ๊ทœ์น™์œผ๋กœ ๋Œ€์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ช…์‹œ์ ์ธ SetClassMask๋กœ ์ด๋™ํ•˜์„ธ์š”. ์บ๋ฆญํ„ฐ์˜ ์ด๋ฆ„์€ ๋” ์ด์ƒ ๊ทธ๋ฅผ ํŠน์ • ํด๋ž˜์Šค๋กœ ์‹๋ณ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

var result = UO.AttackNearest(5, 5);
UO.Print("AttackNearest: " + Convert.ToString(result));

1. 5๊ฐœ ์…€์˜ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ : ์•ฝ์‹ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • body=-1, maxZ=FindVertical(), ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด=true, ์ƒ‰์ƒ=-1, classMask ๋น„ํ™œ์„ฑํ™”, aliveOnly=false, visibleOnly=false. ์ฃฝ์€ ์‚ฌ๋žŒ์„ ์ œ์™ธํ•˜๋ ค๋ฉด ์•„๋ž˜ ์ „์ฒด ์–‘์‹์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
var enemy = UO.AttackNearest(5, 5);
if (Truth(enemy == 0))
{
    return null;
}
UO.AddObject("combat_target", enemy);

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

2. ์ฃผ์–ด์ง„ ๋ชธ์ฒด์™€ ๋™์ผํ•œ ๋†’์ด๋งŒ: ํด๋ž˜์Šค๊ฐ€ ์—†๋Š” ๋ชจ๋“  ํ”Œ๋ž˜๊ทธ - ์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜

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

  • maxZ=0๋Š” ์—„๊ฒฉํ•œ ๋†’์ด ๋น„๊ต์— ์œ ์šฉํ•˜์ง€๋งŒ ๋‹จ๊ณ„์—์„œ ๋Œ€์ƒ์ด ์ž˜๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. visibleOnly๋Š” ๋ฒฝ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 9๊ฐœ์˜ ์ธ์ˆ˜๊ฐ€ ๋ชจ๋‘ ์„œ๋ช…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. true๊ฐ€ ์•„๋‹Œ ID๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var status = "5|6";
    var radius = 8;
    var bodies = "0x0190|0x0191";
    var heightTolerance = 0;
    dynamic chooseNearest = true;
    var bodyHue = -1;
    var equipmentClasses = -1;
    dynamic requireAlive = true;
    dynamic requireVisible = true;
    var enemy = UO.AttackNearest(status, radius, bodies, heightTolerance, chooseNearest, bodyHue, equipmentClasses, requireAlive, requireVisible);
    if (Truth(enemy != 0))
    {
        UO.AddObject("enemy_same_height", enemy);
    }

    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. ๋‹น์‹ ์˜ ์ด๋ฆ„, ๋‹น์‹ ์˜ ๋ฌผ๊ฑด๊ณผ ๊ณต๊ฒฉ ์ˆœ์„œ - ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์—…

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

  • DTMH๊ฐ€ ๋จผ์ € ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์ ํ•ฉํ•œ DTMH๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ - ๋ฌด๊ฒ๊ณ  ์‚ฌ๋ƒฅ๊พผ์ž…๋‹ˆ๋‹ค. 10 ์…€์˜ DTMH๋Š” 2 ์…€์˜ Heavy๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค. ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋ ค๋ฉด classMask ์ค„์„ ๋ณ€๊ฒฝํ•˜์„ธ์š”. ๋‘ ๊ฐœ์˜ DTMH ์ค‘ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฒƒ์ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ์–ด๋Š” ๋ณ„๋„์˜ ๋ช…๋ น UO์ด ์•„๋‹Œ ์™„์ „ํžˆ ์ถ•์†Œ๋œ ์‚ฌ์šฉ์ž ๊ธฐ๋Šฅ C#์ž…๋‹ˆ๋‹ค. Gear(๊ฐ€์ฃฝ, ์ง€ํŒก์ด)์˜ ๋‘ ๋ฐฐ์—ด์€ ๋‘ ๊ฐœ์˜ ํ•„์ˆ˜ ๊ทธ๋ฃน์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ฃฝ์— ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋Œ€์•ˆ์ด ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ๊ฐ€์ฃฝ ์•„์ดํ…œ์„ ์ฐฉ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
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 leather = Gear(0x13C4, 0x13C7);
        var staves = Gear(0x0DF0, 0x0E81);
        var chain = Gear(0x13BF, 0x13C0);
        var plate = Gear(0x1415, 0x1411);
        var bows = Gear(0x13B2, 0x0F50);
        UO.SetClassMask("DTMH", Gear(leather, staves), chain);
        UO.SetClassMask("ะพั…ะพั‚ะฝะธะบ", bows);
        UO.SetClassMask("ั‚ัะถั‘ะปั‹ะน", plate);
        var notoriety = "5|6";
        var distance = 12;
        var body = -1;
        var maxZ = 8;
        dynamic nearest = true;
        var color = -1;
        var classMask = "DTMH|ั‚ัะถั‘ะปั‹ะน|ะพั…ะพั‚ะฝะธะบ";
        dynamic aliveOnly = true;
        dynamic visibleOnly = true;
        var enemy = UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly, visibleOnly);
        if (Truth(enemy == 0))
        {
            UO.Print("No matching enemy; no attack sent");
            return null;
        }

        UO.AddObject("selected_enemy", enemy);
        return null;
    }

    dynamic Gear(params dynamic[] values)
    {
        return values;
    }

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

4. ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด=false: ๋ชฉ๋ก์˜ ์ฒซ ๋ฒˆ์งธ, ๊ฐ€์žฅ ๋จผ ๊ฒƒ์ด ์•„๋‹Œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • 10๋Š” ๋ฐ˜๊ฒฝ์ด๊ณ , 4๋Š” ํ—ˆ์šฉ๋˜๋Š” ์ฐจ์ด Z์ด๋ฉฐ, ํ”Œ๋ž˜๊ทธ ๋น„ํ™œ์„ฑํ™” ์ƒ‰์ƒ ๋’ค์˜ -1์™€ classMask ๋‘˜ ๋‹ค์ž…๋‹ˆ๋‹ค. ์›”๋“œ ์—…๋ฐ์ดํŠธ ๊ฐ„ ํด๋ผ์ด์–ธํŠธ ๋ชฉ๋ก์˜ ์ˆœ์„œ๋Š” ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๊ทผ์ ‘์„ฑ์„ ์–ป์œผ๋ ค๋ฉด true๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
dynamic sortByDistance = false;
var target = UO.AttackNearest(5, 10, -1, 4, sortByDistance, -1, -1, true, true);
if (Truth(target == 0))
{
    return null;
}
UO.AddObject("current_enemy", target);

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

5. ์‚ฌ์šฉ์ž ๊ทธ๋ฃน ์žฌ์ •๋ ฌ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋ผ๋ฒจ์˜ ์ˆœ์„œ๋งŒ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์ƒˆ ์˜๋ฅ˜ ํ…Œ์ด๋ธ”์ด๋‚˜ ์ด๋ฆ„์„ ํด๋ผ์ด์–ธํŠธ์— ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌด๊ฑฐ์šด ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ํด๋ฐฑ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ์šฐ์„ ์ˆœ์œ„์—์„œ ์ œ๊ฑฐํ•˜์„ธ์š”.
return  RunScenario();
 object? RunScenario()
{
    var leather = Gear(0x13C4, 0x13C7);
    var staves = Gear(0x0DF0, 0x0E81);
    var chain = Gear(0x13BF, 0x13C0);
    var plate = Gear(0x1415, 0x1411);
    var bows = Gear(0x13B2, 0x0F50);
    UO.SetClassMask("DTMH", Gear(leather, staves), chain);
    UO.SetClassMask("ะพั…ะพั‚ะฝะธะบ", bows);
    UO.SetClassMask("ั‚ัะถั‘ะปั‹ะน", plate);
    var priority = "ะพั…ะพั‚ะฝะธะบ|DTMH|ั‚ัะถั‘ะปั‹ะน";
    var enemy = UO.AttackNearest(5, 12, -1, 8, true, -1, priority, true, true);
    if (Truth(enemy != 0))
    {
        UO.AddObject("priority_enemy", enemy);
    }

    return null;
}

dynamic Gear(params dynamic[] values)
{
    return values;
}

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

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

values => new InjectionValue(CompactAttackNearest(values))

UO.AttackNearest(notoriety, distance) โ€” UO.AttackNearest(Any,Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

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

values => new InjectionValue(CompactAttackNearest(values))

UO.AttackNearest(notoriety, distance, body) โ€” UO.AttackNearest(Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: notoriety (Any), distance (Any), body (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

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

values => new InjectionValue(CompactAttackNearest(values))

UO.AttackNearest(notoriety, distance, body, maxZ) โ€” UO.AttackNearest(Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: notoriety (Any), distance (Any), body (Any), maxZ (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

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

values => new InjectionValue(CompactAttackNearest(values))

UO.AttackNearest(notoriety, distance, body, maxZ, nearest) โ€” UO.AttackNearest(Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

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

values => new InjectionValue(CompactAttackNearest(values))

UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color) โ€” UO.AttackNearest(Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

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

values => new InjectionValue(CompactAttackNearest(values))

UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask) โ€” UO.AttackNearest(Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any), classMask (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

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

values => new InjectionValue(CompactAttackNearest(values))

UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly) โ€” UO.AttackNearest(Any,Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any), classMask (Any), aliveOnly (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

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

values => new InjectionValue(CompactAttackNearest(values))

UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly, visibleOnly) โ€” UO.AttackNearest(Any,Any,Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any), classMask (Any), aliveOnly (Any), visibleOnly (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

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

values => new InjectionValue(CompactAttackNearest(values))

UO.BandageSelf

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

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

void UO.BandageSelf();

์บ๋ฆญํ„ฐ๋ฅผ UO.Wait-ํƒ€๊ฒŸ์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ๋ฐฐ๋‚ญ์—์„œ ์„ ํƒํ•œ 0x0E21 ์œ ํ˜•์˜ ๋ถ•๋Œ€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์€ ํด๋ผ์ด์–ธํŠธ์— ์˜ํ•ด ์ „์†ก๋˜๊ณ  ์„œ๋ฒ„์— ์˜ํ•ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

void. ์ด ๋ฉ”์„œ๋“œ๋Š” ์น˜๋ฃŒ ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ถ•๋Œ€ ๊ฐ๊ธฐ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋Ÿฐํƒ€์ž„์€ ๋ชฉํ‘œ Self๋ฅผ ์„ค์ •ํ•œ ๋‹ค์Œ ๋ฐฐ๋‚ญ์—์„œ hue์™€ ๊ฐ€์žฅ ๊ฐ€๊น๊ฒŒ ์ผ์น˜ํ•˜๋Š” ์œ ํ˜• 0x0E21 ํ•ญ๋ชฉ์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ถ•๋Œ€๊ฐ€ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์œผ๋ฉด ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์‹œ์Šคํ…œ ๋กœ๊ทธ์— ๋ณด๊ณ ๋ฉ๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋Š” ํ˜ธ์ถœ ์Šคํฌ๋ฆฝํŠธ๋กœ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ์˜ ์„œ๋ฒ„ ์ƒํƒœ์— ๋”ฐ๋ผ ์น˜๋ฃŒ ๊ฐ€๋Šฅ์„ฑ๊ณผ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ๋ฐฐ๋‚ญ์— ์žˆ๋Š” ๋ถ•๋Œ€๋ฅผ ํ•œ ๋ฒˆ ์ž์‹ ์—๊ฒŒ ์‚ฌ์šฉํ•˜์„ธ์š”. - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋ฐฐ๋‚ญ์— ์žˆ๋Š” ๋ถ•๋Œ€๋ฅผ ํ•œ ๋ฒˆ ์ž์‹ ์—๊ฒŒ ์‚ฌ์šฉํ•˜์„ธ์š”.
UO.BandageSelf();

2. ๋จผ์ € ์—ฐ๊ฒฐ์„ ํ™•์ธํ•œ ๋‹ค์Œ ์ž‘์—…์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํ†ตํ™”๋Š” ์น˜๋ฃŒ๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋จผ์ € ์—ฐ๊ฒฐ์„ ํ™•์ธํ•œ ๋‹ค์Œ ์ž‘์—…์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํ†ตํ™”๋Š” ์น˜๋ฃŒ๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Connected()))
    {
        UO.BandageSelf();
    }

    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. ์ด ์‹œ์ˆ ์—์„œ๋Š” ๋ถ•๋Œ€ ์‚ฌ์šฉ๋งŒ ๋ณด๊ณ ํ•  ๋ฟ ์น˜๋ฃŒ ์„ฑ๊ณต ์—ฌ๋ถ€๋Š” ๋ณด๊ณ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ด ์‹œ์ˆ ์—์„œ๋Š” ๋ถ•๋Œ€ ์‚ฌ์šฉ๋งŒ ๋ณด๊ณ ํ•  ๋ฟ ์น˜๋ฃŒ ์„ฑ๊ณต ์—ฌ๋ถ€๋Š” ๋ณด๊ณ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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()
    {
        ApplyBandage();
        return null;
    }

    void ApplyBandage()
    {
        UO.BandageSelf();
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.BandageSelf() โ€” UO.BandageSelf()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void BandageSelf()

        {

            var foundBandages = FindType(new InjectionValue(0x0e21), new InjectionValue(0), new InjectionValue("my"));

            if (foundBandages != string.Empty)

            {

                WaitTargetSelf();

                UseObject(foundBandages);

            }

            else

                SystemMessage("No bandages found.");

        }

UO.ClearClassMask

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

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

int UO.ClearClassMask();
int UO.ClearClassMask(object? name);

ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„์˜ ํ•˜๋‚˜์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์žฅ๋น„ ๊ทœ์น™ ๋˜๋Š” ๋ชจ๋“  ๊ทœ์น™์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์„ธํŠธ๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜๊ฑฐ๋‚˜ ์ž„์‹œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์ „์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

  • name โ€” SetClassMask์— ์ „๋‹ฌ๋œ ์„ ํƒ์  ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์‚ฌ๋ก€๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ์ด ๋Ÿฐํƒ€์ž„์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ทœ์น™์ด ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ์„ ์ˆœ์œ„ ๋ฌธ์ž์—ด์ด ์•„๋‹™๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” "mage|tank"๊ฐ€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์ธ์ˆ˜ ์—†์ด ํ˜ธ์ถœํ•˜์„ธ์š”.

๋ฐ˜ํ™˜๊ฐ’

int โ€” ์‚ญ์ œ๋œ ๊ทœ์น™ ์ˆ˜. 1๋ผ๋Š” ์ด๋ฆ„์€ ์‚ญ์ œ๋จ์„ ์˜๋ฏธํ•˜๊ณ , 0์—๋Š” ๊ทธ๋Ÿฌํ•œ ๊ทœ์น™์ด ์—†์Šต๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ๋ถ€์šธ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์•„๋‹Œ 0..N์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ „์ฒด ๊ฒฐ๊ณผ๋ฅผ true์ด ์•„๋‹Œ > 0์™€ ๋น„๊ตํ•˜์„ธ์š”.

๋™์ž‘

  • ์ด๋ฏธ ์ „์†ก๋œ ๊ณต๊ฒฉ์„ ์ทจ์†Œํ•˜์ง€ ์•Š์œผ๋ฉฐ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ค‘์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ ์žฅ๋น„๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ผ๋‹จ ์‚ญ์ œ๋˜๋ฉด ์ด๋ฆ„์€ ๋‹ค์Œ AttackNearest์—์„œ ์•Œ ์ˆ˜ ์—†๋Š” ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. classMask์—์„œ๋„ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋‹ค์‹œ ๋“ฑ๋กํ•˜์„ธ์š”. ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„์€ ๋ชจ๋“  ์„ ํƒ์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๋Ÿฐํƒ€์ž„๊ณผ ํ•ด๋‹น ๊ทœ์น™์€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค๊ฐ€ ์—†๋Š” ์ผ๋ฐ˜ ๊ฒ€์ƒ‰์˜ ๊ฒฝ์šฐ ๋นˆ ํ•„์ˆ˜๋ณต ์„ธํŠธ ๋Œ€์‹  classMask=-1๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

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

1. ์ž„์‹œ ํด๋ž˜์Šค๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋‚˜๋จธ์ง€ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ œ๊ฑฐํ•ด๋„ ๋ฌด๊ธฐ๊ฐ€ ๋ฐ”๋€Œ๊ฑฐ๋‚˜ ์ „ํˆฌ๊ฐ€ ๋๋‚˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ๋ถ„๋ฅ˜๋งŒ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.
UO.SetClassMask("ะฒั€ะตะผะตะฝะฝั‹ะน", 0x13B2);
UO.SetClassMask("ะพัะฝะพะฒะฝะพะน", 0x1415);
UO.ClearClassMask("ะฒั€ะตะผะตะฝะฝั‹ะน");
var enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "ะพัะฝะพะฒะฝะพะน", true, true);
if (Truth(enemy != 0))
{
    UO.AddObject("main_enemy", enemy);
}

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

2. ๋‹ค๋ฅธ ์ž‘์—…์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ทœ์น™์„ ๋‹ค์‹œ ์ƒ์„ฑ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ œ๊ฑฐ๋จ - ์ œ๊ฑฐ๋œ ๊ทœ์น™ ์ˆ˜์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์ง€ ์•Š๊ณ  ๋™์ผํ•œ ๋Ÿฐํƒ€์ž„์— ์ƒˆ ์„ธํŠธ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.SetClassMask("ัั‚ะฐั€ั‹ะน_ะฝะฐะฑะพั€", 0x13B2);
    var removed = UO.ClearClassMask();
    UO.SetClassMask("ะฝะพะฒั‹ะน_ะฝะฐะฑะพั€", 0x0F50);
    var enemy = UO.AttackNearest(5, 8, -1, 4, true, -1, "ะฝะพะฒั‹ะน_ะฝะฐะฑะพั€", true, true);
    if (Truth(enemy != 0))
    {
        UO.AddObject("new_enemy", enemy);
    }

    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. ๊ทœ์น™์„ ์žฌ์„ค์ •ํ•˜๊ณ  ์ผ๋ฐ˜ ์ฆ‰์‹œ ๋Œ€์ƒ์œผ๋กœ ์ด๋™ - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

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

  • ์›๊ฒฉ ์ด๋ฆ„์„ ์ „๋‹ฌํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๊ฒฐ๊ณผ๋Š” 0์ž…๋‹ˆ๋‹ค. -1๋Š” ์˜ท๋งŒ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ•„ํ„ฐ๋Š” ๊ณ„์† ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.SetClassMask("ะฟะพ_ะพะดะตะถะดะต", 0x13C4);
        UO.ClearClassMask();
        var classes = -1;
        var enemy = UO.AttackNearest(5, 5, -1, 4, true, -1, classes, true, true);
        if (Truth(enemy != 0))
        {
            UO.AddObject("enemy_without_classes", enemy);
        }

        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.ClearClassMask() โ€” UO.ClearClassMask()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

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

args => new InjectionValue(ClearClassMask(null))

UO.ClearClassMask(name) โ€” UO.ClearClassMask(Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

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

args => new InjectionValue(ClearClassMask(ReadClassName(args[0])))

UO.GetAbilityID

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

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

int UO.GetAbilityID(object? abilityName);

ID ํด๋ผ์ด์–ธํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ๋ฌด๊ธฐ ๋Šฅ๋ ฅ ์ด๋ฆ„์ด๋‚˜ ์ˆซ์ž ๋ฌธ์ž์—ด์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

  • abilityName - string: ์ด๋ฆ„ AbilityData, ์—ด๊ฑฐํ˜• ๋Šฅ๋ ฅ ์ด๋ฆ„ ๋˜๋Š” ์†Œ์ˆ˜์  ID. ์ด๋ฆ„์„ ๋น„๊ตํ•  ๋•Œ ๊ณต๋ฐฑ/๊ตฌ๋‘์ ์€ ์ œ๊ฑฐ๋˜๋ฉฐ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int 1..AbilityData.Abilities.Length - ์•Œ๋ ค์ง„ ๋Šฅ๋ ฅ; 0๋Š” ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„, ์ •๊ทœํ™”๋œ ๋นˆ ๋ฌธ์ž์—ด ๋˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ ์™ธ๋ถ€์˜ ์ˆซ์ž ID์ž…๋‹ˆ๋‹ค.

๋™์ž‘

  • ResolveClassicUOAbilityId๋Š” ๋จผ์ € ์‹ญ์ง„์ˆ˜ int๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•œ ๋‹ค์Œ ์ •๊ทœํ™”๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ ์ด๋ฆ„๊ณผ ์—ด๊ฑฐํ˜• ์ด๋ฆ„์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๋Šฅ๋ ฅ์„ ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ํ˜„์žฌ ๋ฌด๊ธฐ์™€์˜ ํ˜ธํ™˜์„ฑ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ด๋ฆ„ ํ™•์ธ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ˆซ์ž๋Š” ๋Šฅ๋ ฅ์˜ ์‚ฌ์šฉ์ด ์•„๋‹Œ ์นดํƒˆ๋กœ๊ทธ์˜ ID๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
var id = UO.GetAbilityID("Armor Ignore");
UO.Print(Convert.ToString(id));

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

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

  • 1 ๋ผ์ธ์€ ๋ฆฌ์กธ๋ฒ„์˜ ์ˆ˜์น˜ ๊ฒฝ๋กœ๋ฅผ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetAbilityID("1");
    UO.Print(Convert.ToString(id));
    return null;
}

3. ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ๋ˆ„๋ฝ๋œ ์ด๋ฆ„์€ 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 id = UO.GetAbilityID("unknown-example-ability");
        UO.Print(Convert.ToString(id));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetAbilityID(abilityName) โ€” UO.GetAbilityID(String)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GetAbilityID(string abilityName) => bridge.ResolveAbility(abilityName);

UO.GetAbilityName

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

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

string UO.GetAbilityName(object? abilityId);

ID ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ๋ฌด๊ธฐ ๋Šฅ๋ ฅ์˜ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

  • abilityId - int: ์ธ๋ฑ์‹ฑ ID์€ 1๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ฆฌ์ง€๋Š” AbilityData.Abilities[abilityId-1]๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„. ID๊ฐ€ 1๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ธธ์ด๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ ๋นˆ ๋ฌธ์ž์—ด์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ํŒ๋…๊ฐ’์€ ์ง€์—ญ์ ์ด๋ฉฐ ๋Šฅ๋ ฅ์„ ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์นดํƒˆ๋กœ๊ทธ์˜ ID๋Š” ํ˜„์žฌ ๋ฌด๊ธฐ์— ํ•ด๋‹น ๋Šฅ๋ ฅ์ด ์กด์žฌํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ด๋ฆ„ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ID 1์€ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.
var name = UO.GetAbilityName(1);
UO.Print(name);

2. ์—ญ๋ฐฉํ–ฅ ํ•ด๊ฒฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋ฆฌ์กธ๋ฒ„๊ฐ€ ์ฐพ์€ ID๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฆ„์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetAbilityID("Armor Ignore");
    if (Truth(id > 0))
    {
        UO.Print(UO.GetAbilityName(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. ์ž˜๋ชป๋œ ID - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • 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 name = UO.GetAbilityName(0);
        UO.Print(Convert.ToString(Len(name)));
        return null;
    }

    int Len(object? value) => Convert.ToString(value)?.Length ?? 0;
}

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

public string GetAbilityName(int abilityId) => bridge.GetAbilityName(abilityId);

UO.GetActiveAbility

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

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

dynamic UO.GetActiveAbility();

์บ๋ฆญํ„ฐ๊ฐ€ ํ™œ์„ฑํ™”ํ•œ ์ „ํˆฌ ๋Šฅ๋ ฅ์˜ ์ด๋ฆ„์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

string์€ ํ™œ์„ฑํ™” ๋Šฅ๋ ฅ์˜ ์˜์–ด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค(์˜ˆ: Armor Ignore). ํ™œ์„ฑํ™”๋œ ๋Šฅ๋ ฅ์ด ์—†๊ฑฐ๋‚˜ ๋ฌธ์ž๊ฐ€ ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ ๋ฌธ์ž์—ด "0"์ž…๋‹ˆ๋‹ค. ์ด๋Š” int, 0, ID ๋Šฅ๋ ฅ์ด๋‚˜ ์ ์ค‘ ์„ฑ๊ณต ํ™•์ธ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ํ˜„์žฌ ๋ฌธ์ž์˜ PrimaryAbility/SecondaryAbility ํ”Œ๋ž˜๊ทธ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ ๊ธฐ๋ณธ ๋Šฅ๋ ฅ์ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์ด ๊ฒ€์ƒ‰๋˜๊ธฐ ์ „์— ํ™œ๋™ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ฒˆํ˜ธ์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋Š” ๋กœ์ปฌ์—์„œ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค. ๊ฒŒํ„ฐ ์ž์ฒด๋Š” ๋Šฅ๋ ฅ์„ ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋งˆ๋‚˜๋ฅผ ์†Œ๋น„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ณต๊ฒฉ ํ›„ ์„œ๋ฒ„๋Š” ํ™œ์„ฑํ™”๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ํ™œ์„ฑ ๋Šฅ๋ ฅ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋…ผ์Ÿ์ด ์—†์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ํด๋ผ์ด์–ธํŠธ์˜ ๋ฌธ์ž๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ํ™œ์„ฑํ™”๊ฐ€ ์—†์œผ๋ฉด 0 ๋ฌธ์ž์—ด์ด ์ธ์‡„๋ฉ๋‹ˆ๋‹ค.
var name = UO.GetActiveAbility();
UO.Print(name);

2. ํ™œ์„ฑ ๋Šฅ๋ ฅ์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ธฐ๋ณธ ๋Šฅ๋ ฅ์„ ํ™œ์„ฑํ™”ํ•˜์„ธ์š” - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋น„๊ต๋Š” ๋ฌธ์ž์—ด 0๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. UsePrimaryAbility๋Š” ๋ณ„๋„๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋Š” ํ™œ์„ฑํ™” ์š”์ฒญ์ด์ง€ ์„ฑ๊ณต์ ์ธ ๊ฒฝ๊ณ ์˜ ์ฆ๊ฑฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋Š” ๋ฌด๊ธฐ ๋ฐ ์„œ๋ฒ„ ๊ทœ์น™์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.GetActiveAbility() == "0"))
    {
        UO.UsePrimaryAbility();
    }

    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 ๋Šฅ๋ ฅ์œผ๋กœ ๋ณ€ํ™˜ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • GetAbilityID๋Š” getter๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ์ด๋ฆ„์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ID ๋Šฅ๋ ฅ์€ serial ๋ฌด๊ธฐ๋‚˜ ์บ๋ฆญํ„ฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ฒซ์งธ, ํ™œ์„ฑ ๋Šฅ๋ ฅ์˜ ๋ถ€์žฌ๊ฐ€ ๋ฐฐ์ œ๋ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var name = UO.GetActiveAbility();
        if (Truth(name != "0"))
        {
            var id = UO.GetAbilityID(name);
            UO.Print("Ability ID: " + Convert.ToString(id));
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetActiveAbility() โ€” UO.GetActiveAbility()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getactiveability": return new InjectionValue(bridge.GetActiveAbility());

UO.GetWeaponAbilities

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

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

dynamic UO.GetWeaponAbilities();

Bridge๋Š” Player.Abilities๋ฅผ ์ฝ๊ณ  ((byte)๊ฐ’ & 0x7F)๋ฅผ ์ ์šฉํ•˜๊ณ  ์–‘์ˆ˜ ID๋ฅผ ์›๋ž˜ ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

ํ˜„์žฌ ๋ฌด๊ธฐ์˜ ๊ธ์ •์ ์ธ int ID ๋Šฅ๋ ฅ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ๋†’์€ ํ”Œ๋ž˜๊ทธ 0x80๊ฐ€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. 0 ๊ฐ’์€ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. ํ”Œ๋ ˆ์ด์–ด ์—†์Œ - ๋นˆ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.

๋™์ž‘

  • Bridge๋Š” Player.Abilities๋ฅผ ์ฝ๊ณ  ((byte)๊ฐ’ & 0x7F)์„ ์ ์šฉํ•˜๊ณ  ์–‘์ˆ˜ ID๋ฅผ ์›๋ž˜ ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑ ๋ชจ๋“œ์˜ ์‚ฌ์‹ค์ด๋‚˜ ์ด๋ฆ„์ด ์•„๋‹Œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ID์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€, ๋Œ€์ƒ ๋˜๋Š” ์ž๋™ ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ์ƒํƒœ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • Bridge๋Š” Player.Abilities๋ฅผ ์ฝ๊ณ  ((byte)๊ฐ’ & 0x7F)๋ฅผ ์ ์šฉํ•˜๊ณ  ์–‘์ˆ˜ ID๋ฅผ ์›๋ž˜ ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
var abilities = UO.GetWeaponAbilities();
UO.Print(UO.GetArrayLength(abilities));

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

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

  • Bridge๋Š” Player.Abilities๋ฅผ ์ฝ๊ณ  ((byte)๊ฐ’ & 0x7F)์„ ์ ์šฉํ•˜๊ณ  ์–‘์ˆ˜ ID๋ฅผ ์›๋ž˜ ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑ ๋ชจ๋“œ์˜ ์‚ฌ์‹ค์ด๋‚˜ ์ด๋ฆ„์ด ์•„๋‹Œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ID์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var abilities = UO.GetWeaponAbilities();
    if (Truth(UO.GetArrayLength(abilities) > 0))
    {
        UO.Print(UO.GetAbilityName(abilities[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. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ํ˜„์žฌ ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€, ๋Œ€์ƒ ๋˜๋Š” ์ž๋™ ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ์ƒํƒœ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
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.GetWeaponAbilities();
        UO.Wait(500);
        var after = UO.GetWeaponAbilities();
        UO.Print(before);
        UO.Print(after);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetWeaponAbilities() โ€” UO.GetWeaponAbilities()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

public InjectionValue GetWeaponAbilities() => new InjectionValue(

            (bridge.GetWeaponAbilities() ?? Array.Empty<int>()).Select(value => new InjectionValue(value)).ToArray());

UO.IsWarMode

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

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

int UO.IsWarMode(object? objID);

์ „ํˆฌ ์ž์„ธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค mobile.

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

  • objID โ€” ํŠน์ • ๊ฐœ์ฒด์˜ ํ•„์ˆ˜ serial/ID: int, 16์ง„์ˆ˜ ๋ฌธ์ž์—ด ๋˜๋Š” ๋ณ„์นญ self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse ๋˜๋Š” ์ด๋ฆ„ AddObject. ์ด๊ฒƒ์€ graphic/type์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ง€์ •๋˜์ง€ ์•Š์€ ์ด๋ฆ„์€ 0๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ƒˆ ๋Œ€์ƒ์„ ์—ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธ์ˆ˜๋Š” ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ์ง์ ‘ self๋ฅผ ํ†ต๊ณผํ•˜์„ธ์š”.

๋ฐ˜ํ™˜๊ฐ’

int 1 - ๋กœ๋“œ๋จ mobile์—๋Š” InWarMode ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. int 0 - ์†์„ฑ์ด ๋ˆ„๋ฝ๋˜์—ˆ๊ฑฐ๋‚˜ ๊ฐœ์ฒด๊ฐ€ mobile๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜ ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ๊ฐ€ ๋ˆ„๊ตฌ๋ฅผ ๊ณต๊ฒฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ์ง€ ์•Š์œผ๋ฉฐ ์ „ํˆฌ ๋ชจ๋“œ๋ฅผ ์ผœ์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค. ์™ธ๋ถ€ ๋ชจ๋“œ ์ฝ๊ธฐ๋Š” ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

๋ช…๋ น์˜ ๊ฒฐ๊ณผ๋Š” ์ˆซ์ž ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค. 1๋Š” ์ถฉ์กฑ๋œ ์กฐ๊ฑด์„ ์˜๋ฏธํ•˜๊ณ , 0๋Š” ์ถฉ์กฑ๋˜์ง€ ์•Š์€ ์กฐ๊ฑด์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. var result = command(...) ํ›„์— (๊ฒฐ๊ณผ != 0) ๋˜๋Š” (๊ฒฐ๊ณผ == 0)์ธ์ง€ ํ™•์ธํ•˜์„ธ์š”. ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ํ•ด๋‹น ์ž‘์—…์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ์ด๋ฏธ ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋กœ์ปฌ ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์„ ์ฝ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์— ๋Œ€ํ•œ ์š”์ฒญ๋„ ์—†๊ณ  ๊ธฐ๋‹ค๋ฆฌ๊ฑฐ๋‚˜ ์ด๋™ํ•  ํ•„์š”๋„ ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” ์ฝ๋Š” ์ˆœ๊ฐ„์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. UO.Wait ๋˜๋Š” ๋‹ค๋ฅธ ์ž‘์—… ํ›„์— ๊ฐœ์ฒด์™€ ํ•ด๋‹น ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์บ๋ฆญํ„ฐ๊ฐ€ ๋ˆ„๊ตฌ๋ฅผ ๊ณต๊ฒฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ์ง€ ์•Š์œผ๋ฉฐ ์ „ํˆฌ ๋ชจ๋“œ๋ฅผ ์ผœ์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค. ์™ธ๋ถ€ ๋ชจ๋“œ ์ฝ๊ธฐ๋Š” ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ž์‹ ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • self ์ธ์ˆ˜๋Š” ํ•ด๋‹น ๋ฌธ์ž๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ - 1/0์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.
  • ์บ๋ฆญํ„ฐ๊ฐ€ ๋ˆ„๊ตฌ๋ฅผ ๊ณต๊ฒฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ์ง€ ์•Š์œผ๋ฉฐ ์ „ํˆฌ ๋ชจ๋“œ๋ฅผ ์ผœ์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค. ์™ธ๋ถ€ ๋ชจ๋“œ ์ฝ๊ธฐ๋Š” ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
var state = UO.IsWarMode("self");
if (Truth(state))
{
    UO.Print("Combat stance is active");
}
else
{
    UO.Print("Combat stance is inactive");
}

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

2. ์„ ํƒ๋จ ํ™•์ธ mobile - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • IsNpc ์ œ๋ชฉ ๋ฐ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด๋Š” ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. target์€ ๋ณ€๊ฒฝ๋˜๋Š” lasttarget์— ๋Œ€ํ•œ ์‹ค์‹œ๊ฐ„ ์ฐธ์กฐ๊ฐ€ ์•„๋‹Œ ๋‹จ์ผ serial์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” InWarMode ํ•„๋“œ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ์ ˆํ•œ ์ƒํƒœ๋ฅผ ์ˆ˜์‹ ํ•œ ํ›„์—๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.IsWarMode(target);
        UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    return null;
}

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

3. ์ผ์‹œ ์ค‘์ง€ ์ „๊ณผ ํ›„์˜ ์ƒํƒœ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • UO.Wait(500) โ€” ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์ผ์‹œ ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค. ์ดํ›„์—๋Š” mobile์ด ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๋Š”์ง€ ๋ณ„๋„๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ๋‘ ์ด๋ฏธ์ง€๊ฐ€ ๋น„๊ต๋ฉ๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ˆ„๋ฝ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋Š” ์„œ๋ฒ„ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์ง€์†์ ์ธ ๊ตฌ๋…์ด ์•„๋‹™๋‹ˆ๋‹ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var target = UO.GetSerial("lasttarget");
        if (Truth(UO.IsNPC(target)))
        {
            var before = UO.IsWarMode(target);
            await Delay(500);
            if (Truth(UO.IsNPC(target)))
            {
                var after = UO.IsWarMode(target);
                if (Truth(before != after))
                {
                    UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
                }
            }
            else
            {
                UO.Print("Mobile left the local world");
            }
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "iswarmode": return new InjectionValue(arguments.Length > 0 ? bridge.IsWarMode(Arg(0)) : WarMode());

UO.LastAttack

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

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

dynamic UO.LastAttack();

๋งˆ์ง€๋ง‰ ๊ณต๊ฒฉ ๋Œ€์ƒ์˜ serial๋ฅผ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int โ€” ์ €์žฅ๋จ serial; 0์€ serial์ด ์„ค์น˜๋˜์ง€ ์•Š์•˜์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. bool๋„ ์•„๋‹ˆ๊ณ  graphic/type๋„ ์•„๋‹™๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ID๋Š” ์„ธ์ƒ์— ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ํ•„๋“œ ์†Œ์Šค: bridge.LastAttack. ์ด ๋ช…๋ น์€ ๊ฐœ์ฒด๋ฅผ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ณต๊ฒฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€, ๋Œ€์ƒ ๋˜๋Š” ์ž๋™ ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ์ƒํƒœ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ๋งˆ์ง€๋ง‰ ๊ณต๊ฒฉ ๋Œ€์ƒ์˜ serial๋ฅผ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.
var id = UO.LastAttack();
UO.Print(Hex(id));

string Hex(object? value) => Convert.ToInt64(value).ToString("X");

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

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

  • ํ•„๋“œ ์†Œ์Šค: bridge.LastAttack. ์ด ๋ช…๋ น์€ ๊ฐœ์ฒด๋ฅผ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ณต๊ฒฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.LastAttack();
    if (Truth(id != 0) && Truth(UO.Exists(id)))
    {
        UO.Print(UO.GetName(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. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ํ˜„์žฌ ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€, ๋Œ€์ƒ ๋˜๋Š” ์ž๋™ ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ์ƒํƒœ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
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.LastAttack();
        UO.Wait(500);
        var after = UO.LastAttack();
        UO.Print(before = after);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.LastAttack() โ€” UO.LastAttack()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "lastattack":

                case "wartargetid": return new InjectionValue(bridge.LastAttack);

UO.SetClassMask

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

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

int UO.SetClassMask(object? name, object? required);
int UO.SetClassMask(object? name, object? required, object? forbidden);

classMask์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์žฅ๋น„ ํด๋ž˜์Šค๋ฅผ UO.AttackNearest๋กœ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„๊ณผ graphic/type ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋‚ด์žฅ๋œ ์ง์ฑ…์€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

  • name โ€” ์ด๋ฆ„์ด ํฌํ•จ๋œ ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๋ฌธ์ž์—ด(์˜ˆ: "DTMH", "my_group", "archer_with_shield") ๋Œ€์†Œ๋ฌธ์ž๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ฐ€์žฅ์ž๋ฆฌ ์ฃผ๋ณ€์˜ ๊ณต๋ฐฑ์€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. | , ; ๊ธˆ์ง€๋จ: ์šฐ์„ ์ˆœ์œ„ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ์ž…๋‹ˆ๋‹ค. any/all/-1๋Š” ํ•„ํ„ฐ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์˜ˆ์•ฝ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • required โ€” ํ•˜๋‚˜์˜ type, ๋Œ€์ฒด ํ•ญ๋ชฉ์˜ ๋‹จ์ˆœ ๋ฐฐ์—ด ๋˜๋Š” ํ•„์ˆ˜ ๊ทธ๋ฃน์˜ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ๊ฐ ๊ทธ๋ฃน์€ type ๋˜๋Š” ํ‰๋ฉด ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ๊ฐ ๊ทธ๋ฃน์—์„œ ์ตœ์†Œํ•œ ํ•œ ๊ฐ€์ง€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋นˆ ํ•„์ˆ˜ ๊ทธ๋ฃน์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ type๋Š” int/์ˆซ์ž/16์ง„์ˆ˜ ๋ฌธ์ž์—ด 1..65534์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฃน ๋ฐฐ์—ด๋ณด๋‹ค ๋” ๊นŠ๊ฒŒ ์ค‘์ฒฉ๋˜๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” serial์ด๋‚˜ body ๋ฌธ์ž๊ฐ€ ์•„๋‹Œ graphic ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.
  • forbidden โ€” ์„ ํƒ์  type ๋˜๋Š” ์ž˜๋ชป๋œ ์œ ํ˜•์˜ ํ‰๋ฉด ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ธˆ์ง€๋œ ํ’ˆ๋ชฉ์€ ์—†์Šต๋‹ˆ๋‹ค. ๋นˆ ๋ฐฐ์—ด๋„ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ํ’ˆ๋ชฉ์„ ์ฐฉ์šฉํ•˜๋ฉด ๊ทœ์น™์ด ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ๊ฒฝ๊ณ„ 1..65534; -1/์—ฌ๊ธฐ์—์„œ๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์ˆ˜ ๊ทธ๋ฃน์— ๋Œ€ํ•œ ๋ชจ๋“  ๋Œ€์•ˆ์„ ์™„์ „ํžˆ ๊ธˆ์ง€ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int 1 - ๊ทœ์น™์„ ํ™•์ธํ•˜๊ณ  ๊ธฐ๋กํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ์œ ํ˜•/์ด๋ฆ„/๋นˆ ํ•„์ˆ˜ ๊ทธ๋ฃน/๋ถˆ์ผ์น˜๋กœ ์ธํ•ด ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ, ์ด๋Š” try/CATCH์— ์˜ํ•ด ํฌ์ฐฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ ๊ทœ์น™์ด ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. serial ๋˜๋Š” ๋ฐœ๊ฒฌ๋œ ๋ฌธ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ณต๊ฒฉ์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด๋ฆ„์€ ์„œ๋ฒ„ ์ง์—…์ด ์•„๋‹Œ ์ปค์Šคํ…€ ๋ผ๋ฒจ์ž…๋‹ˆ๋‹ค. ๊ทœ์น™์„ DTMH, my_group ๋˜๋Š” ๋‹ค๋ฅธ ๋‹จ์–ด๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—”์ง„์€ ์„œ๋ฒ„์˜ ์Šคํ‚ฌ/ํด๋ž˜์Šค๋ฅผ ์บ๋ฆญํ„ฐ ์ด๋ฆ„์œผ๋กœ ๊ฒฐ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ•„์ˆ˜์—์„œ ํ•˜๋‚˜์˜ type ๋˜๋Š” ํ‰๋ฉด ๋ฐฐ์—ด์€ ๋ชฉ๋ก์—์„œ ์ตœ์†Œํ•œ ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฃน ๋ฐฐ์—ด์ด๋ž€ ๊ฐ ๊ทธ๋ฃน์—์„œ ์ตœ์†Œํ•œ ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ์ด ํ•„์š”ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, [leather, staves]์—๋Š” ๊ฐ€์ฃฝ๊ณผ ์ง€ํŒก์ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋Œ€์•ˆ ์„ธํŠธ์ด๋ฉฐ ๋‚˜์—ด๋œ ์˜ท์žฅ ์ „์ฒด๋ฅผ ์ฐฉ์šฉํ•ด์•ผ ํ•˜๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ๊ธˆ์ง€๋œ ํ•ญ๋ชฉ์„ ์ฐฉ์šฉํ•œ ๋ชจ๋“  ํ•ญ๋ชฉ์€ ํ•„์ˆ˜ ํ•ญ๋ชฉ์ด ์ถฉ์กฑ๋˜๋”๋ผ๋„ ์ด ๊ทœ์น™์—์„œ ์บ๋ฆญํ„ฐ๋ฅผ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ฃฝ๊ณผ ๊ธˆ์ง€๋œ ์ฒด์ธ์€ ๊ฐ€์ฃฝ ๊ทœ์ •์„ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ทœ์น™์€ ๊ณ„์† ํ…Œ์ŠคํŠธ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐฐ๋‚ญ 21์„ ์ œ์™ธํ•˜๊ณ  ๋ ˆ์ด์–ด 1..24์— ์ฐฉ์šฉํ•œ ์•„์ดํ…œ๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋ฐฐ๋‚ญ/๊ฐ€์Šด, ๋งˆ์šดํŠธ 25, ํƒ„์ฐฝ 26..28 ๋ฐ ์€ํ–‰ 29์˜ ๋‚ด์šฉ๋ฌผ์€ ์˜๋ฅ˜๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. graphic/type๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. serial, ์ด๋ฆ„ ๋ฐ hue ํ•ญ๋ชฉ์€ ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ ์ ˆํ•œ ์žฅ๋น„๊ฐ€ ๋กœ๋“œ๋˜์ง€ ์•Š์œผ๋ฉด ๋ชฉ๋ก์ด ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ์•„์ง ์žฅ๋น„๋ฅผ ์ „์†กํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ์— ๊ธˆ์ง€ ํ•ญ๋ชฉ์ด ์—†๋‹ค๊ณ  ํ•ด์„œ ์„œ๋ฒ„์— ํ•ด๋‹น ํ•ญ๋ชฉ์ด ์—†์Œ์„ ์ฆ๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ˆจ๊ฒจ์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ธกํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ทœ์น™์€ ํ•ด๋‹น ๊ธฐ๋Šฅ๊ณผ ํฌํ•จ์„ ํฌํ•จํ•˜์—ฌ ํ•˜๋‚˜์˜ ๋Ÿฐํƒ€์ž„ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋…๋ฆฝ์ ์ธ ์‹คํ–‰์œผ๋กœ ์ „์†ก๋˜์ง€ ์•Š์œผ๋ฉฐ ํ”„๋กœํ•„์— ์ €์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ์ž‘ํ•  ๋•Œ ์ผ๋ฐ˜ ์„ค์ • ์ ˆ์ฐจ ๋“ฑ์„ ํ†ตํ•ด ๋‹ค์‹œ ์ •์˜ํ•˜์‹ญ์‹œ์˜ค. ๋ฐ˜๋ณต๋˜๋Š” SetClassMask๋Š” ์ƒˆ ๋ฐ์ดํ„ฐ๊ฐ€ ์™„์ „ํžˆ ๊ฒ€์ฆ๋œ ํ›„์—๋งŒ ๊ทœ์น™์„ ๋™์ผํ•œ ์ด๋ฆ„์œผ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด์€ ๋“ฑ๋ก ์ค‘์— ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค. ์›๋ž˜ ๋ฐฐ์—ด์„ ๋ณ€๊ฒฝํ•ด๋„ ๊ทœ์น™์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. SetClassMask๋ฅผ ๋ฐ˜๋ณตํ•˜์„ธ์š”. ์—ฌ๋Ÿฌ ์ผ์น˜ ๊ทœ์น™์€ classMask์˜ ์ด๋ฆ„ ์ˆœ์„œ์— ๋”ฐ๋ผ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ํ‘œ์ค€ ์„œ๋ฒ„ ์˜๋ฅ˜ ํ…Œ์ด๋ธ”์€ ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

var result = UO.SetClassMask("simple_sword", 0x0F5E);
UO.Print("SetClassMask: " + Convert.ToString(result));

1. DTMH: ์ฒด์ธ ์—†๋Š” ๋‚˜๋งŒ์˜ ์Šคํ‚จ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • DTMH - ๋‹น์‹  ์ด๋ฆ„๋งŒ์š”. myLeather/forbiddenChain์˜ ๊ฐ’์€ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„์˜ ์‹ค์ œ graphic๋กœ ๋Œ€์ฒด/๋ณด์ถฉํ•˜์„ธ์š”. ํ”Œ๋žซ ๋ชฉ๋ก์€ ์ „์ฒด ์„ธํŠธ๊ฐ€ ์•„๋‹Œ OR๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
var myLeather = Gear(0x13C4, 0x13C7);
var forbiddenChain = Gear(0x13BF, 0x13C0);
UO.SetClassMask("DTMH", myLeather, forbiddenChain);
var enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "DTMH", true, true);
if (Truth(enemy != 0))
{
    UO.AddObject("leather_enemy", enemy);
}

dynamic Gear(params dynamic[] values)
{
    return values;
}

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

2. ๊ท€ํ•˜์˜ ์ด๋ฆ„, ๊ท€ํ•˜์˜ ๋ฌผ๊ฑด ๋ฐ ๊ณต๊ฒฉ ์ˆœ์„œ - ์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋Šฅ

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

  • DTMH๊ฐ€ ๋จผ์ € ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์ ํ•ฉํ•œ DTMH๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ - ๋ฌด๊ฒ๊ณ  ์‚ฌ๋ƒฅ๊พผ์ž…๋‹ˆ๋‹ค. 10 ์…€์˜ DTMH๋Š” 2 ์…€์˜ Heavy๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค. ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋ ค๋ฉด classMask ์ค„์„ ๋ณ€๊ฒฝํ•˜์„ธ์š”. ๋‘ ๊ฐœ์˜ DTMH ์ค‘ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฒƒ์ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ์–ด๋Š” ๋ณ„๋„์˜ ๋ช…๋ น UO์ด ์•„๋‹Œ ์™„์ „ํžˆ ์ถ•์†Œ๋œ ์‚ฌ์šฉ์ž ๊ธฐ๋Šฅ C#์ž…๋‹ˆ๋‹ค. Gear(๊ฐ€์ฃฝ, ์ง€ํŒก์ด)์˜ ๋‘ ๋ฐฐ์—ด์€ ๋‘ ๊ฐœ์˜ ํ•„์ˆ˜ ๊ทธ๋ฃน์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ฃฝ์— ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋Œ€์•ˆ์ด ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ๊ฐ€์ฃฝ ์•„์ดํ…œ์„ ์ฐฉ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var leather = Gear(0x13C4, 0x13C7);
    var staves = Gear(0x0DF0, 0x0E81);
    var chain = Gear(0x13BF, 0x13C0);
    var plate = Gear(0x1415, 0x1411);
    var bows = Gear(0x13B2, 0x0F50);
    UO.SetClassMask("DTMH", Gear(leather, staves), chain);
    UO.SetClassMask("ะพั…ะพั‚ะฝะธะบ", bows);
    UO.SetClassMask("ั‚ัะถั‘ะปั‹ะน", plate);
    var notoriety = "5|6";
    var distance = 12;
    var body = -1;
    var maxZ = 8;
    dynamic nearest = true;
    var color = -1;
    var classMask = "DTMH|ั‚ัะถั‘ะปั‹ะน|ะพั…ะพั‚ะฝะธะบ";
    dynamic aliveOnly = true;
    dynamic visibleOnly = true;
    var enemy = UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly, visibleOnly);
    if (Truth(enemy == 0))
    {
        UO.Print("No matching enemy; no attack sent");
        return null;
    }

    UO.AddObject("selected_enemy", enemy);
    return null;
}

dynamic Gear(params dynamic[] values)
{
    return values;
}

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

3. ๋ณ€์ˆ˜ ์„ ์–ธ์„ ํ†ตํ•œ ํ•„์ˆ˜ ์œ ํ˜• ์ „์ฒด ์„ธํŠธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ๋ณ€์ˆ˜ ํ•„์ˆ˜[1]๋ฅผ ์„ ์–ธํ•˜๋ฉด ์ธ๋ฑ์Šค 0 ๋ฐ 1๊ฐ€ ์žˆ๋Š” ๋‘ ์š”์†Œ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ์ค‘์ฒฉ๋œ ๊ทธ๋ฃน์—๋Š” ๋ชธํ†ต๊ณผ ๋ฌด๊ธฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. flat [torsoType,weaponType]์€ ๋ชธํ†ต ๋˜๋Š” ๋ฌด๊ธฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
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()
    {
        dynamic[] required = new dynamic[checked((int)(1) + 1)];
        dynamic[] torso = new dynamic[checked((int)(0) + 1)];
        dynamic[] weapon = new dynamic[checked((int)(0) + 1)];
        torso[0] = 0x13C4;
        weapon[0] = 0x0DF0;
        required[0] = torso;
        required[1] = weapon;
        UO.SetClassMask("ะผะพะน_ะบะพะผะฟะปะตะบั‚", required);
        var enemy = UO.AttackNearest(5, 6, -1, 4, true, -1, "ะผะพะน_ะบะพะผะฟะปะตะบั‚", true, true);
        if (Truth(enemy != 0))
        {
            UO.AddObject("outfit_enemy", enemy);
        }

        return null;
    }

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

4. ๋‹ค์Œ ๊ณต๊ฒฉ ์ „์— ๊ทœ์น™์˜ ์˜ท์„ ๊ฐˆ์•„์ž…์œผ์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์žฌ๋“ฑ๋กํ•˜๋ฉด ๊ทœ์น™ ์‚ฌ๋ณธ์ด ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ์ด์ „ ์ด๋ฆ„์€ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋˜๋ฏ€๋กœ ์šฐ์„ ์ˆœ์œ„ ํ–‰์„ ๋‹ค์‹œ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
dynamic[] allowed = new dynamic[checked((int)(0) + 1)];
allowed[0] = 0x13B2;
UO.SetClassMask("ะฟั€ะธะพั€ะธั‚ะตั‚ะฝั‹ะน", allowed);
allowed[0] = 0x0F50;
UO.SetClassMask("ะฟั€ะธะพั€ะธั‚ะตั‚ะฝั‹ะน", allowed);
var enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "ะฟั€ะธะพั€ะธั‚ะตั‚ะฝั‹ะน", true, true);
if (Truth(enemy != 0))
{
    UO.AddObject("updated_outfit", enemy);
}

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.SetClassMask(name, required) โ€” UO.SetClassMask(Any,Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

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

args => new InjectionValue(SetClassMask(args))

UO.SetClassMask(name, required, forbidden) โ€” UO.SetClassMask(Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: name (Any), required (Any), forbidden (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

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

args => new InjectionValue(SetClassMask(args))

UO.SetWarMode

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

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

void UO.SetWarMode(object? value);

์บ๋ฆญํ„ฐ์˜ ์ „ํˆฌ ๋ชจ๋“œ ๋˜๋Š” ํ‰ํ™” ๋ชจ๋“œ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

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

  • value - 0 - ํ‰ํ™” ๋ชจ๋“œ; 0์ด ์•„๋‹Œ ์ •์ˆ˜๋Š” ์ „ํˆฌ ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • WarMode๋Š” ๋ชจ๋“œ๋ฅผ GameActions๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.ToggleWarMode: 0๋Š” ๋น„ํ™œ์„ฑํ™”๋˜๊ณ  0์ด ์•„๋‹Œ ๊ฐ’์€ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์—†์œผ๋ฉด ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Bridge๋Š” ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‚ด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.SetWarMode");
UO.SetWarMode(1);

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

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

  • ์บ๋ฆญํ„ฐ์˜ ์ „ํˆฌ ๋ชจ๋“œ ๋˜๋Š” ํ‰ํ™” ๋ชจ๋“œ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
UO.SetWarMode(1);

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

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

  • WarMode๋Š” ๋ชจ๋“œ๋ฅผ GameActions๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.ToggleWarMode: 0๋Š” ๋น„ํ™œ์„ฑํ™”๋˜๊ณ  0์ด ์•„๋‹Œ ๊ฐ’์€ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์—†์œผ๋ฉด ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.SetWarMode(0);
    return null;
}

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()
    {
        ApplyMode(1);
        return null;
    }

    void ApplyMode(dynamic mode)
    {
        UO.SetWarMode(mode);
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.SetWarMode(value) โ€” UO.SetWarMode(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "setwarmode": WarMode(Arg(0)); return InjectionValue.Unit;

UO.Specmove

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

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

void UO.Specmove(object? direction);
void UO.Specmove(object? direction, object? running);

ํ•œ ๋‹จ๊ณ„ ์š”์ฒญ์„ ๋ธŒ๋ฆฌ์ง€์— ์ง์ ‘ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

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

  • direction โ€” int; ๋ฐฉํ–ฅ ๋ฐ 7 daรซt 0..7 N,NE,E,SE,S,SW,W,NW.
  • running - ์„ ํƒ์  ์ˆซ์ž ํ”Œ๋ž˜๊ทธ int: 0/none - ๊ฑท๊ธฐ, 0์ด ์•„๋‹Œ - ๋‹ฌ๋ฆฌ๊ธฐ.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ExecuteLegacyManualAlias ๋ธŒ๋ฆฌ์ง€๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.Step(๋ฐฉํ–ฅ & 7, ์‹คํ–‰ != 0) ๋ชจ๋“  ๊ฒฐ๊ณผ ์ฝ”๋“œ 0/2/3/4/5/7; void๋Š” ๋ฐ–์œผ๋กœ ๋Œ์•„์˜ต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹Œ ํ•œ ๋‹จ๊ณ„/ํšŒ์ „์ž…๋‹ˆ๋‹ค. Step~10000 ms ์ด๋‚ด์˜ ๋Œ€๊ธฐ๋Š” ์œ ์ง€๋˜์ง€๋งŒ ์Šคํฌ๋ฆฝํŠธ๋Š” ์Šน์ธ, ์‹คํŒจ ๋˜๋Š” ํƒ€์ž„์•„์›ƒ ์ฝ”๋“œ๋ฅผ ๋ฐ›์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
  • ๋ถ„๊ธฐ๊ฐ€ UO.Step์˜ ๋Ÿฐํƒ€์ž„ ์กฐ๊ฑด MoveCheckStamina/MoveExitOnDisconnect/MoveOpenDoor์„ ์ถฉ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Bridge/Player.Walk ์ž์ฒด์™€ ์„œ๋ฒ„๋Š” ์—ฌ์ „ํžˆ ์›€์ง์ž„์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์˜ QueueStep๋Š” ํ”Œ๋ ˆ์ด์–ด, ์—ฐ๊ฒฐ, ๋ฐฉํ–ฅ, ๋Œ€๊ธฐ์—ด, ํ…œํฌ ๋ฐ ๋กœ์ปฌ ํŠธ๋ž˜ํ”ฝ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Player.Walk ์ด์ „์—๋Š” ๊ฐ ํ˜ธ์ถœ์ด ํ•ด๋‹น ์‹œํ€€์Šค์™€ Walker์˜ ํ™•์ธ/๊ฑฐ๋ถ€ ์„ธ๋Œ€๋ฅผ ๋ณ„๋„๋กœ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด ์Šค๋ƒ…์ƒท๊ณผ ํ•จ๊ป˜ Result๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Step ๋ฐ ๋ณด๋ฅ˜ ์ค‘ StepControlled ๋‹ค์Œ ์š”์ฒญ์˜ ๊ณตํ†ต ํ•„๋“œ๊ฐ€ ์•„๋‹Œ ์ด ์ €์žฅ๋œ ์Œ๋งŒ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ต์ฒด ํ”Œ๋ ˆ์ด์–ด/์›Œ์ปค๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฑฐ๋ถ€๋กœ ๋Œ€๊ธฐ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ผ๋ฐ˜ ๋ช…๋ น์„ ํ™•์ธํ•œ๋‹ค๊ณ  ํ•ด์„œ ์ด ๋‹จ๊ณ„๊ฐ€ ํ™•์ธ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์›€์ง์ž„์ด ์—†๋Š” ํšŒ์ „์€ ๋ณ„๋„์˜ ๊ฒฝ์šฐ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.Specmove");
UO.Specmove(0);

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

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

  • ํ•œ ๋‹จ๊ณ„ ์š”์ฒญ์„ ๋ธŒ๋ฆฌ์ง€์— ์ง์ ‘ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
UO.Specmove(0);

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

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

  • ExecuteLegacyManualAlias๋Š” bridge.Step(direction&7,running!=0)์„ ํ˜ธ์ถœํ•œ ๋‹ค์Œ ๋ฐ˜ํ™˜๋œ 1/0๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ•œ ๋‹จ๊ณ„์ด์ง€ ์ขŒํ‘œ๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Specmove(2, 1);
    return null;
}

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

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

  • ๋ถ„๊ธฐ๊ฐ€ UO.Step์˜ ๋Ÿฐํƒ€์ž„ ์กฐ๊ฑด MoveCheckStamina/MoveExitOnDisconnect/MoveOpenDoor์„ ์ถฉ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Bridge/Player.Walk ์ž์ฒด์™€ ์„œ๋ฒ„๋Š” ์—ฌ์ „ํžˆ ์›€์ง์ž„์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

ํ‘œ์ค€ ์ฃผํ–‰ ์†๋„

์ตœ์†Œ ๊ฑธ์Œ ๊ฐ„๊ฒฉ: ๊ฑท๊ธฐ - ๊ฑท๊ธฐ 400 ms, ๋‹ฌ๋ฆฌ๊ธฐ 200 ms; ๋ผ์ด๋”ฉ - ๊ฑท๊ธฐ 200 ms, ๋‹ฌ๋ฆฌ๊ธฐ 100 ms.

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

๋‹จ๊ณ„, ๊ฒฝ๋กœ, Follow, ๋งˆ์šฐ์Šค/ํ‚ค ์ œ์–ด ๋ฐ ์ง€๋„๋Š” ์บ๋ฆญํ„ฐ์˜ ๊ณต์œ  ๋Œ€๊ธฐ์—ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ๊ฒฝ๋กœ๋ฅผ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ๋ฐฉํ–ฅ์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์œ„์น˜๋ฅผ ์กฐ์ •ํ•ด๋„ ๊ฑธ์Œ ์š”์ฒญ ํ›„ ๋‚จ์€ ์ผ์‹œ์ •์ง€๋Š” ์ทจ์†Œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง€์—ฐ ํ›„์—๋Š” ์†์‹ค๋œ ํ”„๋ ˆ์ž„์„ ๋ณด์ƒํ•  ๋น ๋ฅธ ๋ฒ„์ŠคํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ์žฅ์• ๋ฌผ, ์˜์‚ฌ์†Œํ†ต ๋ถˆ๋Ÿ‰์œผ๋กœ ์ธํ•ด ์›€์ง์ž„์ด ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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.GetX();
        UO.Specmove(2, 0);
        UO.Wait(500);
        UO.Print(UO.GetX() - before);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.Specmove(direction) โ€” UO.Specmove(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "specmove": bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0); break;

UO.Specmove(direction, running) โ€” UO.Specmove(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "specmove": bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0); break;

UO.UseAbility

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

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

int UO.UseAbility(object? abilityId);

ํ˜„์žฌ ๋ฌด๊ธฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

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

  • abilityId - ๋Šฅ๋ ฅ์˜ ์ด๋ฆ„ ๋˜๋Š” int ID 1..AbilityData.Abilities.Length. ์ด๋ฆ„์€ ์ •๊ทœํ™”๋ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž/์ˆซ์ž๋งŒ ๋Œ€๋ฌธ์ž๋กœ ์ €์žฅ๋˜๊ณ  ๋น„๊ต๋ฉ๋‹ˆ๋‹ค. ์ˆซ์ž ํ…์ŠคํŠธ๋Š” ID๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

์ˆซ์ž ํ”Œ๋ž˜๊ทธ int: 1 - ID๋Š” ํ˜„์žฌ ํ”Œ๋ ˆ์ด์–ด์˜ ๊ธฐ๋ณธ/๋ณด์กฐ ๋Šฅ๋ ฅ๊ณผ ์ผ์น˜ํ•˜๋ฉฐ ํ•ด๋‹น GameActions๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. 0 - ํ”Œ๋ ˆ์ด์–ด ์—†์Œ, ์•Œ ์ˆ˜ ์—†์Œ ID/์ด๋ฆ„ ๋˜๋Š” ๋Šฅ๋ ฅ์ด ํ˜„์žฌ ๋ฌด๊ธฐ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋ฌธ์ž์—ด ํ˜•์‹์€ ResolveAbility๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž ์ฆ‰์‹œ ๋ธŒ๋ฆฌ์ง€.UseAbility. ํ˜„์žฌ ๋‘ ๊ฐ€์ง€ ๋Šฅ๋ ฅ์—์„œ 0x80๋ฅผ ๋งˆ์Šคํฌํ•˜๊ณ  ID์™€ ์ผ์น˜์‹œํ‚จ ๋‹ค์Œ UsePrimaryAbility ๋˜๋Š” UseSecondaryAbility๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋Š” ์ ์ค‘, ๋งˆ๋‚˜ ์†Œ๋ชจ ๋˜๋Š” ์„œ๋ฒ„ ํ™œ์„ฑํ™” ํ™•์ธ์ด ์•„๋‹Œ ๋กœ์ปฌ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ID๋Š” GetWeaponAbilities๋กœ ์ฝํ˜€์ง€๋ฉฐ, ํ™œ์„ฑ ์ด๋ฆ„์€ GetActiveAbility์ž…๋‹ˆ๋‹ค.
  • GameActions๋Š” ๋Šฅ๋ ฅ ์„ ํƒ ๋น„ํŠธ 0x80๋ฅผ ํ† ๊ธ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์„ ํƒ๋œ ๋Šฅ๋ ฅ์€ ID 0๋ฅผ ๋ณด๋‚ด๊ณ  ์„ ํƒ์„ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‘ ์„ ํƒ ๋น„ํŠธ๊ฐ€ ๋ชจ๋‘ ์ง€์›Œ์ง€๊ณ  ์„ ํƒ๋œ ID๊ฐ€ ์ „์†ก๋œ ๋‹ค์Œ ํ•ด๋‹น ๋น„ํŠธ๊ฐ€ ๋กœ์ปฌ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋ฉด ๋Šฅ๋ ฅ์ด ๊บผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ ๋ณ€๊ฒฝ์ด ์„ฑ๊ณต์ ์ธ ์ ์ค‘์ด๋‚˜ ์„œ๋ฒ„ ํ™•์ธ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ํ˜„์žฌ ๋ฌด๊ธฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
UO.Print(UO.UseAbility("Armor Ignore"));

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

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

  • ๋ฌธ์ž์—ด ํ˜•์‹์€ ResolveAbility๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž ์ฆ‰์‹œ ๋ธŒ๋ฆฌ์ง€.UseAbility. ํ˜„์žฌ ๋‘ ๊ฐ€์ง€ ๋Šฅ๋ ฅ์—์„œ 0x80๋ฅผ ๋งˆ์Šคํฌํ•˜๊ณ  ID์™€ ์ผ์น˜์‹œํ‚จ ๋‹ค์Œ UsePrimaryAbility ๋˜๋Š” UseSecondaryAbility๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var abilities = UO.GetWeaponAbilities();
    if (Truth(UO.GetArrayLength(abilities) > 0))
    {
        UO.Print(UO.UseAbility(abilities[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. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ด๋Š” ์ ์ค‘, ๋งˆ๋‚˜ ์†Œ๋ชจ ๋˜๋Š” ์„œ๋ฒ„ ํ™œ์„ฑํ™” ํ™•์ธ์ด ์•„๋‹Œ ๋กœ์ปฌ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ID๋Š” GetWeaponAbilities๋กœ ์ฝํ˜€์ง€๋ฉฐ, ํ™œ์„ฑ ์ด๋ฆ„์€ GetActiveAbility์ž…๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var id = UO.GetAbilityID("Armor Ignore");
        if (Truth(id > 0))
        {
            var accepted = UO.UseAbility(id);
            UO.Print(accepted);
            UO.Print(UO.GetActiveAbility());
        }

        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.UseAbility(abilityId) โ€” UO.UseAbility(Integer)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int UseAbility(string abilityName)

        {

            int abilityId = bridge.ResolveAbility(abilityName);

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

        }

UO.UsePrimaryAbility

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

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

void UO.UsePrimaryAbility();

๋ฌด๊ธฐ์˜ ์ฃผ์š” ๋Šฅ๋ ฅ์„ ์†Œํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • ๋ฌด๊ธฐ์˜ ์ฃผ์š” ๋Šฅ๋ ฅ์„ ์†Œํ™˜ํ•ฉ๋‹ˆ๋‹ค.
UO.UsePrimaryAbility();

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

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

  • UsePrimaryAbility๋Š” Invoke๋ฅผ ํ†ตํ•ด GameActions.UsePrimaryAbility(_world)๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ ์ˆ˜๋ฝ ํ‘œ์‹œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ™œ์„ฑ ๋Šฅ๋ ฅ์€ ๋ณ„๋„๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.GetWeaponAbilities());
    UO.UsePrimaryAbility();
    return null;
}

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.UsePrimaryAbility();
        UO.Print(UO.GetActiveAbility());
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.UsePrimaryAbility() โ€” UO.UsePrimaryAbility()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "useprimaryability": bridge.UsePrimaryAbility(); return InjectionValue.Unit;

UO.UseSecondaryAbility

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

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

void UO.UseSecondaryAbility();

์ถ”๊ฐ€ ๋ฌด๊ธฐ ๋Šฅ๋ ฅ์„ ์†Œํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • ์ถ”๊ฐ€ ๋ฌด๊ธฐ ๋Šฅ๋ ฅ์„ ์†Œํ™˜ํ•ฉ๋‹ˆ๋‹ค.
UO.UseSecondaryAbility();

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

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

  • UseSecondaryAbility๋Š” Invoke๋ฅผ ํ†ตํ•ด GameActions.UseSecondaryAbility(_world)๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ ์ˆ˜๋ฝ ํ‘œ์‹œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ™œ์„ฑ ๋Šฅ๋ ฅ์€ ๋ณ„๋„๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.GetWeaponAbilities());
    UO.UseSecondaryAbility();
    return null;
}

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.UseSecondaryAbility();
        UO.Print(UO.GetActiveAbility());
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.UseSecondaryAbility() โ€” UO.UseSecondaryAbility()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "usesecondaryability": bridge.UseSecondaryAbility(); return InjectionValue.Unit;

UO.WarMode

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

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

int UO.WarMode();
void UO.WarMode(object? mode);

์บ๋ฆญํ„ฐ์˜ ์ „ํˆฌ ๋ชจ๋“œ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ฟผ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

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

  • mode โ€” ์„ ํƒ์  int: 0๋Š” ๋น„ํ™œ์„ฑํ™”๋˜๊ณ  0์ด ์•„๋‹Œ ๊ฐ’์€ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ํ˜•์‹์€ ์ฝ๊ธฐ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

์ธ์ˆ˜ ์—†์Œ ์ˆซ์ž ํ”Œ๋ž˜๊ทธ int: 1 - ํ˜„์žฌ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์ „ํˆฌ ๋ชจ๋“œ์— ์žˆ์Œ, 0 - ํ‰ํ™” ๋ชจ๋“œ/ํ”Œ๋ ˆ์ด์–ด ์—†์Œ. ๋ชจ๋“œ - null์—์„œ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • WarMode()๋Š” Player.InWarMode๋ฅผ ๋กœ์ปฌ์—์„œ ์ฝ์Šต๋‹ˆ๋‹ค. WarMode(๋ชจ๋“œ)๋Š” ์„ ํƒํ•œ ๋ชจ๋“œ๋กœ GameActions.ToggleWarMode๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์—†์œผ๋ฉด ์š”์ฒญ์ด ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ธ์ˆ˜๊ฐ€ ์žˆ๋Š” ์–‘์‹์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ฆ‰์‹œ ๋‹ค์‹œ ์ฝ๋Š” ๊ฒƒ์€ ์˜จ๋ผ์ธ ํ™•์ธ์ด ์•„๋‹™๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ์บ๋ฆญํ„ฐ์˜ ์ „ํˆฌ ๋ชจ๋“œ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ฟผ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
var active = UO.WarMode();
UO.Print(active);

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

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

  • WarMode()๋Š” Player.InWarMode๋ฅผ ๋กœ์ปฌ์—์„œ ์ฝ์Šต๋‹ˆ๋‹ค. WarMode(๋ชจ๋“œ)๋Š” ์„ ํƒํ•œ ๋ชจ๋“œ๋กœ GameActions.ToggleWarMode๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์—†์œผ๋ฉด ์š”์ฒญ์ด ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.WarMode(1);
    UO.Wait(250);
    UO.Print(UO.WarMode());
    return null;
}

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

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

  • ์ธ์ˆ˜๊ฐ€ ์žˆ๋Š” ์–‘์‹์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ฆ‰์‹œ ๋‹ค์‹œ ์ฝ๋Š” ๊ฒƒ์€ ์˜จ๋ผ์ธ ํ™•์ธ์ด ์•„๋‹™๋‹ˆ๋‹ค.
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.WarMode();
        UO.WarMode(0);
        UO.Print(before);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.WarMode() โ€” UO.WarMode()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int WarMode() => bridge.WarMode();

UO.WarMode(mode) โ€” UO.WarMode(Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: mode (Integer)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void WarMode(int mode) => bridge.WarMode(mode);

UO.WarTargetID

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

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

dynamic UO.WarTargetID();

๋งˆ์ง€๋ง‰ ๊ณต๊ฒฉ ๋Œ€์ƒ์˜ serial๋ฅผ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int โ€” ์ €์žฅ๋จ serial; 0์€ serial์ด ์„ค์น˜๋˜์ง€ ์•Š์•˜์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. bool๋„ ์•„๋‹ˆ๊ณ  graphic/type๋„ ์•„๋‹™๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ID๋Š” ์„ธ์ƒ์— ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ํ•„๋“œ ์†Œ์Šค: bridge.LastAttack. ์ด ๋ช…๋ น์€ ๊ฐœ์ฒด๋ฅผ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ณต๊ฒฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€, ๋Œ€์ƒ ๋˜๋Š” ์ž๋™ ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ์ƒํƒœ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ๋งˆ์ง€๋ง‰ ๊ณต๊ฒฉ ๋Œ€์ƒ์˜ serial๋ฅผ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.
var id = UO.WarTargetID();
UO.Print(Hex(id));

string Hex(object? value) => Convert.ToInt64(value).ToString("X");

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

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

  • ํ•„๋“œ ์†Œ์Šค: bridge.LastAttack. ์ด ๋ช…๋ น์€ ๊ฐœ์ฒด๋ฅผ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ณต๊ฒฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.WarTargetID();
    if (Truth(id != 0) && Truth(UO.Exists(id)))
    {
        UO.Print(UO.GetName(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. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ํ˜„์žฌ ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€, ๋Œ€์ƒ ๋˜๋Š” ์ž๋™ ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ์ƒํƒœ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
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.WarTargetID();
        UO.Wait(500);
        var after = UO.WarTargetID();
        UO.Print(before = after);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.WarTargetID() โ€” UO.WarTargetID()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "lastattack":

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