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

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

Targeting

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

๋Œ€์ƒ ์ปค์„œ ๋ฐ ์‚ฌ์ „ ์„ค์ •๋œ ์‘๋‹ต์„ ์‚ฌ์šฉํ•œ ์ˆ˜๋™ ์‘๋‹ต WaitTarget. ์˜ˆ์ƒ ๋ชฉํ‘œ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋ณ„๊ฐœ์˜ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

์„น์…˜

์ฃผ์ œ ๋ช…๋ น ๋ฐ ์„ค๋ช…
Target UO.Target
TargetID UO.TargetID
TargetToObject UO.TargetToObject
TargetToTile UO.TargetToTile
TargetToXYZ UO.TargetToXYZ
TargetByResource UO.TargetByResource
WaitTarget UO.WaitTarget
WaitTargetObject UO.WaitTargetObject
WaitTargetType UO.WaitTargetType
WaitTargetTile UO.WaitTargetTile
WaitTargetXYZ UO.WaitTargetXYZ
WaitTargetSelf UO.WaitTargetSelf
LastTarget UO.LastTarget
CancelTarget UO.CancelTarget
Client Target Response UO.ClientRequestObjectTarget ยท UO.ClientRequestTileTarget ยท UO.WaitForClientTargetResponse ยท UO.ClientTargetResponse

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

๋Œ€์ƒ

UO.Target ยท UO.TargetID ยท UO.Targeting ยท UO.TargetPresent ยท UO.TargetToObject ยท UO.TargetToTile ยท UO.TargetToXYZ ยท UO.TargetByResource ยท UO.LastTarget ยท UO.LastTargetX ยท UO.LastTargetY ยท UO.LastTile ยท UO.TicksTarget

Waiting / ์ทจ์†Œ

UO.WaitTarget ยท UO.WaitTargetObject ยท UO.WaitTargetType ยท UO.WaitTargetObjectType ยท UO.WaitTargetTile ยท UO.WaitTargetXYZ ยท UO.WaitTargetSelf ยท UO.WaitTargetGround ยท UO.WaitTargetLast ยท UO.WaitForTarget ยท UO.IsWaitTargetActive ยท UO.CancelTarget ยท UO.CancelWaitTarget

ํด๋ผ์ด์–ธํŠธ Target ์‘๋‹ต

UO.ClientRequestObjectTarget ยท UO.ClientRequestTileTarget ยท UO.ClientTargetResponse ยท UO.ClientTargetResponsePresent ยท UO.WaitForClientTargetResponse

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

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

UO.WaitTargetObject

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

UO.CancelWaitTarget();
UO.WaitTargetObject("self");
UO.UseSkill("Anatomy");

UO.TargetToXYZ

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

if (Truth(UO.TargetPresent()))
{
    UO.TargetToXYZ(1445, 1690, 0);
}

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

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


UO.CancelTarget

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

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

void UO.CancelTarget();

ํ™œ์„ฑ ์ปค์„œ๋ฅผ ์ทจ์†Œํ•˜๊ณ  ์ค€๋น„๋œ ์‹ญ์ž์„  ๋ฐ˜์‘์„ ์ง€์›๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. true/false, serial ๋˜๋Š” type๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ object? ํ˜ธํ™˜๋˜๋Š” ์–‘์‹์˜ ๊ฒฝ์šฐ ์‹ค์ œ ๊ฒฐ๊ณผ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค void.

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • ๋…ผ์Ÿ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • self์— ๋Œ€ํ•œ ๋Œ€๊ธฐ ์ค‘์ธ ์‘๋‹ต์ด ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
UO.WaitTargetSelf();
UO.CancelTarget();

2. ๋ฏธ๋ฆฌ ์ค€๋น„ํ•œ ํฌ์ธํŠธ ๊ต์ฒด - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 1445/1690/0๋Š” ์„ธ๊ณ„์˜ ์ƒˆ๋กœ์šด ์ง€์ ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ๋ชฉํ‘œ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์ „์— ์ด์ „ ๋‹ต๋ณ€์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.CancelTarget();
    UO.WaitTargetXYZ(1445, 1690, 0);
    return null;
}

3. ์‹œ๊ฐ„ ์ดˆ๊ณผ ํ›„ ๊ฑฐ๋ถ€ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • UO.Wait=1000ms๋Š” ์ด ์˜ˆ์˜ ์ œํ•œ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.
  • ์Šคํ‚ฌ ์„ฑ๊ณต ์—ฌ๋ถ€๊ฐ€ ์•„๋‹Œ ๋‚จ์€ ๋Œ€๊ธฐ์—ด์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์‹ญ์ž์„ ์ด ์—†์œผ๋ฉด ๋‹ค์Œ ์™ธ๋ถ€ ๋ช…๋ น์€ ์ด์ „ ์‘๋‹ต์„ ์ˆ˜์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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()
    {
        UO.WaitTargetSelf();
        UO.UseSkill("Anatomy");
        await Delay(1000);
        if (Truth(UO.IsWaitTargetActive()))
        {
            UO.CancelTarget();
        }

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void CancelTarget()

        {

            var waitTargetQueue = bridge.GetWaitTargetQueue();

            if (waitTargetQueue.Length > 0 || bridge.IsTargeting() != 0)

            {

                bridge.CancelTarget();

                SystemMessage("Targeting cancelled");

            }

            else

                SystemMessage("Error: no target to cancel");

        }

UO.CancelWaitTarget

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

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

void UO.CancelWaitTarget();

์ค€๋น„๋œ ์‹ญ์ž์„  ๋ฐ˜์‘์„ ์ง€์›๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. true/false, serial ๋˜๋Š” type๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ object? ํ˜ธํ™˜๋˜๋Š” ์–‘์‹์˜ ๊ฒฝ์šฐ ์‹ค์ œ ๊ฒฐ๊ณผ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค void.

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • ๋…ผ์Ÿ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • self์— ๋Œ€ํ•œ ๋Œ€๊ธฐ ์ค‘์ธ ์‘๋‹ต์ด ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
UO.WaitTargetSelf();
UO.CancelWaitTarget();

2. ๋ฏธ๋ฆฌ ์ค€๋น„ํ•œ ํฌ์ธํŠธ ๊ต์ฒด - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 1445/1690/0๋Š” ์„ธ๊ณ„์˜ ์ƒˆ๋กœ์šด ์ง€์ ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ๋ชฉํ‘œ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์ „์— ์ด์ „ ๋‹ต๋ณ€์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.CancelWaitTarget();
    UO.WaitTargetXYZ(1445, 1690, 0);
    return null;
}

3. ์‹œ๊ฐ„ ์ดˆ๊ณผ ํ›„ ๊ฑฐ๋ถ€ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • UO.Wait=1000ms๋Š” ์ด ์˜ˆ์˜ ์ œํ•œ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.
  • ์Šคํ‚ฌ ์„ฑ๊ณต ์—ฌ๋ถ€๊ฐ€ ์•„๋‹Œ ๋‚จ์€ ๋Œ€๊ธฐ์—ด์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์‹ญ์ž์„ ์ด ์—†์œผ๋ฉด ๋‹ค์Œ ์™ธ๋ถ€ ๋ช…๋ น์€ ์ด์ „ ์‘๋‹ต์„ ์ˆ˜์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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()
    {
        UO.WaitTargetSelf();
        UO.UseSkill("Anatomy");
        await Delay(1000);
        if (Truth(UO.IsWaitTargetActive()))
        {
            UO.CancelWaitTarget();
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.CancelWaitTarget() โ€” UO.CancelWaitTarget()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "cancelwaittarget": bridge.CancelWaitTarget(); return InjectionValue.Unit;

UO.ClientRequestObjectTarget

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

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

void UO.ClientRequestObjectTarget();

ํ•ญ๋ชฉ์ด๋‚˜ ๋ฌธ์ž๋ฅผ ์ˆ˜๋™์œผ๋กœ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•œ ๋กœ์ปฌ ์‹ญ์ž์„ ์„ ์—ฝ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. true/false, serial ๋˜๋Š” type๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ object? ํ˜ธํ™˜๋˜๋Š” ์–‘์‹์˜ ๊ฒฝ์šฐ ์‹ค์ œ ๊ฒฐ๊ณผ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค void.

๋™์ž‘

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

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

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

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

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

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

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

1. ์•„์ดํ…œ์ด๋‚˜ ์บ๋ฆญํ„ฐ ์„ ํƒ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • 5000 โ€” ํด๋ฆญ ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ(๋ฐ€๋ฆฌ์ดˆ). ์ƒˆ ์ฟผ๋ฆฌ๋Š” ์ด์ „ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • 5๊ฐœ ํ•„๋“œ์˜ ๋ฐฐ์—ด์€ ์„ ํƒํ•œ ๊ฐœ์ฒด๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ[0]๋Š” type๊ฐ€ ์•„๋‹ˆ๋ผ serial์ž…๋‹ˆ๋‹ค.
UO.ClientRequestObjectTarget();
if (Truth(UO.WaitForClientTargetResponse(5000)))
{
    var result = UO.ClientTargetResponse();
    if (Truth(ArrayLength(result) == 5))
    {
        UO.Print("Serial: " + UO.Int2Hex(result[0]));
    }
    else
    {
        UO.Print("Selection cancelled");
    }
}

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. ์ทจ์†Œ๋Š” ์‘๋‹ต์ด์ง€๋งŒ ๊ฐ์ฒด๋Š” ์•„๋‹™๋‹ˆ๋‹ค - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • CancelTarget๋Š” ๋กœ์ปฌ ์„ ํƒ์„ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค. ์ฝœ๋ฐฑ์€ ๋นˆ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ClientTargetResponsePresent๋Š” 1์„ ์ œ๊ณตํ•˜์ง€๋งŒ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋Š” 0์ž…๋‹ˆ๋‹ค. ๊ธธ์ด๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š๊ณ  ๊ฒฐ๊ณผ[0]์— ์•ก์„ธ์Šคํ•˜์ง€ ๋งˆ์„ธ์š”.
return  RunScenario();
 object? RunScenario()
{
    UO.ClientRequestObjectTarget();
    UO.CancelTarget();
    if (Truth(UO.ClientTargetResponsePresent()))
    {
        var result = UO.ClientTargetResponse();
        UO.Print("Fields: " + Convert.ToString(ArrayLength(result)));
    }

    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. ๊ฐ์ฒด ์„ ํƒ ๋ฐ ๋ช…๋ช…๋œ ์ฐธ์กฐ ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

     public object? RunScenario()
    {
        UO.ClientRequestObjectTarget();
        if (UO.WaitForClientTargetResponse(5000) == 0)
            return false;
        var result = UO.ClientTargetResponse();
        if (((object? [])result).Length != 5 || Convert.ToInt32(result[0]) == 0)
            return false;
        UO.AddObject("selected_object", result[0]);
        UO.Print($"Saved object: {UO.GetName(result[0])}");
        return true;
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.ClientRequestObjectTarget() โ€” UO.ClientRequestObjectTarget()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "clientrequestobjecttarget": bridge.RequestClientTarget(false); return InjectionValue.Unit;

UO.ClientRequestTileTarget

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

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

void UO.ClientRequestTileTarget();

์ /ํƒ€์ผ ๋˜๋Š” ๊ฐœ์ฒด๋ฅผ ์ˆ˜๋™์œผ๋กœ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•œ ๋กœ์ปฌ ์‹ญ์ž์„ ์„ ์—ฝ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. true/false, serial ๋˜๋Š” type๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ object? ํ˜ธํ™˜๋˜๋Š” ์–‘์‹์˜ ๊ฒฝ์šฐ ์‹ค์ œ ๊ฒฐ๊ณผ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค void.

๋™์ž‘

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

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

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

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

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

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

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

1. ์„ ํƒํ•œ ํƒ€์ผ์˜ ์ขŒํ‘œ ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๊ฒฐ๊ณผ[1] - graphic, ๊ฒฐ๊ณผ[2]/[3]/[4] - X/Y/Z. ์„ธ๊ณ„ ํƒ€์ผ serial์˜ ๊ฒฐ๊ณผ[0]๋Š” 0์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ์œ ํ˜•, ์ขŒํ‘œ ๋ฐ serial๋Š” ๋ณ„๋„์˜ ํ•„๋“œ์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฐ์—ด์—๋Š” ์ •์  ๋ ˆ์ด์–ด ์ธ๋ฑ์Šค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
UO.ClientRequestTileTarget();
if (Truth(UO.WaitForClientTargetResponse(5000)))
{
    var result = UO.ClientTargetResponse();
    if (Truth(ArrayLength(result) == 5))
    {
        UO.Print("Type: " + UO.Int2Hex(result[1]));
        UO.Print(Convert.ToString(result[2]) + "," + Convert.ToString(result[3]) + "," + Convert.ToString(result[4]));
    }
}

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. ์„ ํƒํ•œ ์…€์˜ ์ขŒํ‘œ ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์…€์˜ ๊ฒฝ์šฐ X/Y/Z๋Š” 2/3/4 ํ•„๋“œ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์—ญ ์ €์žฅ์†Œ ๋ฌธ์ž์—ด; graphic ๋ฐ serial๋Š” ์—ฌ๊ธฐ์„œ ์ขŒํ‘œ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.ClientRequestTileTarget();
    if (UO.WaitForClientTargetResponse(5000) == 0)
        return false;
    var selection = (object? [])UO.ClientTargetResponse();
    if (selection.Length != 5)
        return false;
    UO.SetGlobal("route.x", Convert.ToString(selection[2]));
    UO.SetGlobal("route.y", Convert.ToString(selection[3]));
    UO.SetGlobal("route.z", Convert.ToString(selection[4]));
    return true;
    return null;
}

3. ๋กœ์ปฌ ์…€ ์„ ํƒ ์ค‘๋‹จ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • CancelTarget๋Š” ๋กœ์ปฌ ์ปค์„œ๋ฅผ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ทจ์†Œ ํ›„ ์ฝœ๋ฐฑ์ด ์žˆ๋‹ค๊ณ  ํ•ด์„œ ์„ ํƒ์ด ์„ฑ๊ณตํ–ˆ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.
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()
    {
        UO.ClientRequestTileTarget();
        await WaitAsync(1000);
        UO.CancelTarget();
        if (UO.ClientTargetResponsePresent() != 0)
        {
            var result = (object? [])UO.ClientTargetResponse();
            UO.Print($"Response after cancel: {result.Length} fields");
        }

        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.ClientRequestTileTarget() โ€” UO.ClientRequestTileTarget()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "clientrequesttiletarget": bridge.RequestClientTarget(true); return InjectionValue.Unit;

UO.ClientTargetResponse

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

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

dynamic UO.ClientTargetResponse();

๋งˆ์ง€๋ง‰ ๋กœ์ปฌ ClientRequest*์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์—ด์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

5๊ฐœ์˜ int ๋ฐฐ์—ด: [0]=serial ๋ฌผ์ฒด(0 ์ง€์ƒ ๊ทผ์ฒ˜/๊ณ ์ •), [1]=graphic/type, [2]=X, [3]=Y, [4]=Z. ์„ ํƒ ์ „, ์ƒˆ ์š”์ฒญ์œผ๋กœ ์žฌ์„ค์ •๋œ ํ›„, ์ทจ์†Œ ๋˜๋Š” ๋ถ€์ ์ ˆํ•œ ์„ ํƒ ์‹œ ๋นˆ ๋ฐฐ์—ด์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. hue, ์ง€๋„, ์ •์  ๋ ˆ์ด์–ด ์ธ๋ฑ์Šค ๋ฐ ํ† ์ง€/์ •์  ์†์„ฑ์ด ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ช…๋ช…๋œ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ๊ฐœ์ฒด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ฝ๊ธฐ๋Š” ๊ฒฐ๊ณผ๋ฅผ ์†Œ๋น„ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋‹ค์‹œ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ClientRequest*๊ฐ€ ์ด๋ฅผ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.
  • ์ธ๋ฑ์Šค์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์ „์— ํ•ญ์ƒ ArrayLength(result)=5์„ ํ™•์ธํ•˜์„ธ์š”.

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

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

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

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

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

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

1. ์•„์ดํ…œ์ด๋‚˜ ์บ๋ฆญํ„ฐ ์„ ํƒ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • 5000 โ€” ํด๋ฆญ ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ(๋ฐ€๋ฆฌ์ดˆ). ์ƒˆ ์ฟผ๋ฆฌ๋Š” ์ด์ „ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • 5๊ฐœ ํ•„๋“œ์˜ ๋ฐฐ์—ด์€ ์„ ํƒํ•œ ๊ฐœ์ฒด๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ[0]๋Š” type๊ฐ€ ์•„๋‹ˆ๋ผ serial์ž…๋‹ˆ๋‹ค.
UO.ClientRequestObjectTarget();
if (Truth(UO.WaitForClientTargetResponse(5000)))
{
    var result = UO.ClientTargetResponse();
    if (Truth(ArrayLength(result) == 5))
    {
        UO.Print("Serial: " + UO.Int2Hex(result[0]));
    }
    else
    {
        UO.Print("Selection cancelled");
    }
}

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. ์„ ํƒํ•œ ํƒ€์ผ์˜ ์ขŒํ‘œ ์ฝ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๊ฒฐ๊ณผ[1] - graphic, ๊ฒฐ๊ณผ[2]/[3]/[4] - X/Y/Z. ์„ธ๊ณ„ ํƒ€์ผ serial์˜ ๊ฒฐ๊ณผ[0]๋Š” 0์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ์œ ํ˜•, ์ขŒํ‘œ ๋ฐ serial๋Š” ๋ณ„๋„์˜ ํ•„๋“œ์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฐ์—ด์—๋Š” ์ •์  ๋ ˆ์ด์–ด ์ธ๋ฑ์Šค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.ClientRequestTileTarget();
    if (Truth(UO.WaitForClientTargetResponse(5000)))
    {
        var result = UO.ClientTargetResponse();
        if (Truth(ArrayLength(result) == 5))
        {
            UO.Print("Type: " + UO.Int2Hex(result[1]));
            UO.Print(Convert.ToString(result[2]) + "," + Convert.ToString(result[3]) + "," + Convert.ToString(result[4]));
        }
    }

    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. ์ทจ์†Œ๋Š” ์‘๋‹ต์ด์ง€๋งŒ ๊ฐ์ฒด๋Š” ์•„๋‹™๋‹ˆ๋‹ค. - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

     public object? RunScenario()
    {
        UO.ClientRequestObjectTarget();
        UO.CancelTarget();
        if (Truth(UO.ClientTargetResponsePresent()))
        {
            var result = UO.ClientTargetResponse();
            UO.Print("Fields: " + Convert.ToString(ArrayLength(result)));
        }

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "clienttargetresponse":

                    return new InjectionValue(bridge.ClientTargetResponse().Select(value => new InjectionValue(value)).ToArray());

UO.ClientTargetResponsePresent

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

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

dynamic UO.ClientTargetResponsePresent();

๋งˆ์ง€๋ง‰ ๋กœ์ปฌ ์„ ํƒ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์ด ์ˆ˜์‹ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int 1 โ€” ์ทจ์†Œ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ฝœ๋ฐฑ์ด ์ด๋ฏธ ์‘๋‹ตํ–ˆ์Šต๋‹ˆ๋‹ค. 0 - ์ƒˆ๋กœ์šด ์„ ํƒ์ด ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. 1 ๊ฐ’์€ ๊ฐ์ฒด์˜ ์กด์žฌ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ทจ์†Œํ•˜๋ฉด ClientTargetResponse๊ฐ€ ๋นˆ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

๋™์ž‘

  • ์„œ๋ฒ„ ์‹œ์•ผ์˜ ์กด์žฌ๋ฅผ ๋‚˜ํƒ€๋‚ด์ง€ ์•Š์œผ๋ฉฐ WaitTarget ๋Œ€๊ธฐ์—ด์„ ์„ค๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋ฅผ ์ฝ์–ด๋„ ์ด ํ”Œ๋ž˜๊ทธ๋Š” ์žฌ์„ค์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ClientRequest*์— ์˜ํ•ด ์žฌ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ทจ์†Œ๋Š” ์‘๋‹ต์ด์ง€๋งŒ ๊ฐ์ฒด๋Š” ์•„๋‹™๋‹ˆ๋‹ค. - ์ง์„  ์Šคํฌ๋ฆฝํŠธ

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

  • CancelTarget๋Š” ๋กœ์ปฌ ์„ ํƒ์„ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค. ์ฝœ๋ฐฑ์€ ๋นˆ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ClientTargetResponsePresent๋Š” 1์„ ์ œ๊ณตํ•˜์ง€๋งŒ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋Š” 0์ž…๋‹ˆ๋‹ค. ๊ธธ์ด๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š๊ณ  ๊ฒฐ๊ณผ[0]์— ์•ก์„ธ์Šคํ•˜์ง€ ๋งˆ์„ธ์š”.
UO.ClientRequestObjectTarget();
UO.CancelTarget();
if (Truth(UO.ClientTargetResponsePresent()))
{
    var result = UO.ClientTargetResponse();
    UO.Print("Fields: " + Convert.ToString(ArrayLength(result)));
}

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. ๊ฐœ์ฒด ์„ ํƒ ํ›„ ์ค€๋น„ ์ƒํƒœ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์‘๋‹ต ์ค€๋น„ ์ƒํƒœ์™€ ๋‚ด์šฉ์ด ๋ชจ๋‘ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. 1 ์†์„ฑ์€ serial ๊ฐœ์ฒด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.ClientRequestObjectTarget();
    if (UO.WaitForClientTargetResponse(5000) == 0)
        return false;
    if (UO.ClientTargetResponsePresent() == 0)
        return false;
    var response = (object? [])UO.ClientTargetResponse();
    return response.Length == 5 && Convert.ToInt32(response[0]) != 0;
    return null;
}

3. ์…€ ์„ ํƒ ์ค€๋น„ ์ƒํƒœ ์„ค๋ฌธ์กฐ์‚ฌ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ํด๋ง์€ 5์ดˆ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ์‘๋‹ต์ด ์—†์œผ๋ฉด ์ปค์„œ๊ฐ€ ์ทจ์†Œ๋ฉ๋‹ˆ๋‹ค. X/Y/Z ํ•„๋“œ๋Š” ์ „์ฒด ์‘๋‹ต์—์„œ๋งŒ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค.
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()
    {
        UO.ClientRequestTileTarget();
        for (int attempt = 0; attempt < 50; attempt++)
        {
            if (UO.ClientTargetResponsePresent() != 0)
            {
                var response = (object? [])UO.ClientTargetResponse();
                if (response.Length == 5)
                    UO.Print($"Selected tile: {response[2]},{response[3]},{response[4]}");
                return null;
            }

            await WaitAsync(100);
        }

        UO.CancelTarget();
        UO.Print("Selection timed out");
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.ClientTargetResponsePresent() โ€” UO.ClientTargetResponsePresent()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "clienttargetresponsepresent": return new InjectionValue(bridge.ClientTargetResponsePresent());

UO.IsWaitTargetActive

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

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

dynamic UO.IsWaitTargetActive();

์ค€๋น„๋œ ์‘๋‹ต์ด ๋Œ€์ƒ ๋Œ€๊ธฐ์—ด์— ๋‚จ์•„ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int 1 - ์ทจ์†Œ๋˜์ง€ ์•Š์€ ์ง€์—ฐ๋œ ๋ฌผ์ฒด, ํƒ€์ผ ๋˜๋Š” ๋‹ค์Œ ๊ด‘๊ฒฝ์˜ โ€‹โ€‹์ทจ์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 0 - ๋Œ€๊ธฐ์—ด์ด ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ด๋ฆฐ ์ปค์„œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ปค์„œ ์‚ฌ์šฉ์˜ ๊ฒฝ์šฐ TargetPresent/Targeting.

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

๋™์ž‘

  • ์ „์ฒด ํด๋ผ์ด์–ธํŠธ์˜ ๋Œ€๊ธฐ์—ด์„ ์ฝ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํ”„๋กœ์‹œ์ €๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ ๊ฐ ํ”„๋กœ์‹œ์ €์˜ ์‘๋‹ต์ด ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค.
  • 0์€ ๋ณด๋ฅ˜ ์ค‘์ธ ์‘๋‹ต์ด ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ์Šคํ‚ฌ์ด๋‚˜ ์ฃผ๋ฌธ์˜ ์„ฑ๊ณต์ ์ธ ์‚ฌ์šฉ์„ ํ™•์ธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • WaitTargetSelf ์ดํ›„ ๋ฐ ์„œ๋ฒ„ ๋Œ€์ƒ 1 ์ด์ „์ด ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.
  • CancelWaitTarget ๋Œ€๊ธฐ์—ด์„ ์ง€์›๋‹ˆ๋‹ค. ๋‹ค์Œ ํ…Œ์ŠคํŠธ๋Š” 0์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
UO.WaitTargetSelf();
UO.Print(Convert.ToString(UO.IsWaitTargetActive()));
UO.CancelWaitTarget();

2. ์‘๋‹ต์ด ์†Œ๋น„๋  ๋•Œ๊นŒ์ง€ ์ œํ•œ์ ์œผ๋กœ ๋Œ€๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ˆ˜ํ‘œ์—๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. UO.Wait=50ms, ์ตœ๋Œ€ 20 ๊ธฐ๋Œ€์น˜.
  • ๋‹ต๋ณ€์ด ๋‚จ์•„ ์žˆ์œผ๋ฉด ์ทจ์†Œ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์•ก์…˜ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ํ™•์ธ์„ ๋ณ„๋„๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var attempts = 0;
    while (Truth(UO.IsWaitTargetActive()) && Truth(attempts < 20))
    {
        await Delay(50);
        attempts = attempts + 1;
    }

    if (Truth(UO.IsWaitTargetActive()))
    {
        UO.CancelWaitTarget();
    }

    return null;
}

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

3. ๋Œ€๊ธฐ์—ด๊ณผ ์‹œ๋ ฅ์˜ ์ฐจ์ด์  ํ‘œ์‹œ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

     public object? RunScenario()
    {
        UO.Print("Queued: " + Convert.ToString(UO.IsWaitTargetActive()));
        UO.Print("Cursor: " + Convert.ToString(UO.TargetPresent()));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.IsWaitTargetActive() โ€” UO.IsWaitTargetActive()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "iswaittargetactive": return new InjectionValue(Waiting());

UO.LastTarget

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

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

int UO.LastTarget();

๋งˆ์ง€๋ง‰์œผ๋กœ ์ €์žฅ๋œ ๋Œ€์ƒ ๊ฐ์ฒด์˜ serial๋ฅผ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int - serial/ID, type๋„ ์•„๋‹ˆ๊ณ  bool๋„ ์•„๋‹™๋‹ˆ๋‹ค. 0์€ ๋ชฉํ‘œ ๊ฐ์ฒด๊ฐ€ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ง€์ƒ ๋ฐ ์ •์ ์—๋„ serial 0๊ฐ€ ์žˆ์ง€๋งŒ ์ขŒํ‘œ๋Š” ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  32 ๋น„ํŠธ๊ฐ€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ID๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด > 0 ๋˜๋Š” == true๊ฐ€ ์•„๋‹Œ != 0์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋™์ž‘

  • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์กฐ์ค€๊ฒฝ์„ ์ผœ์ง€ ์•Š์œผ๋ฉฐ, ์ƒˆ๋กœ์šด ๋Œ€์ƒ์„ ์„ ํƒํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ณต๊ฒฉํ•˜๊ฑฐ๋‚˜ ํŒจํ‚ท์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. LastTarget๋Š” LastAttack ๋ฐ LastStatus์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์„ ํƒ self๋Š” ๋งˆ์ง€๋ง‰ ๋Œ€์ƒ์„ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์ธ ClientMarkChar๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • SetEntity์—๋Š” ์•Œ๋ ค์ง„ ์—”ํ„ฐํ‹ฐ๊ฐ€ ๋ณด์กด๋ฉ๋‹ˆ๋‹ค.X/Y; ์ปจํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ํ•ญ๋ชฉ์˜ ๊ฒฝ์šฐ ์ด๋Š” ๋‚ด์šฉ์˜ ์ขŒํ‘œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SetLand/SetStatic ์„ ํƒํ•œ ์ง€์ ์˜ X/Y ์„ธ์ƒ์„ ๊ตฌํ•˜์„ธ์š”. ์ดํ›„์— ๊ฐœ์ฒด๋ฅผ ์ด๋™/์ œ๊ฑฐํ•ด๋„ ์ €์žฅ๋œ ์ขŒํ‘œ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ„์น˜๋Š” GetX/GetY(serial)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • Clear ๋ฐ World.Clear ํด๋ฆฌ์–ด ๋…น์Œ(์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ €์žฅ๋  ๋•Œ ํฌํ•จ). ๋ช…์‹œ์  ์„ค์ •์˜ ์•Œ ์ˆ˜ ์—†๋Š” serial๋Š” ์ด์ „ X/Y๋ฅผ ์ƒ์†ํ•˜์ง€ ์•Š์œผ๋ฉฐ 0๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋Œ€์ƒ์ด ์„œ๋ฒ„์— ์กด์žฌํ•จ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ณ„๋„์˜ ๋ช…๋ น์œผ๋กœ serial ๋ฐ X/Y๋ฅผ ์ฝ๋Š” ๊ฒƒ์€ ์›์ž์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์ƒ ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ LastTile๋Š” ๋„คํŠธ์›Œํฌ X/Y=65535๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ €์žฅ๋œ ๊ฐœ์ฒด ์œ„์น˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ ‘์ง€/์ •์  LastTile(1)/(2) ์ฝ๊ธฐ ์„ ํƒ X/Y. ๊ด„ํ˜ธ๊ฐ€ ์—†๋Š” lasttarget๋Š” ๋ณ€์ˆ˜๋กœ ์žฌ์ •์˜๋˜์ง€ ์•Š๋Š” ํ•œ ๋‚ด์žฅ๋œ ์‹ค์‹œ๊ฐ„ ๊ฐ’์ž…๋‹ˆ๋‹ค.
  • World.Clear ํ˜ธ์ถœ ClearWorldState: ํ™œ์„ฑ ์ฝœ๋ฐฑ, ์ €์žฅ๋œ ๋Œ€์ƒ ๋ฐ ์žฌ์ƒ ํŒจํ‚ท์„ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ •์ƒ์ ์ธ ์žฌ์„ค์ •์€ ๊ธฐ๋ก์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€ TargetLast๋Š” ์ €์žฅ๋œ ํŒจํ‚ท์„ ํ™œ์„ฑ ์„œ๋ฒ„ ๋Œ€์ƒ์—๋งŒ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๊ธฐ๋ก์ด ์—†๊ฑฐ๋‚˜ ๋กœ์ปฌ ์ฝœ๋ฐฑ์˜ ๊ฒฝ์šฐ ์•„๋ฌด๊ฒƒ๋„ ๋ณด๋‚ด์ง€ ์•Š๊ณ  ๋Œ€์ƒ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑ ํด๋ผ์ด์–ธํŠธ ์ฝœ๋ฐฑ์€ ์ทจ์†Œ๋กœ null๋ฅผ ํ•œ ๋ฒˆ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. ์‘๋‹ต์ด ๋น„์–ด ์žˆ์œผ๋ฉด ClientTargetResponsePresent๋Š” 1๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์™„๋ฃŒ๋œ ์„ ํƒ์€ ๋‹ค์‹œ ์•Œ๋ฆผ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ €์žฅ๋œ ๊ฐ’ ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • value๋Š” ๋ช…๋ น์˜ ์œ ์ผํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. HEX๋Š” ID, Convert๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.ToString๋Š” ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. ํ˜ธ์ถœ์—์„œ๋Š” ์•„๋ฌด๊ฒƒ๋„ ์„ ํƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var value = UO.LastTarget();
UO.Print("Saved value: " + Hex(value));

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

2. ์ €์žฅ๋œ ์œ„์น˜์™€ ํ˜„์žฌ ์œ„์น˜ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • id โ€” ์ €์žฅ๋จ serial. Exists๋Š” GetX/GetY ์ด์ „์— ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ๋œ ์ขŒํ‘œ์™€ ํ˜„์žฌ ์ขŒํ‘œ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. serial=0๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ˆ์ œ์—์„œ๋Š” ์„ ํƒํ•œ ์ ์„ ์ธ์‡„ํ•˜์ง€๋งŒ 0 ์ž์ฒด์—์„œ๋Š” ํ•ด๋‹น ์ ์ด ์„ ํƒ๋˜์—ˆ์Œ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.LastTarget();
    var x = UO.LastTargetX();
    var y = UO.LastTargetY();
    UO.Print("Saved XY: " + Convert.ToString(x) + "," + Convert.ToString(y));
    if (Truth(id != 0) && Truth(UO.Exists(id)))
    {
        UO.Print("Live XY: " + Convert.ToString(UO.GetX(id)) + "," + Convert.ToString(UO.GetY(id)));
    }

    return null;
}

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

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

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

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

     public object? RunScenario()
    {
        var value = ReadTargetValue();
        UO.Print("Checked value: " + Convert.ToString(value));
        return null;
    }

    dynamic ReadTargetValue()
    {
        var value = UO.LastTarget();
        if (Truth(value == 0))
        {
            return -1;
        }

        return value;
    }

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "lasttarget": return new InjectionValue(bridge.LastTarget);

UO.LastTargetX

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

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

int UO.LastTargetX();

๋งˆ์ง€๋ง‰ ๋Œ€์ƒ์„ ์„ ํƒํ–ˆ์„ ๋•Œ ์ €์žฅ๋œ X ์ขŒํ‘œ๋ฅผ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int์€ ํ™”๋ฉด ํ”ฝ์…€์ด ์•„๋‹Œ X์˜ ์ €์žฅ๋œ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. ์ง€์šฐ๊ธฐ ์ „/ํ›„ ๋˜๋Š” ์•Œ ์ˆ˜ ์—†๋Š” ๋ฌผ์ฒด์— ๋Œ€ํ•ด - 0; ์‹ค์ œ ์ขŒํ‘œ 0๋„ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. bool๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ง€์ƒ/์ •์ ์˜ ๊ฒฝ์šฐ LastTarget()=0์—์„œ๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์กฐ์ค€๊ฒฝ์„ ์ผœ์ง€ ์•Š์œผ๋ฉฐ, ์ƒˆ๋กœ์šด ๋Œ€์ƒ์„ ์„ ํƒํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ณต๊ฒฉํ•˜๊ฑฐ๋‚˜ ํŒจํ‚ท์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. LastTarget๋Š” LastAttack ๋ฐ LastStatus์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์„ ํƒ self๋Š” ๋งˆ์ง€๋ง‰ ๋Œ€์ƒ์„ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์ธ ClientMarkChar๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • SetEntity์—๋Š” ์•Œ๋ ค์ง„ ์—”ํ„ฐํ‹ฐ๊ฐ€ ๋ณด์กด๋ฉ๋‹ˆ๋‹ค.X/Y; ์ปจํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ํ•ญ๋ชฉ์˜ ๊ฒฝ์šฐ ์ด๋Š” ๋‚ด์šฉ์˜ ์ขŒํ‘œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SetLand/SetStatic ์„ ํƒํ•œ ์ง€์ ์˜ X/Y ์„ธ์ƒ์„ ๊ตฌํ•˜์„ธ์š”. ์ดํ›„์— ๊ฐœ์ฒด๋ฅผ ์ด๋™/์ œ๊ฑฐํ•ด๋„ ์ €์žฅ๋œ ์ขŒํ‘œ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ„์น˜๋Š” GetX/GetY(serial)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • Clear ๋ฐ World.Clear ํด๋ฆฌ์–ด ๋…น์Œ(์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ €์žฅ๋  ๋•Œ ํฌํ•จ). ๋ช…์‹œ์  ์„ค์ •์˜ ์•Œ ์ˆ˜ ์—†๋Š” serial๋Š” ์ด์ „ X/Y๋ฅผ ์ƒ์†ํ•˜์ง€ ์•Š์œผ๋ฉฐ 0๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋Œ€์ƒ์ด ์„œ๋ฒ„์— ์กด์žฌํ•จ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ณ„๋„์˜ ๋ช…๋ น์œผ๋กœ serial ๋ฐ X/Y๋ฅผ ์ฝ๋Š” ๊ฒƒ์€ ์›์ž์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์ƒ ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ LastTile๋Š” ๋„คํŠธ์›Œํฌ X/Y=65535๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ €์žฅ๋œ ๊ฐœ์ฒด ์œ„์น˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ ‘์ง€/์ •์  LastTile(1)/(2) ์ฝ๊ธฐ ์„ ํƒ X/Y. ๊ด„ํ˜ธ๊ฐ€ ์—†๋Š” lasttarget๋Š” ๋ณ€์ˆ˜๋กœ ์žฌ์ •์˜๋˜์ง€ ์•Š๋Š” ํ•œ ๋‚ด์žฅ๋œ ์‹ค์‹œ๊ฐ„ ๊ฐ’์ž…๋‹ˆ๋‹ค.
  • World.Clear ํ˜ธ์ถœ ClearWorldState: ํ™œ์„ฑ ์ฝœ๋ฐฑ, ์ €์žฅ๋œ ๋Œ€์ƒ ๋ฐ ์žฌ์ƒ ํŒจํ‚ท์„ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ •์ƒ์ ์ธ ์žฌ์„ค์ •์€ ๊ธฐ๋ก์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€ TargetLast๋Š” ์ €์žฅ๋œ ํŒจํ‚ท์„ ํ™œ์„ฑ ์„œ๋ฒ„ ๋Œ€์ƒ์—๋งŒ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๊ธฐ๋ก์ด ์—†๊ฑฐ๋‚˜ ๋กœ์ปฌ ์ฝœ๋ฐฑ์˜ ๊ฒฝ์šฐ ์•„๋ฌด๊ฒƒ๋„ ๋ณด๋‚ด์ง€ ์•Š๊ณ  ๋Œ€์ƒ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑ ํด๋ผ์ด์–ธํŠธ ์ฝœ๋ฐฑ์€ ์ทจ์†Œ๋กœ null๋ฅผ ํ•œ ๋ฒˆ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. ์‘๋‹ต์ด ๋น„์–ด ์žˆ์œผ๋ฉด ClientTargetResponsePresent๋Š” 1๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์™„๋ฃŒ๋œ ์„ ํƒ์€ ๋‹ค์‹œ ์•Œ๋ฆผ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ €์žฅ๋œ ๊ฐ’ ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • value๋Š” ๋ช…๋ น์˜ ์œ ์ผํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. HEX๋Š” ID, Convert๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.ToString๋Š” ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. ํ˜ธ์ถœ์—์„œ๋Š” ์•„๋ฌด๊ฒƒ๋„ ์„ ํƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var value = UO.LastTargetX();
UO.Print("Saved value: " + Convert.ToString(value));

2. ์ €์žฅ๋œ ์œ„์น˜์™€ ํ˜„์žฌ ์œ„์น˜ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • id โ€” ์ €์žฅ๋จ serial. Exists๋Š” GetX/GetY ์ด์ „์— ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ๋œ ์ขŒํ‘œ์™€ ํ˜„์žฌ ์ขŒํ‘œ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. serial=0๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ˆ์ œ์—์„œ๋Š” ์„ ํƒํ•œ ์ ์„ ์ธ์‡„ํ•˜์ง€๋งŒ 0 ์ž์ฒด์—์„œ๋Š” ํ•ด๋‹น ์ ์ด ์„ ํƒ๋˜์—ˆ์Œ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.LastTarget();
    var x = UO.LastTargetX();
    var y = UO.LastTargetY();
    UO.Print("Saved XY: " + Convert.ToString(x) + "," + Convert.ToString(y));
    if (Truth(id != 0) && Truth(UO.Exists(id)))
    {
        UO.Print("Live XY: " + Convert.ToString(UO.GetX(id)) + "," + Convert.ToString(UO.GetY(id)));
    }

    return null;
}

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

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

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

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

     public object? RunScenario()
    {
        var value = ReadTargetValue(0, 65535);
        UO.Print("Checked value: " + Convert.ToString(value));
        return null;
    }

    dynamic ReadTargetValue(dynamic minimum, dynamic maximum)
    {
        var value = UO.LastTargetX();
        if (Truth(value < minimum) || Truth(value > maximum))
        {
            return -1;
        }

        return value;
    }

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int LastTargetX() => bridge is ITargetSnapshotBridge snapshot ? snapshot.LastTargetX : bridge.GetX(bridge.LastTarget);

UO.LastTargetY

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

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

int UO.LastTargetY();

๋งˆ์ง€๋ง‰ ๋Œ€์ƒ์„ ์„ ํƒํ–ˆ์„ ๋•Œ ์ €์žฅ๋œ Y ์ขŒํ‘œ๋ฅผ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int์€ ํ™”๋ฉด ํ”ฝ์…€์ด ์•„๋‹Œ Y์˜ ์ €์žฅ๋œ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. ์ง€์šฐ๊ธฐ ์ „/ํ›„ ๋˜๋Š” ์•Œ ์ˆ˜ ์—†๋Š” ๋ฌผ์ฒด์— ๋Œ€ํ•ด - 0; ์‹ค์ œ ์ขŒํ‘œ 0๋„ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. bool๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ง€์ƒ/์ •์ ์˜ ๊ฒฝ์šฐ LastTarget()=0์—์„œ๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์กฐ์ค€๊ฒฝ์„ ์ผœ์ง€ ์•Š์œผ๋ฉฐ, ์ƒˆ๋กœ์šด ๋Œ€์ƒ์„ ์„ ํƒํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ณต๊ฒฉํ•˜๊ฑฐ๋‚˜ ํŒจํ‚ท์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. LastTarget๋Š” LastAttack ๋ฐ LastStatus์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์„ ํƒ self๋Š” ๋งˆ์ง€๋ง‰ ๋Œ€์ƒ์„ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์ธ ClientMarkChar๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • SetEntity์—๋Š” ์•Œ๋ ค์ง„ ์—”ํ„ฐํ‹ฐ๊ฐ€ ๋ณด์กด๋ฉ๋‹ˆ๋‹ค.X/Y; ์ปจํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ํ•ญ๋ชฉ์˜ ๊ฒฝ์šฐ ์ด๋Š” ๋‚ด์šฉ์˜ ์ขŒํ‘œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SetLand/SetStatic ์„ ํƒํ•œ ์ง€์ ์˜ X/Y ์„ธ์ƒ์„ ๊ตฌํ•˜์„ธ์š”. ์ดํ›„์— ๊ฐœ์ฒด๋ฅผ ์ด๋™/์ œ๊ฑฐํ•ด๋„ ์ €์žฅ๋œ ์ขŒํ‘œ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ„์น˜๋Š” GetX/GetY(serial)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • Clear ๋ฐ World.Clear ํด๋ฆฌ์–ด ๋…น์Œ(์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ €์žฅ๋  ๋•Œ ํฌํ•จ). ๋ช…์‹œ์  ์„ค์ •์˜ ์•Œ ์ˆ˜ ์—†๋Š” serial๋Š” ์ด์ „ X/Y๋ฅผ ์ƒ์†ํ•˜์ง€ ์•Š์œผ๋ฉฐ 0๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋Œ€์ƒ์ด ์„œ๋ฒ„์— ์กด์žฌํ•จ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ณ„๋„์˜ ๋ช…๋ น์œผ๋กœ serial ๋ฐ X/Y๋ฅผ ์ฝ๋Š” ๊ฒƒ์€ ์›์ž์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์ƒ ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ LastTile๋Š” ๋„คํŠธ์›Œํฌ X/Y=65535๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ €์žฅ๋œ ๊ฐœ์ฒด ์œ„์น˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ ‘์ง€/์ •์  LastTile(1)/(2) ์ฝ๊ธฐ ์„ ํƒ X/Y. ๊ด„ํ˜ธ๊ฐ€ ์—†๋Š” lasttarget๋Š” ๋ณ€์ˆ˜๋กœ ์žฌ์ •์˜๋˜์ง€ ์•Š๋Š” ํ•œ ๋‚ด์žฅ๋œ ์‹ค์‹œ๊ฐ„ ๊ฐ’์ž…๋‹ˆ๋‹ค.
  • World.Clear ํ˜ธ์ถœ ClearWorldState: ํ™œ์„ฑ ์ฝœ๋ฐฑ, ์ €์žฅ๋œ ๋Œ€์ƒ ๋ฐ ์žฌ์ƒ ํŒจํ‚ท์„ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ •์ƒ์ ์ธ ์žฌ์„ค์ •์€ ๊ธฐ๋ก์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€ TargetLast๋Š” ์ €์žฅ๋œ ํŒจํ‚ท์„ ํ™œ์„ฑ ์„œ๋ฒ„ ๋Œ€์ƒ์—๋งŒ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๊ธฐ๋ก์ด ์—†๊ฑฐ๋‚˜ ๋กœ์ปฌ ์ฝœ๋ฐฑ์˜ ๊ฒฝ์šฐ ์•„๋ฌด๊ฒƒ๋„ ๋ณด๋‚ด์ง€ ์•Š๊ณ  ๋Œ€์ƒ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑ ํด๋ผ์ด์–ธํŠธ ์ฝœ๋ฐฑ์€ ์ทจ์†Œ๋กœ null๋ฅผ ํ•œ ๋ฒˆ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. ์‘๋‹ต์ด ๋น„์–ด ์žˆ์œผ๋ฉด ClientTargetResponsePresent๋Š” 1๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์™„๋ฃŒ๋œ ์„ ํƒ์€ ๋‹ค์‹œ ์•Œ๋ฆผ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ €์žฅ๋œ ๊ฐ’ ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • value๋Š” ๋ช…๋ น์˜ ์œ ์ผํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. HEX๋Š” ID, Convert๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.ToString๋Š” ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. ํ˜ธ์ถœ์—์„œ๋Š” ์•„๋ฌด๊ฒƒ๋„ ์„ ํƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var value = UO.LastTargetY();
UO.Print("Saved value: " + Convert.ToString(value));

2. ์ €์žฅ๋œ ์œ„์น˜์™€ ํ˜„์žฌ ์œ„์น˜ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • id โ€” ์ €์žฅ๋จ serial. Exists๋Š” GetX/GetY ์ด์ „์— ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ๋œ ์ขŒํ‘œ์™€ ํ˜„์žฌ ์ขŒํ‘œ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. serial=0๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ˆ์ œ์—์„œ๋Š” ์„ ํƒํ•œ ์ ์„ ์ธ์‡„ํ•˜์ง€๋งŒ 0 ์ž์ฒด์—์„œ๋Š” ํ•ด๋‹น ์ ์ด ์„ ํƒ๋˜์—ˆ์Œ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.LastTarget();
    var x = UO.LastTargetX();
    var y = UO.LastTargetY();
    UO.Print("Saved XY: " + Convert.ToString(x) + "," + Convert.ToString(y));
    if (Truth(id != 0) && Truth(UO.Exists(id)))
    {
        UO.Print("Live XY: " + Convert.ToString(UO.GetX(id)) + "," + Convert.ToString(UO.GetY(id)));
    }

    return null;
}

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

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

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

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

     public object? RunScenario()
    {
        var value = ReadTargetValue(0, 65535);
        UO.Print("Checked value: " + Convert.ToString(value));
        return null;
    }

    dynamic ReadTargetValue(dynamic minimum, dynamic maximum)
    {
        var value = UO.LastTargetY();
        if (Truth(value < minimum) || Truth(value > maximum))
        {
            return -1;
        }

        return value;
    }

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int LastTargetY() => bridge is ITargetSnapshotBridge snapshot ? snapshot.LastTargetY : bridge.GetY(bridge.LastTarget);

UO.LastTile

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

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

string UO.LastTile();
int UO.LastTile(object? index);

๋งˆ์ง€๋ง‰์œผ๋กœ ์ €์žฅ๋œ ํƒ€์ผ ๋Œ€์ƒ์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • index - ์„ ํƒ์‚ฌํ•ญ int 0..3: 0=graphic, 1=X, 2=Y, 3=Z. ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค. - 0. ์ธ๋ฑ์Šค๊ฐ€ ์—†์œผ๋ฉด ์ „์ฒด ๋ ˆ์ฝ”๋“œ์˜ ํ–‰์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

์ธ์ˆ˜ ์—†์Œ string "graphic X Y Z" ์‹ญ์ง„์ˆ˜ ํ•„๋“œ ํฌํ•จ; ์ธ๋ฑ์Šค ํฌํ•จ - ํ•œ ํ•„๋“œ์˜ int. ๋ˆ„๋ฝ/์งง์€ ํ•ญ๋ชฉ์€ 0์œผ๋กœ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค.

๋™์ž‘

  • NormalizeLastTile๋Š” ๋ˆ„๋ฝ๋œ ํ•„๋“œ๋ฅผ 4๊ฐœ๋กœ ์™„์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ์ค„์—๋Š” map/hue/serial๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0 ๊ฐ’์€ ์‹ค์ œ graphic/์ขŒํ‘œ ๋˜๋Š” ํ•„๋“œ ์—†์Œ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์€ ์ €์žฅ๋œ ํƒ€์ผ ๋Œ€์ƒ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. ๋Œ€์ƒ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ƒˆ ์…€์„ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. WaitTargetTile("lasttile")์€ ๋ณ„๋„์˜ ๋ ˆ์ฝ”๋“œ ์กด์žฌ ํ™•์ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ๋งˆ์ง€๋ง‰์œผ๋กœ ์ €์žฅ๋œ ํƒ€์ผ ๋Œ€์ƒ์„ ์ฝ์Šต๋‹ˆ๋‹ค.
UO.Print(UO.LastTile());

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

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

  • NormalizeLastTile๋Š” ๋ˆ„๋ฝ๋œ ํ•„๋“œ๋ฅผ 4๊ฐœ๋กœ ์™„์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ์ค„์—๋Š” map/hue/serial๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0 ๊ฐ’์€ ์‹ค์ œ graphic/์ขŒํ‘œ ๋˜๋Š” ํ•„๋“œ ์—†์Œ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.LastTile(1));
    UO.Print(UO.LastTile(2));
    UO.Print(UO.LastTile(3));
    return null;
}

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

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

  • ์ด ๋ช…๋ น์€ ์ €์žฅ๋œ ํƒ€์ผ ๋Œ€์ƒ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. ๋Œ€์ƒ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ƒˆ ์…€์„ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. WaitTargetTile("lasttile")์€ ๋ณ„๋„์˜ ๋ ˆ์ฝ”๋“œ ์กด์žฌ ํ™•์ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
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 graphic = UO.LastTile(0);
        var x = UO.LastTile(1);
        var y = UO.LastTile(2);
        var z = UO.LastTile(3);
        UO.Print(Convert.ToString(graphic) + " " + Convert.ToString(x) + " " + Convert.ToString(y) + " " + Convert.ToString(z));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.LastTile() โ€” UO.LastTile()

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

public string LastTile()

        {

            int[] tileInfo = NormalizeLastTile(bridge.LastTile());



            return $"{tileInfo[0]} {tileInfo[1]} {tileInfo[2]} {tileInfo[3]}";

        }

UO.LastTile(index) โ€” UO.LastTile(Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int LastTile(InjectionValue index)

        {

            var i = NumberConversions.ToInt(index);

            if (i < 0 || i > 3)

                return 0;



            return NormalizeLastTile(bridge?.LastTile())[i];



        }

UO.Target

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

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

void UO.Target();
void UO.Target(object? @object);
void UO.Target(object? targetKey, object? target);
void UO.Target(object? targetKey, object? target, object? targetType, object? @type, object? x, object? y, object? z);

์˜ˆ์ƒ ๋Œ€์ƒ์„ ์ทจ์†Œ/์„ค์ •ํ•˜๊ฑฐ๋‚˜ ๋ช…์‹œ์ ์ธ ๋Œ€์ƒ ํŒจํ‚ท์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

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

  • object โ€” ์ธ์ˆ˜ 1๊ฐœ: serial/alias๋Š” WaitTargetObject์„ ํ†ตํ•ด ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜ ์—†์Œ - CancelTarget.
  • targetKey โ€” ID ๋Œ€์ƒ ์ฟผ๋ฆฌ์˜ int ์ธ์ˆ˜์˜ 2/7 ํ˜•์‹์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ UO.TargetID()์ž…๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€์— ์ง์ ‘ ์ „๋‹ฌ๋˜๋ฉฐ ํ‚ค๋ฅผ ๋ˆ„๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • target โ€” ์–‘์‹ 2: serial/๋ณ„์นญ ๋˜๋Š” "lasttile". ๋ชจ์–‘ 7: serial ๊ฐœ์ฒด; "ground"์€ serial=0์„ ๋‚จ๊น๋‹ˆ๋‹ค.
  • targetType - 7 ํ˜•์‹๋งŒ ํ•ด๋‹น: ํ”„๋กœํ† ์ฝœ ์œ ํ˜• ๋Œ€์ƒ, ์ผ๋ฐ˜์ ์œผ๋กœ 0 ๊ฐ์ฒด, 1 ํƒ€์ผ. byte๋กœ ์ถ•์†Œ ๊ฐ€๋Šฅ.
  • type - 7 ๋ชจ์–‘๋งŒ ํ•ด๋‹น: graphic ๋ฐ ํƒ€์ผ/์•Œ ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด์˜ ์„ธ๊ณ„ ์ขŒํ‘œ; graphic/X/Y๋Š” ushort๋กœ, Z๋Š” sbyte๋กœ ์ถ•์†Œ๋ฉ๋‹ˆ๋‹ค. ์•Œ๋ ค์ง„ ์—”ํ„ฐํ‹ฐ ๋ธŒ๋ฆฌ์ง€์˜ ๊ฒฝ์šฐ ์ด๋ฅผ ์‹ค์ œ ์—”ํ„ฐํ‹ฐ ํ•„๋“œ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  • x - 7 ๋ชจ์–‘๋งŒ ํ•ด๋‹น: graphic ๋ฐ ํƒ€์ผ/์•Œ ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด์˜ ์„ธ๊ณ„ ์ขŒํ‘œ; graphic/X/Y๋Š” ushort๋กœ, Z๋Š” sbyte๋กœ ์ถ•์†Œ๋ฉ๋‹ˆ๋‹ค. ์•Œ๋ ค์ง„ ์—”ํ„ฐํ‹ฐ ๋ธŒ๋ฆฌ์ง€์˜ ๊ฒฝ์šฐ ์ด๋ฅผ ์‹ค์ œ ์—”ํ„ฐํ‹ฐ ํ•„๋“œ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  • y - 7 ๋ชจ์–‘๋งŒ ํ•ด๋‹น: graphic ๋ฐ ํƒ€์ผ/์•Œ ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด์˜ ์„ธ๊ณ„ ์ขŒํ‘œ; graphic/X/Y๋Š” ushort๋กœ, Z๋Š” sbyte๋กœ ์ถ•์†Œ๋ฉ๋‹ˆ๋‹ค. ์•Œ๋ ค์ง„ ์—”ํ„ฐํ‹ฐ ๋ธŒ๋ฆฌ์ง€์˜ ๊ฒฝ์šฐ ์ด๋ฅผ ์‹ค์ œ ์—”ํ„ฐํ‹ฐ ํ•„๋“œ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  • z - 7 ๋ชจ์–‘๋งŒ ํ•ด๋‹น: graphic ๋ฐ ํƒ€์ผ/์•Œ ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด์˜ ์„ธ๊ณ„ ์ขŒํ‘œ; graphic/X/Y๋Š” ushort๋กœ, Z๋Š” sbyte๋กœ ์ถ•์†Œ๋ฉ๋‹ˆ๋‹ค. ์•Œ๋ ค์ง„ ์—”ํ„ฐํ‹ฐ ๋ธŒ๋ฆฌ์ง€์˜ ๊ฒฝ์šฐ ์ด๋ฅผ ์‹ค์ œ ์—”ํ„ฐํ‹ฐ ํ•„๋“œ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ์ธ์ˆ˜๊ฐ€ ์—†๊ฑฐ๋‚˜ ํ•˜๋‚˜์ธ ์–‘์‹์€ ExecuteLegacyManualAlias๋ฅผ ๋”ฐ๋ผ ์ง„ํ–‰๋˜๊ณ  ๋Œ€๊ธฐ์—ด์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. 2/7 ์–‘์‹์€ Target๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๊ณ  ๋‹ค์Œ ๋Œ€์ƒ์˜ ๋Œ€๊ธฐ์—ด์ด ์•„๋‹Œ Send_TargetObject๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • 2 ํ˜•์‹์—์„œ "lasttile"์€ ์ €์žฅ๋œ ๋Œ€์ƒ ํƒ€์ผ์˜ graphic/X/Y/Z๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ถ€์žฌํ•˜๋ฉด ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด ๋ณ„์นญ๋„ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. targetType=0๊ฐ€ ์žˆ๋Š” 7 ํ˜•์‹์€ serial๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์œ ํ˜•์€ serial=0์„ ๋– ๋‚˜์„ธ์š”.
  • Bridge.Target๋Š” ํ™œ์„ฑ ์ปค์„œ/์ผ์น˜ targetKey๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ID๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ์š”์ฒญ์˜ ์ด์ „ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ํ˜ธ์ถœ์€ ์„œ๋ฒ„์—์„œ ์ˆ˜๋ฝ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • 2/7 ์ธ์ˆ˜์˜ ๋ช…์‹œ์  ํ˜•์‹์€ ํŒจํ‚ท์„ ์ง์ ‘ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์Œ์ˆ˜ serial๋Š” 0์ด ๋˜๊ณ , targetKey๋Š” uint๋กœ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. ์ด ๋ถ„๊ธฐ๋Š” ๋กœ์ปฌ ์ปค์„œ/ํ๋ฅผ ์ง€์šฐ๊ฑฐ๋‚˜ TicksTarget๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. TargetToObject/TargetToTile ํด๋ผ์ด์–ธํŠธ์˜ ํ™œ์„ฑ ์กฐ์ค€์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ์˜ˆ์ƒ ๋Œ€์ƒ์„ ์ทจ์†Œ/์„ค์ •ํ•˜๊ฑฐ๋‚˜ ๋ช…์‹œ์ ์ธ ๋Œ€์ƒ ํŒจํ‚ท์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
UO.Target("self");
UO.Print(UO.Waiting());
UO.Target();

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

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๊ฑฐ๋‚˜ ํ•˜๋‚˜์ธ ์–‘์‹์€ ExecuteLegacyManualAlias๋ฅผ ๋”ฐ๋ผ ์ง„ํ–‰๋˜๊ณ  ๋Œ€๊ธฐ์—ด์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. 2/7 ์–‘์‹์€ Target๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๊ณ  ๋‹ค์Œ ๋Œ€์ƒ์˜ ๋Œ€๊ธฐ์—ด์ด ์•„๋‹Œ Send_TargetObject๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.TargetPresent()))
    {
        UO.Target(UO.TargetID(), "self");
    }

    return null;
}

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

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

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

  • Bridge.Target๋Š” ํ™œ์„ฑ ์ปค์„œ/์ผ์น˜ targetKey๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ID๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ์š”์ฒญ์˜ ์ด์ „ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ํ˜ธ์ถœ์€ ์„œ๋ฒ„์—์„œ ์ˆ˜๋ฝ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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.TargetPresent()))
        {
            UO.Target(UO.TargetID(), "ground", 1, 0, UO.GetX(), UO.GetY(), UO.GetZ());
        }

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "target":

                    if (arguments.Length > 0) WaitTargetObject(arguments[0].ToString());

                    else CancelTarget();

                    break;

UO.Target(object) โ€” UO.Target(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "target":

                    if (arguments.Length > 0) WaitTargetObject(arguments[0].ToString());

                    else CancelTarget();

                    break;

UO.Target(targetKey, target) โ€” UO.Target(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void Target(InjectionValue targetKey, InjectionValue target)

        {

            int key = NumberConversions.ToInt(targetKey);

            string selector = target.Kind == InjectionValueKind.String ? target.String : string.Empty;



            if (selector.Equals("lasttile", StringComparison.OrdinalIgnoreCase))

            {

                int[] tile = bridge.LastTile() ?? Array.Empty<int>();

                if (tile.Length >= 4)

                    bridge.Target(key, 0, 1, tile[0], tile[1], tile[2], tile[3]);

                else

                    SystemMessage("UO.Target: lasttile is unavailable");

                return;

            }



            if (TryGetObject(target, out int serial))

                bridge.Target(key, serial, 0, 0, 0, 0, 0);

            else

                SystemMessage($"UO.Target: invalid target '{selector}'");

        }

UO.Target(targetKey, target, targetType, type, x, y, z) โ€” UO.Target(Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: targetKey (Any), target (Any), targetType (Any), type (Any), x (Any), y (Any), z (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void Target

        (

            InjectionValue targetKey,

            InjectionValue target,

            InjectionValue targetType,

            InjectionValue type,

            InjectionValue x,

            InjectionValue y,

            InjectionValue z

        )

        {

            int targetTypeValue = NumberConversions.ToInt(targetType);

            string selector = target.Kind == InjectionValueKind.String ? target.String : string.Empty;

            int serial = 0;



            if (targetTypeValue == 0 && !selector.Equals("ground", StringComparison.OrdinalIgnoreCase))

                TryGetObject(target, out serial);



            bridge.Target

            (

                NumberConversions.ToInt(targetKey),

                serial,

                targetTypeValue,

                ResolveType(type),

                NumberConversions.ToInt(x),

                NumberConversions.ToInt(y),

                NumberConversions.ToInt(z)

            );

        }

UO.TargetByResource

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

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

void UO.TargetByResource(object? objID, object? resource);

graphic์—์„œ ์•„์ดํ…œ์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ, ์ฃผ์–ด์ง„ ๋Œ€์ƒ์„ ์ค€๋น„ํ•˜๊ณ , ์ฐพ์€ ์•„์ดํ…œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ์ด ๊ตฌํ˜„์—์„œ๋Š” FindType(ResolveType(Resource), -1, 0, -1, true)๊ฐ€ ํ•ญ๋ชฉ์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฐœ๊ฒฌ๋œ ๊ฒฝ์šฐ != 0, ์ฒซ ๋ฒˆ์งธ ๋ธŒ๋ฆฌ์ง€.WaitTargetObject(ObjID), ๋‹ค์Œ ๋ธŒ๋ฆฌ์ง€.UseObject(๋ฐœ๊ฒฌ).
  • ์•„๋ฌด๊ฒƒ๋„ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๊ฒƒ๋„ ์„ค์น˜๋˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๋ณ„๋„์˜ ๋ฆฌ์†Œ์Šค ๋Œ€์ƒ ํŒจํ‚ท์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฒ”์œ„=0๋Š” ์ธ๋ฒคํ† ๋ฆฌ ์ฝ˜ํ…์ธ /์žฅ๋น„๋ฅผ ํฌํ•จํ•˜์—ฌ RootContainer=Player.Serial์ด ์žˆ๋Š” ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. recursive=true๋Š” ๋ธŒ๋ฆฌ์ง€๋กœ ์ „๋‹ฌ๋˜์ง€๋งŒ ์ดscope0 ๋ถ„๊ธฐ ์ž์ฒด๋Š” RootContainer์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.TargetByResource");
UO.TargetByResource("self", "0x0E21");

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

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

  • graphic์—์„œ ์•„์ดํ…œ์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ, ์ฃผ์–ด์ง„ ๋Œ€์ƒ์„ ์ค€๋น„ํ•˜๊ณ , ์ฐพ์€ ์•„์ดํ…œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
UO.TargetByResource("self", "0x0E21");

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

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

  • ์ด ๊ตฌํ˜„์—์„œ๋Š” FindType(ResolveType(Resource), -1, 0, -1, true)๊ฐ€ ํ•ญ๋ชฉ์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฐœ๊ฒฌ๋œ ๊ฒฝ์šฐ != 0, ์ฒซ ๋ฒˆ์งธ ๋ธŒ๋ฆฌ์ง€.WaitTargetObject(ObjID), ๋‹ค์Œ ๋ธŒ๋ฆฌ์ง€.UseObject(๋ฐœ๊ฒฌ).
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("lasttarget")))
    {
        UO.TargetByResource("lasttarget", "0x0E21");
    }

    return null;
}

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

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

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

  • ์•„๋ฌด๊ฒƒ๋„ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๊ฒƒ๋„ ์„ค์น˜๋˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๋ณ„๋„์˜ ๋ฆฌ์†Œ์Šค ๋Œ€์ƒ ํŒจํ‚ท์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฒ”์œ„=0๋Š” ์ธ๋ฒคํ† ๋ฆฌ ์ฝ˜ํ…์ธ /์žฅ๋น„๋ฅผ ํฌํ•จํ•˜์—ฌ RootContainer=Player.Serial์ด ์žˆ๋Š” ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. recursive=true๋Š” ๋ธŒ๋ฆฌ์ง€๋กœ ์ „๋‹ฌ๋˜์ง€๋งŒ ์ดscope0 ๋ถ„๊ธฐ ์ž์ฒด๋Š” RootContainer์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.TargetByResource("self", "0x0E21");
        UO.Print(UO.Waiting());
        UO.CancelWaitTarget();
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.TargetByResource(objID, resource) โ€” UO.TargetByResource(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "targetbyresource":

                {

                    int found = bridge.FindType(ResolveType(arguments[1]), -1, 0, -1, true);

                    if (found != 0) { bridge.WaitTargetObject(Arg(0)); bridge.UseObject(found); }

                    return InjectionValue.Unit;

                }

UO.TargetID

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

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

dynamic UO.TargetID();

ํ˜„์žฌ ๋Œ€์ƒ ์ปค์„œ์˜ ID๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int - ๋งˆ์ง€๋ง‰ ๊ฐœ์ฒด์˜ serial๊ฐ€ ์•„๋‹Œ ์ปค์„œ์˜ 32 ๋น„ํŠธ ID. ์ปค์„œ๊ฐ€ ์—†์œผ๋ฉด 0๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ตœ์ƒ์œ„ ๋น„ํŠธ๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ int๋Š” ์Œ์ˆ˜์ž…๋‹ˆ๋‹ค. Int2Hex๋Š” ๋น„ํŠธ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ cursorID=0 ๋ฐ ๋กœ์ปฌ ๋ฒ”์œ„์—์„œ๋Š” 0๋„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. TargetPresent์—์„œ ํ™œ๋™์„ ํ™•์ธํ•˜์„ธ์š”. ์ด ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” null ID์— ๋Œ€ํ•œ null์ด ์•„๋‹Œ ํŠน์ˆ˜ ๋Œ€์ฒด๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • LastTarget/GetSerial("lasttarget")๋Š” ์„ ํƒํ•œ ๊ฐœ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ณ , TargetID๋Š” ๋Œ€์ƒ ์š”์ฒญ์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ ์„œ๋กœ ๋Œ€์ฒด๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ํ™œ์„ฑ ์ปค์„œ์˜ ID ์ธ์‡„ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋…ผ์Ÿ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • Int2Hex์„ ์‚ฌ์šฉํ•˜๋ฉด ์ตœ์ƒ์œ„ ๋น„ํŠธ๋ฅผ ํฌํ•จํ•˜์—ฌ ID์˜ ๋ชจ๋“  ๋น„ํŠธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
if (Truth(UO.TargetPresent()))
{
    UO.Print(UO.Int2Hex(UO.TargetID()));
}

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

2. ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์„ ๊ตฌ๋ณ„ ID - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ปค์„œ โ€” ์‹œ์•ผ์˜ ID, ๋ฌผ์ฒด์˜ object โ€” serial.
  • TargetToObject์—์„œ๋Š” ์ปค์„œ๊ฐ€ ์•„๋‹Œ object๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var cursor = UO.TargetID();
    var targetSerial = UO.GetSerial("lasttarget");
    UO.Print("Cursor: " + UO.Int2Hex(cursor));
    UO.Print("Object: " + targetSerial);
    return null;
}

3. ๋Œ€๊ธฐ ํ›„ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • 1000 โ€” ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ(๋ฐ€๋ฆฌ์ดˆ).
  • ๋ฐœ์ƒ ์ง•ํ›„๋Š” ๊ฒฐ๊ณผ WaitForTarget์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ปค์„œ ๊ธฐํ˜ธ๊ฐ€ ํ™•์ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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.WaitForTarget(1000)))
        {
            var cursor = UO.TargetID();
            UO.Print("Request: " + UO.Int2Hex(cursor));
        }
        else
        {
            UO.Print("No cursor arrived");
        }

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "targetid": return new InjectionValue(bridge.GetTargetCursorId());

UO.TargetPresent

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

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

dynamic UO.TargetPresent();

ํด๋ผ์ด์–ธํŠธ์—์„œ ํ™œ์„ฑ ๋Œ€์ƒ ์„ ํƒ ์ปค์„œ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int 1 - TargetManager.IsTargeting ์„ค์น˜; 0 - ํ™œ์„ฑ ์ปค์„œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ ์ฝœ๋ฐฑ ๋Œ€์ƒ๋„ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” serial ๋˜๋Š” ๋Œ€๊ธฐ์—ด ์ƒํƒœ WaitTarget๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

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

๋™์ž‘

  • ์ƒํƒœ๋ฅผ ํ•œ ๋ฒˆ ์ฝ์Šต๋‹ˆ๋‹ค. ์ปค์„œ๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฒŒ์ž„ ์ž‘์—… ํ›„ ์„œ๋ฒ„ ์‹ญ์ž์„ ์„ ๊ธฐ๋‹ค๋ฆฌ๋ ค๋ฉด WaitForTarget๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋กœ์ปฌ ClientRequest* - WaitForClientTargetResponse์˜ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ƒํƒœ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋…ผ์Ÿ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • 1 ๋˜๋Š” 0์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
UO.Print(Convert.ToString(UO.TargetPresent()));

2. ์—ด๋ฆฐ ์ปค์„œ ์ทจ์†Œ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์กฐ๊ฑด์€ ํ™œ์„ฑ ์ปค์„œ๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.
  • CancelTarget ์ด ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ์ค€๋น„๋œ ์‘๋‹ต๋„ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.TargetPresent()))
    {
        UO.CancelTarget();
    }

    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. ๊ฒŒ์ž„ ์•ก์…˜ ์š”์ฒญ ํ›„ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • UseSkill๊ฐ€ ์Šคํ‚ฌ์„ ์š”์ฒญํ•˜๊ณ , WaitForTarget๊ฐ€ 3000ms๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
  • TargetToObject๋Š” ํ™œ์„ฑ ์„œ๋ฒ„ ๋Œ€์ƒ์—๋งŒ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ์žˆ์œผ๋ฉด ๋ถ„๊ธฐ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.UseSkill("Anatomy");
        if (Truth(UO.WaitForTarget(3000)))
        {
            if (Truth(UO.TargetPresent()))
            {
                UO.TargetToObject("self");
            }
        }

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "targetpresent": return new InjectionValue(IsTargeting());

UO.TargetToObject

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

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

void UO.TargetToObject(object? objID);

์ด๋ฏธ ํ™œ์„ฑํ™”๋œ ์„œ๋ฒ„ ๋Œ€์ƒ serial ๊ฐœ์ฒด์— ์ฆ‰์‹œ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

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

  • objID โ€” ํ•ญ๋ชฉ ๋˜๋Š” ๋ฌธ์ž์˜ ์ผ๋ จ๋ฒˆํ˜ธ/ID, ์ˆซ์ž ๋˜๋Š” 16์ง„์ˆ˜/10์ง„์ˆ˜ ๋ฌธ์ž์—ด, self/backpack/lasttarget/lastobject ๋˜๋Š” ์ €์žฅ๋œ ์ด๋ฆ„ AddObject. ์ด๊ฒƒ์€ type์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ช…๋ช…๋œ ๊ฐœ์ฒด์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— Exists๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๋ณ„์นญ์€ serial 0์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. true/false, serial ๋˜๋Š” type๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ object? ํ˜ธํ™˜๋˜๋Š” ์–‘์‹์˜ ๊ฒฝ์šฐ ์‹ค์ œ ๊ฒฐ๊ณผ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค void.

๋™์ž‘

  • ํ™œ์„ฑ ์„œ๋ฒ„ ์ปค์„œ๊ฐ€ ์—†์œผ๋ฉด ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ง€์—ฐ๋œ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์ „ ์ค€๋น„๋Š” WaitTargetObject/WaitTargetTile/WaitTargetXYZ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๋กœ์ปฌ ClientRequest* ๋ฐ ๊ธฐํƒ€ ์ฝœ๋ฐฑ ์‚ฌ์ดํŠธ๋Š” ์ด ๋ช…๋ น์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„๋Š” ๋Œ€์ƒ์ด ์œ ํšจํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ serial์˜ ๊ฒฝ์šฐ ID๋Š” ๊ทธ๋ž˜ํ”ฝ/์ขŒํ‘œ ํ•„๋“œ๊ฐ€ 0์ธ ์ƒํƒœ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.TargetToObject");
UO.TargetToObject("self");

1. ์—ด๋ฆฐ ์‹œ์•ผ์— ๋‹ต์žฅ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ฌธ์ž ์ž์ฒด๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ํ–ฅํ›„ ๋ฒ”์œ„ ๋Œ€๊ธฐ์—ด์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ์ถ”๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
if (Truth(UO.TargetPresent()))
{
    UO.TargetToObject("self");
}

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

2. ๋จผ์ € ์‹œ๋ ฅ์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 3000 โ€” ์ตœ๋Œ€ ๋Œ€๊ธฐ ์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ); ์‹œ์•ผ๋ฅผ ์š”์ฒญํ•œ ์ž‘์—…์€ ์ด์ „์— ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์€ ์‹œ์•ผ๊ฐ€ ๋‚˜ํƒ€๋‚œ ํ›„์—๋งŒ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์ž‘์—…์€ ์„œ๋ฒ„ ์˜ค๋ฅ˜๋กœ ๋๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.WaitForTarget(3000)))
    {
        UO.TargetToObject("self");
    }
    else
    {
        UO.Print("Target timeout");
    }

    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. ์ง€์—ฐ๋œ ์‘๋‹ต ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • CancelTarget ๊ธฐ์กด ์‚ฌ์ดํŠธ๋ฅผ ๋‹ซ๊ณ  ๋Œ€๊ธฐ์—ด์„ ์ง€์›๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ๋ฒ”์œ„๊ฐ€ ์—†์œผ๋ฉด ๋„์ „์€ ๊ธฐ๋Œ€๋ฅผ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ํ•œ ๋Œ€๊ธฐ์—ด ์ถœ๋ ฅ์€ 0๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.CancelTarget();
        UO.TargetToObject("self");
        UO.Print("Queued: " + Convert.ToString(UO.IsWaitTargetActive()));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "targettoobject": bridge.TargetToObject(Arg(0)); return InjectionValue.Unit;

UO.TargetToTile

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

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

void UO.TargetToTile(object? tile, object? x, object? y, object? z);

ํƒ€์ผ โ€‹โ€‹์ขŒํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ ํ™œ์„ฑํ™”๋œ ์„œ๋ฒ„ ๋Œ€์ƒ์— ์ฆ‰์‹œ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

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

  • tile - ๊ทธ๋ž˜ํ”ฝ/type ํƒ€์ผ, 0..65535, serial ์•„๋‹˜. 0์€ ์ง€์ •๋œ ๊ทธ๋ž˜ํ”ฝ์ด ์—†๋Š” ์ขŒํ‘œ ๋Œ€์ƒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • x โ€” ํ˜„์žฌ ์ง€๋„์˜ ์„ธ๊ณ„ X ์ขŒํ‘œ 0..65535. ์ด๋Š” ํ™”๋ฉด ํ”ฝ์…€์ด๋‚˜ ๊ฒ€ํ”„ ์ขŒํ‘œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • y โ€” ํ˜„์žฌ ์ง€๋„์˜ ์„ธ๊ณ„ Y ์ขŒํ‘œ 0..65535.
  • z - ๋„คํŠธ์›Œํฌ ๋Œ€์ƒ ์‚ฌ์šฉ์„ ์œ„ํ•œ ๊ฒŒ์ž„ ํฌ์ธํŠธ ๋†’์ด -128..127. ์ด๊ฒƒ์€ ๋ฐ”๋‹ฅ์ด๋‚˜ ์žฅ๋น„์˜ ์ธต์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. true/false, serial ๋˜๋Š” type๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ object? ํ˜ธํ™˜๋˜๋Š” ์–‘์‹์˜ ๊ฒฝ์šฐ ์‹ค์ œ ๊ฒฐ๊ณผ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค void.

๋™์ž‘

  • ํ™œ์„ฑ ์„œ๋ฒ„ ์ปค์„œ๊ฐ€ ์—†์œผ๋ฉด ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ง€์—ฐ๋œ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์ „ ์ค€๋น„๋Š” WaitTargetObject/WaitTargetTile/WaitTargetXYZ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๋กœ์ปฌ ClientRequest* ๋ฐ ๊ธฐํƒ€ ์ฝœ๋ฐฑ ์‚ฌ์ดํŠธ๋Š” ์ด ๋ช…๋ น์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • graphic=0์ธ ๋Œ€์ƒ์—๋Š” ์‹ญ์ž์„ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ์ฒด ์‹œ๋ ฅ์€์ง€๋ฉด์„ ๋ฐ›์•„๋“ค์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.TargetToTile");
UO.TargetToTile(0x0CCA, 1445, 1690, 0);

1. ์—ด๋ฆฐ ์‹œ์•ผ์— ๋‹ต์žฅ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์‹ค์ œ ์ ์˜ ์˜ˆ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ขŒํ‘œ์™€ graphic๋ฅผ ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  • ํ–ฅํ›„ ๋ฒ”์œ„ ๋Œ€๊ธฐ์—ด์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ์ถ”๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
if (Truth(UO.TargetPresent()))
{
    UO.TargetToTile(0x0CCA, 1445, 1690, 0);
}

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

2. ๋จผ์ € ์‹œ๋ ฅ์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 3000 โ€” ์ตœ๋Œ€ ๋Œ€๊ธฐ ์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ); ์‹œ์•ผ๋ฅผ ์š”์ฒญํ•œ ์ž‘์—…์€ ์ด์ „์— ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์€ ์‹œ์•ผ๊ฐ€ ๋‚˜ํƒ€๋‚œ ํ›„์—๋งŒ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์ž‘์—…์€ ์„œ๋ฒ„ ์˜ค๋ฅ˜๋กœ ๋๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.WaitForTarget(3000)))
    {
        UO.TargetToTile(0x0CCA, 1445, 1690, 0);
    }
    else
    {
        UO.Print("Target timeout");
    }

    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. ์ง€์—ฐ๋œ ์‘๋‹ต ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • CancelTarget ๊ธฐ์กด ์‚ฌ์ดํŠธ๋ฅผ ๋‹ซ๊ณ  ๋Œ€๊ธฐ์—ด์„ ์ง€์›๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ๋ฒ”์œ„๊ฐ€ ์—†์œผ๋ฉด ๋„์ „์€ ๊ธฐ๋Œ€๋ฅผ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ํ•œ ๋Œ€๊ธฐ์—ด ์ถœ๋ ฅ์€ 0๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.CancelTarget();
        UO.TargetToTile(0x0CCA, 1445, 1690, 0);
        UO.Print("Queued: " + Convert.ToString(UO.IsWaitTargetActive()));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.TargetToTile(tile, x, y, z) โ€” UO.TargetToTile(Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: tile (Any), x (Any), y (Any), z (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "targettotile":

                    bridge.TargetToTile(Arg(0), Arg(1), Arg(2), Arg(3)); return InjectionValue.Unit;

UO.TargetToXYZ

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

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

void UO.TargetToXYZ(object? x, object? y, object? z);

ํƒ€์ผ โ€‹โ€‹์ขŒํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ ํ™œ์„ฑํ™”๋œ ์„œ๋ฒ„ ๋Œ€์ƒ์— ์ฆ‰์‹œ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

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

  • x โ€” ํ˜„์žฌ ์ง€๋„์˜ ์„ธ๊ณ„ X ์ขŒํ‘œ 0..65535. ์ด๋Š” ํ™”๋ฉด ํ”ฝ์…€์ด๋‚˜ ๊ฒ€ํ”„ ์ขŒํ‘œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • y โ€” ํ˜„์žฌ ์ง€๋„์˜ ์„ธ๊ณ„ Y ์ขŒํ‘œ 0..65535.
  • z - ๋„คํŠธ์›Œํฌ ๋Œ€์ƒ ์‚ฌ์šฉ์„ ์œ„ํ•œ ๊ฒŒ์ž„ ํฌ์ธํŠธ ๋†’์ด -128..127. ์ด๊ฒƒ์€ ๋ฐ”๋‹ฅ์ด๋‚˜ ์žฅ๋น„์˜ ์ธต์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. true/false, serial ๋˜๋Š” type๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ object? ํ˜ธํ™˜๋˜๋Š” ์–‘์‹์˜ ๊ฒฝ์šฐ ์‹ค์ œ ๊ฒฐ๊ณผ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค void.

๋™์ž‘

  • ํ™œ์„ฑ ์„œ๋ฒ„ ์ปค์„œ๊ฐ€ ์—†์œผ๋ฉด ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ง€์—ฐ๋œ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์ „ ์ค€๋น„๋Š” WaitTargetObject/WaitTargetTile/WaitTargetXYZ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๋กœ์ปฌ ClientRequest* ๋ฐ ๊ธฐํƒ€ ์ฝœ๋ฐฑ ์‚ฌ์ดํŠธ๋Š” ์ด ๋ช…๋ น์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • graphic=0์ธ ๋Œ€์ƒ์—๋Š” ์‹ญ์ž์„ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ์ฒด ์‹œ๋ ฅ์€์ง€๋ฉด์„ ๋ฐ›์•„๋“ค์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.TargetToXYZ");
UO.TargetToXYZ(1445, 1690, 0);

1. ์—ด๋ฆฐ ์‹œ์•ผ์— ๋‹ต์žฅ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์‹ค์ œ ์ ์˜ ์˜ˆ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ขŒํ‘œ์™€ graphic๋ฅผ ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  • ํ–ฅํ›„ ๋ฒ”์œ„ ๋Œ€๊ธฐ์—ด์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ์ถ”๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
if (Truth(UO.TargetPresent()))
{
    UO.TargetToXYZ(1445, 1690, 0);
}

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

2. ๋จผ์ € ์‹œ๋ ฅ์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 3000 โ€” ์ตœ๋Œ€ ๋Œ€๊ธฐ ์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ); ์‹œ์•ผ๋ฅผ ์š”์ฒญํ•œ ์ž‘์—…์€ ์ด์ „์— ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์€ ์‹œ์•ผ๊ฐ€ ๋‚˜ํƒ€๋‚œ ํ›„์—๋งŒ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์ž‘์—…์€ ์„œ๋ฒ„ ์˜ค๋ฅ˜๋กœ ๋๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.WaitForTarget(3000)))
    {
        UO.TargetToXYZ(1445, 1690, 0);
    }
    else
    {
        UO.Print("Target timeout");
    }

    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. ์ง€์—ฐ๋œ ์‘๋‹ต ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • CancelTarget ๊ธฐ์กด ์‚ฌ์ดํŠธ๋ฅผ ๋‹ซ๊ณ  ๋Œ€๊ธฐ์—ด์„ ์ง€์›๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ๋ฒ”์œ„๊ฐ€ ์—†์œผ๋ฉด ๋„์ „์€ ๊ธฐ๋Œ€๋ฅผ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ํ•œ ๋Œ€๊ธฐ์—ด ์ถœ๋ ฅ์€ 0๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.CancelTarget();
        UO.TargetToXYZ(1445, 1690, 0);
        UO.Print("Queued: " + Convert.ToString(UO.IsWaitTargetActive()));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.TargetToXYZ(x, y, z) โ€” UO.TargetToXYZ(Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: x (Any), y (Any), z (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "targettoxyz":

                    bridge.TargetToTile(0, Arg(0), Arg(1), Arg(2)); return InjectionValue.Unit;

UO.Targeting

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

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

int UO.Targeting();

ํด๋ผ์ด์–ธํŠธ์—์„œ ํ™œ์„ฑ ๋Œ€์ƒ ์„ ํƒ ์ปค์„œ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int 1 - TargetManager.IsTargeting ์„ค์น˜; 0 - ํ™œ์„ฑ ์ปค์„œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ ์ฝœ๋ฐฑ ๋Œ€์ƒ๋„ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” serial ๋˜๋Š” ๋Œ€๊ธฐ์—ด ์ƒํƒœ WaitTarget๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

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

๋™์ž‘

  • ์ƒํƒœ๋ฅผ ํ•œ ๋ฒˆ ์ฝ์Šต๋‹ˆ๋‹ค. ์ปค์„œ๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฒŒ์ž„ ์ž‘์—… ํ›„ ์„œ๋ฒ„ ์‹ญ์ž์„ ์„ ๊ธฐ๋‹ค๋ฆฌ๋ ค๋ฉด WaitForTarget๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋กœ์ปฌ ClientRequest* - WaitForClientTargetResponse์˜ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ƒํƒœ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋…ผ์Ÿ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • 1 ๋˜๋Š” 0์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
UO.Print(Convert.ToString(UO.Targeting()));

2. ์—ด๋ฆฐ ์ปค์„œ ์ทจ์†Œ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์กฐ๊ฑด์€ ํ™œ์„ฑ ์ปค์„œ๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.
  • CancelTarget ์ด ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ์ค€๋น„๋œ ์‘๋‹ต๋„ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Targeting()))
    {
        UO.CancelTarget();
    }

    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. ๊ฒŒ์ž„ ์•ก์…˜ ์š”์ฒญ ํ›„ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • UseSkill๊ฐ€ ์Šคํ‚ฌ์„ ์š”์ฒญํ•˜๊ณ , WaitForTarget๊ฐ€ 3000ms๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
  • TargetToObject๋Š” ํ™œ์„ฑ ์„œ๋ฒ„ ๋Œ€์ƒ์—๋งŒ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ์žˆ์œผ๋ฉด ๋ถ„๊ธฐ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.UseSkill("Anatomy");
        if (Truth(UO.WaitForTarget(3000)))
        {
            if (Truth(UO.Targeting()))
            {
                UO.TargetToObject("self");
            }
        }

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

UO.TicksTarget

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

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

int UO.TicksTarget();

WaitTargetObject/WaitTargetTile ๋ฐ ํ•ด๋‹น ํ˜ธ์ถœ ์…ธ์„ ํ†ตํ•ด ๋Œ€์ƒ์˜ ๋งˆ์ง€๋ง‰ ํ”„๋กœ๋น„์ €๋‹ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int โ€” ์ค€๋น„ ์‹œ์ ์˜ UO.Timer ๊ฐ’(๋Ÿฐํƒ€์ž„ ์‹œ์ž‘๋ถ€ํ„ฐ 10๋ถ„์˜ 1์ดˆ ๋‹จ์œ„). ์ฒซ ๋ฒˆ์งธ ํ›ˆ๋ จ ์ „ - 0. ์ด๋Š” ๋Œ€๊ธฐ ์‹œ๊ฐ„๋„ ์•„๋‹ˆ๊ณ  ๋ฐ€๋ฆฌ์ดˆ๋„ ์•„๋‹ˆ๊ณ  ID ๋ชฉํ‘œ๋„ ์•„๋‹Œ ํ‘œ์‹œ์ž…๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ฆ‰์‹œ TargetToObject/TargetToTile/TargetToXYZ ๋Œ€๊ธฐ์—ด์„ ์ค€๋น„ํ•˜์ง€ ์•Š๊ณ  ์ด ํ‘œ์‹œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ถ€ ๊ฒ€์ƒ‰ ๋ช…๋ น์€ ๋ธŒ๋ฆฌ์ง€๋ฅผ ํ†ตํ•ด ์ง์ ‘ ๋‹ต๋ณ€์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. TicksTarget๋Š” ๋ชฉํ‘œ ๋ณ€๊ฒฝ์˜ ํ‘œ์ค€์‹œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ค€๋น„์˜ ์ˆœ๊ฐ„์„ ๊ธฐ์–ตํ•˜๋‹ค - ์ง์ ‘ ๋Œ€๋ณธ

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

  • ๋…ผ์Ÿ์ด ์—†์Šต๋‹ˆ๋‹ค. WaitTargetSelf ๊ณ ๋„๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
  • ์Šคํƒฌํ”„๋Š” 10๋ถ„์˜ 1์ดˆ ๋‹จ์œ„๋กœ ์ธก์ •๋ฉ๋‹ˆ๋‹ค.
UO.WaitTargetSelf();
var stamp = UO.TicksTarget();
UO.Print(Convert.ToString(stamp));
UO.CancelWaitTarget();

2. ๊ฒฝ๊ณผ ์‹œ๊ฐ„ ๊ณ„์‚ฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • UO.Wait=250 ๋ฐ€๋ฆฌ์ดˆ.
  • ํ‘œ์‹œ์˜ ๋ถˆ์—ฐ์†์„ฑ์œผ๋กœ ์ธํ•ด ๊ฒฝ๊ณผ ์‹œ๊ฐ„์€ ์ผ๋ฐ˜์ ์œผ๋กœ 250๊ฐ€ ์•„๋‹Œ 2 ๋˜๋Š” 3์ž…๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    UO.WaitTargetObject("self");
    await Delay(250);
    var elapsed = UO.Timer() - UO.TicksTarget();
    UO.Print("Tenths: " + Convert.ToString(elapsed));
    UO.CancelWaitTarget();
    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));

3. ์ˆซ์ž serial - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค์— ๋Œ€ํ•ด ๋™์ผํ•œ ์‹œ๊ฐ„ ๋ณด์žฅ

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

  • ์บ๋ฆญํ„ฐ์˜ selfId - int serial.
  • ์ˆซ์ž ํ˜•์‹์€ ๋ฌธ์ž์—ด ํ˜•์‹๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ‘œ์‹œ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. TicksTarget์—๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
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 selfId = UO.Hex2Int(UO.GetSerial("self"));
        UO.WaitTargetObject(selfId);
        UO.Print(Convert.ToString(UO.TicksTarget()));
        UO.CancelWaitTarget();
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.TicksTarget() โ€” UO.TicksTarget()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int TicksTarget() => ticksTarget;

UO.WaitForClientTargetResponse

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

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

dynamic UO.WaitForClientTargetResponse(object? maxWaitTimeMS);

๋กœ์ปฌ ์„ ํƒ ClientRequestObjectTarget/ClientRequestTileTarget์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

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

  • maxWaitTimeMS โ€” ์ตœ๋Œ€ ์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ). 0 ๋ฐ ์Œ์ˆ˜ ๊ฐ’์€ ๋ฌดํ•œ์ • ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ํ•œ ๋ฒˆ์˜ ํ™•์ธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int 1 - ์ทจ์†Œ๋ฅผ ํฌํ•จํ•˜์—ฌ ์‘๋‹ต์ด ์ด๋ฏธ ์ˆ˜์‹ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 0 - ์ œํ•œ ์‹œ๊ฐ„์ด ๋งŒ๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 1์˜ ๊ฒฝ์šฐ์—๋„ ClientTargetResponse์˜ ๊ธธ์ด๋ฅผ ํ™•์ธํ•˜์„ธ์š”. 0๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปค์„œ ์ž์ฒด๊ฐ€ ์ž๋™์œผ๋กœ ๋‹ซํžˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๋™์ž‘

  • ๋Œ€๊ธฐ๋Š” ์ตœ๋Œ€ 25 ms ๊ฐ„๊ฒฉ์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ ์Šค๋ ˆ๋“œ์—์„œ ๋ฐœ์ƒํ•˜๋ฉฐ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ค‘์ง€ํ•˜๋ฉด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.
  • ์ด์ „ ClientRequest*์ด ์—†์œผ๋ฉด ์ƒˆ ์„ ํƒ์ด ์‹œ์ž‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์•„์ดํ…œ์ด๋‚˜ ์บ๋ฆญํ„ฐ ์„ ํƒ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • 5000 โ€” ํด๋ฆญ ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ(๋ฐ€๋ฆฌ์ดˆ). ์ƒˆ ์ฟผ๋ฆฌ๋Š” ์ด์ „ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • 5๊ฐœ ํ•„๋“œ์˜ ๋ฐฐ์—ด์€ ์„ ํƒํ•œ ๊ฐœ์ฒด๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ[0]๋Š” type๊ฐ€ ์•„๋‹ˆ๋ผ serial์ž…๋‹ˆ๋‹ค.
UO.ClientRequestObjectTarget();
if (Truth(UO.WaitForClientTargetResponse(5000)))
{
    var result = UO.ClientTargetResponse();
    if (Truth(ArrayLength(result) == 5))
    {
        UO.Print("Serial: " + UO.Int2Hex(result[0]));
    }
    else
    {
        UO.Print("Selection cancelled");
    }
}

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. ์„ ํƒํ•œ ํƒ€์ผ์˜ ์ขŒํ‘œ ์ฝ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๊ฒฐ๊ณผ[1] - graphic, ๊ฒฐ๊ณผ[2]/[3]/[4] - X/Y/Z. ์„ธ๊ณ„ ํƒ€์ผ serial์˜ ๊ฒฐ๊ณผ[0]๋Š” 0์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ์œ ํ˜•, ์ขŒํ‘œ ๋ฐ serial๋Š” ๋ณ„๋„์˜ ํ•„๋“œ์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฐ์—ด์—๋Š” ์ •์  ๋ ˆ์ด์–ด ์ธ๋ฑ์Šค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.ClientRequestTileTarget();
    if (Truth(UO.WaitForClientTargetResponse(5000)))
    {
        var result = UO.ClientTargetResponse();
        if (Truth(ArrayLength(result) == 5))
        {
            UO.Print("Type: " + UO.Int2Hex(result[1]));
            UO.Print(Convert.ToString(result[2]) + "," + Convert.ToString(result[3]) + "," + Convert.ToString(result[4]));
        }
    }

    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. ์ „์ฒด ์‘๋‹ต ๊ตฌ์กฐ์—์„œ ๋ณ„๋„์˜ ์‹œ๊ฐ„ ์ดˆ๊ณผ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์‹œ๊ฐ„ ์ดˆ๊ณผ๋Š” ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ์„ฑ๊ณต์ ์ธ ๋Œ€๊ธฐ๋Š” ์‘๋‹ต์„ ์˜๋ฏธํ•˜๋ฉฐ, ๊ทธ ๋‚ด์šฉ์„ ๋ณ„๋„๋กœ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.ClientRequestTileTarget();
        int ready = UO.WaitForClientTargetResponse(3000);
        if (ready == 0)
        {
            UO.CancelTarget();
            UO.Print("Selection timed out");
            return false;
        }

        var response = (object? [])UO.ClientTargetResponse();
        if (response.Length != 5)
            return false;
        UO.Print($"Tile coordinates: {response[2]}, {response[3]}, {response[4]}");
        return true;
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.WaitForClientTargetResponse(maxWaitTimeMS) โ€” UO.WaitForClientTargetResponse(Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "waitforclienttargetresponse": return new InjectionValue(bridge.WaitForClientTargetResponse(Arg(0)));

UO.WaitForTarget

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

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

dynamic UO.WaitForTarget(object? maxWaitTimeMS);

์ œํ•œ ์‹œ๊ฐ„ ๋‚ด์— ํ™œ์„ฑ ๋Œ€์ƒ ์ปค์„œ๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

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

  • maxWaitTimeMS โ€” ์ตœ๋Œ€ ๋Œ€๊ธฐ ์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ)์ž…๋‹ˆ๋‹ค. 0๊ณผ ์Œ์ˆ˜ ๊ฐ’์€ ์ฆ‰์‹œ ํ™•์ธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋์—†๋Š” ๊ธฐ๋‹ค๋ฆผ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int 1 โ€” ํ™•์ธ ์ค‘์— ์ปค์„œ๊ฐ€ ํ™œ์„ฑํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 0 - ์ปค์„œ ์—†์ด ์‹œ๊ฐ„ ์ดˆ๊ณผ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ ์ฝœ๋ฐฑ ๋Œ€์ƒ๋„ ์ด ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ค€๋น„๋œ WaitTarget ์‚ฌ์šฉ์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ™•์ธํ•˜๊ธฐ ์ „์— ์ž๋™ ์‘๋‹ต์ด ์ด๋ฏธ ์ปค์„œ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ–ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋™์ž‘

  • ๊ฒ€์‚ฌ๋Š” ์Šคํฌ๋ฆฝํŠธ ์Šค๋ ˆ๋“œ์—์„œ ์ตœ๋Œ€ 25 ms ๋™์•ˆ ์ผ์‹œ ์ค‘์ง€ํ•˜์—ฌ ์ˆ˜ํ–‰๋˜๋ฉฐ ์ด๋ฅผ ์ค‘์ง€ํ•˜๋ฉด ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฉ”์„œ๋“œ ์ž์ฒด๋Š” ์‹ญ์ž์„ ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋Œ€์ƒ์„ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์Šคํ‚ฌ์‹œ๋ ฅ์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค - ๋‹ค์ด๋ ‰ํŠธ ์Šคํฌ๋ฆฝํŠธ

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

  • MaxWaitTimeMS=3000์ด๋ฉด self๊ฐ€ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.
  • WaitTargetSelf๋Š” ๋ฏธ๋ฆฌ ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.
UO.UseSkill("Anatomy");
if (Truth(UO.WaitForTarget(3000)))
{
    UO.TargetToObject("self");
}

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

2. ์›์ฒดํฌ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • MaxWaitTimeMS=0.
  • ์ค€๋น„ - 1 ๋˜๋Š” 0; ๊ธด ๋ฉˆ์ถค์ด ์—†์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var ready = UO.WaitForTarget(0);
    UO.Print(Convert.ToString(ready));
    return null;
}

3. ์‹œ๊ฐ„ ์ดˆ๊ณผ ์ฒ˜๋ฆฌ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • 500 - 0.5์ดˆ.
  • ์‹œ๋ ฅ์ด ์—†๋‹ค๋Š” ๊ฒƒ์€ ์ž‘์—…์ด ์‹คํŒจํ–ˆ๊ฑฐ๋‚˜ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ณ  ์žˆ์Œ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
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.WaitForTarget(500) == 0))
        {
            UO.CancelWaitTarget();
            UO.Print("Cursor did not arrive");
        }

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "waitfortarget": return new InjectionValue(bridge.WaitUntilTargeting(Arg(0)));

UO.WaitTarget

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

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

void UO.WaitTarget(object? target);
void UO.WaitTarget(object? target, object? @type);
void UO.WaitTarget(object? target, object? @type, object? color);
void UO.WaitTarget(object? target, object? @type, object? color, object? distance);
void UO.WaitTarget(object? target, object? @type, object? color, object? distance, object? notoriety);
void UO.WaitTarget(object? target, object? @type, object? color, object? distance, object? notoriety, object? nearest);
void UO.WaitTarget(object? target, object? @type, object? color, object? distance, object? notoriety, object? nearest, object? maxZ);

serial๋ฅผ ๋‹ค์Œ ๋Œ€์ƒ ์š”์ฒญ ๋Œ€๊ธฐ์—ด์— ๋„ฃ๊ฑฐ๋‚˜ ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€์ƒ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

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

  • target โ€” ์–‘์ˆ˜ ํ—ˆ์šฉ serial/alias๊ฐ€ ์ง์ ‘ ์„ค์ •๋˜๊ณ  ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. 0 ๋˜๋Š” -1๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ˆซ์ž ํŒŒ์ˆ˜๊พผ์ด ๋‹ค์Œ ๋ชฉํ‘œ๋ฅผ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค.
  • type - ์„ ํƒ ์‚ฌํ•ญ graphic/type ๋˜๋Š” ์œ ํ˜• ๋งˆ์Šคํฌ; -1 ์ œํ•œ ์—†์Œ. ๋ช…๋ช…๋œ ์œ ํ˜•์€ ResolveType/ParseTypeMask๋กœ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
  • color - ์„ ํƒ ์‚ฌํ•ญ hue: -1 ๋˜๋Š” 0xFFFF(์ œํ•œ ์—†์Œ).
  • distance โ€” ์„ ํƒ์ ์œผ๋กœ ์…€ ๋‚ด ์ตœ๋Œ€ ๊ฑฐ๋ฆฌ. ๊ธฐ๋ณธ๊ฐ’์€ GetFindDistance์ž…๋‹ˆ๋‹ค. ResolveCompactDistance๋ฅผ ํŒŒ์‹ฑํ•˜๋ฉด ๊ฒ€์ƒ‰ ์„ค์ •์— ๋”ฐ๋ผ ํŠน๋ณ„ํ•œ ๊ฐ’์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • notoriety - ์„ ํƒ์  ์ˆซ์ž/๋งˆ์Šคํฌ ์•…๋ช…. ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๋งˆ์Šคํฌ๋Š” ๋ชจ๋ฐ”์ผ ํ›„๋ณด์ž๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์—†์œผ๋ฉด ํœด๋Œ€ํฐ๊ณผ world ํ•ญ๋ชฉ์ด ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค.
  • nearest - ์„ ํƒ ์‚ฌํ•ญ bool, ๊ธฐ๋ณธ๊ฐ’ true: ๊ฑฐ๋ฆฌ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ ๋‹ค์Œ serial๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.
  • maxZ โ€” ์˜ต์…˜ ์ตœ๋Œ€ ์ ˆ๋Œ€๊ฐ’(Z-selfZ), ๊ธฐ๋ณธ๊ฐ’ GetFindVertical.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ๊ฒ€์ƒ‰ ์‹œ self, serial=0, ์ผ๋ฐ˜ ๋ฌด์‹œ ๋ชฉ๋ก ๋ฐ ์„ ํƒ๋œ ๋ช…๋ช…๋œ type ํ•„ํ„ฐ๋ฅผ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ์ค‘๋ณต์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ์ง์ ‘ ์–‘์„ฑ serial์€ ์ด๋Ÿฌํ•œ ํ•„ํ„ฐ๋ฅผ ํ†ต๊ณผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฒ€์ƒ‰์—์„œ๋Š” ๋กœ๋“œ๋œ ๊ฐœ์ฒด๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜์ง€ ์•Š์Œ/์ž˜๋ชป๋œ ์„ผํ‹ฐ๋„ - ๋ฉ”์‹œ์ง€ ๋ฐ CancelNextTarget. ์„ฑ๊ณต์ ์ธ ์„ ํƒ์€ WaitTargetObject์„ ํ˜ธ์ถœํ•˜๊ณ  TicksTarget๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. WaitTarget ์ž์ฒด๋Š” ์•„์ดํ…œ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๋Œ€์ƒ์„ ์—ด์ง€ ์•Š์œผ๋ฉฐ, ์„œ๋ฒ„๊ฐ€ ์ฒ˜๋ฆฌํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.WaitTarget");
UO.WaitTarget("self");

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

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

  • serial๋ฅผ ๋‹ค์Œ ๋Œ€์ƒ ์š”์ฒญ ๋Œ€๊ธฐ์—ด์— ๋„ฃ๊ฑฐ๋‚˜ ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€์ƒ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
UO.WaitTarget("self");

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

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

  • ๊ฒ€์ƒ‰ ์‹œ self, serial=0, ์ผ๋ฐ˜ ๋ฌด์‹œ ๋ชฉ๋ก ๋ฐ ์„ ํƒ๋œ ๋ช…๋ช…๋œ type ํ•„ํ„ฐ๋ฅผ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ์ค‘๋ณต์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ์ง์ ‘ ์–‘์„ฑ serial์€ ์ด๋Ÿฌํ•œ ํ•„ํ„ฐ๋ฅผ ํ†ต๊ณผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.WaitTarget(0, -1, -1, 10, 3, true, 20);
    return null;
}

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

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

  • ๊ฒ€์ƒ‰์—์„œ๋Š” ๋กœ๋“œ๋œ ๊ฐœ์ฒด๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜์ง€ ์•Š์Œ/์ž˜๋ชป๋œ ์„ผํ‹ฐ๋„ - ๋ฉ”์‹œ์ง€ ๋ฐ CancelNextTarget. ์„ฑ๊ณต์ ์ธ ์„ ํƒ์€ WaitTargetObject์„ ํ˜ธ์ถœํ•˜๊ณ  TicksTarget๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. WaitTarget ์ž์ฒด๋Š” ์•„์ดํ…œ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๋Œ€์ƒ์„ ์—ด์ง€ ์•Š์œผ๋ฉฐ, ์„œ๋ฒ„๊ฐ€ ์ฒ˜๋ฆฌํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.WaitTarget("lasttarget");
        UO.Print(UO.Waiting());
        UO.CancelWaitTarget();
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.WaitTarget(target) โ€” UO.WaitTarget(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

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

values =>

                    {

                        CompactWaitTarget(values);

                        return InjectionValue.Unit;

                    }

UO.WaitTarget(target, type) โ€” UO.WaitTarget(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

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

values =>

                    {

                        CompactWaitTarget(values);

                        return InjectionValue.Unit;

                    }

UO.WaitTarget(target, type, color) โ€” UO.WaitTarget(Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: target (Any), type (Any), color (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

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

values =>

                    {

                        CompactWaitTarget(values);

                        return InjectionValue.Unit;

                    }

UO.WaitTarget(target, type, color, distance) โ€” UO.WaitTarget(Any,Any,Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

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

values =>

                    {

                        CompactWaitTarget(values);

                        return InjectionValue.Unit;

                    }

UO.WaitTarget(target, type, color, distance, notoriety) โ€” UO.WaitTarget(Any,Any,Any,Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

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

values =>

                    {

                        CompactWaitTarget(values);

                        return InjectionValue.Unit;

                    }

UO.WaitTarget(target, type, color, distance, notoriety, nearest) โ€” UO.WaitTarget(Any,Any,Any,Any,Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

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

values =>

                    {

                        CompactWaitTarget(values);

                        return InjectionValue.Unit;

                    }

UO.WaitTarget(target, type, color, distance, notoriety, nearest, maxZ) โ€” UO.WaitTarget(Any,Any,Any,Any,Any,Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

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

values =>

                    {

                        CompactWaitTarget(values);

                        return InjectionValue.Unit;

                    }

UO.WaitTargetGround

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

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

void UO.WaitTargetGround(object? @type);
void UO.WaitTargetGround(object? @type, object? color);

graphic/hue์—์„œ ํ•ญ๋ชฉ์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๋‹ค์Œ ๋Œ€์ƒ์˜ ๋Œ€๊ธฐ์—ด์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

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

  • type - ๊ทธ๋ž˜ํ”ฝ/type int, 16์ง„์ˆ˜ ๋ฌธ์ž์—ด ๋˜๋Š” ์ด๋ฆ„์ด type์ธ ์„ธํŠธ. serial ์•„์ดํ…œ์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • color - ์„ ํƒ์‚ฌํ•ญ int hue; ๊ธฐ๋ณธ๊ฐ’ -1 - ๋ชจ๋“  ์ƒ‰์ƒ.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ๋ฒ”์œ„: ์žฌ๊ท€ ๊ฒ€์ƒ‰์ด ์—†๋Š” ground/์ปจํ…Œ์ด๋„ˆ ์„ ํƒ๊ธฐ 1. Bridge.FindType๋Š” ์ฐพ์€ serial๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. serial>0 ๋ธŒ๋ฆฌ์ง€.WaitTargetObject์ด ํ˜ธ์ถœ๋  ๋•Œ. ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋Š” ๋Ÿฐํƒ€์ž„ TicksTarget๋ฅผ ์ง์ ‘ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ•ญ๋ชฉ ์—†์Œ - ๋ฉ”์‹œ์ง€ ๋ฐ CancelNextTarget. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ผ๋ฐ˜ FindItem/FoundItems๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๋ฐœ๊ฒฌ๋œ ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ปค์„œ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.WaitTargetGround");
UO.WaitTargetGround("0x0E21");

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

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

  • graphic/hue์—์„œ ํ•ญ๋ชฉ์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๋‹ค์Œ ๋Œ€์ƒ์˜ ๋Œ€๊ธฐ์—ด์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.
UO.WaitTargetGround("0x0E21");

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

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

  • ๋ฒ”์œ„: ์žฌ๊ท€ ๊ฒ€์ƒ‰์ด ์—†๋Š” ground/์ปจํ…Œ์ด๋„ˆ ์„ ํƒ๊ธฐ 1. Bridge.FindType๋Š” ์ฐพ์€ serial๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. serial>0 ๋ธŒ๋ฆฌ์ง€.WaitTargetObject์ด ํ˜ธ์ถœ๋  ๋•Œ. ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋Š” ๋Ÿฐํƒ€์ž„ TicksTarget๋ฅผ ์ง์ ‘ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.WaitTargetGround("0x0E21", -1);
    return null;
}

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

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

  • ํ•ญ๋ชฉ ์—†์Œ - ๋ฉ”์‹œ์ง€ ๋ฐ CancelNextTarget. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ผ๋ฐ˜ FindItem/FoundItems๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๋ฐœ๊ฒฌ๋œ ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ปค์„œ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.WaitTargetGround("0x0E21", -1);
        UO.Print(UO.Waiting());
        UO.CancelWaitTarget();
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.WaitTargetGround(type) โ€” UO.WaitTargetGround(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void WaitTargetGround(InjectionValue type) => WaitTargetGround(type, new InjectionValue(-1));

UO.WaitTargetGround(type, color) โ€” UO.WaitTargetGround(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void WaitTargetGround(InjectionValue type, InjectionValue color)

        {

            int item = bridge.FindType(ResolveType(type), NumberConversions.ToInt(color), 1, -1, false);

            if (item <= 0)

            {

                SystemMessage("No ground item found. Next target request will be canceled");

                bridge.CancelNextTarget();

            }

            else

                bridge.WaitTargetObject(item);

        }

UO.WaitTargetLast

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

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

void UO.WaitTargetLast();

๋ณ„์นญ lasttarget๋ฅผ ํ†ตํ•ด ๋‹ค์Œ ์„œ๋ฒ„ ๋Œ€์ƒ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. true/false, serial ๋˜๋Š” type๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ object? ํ˜ธํ™˜๋˜๋Š” ์–‘์‹์˜ ๊ฒฝ์šฐ ์‹ค์ œ ๊ฒฐ๊ณผ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค void.

๋™์ž‘

  • ํŒ€์€ ๋Œ€์‘๋งŒ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค. ์•„์ดํ…œ, ์Šคํ‚ฌ, ์ฃผ๋ฌธ ์ž์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์„œ๋ฒ„ ๋Œ€์ƒ์€ ํด๋ผ์ด์–ธํŠธ ํ”„๋ ˆ์ž„์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ค€๋น„๋œ ๋Œ€์ƒ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ์—ฐ์† ํ˜ธ์ถœ์€ ๊ณตํ†ต ํด๋ผ์ด์–ธํŠธ ๋Œ€๊ธฐ์—ด์„ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด์™€ ์ขŒํ‘œ ๋Œ€์ƒ์€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ์„ ํƒ ์ฐฝ ClientRequest*/Info/container๋Š” ์ด๋ฅผ ์†Œ๋น„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • CancelWaitTarget ๋Œ€๊ธฐ์—ด์„ ์ง€์›๋‹ˆ๋‹ค. TerminateAll ์ „์ฒด๋ฅผ ์ฒญ์†Œํ•ฉ๋‹ˆ๋‹ค. ์•„์ง ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์‹œ์ €๋ฅผ ์ค‘์ง€ํ•˜๋ฉด ์ž์ฒด ๋ณด๋ฅ˜ ์ค‘์ธ ์‘๋‹ต๋„ ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค. ์งง์€ ์ ˆ์ฐจ๋ฅผ ์™„๋ฃŒํ•ด๋„ ์ผ๋ฐ˜์ ์œผ๋กœ ์ค€๋น„๋œ ๋Œ€์ƒ์ด ์ทจ์†Œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์‘๋‹ต์„ ๋ณด๋‚ด๋„ ์„œ๋ฒ„์—์„œ์˜ ์ž‘์—…์ด ๋ณด์žฅ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์‘๋‹ต์€ ๋ฒ”์œ„, ๊ฐœ์ฒด์˜ ์ ‘๊ทผ์„ฑ, ๊ฐ€์‹œ์„ฑ ๋ฐ ์ž‘์—… ๊ทœ์น™์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ œ์–ดํ•˜๋ ค๋ฉด ๊ฒŒ์ž„ ๊ฒฐ๊ณผ์™€ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

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

1. ๋Œ€์ƒ ์ค€๋น„ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋…ผ์Ÿ์ด ์—†์Šต๋‹ˆ๋‹ค. lasttarget๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์€ ์‹œ๋ ฅ์„ ์—ด์ง€ ์•Š๊ณ  ์ž‘์—… ์ž์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
UO.WaitTargetLast();

2. ์„ ํƒํ•œ ๊ฐœ์ฒด์˜ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ด ์Šคํ‚ฌ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋กœ๋“œ๋œ ์บ๋ฆญํ„ฐ์—์„œ lasttarget๊ฐ€ ํ—ˆ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Exists ๊ฒ€์‚ฌ๋Š” ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ฒด ์œ ํ˜• ๋ฐ ๊ธฐ์ˆ  ์œ ํšจ์„ฑ์˜ ์„ ํƒ์€ ์Šคํฌ๋ฆฝํŠธ ์กฐ๊ฑด์œผ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("lasttarget")))
    {
        UO.CancelWaitTarget();
        UO.WaitTargetLast();
        UO.UseSkill("Anatomy");
    }

    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. ์ค€๋น„๋œ ๋Œ€์ƒ ์ทจ์†Œ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • IsWaitTargetActive๋Š” ์‘๋‹ต ํ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • CancelWaitTarget ์ด๋ฏธ ์—ด๋ ค ์žˆ๋Š” ๋งž์ถค ์‹ญ์ž์„ ์„ ๋‹ซ์ง€ ์•Š๊ณ  ์ค€๋น„๋ฅผ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.WaitTargetLast();
        if (Truth(UO.IsWaitTargetActive()))
        {
            UO.CancelWaitTarget();
        }

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void WaitTargetLast() => WaitTargetObject("lasttarget");

UO.WaitTargetObject

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

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

void UO.WaitTargetObject(object? objID);
void UO.WaitTargetObject(object? id1, object? id2);

์„œ๋ฒ„ ์‹œ์•ผ์— ๋Œ€ํ•ด ํ•˜๋‚˜ ๋˜๋Š” ๋‘ ๊ฐœ์˜ ์—ฐ์† serial ์‘๋‹ต์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.

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

  • objID / id1 / id2 โ€” ํ•ญ๋ชฉ ๋˜๋Š” ๋ฌธ์ž์˜ ์ผ๋ จ๋ฒˆํ˜ธ/ID, ์ˆซ์ž ๋˜๋Š” 16์ง„์ˆ˜/10์ง„์ˆ˜ ๋ฌธ์ž์—ด, self/backpack/lasttarget/lastobject ๋˜๋Š” ์ €์žฅ๋œ ์ด๋ฆ„ AddObject. ์ด๊ฒƒ์€ type์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ช…๋ช…๋œ ๊ฐœ์ฒด์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— Exists๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๋ณ„์นญ์€ serial 0์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ์ธ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ๋ชฉํ‘œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž ๋ฐ ๋ฌธ์ž์—ด ํ˜•์‹์€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ TicksTarget๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
  • objID โ€” ํ•ญ๋ชฉ ๋˜๋Š” ๋ฌธ์ž์˜ ์ผ๋ จ๋ฒˆํ˜ธ/ID, ์ˆซ์ž ๋˜๋Š” 16์ง„์ˆ˜/10์ง„์ˆ˜ ๋ฌธ์ž์—ด, self/backpack/lasttarget/lastobject ๋˜๋Š” ์ €์žฅ๋œ ์ด๋ฆ„ AddObject. ์ด๊ฒƒ์€ type์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ช…๋ช…๋œ ๊ฐœ์ฒด์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— Exists๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๋ณ„์นญ์€ serial 0์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ์ธ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ๋ชฉํ‘œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž ๋ฐ ๋ฌธ์ž์—ด ํ˜•์‹์€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ TicksTarget๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
  • id1 โ€” ํ•ญ๋ชฉ ๋˜๋Š” ๋ฌธ์ž์˜ ์ผ๋ จ๋ฒˆํ˜ธ/ID, ์ˆซ์ž ๋˜๋Š” 16์ง„์ˆ˜/10์ง„์ˆ˜ ๋ฌธ์ž์—ด, self/backpack/lasttarget/lastobject ๋˜๋Š” ์ €์žฅ๋œ ์ด๋ฆ„ AddObject. ์ด๊ฒƒ์€ type์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ช…๋ช…๋œ ๊ฐœ์ฒด์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— Exists๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๋ณ„์นญ์€ serial 0์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์–‘์‹์˜ ์ฒซ ๋ฒˆ์งธ ๋ชฉํ‘œ๋Š” ๋‘ ์ค„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • id2 โ€” ํ•ญ๋ชฉ ๋˜๋Š” ๋ฌธ์ž์˜ ์ผ๋ จ๋ฒˆํ˜ธ/ID, ์ˆซ์ž ๋˜๋Š” 16์ง„์ˆ˜/10์ง„์ˆ˜ ๋ฌธ์ž์—ด, self/backpack/lasttarget/lastobject ๋˜๋Š” ์ €์žฅ๋œ ์ด๋ฆ„ AddObject. ์ด๊ฒƒ์€ type์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ช…๋ช…๋œ ๊ฐœ์ฒด์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— Exists๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๋ณ„์นญ์€ serial 0์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์–‘์‹์˜ ๋‘ ๋ฒˆ์งธ ๋ชฉ์ ์€ ๋‘ ์ค„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ฐœ๋ณ„ ๋ฒ”์œ„์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. true/false, serial ๋˜๋Š” type๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ object? ํ˜ธํ™˜๋˜๋Š” ์–‘์‹์˜ ๊ฒฝ์šฐ ์‹ค์ œ ๊ฒฐ๊ณผ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค void.

๋™์ž‘

  • ํŒ€์€ ๋Œ€์‘๋งŒ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค. ์•„์ดํ…œ, ์Šคํ‚ฌ, ์ฃผ๋ฌธ ์ž์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์„œ๋ฒ„ ๋Œ€์ƒ์€ ํด๋ผ์ด์–ธํŠธ ํ”„๋ ˆ์ž„์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ค€๋น„๋œ ๋Œ€์ƒ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ์—ฐ์† ํ˜ธ์ถœ์€ ๊ณตํ†ต ํด๋ผ์ด์–ธํŠธ ๋Œ€๊ธฐ์—ด์„ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด์™€ ์ขŒํ‘œ ๋Œ€์ƒ์€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ์„ ํƒ ์ฐฝ ClientRequest*/Info/container๋Š” ์ด๋ฅผ ์†Œ๋น„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • CancelWaitTarget ๋Œ€๊ธฐ์—ด์„ ์ง€์›๋‹ˆ๋‹ค. TerminateAll ์ „์ฒด๋ฅผ ์ฒญ์†Œํ•ฉ๋‹ˆ๋‹ค. ์•„์ง ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์‹œ์ €๋ฅผ ์ค‘์ง€ํ•˜๋ฉด ์ž์ฒด ๋ณด๋ฅ˜ ์ค‘์ธ ์‘๋‹ต๋„ ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค. ์งง์€ ์ ˆ์ฐจ๋ฅผ ์™„๋ฃŒํ•ด๋„ ์ผ๋ฐ˜์ ์œผ๋กœ ์ค€๋น„๋œ ๋Œ€์ƒ์ด ์ทจ์†Œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์‘๋‹ต์„ ๋ณด๋‚ด๋„ ์„œ๋ฒ„์—์„œ์˜ ์ž‘์—…์ด ๋ณด์žฅ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์‘๋‹ต์€ ๋ฒ”์œ„, ๊ฐœ์ฒด์˜ ์ ‘๊ทผ์„ฑ, ๊ฐ€์‹œ์„ฑ ๋ฐ ์ž‘์—… ๊ทœ์น™์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ œ์–ดํ•˜๋ ค๋ฉด ๊ฒŒ์ž„ ๊ฒฐ๊ณผ์™€ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

UO.Print("Calling UO.WaitTargetObject");
UO.WaitTargetObject("self");

1. ๊ธฐ์ˆ ์„ ๋ฏธ๋ฆฌ ์„ ํƒํ•˜์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • id="self" - ์บ๋ฆญํ„ฐ์˜ serial. CancelWaitTarget๋Š” ์ด์ „์— ์ค€๋น„๋œ ๋‹ต๋ณ€์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • UseSkill ์Šคํ‚ฌ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ๊ทธ์˜ ์„œ๋ฒ„ ์‹œ์•ผ๋Š” ์ค€๋น„๋œ ๋ชฉํ‘œ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
UO.CancelWaitTarget();
UO.WaitTargetObject("self");
UO.UseSkill("Anatomy");

2. ์ˆซ์ž serial๋กœ ์•Œ๋ ค์ง„ ๊ฐœ์ฒด ์„ ํƒ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • objectId - ์˜ˆ serial: ๊ท€ํ•˜์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”. ์ด๊ฒƒ์€ graphic/type๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ์—ฌ๊ธฐ์„œ ๋ชฉํ‘œ๊ฐ€ ๋ฐฉ๊ธˆ ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ์˜ ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ๋Š” ์‹ค์ œ๋กœ ๋Œ€์ƒ์„ ์˜ˆ์ƒํ•˜๋Š” ์ž‘์—…์„ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var objectId = 0x40001234;
    if (Truth(UO.Exists(objectId)))
    {
        UO.WaitTargetObject(objectId);
        UO.Print("Object target prepared");
    }

    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. ๋‘ ๊ฐ€์ง€ ๊ด‘๊ฒฝ: ์ฒซ ๋ฒˆ์งธ ๊ฐœ์ฒด์™€ ๋‘ ๋ฒˆ์งธ ๊ฐœ์ฒด - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์†Œ์Šค์™€ ๋Œ€์ƒ์€ ๋ฏธ๋ฆฌ ์ •์˜๋œ ์ด๋ฆ„ AddObject์ž…๋‹ˆ๋‹ค. GetSerial๋Š” id1/id2 ํ˜•์‹๊ณผ ์ผ์น˜ํ•˜๋Š” ํ–‰์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฒซ ๋ฒˆ์งธ ์„œ๋ฒ„ ์‹œ๋ ฅ์€ ์ฒซ ๋ฒˆ์งธ, ๋‘ ๋ฒˆ์งธ - ๋‘ ๋ฒˆ์งธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ์—ฐ์† ์กฐ์ค€๊ฒฝ์„ ์‚ฌ์šฉํ•˜๋Š” ์ž‘์—…์—๋งŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ธฐ ์ „์— ๋ถˆํ•„์š”ํ•œ ๋‘ ๋ฒˆ์งธ ๋Œ€์ƒ์„ ์ œ๊ฑฐํ•˜์„ธ์š”.
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 first = UO.GetSerial("source");
        var second = UO.GetSerial("destination");
        if (Truth(UO.Exists(first)) && Truth(UO.Exists(second)))
        {
            UO.CancelWaitTarget();
            UO.WaitTargetObject(first, second);
        }

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "waittargetobject": WaitTargetObject(Arg(0)); return InjectionValue.Unit;

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

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

UO.WaitTargetObject(id1, id2) โ€” UO.WaitTargetObject(String,String)

๋งค๊ฐœ๋ณ€์ˆ˜: id1 (String), id2 (String)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void WaitTargetObject(string id1, string id2) => WaitTargetObject(GetObject(id1), GetObject(id2));

UO.WaitTargetObjectType

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

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

void UO.WaitTargetObjectType(object? id, object? @type);
void UO.WaitTargetObjectType(object? id, object? @type, object? color);

์ฃผ์–ด์ง„ ๋ฌผ์ฒด์™€ ๋•…์—์„œ ๋ฐœ๊ฒฌ๋œ ๋ฌผ์ฒด๋ผ๋Š” ๋‘ ๊ฐœ์˜ ์—ฐ์†๋œ ํ‘œ์ ์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.

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

  • id โ€” ์ง๋ ฌ/ID ๊ฐœ์ฒด: int, ์ˆซ์ž/16์ง„์ˆ˜ ๋ฌธ์ž์—ด ๋˜๋Š” ์„ค์ •๋œ ๋ณ„์นญ(์˜ˆ: "lasttarget"). ์ด๊ฒƒ์€ graphic/type๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ธฐ ์ „์— ๋กœ๋“œ๋œ ๊ฐœ์ฒด๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
  • type - ๋‘ ๋ฒˆ์งธ ํ•ญ๋ชฉ์˜ ๊ทธ๋ž˜ํ”ฝ/type, int/hex/named type.
  • color - ๋‘ ๋ฒˆ์งธ ์ฃผ์ œ์˜ ์„ ํƒ ์‚ฌํ•ญ hue; -1 ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ๋จผ์ € serial๋ถ€ํ„ฐ GetObject๊นŒ์ง€ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” FindType(type,color,1,-1,false)๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ๊ธ์ •์ ์ด๋ฉด ๋ธŒ๋ฆฌ์ง€๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.WaitTargetObject(์ฒซ ๋ฒˆ์งธ, ๋‘ ๋ฒˆ์งธ). ๋Œ€์ƒ์˜ ์ˆœ์„œ๊ฐ€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
  • ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ชฉํ‘œ๊ฐ€ ๋ˆ„๋ฝ๋˜๊ฑฐ๋‚˜ ๊ธ์ •์ ์ด์ง€ ์•Š์€ ๊ฒฝ์šฐ(๋ฉ”์‹œ์ง€ ๋ฐ CancelNextTarget) ๋‘ ๋ชฉํ‘œ๊ฐ€ ๋ชจ๋‘ ์„ค์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ธŒ๋žœ์น˜๋Š” TicksTarget์„ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์œผ๋ฉฐ ์•„์ดํ…œ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.WaitTargetObjectType");
UO.WaitTargetObjectType("self", "0x0E21");

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

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

  • ์ฃผ์–ด์ง„ ๋ฌผ์ฒด์™€ ๋•…์—์„œ ๋ฐœ๊ฒฌ๋œ ๋ฌผ์ฒด๋ผ๋Š” ๋‘ ๊ฐœ์˜ ์—ฐ์†๋œ ํ‘œ์ ์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.
UO.WaitTargetObjectType("self", "0x0E21");

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

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

  • ๋จผ์ € serial๋ถ€ํ„ฐ GetObject๊นŒ์ง€ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” FindType(type,color,1,-1,false)๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ๊ธ์ •์ ์ด๋ฉด ๋ธŒ๋ฆฌ์ง€๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.WaitTargetObject(์ฒซ ๋ฒˆ์งธ, ๋‘ ๋ฒˆ์งธ). ๋Œ€์ƒ์˜ ์ˆœ์„œ๊ฐ€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.WaitTargetObjectType("lasttarget", "0x0E21", -1);
    return null;
}

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

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

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

     public object? RunScenario()
    {
        UO.WaitTargetObjectType("self", "0x0E21", -1);
        UO.Print(UO.Waiting());
        UO.CancelWaitTarget();
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.WaitTargetObjectType(id, type) โ€” UO.WaitTargetObjectType(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void WaitTargetObjectType(InjectionValue id, InjectionValue type)

            => WaitTargetObjectType(id, type, new InjectionValue(-1));

UO.WaitTargetObjectType(id, type, color) โ€” UO.WaitTargetObjectType(Any,Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void WaitTargetObjectType(InjectionValue id, InjectionValue type, InjectionValue color)

        {

            int first = GetObject(id);

            int second = bridge.FindType(ResolveType(type), NumberConversions.ToInt(color), 1, -1, false);

            if (first <= 0 || second <= 0)

            {

                SystemMessage("UO.WaitTargetObjectType: object or ground item not found");

                bridge.CancelNextTarget();

                return;

            }

            bridge.WaitTargetObject(first, second);

        }

UO.WaitTargetSelf

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

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

void UO.WaitTargetSelf();

๋ณ„์นญ self๋ฅผ ํ†ตํ•ด ๋‹ค์Œ ์„œ๋ฒ„ ๋Œ€์ƒ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. true/false, serial ๋˜๋Š” type๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ object? ํ˜ธํ™˜๋˜๋Š” ์–‘์‹์˜ ๊ฒฝ์šฐ ์‹ค์ œ ๊ฒฐ๊ณผ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค void.

๋™์ž‘

  • ํŒ€์€ ๋Œ€์‘๋งŒ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค. ์•„์ดํ…œ, ์Šคํ‚ฌ, ์ฃผ๋ฌธ ์ž์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์„œ๋ฒ„ ๋Œ€์ƒ์€ ํด๋ผ์ด์–ธํŠธ ํ”„๋ ˆ์ž„์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ค€๋น„๋œ ๋Œ€์ƒ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ์—ฐ์† ํ˜ธ์ถœ์€ ๊ณตํ†ต ํด๋ผ์ด์–ธํŠธ ๋Œ€๊ธฐ์—ด์„ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด์™€ ์ขŒํ‘œ ๋Œ€์ƒ์€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ์„ ํƒ ์ฐฝ ClientRequest*/Info/container๋Š” ์ด๋ฅผ ์†Œ๋น„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • CancelWaitTarget ๋Œ€๊ธฐ์—ด์„ ์ง€์›๋‹ˆ๋‹ค. TerminateAll ์ „์ฒด๋ฅผ ์ฒญ์†Œํ•ฉ๋‹ˆ๋‹ค. ์•„์ง ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์‹œ์ €๋ฅผ ์ค‘์ง€ํ•˜๋ฉด ์ž์ฒด ๋ณด๋ฅ˜ ์ค‘์ธ ์‘๋‹ต๋„ ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค. ์งง์€ ์ ˆ์ฐจ๋ฅผ ์™„๋ฃŒํ•ด๋„ ์ผ๋ฐ˜์ ์œผ๋กœ ์ค€๋น„๋œ ๋Œ€์ƒ์ด ์ทจ์†Œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์‘๋‹ต์„ ๋ณด๋‚ด๋„ ์„œ๋ฒ„์—์„œ์˜ ์ž‘์—…์ด ๋ณด์žฅ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์‘๋‹ต์€ ๋ฒ”์œ„, ๊ฐœ์ฒด์˜ ์ ‘๊ทผ์„ฑ, ๊ฐ€์‹œ์„ฑ ๋ฐ ์ž‘์—… ๊ทœ์น™์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ œ์–ดํ•˜๋ ค๋ฉด ๊ฒŒ์ž„ ๊ฒฐ๊ณผ์™€ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

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

1. ๋Œ€์ƒ ์ค€๋น„ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋…ผ์Ÿ์ด ์—†์Šต๋‹ˆ๋‹ค. self๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์€ ์‹œ๋ ฅ์„ ์—ด์ง€ ์•Š๊ณ  ์ž‘์—… ์ž์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
UO.WaitTargetSelf();

2. ์„ ํƒํ•œ ๊ฐœ์ฒด์˜ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ด ์Šคํ‚ฌ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋กœ๋“œ๋œ ์บ๋ฆญํ„ฐ์—์„œ self๊ฐ€ ํ—ˆ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Exists ๊ฒ€์‚ฌ๋Š” ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ฒด ์œ ํ˜• ๋ฐ ๊ธฐ์ˆ  ์œ ํšจ์„ฑ์˜ ์„ ํƒ์€ ์Šคํฌ๋ฆฝํŠธ ์กฐ๊ฑด์œผ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("self")))
    {
        UO.CancelWaitTarget();
        UO.WaitTargetSelf();
        UO.UseSkill("Anatomy");
    }

    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. ์ค€๋น„๋œ ๋Œ€์ƒ ์ทจ์†Œ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • IsWaitTargetActive๋Š” ์‘๋‹ต ํ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • CancelWaitTarget ์ด๋ฏธ ์—ด๋ ค ์žˆ๋Š” ๋งž์ถค ์‹ญ์ž์„ ์„ ๋‹ซ์ง€ ์•Š๊ณ  ์ค€๋น„๋ฅผ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.WaitTargetSelf();
        if (Truth(UO.IsWaitTargetActive()))
        {
            UO.CancelWaitTarget();
        }

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void WaitTargetSelf() => WaitTargetObject("self");

UO.WaitTargetTile

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

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

void UO.WaitTargetTile(object? selector);
void UO.WaitTargetTile(object? x, object? y, object? z);
void UO.WaitTargetTile(object? @type, object? x, object? y, object? z);

์„ ํƒ์  ํƒ€์ผ ๊ทธ๋ž˜ํ”ฝ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ขŒํ‘œ ๋Œ€์ƒ์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.

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

  • selector - ๋‹จ์ผ ์ธ์ˆ˜ ํ˜•์‹์—์„œ๋งŒ: ์ €์žฅ๋œ ์ง€์ ์„ ๋ฐ˜๋ณตํ•˜๋Š” "lasttile" ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
  • type - ๊ทธ๋ž˜ํ”ฝ/type ํƒ€์ผ, 0..65535, serial ์•„๋‹˜. 0์€ ์ง€์ •๋œ ๊ทธ๋ž˜ํ”ฝ์ด ์—†๋Š” ์ขŒํ‘œ ๋Œ€์ƒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. 4๊ฐœ์˜ ์ธ์ˆ˜ ํ˜•์‹์œผ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. x/y/z ํ˜•์‹์€ 0์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • x โ€” ํ˜„์žฌ ์ง€๋„์˜ ์„ธ๊ณ„ X ์ขŒํ‘œ 0..65535. ์ด๋Š” ํ™”๋ฉด ํ”ฝ์…€์ด๋‚˜ ๊ฒ€ํ”„ ์ขŒํ‘œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • y โ€” ํ˜„์žฌ ์ง€๋„์˜ ์„ธ๊ณ„ Y ์ขŒํ‘œ 0..65535.
  • z - ๋„คํŠธ์›Œํฌ ๋Œ€์ƒ ์‚ฌ์šฉ์„ ์œ„ํ•œ ๊ฒŒ์ž„ ํฌ์ธํŠธ ๋†’์ด -128..127. ์ด๊ฒƒ์€ ๋ฐ”๋‹ฅ์ด๋‚˜ ์žฅ๋น„์˜ ์ธต์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. true/false, serial ๋˜๋Š” type๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ object? ํ˜ธํ™˜๋˜๋Š” ์–‘์‹์˜ ๊ฒฝ์šฐ ์‹ค์ œ ๊ฒฐ๊ณผ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค void.

๋™์ž‘

  • ํŒ€์€ ๋Œ€์‘๋งŒ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค. ์•„์ดํ…œ, ์Šคํ‚ฌ, ์ฃผ๋ฌธ ์ž์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์„œ๋ฒ„ ๋Œ€์ƒ์€ ํด๋ผ์ด์–ธํŠธ ํ”„๋ ˆ์ž„์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ค€๋น„๋œ ๋Œ€์ƒ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ์—ฐ์† ํ˜ธ์ถœ์€ ๊ณตํ†ต ํด๋ผ์ด์–ธํŠธ ๋Œ€๊ธฐ์—ด์„ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด์™€ ์ขŒํ‘œ ๋Œ€์ƒ์€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ์„ ํƒ ์ฐฝ ClientRequest*/Info/container๋Š” ์ด๋ฅผ ์†Œ๋น„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • CancelWaitTarget ๋Œ€๊ธฐ์—ด์„ ์ง€์›๋‹ˆ๋‹ค. TerminateAll ์ „์ฒด๋ฅผ ์ฒญ์†Œํ•ฉ๋‹ˆ๋‹ค. ์•„์ง ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์‹œ์ €๋ฅผ ์ค‘์ง€ํ•˜๋ฉด ์ž์ฒด ๋ณด๋ฅ˜ ์ค‘์ธ ์‘๋‹ต๋„ ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค. ์งง์€ ์ ˆ์ฐจ๋ฅผ ์™„๋ฃŒํ•ด๋„ ์ผ๋ฐ˜์ ์œผ๋กœ ์ค€๋น„๋œ ๋Œ€์ƒ์ด ์ทจ์†Œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์‘๋‹ต์„ ๋ณด๋‚ด๋„ ์„œ๋ฒ„์—์„œ์˜ ์ž‘์—…์ด ๋ณด์žฅ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์‘๋‹ต์€ ๋ฒ”์œ„, ๊ฐœ์ฒด์˜ ์ ‘๊ทผ์„ฑ, ๊ฐ€์‹œ์„ฑ ๋ฐ ์ž‘์—… ๊ทœ์น™์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ œ์–ดํ•˜๋ ค๋ฉด ๊ฒŒ์ž„ ๊ฒฐ๊ณผ์™€ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

UO.Print("Calling UO.WaitTargetTile");
UO.WaitTargetTile("lasttile");

1. graphic ์—†๋Š” ์ขŒํ‘œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • x=1445, y=1690, z=0; ๋ˆ„๋ฝ๋œ type๋Š” 0์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ์ด๊ฒƒ์ด ์„ธ์ƒ์˜ ์š”์ ์ด๋‹ค. ์ด ๋ช…๋ น์€ ์บ๋ฆญํ„ฐ๋ฅผ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ๊ฒ€ํ”„์— ์•„์ดํ…œ์„ ๋ฐฐ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
UO.CancelWaitTarget();
UO.WaitTargetTile(1445, 1690, 0);

2. graphic ํƒ€์ผ์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ • - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • type=0x0CCA โ€” ๊ทธ๋ž˜ํ”ฝ์˜ ์˜ˆ; ์„ ํƒํ•œ ํƒ€์ผ์˜ ์‹ค์ œ type๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. x/y/z๋Š” ์›”๋“œ ์œ„์น˜์ž…๋‹ˆ๋‹ค.
  • ๊ทธ๋ž˜ํ”ฝ๊ณผ ์ขŒํ‘œ๋Š” ์›ํ•˜๋Š” ์ง€๋„ ๊ฐ์ฒด๋ฅผ ์„ค๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ๋Œ€์ƒ์˜ ์œ ํšจ์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.CancelWaitTarget();
    UO.WaitTargetTile(0x0CCA, 1445, 1690, 0);
    return null;
}

3. ๋งˆ์ง€๋ง‰ ๋Œ€์ƒ์˜ ์ €์žฅ๋œ ์ง€์  ๋ฐ˜๋ณต - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์„ ํƒ๊ธฐ๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ๋งˆ์ง€๋ง‰ ๋ฌธ์ž์—ด๋งŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ์ธ์ˆ˜ ํ˜•์‹์˜ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด์ด๋‚˜ ์ˆซ์ž๋กœ ์ธํ•ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • TargetManager ํƒ€์ผ์˜ ๋งˆ์ง€๋ง‰ ํ•„๋“œ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์„ ํƒ ์ „์—๋Š” 0์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ๊ฒŒ์ž„์—์„œ ์›ํ•˜๋Š” ์ง€์ ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. 3๊ฐœ ๋˜๋Š” 4๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.WaitTargetTile("lasttile");
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.WaitTargetTile(selector) โ€” UO.WaitTargetTile(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void WaitTargetTile(InjectionValue selector)

        {

            string name = selector.Kind == InjectionValueKind.String

                ? (selector.String ?? string.Empty).Trim()

                : string.Empty;

            if (!name.Equals("lasttile", StringComparison.OrdinalIgnoreCase))

                throw new NativeSubrutineException("UO.WaitTargetTile(one argument) accepts only 'lasttile'.");



            int[] tile = bridge.LastTile() ?? Array.Empty<int>();

            if (tile.Length < 4)

            {

                SystemMessage("UO.WaitTargetTile: lasttile is unavailable; next target request canceled.");

                bridge.CancelNextTarget();

                return;

            }

            bridge.WaitTargetTile(tile[0], tile[1], tile[2], tile[3]);

            ticksTarget = Timer();

        }

UO.WaitTargetTile(x, y, z) โ€” UO.WaitTargetTile(Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: x (Any), y (Any), z (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void WaitTargetTile(InjectionValue x, InjectionValue y, InjectionValue z)

            => WaitTargetTile(new InjectionValue(0), x, y, z);

UO.WaitTargetTile(type, x, y, z) โ€” UO.WaitTargetTile(Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: type (Any), x (Any), y (Any), z (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void WaitTargetTile(InjectionValue type, InjectionValue x, InjectionValue y, InjectionValue z)

        {

            bridge.WaitTargetTile(ResolveType(type), NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(z));

            ticksTarget = Timer();

        }

UO.WaitTargetType

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

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

void UO.WaitTargetType(object? @type);
void UO.WaitTargetType(object? @type, object? color);

graphic/hue์—์„œ ํ•ญ๋ชฉ์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๋‹ค์Œ ๋Œ€์ƒ์˜ ๋Œ€๊ธฐ์—ด์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

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

  • type - ๊ทธ๋ž˜ํ”ฝ/type int, 16์ง„์ˆ˜ ๋ฌธ์ž์—ด ๋˜๋Š” ์ด๋ฆ„์ด type์ธ ์„ธํŠธ. serial ์•„์ดํ…œ์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • color - ์„ ํƒ์‚ฌํ•ญ int hue; ๊ธฐ๋ณธ๊ฐ’ -1 - ๋ชจ๋“  ์ƒ‰์ƒ.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ๋ฒ”์œ„: ์žฌ๊ท€ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๋ฐฐ๋‚ญ. Bridge.FindType๋Š” ๋ฐœ๊ฒฌ๋œ serial๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. serial>0 ๋ธŒ๋ฆฌ์ง€.WaitTargetObject๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ. ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋Š” ๋Ÿฐํƒ€์ž„ TicksTarget๋ฅผ ์ง์ ‘ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ•ญ๋ชฉ ์—†์Œ - ๋ฉ”์‹œ์ง€ ๋ฐ CancelNextTarget. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ผ๋ฐ˜ FindItem/FoundItems๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๋ฐœ๊ฒฌ๋œ ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ปค์„œ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.WaitTargetType");
UO.WaitTargetType("0x0E21");

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

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

  • graphic/hue์—์„œ ํ•ญ๋ชฉ์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๋‹ค์Œ ๋Œ€์ƒ์˜ ๋Œ€๊ธฐ์—ด์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.
UO.WaitTargetType("0x0E21");

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

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

  • ๋ฒ”์œ„: ์žฌ๊ท€ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๋ฐฐ๋‚ญ. Bridge.FindType๋Š” ๋ฐœ๊ฒฌ๋œ serial๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. serial>0 ๋ธŒ๋ฆฌ์ง€.WaitTargetObject๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ. ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋Š” ๋Ÿฐํƒ€์ž„ TicksTarget๋ฅผ ์ง์ ‘ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.WaitTargetType("0x0E21", -1);
    return null;
}

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

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

  • ํ•ญ๋ชฉ ์—†์Œ - ๋ฉ”์‹œ์ง€ ๋ฐ CancelNextTarget. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ผ๋ฐ˜ FindItem/FoundItems๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๋ฐœ๊ฒฌ๋œ ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ปค์„œ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.WaitTargetType("0x0E21", -1);
        UO.Print(UO.Waiting());
        UO.CancelWaitTarget();
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.WaitTargetType(type) โ€” UO.WaitTargetType(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void WaitTargetType(InjectionValue type) => WaitTargetType(ResolveType(type), -1);

UO.WaitTargetType(type, color) โ€” UO.WaitTargetType(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void WaitTargetType(InjectionValue type, InjectionValue color)

            => WaitTargetType(ResolveType(type), NumberConversions.ToInt(color));

UO.WaitTargetXYZ

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

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

void UO.WaitTargetXYZ(object? x, object? y, object? z);

๋‹ค์Œ ์„œ๋ฒ„ ์‹œ๊ฐ์„ ์œ„ํ•ด graphic=0๋กœ ์ขŒํ‘œ ๋Œ€์ƒ์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.

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

  • x โ€” ํ˜„์žฌ ์ง€๋„์˜ ์„ธ๊ณ„ X ์ขŒํ‘œ 0..65535. ์ด๋Š” ํ™”๋ฉด ํ”ฝ์…€์ด๋‚˜ ๊ฒ€ํ”„ ์ขŒํ‘œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • y โ€” ํ˜„์žฌ ์ง€๋„์˜ ์„ธ๊ณ„ Y ์ขŒํ‘œ 0..65535.
  • z - ๋„คํŠธ์›Œํฌ ๋Œ€์ƒ ์‚ฌ์šฉ์„ ์œ„ํ•œ ๊ฒŒ์ž„ ํฌ์ธํŠธ ๋†’์ด -128..127. ์ด๊ฒƒ์€ ๋ฐ”๋‹ฅ์ด๋‚˜ ์žฅ๋น„์˜ ์ธต์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. true/false, serial ๋˜๋Š” type๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ object? ํ˜ธํ™˜๋˜๋Š” ์–‘์‹์˜ ๊ฒฝ์šฐ ์‹ค์ œ ๊ฒฐ๊ณผ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค void.

๋™์ž‘

  • ํŒ€์€ ๋Œ€์‘๋งŒ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค. ์•„์ดํ…œ, ์Šคํ‚ฌ, ์ฃผ๋ฌธ ์ž์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์„œ๋ฒ„ ๋Œ€์ƒ์€ ํด๋ผ์ด์–ธํŠธ ํ”„๋ ˆ์ž„์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ค€๋น„๋œ ๋Œ€์ƒ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ์—ฐ์† ํ˜ธ์ถœ์€ ๊ณตํ†ต ํด๋ผ์ด์–ธํŠธ ๋Œ€๊ธฐ์—ด์„ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด์™€ ์ขŒํ‘œ ๋Œ€์ƒ์€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ์„ ํƒ ์ฐฝ ClientRequest*/Info/container๋Š” ์ด๋ฅผ ์†Œ๋น„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • CancelWaitTarget ๋Œ€๊ธฐ์—ด์„ ์ง€์›๋‹ˆ๋‹ค. TerminateAll ์ „์ฒด๋ฅผ ์ฒญ์†Œํ•ฉ๋‹ˆ๋‹ค. ์•„์ง ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์‹œ์ €๋ฅผ ์ค‘์ง€ํ•˜๋ฉด ์ž์ฒด ๋ณด๋ฅ˜ ์ค‘์ธ ์‘๋‹ต๋„ ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค. ์งง์€ ์ ˆ์ฐจ๋ฅผ ์™„๋ฃŒํ•ด๋„ ์ผ๋ฐ˜์ ์œผ๋กœ ์ค€๋น„๋œ ๋Œ€์ƒ์ด ์ทจ์†Œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์‘๋‹ต์„ ๋ณด๋‚ด๋„ ์„œ๋ฒ„์—์„œ์˜ ์ž‘์—…์ด ๋ณด์žฅ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์‘๋‹ต์€ ๋ฒ”์œ„, ๊ฐœ์ฒด์˜ ์ ‘๊ทผ์„ฑ, ๊ฐ€์‹œ์„ฑ ๋ฐ ์ž‘์—… ๊ทœ์น™์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ œ์–ดํ•˜๋ ค๋ฉด ๊ฒŒ์ž„ ๊ฒฐ๊ณผ์™€ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

UO.Print("Calling UO.WaitTargetXYZ");
UO.WaitTargetXYZ(1445, 1690, 0);

1. ์„ธ๊ณ„์˜ ํ•œ ์ง€์  ์ง€์ • - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • X=1445, Y=1690, Z=0. ๊ทธ๋ž˜ํ”ฝ์€ 0์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„ ์ขŒํ‘œ๊ณ„๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด ์‘๋‹ต์ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
UO.WaitTargetXYZ(1445, 1690, 0);

2. ๋ฌธ์ž ์•„๋ž˜์— ์  ์‚ฌ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • X/Y/Z๋Š” ์ž์‹ ์˜ ์บ๋ฆญํ„ฐ์—์„œ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.
  • ์ด๋Š” ์บ๋ฆญํ„ฐ serial์˜ object ํƒ€๊ฒŸ์ด ์•„๋‹Œ ์ขŒํ‘œ ํƒ€๊ฒŸ์ž…๋‹ˆ๋‹ค. ํ›„์ž์˜ ๊ฒฝ์šฐ WaitTargetSelf๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX();
    var y = UO.GetY();
    var z = UO.GetZ();
    UO.WaitTargetXYZ(x, y, z);
    return null;
}

3. ๋„๊ตฌ ํฌ์ธํŠธ ์ค€๋น„ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

     public object? RunScenario()
    {
        UO.CancelWaitTarget();
        UO.WaitTargetXYZ(1445, 1690, 0);
        UO.UseType(0x0F39, -1);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.WaitTargetXYZ(x, y, z) โ€” UO.WaitTargetXYZ(Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: x (Any), y (Any), z (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "waittargetxyz": WaitTargetTile(new InjectionValue(0), arguments[0], arguments[1], arguments[2]); return InjectionValue.Unit;
โš ๏ธ **GitHub.com Fallback** โš ๏ธ