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

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

์บ๋ฆญํ„ฐ์™€ ์ƒ๋ฌผ

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

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋Š” ์บ๋ฆญํ„ฐ, NPC, ๋ชฌ์Šคํ„ฐ ๋ฐ ์• ์™„๋™๋ฌผ์ž…๋‹ˆ๋‹ค. Serial์€ ํŠน์ • ์ƒ๋ฌผ์ฒด, body/type ๊ทธ๋ž˜ํ”ฝ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

์„น์…˜

์ฃผ์ œ ๋ช…๋ น ๋ฐ ์„ค๋ช…
Players UO.GetMobiles ยท UO.FindMobile
NPC UO.IsNpc ยท UO.FindMobile
Monsters UO.FindType ยท UO.FindMobile
Pets UO.GetPetsCurrent ยท UO.GetPetsMax
Followers UO.GetFollowers ยท UO.GetFollowersMax
Name / Serial / Body UO.GetName ยท UO.GetSerial ยท UO.GetType
์ขŒํ‘œ UO.GetX ยท UO.GetY ยท UO.GetZ
Distance UO.GetDistance
Notoriety UO.Notoriety
Status UO.GetStatus ยท UO.Alive ยท UO.Dead ยท UO.Hidden ยท UO.Poisoned ยท UO.Paralyzed
Rename UO.Rename

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

ํ”Œ๋ ˆ์ด์–ด / NPC / ๋ชฌ์Šคํ„ฐ

UO.GetMobile ยท UO.GetMobiles ยท UO.IsNpc

์• ์™„๋™๋ฌผ / Followers

UO.Followers ยท UO.GetFollowers ยท UO.FollowersMax ยท UO.GetFollowersMax ยท UO.PetsCurrent ยท UO.GetPetsCurrent ยท UO.PetsMax ยท UO.GetPetsMax

Notoriety

UO.Notoriety ยท UO.GetNotoriety

Rename

UO.CanChangeName ยท UO.MobileCanBeRenamed ยท UO.Rename ยท UO.RenameMobile

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

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

UO.GetMobiles

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

var radius = 12;
var allyStatus = 2;
var anyBody = -1;
var maxHeight = 8;
dynamic nearestFirst = true;
dynamic includeMe = false;
dynamic livingOnly = true;
dynamic visibleOnly = true;
var allies = UO.GetMobiles(radius, allyStatus, anyBody, maxHeight, nearestFirst, includeMe, livingOnly, visibleOnly);
if (Truth(ArrayLength(allies) == 0))
{
    return null;
}
UO.AddObject("leader", allies[0]);
UO.Follow(allies[0], 2, false);

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.GetNotoriety

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

var value = UO.GetNotoriety();
UO.Print("GetNotoriety: " + Convert.ToString(value));

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


UO.CanChangeName

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

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

int UO.CanChangeName(object? id);

mobile ์ด๋ฆ„์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์•Œ๋ ค์ง„ ํ‘œ์‹œ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

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

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • self ์ธ์ˆ˜๋Š” ํ•ด๋‹น ๋ฌธ์ž๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ - 1/0์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด ์• ์™„๋™๋ฌผ์— ๋Œ€ํ•œ ๋งˆ์ง€๋ง‰ ์„œ๋ฒ„ ๊ถŒํ•œ์ž…๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๊ฐœ์ฒด์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ์ง€ ์•Š์œผ๋ฉฐ ํ›„์† ์š”์ฒญ์ด ์„œ๋ฒ„์—์„œ ์ˆ˜๋ฝ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var state = UO.CanChangeName("self");
if (Truth(state))
{
    UO.Print("Rename permission flag is present");
}
else
{
    UO.Print("Rename permission flag is absent");
}

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์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” IsRenamable ํ•„๋“œ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ์ ˆํ•œ ์ƒํƒœ๋ฅผ ์ˆ˜์‹ ํ•œ ํ›„์—๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.CanChangeName(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.CanChangeName(target);
            await Delay(500);
            if (Truth(UO.IsNPC(target)))
            {
                var after = UO.CanChangeName(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.CanChangeName(id) โ€” UO.CanChangeName(Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int CanChangeName(InjectionValue id) => bridge.CanChangeName(GetObject(id));

UO.Followers

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

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

int UO.Followers();

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

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

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

๋ฐ˜ํ™˜๊ฐ’

int - ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์—์„œ๋Š” ์• ์™„๋™๋ฌผ ์ œ์–ด ์Šฌ๋กฏ, 0..255๋ฅผ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. 0๋Š” ์‹ค์ œ ๊ฐ’์ด๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๊ฑฐ๋‚˜, ๋ˆ„๋ฝ/ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” bool, ID ๋˜๋Š” type๊ฐ€ ์•„๋‹Œ ์ˆ˜๋Ÿ‰์ž…๋‹ˆ๋‹ค. 1๋Š” ์„ฑ๊ณต์ด ์•„๋‹ˆ๋ผ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๊ฐœ์ฒด๋ฅผ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์˜ˆ๋ฅผ ๋“ค์–ด, 5์˜ 3์ด ์‚ฌ์šฉ ์ค‘์ด๊ณ  2 ์Šฌ๋กฏ์€ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. 4 ๊ฐ’์€ ํ•œ ์Šฌ๋กฏ์— ์ƒ๋ฌผ 4๊ฐœ, 4๊ฐœ์— ์ƒ๋ฌผ 1๊ฐœ ๋˜๋Š” ๊ธฐํƒ€ ์กฐํ•ฉ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 2์— ์žˆ๋Š” ์ƒ๋ฌผ์˜ ๊ฒฝ์šฐ "busy < maximum" ์ฒดํฌ ์Šฌ๋กฏ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€ - ํ˜„์žฌ >= 2๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์ƒ๋ฌผ์˜ ๋น„์šฉ๊ณผ ํ•œ๋„๋Š” ์„œ๋ฒ„์— ์˜ํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. FollowersMax๋ฅผ ์ƒ์ˆ˜ 5๋กœ ๋Œ€์ฒดํ•˜์ง€ ๋งˆ์„ธ์š”.
  • 0๋Š” ์• ์™„๋™๋ฌผ์ด ๋ถ„์‹ค, ์‚ฌ๋ง ๋˜๋Š” ์„๋ฐฉ๋˜์—ˆ์Œ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์• ์™„๋™๋ฌผ์ด ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ์ƒํƒœ๊ฐ€ ์•„์ง ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์นด์šดํ„ฐ์˜ ์ฆ๊ฐ€๋Š” ์ œ์–ด๊ถŒ ๋ณ€๊ฒฝ์˜ ์ถ”๊ฐ€์ ์ธ ์‹ ํ˜ธ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์ƒ๋ฌผ์ด ๊ธธ๋“ค์—ฌ์กŒ๋Š”์ง€ ๊ฒฐ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์™€ ํŽซ ์ž์ฒด์˜ ๋ฉ”์‹œ์ง€๋„ ํ™•์ธํ•ด๋ณด์„ธ์š”. ์ด ์Šฌ๋กฏ์€ ๋งˆ๊ตฌ๊ฐ„์˜ ์žฅ์†Œ์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์€ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ •ํ™•ํ•œ ์„œ๋ช…์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๊ฒŒ์ž„ ์Šค๋ ˆ๋“œ์—์„œ ์ฝ์œผ๋ฉด Player๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.Followers ํ˜„์žฌ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์กด์žฌํ•˜๊ณ  ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0. ์žฅ๋น„๊ฐ€ ์ •๋ ฌ๋˜์ง€ ์•Š๊ณ , ๋ณด๋„ˆ์Šค๊ฐ€ ๋‹ค์‹œ ๊ณ„์‚ฐ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ƒํƒœ๊ฐ€ ์š”์ฒญ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ ๋ น์€ ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • PetsCurrent/Followers๋Š” ์ƒํƒœ type >= 3์—์„œ ์ ์œ ๋œ ์ œ์–ด ์Šฌ๋กฏ์„ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์• ์™„๋™๋ฌผ ํ•œ ๋งˆ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ ์Šฌ๋กฏ์„ ์ฐจ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์†Œํ™˜ ๋ฐ ๊ธธ๋“ค์ธ ์ƒ๋ฌผ์— ๋Œ€ํ•œ ๊ทœ์น™์€ ์„œ๋ฒ„์—์„œ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ณด์ด๋Š” mobile์˜ ์ˆซ์ž๋„ ์•„๋‹ˆ๊ณ , ID ์• ์™„๋™๋ฌผ์˜ ๋ชฉ๋ก๋„ ์•„๋‹ˆ๊ณ , ๊ทผ์ฒ˜์— ์žˆ๋Š” ๋™๋ฌผ์˜ ์ˆซ์ž๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • CharacterStatus๋Š” ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ๋ณธ๋ฌธ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Weight๋Š” ์ž์ฒด ํ™•์žฅ ์ƒํƒœ์ธ ์Šฌ๋กฏ - type 3, Luck - type 4, ์„œ๋ฒ„ WeightMax - type 5์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒ์  ์นด์šดํ„ฐ๊ฐ€ ์—†๋Š” ์ปดํŒฉํŠธ/์˜ค๋ž˜๋œ ํŒจํ‚ค์ง€๋Š” ์ด์ „ ์บ์‹œ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ํ”Œ๋ ˆ์ด์–ด๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ํ†ตํ™”๋Š” ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ›์•˜๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ๋Š” ๋‹ค๋ฅธ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๊ฒฐ๊ณผ๋Š” ์—ฐ๊ฒฐ์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0์€ ๊ฐ’์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์Šฌ๋กฏ ๊ณ„์‚ฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ํ˜„์žฌ - ์‚ฌ์šฉ ์ค‘, ์ตœ๋Œ€ - ์ œํ•œ, freeSlots - ์ฐจ์ด. ์•Œ ์ˆ˜ ์—†๋Š”/0 ์ œํ•œ ๋˜๋Š” ์ผ๊ด€์„ฑ ์—†๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ณต๊ฐ„์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•˜์ง€ ์•Š๊ณ  ์˜ˆ์ œ๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ตœ์‹  ์ƒํƒœ๋งŒ ์ฝ๊ณ  ์ƒˆ ์—…๋ฐ์ดํŠธ๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var current = UO.Followers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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

2. ๋™๋ฌผ ๊ธธ๋“ค์ด๊ธฐ ์ „ ์šฉ๋Ÿ‰ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋จผ์ € ID๊ฐ€ lasttarget์— ์žˆ๋„๋ก ์›ํ•˜๋Š” ๋™๋ฌผ์„ ์„ ํƒํ•˜์„ธ์š”. requiredSlots=2 - ์˜ˆ์‹œ ์„ค์ •, ์„œ๋ฒ„์— ์žˆ๋Š” ์ด ์ƒ๋ฌผ์˜ ์‹ค์ œ ๋น„์šฉ์œผ๋กœ ๋Œ€์ฒดํ•˜์„ธ์š”. ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•  ๊ฒฝ์šฐ ๋Œ€์ƒ์ด ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฉฐ ์Šคํ‚ฌ์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋Œ€์ƒ์˜ ๋Œ€๊ธฐ์—ด์€ ๋‹จ์ผ ์ธ์ˆ˜ UseSkill("๋™๋ฌผ ๊ธธ๋“ค์ด๊ธฐ") ์ด์ „์— ์ค€๋น„๋ฉ๋‹ˆ๋‹ค. ์‹œ๋„๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์„ฑ๊ณต์ด ๋ณด์žฅ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ธฐ์ˆ , ๋ฒ”์œ„, ๊ธธ๋“ค์ž„ ๊ฐ€๋Šฅ์„ฑ ๋ฐ ์„œ๋ฒ„ ์‘๋‹ต์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.Followers();
    var maximum = UO.FollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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. ๋น„์šฉ์ด ๋‹ค๋ฅธ ์ƒ๋ฌผ์— ๋Œ€ํ•œ ์žฌ์‚ฌ์šฉ ํ™•์ธ - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

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

  • CanAddFollower๋Š” ์ƒˆ๋กœ์šด UO ๋ช…๋ น์ด ์•„๋‹ˆ๋ผ ์™„์ „ํžˆ ์„ ์–ธ๋œ ์‚ฌ์šฉ์ž ๋„์šฐ๋ฏธ์ž…๋‹ˆ๋‹ค. ์บ์‹œ ์ œํ•œ์ด ์ถฉ๋ถ„ํ•˜๋ฉด 1/true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0/false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. extraSlots ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” type/ID๊ฐ€ ์•„๋‹ˆ๋ผ ADDED๋˜๋Š” ์ƒ๋ฌผ์˜ ๋น„์šฉ์ž…๋‹ˆ๋‹ค. 2 - ์˜ˆ; ํ•ด๋‹น ๊ธฐ๋Šฅ์€ ๊ธธ๋“ค์ด๊ฑฐ๋‚˜ ์†Œํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ ๊ฒ€์€ ์กฐ์น˜ ์ง์ „์— ๋ฐ˜๋ณต๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

    dynamic CanAddFollower(dynamic extraSlots)
    {
        if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.Followers();
        var maximum = UO.PetsMax();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extraSlots <= maximum - current;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.Followers() โ€” UO.Followers()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.Followers

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


UO.FollowersMax

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

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

int UO.FollowersMax();

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

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

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

๋ฐ˜ํ™˜๊ฐ’

int - ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์—์„œ๋Š” ์ตœ๋Œ€ ์• ์™„๋™๋ฌผ ์ œ์–ด ์Šฌ๋กฏ, 0..255. 0๋Š” ์‹ค์ œ ๊ฐ’์ด๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๊ฑฐ๋‚˜, ๋ˆ„๋ฝ/ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” bool, ID ๋˜๋Š” type๊ฐ€ ์•„๋‹Œ ์ˆ˜๋Ÿ‰์ž…๋‹ˆ๋‹ค. 1๋Š” ์„ฑ๊ณต์ด ์•„๋‹ˆ๋ผ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๊ฐœ์ฒด๋ฅผ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์˜ˆ๋ฅผ ๋“ค์–ด, 5์˜ 3์ด ์‚ฌ์šฉ ์ค‘์ด๊ณ  2 ์Šฌ๋กฏ์€ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. 4 ๊ฐ’์€ ํ•œ ์Šฌ๋กฏ์— ์ƒ๋ฌผ 4๊ฐœ, 4๊ฐœ์— ์ƒ๋ฌผ 1๊ฐœ ๋˜๋Š” ๊ธฐํƒ€ ์กฐํ•ฉ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 2์— ์žˆ๋Š” ์ƒ๋ฌผ์˜ ๊ฒฝ์šฐ "busy < maximum" ์ฒดํฌ ์Šฌ๋กฏ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€ - ํ˜„์žฌ >= 2๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์ƒ๋ฌผ์˜ ๋น„์šฉ๊ณผ ํ•œ๋„๋Š” ์„œ๋ฒ„์— ์˜ํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. FollowersMax๋ฅผ ์ƒ์ˆ˜ 5๋กœ ๋Œ€์ฒดํ•˜์ง€ ๋งˆ์„ธ์š”.
  • 0๋Š” ์• ์™„๋™๋ฌผ์ด ๋ถ„์‹ค, ์‚ฌ๋ง ๋˜๋Š” ์„๋ฐฉ๋˜์—ˆ์Œ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์• ์™„๋™๋ฌผ์ด ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ์ƒํƒœ๊ฐ€ ์•„์ง ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์นด์šดํ„ฐ์˜ ์ฆ๊ฐ€๋Š” ์ œ์–ด๊ถŒ ๋ณ€๊ฒฝ์˜ ์ถ”๊ฐ€์ ์ธ ์‹ ํ˜ธ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์ƒ๋ฌผ์ด ๊ธธ๋“ค์—ฌ์กŒ๋Š”์ง€ ๊ฒฐ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์™€ ํŽซ ์ž์ฒด์˜ ๋ฉ”์‹œ์ง€๋„ ํ™•์ธํ•ด๋ณด์„ธ์š”. ์ด ์Šฌ๋กฏ์€ ๋งˆ๊ตฌ๊ฐ„์˜ ์žฅ์†Œ์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์€ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ •ํ™•ํ•œ ์„œ๋ช…์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๊ฒŒ์ž„ ์Šค๋ ˆ๋“œ์—์„œ ์ฝ์œผ๋ฉด Player๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.FollowersMax ํ˜„์žฌ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์กด์žฌํ•˜๊ณ  ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0. ์žฅ๋น„๊ฐ€ ์ •๋ ฌ๋˜์ง€ ์•Š๊ณ , ๋ณด๋„ˆ์Šค๊ฐ€ ๋‹ค์‹œ ๊ณ„์‚ฐ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ƒํƒœ๊ฐ€ ์š”์ฒญ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ ๋ น์€ ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • PetsMax/FollowersMax๋Š” ์—ฌ์œ  ์Šฌ๋กฏ์ด ์•„๋‹Œ type >= 3 ์ƒํƒœ์—์„œ ์„œ๋ฒ„๊ฐ€ ํ—ˆ์šฉํ•˜๋Š” ์ด ์Šฌ๋กฏ ์ œํ•œ์„ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ํ•œ๋„๋ณด๋‹ค ๋” ๋งŽ์€ ์Šฌ๋กฏ์ด ์ ์œ ๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ์œ  ์šฉ๋Ÿ‰์„ ์ตœ๋Œ€ ์ „๋ฅ˜๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ 0๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ํŒ€์€ ์•„๋ฌด๊ฒƒ๋„ ๊ณต๊ฐœํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ธธ๋“ค์ด๊ฑฐ๋‚˜ ์š”๊ตฌํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.
  • CharacterStatus๋Š” ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ๋ณธ๋ฌธ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Weight๋Š” ์ž์ฒด ํ™•์žฅ ์ƒํƒœ์ธ ์Šฌ๋กฏ - type 3, Luck - type 4, ์„œ๋ฒ„ WeightMax - type 5์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒ์  ์นด์šดํ„ฐ๊ฐ€ ์—†๋Š” ์ปดํŒฉํŠธ/์˜ค๋ž˜๋œ ํŒจํ‚ค์ง€๋Š” ์ด์ „ ์บ์‹œ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ํ”Œ๋ ˆ์ด์–ด๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ํ†ตํ™”๋Š” ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ›์•˜๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ๋Š” ๋‹ค๋ฅธ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๊ฒฐ๊ณผ๋Š” ์—ฐ๊ฒฐ์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0์€ ๊ฐ’์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์Šฌ๋กฏ ๊ณ„์‚ฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ํ˜„์žฌ - ์‚ฌ์šฉ ์ค‘, ์ตœ๋Œ€ - ์ œํ•œ, freeSlots - ์ฐจ์ด. ์•Œ ์ˆ˜ ์—†๋Š”/0 ์ œํ•œ ๋˜๋Š” ์ผ๊ด€์„ฑ ์—†๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ณต๊ฐ„์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•˜์ง€ ์•Š๊ณ  ์˜ˆ์ œ๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ตœ์‹  ์ƒํƒœ๋งŒ ์ฝ๊ณ  ์ƒˆ ์—…๋ฐ์ดํŠธ๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var current = UO.Followers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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

2. ๋™๋ฌผ ๊ธธ๋“ค์ด๊ธฐ ์ „ ์šฉ๋Ÿ‰ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋จผ์ € ID๊ฐ€ lasttarget์— ์žˆ๋„๋ก ์›ํ•˜๋Š” ๋™๋ฌผ์„ ์„ ํƒํ•˜์„ธ์š”. requiredSlots=2 - ์˜ˆ์‹œ ์„ค์ •, ์„œ๋ฒ„์— ์žˆ๋Š” ์ด ์ƒ๋ฌผ์˜ ์‹ค์ œ ๋น„์šฉ์œผ๋กœ ๋Œ€์ฒดํ•˜์„ธ์š”. ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•  ๊ฒฝ์šฐ ๋Œ€์ƒ์ด ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฉฐ ์Šคํ‚ฌ์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋Œ€์ƒ์˜ ๋Œ€๊ธฐ์—ด์€ ๋‹จ์ผ ์ธ์ˆ˜ UseSkill("๋™๋ฌผ ๊ธธ๋“ค์ด๊ธฐ") ์ด์ „์— ์ค€๋น„๋ฉ๋‹ˆ๋‹ค. ์‹œ๋„๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์„ฑ๊ณต์ด ๋ณด์žฅ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ธฐ์ˆ , ๋ฒ”์œ„, ๊ธธ๋“ค์ž„ ๊ฐ€๋Šฅ์„ฑ ๋ฐ ์„œ๋ฒ„ ์‘๋‹ต์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.Followers();
    var maximum = UO.FollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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. ๋น„์šฉ์ด ๋‹ค๋ฅธ ์ƒ๋ฌผ์— ๋Œ€ํ•œ ์žฌ์‚ฌ์šฉ ํ™•์ธ - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

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

  • CanAddFollower๋Š” ์ƒˆ๋กœ์šด UO ๋ช…๋ น์ด ์•„๋‹ˆ๋ผ ์™„์ „ํžˆ ์„ ์–ธ๋œ ์‚ฌ์šฉ์ž ๋„์šฐ๋ฏธ์ž…๋‹ˆ๋‹ค. ์บ์‹œ ์ œํ•œ์ด ์ถฉ๋ถ„ํ•˜๋ฉด 1/true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0/false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. extraSlots ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” type/ID๊ฐ€ ์•„๋‹ˆ๋ผ ADDED๋˜๋Š” ์ƒ๋ฌผ์˜ ๋น„์šฉ์ž…๋‹ˆ๋‹ค. 2 - ์˜ˆ; ํ•ด๋‹น ๊ธฐ๋Šฅ์€ ๊ธธ๋“ค์ด๊ฑฐ๋‚˜ ์†Œํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ ๊ฒ€์€ ์กฐ์น˜ ์ง์ „์— ๋ฐ˜๋ณต๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

    dynamic CanAddFollower(dynamic extraSlots)
    {
        if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.PetsCurrent();
        var maximum = UO.FollowersMax();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extraSlots <= maximum - current;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.FollowersMax() โ€” UO.FollowersMax()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.FollowersMax

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


UO.GetFollowers

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

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

int UO.GetFollowers();

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

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

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

๋ฐ˜ํ™˜๊ฐ’

int - ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์—์„œ๋Š” ์• ์™„๋™๋ฌผ ์ œ์–ด ์Šฌ๋กฏ, 0..255๋ฅผ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. 0๋Š” ์‹ค์ œ ๊ฐ’์ด๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๊ฑฐ๋‚˜, ๋ˆ„๋ฝ/ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” bool, ID ๋˜๋Š” type๊ฐ€ ์•„๋‹Œ ์ˆ˜๋Ÿ‰์ž…๋‹ˆ๋‹ค. 1๋Š” ์„ฑ๊ณต์ด ์•„๋‹ˆ๋ผ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๊ฐœ์ฒด๋ฅผ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์˜ˆ๋ฅผ ๋“ค์–ด, 5์˜ 3์ด ์‚ฌ์šฉ ์ค‘์ด๊ณ  2 ์Šฌ๋กฏ์€ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. 4 ๊ฐ’์€ ํ•œ ์Šฌ๋กฏ์— ์ƒ๋ฌผ 4๊ฐœ, 4๊ฐœ์— ์ƒ๋ฌผ 1๊ฐœ ๋˜๋Š” ๊ธฐํƒ€ ์กฐํ•ฉ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 2์— ์žˆ๋Š” ์ƒ๋ฌผ์˜ ๊ฒฝ์šฐ "busy < maximum" ์ฒดํฌ ์Šฌ๋กฏ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€ - ํ˜„์žฌ >= 2๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์ƒ๋ฌผ์˜ ๋น„์šฉ๊ณผ ํ•œ๋„๋Š” ์„œ๋ฒ„์— ์˜ํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. FollowersMax๋ฅผ ์ƒ์ˆ˜ 5๋กœ ๋Œ€์ฒดํ•˜์ง€ ๋งˆ์„ธ์š”.
  • 0๋Š” ์• ์™„๋™๋ฌผ์ด ๋ถ„์‹ค, ์‚ฌ๋ง ๋˜๋Š” ์„๋ฐฉ๋˜์—ˆ์Œ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์• ์™„๋™๋ฌผ์ด ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ์ƒํƒœ๊ฐ€ ์•„์ง ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์นด์šดํ„ฐ์˜ ์ฆ๊ฐ€๋Š” ์ œ์–ด๊ถŒ ๋ณ€๊ฒฝ์˜ ์ถ”๊ฐ€์ ์ธ ์‹ ํ˜ธ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์ƒ๋ฌผ์ด ๊ธธ๋“ค์—ฌ์กŒ๋Š”์ง€ ๊ฒฐ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์™€ ํŽซ ์ž์ฒด์˜ ๋ฉ”์‹œ์ง€๋„ ํ™•์ธํ•ด๋ณด์„ธ์š”. ์ด ์Šฌ๋กฏ์€ ๋งˆ๊ตฌ๊ฐ„์˜ ์žฅ์†Œ์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์€ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ •ํ™•ํ•œ ์„œ๋ช…์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๊ฒŒ์ž„ ์Šค๋ ˆ๋“œ์—์„œ ์ฝ์œผ๋ฉด Player๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.Followers ํ˜„์žฌ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์กด์žฌํ•˜๊ณ  ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0. ์žฅ๋น„๊ฐ€ ์ •๋ ฌ๋˜์ง€ ์•Š๊ณ , ๋ณด๋„ˆ์Šค๊ฐ€ ๋‹ค์‹œ ๊ณ„์‚ฐ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ƒํƒœ๊ฐ€ ์š”์ฒญ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ ๋ น์€ ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • PetsCurrent/Followers๋Š” ์ƒํƒœ type >= 3์—์„œ ์ ์œ ๋œ ์ œ์–ด ์Šฌ๋กฏ์„ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์• ์™„๋™๋ฌผ ํ•œ ๋งˆ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ ์Šฌ๋กฏ์„ ์ฐจ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์†Œํ™˜ ๋ฐ ๊ธธ๋“ค์ธ ์ƒ๋ฌผ์— ๋Œ€ํ•œ ๊ทœ์น™์€ ์„œ๋ฒ„์—์„œ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ณด์ด๋Š” mobile์˜ ์ˆซ์ž๋„ ์•„๋‹ˆ๊ณ , ID ์• ์™„๋™๋ฌผ์˜ ๋ชฉ๋ก๋„ ์•„๋‹ˆ๊ณ , ๊ทผ์ฒ˜์— ์žˆ๋Š” ๋™๋ฌผ์˜ ์ˆซ์ž๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • CharacterStatus๋Š” ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ๋ณธ๋ฌธ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Weight๋Š” ์ž์ฒด ํ™•์žฅ ์ƒํƒœ์ธ ์Šฌ๋กฏ - type 3, Luck - type 4, ์„œ๋ฒ„ WeightMax - type 5์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒ์  ์นด์šดํ„ฐ๊ฐ€ ์—†๋Š” ์ปดํŒฉํŠธ/์˜ค๋ž˜๋œ ํŒจํ‚ค์ง€๋Š” ์ด์ „ ์บ์‹œ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ํ”Œ๋ ˆ์ด์–ด๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ํ†ตํ™”๋Š” ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ›์•˜๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ๋Š” ๋‹ค๋ฅธ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๊ฒฐ๊ณผ๋Š” ์—ฐ๊ฒฐ์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0์€ ๊ฐ’์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์Šฌ๋กฏ ๊ณ„์‚ฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ํ˜„์žฌ - ์‚ฌ์šฉ ์ค‘, ์ตœ๋Œ€ - ์ œํ•œ, freeSlots - ์ฐจ์ด. ์•Œ ์ˆ˜ ์—†๋Š”/0 ์ œํ•œ ๋˜๋Š” ์ผ๊ด€์„ฑ ์—†๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ณต๊ฐ„์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•˜์ง€ ์•Š๊ณ  ์˜ˆ์ œ๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ตœ์‹  ์ƒํƒœ๋งŒ ์ฝ๊ณ  ์ƒˆ ์—…๋ฐ์ดํŠธ๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var current = UO.GetFollowers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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

2. ๋™๋ฌผ ๊ธธ๋“ค์ด๊ธฐ ์ „ ์šฉ๋Ÿ‰ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋จผ์ € ID๊ฐ€ lasttarget์— ์žˆ๋„๋ก ์›ํ•˜๋Š” ๋™๋ฌผ์„ ์„ ํƒํ•˜์„ธ์š”. requiredSlots=2 - ์˜ˆ์‹œ ์„ค์ •, ์„œ๋ฒ„์— ์žˆ๋Š” ์ด ์ƒ๋ฌผ์˜ ์‹ค์ œ ๋น„์šฉ์œผ๋กœ ๋Œ€์ฒดํ•˜์„ธ์š”. ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•  ๊ฒฝ์šฐ ๋Œ€์ƒ์ด ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฉฐ ์Šคํ‚ฌ์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋Œ€์ƒ์˜ ๋Œ€๊ธฐ์—ด์€ ๋‹จ์ผ ์ธ์ˆ˜ UseSkill("๋™๋ฌผ ๊ธธ๋“ค์ด๊ธฐ") ์ด์ „์— ์ค€๋น„๋ฉ๋‹ˆ๋‹ค. ์‹œ๋„๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์„ฑ๊ณต์ด ๋ณด์žฅ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ธฐ์ˆ , ๋ฒ”์œ„, ๊ธธ๋“ค์ž„ ๊ฐ€๋Šฅ์„ฑ ๋ฐ ์„œ๋ฒ„ ์‘๋‹ต์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.GetFollowers();
    var maximum = UO.FollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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. ๋น„์šฉ์ด ๋‹ค๋ฅธ ์ƒ๋ฌผ์— ๋Œ€ํ•œ ์žฌ์‚ฌ์šฉ ํ™•์ธ - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

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

  • CanAddFollower๋Š” ์ƒˆ๋กœ์šด UO ๋ช…๋ น์ด ์•„๋‹ˆ๋ผ ์™„์ „ํžˆ ์„ ์–ธ๋œ ์‚ฌ์šฉ์ž ๋„์šฐ๋ฏธ์ž…๋‹ˆ๋‹ค. ์บ์‹œ ์ œํ•œ์ด ์ถฉ๋ถ„ํ•˜๋ฉด 1/true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0/false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. extraSlots ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” type/ID๊ฐ€ ์•„๋‹ˆ๋ผ ADDED๋˜๋Š” ์ƒ๋ฌผ์˜ ๋น„์šฉ์ž…๋‹ˆ๋‹ค. 2 - ์˜ˆ; ํ•ด๋‹น ๊ธฐ๋Šฅ์€ ๊ธธ๋“ค์ด๊ฑฐ๋‚˜ ์†Œํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ ๊ฒ€์€ ์กฐ์น˜ ์ง์ „์— ๋ฐ˜๋ณต๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

    dynamic CanAddFollower(dynamic extraSlots)
    {
        if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.GetFollowers();
        var maximum = UO.PetsMax();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extraSlots <= maximum - current;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetFollowers() โ€” UO.GetFollowers()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.Followers

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


UO.GetFollowersMax

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

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

int UO.GetFollowersMax();

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

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

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

๋ฐ˜ํ™˜๊ฐ’

int - ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์—์„œ๋Š” ์ตœ๋Œ€ ์• ์™„๋™๋ฌผ ์ œ์–ด ์Šฌ๋กฏ, 0..255. 0๋Š” ์‹ค์ œ ๊ฐ’์ด๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๊ฑฐ๋‚˜, ๋ˆ„๋ฝ/ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” bool, ID ๋˜๋Š” type๊ฐ€ ์•„๋‹Œ ์ˆ˜๋Ÿ‰์ž…๋‹ˆ๋‹ค. 1๋Š” ์„ฑ๊ณต์ด ์•„๋‹ˆ๋ผ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๊ฐœ์ฒด๋ฅผ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์˜ˆ๋ฅผ ๋“ค์–ด, 5์˜ 3์ด ์‚ฌ์šฉ ์ค‘์ด๊ณ  2 ์Šฌ๋กฏ์€ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. 4 ๊ฐ’์€ ํ•œ ์Šฌ๋กฏ์— ์ƒ๋ฌผ 4๊ฐœ, 4๊ฐœ์— ์ƒ๋ฌผ 1๊ฐœ ๋˜๋Š” ๊ธฐํƒ€ ์กฐํ•ฉ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 2์— ์žˆ๋Š” ์ƒ๋ฌผ์˜ ๊ฒฝ์šฐ "busy < maximum" ์ฒดํฌ ์Šฌ๋กฏ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€ - ํ˜„์žฌ >= 2๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์ƒ๋ฌผ์˜ ๋น„์šฉ๊ณผ ํ•œ๋„๋Š” ์„œ๋ฒ„์— ์˜ํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. FollowersMax๋ฅผ ์ƒ์ˆ˜ 5๋กœ ๋Œ€์ฒดํ•˜์ง€ ๋งˆ์„ธ์š”.
  • 0๋Š” ์• ์™„๋™๋ฌผ์ด ๋ถ„์‹ค, ์‚ฌ๋ง ๋˜๋Š” ์„๋ฐฉ๋˜์—ˆ์Œ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์• ์™„๋™๋ฌผ์ด ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ์ƒํƒœ๊ฐ€ ์•„์ง ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์นด์šดํ„ฐ์˜ ์ฆ๊ฐ€๋Š” ์ œ์–ด๊ถŒ ๋ณ€๊ฒฝ์˜ ์ถ”๊ฐ€์ ์ธ ์‹ ํ˜ธ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์ƒ๋ฌผ์ด ๊ธธ๋“ค์—ฌ์กŒ๋Š”์ง€ ๊ฒฐ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์™€ ํŽซ ์ž์ฒด์˜ ๋ฉ”์‹œ์ง€๋„ ํ™•์ธํ•ด๋ณด์„ธ์š”. ์ด ์Šฌ๋กฏ์€ ๋งˆ๊ตฌ๊ฐ„์˜ ์žฅ์†Œ์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์€ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ •ํ™•ํ•œ ์„œ๋ช…์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๊ฒŒ์ž„ ์Šค๋ ˆ๋“œ์—์„œ ์ฝ์œผ๋ฉด Player๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.FollowersMax ํ˜„์žฌ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์กด์žฌํ•˜๊ณ  ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0. ์žฅ๋น„๊ฐ€ ์ •๋ ฌ๋˜์ง€ ์•Š๊ณ , ๋ณด๋„ˆ์Šค๊ฐ€ ๋‹ค์‹œ ๊ณ„์‚ฐ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ƒํƒœ๊ฐ€ ์š”์ฒญ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ ๋ น์€ ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • PetsMax/FollowersMax๋Š” ์—ฌ์œ  ์Šฌ๋กฏ์ด ์•„๋‹Œ type >= 3 ์ƒํƒœ์—์„œ ์„œ๋ฒ„๊ฐ€ ํ—ˆ์šฉํ•˜๋Š” ์ด ์Šฌ๋กฏ ์ œํ•œ์„ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ํ•œ๋„๋ณด๋‹ค ๋” ๋งŽ์€ ์Šฌ๋กฏ์ด ์ ์œ ๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ์œ  ์šฉ๋Ÿ‰์„ ์ตœ๋Œ€ ์ „๋ฅ˜๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ 0๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ํŒ€์€ ์•„๋ฌด๊ฒƒ๋„ ๊ณต๊ฐœํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ธธ๋“ค์ด๊ฑฐ๋‚˜ ์š”๊ตฌํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.
  • CharacterStatus๋Š” ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ๋ณธ๋ฌธ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Weight๋Š” ์ž์ฒด ํ™•์žฅ ์ƒํƒœ์ธ ์Šฌ๋กฏ - type 3, Luck - type 4, ์„œ๋ฒ„ WeightMax - type 5์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒ์  ์นด์šดํ„ฐ๊ฐ€ ์—†๋Š” ์ปดํŒฉํŠธ/์˜ค๋ž˜๋œ ํŒจํ‚ค์ง€๋Š” ์ด์ „ ์บ์‹œ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ํ”Œ๋ ˆ์ด์–ด๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ํ†ตํ™”๋Š” ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ›์•˜๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ๋Š” ๋‹ค๋ฅธ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๊ฒฐ๊ณผ๋Š” ์—ฐ๊ฒฐ์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0์€ ๊ฐ’์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์Šฌ๋กฏ ๊ณ„์‚ฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ํ˜„์žฌ - ์‚ฌ์šฉ ์ค‘, ์ตœ๋Œ€ - ์ œํ•œ, freeSlots - ์ฐจ์ด. ์•Œ ์ˆ˜ ์—†๋Š”/0 ์ œํ•œ ๋˜๋Š” ์ผ๊ด€์„ฑ ์—†๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ณต๊ฐ„์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•˜์ง€ ์•Š๊ณ  ์˜ˆ์ œ๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ตœ์‹  ์ƒํƒœ๋งŒ ์ฝ๊ณ  ์ƒˆ ์—…๋ฐ์ดํŠธ๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var current = UO.Followers();
var maximum = UO.GetFollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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

2. ๋™๋ฌผ ๊ธธ๋“ค์ด๊ธฐ ์ „ ์šฉ๋Ÿ‰ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋จผ์ € ID๊ฐ€ lasttarget์— ์žˆ๋„๋ก ์›ํ•˜๋Š” ๋™๋ฌผ์„ ์„ ํƒํ•˜์„ธ์š”. requiredSlots=2 - ์˜ˆ์‹œ ์„ค์ •, ์„œ๋ฒ„์— ์žˆ๋Š” ์ด ์ƒ๋ฌผ์˜ ์‹ค์ œ ๋น„์šฉ์œผ๋กœ ๋Œ€์ฒดํ•˜์„ธ์š”. ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•  ๊ฒฝ์šฐ ๋Œ€์ƒ์ด ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฉฐ ์Šคํ‚ฌ์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋Œ€์ƒ์˜ ๋Œ€๊ธฐ์—ด์€ ๋‹จ์ผ ์ธ์ˆ˜ UseSkill("๋™๋ฌผ ๊ธธ๋“ค์ด๊ธฐ") ์ด์ „์— ์ค€๋น„๋ฉ๋‹ˆ๋‹ค. ์‹œ๋„๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์„ฑ๊ณต์ด ๋ณด์žฅ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ธฐ์ˆ , ๋ฒ”์œ„, ๊ธธ๋“ค์ž„ ๊ฐ€๋Šฅ์„ฑ ๋ฐ ์„œ๋ฒ„ ์‘๋‹ต์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.Followers();
    var maximum = UO.GetFollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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. ๋น„์šฉ์ด ๋‹ค๋ฅธ ์ƒ๋ฌผ์— ๋Œ€ํ•œ ์žฌ์‚ฌ์šฉ ํ™•์ธ - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

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

  • CanAddFollower๋Š” ์ƒˆ๋กœ์šด UO ๋ช…๋ น์ด ์•„๋‹ˆ๋ผ ์™„์ „ํžˆ ์„ ์–ธ๋œ ์‚ฌ์šฉ์ž ๋„์šฐ๋ฏธ์ž…๋‹ˆ๋‹ค. ์บ์‹œ ์ œํ•œ์ด ์ถฉ๋ถ„ํ•˜๋ฉด 1/true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0/false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. extraSlots ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” type/ID๊ฐ€ ์•„๋‹ˆ๋ผ ADDED๋˜๋Š” ์ƒ๋ฌผ์˜ ๋น„์šฉ์ž…๋‹ˆ๋‹ค. 2 - ์˜ˆ; ํ•ด๋‹น ๊ธฐ๋Šฅ์€ ๊ธธ๋“ค์ด๊ฑฐ๋‚˜ ์†Œํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ ๊ฒ€์€ ์กฐ์น˜ ์ง์ „์— ๋ฐ˜๋ณต๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

    dynamic CanAddFollower(dynamic extraSlots)
    {
        if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.PetsCurrent();
        var maximum = UO.GetFollowersMax();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extraSlots <= maximum - current;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetFollowersMax() โ€” UO.GetFollowersMax()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.FollowersMax

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


UO.GetMobile

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

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

dynamic UO.GetMobile(object? id);

๋ถ€๋™์‚ฐ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ธฐ๋ก์„ ํ•˜๋‚˜์”ฉ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค ID.

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

  • id โ€” ํŠน์ • ๊ฐ์ฒด์˜ ์ผ๋ จ๋ฒˆํ˜ธ/ID: int, 10์ง„์ˆ˜/16์ง„์ˆ˜ ๋ฌธ์ž์—ด ๋˜๋Š” ๋ณ„์นญ ์„ค์ • self, backpack, lasttarget, lastobject ๋˜๋Š” ์ด๋ฆ„ AddObject. ์ด๊ฒƒ์€ graphic/type๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

9 ํ•„๋“œ ๋ฐฐ์—ด: [0] int serial, [1] string ์ด๋ฆ„, [2] int X, [3] int Y, [4] int Z, [5] int HP, [6] int MaxHP, [7] int ์•…๋ช…, [8] int ๋ฐฉํ–ฅ 0..7. ์•Œ ์ˆ˜ ์—†๋Š” ID์˜ ๊ฒฝ์šฐ ๋ฐฐ์—ด์—๋Š” 9 ํ•„๋“œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „๋‹ฌ๋œ ID๋Š” ์ €์žฅ๋˜๊ณ  ์ด๋ฆ„์€ ๋น„์–ด ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ˆซ์ž ์†์„ฑ์€ 0์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์™„์ „ํ•œ ํŒŒ์Šค์นผ ๊ธฐ๋ก TMobile์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด๋ฏธ ๋‹ค์šด๋กœ๋“œํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ „์ฒด ์„œ๋ฒ„์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์—ด๊ฑฐ๋‚˜ ํ•ญ๋ชฉ์„ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ๊ฐœ์ฒด๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด - 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. var์— ์ €์žฅํ•˜๊ณ , ArrayLength๋ฅผ ํ™•์ธํ•œ ํ›„ ์ ‘์†ํ•˜์„ธ์š”. ์Šค๋ƒ…์ƒท์„ ์ฐ์€ ํ›„ ์š”์†Œ๊ฐ€ ์„ธ๊ณ„์—์„œ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ธฐ ์ „์— Exists(serial)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
  • 9๊ฐœ์˜ ํ•„๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด์„œ ์บ๋ฆญํ„ฐ์˜ ์กด์žฌ๊ฐ€ ํ™•์ธ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. Exists๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋ช…๋ น ์ž์ฒด๋Š” ID๊ฐ€ Mobile์— ์†ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ญ๋ชฉ์˜ ์ด๋ฆ„/์ขŒํ‘œ ๋ฐ 0๊ฐœ์˜ ๋ฌธ์ž ์†์„ฑ์ด ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ์บ๋ฆญํ„ฐ์˜ HP/MaxHP๋Š” ์„œ๋ฒ„์—์„œ ๋ณด๋‚ด๋Š” ์Šค์ผ€์ผ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. Z - ์žฅ๋น„ ๋ ˆ์ด์–ด๊ฐ€ ์•„๋‹Œ ๋†’์ด์ž…๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์บ๋ฆญํ„ฐ์˜ ์ด๋ฆ„๊ณผ ๊ฑด๊ฐ• ์ƒํƒœ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ID=self. [1]๋Š” ์ด๋ฆ„์ด๊ณ , [5]/[6]๋Š” Mana๊ฐ€ ์•„๋‹Œ ํ˜„์žฌ ๋ฐ ์ตœ๋Œ€ HP์ž…๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด์—๋Š” 9๊ฐœ์˜ ํ•„๋“œ๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์›”๋“œ์— ์ง„์ž…ํ•˜๊ธฐ ์ „ ๋นˆ ์ด๋ฆ„๊ณผ 0/0 ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
var mobile = UO.GetMobile("self");
UO.Print(mobile[1] + ": " + Convert.ToString(mobile[5]) + "/" + Convert.ToString(mobile[6]));

2. ์„ ํƒํ•œ ์บ๋ฆญํ„ฐ์˜ ์ขŒํ‘œ ์ฝ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • lasttarget๋Š” ๋ฌธ์ž๋ฅผ ๋‚˜ํƒ€๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. [2]/[3]/[4] - X/Y/Z ์„ธ๊ณ„.
  • ๋จผ์ €, ๋ฌผ์ฒด์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์ด ๊ฐ€๋ฐฉ์— ์žˆ๋Š” ํ•ญ๋ชฉ์ธ ๊ฒฝ์šฐ ์ขŒํ‘œ๋Š” ํ•ด๋‹น ํ•ญ๋ชฉ์˜ ๊ฒ€ํ”„๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(target)))
    {
        var mobile = UO.GetMobile(target);
        UO.Print(Convert.ToString(mobile[2]) + "," + Convert.ToString(mobile[3]) + "," + Convert.ToString(mobile[4]));
    }

    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. ์„ ํƒํ•œ ๋ชจ๋ฐ”์ผ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์„ธ์š” - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • [7] - ์•…๋ช…์„ ์˜๋ฏธ, [8] - ๋ฐฉํ–ฅ 0..7. type ํ•„๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์€ ์•Œ๋ ค์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์ง€๋งŒ ์บ๋ฆญํ„ฐ๋ฅผ ์ง€์‹œํ•˜๊ฑฐ๋‚˜ ์ „ํˆฌ ๋ชจ๋“œ๋ฅผ ์ „ํ™˜ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var target = UO.GetSerial("lasttarget");
        if (Truth(UO.Exists(target)))
        {
            var mobile = UO.GetMobile(target);
            UO.Print("Notoriety: " + Convert.ToString(mobile[7]));
            UO.Print("Direction: " + Convert.ToString(mobile[8]));
        }

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getmobile":

                {

                    int id = Arg(0);

                    return new InjectionValue(new[]

                    {

                        new InjectionValue(id), new InjectionValue(bridge.GetName(id)), new InjectionValue(bridge.GetX(id)),

                        new InjectionValue(bridge.GetY(id)), new InjectionValue(bridge.GetZ(id)), new InjectionValue(bridge.GetHP(id)),

                        new InjectionValue(bridge.GetMaxHP(id)), new InjectionValue(bridge.GetNotoriety(id)), new InjectionValue(bridge.GetDir(id))

                    });

                }

UO.GetMobiles

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

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

dynamic UO.GetMobiles();
dynamic UO.GetMobiles(object? distance);
dynamic UO.GetMobiles(object? distance, object? notoriety);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest, object? includeSelf);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest, object? includeSelf, object? aliveOnly);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest, object? includeSelf, object? aliveOnly, object? visibleOnly);

์ผ์น˜ํ•˜๋Š” ๋กœ๋“œ๋œ ๋ฌธ์ž/NPC์˜ ๋ฐฐ์—ด ID์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์—ฌ๋Ÿฌ ๋Œ€์ƒ์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜, ์ž์ฒด ๋Œ€์ƒ์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜, ํ™˜๊ฒฝ์„ ๊ณ„์‚ฐํ•˜๊ฑฐ๋‚˜, ์ž‘์—… ์ „์— ์ž์ฒด ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๋•Œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

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

  • distance โ€” ์…€์„ ํฌํ•จํ•œ ์ˆ˜ํ‰ ๋ฐ˜๊ฒฝ: 5๋Š” ๊ฑฐ๋ฆฌ 0..5๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ฆฌ๋Š” max(abs(dx),abs(dy))์ด๋ฏ€๋กœ ์ธ์ ‘ํ•œ ๋Œ€๊ฐ์„ ๋„ 1์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆซ์ž๊ฐ€ ์Œ์ˆ˜์ธ ๊ฒฝ์šฐ์—๋Š” ๋ฌด์ œํ•œ ๊ฒ€์ƒ‰์ด ์•„๋‹Œ UO.FindDistance()์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. 0๋Š” ๋™์ผํ•œ X/Y ์…€์„ ๋‚จ๊น๋‹ˆ๋‹ค. ๊ฒฝ๋กœ์˜ ๊ธธ์ด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์žฅ์• ๋ฌผ๊ณผ ๋ฐ”๋‹ฅ์€ ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ™•์ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • notoriety โ€” ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ์บ๋ฆญํ„ฐ์™€์˜ ๊ด€๊ณ„ ์ƒํƒœ: 0 โ€” ์•Œ ์ˆ˜ ์—†์Œ, 1 โ€” ๋ฌด์ฃ„, 2 โ€” ๋™๋งน, 3 โ€” ํšŒ์ƒ‰, 4 โ€” ๋ฒ”์ฃ„, 5 โ€” ์ , 6 โ€” ์‚ด์ธ์ž, 7 - ๋ฌด์ ์ž…๋‹ˆ๋‹ค. ์ˆซ์ž๋Š” ํ•˜๋‚˜์˜ ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. "5|6" ๋˜๋Š” ์ˆซ์ž ๋ฐฐ์—ด - ์œ„ ํ•ญ๋ชฉ ์ค‘ ํ•˜๋‚˜. ์˜ท์˜ ์ƒ‰๊น”์ด๋‚˜ ์ˆ˜์—…์˜ ์ƒ‰๊น”์ด ์•„๋‹™๋‹ˆ๋‹ค. ์Œ์ˆ˜(๋ณดํ†ต -1), 0xFFFF, "any", ๋นˆ ๋ฌธ์ž์—ด ๋˜๋Š” ๋นˆ ๋ฐฐ์—ด์€ ์ด ํ•„ํ„ฐ๋ฅผ ๋ณ„๋„๋กœ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์œ ํšจํ•œ ์ˆซ์ž๊ฐ€ ์—†๋Š” ์ž˜๋ชป๋œ ๋ฌธ์ž์—ด์€ ๋ˆ„๊ตฌ๋„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ƒํƒœ ์ˆœ์„œ์— ๋”ฐ๋ผ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 5 ํ•„ํ„ฐ๋Š” NPC/๋ชฌ์Šคํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ์„ ํƒํ•˜๋Š” ๋Œ€์‹  ์ ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๊ฐ’์€ ์„œ๋ฒ„์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
  • 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๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ถ”๊ฐ€ ๋ฐ˜๊ฒฝ์ด๋‚˜ ํ•˜๋‚˜์˜ ๊ฐœ์ฒด ์„ ํƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • includeSelf - true/1๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ๋ชจ๋“  ํ•„ํ„ฐ์™€ Ignore๊ฐ€ ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ self๋ฅผ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. false/0๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ self๋ฅผ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ํฌํ•จํ•œ๋‹ค๊ณ  ํ•ด์„œ ๊ฒฐ๊ณผ์— self๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ๋ณด์žฅ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
  • aliveOnly - true/1๋Š” IsDead != 0์ธ ๋ชจ๋ฐ”์ผ์„ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. false/0๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. HP๋ฅผ 0๊ณผ ๋น„๊ตํ•˜์ง€ ์•Š๊ณ , ์‹œ์ฒด ์•„์ดํ…œ์„ ๊ฒ€์ƒ‰ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋Œ€์ƒ์ด ์†Œํ™˜๋œ ํ›„์—๋„ ์‚ด์•„๋‚จ์„ ๊ฒƒ์ด๋ผ๊ณ  ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • visibleOnly - true/1์—๋Š” ํ˜„์žฌ ์ƒํƒœ ClassicUO์— ๋”ฐ๋ผ IsVisible=1๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. false/0๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฒฝ/์‹œ์„  ๊ฒ€์‚ฌ๊ฐ€ ์•„๋‹Œ ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ๋กœ๋“œ๋œ ๊ฐ์ฒด์˜ ๊ฐ€์‹œ์„ฑ์ž…๋‹ˆ๋‹ค. ๊ธฐํ•˜ํ•™์  ๊ฒ€์‚ฌ๋ฅผ ์œ„ํ•ด ์ขŒํ‘œ๊ฐ€ ํฌํ•จ๋œ ๋ณ„๋„์˜ UO.CheckLOS๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์—ฌ์ „ํžˆ ์ž‘์—…์„ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

๋ฐฐ์—ด - serial ๋ชจ๋ฐ”์ผ. ๋นˆ ๋ฐฐ์—ด์€ ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ชฉํ‘œ[0] ์ „์— ArrayLength๋ฅผ ํ™•์ธํ•˜์„ธ์š”. body/type๋„ ์•„๋‹ˆ๊ณ , ์ „์ฒด HP๋„ ์•„๋‹ˆ๊ณ , 1/0๋„ ์•„๋‹™๋‹ˆ๋‹ค. ์ธ์ˆ˜ ์—†๋Š” ํ˜•์‹์€ FindDistance/FindVertical/Ignore์— ๊ณ„์† ์ ์šฉ๋˜๊ณ  self๋Š” ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ง€์—ญ ๊ฒ€์ƒ‰: ์ด๋ฏธ ๋‹ค์šด๋กœ๋“œํ•œ ๋ชจ๋ฐ”์ผ์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. 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๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • 0..8 ์œ„์น˜ ์ธ์ˆ˜๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค. classMask ๋ฐ ์ƒ‰์ƒ์€ ์ด ๋ช…๋ น์— ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ธ์ˆ˜ AttackNearest์˜ ์ˆœ์„œ๋ฅผ ์ด์–ด๋ฐ›์ง€ ๋งˆ์„ธ์š”.
  • ๋ฐฐ์—ด - ์Šค๋ƒ…์ƒท ID. ๋Œ€์ƒ์€ ๋‚˜์ค‘์— ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰๊ณผ ์ž‘์—… ์‚ฌ์ด์— ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์žˆ์—ˆ๋Š”์ง€ Exists๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•˜์„ธ์š”. ๊ทธ ์ž์ฒด๋กœ๋Š” ์•„๋ฌด๊ฒƒ๋„ ๊ณต๊ฒฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

object? result = UO.GetMobiles(5, 2, -1, 8, true, false, true, true);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋™๋งน์„ ์„ ํƒํ•˜๊ณ  ๋‹ค์Œ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • nearestFirst=true๋Š” ์•„๊ตฐ[0]์„ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์•„๊ตฐ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Follow์—๋Š” ๋ฐฐ๊ฒฝ ๊ฑท๊ธฐ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. UO.Follow(0)์„ ์ •์ฐจํ•ฉ๋‹ˆ๋‹ค. ์•„๊ตฐ์˜ ์ด๋ฆ„/ํด๋ž˜์Šค๋Š” ์ด ๋ช…๋ น์œผ๋กœ ๊ฒฐ์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var radius = 12;
var allyStatus = 2;
var anyBody = -1;
var maxHeight = 8;
dynamic nearestFirst = true;
dynamic includeMe = false;
dynamic livingOnly = true;
dynamic visibleOnly = true;
var allies = UO.GetMobiles(radius, allyStatus, anyBody, maxHeight, nearestFirst, includeMe, livingOnly, visibleOnly);
if (Truth(ArrayLength(allies) == 0))
{
    return null;
}
UO.AddObject("leader", allies[0]);
UO.Follow(allies[0], 2, false);

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. ์œ„ํ—˜ํ•œ ๋Œ€์ƒ์˜ ์ˆ˜๋ฅผ ์„ธ๊ณ  ๊ทธ ์ˆ˜์— ๋”ฐ๋ผ ์กฐ์น˜๋ฅผ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์—ฌ๊ธฐ์„œ๋Š” Nearest=false๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค. ์นด์šดํ„ฐ๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ArrayLength๋Š” ์Šคํƒ์— ์žˆ๋Š” ํ•ญ๋ชฉ ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ๋ชจ๋ฐ”์ผ ์ˆ˜์ž…๋‹ˆ๋‹ค. Alarm๋Š” ๋กœ๊ทธ์— ์•Œ๋ฆผ์„ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var enemies = UO.GetMobiles(5, "5|6", -1, 4, false, false, true, true);
    var count = ArrayLength(enemies);
    if (Truth(count == 1))
    {
        UO.Attack(enemies[0]);
    }
    else if (Truth(count > 1))
    {
        UO.Alarm();
    }

    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;

3. ์ž์‹ ์„ ํฌํ•จํ•˜์—ฌ ๋™์ผํ•œ ์…€ ๋ฐ ๋†’์ด์— ๋‚˜์—ด - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ๊ฑฐ๋ฆฌ=0 - ๋™์ผ X/Y, maxZ=0 - ๋™์ผ Z. body๋Š” 2๊ฐœ์˜ graphic๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. includeSelf=true๋Š” self๋ฅผ ํ—ˆ์šฉํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ body ๋ฐ aliveOnly์™€ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” ๋™์ผํ•œ ์‚ฌ๊ฐํ˜•์— ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฌธ์ž๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.
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 sameCell = UO.GetMobiles(0, -1, "0x0190|0x0191", 0, false, true, true, false);
        var i = 0;
        var others = 0;
        while (Truth(i < ArrayLength(sameCell)))
        {
            if (Truth(sameCell[i] != UO.GetSerial("self")))
            {
                others += 1;
            }

            i += 1;
        }

        if (Truth(others > 0))
        {
            UO.Alarm();
        }

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => CompactGetMobiles(values)

UO.GetMobiles(distance) โ€” UO.GetMobiles(Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => CompactGetMobiles(values)

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => CompactGetMobiles(values)

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => CompactGetMobiles(values)

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => CompactGetMobiles(values)

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => CompactGetMobiles(values)

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety, body, maxZ, nearest, includeSelf, aliveOnly) โ€” UO.GetMobiles(Any,Any,Any,Any,Any,Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety, body, maxZ, nearest, includeSelf, aliveOnly, visibleOnly) โ€” UO.GetMobiles(Any,Any,Any,Any,Any,Any,Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => CompactGetMobiles(values)

UO.GetNotoriety

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

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

int UO.GetNotoriety();
int UO.GetNotoriety(object? id);

ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์—์„œ ์บ๋ฆญํ„ฐ์˜ ํ‰ํŒ์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • id โ€” ์ง€์ •๋œ ๋‹จ์ผ ๋งค๊ฐœ๋ณ€์ˆ˜ ํ˜•์‹์˜ ์„ ํƒ์  ๊ฐœ์ฒด: serial ์ˆซ์ž/16์ง„์ˆ˜ ๋ฌธ์ž์—ด, "self", "lasttarget" ๋˜๋Š” ์ด๋ฆ„ AddObject. ์ด๊ฒƒ์€ graphic/type์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋…ผ์Ÿ์ด ์—†์œผ๋ฉด ์ž์‹ ์˜ ์„ฑ๊ฒฉ์ด ์ฝํ˜€์ง‘๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฝ๊ธฐ ์ „์— UO.Exists๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„์€ ๋ฒ”์œ„๋ฅผ ์—ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int โ€” 0=์•Œ ์ˆ˜ ์—†์Œ, 1=๋ฌด์ฃ„, 2=๋™๋งน, 3=ํšŒ์ƒ‰, 4=๋ฒ”์ฃ„์ž, 5=์ , 6=์‚ด์ธ์ž, 7=๋ฌด์ ์ž…๋‹ˆ๋‹ค. ์ด๋Š” hue, ์นด๋ฅด๋งˆ ๋˜๋Š” ๋ช…์„ฑ์ด ์•„๋‹Œ ์ƒํƒœ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†์Œ mobile๋Š” 0์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด๋ฏธ ์ˆ˜์‹ ๋œ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์€ ๊ณต๊ฐœ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์„œ๋ฒ„๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ณด๋‚ด๋„๋ก ๊ฐ•์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ๋ง, ๋งต ์ „ํ™˜ ๋˜๋Š” ๊ฐ์ฒด ์‚ญ์ œ ํ›„ ๋‘ ํ˜ธ์ถœ ์‚ฌ์ด์— ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

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

1. ์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ๊ฐ’ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ํ˜ธ์ถœ์€ self๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ์˜ ํ‰ํŒ์€ ๊ฐ€์น˜๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • Convert.ToString๋Š” ์ถœ๋ ฅํ•  ์ˆซ์ž๋ฅผ ๋ณ€ํ™˜ํ•˜๋ฉฐ ๊ฒฐ๊ณผ์˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var value = UO.GetNotoriety();
UO.Print("GetNotoriety: " + Convert.ToString(value));

2. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์— ๊ฐ’ ์‚ฌ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ธ์ˆ˜ ์—†์ด ๊ฐ’์„ ํ•œ ๋ฒˆ ์ฝ์Šต๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ์˜ ํ‰ํŒ์€ ํ‘œ์‹œ๋œ ๊ณ„์‚ฐ์ด๋‚˜ ์กฐ๊ฑด์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ˆซ์ž ์ž„๊ณ„๊ฐ’์€ ์Šคํฌ๋ฆฝํŠธ ์กฐ๊ฑด์˜ ์˜ˆ์ด๋ฉฐ ์ƒˆ๋กœ์šด ํด๋ผ์ด์–ธํŠธ ์ œํ•œ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ•„๋“œ์—๋Š” ์œ„์— ์„ค๋ช…๋œ ์„œ๋ฒ„ ๋‹จ์œ„ ๋ฐ ์ œํ•œ ์‚ฌํ•ญ์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetNotoriety();
    if (Truth(value == 3) || Truth(value == 4))
    {
        UO.Print("Gray or criminal notoriety");
    }

    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. ์„ ํƒํ•œ ๊ฐ์ฒด์˜ ์†์„ฑ ์ฝ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ๋‹จ์ผ ์ธ์ˆ˜๋Š” ๊ฐœ์ฒด lasttarget๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น serial๋Š” ํด๋ผ์ด์–ธํŠธ์— ์•Œ๋ ค์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”ฝ/type๋Š” ์—ฌ๊ธฐ๋กœ ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Exists๊ฐ€ ์–‘์ˆ˜์ธ ๊ฒฝ์šฐ์—๋„ ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์•Œ ์ˆ˜ ์—†์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋ฐฉ ์† ์•„์ดํ…œ์˜ ์ขŒํ‘œ๋Š” ์›”๋“œ ํฌ์ธํŠธ๊ฐ€ ์•„๋‹Œ ์ปจํ…Œ์ด๋„ˆ์˜ ์œ„์น˜๋ฅผ โ€‹โ€‹๊ตฌํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(UO.Exists("lasttarget")))
        {
            var targetValue = UO.GetNotoriety("lasttarget");
            UO.Print("Selected value: " + Convert.ToString(targetValue));
        }
        else
        {
            UO.Print("Target is not loaded");
        }

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.GetNotoriety(bridge.Self)

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UO.GetNotoriety(id) โ€” UO.GetNotoriety(Any)

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

๊ฒฐ๊ณผ: int / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getnotoriety": return new InjectionValue(bridge.GetNotoriety(Arg(0)));

UO.GetNotoriety(id) โ€” UO.GetNotoriety(Integer)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GetNotoriety(int id) => bridge.GetNotoriety(id);

UO.GetNotoriety(id) โ€” UO.GetNotoriety(String)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GetNotoriety(string id) => GetNotoriety(GetObject(id));

UO.GetPetsCurrent

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

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

int UO.GetPetsCurrent();

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

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

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

๋ฐ˜ํ™˜๊ฐ’

int - ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์—์„œ๋Š” ์• ์™„๋™๋ฌผ ์ œ์–ด ์Šฌ๋กฏ, 0..255๋ฅผ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. 0๋Š” ์‹ค์ œ ๊ฐ’์ด๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๊ฑฐ๋‚˜, ๋ˆ„๋ฝ/ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” bool, ID ๋˜๋Š” type๊ฐ€ ์•„๋‹Œ ์ˆ˜๋Ÿ‰์ž…๋‹ˆ๋‹ค. 1๋Š” ์„ฑ๊ณต์ด ์•„๋‹ˆ๋ผ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๊ฐœ์ฒด๋ฅผ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์˜ˆ๋ฅผ ๋“ค์–ด, 5์˜ 3์ด ์‚ฌ์šฉ ์ค‘์ด๊ณ  2 ์Šฌ๋กฏ์€ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. 4 ๊ฐ’์€ ํ•œ ์Šฌ๋กฏ์— ์ƒ๋ฌผ 4๊ฐœ, 4๊ฐœ์— ์ƒ๋ฌผ 1๊ฐœ ๋˜๋Š” ๊ธฐํƒ€ ์กฐํ•ฉ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 2์— ์žˆ๋Š” ์ƒ๋ฌผ์˜ ๊ฒฝ์šฐ "busy < maximum" ์ฒดํฌ ์Šฌ๋กฏ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€ - ํ˜„์žฌ >= 2๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์ƒ๋ฌผ์˜ ๋น„์šฉ๊ณผ ํ•œ๋„๋Š” ์„œ๋ฒ„์— ์˜ํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. FollowersMax๋ฅผ ์ƒ์ˆ˜ 5๋กœ ๋Œ€์ฒดํ•˜์ง€ ๋งˆ์„ธ์š”.
  • 0๋Š” ์• ์™„๋™๋ฌผ์ด ๋ถ„์‹ค, ์‚ฌ๋ง ๋˜๋Š” ์„๋ฐฉ๋˜์—ˆ์Œ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์• ์™„๋™๋ฌผ์ด ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ์ƒํƒœ๊ฐ€ ์•„์ง ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์นด์šดํ„ฐ์˜ ์ฆ๊ฐ€๋Š” ์ œ์–ด๊ถŒ ๋ณ€๊ฒฝ์˜ ์ถ”๊ฐ€์ ์ธ ์‹ ํ˜ธ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์ƒ๋ฌผ์ด ๊ธธ๋“ค์—ฌ์กŒ๋Š”์ง€ ๊ฒฐ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์™€ ํŽซ ์ž์ฒด์˜ ๋ฉ”์‹œ์ง€๋„ ํ™•์ธํ•ด๋ณด์„ธ์š”. ์ด ์Šฌ๋กฏ์€ ๋งˆ๊ตฌ๊ฐ„์˜ ์žฅ์†Œ์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์€ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ •ํ™•ํ•œ ์„œ๋ช…์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๊ฒŒ์ž„ ์Šค๋ ˆ๋“œ์—์„œ ์ฝ์œผ๋ฉด Player๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.Followers ํ˜„์žฌ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์กด์žฌํ•˜๊ณ  ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0. ์žฅ๋น„๊ฐ€ ์ •๋ ฌ๋˜์ง€ ์•Š๊ณ , ๋ณด๋„ˆ์Šค๊ฐ€ ๋‹ค์‹œ ๊ณ„์‚ฐ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ƒํƒœ๊ฐ€ ์š”์ฒญ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ ๋ น์€ ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • PetsCurrent/Followers๋Š” ์ƒํƒœ type >= 3์—์„œ ์ ์œ ๋œ ์ œ์–ด ์Šฌ๋กฏ์„ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์• ์™„๋™๋ฌผ ํ•œ ๋งˆ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ ์Šฌ๋กฏ์„ ์ฐจ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์†Œํ™˜ ๋ฐ ๊ธธ๋“ค์ธ ์ƒ๋ฌผ์— ๋Œ€ํ•œ ๊ทœ์น™์€ ์„œ๋ฒ„์—์„œ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ณด์ด๋Š” mobile์˜ ์ˆซ์ž๋„ ์•„๋‹ˆ๊ณ , ID ์• ์™„๋™๋ฌผ์˜ ๋ชฉ๋ก๋„ ์•„๋‹ˆ๊ณ , ๊ทผ์ฒ˜์— ์žˆ๋Š” ๋™๋ฌผ์˜ ์ˆซ์ž๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • CharacterStatus๋Š” ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ๋ณธ๋ฌธ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Weight๋Š” ์ž์ฒด ํ™•์žฅ ์ƒํƒœ์ธ ์Šฌ๋กฏ - type 3, Luck - type 4, ์„œ๋ฒ„ WeightMax - type 5์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒ์  ์นด์šดํ„ฐ๊ฐ€ ์—†๋Š” ์ปดํŒฉํŠธ/์˜ค๋ž˜๋œ ํŒจํ‚ค์ง€๋Š” ์ด์ „ ์บ์‹œ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ํ”Œ๋ ˆ์ด์–ด๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ํ†ตํ™”๋Š” ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ›์•˜๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ๋Š” ๋‹ค๋ฅธ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๊ฒฐ๊ณผ๋Š” ์—ฐ๊ฒฐ์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0์€ ๊ฐ’์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์Šฌ๋กฏ ๊ณ„์‚ฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ํ˜„์žฌ - ์‚ฌ์šฉ ์ค‘, ์ตœ๋Œ€ - ์ œํ•œ, freeSlots - ์ฐจ์ด. ์•Œ ์ˆ˜ ์—†๋Š”/0 ์ œํ•œ ๋˜๋Š” ์ผ๊ด€์„ฑ ์—†๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ณต๊ฐ„์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•˜์ง€ ์•Š๊ณ  ์˜ˆ์ œ๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ตœ์‹  ์ƒํƒœ๋งŒ ์ฝ๊ณ  ์ƒˆ ์—…๋ฐ์ดํŠธ๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var current = UO.GetPetsCurrent();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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

2. ๋™๋ฌผ ๊ธธ๋“ค์ด๊ธฐ ์ „ ์šฉ๋Ÿ‰ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋จผ์ € ID๊ฐ€ lasttarget์— ์žˆ๋„๋ก ์›ํ•˜๋Š” ๋™๋ฌผ์„ ์„ ํƒํ•˜์„ธ์š”. requiredSlots=2 - ์˜ˆ์‹œ ์„ค์ •, ์„œ๋ฒ„์— ์žˆ๋Š” ์ด ์ƒ๋ฌผ์˜ ์‹ค์ œ ๋น„์šฉ์œผ๋กœ ๋Œ€์ฒดํ•˜์„ธ์š”. ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•  ๊ฒฝ์šฐ ๋Œ€์ƒ์ด ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฉฐ ์Šคํ‚ฌ์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋Œ€์ƒ์˜ ๋Œ€๊ธฐ์—ด์€ ๋‹จ์ผ ์ธ์ˆ˜ UseSkill("๋™๋ฌผ ๊ธธ๋“ค์ด๊ธฐ") ์ด์ „์— ์ค€๋น„๋ฉ๋‹ˆ๋‹ค. ์‹œ๋„๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์„ฑ๊ณต์ด ๋ณด์žฅ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ธฐ์ˆ , ๋ฒ”์œ„, ๊ธธ๋“ค์ž„ ๊ฐ€๋Šฅ์„ฑ ๋ฐ ์„œ๋ฒ„ ์‘๋‹ต์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.GetPetsCurrent();
    var maximum = UO.FollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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. ๋น„์šฉ์ด ๋‹ค๋ฅธ ์ƒ๋ฌผ์— ๋Œ€ํ•œ ์žฌ์‚ฌ์šฉ ํ™•์ธ - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

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

  • CanAddFollower๋Š” ์ƒˆ๋กœ์šด UO ๋ช…๋ น์ด ์•„๋‹ˆ๋ผ ์™„์ „ํžˆ ์„ ์–ธ๋œ ์‚ฌ์šฉ์ž ๋„์šฐ๋ฏธ์ž…๋‹ˆ๋‹ค. ์บ์‹œ ์ œํ•œ์ด ์ถฉ๋ถ„ํ•˜๋ฉด 1/true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0/false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. extraSlots ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” type/ID๊ฐ€ ์•„๋‹ˆ๋ผ ADDED๋˜๋Š” ์ƒ๋ฌผ์˜ ๋น„์šฉ์ž…๋‹ˆ๋‹ค. 2 - ์˜ˆ; ํ•ด๋‹น ๊ธฐ๋Šฅ์€ ๊ธธ๋“ค์ด๊ฑฐ๋‚˜ ์†Œํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ ๊ฒ€์€ ์กฐ์น˜ ์ง์ „์— ๋ฐ˜๋ณต๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

    dynamic CanAddFollower(dynamic extraSlots)
    {
        if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.GetPetsCurrent();
        var maximum = UO.PetsMax();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extraSlots <= maximum - current;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetPetsCurrent() โ€” UO.GetPetsCurrent()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.Followers

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


UO.GetPetsMax

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

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

int UO.GetPetsMax();

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

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

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

๋ฐ˜ํ™˜๊ฐ’

int - ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์—์„œ๋Š” ์ตœ๋Œ€ ์• ์™„๋™๋ฌผ ์ œ์–ด ์Šฌ๋กฏ, 0..255. 0๋Š” ์‹ค์ œ ๊ฐ’์ด๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๊ฑฐ๋‚˜, ๋ˆ„๋ฝ/ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” bool, ID ๋˜๋Š” type๊ฐ€ ์•„๋‹Œ ์ˆ˜๋Ÿ‰์ž…๋‹ˆ๋‹ค. 1๋Š” ์„ฑ๊ณต์ด ์•„๋‹ˆ๋ผ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๊ฐœ์ฒด๋ฅผ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์˜ˆ๋ฅผ ๋“ค์–ด, 5์˜ 3์ด ์‚ฌ์šฉ ์ค‘์ด๊ณ  2 ์Šฌ๋กฏ์€ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. 4 ๊ฐ’์€ ํ•œ ์Šฌ๋กฏ์— ์ƒ๋ฌผ 4๊ฐœ, 4๊ฐœ์— ์ƒ๋ฌผ 1๊ฐœ ๋˜๋Š” ๊ธฐํƒ€ ์กฐํ•ฉ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 2์— ์žˆ๋Š” ์ƒ๋ฌผ์˜ ๊ฒฝ์šฐ "busy < maximum" ์ฒดํฌ ์Šฌ๋กฏ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€ - ํ˜„์žฌ >= 2๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์ƒ๋ฌผ์˜ ๋น„์šฉ๊ณผ ํ•œ๋„๋Š” ์„œ๋ฒ„์— ์˜ํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. FollowersMax๋ฅผ ์ƒ์ˆ˜ 5๋กœ ๋Œ€์ฒดํ•˜์ง€ ๋งˆ์„ธ์š”.
  • 0๋Š” ์• ์™„๋™๋ฌผ์ด ๋ถ„์‹ค, ์‚ฌ๋ง ๋˜๋Š” ์„๋ฐฉ๋˜์—ˆ์Œ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์• ์™„๋™๋ฌผ์ด ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ์ƒํƒœ๊ฐ€ ์•„์ง ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์นด์šดํ„ฐ์˜ ์ฆ๊ฐ€๋Š” ์ œ์–ด๊ถŒ ๋ณ€๊ฒฝ์˜ ์ถ”๊ฐ€์ ์ธ ์‹ ํ˜ธ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์ƒ๋ฌผ์ด ๊ธธ๋“ค์—ฌ์กŒ๋Š”์ง€ ๊ฒฐ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์™€ ํŽซ ์ž์ฒด์˜ ๋ฉ”์‹œ์ง€๋„ ํ™•์ธํ•ด๋ณด์„ธ์š”. ์ด ์Šฌ๋กฏ์€ ๋งˆ๊ตฌ๊ฐ„์˜ ์žฅ์†Œ์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์€ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ •ํ™•ํ•œ ์„œ๋ช…์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๊ฒŒ์ž„ ์Šค๋ ˆ๋“œ์—์„œ ์ฝ์œผ๋ฉด Player๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.FollowersMax ํ˜„์žฌ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์กด์žฌํ•˜๊ณ  ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0. ์žฅ๋น„๊ฐ€ ์ •๋ ฌ๋˜์ง€ ์•Š๊ณ , ๋ณด๋„ˆ์Šค๊ฐ€ ๋‹ค์‹œ ๊ณ„์‚ฐ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ƒํƒœ๊ฐ€ ์š”์ฒญ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ ๋ น์€ ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • PetsMax/FollowersMax๋Š” ์—ฌ์œ  ์Šฌ๋กฏ์ด ์•„๋‹Œ type >= 3 ์ƒํƒœ์—์„œ ์„œ๋ฒ„๊ฐ€ ํ—ˆ์šฉํ•˜๋Š” ์ด ์Šฌ๋กฏ ์ œํ•œ์„ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ํ•œ๋„๋ณด๋‹ค ๋” ๋งŽ์€ ์Šฌ๋กฏ์ด ์ ์œ ๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ์œ  ์šฉ๋Ÿ‰์„ ์ตœ๋Œ€ ์ „๋ฅ˜๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ 0๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ํŒ€์€ ์•„๋ฌด๊ฒƒ๋„ ๊ณต๊ฐœํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ธธ๋“ค์ด๊ฑฐ๋‚˜ ์š”๊ตฌํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.
  • CharacterStatus๋Š” ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ๋ณธ๋ฌธ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Weight๋Š” ์ž์ฒด ํ™•์žฅ ์ƒํƒœ์ธ ์Šฌ๋กฏ - type 3, Luck - type 4, ์„œ๋ฒ„ WeightMax - type 5์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒ์  ์นด์šดํ„ฐ๊ฐ€ ์—†๋Š” ์ปดํŒฉํŠธ/์˜ค๋ž˜๋œ ํŒจํ‚ค์ง€๋Š” ์ด์ „ ์บ์‹œ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ํ”Œ๋ ˆ์ด์–ด๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ํ†ตํ™”๋Š” ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ›์•˜๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ๋Š” ๋‹ค๋ฅธ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๊ฒฐ๊ณผ๋Š” ์—ฐ๊ฒฐ์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0์€ ๊ฐ’์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์Šฌ๋กฏ ๊ณ„์‚ฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ํ˜„์žฌ - ์‚ฌ์šฉ ์ค‘, ์ตœ๋Œ€ - ์ œํ•œ, freeSlots - ์ฐจ์ด. ์•Œ ์ˆ˜ ์—†๋Š”/0 ์ œํ•œ ๋˜๋Š” ์ผ๊ด€์„ฑ ์—†๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ณต๊ฐ„์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•˜์ง€ ์•Š๊ณ  ์˜ˆ์ œ๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ตœ์‹  ์ƒํƒœ๋งŒ ์ฝ๊ณ  ์ƒˆ ์—…๋ฐ์ดํŠธ๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var current = UO.Followers();
var maximum = UO.GetPetsMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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

2. ๋™๋ฌผ ๊ธธ๋“ค์ด๊ธฐ ์ „ ์šฉ๋Ÿ‰ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋จผ์ € ID๊ฐ€ lasttarget์— ์žˆ๋„๋ก ์›ํ•˜๋Š” ๋™๋ฌผ์„ ์„ ํƒํ•˜์„ธ์š”. requiredSlots=2 - ์˜ˆ์‹œ ์„ค์ •, ์„œ๋ฒ„์— ์žˆ๋Š” ์ด ์ƒ๋ฌผ์˜ ์‹ค์ œ ๋น„์šฉ์œผ๋กœ ๋Œ€์ฒดํ•˜์„ธ์š”. ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•  ๊ฒฝ์šฐ ๋Œ€์ƒ์ด ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฉฐ ์Šคํ‚ฌ์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋Œ€์ƒ์˜ ๋Œ€๊ธฐ์—ด์€ ๋‹จ์ผ ์ธ์ˆ˜ UseSkill("๋™๋ฌผ ๊ธธ๋“ค์ด๊ธฐ") ์ด์ „์— ์ค€๋น„๋ฉ๋‹ˆ๋‹ค. ์‹œ๋„๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์„ฑ๊ณต์ด ๋ณด์žฅ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ธฐ์ˆ , ๋ฒ”์œ„, ๊ธธ๋“ค์ž„ ๊ฐ€๋Šฅ์„ฑ ๋ฐ ์„œ๋ฒ„ ์‘๋‹ต์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.Followers();
    var maximum = UO.GetPetsMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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. ๋น„์šฉ์ด ๋‹ค๋ฅธ ์ƒ๋ฌผ์— ๋Œ€ํ•œ ์žฌ์‚ฌ์šฉ ํ™•์ธ - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

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

  • CanAddFollower๋Š” ์ƒˆ๋กœ์šด UO ๋ช…๋ น์ด ์•„๋‹ˆ๋ผ ์™„์ „ํžˆ ์„ ์–ธ๋œ ์‚ฌ์šฉ์ž ๋„์šฐ๋ฏธ์ž…๋‹ˆ๋‹ค. ์บ์‹œ ์ œํ•œ์ด ์ถฉ๋ถ„ํ•˜๋ฉด 1/true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0/false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. extraSlots ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” type/ID๊ฐ€ ์•„๋‹ˆ๋ผ ADDED๋˜๋Š” ์ƒ๋ฌผ์˜ ๋น„์šฉ์ž…๋‹ˆ๋‹ค. 2 - ์˜ˆ; ํ•ด๋‹น ๊ธฐ๋Šฅ์€ ๊ธธ๋“ค์ด๊ฑฐ๋‚˜ ์†Œํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ ๊ฒ€์€ ์กฐ์น˜ ์ง์ „์— ๋ฐ˜๋ณต๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

    dynamic CanAddFollower(dynamic extraSlots)
    {
        if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.PetsCurrent();
        var maximum = UO.GetPetsMax();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extraSlots <= maximum - current;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetPetsMax() โ€” UO.GetPetsMax()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.FollowersMax

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


UO.IsNPC

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

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

int UO.IsNPC(object? objID);

๋กœ๋“œ๋œ mobile๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ „๋‹ฌ๋œ serial์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int 1 - ๋กœ๋“œ๋˜์—ˆ์œผ๋‚˜ ์‚ญ์ œ๋˜์ง€ ์•Š์Œ mobile. int 0 - ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด serial ๋˜๋Š” ์›๊ฒฉ ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค. IsNPC๋ผ๋Š” ์ด๋ฆ„์€ "๋น„ํ”Œ๋ ˆ์ด์–ด ์บ๋ฆญํ„ฐ ์ „์šฉ"์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž์‹ ์˜ ์บ๋ฆญํ„ฐ์™€ ๋‹ค๋ฅธ ํ”Œ๋ ˆ์ด์–ด๋„ 1๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

๋™์ž‘

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

C#์—์„œ ์ด๋ฆ„์˜ ๋ฌธ์ž๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. UO.IsNPC์—๋Š” ์ธ์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†๋Š” UO.IsNpc() ํ˜•์‹์€ self๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์ด๋ฆ„ ๋ชจ๋‘ NPC๋งŒ์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ํฌํ•จํ•˜์—ฌ mobile๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ž์‹ ์˜ ์บ๋ฆญํ„ฐ serial ํ™•์ธ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ด C# ํ˜•์‹์—๋Š” ์ธ์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ž์‹ ์˜ ์บ๋ฆญํ„ฐ๋„ 1๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” mobile์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ์ด์ง€ NPC์—๋งŒ ๊ตญํ•œ๋œ ํ…Œ์ŠคํŠธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.
int mobile = UO.IsNPC(UO.Self());
UO.Print($"Self is a loaded mobile: {mobile != 0}");

2. ์ขŒํ‘œ๋ฅผ ์ฝ๊ธฐ ์ „์— ๋กœ๋“œ๋œ ํƒ€๊ฒŸ ์„ ํƒ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ผ๋ จ๋ฒˆํ˜ธ๋Š” lasttarget์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์— ์•Œ๋ ค์ง„ mobile๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ขŒํ‘œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    string target = UO.GetSerial("lasttarget");
    if (UO.IsNPC(target) == 0)
        return false;
    UO.Print($"Mobile coordinates: {UO.GetX(target)}, {UO.GetY(target)}, {UO.GetZ(target)}");
    return true;
    return null;
}

3. ์บ๋ฆญํ„ฐ์™€ ๋ฐฐ๋‚ญ ๋น„๊ต - ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์—…

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

  • ์›”๋“œ์— ์ž…์žฅํ•˜๋Š” ์บ๋ฆญํ„ฐ๋Š” mobile์ด๋ฉฐ, ๋ฐฐ๋‚ญ์€ ์•„์ดํ…œ์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๋กœ์ปฌ ์ฝ๊ธฐ์˜ ์ˆœ๊ฐ„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
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()
    {
        int character = UO.IsNPC(UO.Self());
        int bag = UO.IsNPC(UO.Backpack());
        UO.Print($"Character mobile flag: {character}; backpack mobile flag: {bag}");
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "isnpc": return new InjectionValue(bridge.IsNpc(Arg(0)));

UO.IsNpc

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

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

int UO.IsNpc();
int UO.IsNpc(object? id);

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

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

๋ฐ˜ํ™˜๊ฐ’

int 1 - ๋กœ๋“œ๋˜์—ˆ์œผ๋‚˜ ์‚ญ์ œ๋˜์ง€ ์•Š์Œ mobile. int 0 - ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด serial ๋˜๋Š” ์›๊ฒฉ ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค. IsNPC๋ผ๋Š” ์ด๋ฆ„์€ "๋น„ํ”Œ๋ ˆ์ด์–ด ์บ๋ฆญํ„ฐ ์ „์šฉ"์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž์‹ ์˜ ์บ๋ฆญํ„ฐ์™€ ๋‹ค๋ฅธ ํ”Œ๋ ˆ์ด์–ด๋„ 1๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

๋™์ž‘

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

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

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

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

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

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

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

1. ์ž์‹ ์˜ ์บ๋ฆญํ„ฐ๋ฅผ ํ…Œ์ŠคํŠธํ•ด๋ณด์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ธ์ˆ˜ ์—†๋Š” ํ˜•์‹์—์„œ๋Š” self์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ 1/0๋Š” serial๊ฐ€ ์•„๋‹ˆ๋ฉฐ ํ”Œ๋ ˆ์ด์–ด์™€ NPC๋ฅผ ๊ตฌ๋ณ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
int mobile = UO.IsNpc();
if (mobile != 0) UO.Print("Self is a loaded mobile");

2. mobile, ๊ฐœ์ฒด์™€ ์•Œ ์ˆ˜ ์—†๋Š” ๋Œ€์ƒ์„ ๊ตฌ๋ณ„ํ•˜๋Š” ๊ฒƒ์€ ์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

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

  • lasttarget๋ฅผ ๋ฏธ๋ฆฌ ์„ ํƒํ•˜์„ธ์š”. ๋จผ์ €, ๊ฐ์ฒด์˜ ๋กœ๋”ฉ์ด ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. mobile ๋ถ„๋ฅ˜๋Š” ๊ทธ์˜ ์ ๋Œ€๊ฐ์„ ์ •์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    string target = UO.GetSerial("lasttarget");
    if (UO.Exists(target) == 0)
        UO.Print("Target is not loaded");
    else
        UO.Print(UO.IsNpc(target) != 0 ? "Mobile: NPC or player" : "Loaded item");
    return null;
}

3. mobile์—์„œ๋งŒ ํด๋ผ์ด์–ธํŠธ์— ์•Œ๋ ค์ง„ ํžˆํŠธ ์ฝ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์กฐํšŒ์ˆ˜๋Š” ์„œ๋ฒ„์— ์˜ํ•ด ์ •๊ทœํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜ํ‘œ์—์„œ๋Š” ์ „์ฒด ์ƒํƒœ๋ฅผ ๋ฌป์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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()
    {
        string target = UO.GetSerial("lasttarget");
        if (UO.IsNpc(target) != 0)
            UO.Print($"Known hits: {UO.GetHP(target)}/{UO.GetMaxHP(target)}");
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.IsNpc() โ€” UO.IsNpc()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int IsNpc() => IsNpc(bridge.Self);

UO.IsNpc(id) โ€” UO.IsNpc(Integer)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int IsNpc(int id) => bridge.IsNpc(id);

UO.IsNpc(id) โ€” UO.IsNpc(String)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int IsNpc(string id) => IsNpc(GetObject(id));

UO.MobileCanBeRenamed

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

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

int UO.MobileCanBeRenamed(object? mobID);

mobile ์ด๋ฆ„์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์•Œ๋ ค์ง„ ํ‘œ์‹œ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

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

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • self ์ธ์ˆ˜๋Š” ํ•ด๋‹น ๋ฌธ์ž๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ - 1/0์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด ์• ์™„๋™๋ฌผ์— ๋Œ€ํ•œ ๋งˆ์ง€๋ง‰ ์„œ๋ฒ„ ๊ถŒํ•œ์ž…๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๊ฐœ์ฒด์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ์ง€ ์•Š์œผ๋ฉฐ ํ›„์† ์š”์ฒญ์ด ์„œ๋ฒ„์—์„œ ์ˆ˜๋ฝ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var state = UO.MobileCanBeRenamed("self");
if (Truth(state))
{
    UO.Print("Rename permission flag is present");
}
else
{
    UO.Print("Rename permission flag is absent");
}

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์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” IsRenamable ํ•„๋“œ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ์ ˆํ•œ ์ƒํƒœ๋ฅผ ์ˆ˜์‹ ํ•œ ํ›„์—๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.MobileCanBeRenamed(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.MobileCanBeRenamed(target);
            await Delay(500);
            if (Truth(UO.IsNPC(target)))
            {
                var after = UO.MobileCanBeRenamed(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.MobileCanBeRenamed(mobID) โ€” UO.MobileCanBeRenamed(Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "mobilecanberenamed": return new InjectionValue(bridge.CanChangeName(Arg(0)));

UO.Notoriety

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

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

int UO.Notoriety();

ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์—์„œ ์บ๋ฆญํ„ฐ์˜ ํ‰ํŒ์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int โ€” 0=์•Œ ์ˆ˜ ์—†์Œ, 1=๋ฌด์ฃ„, 2=๋™๋งน, 3=ํšŒ์ƒ‰, 4=๋ฒ”์ฃ„์ž, 5=์ , 6=์‚ด์ธ์ž, 7=๋ฌด์ ์ž…๋‹ˆ๋‹ค. ์ด๋Š” hue, ์นด๋ฅด๋งˆ ๋˜๋Š” ๋ช…์„ฑ์ด ์•„๋‹Œ ์ƒํƒœ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†์Œ mobile๋Š” 0์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด๋ฏธ ์ˆ˜์‹ ๋œ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์€ ๊ณต๊ฐœ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์„œ๋ฒ„๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ณด๋‚ด๋„๋ก ๊ฐ•์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ๋ง, ๋งต ์ „ํ™˜ ๋˜๋Š” ๊ฐ์ฒด ์‚ญ์ œ ํ›„ ๋‘ ํ˜ธ์ถœ ์‚ฌ์ด์— ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

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

1. ์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ๊ฐ’ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ํ˜ธ์ถœ์€ self๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ์˜ ํ‰ํŒ์€ ๊ฐ€์น˜๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • Convert.ToString๋Š” ์ถœ๋ ฅํ•  ์ˆซ์ž๋ฅผ ๋ณ€ํ™˜ํ•˜๋ฉฐ ๊ฒฐ๊ณผ์˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var value = UO.Notoriety();
UO.Print("Notoriety: " + Convert.ToString(value));

2. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์— ๊ฐ’ ์‚ฌ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ธ์ˆ˜ ์—†์ด ๊ฐ’์„ ํ•œ ๋ฒˆ ์ฝ์Šต๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ์˜ ํ‰ํŒ์€ ํ‘œ์‹œ๋œ ๊ณ„์‚ฐ์ด๋‚˜ ์กฐ๊ฑด์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ˆซ์ž ์ž„๊ณ„๊ฐ’์€ ์Šคํฌ๋ฆฝํŠธ ์กฐ๊ฑด์˜ ์˜ˆ์ด๋ฉฐ ์ƒˆ๋กœ์šด ํด๋ผ์ด์–ธํŠธ ์ œํ•œ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ•„๋“œ์—๋Š” ์œ„์— ์„ค๋ช…๋œ ์„œ๋ฒ„ ๋‹จ์œ„ ๋ฐ ์ œํ•œ ์‚ฌํ•ญ์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.Notoriety();
    if (Truth(value == 3) || Truth(value == 4))
    {
        UO.Print("Gray or criminal notoriety");
    }

    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. 1์ดˆ๋งŒ์— ๋ณ€ํ™”๋ฅผ ์ง€์ผœ๋ณด์„ธ์š” - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.Notoriety();
        await Delay(1000);
        var after = UO.Notoriety();
        if (Truth(before != after))
        {
            UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.Notoriety() โ€” UO.Notoriety()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.GetNotoriety(bridge.Self)

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


UO.PetsCurrent

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

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

int UO.PetsCurrent();

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

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

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

๋ฐ˜ํ™˜๊ฐ’

int - ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์—์„œ๋Š” ์• ์™„๋™๋ฌผ ์ œ์–ด ์Šฌ๋กฏ, 0..255๋ฅผ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. 0๋Š” ์‹ค์ œ ๊ฐ’์ด๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๊ฑฐ๋‚˜, ๋ˆ„๋ฝ/ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” bool, ID ๋˜๋Š” type๊ฐ€ ์•„๋‹Œ ์ˆ˜๋Ÿ‰์ž…๋‹ˆ๋‹ค. 1๋Š” ์„ฑ๊ณต์ด ์•„๋‹ˆ๋ผ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๊ฐœ์ฒด๋ฅผ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์˜ˆ๋ฅผ ๋“ค์–ด, 5์˜ 3์ด ์‚ฌ์šฉ ์ค‘์ด๊ณ  2 ์Šฌ๋กฏ์€ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. 4 ๊ฐ’์€ ํ•œ ์Šฌ๋กฏ์— ์ƒ๋ฌผ 4๊ฐœ, 4๊ฐœ์— ์ƒ๋ฌผ 1๊ฐœ ๋˜๋Š” ๊ธฐํƒ€ ์กฐํ•ฉ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 2์— ์žˆ๋Š” ์ƒ๋ฌผ์˜ ๊ฒฝ์šฐ "busy < maximum" ์ฒดํฌ ์Šฌ๋กฏ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€ - ํ˜„์žฌ >= 2๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์ƒ๋ฌผ์˜ ๋น„์šฉ๊ณผ ํ•œ๋„๋Š” ์„œ๋ฒ„์— ์˜ํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. FollowersMax๋ฅผ ์ƒ์ˆ˜ 5๋กœ ๋Œ€์ฒดํ•˜์ง€ ๋งˆ์„ธ์š”.
  • 0๋Š” ์• ์™„๋™๋ฌผ์ด ๋ถ„์‹ค, ์‚ฌ๋ง ๋˜๋Š” ์„๋ฐฉ๋˜์—ˆ์Œ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์• ์™„๋™๋ฌผ์ด ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ์ƒํƒœ๊ฐ€ ์•„์ง ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์นด์šดํ„ฐ์˜ ์ฆ๊ฐ€๋Š” ์ œ์–ด๊ถŒ ๋ณ€๊ฒฝ์˜ ์ถ”๊ฐ€์ ์ธ ์‹ ํ˜ธ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์ƒ๋ฌผ์ด ๊ธธ๋“ค์—ฌ์กŒ๋Š”์ง€ ๊ฒฐ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์™€ ํŽซ ์ž์ฒด์˜ ๋ฉ”์‹œ์ง€๋„ ํ™•์ธํ•ด๋ณด์„ธ์š”. ์ด ์Šฌ๋กฏ์€ ๋งˆ๊ตฌ๊ฐ„์˜ ์žฅ์†Œ์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์€ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ •ํ™•ํ•œ ์„œ๋ช…์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๊ฒŒ์ž„ ์Šค๋ ˆ๋“œ์—์„œ ์ฝ์œผ๋ฉด Player๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.Followers ํ˜„์žฌ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์กด์žฌํ•˜๊ณ  ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0. ์žฅ๋น„๊ฐ€ ์ •๋ ฌ๋˜์ง€ ์•Š๊ณ , ๋ณด๋„ˆ์Šค๊ฐ€ ๋‹ค์‹œ ๊ณ„์‚ฐ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ƒํƒœ๊ฐ€ ์š”์ฒญ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ ๋ น์€ ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • PetsCurrent/Followers๋Š” ์ƒํƒœ type >= 3์—์„œ ์ ์œ ๋œ ์ œ์–ด ์Šฌ๋กฏ์„ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์• ์™„๋™๋ฌผ ํ•œ ๋งˆ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ ์Šฌ๋กฏ์„ ์ฐจ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์†Œํ™˜ ๋ฐ ๊ธธ๋“ค์ธ ์ƒ๋ฌผ์— ๋Œ€ํ•œ ๊ทœ์น™์€ ์„œ๋ฒ„์—์„œ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ณด์ด๋Š” mobile์˜ ์ˆซ์ž๋„ ์•„๋‹ˆ๊ณ , ID ์• ์™„๋™๋ฌผ์˜ ๋ชฉ๋ก๋„ ์•„๋‹ˆ๊ณ , ๊ทผ์ฒ˜์— ์žˆ๋Š” ๋™๋ฌผ์˜ ์ˆซ์ž๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • CharacterStatus๋Š” ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ๋ณธ๋ฌธ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Weight๋Š” ์ž์ฒด ํ™•์žฅ ์ƒํƒœ์ธ ์Šฌ๋กฏ - type 3, Luck - type 4, ์„œ๋ฒ„ WeightMax - type 5์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒ์  ์นด์šดํ„ฐ๊ฐ€ ์—†๋Š” ์ปดํŒฉํŠธ/์˜ค๋ž˜๋œ ํŒจํ‚ค์ง€๋Š” ์ด์ „ ์บ์‹œ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ํ”Œ๋ ˆ์ด์–ด๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ํ†ตํ™”๋Š” ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ›์•˜๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ๋Š” ๋‹ค๋ฅธ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๊ฒฐ๊ณผ๋Š” ์—ฐ๊ฒฐ์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0์€ ๊ฐ’์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์Šฌ๋กฏ ๊ณ„์‚ฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ํ˜„์žฌ - ์‚ฌ์šฉ ์ค‘, ์ตœ๋Œ€ - ์ œํ•œ, freeSlots - ์ฐจ์ด. ์•Œ ์ˆ˜ ์—†๋Š”/0 ์ œํ•œ ๋˜๋Š” ์ผ๊ด€์„ฑ ์—†๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ณต๊ฐ„์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•˜์ง€ ์•Š๊ณ  ์˜ˆ์ œ๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ตœ์‹  ์ƒํƒœ๋งŒ ์ฝ๊ณ  ์ƒˆ ์—…๋ฐ์ดํŠธ๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var current = UO.PetsCurrent();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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

2. ๋™๋ฌผ ๊ธธ๋“ค์ด๊ธฐ ์ „ ์šฉ๋Ÿ‰ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋จผ์ € ID๊ฐ€ lasttarget์— ์žˆ๋„๋ก ์›ํ•˜๋Š” ๋™๋ฌผ์„ ์„ ํƒํ•˜์„ธ์š”. requiredSlots=2 - ์˜ˆ์‹œ ์„ค์ •, ์„œ๋ฒ„์— ์žˆ๋Š” ์ด ์ƒ๋ฌผ์˜ ์‹ค์ œ ๋น„์šฉ์œผ๋กœ ๋Œ€์ฒดํ•˜์„ธ์š”. ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•  ๊ฒฝ์šฐ ๋Œ€์ƒ์ด ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฉฐ ์Šคํ‚ฌ์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋Œ€์ƒ์˜ ๋Œ€๊ธฐ์—ด์€ ๋‹จ์ผ ์ธ์ˆ˜ UseSkill("๋™๋ฌผ ๊ธธ๋“ค์ด๊ธฐ") ์ด์ „์— ์ค€๋น„๋ฉ๋‹ˆ๋‹ค. ์‹œ๋„๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์„ฑ๊ณต์ด ๋ณด์žฅ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ธฐ์ˆ , ๋ฒ”์œ„, ๊ธธ๋“ค์ž„ ๊ฐ€๋Šฅ์„ฑ ๋ฐ ์„œ๋ฒ„ ์‘๋‹ต์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.PetsCurrent();
    var maximum = UO.FollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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. ๋น„์šฉ์ด ๋‹ค๋ฅธ ์ƒ๋ฌผ์— ๋Œ€ํ•œ ์žฌ์‚ฌ์šฉ ํ™•์ธ - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

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

  • CanAddFollower๋Š” ์ƒˆ๋กœ์šด UO ๋ช…๋ น์ด ์•„๋‹ˆ๋ผ ์™„์ „ํžˆ ์„ ์–ธ๋œ ์‚ฌ์šฉ์ž ๋„์šฐ๋ฏธ์ž…๋‹ˆ๋‹ค. ์บ์‹œ ์ œํ•œ์ด ์ถฉ๋ถ„ํ•˜๋ฉด 1/true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0/false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. extraSlots ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” type/ID๊ฐ€ ์•„๋‹ˆ๋ผ ADDED๋˜๋Š” ์ƒ๋ฌผ์˜ ๋น„์šฉ์ž…๋‹ˆ๋‹ค. 2 - ์˜ˆ; ํ•ด๋‹น ๊ธฐ๋Šฅ์€ ๊ธธ๋“ค์ด๊ฑฐ๋‚˜ ์†Œํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ ๊ฒ€์€ ์กฐ์น˜ ์ง์ „์— ๋ฐ˜๋ณต๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

    dynamic CanAddFollower(dynamic extraSlots)
    {
        if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.PetsCurrent();
        var maximum = UO.PetsMax();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extraSlots <= maximum - current;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.PetsCurrent() โ€” UO.PetsCurrent()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "petscurrent": return new InjectionValue(bridge.Followers);

UO.PetsMax

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

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

int UO.PetsMax();

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

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

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

๋ฐ˜ํ™˜๊ฐ’

int - ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์—์„œ๋Š” ์ตœ๋Œ€ ์• ์™„๋™๋ฌผ ์ œ์–ด ์Šฌ๋กฏ, 0..255. 0๋Š” ์‹ค์ œ ๊ฐ’์ด๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๊ฑฐ๋‚˜, ๋ˆ„๋ฝ/ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” bool, ID ๋˜๋Š” type๊ฐ€ ์•„๋‹Œ ์ˆ˜๋Ÿ‰์ž…๋‹ˆ๋‹ค. 1๋Š” ์„ฑ๊ณต์ด ์•„๋‹ˆ๋ผ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๊ฐœ์ฒด๋ฅผ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์˜ˆ๋ฅผ ๋“ค์–ด, 5์˜ 3์ด ์‚ฌ์šฉ ์ค‘์ด๊ณ  2 ์Šฌ๋กฏ์€ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. 4 ๊ฐ’์€ ํ•œ ์Šฌ๋กฏ์— ์ƒ๋ฌผ 4๊ฐœ, 4๊ฐœ์— ์ƒ๋ฌผ 1๊ฐœ ๋˜๋Š” ๊ธฐํƒ€ ์กฐํ•ฉ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 2์— ์žˆ๋Š” ์ƒ๋ฌผ์˜ ๊ฒฝ์šฐ "busy < maximum" ์ฒดํฌ ์Šฌ๋กฏ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€ - ํ˜„์žฌ >= 2๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์ƒ๋ฌผ์˜ ๋น„์šฉ๊ณผ ํ•œ๋„๋Š” ์„œ๋ฒ„์— ์˜ํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. FollowersMax๋ฅผ ์ƒ์ˆ˜ 5๋กœ ๋Œ€์ฒดํ•˜์ง€ ๋งˆ์„ธ์š”.
  • 0๋Š” ์• ์™„๋™๋ฌผ์ด ๋ถ„์‹ค, ์‚ฌ๋ง ๋˜๋Š” ์„๋ฐฉ๋˜์—ˆ์Œ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์• ์™„๋™๋ฌผ์ด ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ์ƒํƒœ๊ฐ€ ์•„์ง ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์นด์šดํ„ฐ์˜ ์ฆ๊ฐ€๋Š” ์ œ์–ด๊ถŒ ๋ณ€๊ฒฝ์˜ ์ถ”๊ฐ€์ ์ธ ์‹ ํ˜ธ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์ƒ๋ฌผ์ด ๊ธธ๋“ค์—ฌ์กŒ๋Š”์ง€ ๊ฒฐ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์™€ ํŽซ ์ž์ฒด์˜ ๋ฉ”์‹œ์ง€๋„ ํ™•์ธํ•ด๋ณด์„ธ์š”. ์ด ์Šฌ๋กฏ์€ ๋งˆ๊ตฌ๊ฐ„์˜ ์žฅ์†Œ์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์€ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ •ํ™•ํ•œ ์„œ๋ช…์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๊ฒŒ์ž„ ์Šค๋ ˆ๋“œ์—์„œ ์ฝ์œผ๋ฉด Player๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.FollowersMax ํ˜„์žฌ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์กด์žฌํ•˜๊ณ  ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0. ์žฅ๋น„๊ฐ€ ์ •๋ ฌ๋˜์ง€ ์•Š๊ณ , ๋ณด๋„ˆ์Šค๊ฐ€ ๋‹ค์‹œ ๊ณ„์‚ฐ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ƒํƒœ๊ฐ€ ์š”์ฒญ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ ๋ น์€ ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • PetsMax/FollowersMax๋Š” ์—ฌ์œ  ์Šฌ๋กฏ์ด ์•„๋‹Œ type >= 3 ์ƒํƒœ์—์„œ ์„œ๋ฒ„๊ฐ€ ํ—ˆ์šฉํ•˜๋Š” ์ด ์Šฌ๋กฏ ์ œํ•œ์„ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ํ•œ๋„๋ณด๋‹ค ๋” ๋งŽ์€ ์Šฌ๋กฏ์ด ์ ์œ ๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ์œ  ์šฉ๋Ÿ‰์„ ์ตœ๋Œ€ ์ „๋ฅ˜๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ์Œ์˜ ๊ฒฐ๊ณผ๋ฅผ 0๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ํŒ€์€ ์•„๋ฌด๊ฒƒ๋„ ๊ณต๊ฐœํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ธธ๋“ค์ด๊ฑฐ๋‚˜ ์š”๊ตฌํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.
  • CharacterStatus๋Š” ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ๋ณธ๋ฌธ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Weight๋Š” ์ž์ฒด ํ™•์žฅ ์ƒํƒœ์ธ ์Šฌ๋กฏ - type 3, Luck - type 4, ์„œ๋ฒ„ WeightMax - type 5์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒ์  ์นด์šดํ„ฐ๊ฐ€ ์—†๋Š” ์ปดํŒฉํŠธ/์˜ค๋ž˜๋œ ํŒจํ‚ค์ง€๋Š” ์ด์ „ ์บ์‹œ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ํ”Œ๋ ˆ์ด์–ด๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ํ†ตํ™”๋Š” ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ›์•˜๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ๋Š” ๋‹ค๋ฅธ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๊ฒฐ๊ณผ๋Š” ์—ฐ๊ฒฐ์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0์€ ๊ฐ’์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์Šฌ๋กฏ ๊ณ„์‚ฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ํ˜„์žฌ - ์‚ฌ์šฉ ์ค‘, ์ตœ๋Œ€ - ์ œํ•œ, freeSlots - ์ฐจ์ด. ์•Œ ์ˆ˜ ์—†๋Š”/0 ์ œํ•œ ๋˜๋Š” ์ผ๊ด€์„ฑ ์—†๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ณต๊ฐ„์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•˜์ง€ ์•Š๊ณ  ์˜ˆ์ œ๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ตœ์‹  ์ƒํƒœ๋งŒ ์ฝ๊ณ  ์ƒˆ ์—…๋ฐ์ดํŠธ๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var current = UO.Followers();
var maximum = UO.PetsMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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

2. ๋™๋ฌผ ๊ธธ๋“ค์ด๊ธฐ ์ „ ์šฉ๋Ÿ‰ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋จผ์ € ID๊ฐ€ lasttarget์— ์žˆ๋„๋ก ์›ํ•˜๋Š” ๋™๋ฌผ์„ ์„ ํƒํ•˜์„ธ์š”. requiredSlots=2 - ์˜ˆ์‹œ ์„ค์ •, ์„œ๋ฒ„์— ์žˆ๋Š” ์ด ์ƒ๋ฌผ์˜ ์‹ค์ œ ๋น„์šฉ์œผ๋กœ ๋Œ€์ฒดํ•˜์„ธ์š”. ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•  ๊ฒฝ์šฐ ๋Œ€์ƒ์ด ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฉฐ ์Šคํ‚ฌ์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋Œ€์ƒ์˜ ๋Œ€๊ธฐ์—ด์€ ๋‹จ์ผ ์ธ์ˆ˜ UseSkill("๋™๋ฌผ ๊ธธ๋“ค์ด๊ธฐ") ์ด์ „์— ์ค€๋น„๋ฉ๋‹ˆ๋‹ค. ์‹œ๋„๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์„ฑ๊ณต์ด ๋ณด์žฅ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ธฐ์ˆ , ๋ฒ”์œ„, ๊ธธ๋“ค์ž„ ๊ฐ€๋Šฅ์„ฑ ๋ฐ ์„œ๋ฒ„ ์‘๋‹ต์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.Followers();
    var maximum = UO.PetsMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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. ๋น„์šฉ์ด ๋‹ค๋ฅธ ์ƒ๋ฌผ์— ๋Œ€ํ•œ ์žฌ์‚ฌ์šฉ ํ™•์ธ - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

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

  • CanAddFollower๋Š” ์ƒˆ๋กœ์šด UO ๋ช…๋ น์ด ์•„๋‹ˆ๋ผ ์™„์ „ํžˆ ์„ ์–ธ๋œ ์‚ฌ์šฉ์ž ๋„์šฐ๋ฏธ์ž…๋‹ˆ๋‹ค. ์บ์‹œ ์ œํ•œ์ด ์ถฉ๋ถ„ํ•˜๋ฉด 1/true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0/false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. extraSlots ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” type/ID๊ฐ€ ์•„๋‹ˆ๋ผ ADDED๋˜๋Š” ์ƒ๋ฌผ์˜ ๋น„์šฉ์ž…๋‹ˆ๋‹ค. 2 - ์˜ˆ; ํ•ด๋‹น ๊ธฐ๋Šฅ์€ ๊ธธ๋“ค์ด๊ฑฐ๋‚˜ ์†Œํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ ๊ฒ€์€ ์กฐ์น˜ ์ง์ „์— ๋ฐ˜๋ณต๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

    dynamic CanAddFollower(dynamic extraSlots)
    {
        if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.PetsCurrent();
        var maximum = UO.PetsMax();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extraSlots <= maximum - current;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.PetsMax() โ€” UO.PetsMax()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "petsmax": return new InjectionValue(bridge.FollowersMax);

UO.Rename

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

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

void UO.Rename(object? mobile, object? newName);

์บ๋ฆญํ„ฐ/ํŽซ ์ด๋ฆ„ ๋ณ€๊ฒฝ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ์ˆœ์„œ๋Š” serial์ด๊ณ  ๊ทธ ๋‹ค์Œ์ด ์ƒˆ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. Bridge.RenameMobile๊ฐ€ GameActions.Rename(serial, ์ด๋ฆ„)์—๊ฒŒ ์ „ํ™”๋ฅผ ๊ฒ๋‹ˆ๋‹ค. API๋Š” CanChangeName๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ๋กœ์ปฌ Name ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„๋Š” ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ ๊ถŒํ•œ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์• ์™„๋™๋ฌผ์˜ ๊ฒฝ์šฐ ๋จผ์ € MobileCanBeRenamed๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ์š”์ฒญ์ด ์ด๋ฆ„ ์Šน์ธ์„ ๋ณด์žฅํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.Rename");
UO.Rename(UO.GetSerial("lasttarget"), "Companion");

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

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

  • ์บ๋ฆญํ„ฐ/ํŽซ ์ด๋ฆ„ ๋ณ€๊ฒฝ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.MobileCanBeRenamed(id)))
{
    UO.Rename(id, "Companion");
}

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

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

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

  • ์ˆœ์„œ๋Š” serial์ด๊ณ  ๊ทธ ๋‹ค์Œ์ด ์ƒˆ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. Bridge.RenameMobile๊ฐ€ GameActions.Rename(serial, ์ด๋ฆ„)์—๊ฒŒ ์ „ํ™”๋ฅผ ๊ฒ๋‹ˆ๋‹ค. API๋Š” CanChangeName๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ๋กœ์ปฌ Name ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(id)) && Truth(UO.MobileCanBeRenamed(id)))
    {
        UO.Rename(id, "Guardian");
    }

    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. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์„œ๋ฒ„๋Š” ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ ๊ถŒํ•œ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์• ์™„๋™๋ฌผ์˜ ๊ฒฝ์šฐ ๋จผ์ € MobileCanBeRenamed๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ์š”์ฒญ์ด ์ด๋ฆ„ ์Šน์ธ์„ ๋ณด์žฅํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
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()
    {
        RenamePet(UO.GetSerial("lasttarget"), "Companion");
        return null;
    }

    void RenamePet(dynamic id, dynamic name)
    {
        if (Truth(UO.MobileCanBeRenamed(id)) && Truth(Len(name) > 0))
        {
            UO.Rename(id, name);
        }
    }

    int Len(object? value) => Convert.ToString(value)?.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.Rename(mobile, newName) โ€” UO.Rename(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "rename": bridge.RenameMobile(Arg(0, bridge.LastTarget), Text(1)); break;

UO.RenameMobile

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

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

void UO.RenameMobile(object? mobID, object? newName);

์บ๋ฆญํ„ฐ/ํŽซ ์ด๋ฆ„ ๋ณ€๊ฒฝ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ์ˆœ์„œ๋Š” serial์ด๊ณ  ๊ทธ ๋‹ค์Œ์ด ์ƒˆ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. Bridge.RenameMobile๊ฐ€ GameActions.Rename(serial, ์ด๋ฆ„)์—๊ฒŒ ์ „ํ™”๋ฅผ ๊ฒ๋‹ˆ๋‹ค. API๋Š” CanChangeName๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ๋กœ์ปฌ Name ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„๋Š” ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ ๊ถŒํ•œ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์• ์™„๋™๋ฌผ์˜ ๊ฒฝ์šฐ ๋จผ์ € MobileCanBeRenamed๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ์š”์ฒญ์ด ์ด๋ฆ„ ์Šน์ธ์„ ๋ณด์žฅํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.RenameMobile");
UO.RenameMobile(UO.GetSerial("lasttarget"), "Companion");

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

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

  • ์บ๋ฆญํ„ฐ/ํŽซ ์ด๋ฆ„ ๋ณ€๊ฒฝ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.MobileCanBeRenamed(id)))
{
    UO.RenameMobile(id, "Companion");
}

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

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

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

  • ์ˆœ์„œ๋Š” serial์ด๊ณ  ๊ทธ ๋‹ค์Œ์ด ์ƒˆ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. Bridge.RenameMobile๊ฐ€ GameActions.Rename(serial, ์ด๋ฆ„)์—๊ฒŒ ์ „ํ™”๋ฅผ ๊ฒ๋‹ˆ๋‹ค. API๋Š” CanChangeName๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ๋กœ์ปฌ Name ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(id)) && Truth(UO.MobileCanBeRenamed(id)))
    {
        UO.RenameMobile(id, "Guardian");
    }

    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. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์„œ๋ฒ„๋Š” ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ ๊ถŒํ•œ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์• ์™„๋™๋ฌผ์˜ ๊ฒฝ์šฐ ๋จผ์ € MobileCanBeRenamed๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ์š”์ฒญ์ด ์ด๋ฆ„ ์Šน์ธ์„ ๋ณด์žฅํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
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()
    {
        RenamePet(UO.GetSerial("lasttarget"), "Companion");
        return null;
    }

    void RenamePet(dynamic id, dynamic name)
    {
        if (Truth(UO.MobileCanBeRenamed(id)) && Truth(Len(name) > 0))
        {
            UO.RenameMobile(id, name);
        }
    }

    int Len(object? value) => Convert.ToString(value)?.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.RenameMobile(mobID, newName) โ€” UO.RenameMobile(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "renamemobile": bridge.RenameMobile(Arg(0), Text(1)); return InjectionValue.Unit;
โš ๏ธ **GitHub.com Fallback** โš ๏ธ