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

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

๋งˆ์šฐ์Šค ๋ฐ ํ‚ค๋ณด๋“œ

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

๋งˆ์šฐ์Šค ๋ฐ ํ‚ค๋ณด๋“œ ์ž…๋ ฅ. ํ™”๋ฉด ์ขŒํ‘œ, ์›”๋“œ ์…€, ๊ฒ€ํ”„ ๋‚ด๋ถ€ ์ขŒํ‘œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.

์„น์…˜

์ฃผ์ œ ๋ช…๋ น ๋ฐ ์„ค๋ช…
Click UO.Click
LClick UO.LClick
RClick UO.RClick
DoubleClick UO.LDblClick ยท UO.RDblClick
KeyPress UO.KeyPress
Press UO.Press

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

์ž…๋ ฅ

UO.Click ยท UO.LClick ยท UO.RClick ยท UO.LDblClick ยท UO.RDblClick ยท UO.KeyPress ยท UO.Press

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

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

UO.LClick

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

UO.LClick(100, 100);

UO.KeyPress

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

UO.KeyPress(0x70);

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


UO.Click

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

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

void UO.Click(object? name);

GameActions.SingleClick๋ฅผ ํ†ตํ•ด ๊ฐœ์ฒด์— ๋Œ€ํ•œ ๋‹จ์ผ ํด๋ฆญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

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

  • name โ€” self/backpack/lasttarget/์ €์žฅ๋œ ๊ฐ์ฒด์˜ ๊ฐ์ฒด ์ผ๋ จ๋ฒˆํ˜ธ ๋˜๋Š” ์ง€์›๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ˆซ์ž ๋ฌธ์ž์—ด๊ณผ 0x ๋ฌธ์ž์—ด์€ ๋Ÿฐํƒ€์ž„์— ์˜ํ•ด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • Click๋Š” ObjectChecked๋ฅผ ํ†ตํ•ด ๋งํฌ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ClickOnObject๋Š” ๋จผ์ € serial์— Arg๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  Click(int)๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” DoubleClick ๋˜๋Š” ์•„์ดํ…œ ์‚ฌ์šฉ์ด ์•„๋‹Œ ์•„์ดํ…œ์˜ ์„œ๋ช…/์ •๋ณด์— ๋Œ€ํ•œ ์š”์ฒญ์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์‘๋‹ต์€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์บ๋ฆญํ„ฐ ํด๋ฆญ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ํ•œ ๋ฒˆ์˜ ํด๋ฆญ์€ self๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
UO.Click("self");

2. ๋งˆ์ง€๋ง‰ ๋Œ€์ƒ ํด๋ฆญ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ „์†กํ•˜๊ธฐ ์ „์— ๋Œ€์ƒ์˜ ๋กœ์ปฌ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.LastTarget();
    if (Truth(UO.Exists(target)))
    {
        UO.Click(target);
    }

    return null;
}

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

3. ๊ทธ๋“ค์€ ๋ฐฐ๋‚ญ์„ ํด๋ฆญํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

     public object? RunScenario()
    {
        var bag = UO.Backpack();
        if (Truth(bag != 0))
        {
            UO.Click(bag);
        }

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void Click(InjectionValue name) => ObjectChecked(name, id => Click(id));

UO.KeyPress

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

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

void UO.KeyPress(object? key);
void UO.KeyPress(object? key, object? count);
void UO.KeyPress(object? key, object? count, object? delay);

ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ฐ€์ƒ ํ‚ค ๋ˆ„๋ฅด๊ธฐ๋ฅผ ํ•ฉ์„ฑํ•ฉ๋‹ˆ๋‹ค.

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

  • key - int ๊ฐ€์ƒ ํ‚ค Windows, byte๋กœ ์ถ•์†Œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด๋„ ์•„๋‹ˆ๊ณ  ID ๋Œ€์ƒ๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • count โ€” ์„ ํƒ์  ๋ฐ˜๋ณต ํšŸ์ˆ˜, ๊ธฐ๋ณธ๊ฐ’ 1. 0/์Œ์ˆ˜ - ๋ˆ„๋ฅด๊ฑฐ๋‚˜ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • delay - ๋งˆ์ง€๋ง‰ ๋ฒ„ํŠผ์„ ํฌํ•จํ•˜์—ฌ ๊ฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ ํ›„ ๋ฐ€๋ฆฌ์ดˆ ๋™์•ˆ ์ผ์‹œ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 105์ž…๋‹ˆ๋‹ค. ๋ธŒ๋ฆฌ์ง€๋ฅผ ํ†ตํ•ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค.Wait ์ด ๊ธฐ๋Šฅ์— ์˜ํ•œ ์ถ”๊ฐ€ ์ œํ•œ์€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • Press๋Š” ๋ชจ๋“  ์–‘์‹์„ KeyPress๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. KeyPress ๋ฃจํ”„ ์นด์šดํŠธ ์‹คํ–‰>0: ๋ธŒ๋ฆฌ์ง€.KeyPress(ํ‚ค), ๋ธŒ๋ฆฌ์ง€.Wait(์ง€์—ฐ), ์นด์šดํŠธ--. Bridge๋Š” user32 keybd_event๋ฅผ ๋‹ค์šด/์—…์œผ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • ์ž…๋ ฅ ํฌ์ปค์Šค๊ฐ€ ์žˆ๋Š” ๊ฐœ๋ฐฉํ˜• ๊ทธ๋ž˜ํ”ฝ ClassicUO์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด RequireGameInput์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํด๋ฆญ์€ ํ˜„์žฌ ์ธํ„ฐํŽ˜์ด์Šค/๋งคํฌ๋กœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉฐ ์„œ๋ฒ„ ๋ช…๋ น์˜ ๊ฒฐ๊ณผ๋Š” ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.KeyPress");
UO.KeyPress(0x70);

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

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

  • ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ฐ€์ƒ ํ‚ค ๋ˆ„๋ฅด๊ธฐ๋ฅผ ํ•ฉ์„ฑํ•ฉ๋‹ˆ๋‹ค.
UO.KeyPress(0x70);

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

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

  • Press๋Š” ๋ชจ๋“  ์–‘์‹์„ KeyPress๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. KeyPress ๋ฃจํ”„ ์นด์šดํŠธ ์‹คํ–‰>0: ๋ธŒ๋ฆฌ์ง€.KeyPress(ํ‚ค), ๋ธŒ๋ฆฌ์ง€.Wait(์ง€์—ฐ), ์นด์šดํŠธ--. Bridge๋Š” user32 keybd_event๋ฅผ ๋‹ค์šด/์—…์œผ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.KeyPress(0x70, 2, 250);
    return null;
}

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

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

  • ์ž…๋ ฅ ํฌ์ปค์Šค๊ฐ€ ์žˆ๋Š” ๊ฐœ๋ฐฉํ˜• ๊ทธ๋ž˜ํ”ฝ ClassicUO์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด RequireGameInput์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํด๋ฆญ์€ ํ˜„์žฌ ์ธํ„ฐํŽ˜์ด์Šค/๋งคํฌ๋กœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉฐ ์„œ๋ฒ„ ๋ช…๋ น์˜ ๊ฒฐ๊ณผ๋Š” ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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.KeyPress(0x70, 0);
        UO.Print("Zero count sends no key");
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.KeyPress(key) โ€” UO.KeyPress(Integer)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void KeyPress(int key) => KeyPress(key, 1);

UO.KeyPress(key, count) โ€” UO.KeyPress(Integer,Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: key (Integer), count (Integer)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void KeyPress(int key, int count) => KeyPress(key, count, 105);

UO.KeyPress(key, count, delay) โ€” UO.KeyPress(Integer,Integer,Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: key (Integer), count (Integer), delay (Integer)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void KeyPress(int key, int count, int delay)

        {

            while (count > 0)

            {

                bridge.KeyPress(key);

                bridge.Wait(delay);

                count--;

            }

        }

UO.LClick

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

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

void UO.LClick(object? x, object? y);

๋‹จ์ผ ๋งˆ์šฐ์Šค ํด๋ฆญ์„ ํ•ฉ์„ฑํ•ฉ๋‹ˆ๋‹ค: ์™ผ์ชฝ ๋ฒ„ํŠผ.

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

  • x - int X ์ฐฝ ํ”ฝ์…€ ClassicUO, ์„ธ๊ณ„ ์ขŒํ‘œ ์•„๋‹˜.
  • y - int Y ์ฐฝ ํ”ฝ์…€ ClassicUO, ์„ธ๊ณ„ ์ขŒํ‘œ ์•„๋‹˜.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ๋ธŒ๋ฆฌ์ง€๋Š” WarpMouse(x,y)๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  Mouse.Position ๋ฐ SDL_WarpMouseInWindow๋ฅผ ์—…๋ฐ์ดํŠธํ•œ ๋‹ค์Œ MouseButton ์•„๋ž˜/์œ„๋กœ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ ํด๋ฆญ ์‚ฌ์ด์—๋Š” ์ผ์‹œ ์ค‘์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ž…๋ ฅ ํฌ์ปค์Šค๊ฐ€ ์žˆ๋Š” ์—ด๋ฆฐ ClassicUO ๊ทธ๋ž˜ํ”ฝ ์ฐฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด RequireGameInput๊ฐ€ InvalidOperationException์„ ๋˜์ง‘๋‹ˆ๋‹ค. user32 mouse_event๋Š” Windows์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์  ์•„๋ž˜์˜ ๋ฒ„ํŠผ/๊ฐœ์ฒด๋Š” ํ˜„์žฌ ์ธํ„ฐํŽ˜์ด์Šค์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.LClick");
UO.LClick(100, 100);

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

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

  • ๋‹จ์ผ ๋งˆ์šฐ์Šค ํด๋ฆญ์„ ํ•ฉ์„ฑํ•ฉ๋‹ˆ๋‹ค: ์™ผ์ชฝ ๋ฒ„ํŠผ.
UO.LClick(100, 100);

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

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

  • ๋ธŒ๋ฆฌ์ง€๋Š” WarpMouse(x,y)๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  Mouse.Position ๋ฐ SDL_WarpMouseInWindow๋ฅผ ์—…๋ฐ์ดํŠธํ•œ ๋‹ค์Œ MouseButton ์•„๋ž˜/์œ„๋กœ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ ํด๋ฆญ ์‚ฌ์ด์—๋Š” ์ผ์‹œ ์ค‘์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var x = 120;
    var y = 140;
    UO.LClick(x, y);
    return null;
}

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

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

  • ์ž…๋ ฅ ํฌ์ปค์Šค๊ฐ€ ์žˆ๋Š” ์—ด๋ฆฐ ClassicUO ๊ทธ๋ž˜ํ”ฝ ์ฐฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด RequireGameInput๊ฐ€ InvalidOperationException์„ ๋˜์ง‘๋‹ˆ๋‹ค. user32 mouse_event๋Š” Windows์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์  ์•„๋ž˜์˜ ๋ฒ„ํŠผ/๊ฐœ์ฒด๋Š” ํ˜„์žฌ ์ธํ„ฐํŽ˜์ด์Šค์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
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()
    {
        ClickAt(100, 100);
        return null;
    }

    void ClickAt(dynamic x, dynamic y)
    {
        UO.LClick(x, y);
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.LClick(x, y) โ€” UO.LClick(Integer,Integer)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void LClick(int x, int y) => bridge.LClick(x, y);

UO.LDblClick

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

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

void UO.LDblClick(object? x, object? y);

๋”๋ธ” ๋งˆ์šฐ์Šค ํด๋ฆญ์„ ํ•ฉ์„ฑํ•ฉ๋‹ˆ๋‹ค: ์™ผ์ชฝ ๋ฒ„ํŠผ.

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

  • x - int X ์ฐฝ ํ”ฝ์…€ ClassicUO, ์„ธ๊ณ„ ์ขŒํ‘œ ์•„๋‹˜.
  • y - int Y ์ฐฝ ํ”ฝ์…€ ClassicUO, ์„ธ๊ณ„ ์ขŒํ‘œ ์•„๋‹˜.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ๋ธŒ๋ฆฌ์ง€๋Š” WarpMouse(x,y)๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  Mouse.Position ๋ฐ SDL_WarpMouseInWindow๋ฅผ ์—…๋ฐ์ดํŠธํ•œ ๋‹ค์Œ MouseButton ์•„๋ž˜/์œ„๋ฅผ ๋‘ ๋ฒˆ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ ํด๋ฆญ ์‚ฌ์ด์—๋Š” ์ผ์‹œ ์ค‘์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ž…๋ ฅ ํฌ์ปค์Šค๊ฐ€ ์žˆ๋Š” ์—ด๋ฆฐ ClassicUO ๊ทธ๋ž˜ํ”ฝ ์ฐฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด RequireGameInput๊ฐ€ InvalidOperationException์„ ๋˜์ง‘๋‹ˆ๋‹ค. user32 mouse_event๋Š” Windows์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์  ์•„๋ž˜์˜ ๋ฒ„ํŠผ/๊ฐœ์ฒด๋Š” ํ˜„์žฌ ์ธํ„ฐํŽ˜์ด์Šค์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.LDblClick");
UO.LDblClick(100, 100);

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

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

  • ๋”๋ธ” ๋งˆ์šฐ์Šค ํด๋ฆญ์„ ํ•ฉ์„ฑํ•ฉ๋‹ˆ๋‹ค: ์™ผ์ชฝ ๋ฒ„ํŠผ.
UO.LDblClick(100, 100);

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

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

  • ๋ธŒ๋ฆฌ์ง€๋Š” WarpMouse(x,y)๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  Mouse.Position ๋ฐ SDL_WarpMouseInWindow๋ฅผ ์—…๋ฐ์ดํŠธํ•œ ๋‹ค์Œ MouseButton ์•„๋ž˜/์œ„๋ฅผ ๋‘ ๋ฒˆ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ ํด๋ฆญ ์‚ฌ์ด์—๋Š” ์ผ์‹œ ์ค‘์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var x = 120;
    var y = 140;
    UO.LDblClick(x, y);
    return null;
}

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

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

  • ์ž…๋ ฅ ํฌ์ปค์Šค๊ฐ€ ์žˆ๋Š” ์—ด๋ฆฐ ClassicUO ๊ทธ๋ž˜ํ”ฝ ์ฐฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด RequireGameInput๊ฐ€ InvalidOperationException์„ ๋˜์ง‘๋‹ˆ๋‹ค. user32 mouse_event๋Š” Windows์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์  ์•„๋ž˜์˜ ๋ฒ„ํŠผ/๊ฐœ์ฒด๋Š” ํ˜„์žฌ ์ธํ„ฐํŽ˜์ด์Šค์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
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()
    {
        ClickAt(100, 100);
        return null;
    }

    void ClickAt(dynamic x, dynamic y)
    {
        UO.LDblClick(x, y);
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.LDblClick(x, y) โ€” UO.LDblClick(Integer,Integer)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void LDblClick(int x, int y) => bridge.LDblClick(x, y);

UO.Press

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

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

void UO.Press(object? key);
void UO.Press(object? key, object? count);
void UO.Press(object? key, object? count, object? delay);

ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ฐ€์ƒ ํ‚ค ๋ˆ„๋ฅด๊ธฐ๋ฅผ ํ•ฉ์„ฑํ•ฉ๋‹ˆ๋‹ค.

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

  • key - int ๊ฐ€์ƒ ํ‚ค Windows, byte๋กœ ์ถ•์†Œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด๋„ ์•„๋‹ˆ๊ณ  ID ๋Œ€์ƒ๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • count โ€” ์„ ํƒ์  ๋ฐ˜๋ณต ํšŸ์ˆ˜, ๊ธฐ๋ณธ๊ฐ’ 1. 0/์Œ์ˆ˜ - ๋ˆ„๋ฅด๊ฑฐ๋‚˜ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • delay - ๋งˆ์ง€๋ง‰ ๋ฒ„ํŠผ์„ ํฌํ•จํ•˜์—ฌ ๊ฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ ํ›„ ๋ฐ€๋ฆฌ์ดˆ ๋™์•ˆ ์ผ์‹œ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 105์ž…๋‹ˆ๋‹ค. ๋ธŒ๋ฆฌ์ง€๋ฅผ ํ†ตํ•ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค.Wait ์ด ๊ธฐ๋Šฅ์— ์˜ํ•œ ์ถ”๊ฐ€ ์ œํ•œ์€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • Press๋Š” ๋ชจ๋“  ์–‘์‹์„ KeyPress๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. KeyPress ๋ฃจํ”„ ์นด์šดํŠธ ์‹คํ–‰>0: ๋ธŒ๋ฆฌ์ง€.KeyPress(ํ‚ค), ๋ธŒ๋ฆฌ์ง€.Wait(์ง€์—ฐ), ์นด์šดํŠธ--. Bridge๋Š” user32 keybd_event๋ฅผ ๋‹ค์šด/์—…์œผ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • ์ž…๋ ฅ ํฌ์ปค์Šค๊ฐ€ ์žˆ๋Š” ๊ฐœ๋ฐฉํ˜• ๊ทธ๋ž˜ํ”ฝ ClassicUO์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด RequireGameInput์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํด๋ฆญ์€ ํ˜„์žฌ ์ธํ„ฐํŽ˜์ด์Šค/๋งคํฌ๋กœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉฐ ์„œ๋ฒ„ ๋ช…๋ น์˜ ๊ฒฐ๊ณผ๋Š” ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.Press");
UO.Press(0x70);

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

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

  • ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ฐ€์ƒ ํ‚ค ๋ˆ„๋ฅด๊ธฐ๋ฅผ ํ•ฉ์„ฑํ•ฉ๋‹ˆ๋‹ค.
UO.Press(0x70);

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

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

  • Press๋Š” ๋ชจ๋“  ์–‘์‹์„ KeyPress๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. KeyPress ๋ฃจํ”„ ์นด์šดํŠธ ์‹คํ–‰>0: ๋ธŒ๋ฆฌ์ง€.KeyPress(ํ‚ค), ๋ธŒ๋ฆฌ์ง€.Wait(์ง€์—ฐ), ์นด์šดํŠธ--. Bridge๋Š” user32 keybd_event๋ฅผ ๋‹ค์šด/์—…์œผ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Press(0x70, 2, 250);
    return null;
}

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

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

  • ์ž…๋ ฅ ํฌ์ปค์Šค๊ฐ€ ์žˆ๋Š” ๊ฐœ๋ฐฉํ˜• ๊ทธ๋ž˜ํ”ฝ ClassicUO์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด RequireGameInput์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํด๋ฆญ์€ ํ˜„์žฌ ์ธํ„ฐํŽ˜์ด์Šค/๋งคํฌ๋กœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉฐ ์„œ๋ฒ„ ๋ช…๋ น์˜ ๊ฒฐ๊ณผ๋Š” ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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.Press(0x70, 0);
        UO.Print("Zero count sends no key");
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.Press(key) โ€” UO.Press(Integer)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void Press(int key) => KeyPress(key);

UO.Press(key, count) โ€” UO.Press(Integer,Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: key (Integer), count (Integer)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void Press(int key, int count) => KeyPress(key, count);

UO.Press(key, count, delay) โ€” UO.Press(Integer,Integer,Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: key (Integer), count (Integer), delay (Integer)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void Press(int key, int count, int delay) => KeyPress(key, count, delay);

UO.RClick

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

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

void UO.RClick(object? x, object? y);

๋‹จ์ผ ๋งˆ์šฐ์Šค ํด๋ฆญ์„ ํ•ฉ์„ฑํ•ฉ๋‹ˆ๋‹ค: ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ.

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

  • x - int X ์ฐฝ ํ”ฝ์…€ ClassicUO, ์„ธ๊ณ„ ์ขŒํ‘œ ์•„๋‹˜.
  • y - int Y ์ฐฝ ํ”ฝ์…€ ClassicUO, ์„ธ๊ณ„ ์ขŒํ‘œ ์•„๋‹˜.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ๋ธŒ๋ฆฌ์ง€๋Š” WarpMouse(x,y)๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  Mouse.Position ๋ฐ SDL_WarpMouseInWindow๋ฅผ ์—…๋ฐ์ดํŠธํ•œ ๋‹ค์Œ MouseButton ์•„๋ž˜/์œ„๋กœ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ ํด๋ฆญ ์‚ฌ์ด์—๋Š” ์ผ์‹œ ์ค‘์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ž…๋ ฅ ํฌ์ปค์Šค๊ฐ€ ์žˆ๋Š” ์—ด๋ฆฐ ClassicUO ๊ทธ๋ž˜ํ”ฝ ์ฐฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด RequireGameInput๊ฐ€ InvalidOperationException์„ ๋˜์ง‘๋‹ˆ๋‹ค. user32 mouse_event๋Š” Windows์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์  ์•„๋ž˜์˜ ๋ฒ„ํŠผ/๊ฐœ์ฒด๋Š” ํ˜„์žฌ ์ธํ„ฐํŽ˜์ด์Šค์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.RClick");
UO.RClick(100, 100);

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

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

  • ๋‹จ์ผ ๋งˆ์šฐ์Šค ํด๋ฆญ์„ ํ•ฉ์„ฑํ•ฉ๋‹ˆ๋‹ค: ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ.
UO.RClick(100, 100);

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

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

  • ๋ธŒ๋ฆฌ์ง€๋Š” WarpMouse(x,y)๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  Mouse.Position ๋ฐ SDL_WarpMouseInWindow๋ฅผ ์—…๋ฐ์ดํŠธํ•œ ๋‹ค์Œ MouseButton ์•„๋ž˜/์œ„๋กœ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ ํด๋ฆญ ์‚ฌ์ด์—๋Š” ์ผ์‹œ ์ค‘์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var x = 120;
    var y = 140;
    UO.RClick(x, y);
    return null;
}

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

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

  • ์ž…๋ ฅ ํฌ์ปค์Šค๊ฐ€ ์žˆ๋Š” ์—ด๋ฆฐ ClassicUO ๊ทธ๋ž˜ํ”ฝ ์ฐฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด RequireGameInput๊ฐ€ InvalidOperationException์„ ๋˜์ง‘๋‹ˆ๋‹ค. user32 mouse_event๋Š” Windows์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์  ์•„๋ž˜์˜ ๋ฒ„ํŠผ/๊ฐœ์ฒด๋Š” ํ˜„์žฌ ์ธํ„ฐํŽ˜์ด์Šค์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
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()
    {
        ClickAt(100, 100);
        return null;
    }

    void ClickAt(dynamic x, dynamic y)
    {
        UO.RClick(x, y);
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.RClick(x, y) โ€” UO.RClick(Integer,Integer)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void RClick(int x, int y) => bridge.RClick(x, y);

UO.RDblClick

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

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

void UO.RDblClick(object? x, object? y);

๋”๋ธ” ๋งˆ์šฐ์Šค ํด๋ฆญ์„ ํ•ฉ์„ฑํ•ฉ๋‹ˆ๋‹ค: ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ.

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

  • x - int X ์ฐฝ ํ”ฝ์…€ ClassicUO, ์„ธ๊ณ„ ์ขŒํ‘œ ์•„๋‹˜.
  • y - int Y ์ฐฝ ํ”ฝ์…€ ClassicUO, ์„ธ๊ณ„ ์ขŒํ‘œ ์•„๋‹˜.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ๋ธŒ๋ฆฌ์ง€๋Š” WarpMouse(x,y)๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  Mouse.Position ๋ฐ SDL_WarpMouseInWindow๋ฅผ ์—…๋ฐ์ดํŠธํ•œ ๋‹ค์Œ MouseButton ์•„๋ž˜/์œ„๋ฅผ ๋‘ ๋ฒˆ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ ํด๋ฆญ ์‚ฌ์ด์—๋Š” ์ผ์‹œ ์ค‘์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ž…๋ ฅ ํฌ์ปค์Šค๊ฐ€ ์žˆ๋Š” ์—ด๋ฆฐ ClassicUO ๊ทธ๋ž˜ํ”ฝ ์ฐฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด RequireGameInput๊ฐ€ InvalidOperationException์„ ๋˜์ง‘๋‹ˆ๋‹ค. user32 mouse_event๋Š” Windows์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์  ์•„๋ž˜์˜ ๋ฒ„ํŠผ/๊ฐœ์ฒด๋Š” ํ˜„์žฌ ์ธํ„ฐํŽ˜์ด์Šค์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.RDblClick");
UO.RDblClick(100, 100);

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

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

  • ๋”๋ธ” ๋งˆ์šฐ์Šค ํด๋ฆญ์„ ํ•ฉ์„ฑํ•ฉ๋‹ˆ๋‹ค: ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ.
UO.RDblClick(100, 100);

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

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

  • ๋ธŒ๋ฆฌ์ง€๋Š” WarpMouse(x,y)๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  Mouse.Position ๋ฐ SDL_WarpMouseInWindow๋ฅผ ์—…๋ฐ์ดํŠธํ•œ ๋‹ค์Œ MouseButton ์•„๋ž˜/์œ„๋ฅผ ๋‘ ๋ฒˆ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ ํด๋ฆญ ์‚ฌ์ด์—๋Š” ์ผ์‹œ ์ค‘์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var x = 120;
    var y = 140;
    UO.RDblClick(x, y);
    return null;
}

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

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

  • ์ž…๋ ฅ ํฌ์ปค์Šค๊ฐ€ ์žˆ๋Š” ์—ด๋ฆฐ ClassicUO ๊ทธ๋ž˜ํ”ฝ ์ฐฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด RequireGameInput๊ฐ€ InvalidOperationException์„ ๋˜์ง‘๋‹ˆ๋‹ค. user32 mouse_event๋Š” Windows์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์  ์•„๋ž˜์˜ ๋ฒ„ํŠผ/๊ฐœ์ฒด๋Š” ํ˜„์žฌ ์ธํ„ฐํŽ˜์ด์Šค์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
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()
    {
        ClickAt(100, 100);
        return null;
    }

    void ClickAt(dynamic x, dynamic y)
    {
        UO.RDblClick(x, y);
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.RDblClick(x, y) โ€” UO.RDblClick(Integer,Integer)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void RDblClick(int x, int y) => bridge.RDblClick(x, y);
โš ๏ธ **GitHub.com Fallback** โš ๏ธ