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

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

ํด๋ผ์ด์–ธํŠธ UI

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

๋ฉ”์‹œ์ง€, ์„œ๋น„์Šค ์ฐฝ, ๊ฐœ์ฒด ํ‘œ์‹œ ๋ฐ ์—ด๊ธฐ IDE๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„๋Š” ์„œ๋ฒ„์— ์Œ์„ฑ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์„น์…˜

์ฃผ์ œ ๋ช…๋ น ๋ฐ ์„ค๋ช…
Print UO.Print
ClientPrint UO.ClientPrint
Info Window UO.FillInfoWindow ยท UO.ClearInfoWindow ยท UO.FillNewWindow
Text Window UO.TextOpen ยท UO.TextPrint ยท UO.TextClear ยท UO.TextClose
๋‹จ์ˆœ๊ฒ€ํ”„ UO.CloseSimpleGump
Close UI Window UO.CloseClientUIWindow
Circle Transparency UO.CircleTrans
Show Z UO.SetShowZ
Open IDE UO.OpenIDE

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

๋ฉ”์‹œ์ง€

UO.Print ยท UO.ClientPrint ยท UO.ClientPrintEx ยท UO.CharPrint ยท UO.ColorPrint ยท UO.ConsolePrint ยท UO.ServerPrint ยท UO.SetSilentMode ยท UO.ConColor ยท UO.FontColor

์œˆ๋„์šฐ

UO.ClearInfoWindow ยท UO.FillInfoWindow ยท UO.FillNewWindow ยท UO.TextOpen ยท UO.TextClear ยท UO.TextClose ยท UO.TextPrint ยท UO.CloseSimpleGump ยท UO.CloseClientUIWindow ยท UO.ShowJournal ยท UO.OpenIDE ยท UO.HelpRequest ยท UO.ActivateHandle ยท UO.CloseHandle ยท UO.Snap

๊ฐ์ฒด ํ‘œ์‹œ

UO.Hide ยท UO.ClientHide ยท UO.ClientMarkChar ยท UO.CircleTrans ยท UO.SetShowZ ยท UO.Morph

ํ”ผ๊ทœ์–ด

UO.AddFigure ยท UO.UpdateFigure ยท UO.RemoveFigure ยท UO.ClearFigures

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

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

UO.Print

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

var processed = 12;
UO.Print("Processed item entries: " + Convert.ToString(processed), 0x0044);

UO.FillInfoWindow

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

UO.FillInfoWindow("Status ready");

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


UO.ActivateHandle

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

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

void UO.ActivateHandle();

Windows/SDL์— ํ˜„์žฌ ํด๋ผ์ด์–ธํŠธ ์ฐฝ์„ ์•ž์œผ๋กœ ๊ฐ€์ ธ์˜ค๋„๋ก ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ๋…ผ์Ÿ์ด๋‚˜ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์•„์ดํ…œ, ์Šคํ‚ฌ ๋˜๋Š” ๋Œ€์ƒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•„๋‹Œ ์ฐฝ ๋ช…๋ น์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ์ดˆ์ ์€ ์ฐฝ ์‹œ์Šคํ…œ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

void. ํ˜ธ์ถœ์€ ์ฐฝ ํ™œ์„ฑํ™”๋งŒ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์œˆ๋„์šฐ ์‹œ์Šคํ…œ์ด ๊ทธ๊ฒƒ์„ ํฌ๊ทธ๋ผ์šด๋“œ๋กœ ๊ฐ€์ ธ์˜จ ๊ฒƒ์„ ์ธ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

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

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

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

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

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

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

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

1. ํด๋ผ์ด์–ธํŠธ ์ฐฝ์„ ์ „๊ฒฝ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋„๋ก ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ํด๋ผ์ด์–ธํŠธ ์ฐฝ์„ ์ „๊ฒฝ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋„๋ก ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
UO.ActivateHandle();

2. ๊ฒŒ์ž„์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์ „์— ์ฐฝ ํฌ์ปค์Šค๋ฅผ ์š”์ฒญํ•˜์ง€ ๋งˆ์„ธ์š”. - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๊ฒŒ์ž„์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์ „์— ์ฐฝ ํฌ์ปค์Šค๋ฅผ ์š”์ฒญํ•˜์ง€ ๋งˆ์„ธ์š”.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Connected()))
    {
        UO.ActivateHandle();
    }

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

    void RunAction()
    {
        UO.ActivateHandle();
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.ActivateHandle() โ€” UO.ActivateHandle()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void ActivateHandle() => bridge.ActivateHandle();

UO.AddFigure

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

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

dynamic UO.AddFigure(object? figure);

ClassicUO ์„ธ๊ณ„ ์ง€๋„์— ์ง€์—ญ ๊ทธ๋ฆผ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ํ•ด๋‹น ID๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์น˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก์— ์ €์žฅ๋˜๋ฉฐ ๊ฒŒ์ž„ ์„œ๋ฒ„์—๋Š” ํ†ต๋ณด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๋ฐ˜ํ™˜๊ฐ’

int๋Š” ์ถ”๊ฐ€๋œ ์ˆ˜์น˜์˜ ์–‘์ˆ˜ ID์ž…๋‹ˆ๋‹ค. 0 ๋„ํ˜• ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š๊ฑฐ๋‚˜ ์นด๋“œ๊ฐ€ ์ถ”๊ฐ€๋ฅผ ๊ฑฐ๋ถ€ํ•˜๋ฉด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ˆ˜์‹ ๋œ ID๋ฅผ UO.UpdateFigure ๋˜๋Š” UO.RemoveFigure๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • WorldMapGump์— ๋Œ€ํ•œ ๋กœ์ปฌ ๊ทธ๋ฆผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์„ , ํƒ€์›, ์ง์‚ฌ๊ฐํ˜•, ๋ฐฉํ–ฅ ํ™”์‚ดํ‘œ ๋ฐ ํ…์ŠคํŠธ๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค. fcWorld ์ขŒํ‘œ๋Š” ์ง€๋„ ๋ณ€ํ™˜ ๋ฐ ์ถ•์ฒ™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. fcScreen๋Š” ์ง€๋„ ์ฐฝ์„ ๊ธฐ์ค€์œผ๋กœ ์ธก์ •๋ฉ๋‹ˆ๋‹ค. ์„ ํƒํ•œ ๋ฉด์˜ ๋ชจ์–‘์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋ฐฐ์—ด ํ˜•์‹: [kind, coord, x1, y1, x2, y2, brushColor, brushStyle, color, worldNum, text]. kind: 0 ์„ , 1 ํƒ€์›, 2 ์ง์‚ฌ๊ฐํ˜•, 3 ๋ฐฉํ–ฅ ํ™”์‚ดํ‘œ, 4 ํ…์ŠคํŠธ. coord: 0 world, 1 ํ™”๋ฉด. color๋Š” Delphi TColor(0x00BBGGRR) ๋ฐ”์ดํŠธ ์ˆœ์„œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„ธ๊ณ„ ์ขŒํ‘œ์™€ x2=0,y2=0๊ฐ€ ์žˆ๋Š” ํ™”์‚ดํ‘œ์˜ ๊ฒฝ์šฐ ์‹œ์ž‘์ ์€ ํ˜„์žฌ ๋ฌธ์ž์ž…๋‹ˆ๋‹ค. ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ๊ธฐ์กด brushColor ๋ฐ brushStyle๊ฐ€ ์ฑ„ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ์  ์Œ์˜์€ Delphi์™€์˜ ์™„์ „ํ•œ ์ผ์น˜๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆผ์€ ์‚ญ์ œ/์ œ๊ฑฐ๋˜๊ฑฐ๋‚˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ํด๋ผ์ด์–ธํŠธ ์ปฌ๋ ‰์…˜์— ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒจ์‹ฏ์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋‹ค๋ฅธ ํŒจ์‹ฏ์— ์†ํ•œ ์ˆ˜์น˜๋งŒ ์ˆจ๊ฒจ์ง‘๋‹ˆ๋‹ค.

  • ์ตœ์†Œ 9 ํ•„๋“œ๊ฐ€ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. worldNum๊ฐ€ ์—†์œผ๋ฉด ํ˜„์žฌ ์นด๋“œ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ…์ŠคํŠธ๊ฐ€ ์—†์œผ๋ฉด ๋นˆ ๋ฌธ์ž์—ด์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ข…๋ฅ˜๋Š” 0..4, coord - 0..1๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์˜๋ฏธ๋Š” 0์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์Œ์ˆ˜ worldNum๋Š” ๋ชจ๋“  ํŒจ์‹ฏ์— ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ID ์นด์šดํ„ฐ๋Š” SetYokoMapFigure๊ฐ€ ํ™•์ธ๋˜๊ธฐ ์ „์— ์ฆ๊ฐ€ํ•˜๋ฏ€๋กœ ๊ฑฐ๋ถ€๋œ ๋ถ€๋ถ„์ด ID์— ๊ณต๋ฐฑ์„ ๋‚จ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์ง‘ WorldMapGump ์ •์  ์ง„ํ–‰ ์ค‘; ํ•œ ๊ด€๋ฆฌ์ž์˜ ์ผ๋ฐ˜ ์Šคํฌ๋ฆฝํŠธ๋Š” ๊ณตํ†ต ์˜๊ตฌ ๋Ÿฐํƒ€์ž„ ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • brushColor ๋ฐ brushStyle๋Š” ํ•ญ๋ชฉ์— ์ €์žฅ๋˜์ง€๋งŒ ํ˜„์žฌ ๋ Œ๋”๋Ÿฌ์—์„œ๋Š” ์ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ ๊ณผ ์ง์‚ฌ๊ฐํ˜•์€ ์œค๊ณฝ์„ ์œผ๋กœ ๊ทธ๋ ค์ง‘๋‹ˆ๋‹ค. ํƒ€์›์€ 32 ์„ธ๊ทธ๋จผํŠธ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ…์ŠคํŠธ ์„œ๋ช…์€ kind=4;์— ๋Œ€ํ•ด์„œ๋งŒ ๊ทธ๋ ค์ง‘๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ข…๋ฅ˜๋Š” ์ถœ๋ ฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒ‰์ƒ์€ COLORREF 0x00BBGGRR ํ˜•์‹์œผ๋กœ ์œค๊ณฝ์„ ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

object? result = UO.AddFigure(new object?[] { 0, 0, UO.X(), UO.Y(), UO.X() + 3, UO.Y(), 0, 0, 255 });
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ๊ฒŒ์ž„ ๋งต์˜ ๋นจ๊ฐ„์ƒ‰ ์ง์‚ฌ๊ฐํ˜• ์œค๊ณฝ์„  - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • kind=2 ๋นจ๊ฐ„์ƒ‰ ์œค๊ณฝ์„ ์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. ๊ฐ’์ด Area์ธ ํ…์ŠคํŠธ ํ•„๋“œ๊ฐ€ ์ €์žฅ๋˜์ง€๋งŒ ์ด ์ข…๋ฅ˜์˜ ๊ฒฝ์šฐ ๋ ˆ์ด๋ธ”์ด ๊ทธ๋ ค์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ…์ŠคํŠธ๋Š” kind=4๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
dynamic[] fig = new dynamic[checked((int)(11) + 1)];
fig[0] = 2;
fig[1] = 0;
fig[2] = UO.GetX("self")-3;
fig[3] = UO.GetY("self")-3;
fig[4] = UO.GetX("self")+3;
fig[5] = UO.GetY("self")+3;
fig[6] = 0;
fig[7] = 1;
fig[8] = 255;
fig[9] = UO.WorldNum();
fig[10] = "Area";
var figureId = UO.AddFigure(fig);

2. ์บ๋ฆญํ„ฐ์—์„œ ๊ฒŒ์ž„ ๋งต์˜ ํ•œ ์ง€์ ์œผ๋กœ์˜ ํ™”์‚ดํ‘œ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • world ์ขŒํ‘œ ๋ฐ x2=0,y2=0๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ™”์‚ดํ‘œ์˜ ์›์ ์€ ๊ทธ๋ฆด ๋•Œ ์บ๋ฆญํ„ฐ์˜ ์œ„์น˜์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. kind=3์— ๋Œ€ํ•ด East ๊ฐ’์ด ์žˆ๋Š” ํ…์ŠคํŠธ๋Š” ์ถœ๋ ฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    dynamic[] dirFig = new dynamic[checked((int)(11) + 1)];
    dirFig[0] = 3;
    dirFig[1] = 0;
    dirFig[2] = UO.GetX("self") + 10;
    dirFig[3] = UO.GetY("self");
    dirFig[4] = 0;
    dirFig[5] = 0;
    dirFig[6] = 0;
    dirFig[7] = 1;
    dirFig[8] = 65280;
    dirFig[9] = UO.WorldNum();
    dirFig[10] = "East";
    var arrowId = UO.AddFigure(dirFig);
    return null;
}

3. ํ˜„์žฌ ํŒจ์‹ฏ์˜ ๋‘ ์  ์‚ฌ์ด์— ํŒŒ๋ž€์ƒ‰ ์„ ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ํ˜„์žฌ ํŒจ์‹ฏ์˜ ๋‘ ์  ์‚ฌ์ด์— ํŒŒ๋ž€์ƒ‰ ์„ ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        dynamic[] lineFig = new dynamic[checked((int)(11) + 1)];
        lineFig[0] = 0;
        lineFig[1] = 0;
        lineFig[2] = UO.GetX("self");
        lineFig[3] = UO.GetY("self");
        lineFig[4] = UO.GetX("self") + 8;
        lineFig[5] = UO.GetY("self");
        lineFig[6] = 0;
        lineFig[7] = 1;
        lineFig[8] = 16711680;
        lineFig[9] = UO.WorldNum();
        lineFig[10] = "";
        var lineId = UO.AddFigure(lineFig);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.AddFigure(figure) โ€” UO.AddFigure(Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "addfigure":

                {

                    if (!TryMapFigureArg(0, out int[] figure, out string figureText))

                        return InjectionValue.Zero;

                    int id = state.NextMapFigureId++;

                    if (bridge.SetMapFigure(id, figure[0], figure[1], figure[2], figure[3], figure[4], figure[5], figure[6], figure[7], figure[8], figure[9], figureText) == 0)

                        return InjectionValue.Zero;

                    state.MapFigures[id] = SerializeMapFigure(figure, figureText);

                    return new InjectionValue(id);

                }

UO.CharPrint

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

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

void UO.CharPrint(object? color, object? msg);
void UO.CharPrint(object? id, object? color, object? msg);

๋กœ๋“œ๋œ ๊ฐœ์ฒด ์œ„์— ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ํ‘œ์‹œ๋˜๋Š” ๋น„๋ฌธ(์˜ˆ: ์„ ํƒํ•œ ๋Œ€์ƒ์˜ ํ‘œ์‹œ ๋˜๋Š” ์บ๋ฆญํ„ฐ ์œ„์˜ ๊ฒฝ๊ณ )์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์บ๋ฆญํ„ฐ์˜ ๋ง์ด๋‚˜ ๊ฒŒ์ž„์ฐฝ ํ•˜๋‹จ์˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

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

  • id๋Š” graphic/type ๋˜๋Š” ์ขŒํ‘œ๊ฐ€ ์•„๋‹Œ ๊ฐ์ฒด์˜ ์ผ๋ จ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค. 3์ธ์ˆ˜ ํ˜•์‹์˜ UO.CharPrint์€ self, lasttarget ๋ฐ ์ €์žฅ๋œ ๊ฐœ์ฒด ์ด๋ฆ„๋„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. UO.ClientPrintEx์˜ SenderID์—๋Š” UO.Hex2Int(UO.GetSerial("self")์™€ ๊ฐ™์€ ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋ฌธ์ž์—ด ๋ณ„์นญ์€ ๊ฐœ์ฒด๋กœ ํ™•์ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • color๋Š” UO hue์ด๊ณ , RGB๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์ˆซ์ž์˜ ์ตœํ•˜์œ„ 16 ๋น„ํŠธ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. 0x0044๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. -1์€ "๋ชจ๋“  ์ƒ‰์ƒ"์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ 0xFFFF์ด ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ConColor ์ƒ‰์ƒ์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ๊ฐœ์ฒด๋Š” ๋กœ๋“œ๋œ ์„ธ๊ณ„์— ์กด์žฌํ•ด์•ผ ํ•˜๋ฉฐ ์‚ญ์ œ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋นˆ ํ…์ŠคํŠธ๋‚˜ ๋ˆ„๋ฝ๋œ ๋Œ€์ƒ์€ ๊ทธ๋ ค์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์„œ๋ฒ„์—์„œ ๊ฐœ์ฒด๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์™€ ๋‹ค๋ฅธ ํ”Œ๋ ˆ์ด์–ด๋Š” ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์ฐฝ์ด ์—†์œผ๋ฉด ์„ธ๊ณ„์—์„œ ๋น„๋ฌธ์„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ด€๋ฆฌ์ž์˜ syslog๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • UO.CharPrint(color, msg)๋Š” ์ž์‹ ์˜ ์บ๋ฆญํ„ฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. UO.CharPrint(id, color, msg)๋Š” ์ง€์ •๋œ ๊ฐœ์ฒด๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋‘ ํ˜•์‹ ๋ชจ๋‘ 3 ๊ธ€๊ผด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. UO.ClientPrintEx์—๋Š” SenderID, Color, Font, Text ์ˆœ์„œ๋กœ ๋„ค ๊ฐ€์ง€ ์ธ์ˆ˜๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธ€๊ผด ๋ฒˆํ˜ธ๋Š” ํฌ์ธํŠธ ํฌ๊ธฐ๋‚˜ Windows ๊ธ€๊ผด ์ด๋ฆ„์ด ์•„๋‹Œ UO์ž…๋‹ˆ๋‹ค. ์ˆซ์ž๋Š” 0..255 ๋ฒ”์œ„๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ํŠน์ • ๊ธ€๊ผด์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋Š” ๊ฒŒ์ž„ ํŒŒ์ผ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์˜ˆ์—์„œ 3๋Š” ์ผ๋ฐ˜ ๊ธ€๊ผด ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.
  • GetSerial๋Š” 16์ง„์ˆ˜ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Hex2Int๋Š” ์ˆซ์ž 0์™€ ๋น„๊ตํ•˜๊ธฐ ์ „์— int๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด "0x00000000"์€ ์ˆซ์ž 0๋กœ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • UO.Print ยท UO.CharPrint ยท UO.ClientPrintEx ยท UO.AddToSystemJournalEx

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

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

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

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

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

UO.Print("Calling UO.CharPrint");
UO.CharPrint(0x0044, "Ready");

1. UO.CharPrint - 1 - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ฒซ ๋ฒˆ์งธ ํ˜•์‹ CharPrint๋Š” ํ•ด๋‹น ๋ฌธ์ž ์œ„์— Ready๋ฅผ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ClientPrintEx๋Š” UO.Hex2Int(UO.GetSerial("self")๋ฅผ ํ†ตํ•ด serial๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ํ•ด๋‹น ๊ธ€๊ผด์„ ๋ช…์‹œ์ ์œผ๋กœ 3์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋น„๋ฌธ์—๋Š” ๊ฒŒ์ž„ ๋ชจ๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • GetSerial๋Š” 16์ง„์ˆ˜ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Hex2Int๋Š” ์ˆซ์ž 0์™€ ๋น„๊ตํ•˜๊ธฐ ์ „์— int๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด "0x00000000"์€ ์ˆซ์ž 0๋กœ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
UO.CharPrint(0x0044, "Ready");

2. UO.CharPrint โ€” 2 โ€” ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • target โ€” ๋งˆ์ง€๋ง‰ ํƒ€๊ฒŸ์˜ serial. 0์€ ์ด ์˜ˆ์—์„œ ํƒœ๊ทธํ•  ์‚ฌ๋žŒ์ด ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ๋œ ๋Œ€์ƒ - ๋กœ์ปฌ ์„œ๋ช…๋งŒ: ๋Œ€์ƒ์€ ๊ณต๊ฒฉ๋ฐ›์ง€ ์•Š์œผ๋ฉฐ ํ™œ์„ฑ ์„œ๋ฒ„ ๋Œ€์ƒ์€ ์ฑ„์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • GetSerial๋Š” 16์ง„์ˆ˜ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Hex2Int๋Š” ์ˆซ์ž 0์™€ ๋น„๊ตํ•˜๊ธฐ ์ „์— int๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด "0x00000000"์€ ์ˆซ์ž 0๋กœ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.Hex2Int(UO.GetSerial("lasttarget"));
    if (Truth(target != 0))
    {
        UO.CharPrint(target, 0x0044, "Selected 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. UO.CharPrint - 3 - ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์—…

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

  • ShowWeightWarning๋Š” ์•„๋ž˜์— ์ „์ฒด ์„ ์–ธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋…€๋Š” ์ฒด์ค‘์„ ์•Œ๋ ค์ง„ ์–‘์˜ ํ•œ๊ณ„์™€ ๋น„๊ตํ•˜๊ณ  ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฐ ๊ฒฝ์šฐ์—๋งŒ ์บ๋ฆญํ„ฐ ์œ„์— ๊ธ€์„ ์”๋‹ˆ๋‹ค. ์•„๋ฌด๊ฒƒ๋„ ๋ฒ„๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Convert.ToString๋Š” ๊ฐ€์ค‘์น˜๋ฅผ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • GetSerial๋Š” 16์ง„์ˆ˜ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Hex2Int๋Š” ์ˆซ์ž 0์™€ ๋น„๊ตํ•˜๊ธฐ ์ „์— int๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด "0x00000000"์€ ์ˆซ์ž 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()
    {
        ShowWeightWarning(UO.Weight(), UO.MaxWeight());
        return null;
    }

    void ShowWeightWarning(dynamic weight, dynamic maximum)
    {
        if (Truth(maximum > 0) && Truth(weight >= maximum))
        {
            UO.CharPrint(UO.Hex2Int(UO.GetSerial("self")), 0x0044, "Too heavy: " + Convert.ToString(weight));
        }
    }

    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.CharPrint(color, msg) โ€” UO.CharPrint(Integer,String)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void CharPrint(int color, string msg) => CharPrint(bridge.Self, color, msg);

UO.CharPrint(color, msg) โ€” UO.CharPrint(String,String)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void CharPrint(string color, string msg) => CharPrint(bridge.Self, NumberConversions.ToInt(color), msg);

UO.CharPrint(id, color, msg) โ€” UO.CharPrint(Any,Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void CharPrint(InjectionValue id, InjectionValue color, InjectionValue msg) 

            => CharPrint(GetObject(id), NumberConversions.ToInt(color), (string)msg);

UO.CharPrint(id, color, msg) โ€” UO.CharPrint(Integer,Integer,String)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void CharPrint(int id, int color, string msg) => bridge.CharPrint(id, color, msg);

UO.CircleTrans

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

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

int UO.CircleTrans();
void UO.CircleTrans(object? enabled);

ํ™œ์„ฑ ํ”„๋กœํ•„์˜ ํˆฌ๋ช…๋„ ์› ์„ค์ •์„ ์ฝ๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

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

  • enabled - int: 0 ๋น„ํ™œ์„ฑํ™”, 0์ด ์•„๋‹Œ ๊ฐ’์€ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ์„ค์ •์€ ์ฝ๊ธฐ ์ „์šฉ์ž…๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

์ธ์ˆ˜ ์—†์Œ int 1/0; ์ธ์ˆ˜๊ฐ€ ์žˆ๋Š” ์–‘์‹์€ null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ํ”„๋กœํ•„ ์—†์ด ์ฝ์œผ๋ฉด 0์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœํ•„์ด ์—†๋Š” ํ•ญ๋ชฉ์€ ์˜ค๋ฅ˜๋ฅผ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœํ•„์ด ์žˆ์œผ๋ฉด UseCircleOfTransparency๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ํ”„๋กœํ•„์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์‹œ๊ฐ์  ์‚ฌ์šฉ์ž ์ •์˜์ž…๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ์ฝ์–ด๋„ ํ”„๋กœํ•„์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var enabled = UO.CircleTrans();
UO.Print(Convert.ToString(enabled));

2. ํˆฌ๋ช…๋„ ํ™œ์„ฑํ™” - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋…น์Œ ์‹œ ํˆฌ๋ช…๋„ ์›์ด ์ผœ์ง„ ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.CircleTrans(1);
    return null;
}

3. ์ด์ „ ๊ฐ’ ๋ณต์› - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ž„์‹œ ์„ค์ • ๋ณ€๊ฒฝ ํ›„ ์ €์žฅ๋œ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ณต์›๋ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var previous = UO.CircleTrans();
        UO.CircleTrans(0);
        UO.CircleTrans(previous);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.CircleTrans() โ€” UO.CircleTrans()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

UO.CircleTrans(enabled) โ€” UO.CircleTrans(Integer)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void CircleTrans(int enabled) => bridge.CircleTrans(enabled);

UO.ClearFigures

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

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

void UO.ClearFigures();

๋ชจ๋“  ์‚ฌ์šฉ์ž ์ •์˜ ์ง€๋„ ๋ชจ์–‘๊ณผ ํ•ด๋‹น ๋Ÿฐํƒ€์ž„ ํ•ญ๋ชฉ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • WorldMapGump.ClearYokoMapFigures ๋ฐ ์ƒํƒœ.MapFigures๋ฅผ ์ง€์›๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ง€๋„์™€ UserStatics๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ClearYokoMapFigures๋Š” ์ง„ํ–‰ ์ค‘์ธ WorldMapGump์˜ ์ •์  ์ˆ˜์ง‘์„ ์ง€์šด ๋‹ค์Œ, ๋ช…๋ น์€ MapFigures์˜ ๋Ÿฐํƒ€์ž„ ์ƒํƒœ๋ฅผ ์ง€์›๋‹ˆ๋‹ค. ์ด ์ •๋ฆฌ ๋ฒ”์œ„๋Š” ํ˜ธ์ถœ ์Šคํฌ๋ฆฝํŠธ์˜ ์ด๋ฆ„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ „์ฒด ํด๋ผ์ด์–ธํŠธ ์ปฌ๋ ‰์…˜์— ์˜ํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ๋งž์ถค ์ง€๋„ ๋ผ๋ฒจ(userMarkers.usr)์€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ƒํƒœ ์ง€์šฐ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ •์˜ ์ง€๋„ ๋ชจ์–‘๊ณผ ํ•ด๋‹น ๋Ÿฐํƒ€์ž„ ํ•ญ๋ชฉ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
UO.ClearFigures();

2. ์„ค์ • ํ›„ ์ง€์šฐ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ํ˜„์žฌ ์ง€๋„์— ๋Œ€ํ•œ ๋กœ์ปฌ ๋ชจ์–‘์„ ๋งŒ๋“  ๋‹ค์Œ ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ •์˜ ๋ชจ์–‘์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    dynamic[] figure = new dynamic[checked((int)(9) + 1)];
    figure[0] = 0;
    figure[1] = 0;
    figure[2] = UO.GetX();
    figure[3] = UO.GetY();
    figure[4] = figure[2] + 1;
    figure[5] = figure[3] + 1;
    figure[6] = 0;
    figure[7] = 0;
    figure[8] = 0;
    figure[9] = UO.WorldNum();
    var figureId = UO.AddFigure(figure);
    UO.ClearFigures();
    return null;
}

3. ์žฌ์ œ๊ฑฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

     public object? RunScenario()
    {
        UO.ClearFigures();
        UO.ClearFigures();
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.ClearFigures() โ€” UO.ClearFigures()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "clearfigures":

                    bridge.ClearMapFigures();

                    state.MapFigures.Clear();

                    return InjectionValue.Unit;

UO.ClearInfoWindow

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

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

void UO.ClearInfoWindow();

ํด๋ผ์ด์–ธํŠธ ํ…์ŠคํŠธ ์ฐฝ์˜ ์ค„์„ ์ง€์›๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • TextClear ๋ฒ„ํผ๋ฅผ ์ง€์›๋‹ˆ๋‹ค. ์ฐฝ์ด ์—ด๋ ค ์žˆ์œผ๋ฉด ๋นˆ ๋‚ด์šฉ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์ฐฝ์ด ๋ฐ˜๋“œ์‹œ ๋‹ซํžˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ƒํƒœ ์ง€์šฐ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ํด๋ผ์ด์–ธํŠธ ํ…์ŠคํŠธ ์ฐฝ์˜ ์ค„์„ ์ง€์›๋‹ˆ๋‹ค.
UO.ClearInfoWindow();

2. ์„ค์ • ํ›„ ์ง€์šฐ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ด์ „์— ์ถ”๊ฐ€ํ•œ ํ…์ŠคํŠธ ์ฐฝ ์ค„์„ ์ง€์›๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.FillInfoWindow("status");
    UO.ClearInfoWindow();
    return null;
}

3. ์žฌ์ œ๊ฑฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

     public object? RunScenario()
    {
        UO.ClearInfoWindow();
        UO.ClearInfoWindow();
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.ClearInfoWindow() โ€” UO.ClearInfoWindow()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "clearinfowindow": bridge.TextClear(); return InjectionValue.Unit;

UO.ClientHide

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

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

dynamic UO.ClientHide(object? objID);

serial ๋กœ๋“œ๋œ ์•„์ดํ…œ์ด๋‚˜ ClassicUO ๋””์Šคํ”Œ๋ ˆ์ด์˜ ๊ธฐํƒ€ ์บ๋ฆญํ„ฐ(์ปจํ…Œ์ด๋„ˆ, ์ข…์ด์ธํ˜•, ์žฅ์ฐฉ๋œ ์•„์ดํ…œ ํฌํ•จ)๋ฅผ ์ˆจ๊น๋‹ˆ๋‹ค.

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

  • objID โ€” ๋กœ๋“œ๋œ ํŠน์ • ๊ฐ์ฒด์˜ ์ผ๋ จ๋ฒˆํ˜ธ: int ๋˜๋Š” 16์ง„์ˆ˜/10์ง„์ˆ˜ ๋ฌธ์ž์—ด. ์ด๊ฒƒ์€ graphic/type๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ €์žฅ๋œ ์ด๋ฆ„์€ GetSerial(์ด๋ฆ„)์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ด‘๊ฒฝ์€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int 1 ๋ธŒ๋ฆฌ์ง€ ๋ช…๋ น์„ ์ „์†กํ•œ ํ›„. ๊ธฐ๋ก ๊ฒฐ๊ณผ๋Š” ๊ฐ์ฒด์˜ ์กด์žฌ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” serial ๋˜๋Š” self ๋ธŒ๋ฆฌ์ง€์˜ ๊ฒฝ์šฐ์—๋„ ์‹คํŒจ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ๋Ÿฐํƒ€์ž„์€ 1๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์„ ์„ฑ๊ณต์ ์ธ ์ˆจ๊ธฐ๊ธฐ ํ…Œ์ŠคํŠธ๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ํ˜ธํ™˜์„ฑ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์—๋Š” object?๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ์ธ์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์šฐ์Šค๋กœ ์„ ํƒํ•˜๋ ค๋ฉด UO.Hide()๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • Hide(serial)๋Š” ์•Œ๋ ค์ง„ ๋กœ๋“œ๋œ ๊ฐ์ฒด์— ์ฆ‰์‹œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. graphic/type ๋Œ€์‹  ํŠน์ • ์Šคํƒ/ํ•ญ๋ชฉ์˜ serial๋ฅผ ์ „๋‹ฌํ•˜์„ธ์š”. ์„ ํƒํ•œ ์Šคํƒ์€ ์–‘์— ๊ด€๊ณ„์—†์ด ์™„์ „ํžˆ ์ˆจ๊ฒจ์ง‘๋‹ˆ๋‹ค.
  • ํ•ญ๋ชฉ์€ ์ปจํ…Œ์ด๋„ˆ์— ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜๋Ÿ‰, ์†Œ์œ ์ž, ์ฝ˜ํ…์ธ  ๋ฐ ์„œ๋ฒ„ ์ƒํƒœ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. FindType/GetContent์—์„œ๋Š” ์•„์ง ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆจ๊ธฐ๊ธฐ๋Š” ๊ฒ€์ƒ‰ ํ•„ํ„ฐ, ์ด์›”, ์‚ญ์ œ, ์ˆจ๊ธฐ๊ธฐ ์Šคํ‚ฌ ๋˜๋Š” ์„œ๋ฒ„ ์ธก ํˆฌ๋ช…ํ™”๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ์ปจํ…Œ์ด๋„ˆ, ๊ฑฐ๋ž˜ ์ฐฝ ๋ฐ ์ „๋ฆฌํ’ˆ ๊ทธ๋ฆฌ๋“œ๋Š” ์ˆจ๊ฒจ์ง„ ์•„์ดํ…œ์„ ๊ทธ๋ฆฌ์ง€ ์•Š์œผ๋ฉฐ ํด๋ฆญ/๋“œ๋ž˜๊ทธ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋กœ๋“œ๋œ ๊ฐœ์ฒด๊ฐ€ ์‚ฌ์šฉ ์ค‘์ธ ๋™์•ˆ ์ฐฝ์ด ๋‹ค์‹œ ์ž‘์„ฑ๋˜๊ณ  ๋‹ค์‹œ ์—ด๋ฆด ๋•Œ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
  • ์žฅ์ฐฉํ•œ ์•„์ดํ…œ์€ ์ข…์ด์ธํ˜•, ์ž‘์€ ์Šฌ๋กฏ, ์บ๋ฆญํ„ฐ ์ด๋ฏธ์ง€์—์„œ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์žฅ์ฐฉ๋œ ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์˜ ๋ ˆ์ด์–ด, ๊ฐ‘์˜ท ๋ฐ ์ƒํƒœ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ˆจ๊ฒจ์ง„ ๊ฐ€์šด์ด ๋” ์ด์ƒ ์†์˜ท๊ณผ ๊ฒน์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž์˜ ์บ๋ฆญํ„ฐ ์ด๋ฏธ์ง€๋Š” ๋™์ผํ•œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์žฅ๋น„ ๋ชฉ๋ก์€ ๊ณ„์† ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • Hide๋Š” ์ž์‹ ์˜ ์บ๋ฆญํ„ฐ, ํ† ์ง€, ์ •์ ์„ ์ˆจ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์กด์žฌํ•˜์ง€ ์•Š๋Š” serial๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋ฐฉ ์ž์ฒด๋ฅผ ์ˆจ๊ฒจ๋„ ์ด๋ฏธ ์—ด๋ ค ์žˆ๋Š” ์ฝ˜ํ…์ธ  ์ฐฝ์€ ๋‹ซํžˆ์ง€ ์•Š์œผ๋ฉฐ, ํฌํ•จ๋œ ๊ฐ ํ•ญ๋ชฉ์ด ์ž๋™์œผ๋กœ ์ˆจ๊ฒจ์ง€์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ˜„์žฌ API์—๋Š” ๋ณ„๋„์˜ ์ˆจ๊ธฐ๊ธฐ ํ•ด์ œ ๋ช…๋ น์ด ์—†์Šต๋‹ˆ๋‹ค. ์ˆจ๊ธฐ๋Š” ๊ฒƒ์€ ๋กœ๋“œ๋œ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค์— ์†ํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์„ธ๊ณ„์—์„œ ์ด๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋‹ค์‹œ ๋กœ๋“œํ•˜๋ฉด(์˜ˆ: ๋‹ค์‹œ ์—ฐ๊ฒฐํ•  ๋•Œ) ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žฌ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์ƒ์ž๋ฅผ ๋‹ซ๊ฑฐ๋‚˜ ์—ฌ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์•„์ดํ…œ ๋ฐ˜ํ™˜์ด ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์•Œ๋ ค์ง„ ID๋กœ ํ•ญ๋ชฉ ์ˆจ๊ธฐ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ObjID๋Š” type๊ฐ€ ์•„๋‹Œ ํŠน์ • ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ๋””์Šคํ”Œ๋ ˆ์ด์—์„œ ์‚ฌ๋ผ์ง€๊ณ  ์ปจํ…Œ์ด๋„ˆ์— ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.
var item = 0x40001234;
if (Truth(UO.Exists(item)))
{
    UO.ClientHide(item);
}

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

2. ๋ฐœ๊ฒฌ๋œ ์Šคํƒ ์ˆจ๊ธฐ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • FindType๋Š” backpack์—์„œ ์›ํ•˜๋Š” ์ƒ‰์ƒ์˜ graphic 0x0EED๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ serial๋Š” ClientHide๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์Šคํƒ์ด ์™„์ „ํžˆ ์ˆจ๊ฒจ์ง‘๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var item = UO.FindType(0x0EED, -1, "backpack");
    if (Truth(item != ""))
    {
        UO.ClientHide(item);
        UO.Print("Amount is still: " + Convert.ToString(UO.GetQuantity(item)));
    }

    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. ๋ช…๋ช…๋œ ๊ฐœ์ฒด ์‚ฌ์šฉ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • GetSerial๋Š” ์ด์ „์— ์ €์žฅ๋œ ์žฅ์‹ ์ด๋ฆ„์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์—ฌ๋Š” ๋“ฑ ๋ฌผํ’ˆ์„ ๋จผ์ € ์ ์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
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 item = UO.GetSerial("decoration");
        if (Truth(UO.Exists(item)) && Truth(item != UO.GetSerial("self")))
        {
            UO.ClientHide(item);
        }

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "clienthide": bridge.ClientHide(Arg(0)); return InjectionValue.True;

UO.ClientMarkChar

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

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

void UO.ClientMarkChar(object? actionIndex, object? id);

ํด๋ผ์ด์–ธํŠธ ๋ผ๋ฒจ LastTarget ๋ฐ/๋˜๋Š” LastAttack์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

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

  • actionIndex - int: 1 - LastTarget; 2 - LastAttack; 3 - ๋‘˜ ๋‹ค. ๋‹ค๋ฅธ ๊ฐ’์€ ์˜ค๋ฅ˜๋ฅผ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค.
  • id โ€” self/backpack/lasttarget/์ €์žฅ๋œ ๊ฐ์ฒด์˜ ๊ฐ์ฒด ์ผ๋ จ๋ฒˆํ˜ธ ๋˜๋Š” ์ง€์›๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ˆซ์ž ๋ฌธ์ž์—ด๊ณผ 0x ๋ฌธ์ž์—ด์€ ๋Ÿฐํƒ€์ž„์— ์˜ํ•ด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ClientMarkChar ์„œ๋ฒ„ ๋Œ€์ƒ์— ๊ณต๊ฒฉ์„ ๋ณด๋‚ด๊ฑฐ๋‚˜ ์‘๋‹ตํ•˜์ง€ ์•Š๊ณ  ์ €์žฅ๋œ ๋Œ€์ƒ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ํ›„์† ๋ช…๋ น์€ ์ƒˆ ๋ ˆ์ด๋ธ”์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.ClientMarkChar");
UO.ClientMarkChar(1, "self");

1. ์—…๋ฐ์ดํŠธ LastTarget - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ €์žฅ๋œ ๋Œ€์ƒ์€ ๋‚˜๋งŒ์˜ ์บ๋ฆญํ„ฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
UO.ClientMarkChar(1,"self");

2. ๋‘ ๋ ˆ์ด๋ธ” ๋ชจ๋‘ ์—…๋ฐ์ดํŠธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ํ›„์ž์˜ ๋Œ€์ƒ์€ ๋‘ ํด๋ผ์ด์–ธํŠธ ํƒœ๊ทธ ๋ชจ๋‘์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.LastTarget();
    if (Truth(UO.Exists(target)))
    {
        UO.ClientMarkChar(3, 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. ์ž˜๋ชป๋œ ์ž‘์—… - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • 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.ClientMarkChar(0, "self");
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.ClientMarkChar(actionIndex, id) โ€” UO.ClientMarkChar(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void ClientMarkChar(InjectionValue actionIndex, InjectionValue id)

            => bridge.ClientMarkChar(NumberConversions.ToInt(actionIndex), GetObject(id));

UO.ClientPrint

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

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

void UO.ClientPrint(object? text);

์Šคํฌ๋ฆฝํŠธ ์ง„ํ–‰ ๋˜๋Š” ์ค‘์ง€ ์กฐ๊ฑด์— ๋Œ€ํ•œ ๋กœ์ปฌ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ ๋‹ค๋ฅธ ํ”Œ๋ ˆ์ด์–ด๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ๋ฉ”์‹œ์ง€๋Š” ๊ฒŒ์ž„์ฐฝ ์ขŒ์ธกํ•˜๋‹จ๊ณผ ๋กœ์ปฌ๋กœ๊ทธ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ IDE์—์„œ ์‚ฌ๋ณธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž์˜ ์ผ๋ฐ˜ ๋กœ๊ทธ์—์„œ ์Šคํฌ๋ฆฝํŠธ ๋ฉ”์‹œ์ง€ ํ•„ํ„ฐ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๊ฒŒ์ž„ ์ฐฝ ์—†์ด ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€ ํ•„ํ„ฐ๋Š” ๊ทธ๋Ÿฌํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ์Œ์„ฑ ํŒจํ‚ท์ด ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋จธ๋ฆฌ ์œ„์˜ ๋น„๋ฌธ์—๋Š” UO.CharPrint์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • UO.Print๋Š” ๊ฒŒ์ž„ ๋ฉ”์‹œ์ง€ ๋กœ๊ทธ์— ์ƒˆ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ์›ํ•˜๋Š” ๊ฒ€์ƒ‰ ๋ฌธ์ž์—ด/๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ €์žฅํ•œ ๋‹ค์Œ ์ง„๋‹จ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๋น ๋ฅธ ๋ฃจํ”„์—์„œ๋Š” ๋ชจ๋“  ๋ฐ˜๋ณต์ด ์•„๋‹Œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•  ๋•Œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„์˜ ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€ ์ƒ‰์ƒ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” 0x0440, ๋ณ€๊ฒฝ๋จ UO.ConColor. ์ด๊ฒƒ์€ ๋กœ์ปฌ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ๋ช…๋ น ์ด๋ฆ„์€ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • UO.Print ยท UO.CharPrint ยท UO.Say ยท UO.ConColor

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

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

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

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

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ด๋ฉฐ ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค(void). ๋ฉ”์‹œ์ง€ ๋‚ด์šฉ์€ ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

UO.ClientPrint("Hello from C#");

1. ๊ฐ„๋žตํ•œ ๋ณด๊ณ ์„œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ฒ˜๋ฆฌ๋จ=12 โ€” ์ด๋ฏธ ์ฒ˜๋ฆฌ๋œ ํ•ญ๋ชฉ์˜ ๋ฐ๋ชจ ์ˆ˜์ž…๋‹ˆ๋‹ค. Convert.ToString๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” ์ˆซ์ž๋งŒ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์ „์†กํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
var processed = 12;
UO.ClientPrint("Processed item entries: " + Convert.ToString(processed));

2. ๊ณผ๋ถ€ํ•˜ ๊ฒฝ๊ณ  - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์บ๋ฆญํ„ฐ์˜ ๋ฌด๊ฒŒ์™€ ์ตœ๋Œ€๊ฐ’์„ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค. 0/์•Œ ์ˆ˜ ์—†๋Š” ์ตœ๋Œ€๊ฐ’์€ ๊ณผ๋ถ€ํ•˜๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌด๊ฒŒ๊ฐ€ ์ตœ๋Œ€๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ํ•œ ์ค„์ด ์ธ์‡„๋˜๊ณ  Main์ด ๋๋‚ฉ๋‹ˆ๋‹ค. ๋ฌผ๊ฑด์€ ๋ฒ„๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var weight = UO.Weight();
    var maximum = UO.MaxWeight();
    if (Truth(maximum > 0) && Truth(weight >= maximum))
    {
        UO.ClientPrint("Too heavy: " + Convert.ToString(weight) + "/" + Convert.ToString(maximum));
        return null;
    }

    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. ์ค‘๋Ÿ‰ ๋ณ€๊ฒฝ๋งŒ ๋ณด๊ณ  - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • Main์€ ๊ฐ€์ค‘์น˜๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  1000 ๋ฐ€๋ฆฌ์ดˆ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ์™„์ „ํžˆ ์„ ์–ธ๋œ ReportWeight๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋ณด์กฐ์ž๋Š” ๋ฌด๊ฒŒ๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ์—๋งŒ ์ธ์‡„ํ•˜๊ณ  ๋‹ค์Œ ์ ๊ฒ€์„ ์œ„ํ•ด ์ƒˆ ๋ฌด๊ฒŒ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ž์ฒด๋กœ๋Š” ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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 previous = UO.Weight();
        UO.Wait(1000);
        previous = ReportWeight(previous, UO.Weight());
        return null;
    }

    dynamic ReportWeight(dynamic previous, dynamic current)
    {
        if (Truth(previous != current))
        {
            UO.ClientPrint("Weight changed: " + Convert.ToString(current));
        }

        return current;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.ClientPrint(text) โ€” UO.ClientPrint(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "addtojournal":

                case "addtosystemjournal":

                case "clientprint":

                    SystemMessage(Text(0)); return InjectionValue.Unit;

UO.ClientPrintEx

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

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

void UO.ClientPrintEx(object? senderID, object? color, object? font, object? text);

๋กœ๋“œ๋œ ๊ฐœ์ฒด ์œ„์— ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ํ‘œ์‹œ๋˜๋Š” ๋น„๋ฌธ(์˜ˆ: ์„ ํƒํ•œ ๋Œ€์ƒ์˜ ํ‘œ์‹œ ๋˜๋Š” ์บ๋ฆญํ„ฐ ์œ„์˜ ๊ฒฝ๊ณ )์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์บ๋ฆญํ„ฐ์˜ ๋ง์ด๋‚˜ ๊ฒŒ์ž„์ฐฝ ํ•˜๋‹จ์˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

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

  • senderID๋Š” graphic/type ๋˜๋Š” ์ขŒํ‘œ๊ฐ€ ์•„๋‹Œ ๊ฐ์ฒด์˜ ์ผ๋ จ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค. 3์ธ์ˆ˜ ํ˜•์‹์˜ UO.CharPrint์€ self, lasttarget ๋ฐ ์ €์žฅ๋œ ๊ฐœ์ฒด ์ด๋ฆ„๋„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. UO.ClientPrintEx์˜ SenderID์—๋Š” UO.Hex2Int(UO.GetSerial("self")์™€ ๊ฐ™์€ ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋ฌธ์ž์—ด ๋ณ„์นญ์€ ๊ฐœ์ฒด๋กœ ํ™•์ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • color๋Š” UO hue์ด๊ณ , RGB๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์ˆซ์ž์˜ ์ตœํ•˜์œ„ 16 ๋น„ํŠธ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. 0x0044๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. -1์€ "๋ชจ๋“  ์ƒ‰์ƒ"์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ 0xFFFF์ด ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ConColor ์ƒ‰์ƒ์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • font โ€” ํฌ์ธํŠธ ํฌ๊ธฐ๋‚˜ Windows ๊ธ€๊ผด ์ด๋ฆ„์ด ์•„๋‹Œ ๊ธ€๊ผด ๋ฒˆํ˜ธ UO. ์ˆซ์ž๋Š” 0..255 ๋ฒ”์œ„๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ํŠน์ • ๊ธ€๊ผด์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋Š” ๊ฒŒ์ž„ ํŒŒ์ผ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์˜ˆ์—์„œ 3๋Š” ์ผ๋ฐ˜ ๊ธ€๊ผด ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ๊ฐœ์ฒด๋Š” ๋กœ๋“œ๋œ ์„ธ๊ณ„์— ์กด์žฌํ•ด์•ผ ํ•˜๋ฉฐ ์‚ญ์ œ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋นˆ ํ…์ŠคํŠธ๋‚˜ ๋ˆ„๋ฝ๋œ ๋Œ€์ƒ์€ ๊ทธ๋ ค์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์„œ๋ฒ„์—์„œ ๊ฐœ์ฒด๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์™€ ๋‹ค๋ฅธ ํ”Œ๋ ˆ์ด์–ด๋Š” ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์ฐฝ์ด ์—†์œผ๋ฉด ์„ธ๊ณ„์—์„œ ๋น„๋ฌธ์„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ด€๋ฆฌ์ž์˜ syslog๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • UO.CharPrint(color, msg)๋Š” ์ž์‹ ์˜ ์บ๋ฆญํ„ฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. UO.CharPrint(id, color, msg)๋Š” ์ง€์ •๋œ ๊ฐœ์ฒด๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋‘ ํ˜•์‹ ๋ชจ๋‘ 3 ๊ธ€๊ผด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. UO.ClientPrintEx์—๋Š” SenderID, Color, Font, Text ์ˆœ์„œ๋กœ ๋„ค ๊ฐ€์ง€ ์ธ์ˆ˜๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธ€๊ผด ๋ฒˆํ˜ธ๋Š” ํฌ์ธํŠธ ํฌ๊ธฐ๋‚˜ Windows ๊ธ€๊ผด ์ด๋ฆ„์ด ์•„๋‹Œ UO์ž…๋‹ˆ๋‹ค. ์ˆซ์ž๋Š” 0..255 ๋ฒ”์œ„๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ํŠน์ • ๊ธ€๊ผด์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋Š” ๊ฒŒ์ž„ ํŒŒ์ผ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์˜ˆ์—์„œ 3๋Š” ์ผ๋ฐ˜ ๊ธ€๊ผด ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.
  • GetSerial๋Š” 16์ง„์ˆ˜ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Hex2Int๋Š” ์ˆซ์ž 0์™€ ๋น„๊ตํ•˜๊ธฐ ์ „์— int๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด "0x00000000"์€ ์ˆซ์ž 0๋กœ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • UO.Print ยท UO.CharPrint ยท UO.ClientPrintEx ยท UO.AddToSystemJournalEx

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

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

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

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

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

UO.Print("Calling UO.ClientPrintEx");
UO.ClientPrintEx(UO.Hex2Int(UO.GetSerial("self")), 0x0044, 3, "Ready");

1. UO.ClientPrintEx - 1 - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ฒซ ๋ฒˆ์งธ ํ˜•์‹ CharPrint๋Š” ํ•ด๋‹น ๋ฌธ์ž ์œ„์— Ready๋ฅผ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ClientPrintEx๋Š” UO.Hex2Int(UO.GetSerial("self")๋ฅผ ํ†ตํ•ด serial๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ํ•ด๋‹น ๊ธ€๊ผด์„ ๋ช…์‹œ์ ์œผ๋กœ 3์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋น„๋ฌธ์—๋Š” ๊ฒŒ์ž„ ๋ชจ๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • GetSerial๋Š” 16์ง„์ˆ˜ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Hex2Int๋Š” ์ˆซ์ž 0์™€ ๋น„๊ตํ•˜๊ธฐ ์ „์— int๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด "0x00000000"์€ ์ˆซ์ž 0๋กœ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
UO.ClientPrintEx(UO.Hex2Int(UO.GetSerial("self")), 0x0044, 3, "Ready");

2. UO.ClientPrintEx โ€” 2 โ€” ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • target โ€” ๋งˆ์ง€๋ง‰ ํƒ€๊ฒŸ์˜ serial. 0์€ ์ด ์˜ˆ์—์„œ ํƒœ๊ทธํ•  ์‚ฌ๋žŒ์ด ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ๋œ ๋Œ€์ƒ - ๋กœ์ปฌ ์„œ๋ช…๋งŒ: ๋Œ€์ƒ์€ ๊ณต๊ฒฉ๋ฐ›์ง€ ์•Š์œผ๋ฉฐ ํ™œ์„ฑ ์„œ๋ฒ„ ๋Œ€์ƒ์€ ์ฑ„์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • GetSerial๋Š” 16์ง„์ˆ˜ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Hex2Int๋Š” ์ˆซ์ž 0์™€ ๋น„๊ตํ•˜๊ธฐ ์ „์— int๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด "0x00000000"์€ ์ˆซ์ž 0๋กœ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.Hex2Int(UO.GetSerial("lasttarget"));
    if (Truth(target != 0))
    {
        UO.ClientPrintEx(target, 0x0044, 3, "Selected 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. UO.ClientPrintEx - 3 - ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์—…

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

  • ShowWeightWarning๋Š” ์•„๋ž˜์— ์ „์ฒด ์„ ์–ธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋…€๋Š” ์ฒด์ค‘์„ ์•Œ๋ ค์ง„ ์–‘์˜ ํ•œ๊ณ„์™€ ๋น„๊ตํ•˜๊ณ  ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฐ ๊ฒฝ์šฐ์—๋งŒ ์บ๋ฆญํ„ฐ ์œ„์— ๊ธ€์„ ์”๋‹ˆ๋‹ค. ์•„๋ฌด๊ฒƒ๋„ ๋ฒ„๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Convert.ToString๋Š” ๊ฐ€์ค‘์น˜๋ฅผ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • GetSerial๋Š” 16์ง„์ˆ˜ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Hex2Int๋Š” ์ˆซ์ž 0์™€ ๋น„๊ตํ•˜๊ธฐ ์ „์— int๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด "0x00000000"์€ ์ˆซ์ž 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()
    {
        ShowWeightWarning(UO.Weight(), UO.MaxWeight());
        return null;
    }

    void ShowWeightWarning(dynamic weight, dynamic maximum)
    {
        if (Truth(maximum > 0) && Truth(weight >= maximum))
        {
            UO.ClientPrintEx(UO.Hex2Int(UO.GetSerial("self")), 0x0044, 3, "Too heavy: " + Convert.ToString(weight));
        }
    }

    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.ClientPrintEx(senderID, color, font, text) โ€” UO.ClientPrintEx(Any,Any,Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "clientprintex":

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

UO.CloseClientUIWindow

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

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

void UO.CloseClientUIWindow(object? uiWindowType, object? id);

ํŠน์ • ๊ฐœ์ฒด์— ๋Œ€ํ•ด ์ง€์ •๋œ ์œ ํ˜•์˜ ๋กœ์ปฌ ํด๋ผ์ด์–ธํŠธ ์ฐฝ์„ ๋‹ซ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์บ๋ฆญํ„ฐ์˜ ์ข…์ด ์ธํ˜•, ์ƒํƒœ, ๋ฐฐ๋‚ญ ์ฐฝ ๋“ฑ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๊ฒŒ์ž„ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋‹ซ์ง€ ์•Š์œผ๋ฉฐ ์„œ๋ฒ„ ๊ฒ€ํ”„ ๋ฒ„ํŠผ์— ์‘๋‹ตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

  • uiWindowType โ€” ํ•„์ˆ˜ ์ˆซ์ž ์ฐฝ ์ฝ”๋“œ: 0 โ€” ์ข…์ด์ธํ˜•(์žฅ๋น„), 1 โ€” ์บ๋ฆญํ„ฐ ์ƒํƒœ, 2 โ€” ํ”„๋กœํ•„, 3 โ€” ์ปจํ…Œ์ด๋„ˆ. ์ด๊ฒƒ์€ graphic/type ๋ณธ๋ฌธ๋„ ์•„๋‹ˆ๊ณ  ID ์„œ๋ฒ„ ๊ฒ€ํ”„๋„ ์•„๋‹Œ 4๊ฐœ์˜ ์ฝ”๋“œ๋กœ ๊ตฌ์„ฑ๋œ ๋ณ„๋„์˜ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฒˆํ˜ธ๋Š” ์ฐฝ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • id โ€” ์ฐฝ์ด ์†ํ•œ ๊ฐœ์ฒด์˜ ์ผ๋ จ ๋ฒˆํ˜ธ: ์œ ํ˜•์˜ ๊ฒฝ์šฐ self/serial ๋ฌธ์ž 0..2, 3 ์œ ํ˜•์˜ ๊ฒฝ์šฐ backpack/serial ์ปจํ…Œ์ด๋„ˆ. ์ˆซ์ž, 16์ง„์ˆ˜ ๋ฌธ์ž์—ด ๋˜๋Š” ํ™•์ธ ๊ฐ€๋Šฅํ•œ ๊ฐœ์ฒด ๋ณ„์นญ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ชฉ๋ก InfoGumps์— ์žˆ๋Š” ์ฐฝ ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด ๋ณ„์นญ์€ 0๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœ์€ var result = ๋ฐ if UO.CloseClientUIWindow(...) ์—†์ด ๋ณ„๋„์˜ ์ค„์— ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ ํ•ฉํ•œ ์—ด๋ฆฐ ์ฐฝ์ด ์—†์œผ๋ฉด ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ช…๋ น์€ true/false๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋‘ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฐฝ ํด๋ž˜์Šค์™€ LocalSerial๊ฐ€ ๋ชจ๋‘ ๋น„๊ต๋ฉ๋‹ˆ๋‹ค. (3, self)๋กœ ์ฝœํ•˜๋Š” ๊ฒƒ์€ ๋ฐฐ๋‚ญ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐฐ๋‚ญ์—๋Š” backpack๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์šฐํšŒ๋Š” ์ด ์œ ํ˜•/serial์˜ ์—ด๋ ค ์žˆ์ง€๋งŒ ์•„์ง ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ์ฐฝ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ์ฐฝ์€ ๊ฒŒ์ž„ ์Šค๋ ˆ๋“œ์—์„œ ๋‹ซํž™๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ์ฐฝ์€ ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋‹ซํžˆ๊ณ  ํ•ญ๋ชฉ์ด ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ œ๊ฑฐ๋˜์ง€ ์•Š์œผ๋ฉฐ ์บ๋ฆญํ„ฐ๊ฐ€ ์„ธ๊ณ„์—์„œ ์‚ฌ๋ผ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ์ฐฝ์ด ์ด๋ฏธ ๋‹ซํ˜€ ์žˆ์œผ๋ฉด ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„ ์ธก ๋Œ€ํ™” ์ƒ์ž์˜ ๊ฒฝ์šฐ UO.CloseSimpleGump ๋ฐ UO.NumGumpButton์„ ์—ฐ๊ตฌํ•˜์„ธ์š”. ์ด ๋ช…๋ น์˜ ์ฝ”๋“œ 0..3๋Š” ์—ฌ๊ธฐ์— ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.CloseClientUIWindow");
UO.CloseClientUIWindow(0, "self");

1. ์ข…์ด ์ธํ˜• ์ œ๊ฑฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์บ๋ฆญํ„ฐ์˜ ์žฅ๋น„ ์ฐฝ๋งŒ ๋‹ซํž™๋‹ˆ๋‹ค. ๊ทธ์˜ ์ƒํƒœ, ํ”„๋กœํ•„ ๋ฐ ๋ฐฐ๋‚ญ์€ ๋ณ„๋„์˜ ์ฐฝ์œผ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
UO.CloseClientUIWindow(0, "self");

2. ์ž‘์—… ํ›„ ๋ฐฑํŒฉ ์ฐฝ ๋‹ซ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋ฐฐ๋‚ญ์ด ์—ด๋ฆฌ์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ•ด๋‹น ์ž‘์—…์€ ์•„๋ฌด ๊ฒƒ๋„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ํ•ญ๋ชฉ์„ ์ด๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Connected()) && Truth(UO.Exists("backpack")))
    {
        UO.CloseClientUIWindow(3, "backpack");
    }

    return null;
}

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

3. ์„ ํƒํ•œ ์บ๋ฆญํ„ฐ์˜ ์ƒํƒœ ๋ฐ ํ”„๋กœํ•„ ์ œ๊ฑฐ - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

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

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

     public object? RunScenario()
    {
        var selected = Asc(UO.GetSerial("lasttarget"), 0);
        CloseMobilePanels(selected);
        return null;
    }

    void CloseMobilePanels(dynamic id)
    {
        if (Truth(id == 0) || !(Truth(UO.Exists(id))))
        {
            return;
        }

        UO.CloseClientUIWindow(1, id);
        UO.CloseClientUIWindow(2, id);
    }

    int Asc(object? value, int fallback = 0)
    {
        string text = Convert.ToString(value) ?? "";
        if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
            return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
        return int.TryParse(text, out int number) ? number : fallback;
    }

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "closeclientuiwindow": bridge.CloseClientWindow(Arg(0), Arg(1)); return InjectionValue.Unit;

UO.CloseHandle

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

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

void UO.CloseHandle();

Client.Game.Exit๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ข…๋ฃŒํ•˜๋„๋ก ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • CloseUO์€ ๊ฐ™์€ ๋‹ค๋ฆฌ๋กœ ํ–ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. CloseHandle. ์ข…๋ฃŒ๋Š” ๊ฒŒ์ž„ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. Client.Game์ด ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ ์•„๋ฌด๋Ÿฐ ์กฐ์น˜๋„ ์ทจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๋ณ„๋„์˜ ๊ฒ€ํ”„๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ํด๋ผ์ด์–ธํŠธ ์ข…๋ฃŒ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ํ˜ธ์ถœ์€ ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
UO.CloseHandle();

2. ๋ช…์‹œ์  ์ข…๋ฃŒ ์กฐ๊ฑด - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ด ์˜ˆ์—์„œ๋Š” ์ œ์–ด๋œ ์กฐ๊ฑด์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. 0 ๊ฐ’์€ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์—ด๋ฆฐ ์ƒํƒœ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var finishClient = 0;
    if (Truth(finishClient))
    {
        UO.CloseHandle();
    }

    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()
    {
        FinishClient(0);
        return null;
    }

    void FinishClient(dynamic enabled)
    {
        if (Truth(enabled))
        {
            UO.CloseHandle();
        }
    }

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void CloseHandle() => bridge.CloseHandle();

UO.CloseSimpleGump

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

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

void UO.CloseSimpleGump(object? gumpIndex);

์—„๊ฒฉํ•œ ์ธ๋ฑ์Šค์— ์˜ํ•ด ๋‹ซํž ์ˆ˜ ์žˆ๋Š” ์„œ๋ฒ„ ๊ฒ€ํ”„๋ฅผ ๋กœ์ปฌ์—์„œ ๋‹ซ์Šต๋‹ˆ๋‹ค.

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

  • gumpIndex โ€” ํ•„์ˆ˜ int โ€” 0๋ถ€ํ„ฐ GetGumpsCount()-1๊นŒ์ง€ ํ™œ์„ฑ ์„œ๋ฒ„ ๊ฒ€ํ”„์˜ ์ธ๋ฑ์Šค์ž…๋‹ˆ๋‹ค. GumpID/serial๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ชฉ๋ก ์™ธ๋ถ€์˜ ์Œ์ˆ˜์™€ ์ธ๋ฑ์Šค๋Š” ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฐฝ์„ ์—ด๊ณ  ๋‹ซ๊ณ  ์žฌ์ •๋ ฌํ•˜๋ฉด ์ƒ‰์ธ์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ–‰๋™ํ•˜๊ธฐ ์ „์— GetGumpID/GetGumpSerial๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

๋ฐ˜ํ™˜๊ฐ’

void - ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ์„œ๋ฒ„์˜ ํ™•์ธ์ด๋‚˜ bool๋กœ ํ•ด์„๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋™์ž‘

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

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

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

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

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

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

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

1. ์ฒซ ๋ฒˆ์งธ ์ฐฝ ๋‹ซ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • 0์€ ID๊ฐ€ ์•„๋‹Œ ์ธ๋ฑ์Šค์ž…๋‹ˆ๋‹ค. ์ฐฝ์„ ๋‹ซ์„ ์ˆ˜ ์—†์œผ๋ฉด ์—ด๋ฆฐ ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
UO.CloseSimpleGump(0);

2. ํ™œ์„ฑํ™”๋œ ๋ชจ๋“  ์ฐฝ ๋‹ซ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์—ญ์ˆœํšŒ๋Š” ๋งˆ๊ฐ ํ›„ ์ง€์ˆ˜ ์ด๋™์˜ ์˜ํ–ฅ์„ ์ค„์ž…๋‹ˆ๋‹ค. ์ƒˆ ์ฐฝ์„ ๋™์‹œ์— ์—ด ๋•Œ ๋ชฉ๋ก์„ ๋‹ค์‹œ ํ™•์ธํ•˜์„ธ์š”.
return  RunScenario();
 object? RunScenario()
{
    var i = UO.GetGumpsCount() - 1;
    while (Truth(i >= 0))
    {
        UO.CloseSimpleGump(i);
        i = i - 1;
    }

    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. ๋‹ซ๊ธฐ ์ „ ์ •๋ณด ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • info[1] - GumpID๊ฐ€ ์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž‘์—…์€ ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ฒฐ๊ณผ๊ฐ€ ๋ณ€์ˆ˜์— ํ• ๋‹น๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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 info = UO.GetGumpInfo(0);
        if (Truth(ArrayLength(info) == 5))
        {
            UO.CloseSimpleGump(0);
            UO.Print(Hex(info[1]));
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    string Hex(object? value) => Convert.ToInt64(value).ToString("X");
    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.CloseSimpleGump(gumpIndex) โ€” UO.CloseSimpleGump(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "closesimplegump":

                    if (bridge is IApiGumpAccess gumpAccess) gumpAccess.CloseGumpAtIndex(Arg(0));

                    else bridge.CloseSimpleGump(Arg(0));

                    return InjectionValue.Unit;

UO.ColorPrint

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

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

void UO.ColorPrint(object? color, object? msg);

์Šคํฌ๋ฆฝํŠธ ์ง„ํ–‰ ๋˜๋Š” ์ค‘์ง€ ์กฐ๊ฑด์— ๋Œ€ํ•œ ๋กœ์ปฌ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ ๋‹ค๋ฅธ ํ”Œ๋ ˆ์ด์–ด๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

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

  • color - UO hue, RGB ์•„๋‹˜. ์ˆซ์ž ๋˜๋Š” 16์ง„์ˆ˜ ๋ฌธ์ž์—ด. ๋ธŒ๋ฆฌ์ง€๋Š” ๋‚ฎ์€ 16 ๋น„ํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. graphic/type์™€ ํ˜ผ๋™ํ•˜์ง€ ๋งˆ์„ธ์š”. ์˜ˆ์‹œ์—์„œ๋Š” 0x0044๊ฐ€ ์„ ํƒ๋œ hue์ž…๋‹ˆ๋‹ค. ์ƒ‰์ƒ์ด ์—†์œผ๋ฉด hue 0x03B2๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. UO.Print(text, color)๋Š” ํ…์ŠคํŠธ๋ฅผ ๋จผ์ € ๋ฐ›์•„๋“ค์ž…๋‹ˆ๋‹ค. UO.ColorPrint(color, text) โ€“ ์ƒ‰์ƒ ์šฐ์„ .

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ๋ฉ”์‹œ์ง€๋Š” ๊ฒŒ์ž„์ฐฝ ์ขŒ์ธกํ•˜๋‹จ๊ณผ ๋กœ์ปฌ๋กœ๊ทธ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ IDE์—์„œ ์‚ฌ๋ณธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž์˜ ์ผ๋ฐ˜ ๋กœ๊ทธ์—์„œ ์Šคํฌ๋ฆฝํŠธ ๋ฉ”์‹œ์ง€ ํ•„ํ„ฐ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๊ฒŒ์ž„ ์ฐฝ ์—†์ด ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€ ํ•„ํ„ฐ๋Š” ๊ทธ๋Ÿฌํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ์Œ์„ฑ ํŒจํ‚ท์ด ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋จธ๋ฆฌ ์œ„์˜ ๋น„๋ฌธ์—๋Š” UO.CharPrint์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • UO.Print๋Š” ๊ฒŒ์ž„ ๋ฉ”์‹œ์ง€ ๋กœ๊ทธ์— ์ƒˆ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ์›ํ•˜๋Š” ๊ฒ€์ƒ‰ ๋ฌธ์ž์—ด/๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ €์žฅํ•œ ๋‹ค์Œ ์ง„๋‹จ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๋น ๋ฅธ ๋ฃจํ”„์—์„œ๋Š” ๋ชจ๋“  ๋ฐ˜๋ณต์ด ์•„๋‹Œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•  ๋•Œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒ‰์ƒ์ด ์—†์œผ๋ฉด hue 0x03B2๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. UO.Print(text, color)๋Š” ํ…์ŠคํŠธ๋ฅผ ๋จผ์ € ๋ฐ›์•„๋“ค์ž…๋‹ˆ๋‹ค. UO.ColorPrint(color, text) โ€“ ์ƒ‰์ƒ ์šฐ์„ .
  • UO.Print ยท UO.CharPrint ยท UO.Say ยท UO.ConColor

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

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

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

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

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ด๋ฉฐ ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค(void). ๋ฉ”์‹œ์ง€ ๋‚ด์šฉ์€ ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

UO.ColorPrint(0x0044, "Hello from C#");

1. ๊ฐ„๋žตํ•œ ๋ณด๊ณ ์„œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ฒ˜๋ฆฌ๋จ=12 โ€” ์ด๋ฏธ ์ฒ˜๋ฆฌ๋œ ํ•ญ๋ชฉ์˜ ๋ฐ๋ชจ ์ˆ˜์ž…๋‹ˆ๋‹ค. Convert.ToString๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” ์ˆซ์ž๋งŒ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์ „์†กํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
var processed = 12;
UO.ColorPrint(0x0044, "Processed item entries: " + Convert.ToString(processed));

2. ๊ณผ๋ถ€ํ•˜ ๊ฒฝ๊ณ  - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์บ๋ฆญํ„ฐ์˜ ๋ฌด๊ฒŒ์™€ ์ตœ๋Œ€๊ฐ’์„ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค. 0/์•Œ ์ˆ˜ ์—†๋Š” ์ตœ๋Œ€๊ฐ’์€ ๊ณผ๋ถ€ํ•˜๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌด๊ฒŒ๊ฐ€ ์ตœ๋Œ€๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ํ•œ ์ค„์ด ์ธ์‡„๋˜๊ณ  Main์ด ๋๋‚ฉ๋‹ˆ๋‹ค. ๋ฌผ๊ฑด์€ ๋ฒ„๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var weight = UO.Weight();
    var maximum = UO.MaxWeight();
    if (Truth(maximum > 0) && Truth(weight >= maximum))
    {
        UO.ColorPrint(0x0044, "Too heavy: " + Convert.ToString(weight) + "/" + Convert.ToString(maximum));
        return null;
    }

    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. ์ค‘๋Ÿ‰ ๋ณ€๊ฒฝ๋งŒ ๋ณด๊ณ  - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • Main์€ ๊ฐ€์ค‘์น˜๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  1000 ๋ฐ€๋ฆฌ์ดˆ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ์™„์ „ํžˆ ์„ ์–ธ๋œ ReportWeight๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋ณด์กฐ์ž๋Š” ๋ฌด๊ฒŒ๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ์—๋งŒ ์ธ์‡„ํ•˜๊ณ  ๋‹ค์Œ ์ ๊ฒ€์„ ์œ„ํ•ด ์ƒˆ ๋ฌด๊ฒŒ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ž์ฒด๋กœ๋Š” ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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 previous = UO.Weight();
        UO.Wait(1000);
        previous = ReportWeight(previous, UO.Weight());
        return null;
    }

    dynamic ReportWeight(dynamic previous, dynamic current)
    {
        if (Truth(previous != current))
        {
            UO.ColorPrint(0x0044, "Weight changed: " + Convert.ToString(current));
        }

        return current;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.ColorPrint(color, msg) โ€” UO.ColorPrint(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void ColorPrint(InjectionValue color, InjectionValue msg) => bridge.Print(NumberConversions.ToInt(color), msg.ToString());

UO.ConColor

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

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

void UO.ConColor(object? color);

์ด ์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„์˜ ํ›„์† ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•ด UO hue๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

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

  • color - UO hue, RGB ์•„๋‹˜. ์ˆซ์ž ๋˜๋Š” 16์ง„์ˆ˜ ๋ฌธ์ž์—ด. ๋ธŒ๋ฆฌ์ง€๋Š” ๋‚ฎ์€ 16 ๋น„ํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. graphic/type์™€ ํ˜ผ๋™ํ•˜์ง€ ๋งˆ์„ธ์š”. ์˜ˆ์‹œ์—์„œ๋Š” 0x0044๊ฐ€ ์„ ํƒ๋œ hue์ž…๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ํ›„์† UO.ClientPrint, UO.AddToJournal ๋ฐ UO.AddToSystemJournal์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์ด์ „ ์ค„์„ ๋‹ค์‹œ ์น ํ•˜์ง€ ์•Š๊ณ , SpeechHue ํ”„๋กœํ•„์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ƒ‰์ƒ ์ธ์ˆ˜ ์—†์ด UO.Print์˜ ์ƒ‰์ƒ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ „ ์ƒ‰์ƒ getter๋Š” ์—ฌ๊ธฐ์— ์—†์Šต๋‹ˆ๋‹ค. ์„ ํƒํ•œ ์ผ๋ฐ˜ hue๋ฅผ ํ•ด๋‹น ๋ณ€์ˆ˜์— ์ €์žฅํ•˜์„ธ์š”.
  • UO.Print ยท UO.CharPrint ยท UO.Say ยท UO.ConColor

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

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

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

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

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

UO.Print("Calling UO.ConColor");
UO.ConColor(0x0044);

1. UO.ConColor - 1 - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • 0x0044์€ ๋‹ค์Œ ์‹œ์Šคํ…œ ๋ผ์ธ์˜ ์ƒ‰์ƒ์ด ๋ฉ๋‹ˆ๋‹ค. ConColor ์ž์ฒด๋Š” ์•„๋ฌด๊ฒƒ๋„ ์ธ์‡„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
UO.ConColor(0x0044);
UO.AddToSystemJournal("Notice");

2. UO.ConColor โ€” 2 โ€” ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ผ๋ฐ˜ Print์€ 0x03B2 ์ƒ‰์ƒ์„ ์œ ์ง€ํ•˜๊ณ  AddToJournal๋Š” ์ง€์ •๋œ 0x0044๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฉ”์‹œ์ง€ ๋ชจ๋‘ ๋กœ์ปฌ์ž…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.ConColor(0x0044);
    UO.Print("Normal Print color");
    UO.AddToJournal("System color");
    return null;
}

3. UO.ConColor - 3 - ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์—…

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

  • usualHue=0x0440๋Š” ์ฝ์€ ์ด์ „ ๊ฐ’์ด ์•„๋‹ˆ๋ผ ๋ถ„๋ช…ํžˆ ์„ ํƒ๋œ ์ผ๋ฐ˜ ์ƒ‰์ƒ์ž…๋‹ˆ๋‹ค. ์‹œ๋„๋Š” ์ž„์‹œ 0x0035๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. finally๋Š” usualHue๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋‹ค์Œ ์ค„์€ ๋‹ค์‹œ ์ผ๋ฐ˜ ์ƒ‰์ƒ์œผ๋กœ ์ธ์‡„๋ฉ๋‹ˆ๋‹ค.
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 usualHue = 0x0440;
        UO.ConColor(usualHue);
        try
        {
            UO.ConColor(0x0035);
            UO.AddToSystemJournal("Temporary warning");
        }
        finally
        {
            UO.ConColor(usualHue);
        }

        UO.AddToSystemJournal("Normal messages again");
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.ConColor(color) โ€” UO.ConColor(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void ConColor(InjectionValue color)

        {

            systemMessageColor = NumberConversions.ToInt(color);

        }

UO.ConsolePrint

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

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

void UO.ConsolePrint(object? msg);

์Šคํฌ๋ฆฝํŠธ ์ง„ํ–‰ ๋˜๋Š” ์ค‘์ง€ ์กฐ๊ฑด์— ๋Œ€ํ•œ ๋กœ์ปฌ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ ๋‹ค๋ฅธ ํ”Œ๋ ˆ์ด์–ด๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ๋ฉ”์‹œ์ง€๋Š” ๊ฒŒ์ž„์ฐฝ ์ขŒ์ธกํ•˜๋‹จ๊ณผ ๋กœ์ปฌ๋กœ๊ทธ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ IDE์—์„œ ์‚ฌ๋ณธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž์˜ ์ผ๋ฐ˜ ๋กœ๊ทธ์—์„œ ์Šคํฌ๋ฆฝํŠธ ๋ฉ”์‹œ์ง€ ํ•„ํ„ฐ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๊ฒŒ์ž„ ์ฐฝ ์—†์ด ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€ ํ•„ํ„ฐ๋Š” ๊ทธ๋Ÿฌํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ์Œ์„ฑ ํŒจํ‚ท์ด ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋จธ๋ฆฌ ์œ„์˜ ๋น„๋ฌธ์—๋Š” UO.CharPrint์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • UO.Print๋Š” ๊ฒŒ์ž„ ๋ฉ”์‹œ์ง€ ๋กœ๊ทธ์— ์ƒˆ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ์›ํ•˜๋Š” ๊ฒ€์ƒ‰ ๋ฌธ์ž์—ด/๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ €์žฅํ•œ ๋‹ค์Œ ์ง„๋‹จ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๋น ๋ฅธ ๋ฃจํ”„์—์„œ๋Š” ๋ชจ๋“  ๋ฐ˜๋ณต์ด ์•„๋‹Œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•  ๋•Œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒ‰์ƒ์ด ์—†์œผ๋ฉด hue 0x03B2๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. UO.Print(text, color)๋Š” ํ…์ŠคํŠธ๋ฅผ ๋จผ์ € ๋ฐ›์•„๋“ค์ž…๋‹ˆ๋‹ค. UO.ColorPrint(color, text) โ€“ ์ƒ‰์ƒ ์šฐ์„ .
  • ์ด๋ฆ„์— ์ฝ˜์†”์ด ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด๋Š” ๋ณ„๋„์˜ Windows ํ„ฐ๋ฏธ๋„์ด ์•„๋‹Œ ๋™์ผํ•œ ๋กœ์ปฌ ๊ฒŒ์ž„ ์ถœ๋ ฅ์ž…๋‹ˆ๋‹ค.
  • UO.Print ยท UO.CharPrint ยท UO.Say ยท UO.ConColor

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

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

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

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

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ด๋ฉฐ ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค(void). ๋ฉ”์‹œ์ง€ ๋‚ด์šฉ์€ ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

UO.ConsolePrint("Hello from C#");

1. ๊ฐ„๋žตํ•œ ๋ณด๊ณ ์„œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ฒ˜๋ฆฌ๋จ=12 โ€” ์ด๋ฏธ ์ฒ˜๋ฆฌ๋œ ํ•ญ๋ชฉ์˜ ๋ฐ๋ชจ ์ˆ˜์ž…๋‹ˆ๋‹ค. Convert.ToString๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” ์ˆซ์ž๋งŒ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์ „์†กํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
var processed = 12;
UO.ConsolePrint("Processed item entries: " + Convert.ToString(processed));

2. ๊ณผ๋ถ€ํ•˜ ๊ฒฝ๊ณ  - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์บ๋ฆญํ„ฐ์˜ ๋ฌด๊ฒŒ์™€ ์ตœ๋Œ€๊ฐ’์„ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค. 0/์•Œ ์ˆ˜ ์—†๋Š” ์ตœ๋Œ€๊ฐ’์€ ๊ณผ๋ถ€ํ•˜๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌด๊ฒŒ๊ฐ€ ์ตœ๋Œ€๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ํ•œ ์ค„์ด ์ธ์‡„๋˜๊ณ  Main์ด ๋๋‚ฉ๋‹ˆ๋‹ค. ๋ฌผ๊ฑด์€ ๋ฒ„๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var weight = UO.Weight();
    var maximum = UO.MaxWeight();
    if (Truth(maximum > 0) && Truth(weight >= maximum))
    {
        UO.ConsolePrint("Too heavy: " + Convert.ToString(weight) + "/" + Convert.ToString(maximum));
        return null;
    }

    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. ์ค‘๋Ÿ‰ ๋ณ€๊ฒฝ๋งŒ ๋ณด๊ณ  - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • Main์€ ๊ฐ€์ค‘์น˜๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  1000 ๋ฐ€๋ฆฌ์ดˆ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ์™„์ „ํžˆ ์„ ์–ธ๋œ ReportWeight๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋ณด์กฐ์ž๋Š” ๋ฌด๊ฒŒ๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ์—๋งŒ ์ธ์‡„ํ•˜๊ณ  ๋‹ค์Œ ์ ๊ฒ€์„ ์œ„ํ•ด ์ƒˆ ๋ฌด๊ฒŒ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ž์ฒด๋กœ๋Š” ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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 previous = UO.Weight();
        UO.Wait(1000);
        previous = ReportWeight(previous, UO.Weight());
        return null;
    }

    dynamic ReportWeight(dynamic previous, dynamic current)
    {
        if (Truth(previous != current))
        {
            UO.ConsolePrint("Weight changed: " + Convert.ToString(current));
        }

        return current;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.ConsolePrint(msg) โ€” UO.ConsolePrint(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void ConsolePrint(InjectionValue msg) => bridge.Print(msg.ToString());

UO.FillInfoWindow

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

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

void UO.FillInfoWindow(object? s);

ํ…์ŠคํŠธ ์ฐฝ์— ํ•œ ์ค„์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

  • s โ€” ์ค„ ํ…์ŠคํŠธ; ๊ฐ’์€ string๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ์ด์ „์— ๋ˆ„์ ๋œ ํ–‰์€ MaxTextWindowLines ํ•œ๋„๊นŒ์ง€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
  • TextPrint๋Š” ํ•œ ์ค„์„ ์ถ”๊ฐ€ํ•˜๊ณ  YokoTextWindowGump ์ž์ฒด๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. TextOpen๋Š” ์—ด๋ฆฐ ์ƒํƒœ๋ฅผ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„ํผ๊ฐ€ ์˜ค๋ฒ„ํ”Œ๋กœ๋˜๋ฉด ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ์ค„์ด ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์„œ๋ฒ„ ๊ฒ€ํ”„๋„ ์•„๋‹ˆ๊ณ  UO.GetInfo๋„ ์•„๋‹Œ ๋ณ„๋„์˜ ํ…์ŠคํŠธ ์ฐฝ์ž…๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.FillInfoWindow");
UO.FillInfoWindow("Status ready");

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

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

  • ํ…์ŠคํŠธ๊ฐ€ ํด๋ผ์ด์–ธํŠธ ํ…์ŠคํŠธ ์ฐฝ์œผ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
UO.FillInfoWindow("Status ready");

2. ๋ณ€์ˆ˜์˜ ํ…์ŠคํŠธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ŠคํŠธ๋ง์€ ๊ตญ๋ถ€ ์ „๋ฅ˜ HP๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var status = "HP: " + Convert.ToString(UO.GetHP());
    UO.FillInfoWindow(status);
    return null;
}

3. ์—ฐ์†๋œ ๋‘ ์ค„ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ๋‘ ๋ฒˆ์งธ ๋ช…๋ น์€ ์ฒซ ๋ฒˆ์งธ ๋’ค์— ๋‘ ๋ฒˆ์งธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.FillInfoWindow("first");
        UO.FillInfoWindow("second");
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.FillInfoWindow(s) โ€” UO.FillInfoWindow(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "fillinfowindow":

                    bridge.TextPrint(Text(0));

                    bridge.TextOpen();

                    return InjectionValue.Unit;

UO.FillNewWindow

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

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

void UO.FillNewWindow(object? s);

ํ…์ŠคํŠธ ์ฐฝ์„ ์ง€์šฐ๊ณ  ํ•œ ์ค„์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

  • s โ€” ์ค„ ํ…์ŠคํŠธ; ๊ฐ’์€ string๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • TextPrint ์ด์ „์—๋Š” TextClear์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด์ „์— ๋ˆ„์ ๋œ ํ–‰์ด ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
  • TextPrint๋Š” ํ•œ ์ค„์„ ์ถ”๊ฐ€ํ•˜๊ณ  YokoTextWindowGump ์ž์ฒด๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. TextOpen๋Š” ์—ด๋ฆฐ ์ƒํƒœ๋ฅผ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„ํผ๊ฐ€ ์˜ค๋ฒ„ํ”Œ๋กœ๋˜๋ฉด ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ์ค„์ด ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์„œ๋ฒ„ ๊ฒ€ํ”„๋„ ์•„๋‹ˆ๊ณ  UO.GetInfo๋„ ์•„๋‹Œ ๋ณ„๋„์˜ ํ…์ŠคํŠธ ์ฐฝ์ž…๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.FillNewWindow");
UO.FillNewWindow("Status ready");

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

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

  • ํ…์ŠคํŠธ๊ฐ€ ํด๋ผ์ด์–ธํŠธ ํ…์ŠคํŠธ ์ฐฝ์œผ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
UO.FillNewWindow("Status ready");

2. ๋ณ€์ˆ˜์˜ ํ…์ŠคํŠธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ŠคํŠธ๋ง์€ ๊ตญ๋ถ€ ์ „๋ฅ˜ HP๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var status = "HP: " + Convert.ToString(UO.GetHP());
    UO.FillNewWindow(status);
    return null;
}

3. ์—ฐ์†๋œ ๋‘ ์ค„ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ๋‘ ๋ฒˆ์งธ ๋ช…๋ น์€ ๋‚ด์šฉ์„ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. ๋‚จ์€ ๊ฒƒ์€ ๋‘ ๋ฒˆ์งธ์ž…๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.FillNewWindow("first");
        UO.FillNewWindow("second");
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.FillNewWindow(s) โ€” UO.FillNewWindow(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "fillnewwindow": bridge.TextClear(); bridge.TextPrint(Text(0)); bridge.TextOpen(); return InjectionValue.Unit;

UO.FontColor

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

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

void UO.FontColor(object? color);

hue๋ฅผ ์ด ์Šคํฌ๋ฆฝํŠธ์˜ ํ›„์† ๋กœ์ปฌ UO.UOAMessage๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ์˜ ์Œ์„ฑ ์ƒ‰์ƒ, ์ผ๋ฐ˜ UO.Print, InfoFindList ๋˜๋Š” IDE ํ…Œ๋งˆ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

  • color โ€” ํ•„์ˆ˜ ์ˆซ์ž ์ธ๋ฑ์Šค hue 0..65535(์˜ˆ: 0x0044). ์ด๊ฒƒ์€ RGB์ด ์•„๋‹™๋‹ˆ๋‹ค. int๋Š” ๋‚ด๋ถ€์— ์ €์žฅ๋˜๋ฉฐ, ์ถœ๋ ฅ์ด ushort๋กœ ์ค„์–ด๋“ค๋ฉด; -1์€ ์žฌ์„ค์ •์„ ์˜๋ฏธํ•˜์ง€ ์•Š์œผ๋ฉฐ 65535๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋Ÿฐํƒ€์ž„์˜ ์ดˆ๊ธฐ ๊ฐ’์€ 0x03B2์ž…๋‹ˆ๋‹ค. ๋…ผ์Ÿ์ด ์—†์œผ๋ฉด ํ˜•์‹๋„ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void: ๊ฒฐ๊ณผ ์—†์Œ, ์˜ค๋ž˜๋œ ์ƒ‰์ƒ ๋˜๋Š” ์„ฑ๊ณต ๊ธฐํ˜ธ. ๋‚˜์ค‘์— ์„ค์ •์„ ๋˜๋Œ๋ฆฌ๋ ค๋ฉด ์„ ํƒํ•œ hue๋ฅผ ์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜์„ธ์š”.

๋™์ž‘

  • ์ƒํƒœ๋งŒ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.FontColor, ๋ฉ”์‹œ์ง€๋ฅผ ์ธ์‡„ํ•˜๊ฑฐ๋‚˜ ๋„คํŠธ์›Œํฌ ํŒจํ‚ท์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋™์ผํ•œ ๋Ÿฐํƒ€์ž„์—์„œ ๋‹ค์Œ FontColor๊นŒ์ง€ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ์—๋Š” ์ž์ฒด ์ƒํƒœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. UO.Print(text,color)๋Š” ์ƒ‰์ƒ์„ ์ง์ ‘ ์„ค์ •ํ•˜๊ณ  FontColor๋ฅผ ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.FontColor");
UO.FontColor(0x0021);

1. ํ•˜์ด๋ผ์ดํŠธ ์žฌ๊ณ  ๊ฒฝ๊ณ  - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • 0x0021 โ€” ์ƒ‰์ธ hue; ์ตœ์ข… ์ƒ‰์ƒ์€ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒ‰์ƒ ํŒŒ์ผ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€๋Š” ๋กœ์ปฌ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ๊ฐ€ ๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
UO.FontColor(0x0021);
var first = UO.FindList("0x0EED", "backpack");
if (Truth(first == ""))
{
    UO.UOAMessage("No gold in the loaded backpack");
}
else
{
    UO.UOAMessage("Gold units: " + Convert.ToString(UO.FindFullQuantity()));
}

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

2. ์ผ๋ฐ˜ ์ƒ‰์ƒ ์•Œ๋ฆผ ์ ˆ์ฐจ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ „์ฒด ๊ณต์ง€์—๋Š” ํ…์ŠคํŠธ์™€ hue๊ฐ€ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ์„ค์น˜๋œ hue๋Š” ์ด ๋Ÿฐํƒ€์ž„์˜ ๋‹ค์Œ UOAMessage์—๋„ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ๋Š” ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋‚ด์žฅ FontColor()์ด ์—†์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    Notice("Supplies checked", 0x0044);
    Notice("Restock needed", 0x0021);
    return null;
}

void Notice(dynamic text, dynamic hue)
{
    UO.FontColor(hue);
    UO.UOAMessage(text);
}

3. ์•Œ๋ ค์ง„ ๊ธฐ๋ณธ ์ƒ‰์ƒ์œผ๋กœ ๋˜๋Œ๋ฆฌ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • 0x03B2 โ€” ์ƒˆ ๋Ÿฐํƒ€์ž„์˜ ์ดˆ๊ธฐ ๊ฐ’ FontColor. ๋งˆ์ง€๋ง‰์œผ๋กœ ์ •์ƒ์ ์ธ ์™„๋ฃŒ/์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์‹œ ์„ ํƒํ•œ ๊ธฐ๋ฐ˜์„ ์ •ํ™•ํ•˜๊ฒŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ์ด์ „ ๊ฐ’์€ ๋ณต์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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 baseHue = 0x03B2;
        try
        {
            UO.FontColor(0x0021);
            UO.UOAMessage("Check the route before moving");
        }
        finally
        {
            UO.FontColor(baseHue);
        }

        UO.UOAMessage("Ready");
        UO.Print("Regular Print keeps its own color");
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.FontColor(color) โ€” UO.FontColor(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "fontcolor": state.FontColor = Arg(0, state.FontColor); break;

UO.HelpRequest

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

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

void UO.HelpRequest();

์„œ๋ฒ„ ๋„์›€๋ง ๋ฉ”๋‰ด๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ExecuteClientApiCompatibility๋Š” HelpRequest์„ ํ˜ธ์ถœํ•˜๊ณ  Invoke๋ฅผ ํ†ตํ•ด GameActions.RequestHelp๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋ฉ”๋‰ด์˜ ๋‚ด์šฉ์€ ์„œ๋ฒ„์— ์˜ํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ์ œ์—์„œ UO.Wait๋Š” ์Šคํฌ๋ฆฝํŠธ ์ผ์‹œ ์ค‘์ง€๋งŒ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ผ์‹œ ์ค‘์ง€๊ฐ€ ๋๋‚ฌ๋‹ค๊ณ  ํ•ด์„œ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์™„๋ฃŒํ–ˆ์Œ์„ ์ฆ๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ์„œ๋ฒ„ ๋„์›€๋ง ๋ฉ”๋‰ด๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
UO.HelpRequest();

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

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

  • ExecuteClientApiCompatibility๋Š” HelpRequest์„ ํ˜ธ์ถœํ•˜๊ณ  Invoke๋ฅผ ํ†ตํ•ด GameActions.RequestHelp๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋ฉ”๋‰ด์˜ ๋‚ด์šฉ์€ ์„œ๋ฒ„์— ์˜ํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.IsOnline()))
    {
        UO.HelpRequest();
    }

    return null;
}

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

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

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

  • ์˜ˆ์ œ์—์„œ UO.Wait๋Š” ์Šคํฌ๋ฆฝํŠธ ์ผ์‹œ ์ค‘์ง€๋งŒ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ผ์‹œ ์ค‘์ง€๊ฐ€ ๋๋‚ฌ๋‹ค๊ณ  ํ•ด์„œ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์™„๋ฃŒํ–ˆ์Œ์„ ์ฆ๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
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.IsOnline()))
        {
            UO.HelpRequest();
            UO.Print("Help requested");
        }

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "helprequest": bridge.HelpRequest(); return InjectionValue.Unit;

UO.Hide

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

void UO.Hide();
void UO.Hide(object? serial);
string UO.Hide(object? type, object? x, object? y);
string UO.Hide(object? type, object? x, object? y, object? z);

๋™์ž‘ ๋ฐ ๋ฐ˜ํ™˜๊ฐ’

Hide๋Š” ๋กœ๋“œ๋œ ๋ฌผ์ฒด๋ฅผ ๋กœ์ปฌ์—์„œ ์ˆจ๊ธฐ๋ฉฐ Hiding ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Resend/Resync๋Š” ์ด ์ˆจ๊น€์„ ํ•ด์ œํ•˜๊ณ  ์ด์ „ ๊ทธ๋ฆฌ๊ธฐ ์ƒํƒœ๋ฅผ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. Hide๋ฅผ ๋ฐ˜๋ณตํ•œ ๊ฒฝ์šฐ๋„ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌผ์ฒด ๋ฐ์ดํ„ฐ์™€ ์„œ๋ฒ„ Hidden ํ”Œ๋ž˜๊ทธ๋Š” ๋ฐ”๋€Œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

  • serial โ€” ๊ฐ์ฒด ์‹œ๋ฆฌ์–ผ ๋ฒˆํ˜ธ ๋˜๋Š” ์ €์žฅ๋œ ๋ณ„์นญ.
  • type โ€” ์•„์ดํ…œ ๊ทธ๋ž˜ํ”ฝ ID. -1์€ ์ง€์ • ์œ„์น˜์˜ ๋ชจ๋“  ์ข…๋ฅ˜์™€ ์ผ์น˜.
  • x โ€” ์›”๋“œ X ์ขŒํ‘œ.
  • y โ€” ์›”๋“œ Y ์ขŒํ‘œ.
  • z โ€” Z ๋†’์ด. ์งง์€ ํ˜•์‹์€ 0 ์‚ฌ์šฉ.

์ ‘๋‘์‚ฌ๋Š” C# Scripts IDE์—์„œ ์„ค์ •ํ•˜๋ฉฐ #์€ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๊ณ  ๋”ฐ์˜ดํ‘œ ์•ˆ์˜ ํ…์ŠคํŠธ๋Š” ํ•˜๋‚˜์˜ ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค. id๋Š” serial, type์€ graphic์ž…๋‹ˆ๋‹ค. xy x y [z]๋Š” ํ•ด๋‹น ์œ„์น˜์˜ ์ฒซ ๋กœ๋“œ ๊ฐœ์ฒด, type๋งŒ ์“ฐ๋ฉด ์ฒซ ์ผ์น˜ ๊ฐœ์ฒด๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. InfoTile(x,y,map)์˜ ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” Z๊ฐ€ ์•„๋‹ˆ๋ผ ์ง€๋„์ž…๋‹ˆ๋‹ค.

์ฑ„ํŒ… ๋ช…๋ น

#hide
#hide id 0x40001234
#hide type 0x0EED
#hide xy 1450 1690
#hide type 0x0EED xy 1450 1690 0

์™„์ „ํ•œ C# ์˜ˆ์ œ

๊ฐ ์ฝ”๋“œ ๋ธ”๋ก์€ ์™„์ „ํ•œ ๋…๋ฆฝ .csx์ž…๋‹ˆ๋‹ค. ์˜ˆ์‹œ serial, type๊ณผ ์ขŒํ‘œ๋ฅผ ๋ฐ”๊พธ์„ธ์š”. ์ธ์ˆ˜ ์ˆœ์„œ์™€ C# ๋ช…๋ช…๋œ ์ธ์ˆ˜๋Š” ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

1

UO.Hide(0x40001234);

2

UO.Print(UO.Hide(0x0EED, 1450, 1690, 0));

3

foreach (int serial in new[] { 0x40001234, 0x40005678 })
    UO.Hide(serial);

4

new CommandSample().Execute(UO);

sealed class CommandSample
{
    public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
    {
        api.Hide(0x40001234);
    }
}

๋‚ด๋ถ€ ํ˜ธ์ถœ

CSharpGameApi.Hide
  -> CSharpScriptGlobals
  -> InjectionScript.Runtime.InjectionApiUO.Hide
ClassicUOInjectionApiBridge -> target / serial / type-position selection
  -> local hidden-object state -> renderer visibility


UO.Morph

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

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

void UO.Morph(object? @type);

ํ˜„์žฌ ์บ๋ฆญํ„ฐ์˜ graphic๋ฅผ ๋กœ์ปฌ์—์„œ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

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

  • type - int body graphic ๋˜๋Š” ResolveType๋กœ ํ•ด๊ฒฐ๋œ ๋ฌธ์ž์—ด type. 0๋Š” ์ฒซ ๋ฒˆ์งธ Morph์— ์ €์žฅ๋œ graphic์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ์ˆซ์ž๋Š” ushort๋กœ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • Bridge.Morph ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์—†์œผ๋ฉด ์•„๋ฌด ๊ฒƒ๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ ํ˜ธ์ถœ๋˜๋ฉด _originalGraphic์„ ์ €์žฅํ•œ ๋‹ค์Œ Player.Graphic์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์—†์–ด๋„ ๋Ÿฐํƒ€์ž„ ์—…๋ฐ์ดํŠธ ticksAnim=Timer.
  • ์ด๋Š” ์„œ๋ฒ„ ๋ณ€์‹ ์ด๋‚˜ ์ข…์กฑ/์‚ฌ์šฉ ๊ฐ€๋Šฅ ์Šคํ‚ฌ์˜ ๋ณ€ํ™”๊ฐ€ ์•„๋‹Œ ๋กœ์ปฌ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค. ushort ์™ธ๋ถ€์˜ ๊ฐ’์€ ์ด ๋ธŒ๋ฆฌ์ง€ ๊ธฐ๋Šฅ์œผ๋กœ ํ™•์ธ๋˜์ง€ ์•Š์œผ๋ฉฐ 16 ๋น„ํŠธ๋กœ ๊ฐ์†Œ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.Morph");
UO.Morph("0x0190");

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

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

  • ํ˜„์žฌ ์บ๋ฆญํ„ฐ์˜ graphic๋ฅผ ๋กœ์ปฌ์—์„œ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
UO.Morph("0x0190");

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

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

  • Bridge.Morph ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์—†์œผ๋ฉด ์•„๋ฌด ๊ฒƒ๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ ํ˜ธ์ถœ๋˜๋ฉด _originalGraphic์„ ์ €์žฅํ•œ ๋‹ค์Œ Player.Graphic์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์—†์–ด๋„ ๋Ÿฐํƒ€์ž„ ์—…๋ฐ์ดํŠธ ticksAnim=Timer.
return  RunScenario();
 object? RunScenario()
{
    UO.Morph(0);
    return null;
}

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

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

  • ์ด๋Š” ์„œ๋ฒ„ ๋ณ€์‹ ์ด๋‚˜ ์ข…์กฑ/์‚ฌ์šฉ ๊ฐ€๋Šฅ ์Šคํ‚ฌ์˜ ๋ณ€ํ™”๊ฐ€ ์•„๋‹Œ ๋กœ์ปฌ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค. ushort ์™ธ๋ถ€์˜ ๊ฐ’์€ ์ด ๋ธŒ๋ฆฌ์ง€ ๊ธฐ๋Šฅ์œผ๋กœ ํ™•์ธ๋˜์ง€ ์•Š์œผ๋ฉฐ 16 ๋น„ํŠธ๋กœ ๊ฐ์†Œ๋ฉ๋‹ˆ๋‹ค.
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.Morph("0x0190");
        UO.Wait(500);
        UO.Morph(0);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.Morph(type) โ€” UO.Morph(Integer)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void Morph(int type)

        {

            bridge.Morph(type);

            ticksAnim = Timer();

        }

UO.Morph(type) โ€” UO.Morph(String)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void Morph(string type) => Morph(ResolveType(type));

UO.OpenIDE

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

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

void UO.OpenIDE();
void UO.OpenIDE(object? filePath);

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

  • filePath โ€” ์„ ํƒ์  ๊ฒฝ๋กœ. ๊ณต๋ฐฑ/๊ณต๋ฐฑ - ํŒŒ์ผ์„ ์„ ํƒํ•˜์ง€ ์•Š๊ณ  ํŽธ์ง‘๊ธฐ๋ฅผ ์—ฝ๋‹ˆ๋‹ค. ์ƒ๋Œ€๋Š” _manager.AutoloadPath์—์„œ ํ™•์ธ๋˜๋ฉฐ ์ ˆ๋Œ€๊ฐ’์€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • Bridge.OpenIDE๋Š” ์š”์ฒญ๋œ ๊ฒฝ๋กœ๋ฅผ ์ค€๋น„ํ•œ ๋‹ค์Œ Invoke ํ˜ธ์ถœ YokoScriptEditorGump.Open(_world,requested)์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์˜ ์Šคํฌ๋ฆฝํŠธ๋Š” OpenIDE ๋ช…๋ น์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํŽธ์ง‘๊ธฐ๋Š” ์™ธ๋ถ€ Launch ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•„๋‹Œ ๊ทธ๋ž˜ํ”ฝ ์ฐฝ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ ์ฝ๊ธฐ/ํ‘œ์‹œ๋Š” ๊ฒฝ๋กœ ๋ฐ ํŽธ์ง‘๊ธฐ ๋…ผ๋ฆฌ์˜ ์กด์žฌ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ๊ทธ๋ž˜ํ”ฝ ํŽธ์ง‘๊ธฐ C# IDE๋ฅผ ์—ฝ๋‹ˆ๋‹ค.
UO.OpenIDE();

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

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

  • Bridge.OpenIDE๋Š” ์š”์ฒญ๋œ ๊ฒฝ๋กœ๋ฅผ ์ค€๋น„ํ•œ ๋‹ค์Œ Invoke ํ˜ธ์ถœ YokoScriptEditorGump.Open(_world,requested)์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์˜ ์Šคํฌ๋ฆฝํŠธ๋Š” OpenIDE ๋ช…๋ น์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.OpenIDE("Example.csx");
    return null;
}

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

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

  • ํŽธ์ง‘๊ธฐ๋Š” ์™ธ๋ถ€ Launch ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•„๋‹Œ ๊ทธ๋ž˜ํ”ฝ ์ฐฝ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ ์ฝ๊ธฐ/ํ‘œ์‹œ๋Š” ๊ฒฝ๋กœ ๋ฐ ํŽธ์ง‘๊ธฐ ๋…ผ๋ฆฌ์˜ ์กด์žฌ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
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 path = "C:\\UO Scripts\\Example.csx";
        UO.OpenIDE(path);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.OpenIDE() โ€” UO.OpenIDE()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void OpenIDE() => bridge.OpenIDE(string.Empty);

UO.OpenIDE(filePath) โ€” UO.OpenIDE(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void OpenIDE(InjectionValue filePath) => bridge.OpenIDE(filePath.ToString());

UO.Print

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

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

void UO.Print(object? msg);
void UO.Print(object? msg, object? color);

์Šคํฌ๋ฆฝํŠธ ์ง„ํ–‰ ๋˜๋Š” ์ค‘์ง€ ์กฐ๊ฑด์— ๋Œ€ํ•œ ๋กœ์ปฌ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ ๋‹ค๋ฅธ ํ”Œ๋ ˆ์ด์–ด๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

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

  • color - UO hue, RGB ์•„๋‹˜. ์ˆซ์ž ๋˜๋Š” 16์ง„์ˆ˜ ๋ฌธ์ž์—ด. ๋ธŒ๋ฆฌ์ง€๋Š” ๋‚ฎ์€ 16 ๋น„ํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. graphic/type์™€ ํ˜ผ๋™ํ•˜์ง€ ๋งˆ์„ธ์š”. ์˜ˆ์‹œ์—์„œ๋Š” 0x0044๊ฐ€ ์„ ํƒ๋œ hue์ž…๋‹ˆ๋‹ค. ์ƒ‰์ƒ์ด ์—†์œผ๋ฉด hue 0x03B2๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. UO.Print(text, color)๋Š” ํ…์ŠคํŠธ๋ฅผ ๋จผ์ € ๋ฐ›์•„๋“ค์ž…๋‹ˆ๋‹ค. UO.ColorPrint(color, text) โ€“ ์ƒ‰์ƒ ์šฐ์„ .

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ๋ฉ”์‹œ์ง€๋Š” ๊ฒŒ์ž„์ฐฝ ์ขŒ์ธกํ•˜๋‹จ๊ณผ ๋กœ์ปฌ๋กœ๊ทธ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ IDE์—์„œ ์‚ฌ๋ณธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž์˜ ์ผ๋ฐ˜ ๋กœ๊ทธ์—์„œ ์Šคํฌ๋ฆฝํŠธ ๋ฉ”์‹œ์ง€ ํ•„ํ„ฐ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๊ฒŒ์ž„ ์ฐฝ ์—†์ด ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€ ํ•„ํ„ฐ๋Š” ๊ทธ๋Ÿฌํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ์Œ์„ฑ ํŒจํ‚ท์ด ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋จธ๋ฆฌ ์œ„์˜ ๋น„๋ฌธ์—๋Š” UO.CharPrint์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • UO.Print๋Š” ๊ฒŒ์ž„ ๋ฉ”์‹œ์ง€ ๋กœ๊ทธ์— ์ƒˆ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ์›ํ•˜๋Š” ๊ฒ€์ƒ‰ ๋ฌธ์ž์—ด/๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ €์žฅํ•œ ๋‹ค์Œ ์ง„๋‹จ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๋น ๋ฅธ ๋ฃจํ”„์—์„œ๋Š” ๋ชจ๋“  ๋ฐ˜๋ณต์ด ์•„๋‹Œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•  ๋•Œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒ‰์ƒ์ด ์—†์œผ๋ฉด hue 0x03B2๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. UO.Print(text, color)๋Š” ํ…์ŠคํŠธ๋ฅผ ๋จผ์ € ๋ฐ›์•„๋“ค์ž…๋‹ˆ๋‹ค. UO.ColorPrint(color, text) โ€“ ์ƒ‰์ƒ ์šฐ์„ .
  • UO.Print ยท UO.CharPrint ยท UO.Say ยท UO.ConColor

์˜ˆ์‹œ .csx

UO.Print("C# script started");
UO.Print($"Position: {UO.GetX()}, {UO.GetY()}");

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

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

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

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

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ด๋ฉฐ ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค(void). ๋ฉ”์‹œ์ง€ ๋‚ด์šฉ์€ ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

UO.Print("Hello from C#");

1. ๊ฐ„๋žตํ•œ ๋ณด๊ณ ์„œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ฒ˜๋ฆฌ๋จ=12 โ€” ์ด๋ฏธ ์ฒ˜๋ฆฌ๋œ ํ•ญ๋ชฉ์˜ ๋ฐ๋ชจ ์ˆ˜์ž…๋‹ˆ๋‹ค. Convert.ToString๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” ์ˆซ์ž๋งŒ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์ „์†กํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
var processed = 12;
UO.Print("Processed item entries: " + Convert.ToString(processed), 0x0044);

2. ๊ณผ๋ถ€ํ•˜ ๊ฒฝ๊ณ  - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์บ๋ฆญํ„ฐ์˜ ๋ฌด๊ฒŒ์™€ ์ตœ๋Œ€๊ฐ’์„ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค. 0/์•Œ ์ˆ˜ ์—†๋Š” ์ตœ๋Œ€๊ฐ’์€ ๊ณผ๋ถ€ํ•˜๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌด๊ฒŒ๊ฐ€ ์ตœ๋Œ€๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ํ•œ ์ค„์ด ์ธ์‡„๋˜๊ณ  Main์ด ๋๋‚ฉ๋‹ˆ๋‹ค. ๋ฌผ๊ฑด์€ ๋ฒ„๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var weight = UO.Weight();
    var maximum = UO.MaxWeight();
    if (Truth(maximum > 0) && Truth(weight >= maximum))
    {
        UO.Print("Too heavy: " + Convert.ToString(weight) + "/" + Convert.ToString(maximum), 0x0044);
        return null;
    }

    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. ์ค‘๋Ÿ‰ ๋ณ€๊ฒฝ๋งŒ ๋ณด๊ณ  - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • Main์€ ๊ฐ€์ค‘์น˜๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  1000 ๋ฐ€๋ฆฌ์ดˆ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ์™„์ „ํžˆ ์„ ์–ธ๋œ ReportWeight๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋ณด์กฐ์ž๋Š” ๋ฌด๊ฒŒ๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ์—๋งŒ ์ธ์‡„ํ•˜๊ณ  ๋‹ค์Œ ์ ๊ฒ€์„ ์œ„ํ•ด ์ƒˆ ๋ฌด๊ฒŒ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ž์ฒด๋กœ๋Š” ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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 previous = UO.Weight();
        UO.Wait(1000);
        previous = ReportWeight(previous, UO.Weight());
        return null;
    }

    dynamic ReportWeight(dynamic previous, dynamic current)
    {
        if (Truth(previous != current))
        {
            UO.Print("Weight changed: " + Convert.ToString(current), 0x0044);
        }

        return current;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.Print(msg) โ€” UO.Print(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void Print(InjectionValue msg)

        {

            bridge.Print(msg.ToString());

        }

UO.Print(msg, color) โ€” UO.Print(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void Print(InjectionValue msg, InjectionValue color)

        {

            bridge.Print(NumberConversions.ToInt(color), msg.ToString());

        }

UO.RemoveFigure

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

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

dynamic UO.RemoveFigure(object? figureID);

ID๋กœ ์ง€์—ญ ์ง€๋„ ๊ทธ๋ฆผ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

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

  • figureID - int ID, AddFigure๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ serial ์•„์ดํ…œ๋„ ์•„๋‹ˆ๊ณ  ID ๊ฒ€ํ”„๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int โ€” ๋ธŒ๋ฆฌ์ง€์˜ ๊ฒฐ๊ณผ.RemoveMapFigure: 1/0 ์ œ๊ฑฐ๋œ ๊ทธ๋ฆผ์˜ ์กด์žฌ ์—ฌ๋ถ€. ๋ธŒ๋ฆฟ์ง€ ๊ฒฐ๊ณผ์— ๊ด€๊ณ„์—†์ด ๋Ÿฐํƒ€์ž„ ํ•ญ๋ชฉ์ด ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋จผ์ € bridge.RemoveMapFigure๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ state.MapFigures.Remove(id)๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋ธŒ๋ฆฌ์ง€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†์Œ ID๋Š” ๋ชจ์–‘์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์„œ๋ฒ„ ์ž‘์—…์„ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ง€๋„์˜ ์ง€์—ญ์  ๋ชจ์Šต์€ ์„ธ๊ณ„์˜ ๋Œ€์ƒ์ด ์•„๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ์–‘๊ณผ ์„œ๋ฒ„ ํ˜•์ƒ์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • WorldMapGump๋Š” ํ”„๋กœ์„ธ์Šค์˜ ์ •์  ์‚ฌ์ „์— ๊ทธ๋ฆผ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ•œ ์„ธ๊ณ„/ํ”„๋กœํ•„์˜ ์ผ๋ฐ˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ๋Š” ๊ณตํ†ต GetPersistentState ๋ฐ ์นด์šดํ„ฐ ID๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ๊ด€๋ฆฌ์ž ํ”„๋กœ์„ธ์Šค๋Š” ๋„๋ฉด์„ ๊ณต์œ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. World.Clear/YokoScripts.Clear ๋ฐ ํ”„๋กœํ•„ ๋กœ๋“œ ๋กœ๋“œ๋Š” ์ด ์‚ฌ์ „์„ ์ง€์šฐ๊ฑฐ๋‚˜ ๋ณต์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋กœ๋”๋Š” UserStatics๋งŒ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ ๋„๋ฉด์€ worldNum๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ ์›”๋“œ/ํ”„๋กœํ•„ ๋ณ€๊ฒฝ์—๋„ ์‚ด์•„๋‚จ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ƒํƒœ๋Š” ๊ธฐ์กด ID ๋„๋ฉด์„ ๋‹ค์‹œ ๊ฐ•์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ClearFigures ๋„๋ฉด๊ณผ ํ˜„์žฌ ์ƒํƒœ ๊ธฐ๋ก์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์›๋‹ˆ๋‹ค. ์„ฑ๊ณต - ํ‘œ์‹œ ์ฆ๋ช…์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ/์‚ญ์ œ.

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

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

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

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

var id = UO.AddFigure(new object?[] { 0, 0, UO.X(), UO.Y(), UO.X() + 3, UO.Y(), 0, 0, 255 });
UO.Print("Removed flag: " + Convert.ToString(UO.RemoveFigure(id)));

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

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

  • ID๋กœ ์ง€์—ญ ์ง€๋„ ๊ทธ๋ฆผ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
UO.Print(UO.RemoveFigure(1));

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

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

  • ๋จผ์ € bridge.RemoveMapFigure๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ state.MapFigures.Remove(id)๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋ธŒ๋ฆฌ์ง€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†์Œ ID๋Š” ๋ชจ์–‘์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์„œ๋ฒ„ ์ž‘์—…์„ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    dynamic[] figure = new dynamic[checked((int)(10) + 1)];
    figure[0] = 0;
    figure[1] = 0;
    figure[2] = UO.GetX();
    figure[3] = UO.GetY();
    figure[4] = UO.GetX() + 1;
    figure[5] = UO.GetY() + 1;
    figure[6] = 0;
    figure[7] = 0;
    figure[8] = 0;
    figure[9] = UO.WorldNum();
    figure[10] = "Example";
    var id = UO.AddFigure(figure);
    if (Truth(id > 0))
    {
        UO.Print(UO.RemoveFigure(id));
    }

    return null;
}

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

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

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

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

     public object? RunScenario()
    {
        var id = 1;
        var first = UO.RemoveFigure(id);
        var second = UO.RemoveFigure(id);
        UO.Print(Convert.ToString(first) + " " + Convert.ToString(second));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.RemoveFigure(figureID) โ€” UO.RemoveFigure(Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "removefigure":

                {

                    int id = Arg(0);

                    int removed = bridge.RemoveMapFigure(id);

                    state.MapFigures.Remove(id);

                    return new InjectionValue(removed);

                }

UO.ServerPrint

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

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

void UO.ServerPrint(object? message);

์Šคํฌ๋ฆฝํŠธ ์ง„ํ–‰ ๋˜๋Š” ์ค‘์ง€ ์กฐ๊ฑด์— ๋Œ€ํ•œ ๋กœ์ปฌ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ ๋‹ค๋ฅธ ํ”Œ๋ ˆ์ด์–ด๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ๋ฉ”์‹œ์ง€๋Š” ๊ฒŒ์ž„์ฐฝ ์ขŒ์ธกํ•˜๋‹จ๊ณผ ๋กœ์ปฌ๋กœ๊ทธ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ IDE์—์„œ ์‚ฌ๋ณธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž์˜ ์ผ๋ฐ˜ ๋กœ๊ทธ์—์„œ ์Šคํฌ๋ฆฝํŠธ ๋ฉ”์‹œ์ง€ ํ•„ํ„ฐ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๊ฒŒ์ž„ ์ฐฝ ์—†์ด ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€ ํ•„ํ„ฐ๋Š” ๊ทธ๋Ÿฌํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ์Œ์„ฑ ํŒจํ‚ท์ด ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋จธ๋ฆฌ ์œ„์˜ ๋น„๋ฌธ์—๋Š” UO.CharPrint์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • UO.Print๋Š” ๊ฒŒ์ž„ ๋ฉ”์‹œ์ง€ ๋กœ๊ทธ์— ์ƒˆ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ์›ํ•˜๋Š” ๊ฒ€์ƒ‰ ๋ฌธ์ž์—ด/๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ €์žฅํ•œ ๋‹ค์Œ ์ง„๋‹จ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๋น ๋ฅธ ๋ฃจํ”„์—์„œ๋Š” ๋ชจ๋“  ๋ฐ˜๋ณต์ด ์•„๋‹Œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•  ๋•Œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒ‰์ƒ์ด ์—†์œผ๋ฉด hue 0x03B2๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. UO.Print(text, color)๋Š” ํ…์ŠคํŠธ๋ฅผ ๋จผ์ € ๋ฐ›์•„๋“ค์ž…๋‹ˆ๋‹ค. UO.ColorPrint(color, text) โ€“ ์ƒ‰์ƒ ์šฐ์„ .
  • ์„œ๋ฒ„ ์ด๋ฆ„์ด๋‚˜ ๋„คํŠธ์›Œํฌ ๋ฉ”์‹œ์ง€์™€์˜ ์œ ์‚ฌ์„ฑ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด ๋ช…๋ น์€ ๋กœ์ปฌ ํ…์ŠคํŠธ๋งŒ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค. ์ „ ์„ธ๊ณ„์™€ ๋Œ€ํ™”ํ•˜๋ ค๋ฉด UO.Say๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • UO.Print ยท UO.CharPrint ยท UO.Say ยท UO.ConColor

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

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

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

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

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ด๋ฉฐ ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค(void). ๋ฉ”์‹œ์ง€ ๋‚ด์šฉ์€ ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

UO.ServerPrint("Hello from C#");

1. ๊ฐ„๋žตํ•œ ๋ณด๊ณ ์„œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ฒ˜๋ฆฌ๋จ=12 โ€” ์ด๋ฏธ ์ฒ˜๋ฆฌ๋œ ํ•ญ๋ชฉ์˜ ๋ฐ๋ชจ ์ˆ˜์ž…๋‹ˆ๋‹ค. Convert.ToString๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” ์ˆซ์ž๋งŒ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์ „์†กํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
var processed = 12;
UO.ServerPrint("Processed item entries: " + Convert.ToString(processed));

2. ๊ณผ๋ถ€ํ•˜ ๊ฒฝ๊ณ  - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์บ๋ฆญํ„ฐ์˜ ๋ฌด๊ฒŒ์™€ ์ตœ๋Œ€๊ฐ’์„ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค. 0/์•Œ ์ˆ˜ ์—†๋Š” ์ตœ๋Œ€๊ฐ’์€ ๊ณผ๋ถ€ํ•˜๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌด๊ฒŒ๊ฐ€ ์ตœ๋Œ€๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ํ•œ ์ค„์ด ์ธ์‡„๋˜๊ณ  Main์ด ๋๋‚ฉ๋‹ˆ๋‹ค. ๋ฌผ๊ฑด์€ ๋ฒ„๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var weight = UO.Weight();
    var maximum = UO.MaxWeight();
    if (Truth(maximum > 0) && Truth(weight >= maximum))
    {
        UO.ServerPrint("Too heavy: " + Convert.ToString(weight) + "/" + Convert.ToString(maximum));
        return null;
    }

    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. ์ค‘๋Ÿ‰ ๋ณ€๊ฒฝ๋งŒ ๋ณด๊ณ  - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • Main์€ ๊ฐ€์ค‘์น˜๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  1000 ๋ฐ€๋ฆฌ์ดˆ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ์™„์ „ํžˆ ์„ ์–ธ๋œ ReportWeight๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋ณด์กฐ์ž๋Š” ๋ฌด๊ฒŒ๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ์—๋งŒ ์ธ์‡„ํ•˜๊ณ  ๋‹ค์Œ ์ ๊ฒ€์„ ์œ„ํ•ด ์ƒˆ ๋ฌด๊ฒŒ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ž์ฒด๋กœ๋Š” ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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 previous = UO.Weight();
        UO.Wait(1000);
        previous = ReportWeight(previous, UO.Weight());
        return null;
    }

    dynamic ReportWeight(dynamic previous, dynamic current)
    {
        if (Truth(previous != current))
        {
            UO.ServerPrint("Weight changed: " + Convert.ToString(current));
        }

        return current;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.ServerPrint(message) โ€” UO.ServerPrint(String)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void ServerPrint(string message) => bridge.ServerPrint(message);

UO.SetShowZ

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

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

void UO.SetShowZ(object? stateValue);

๋กœ์ปฌ ํ”Œ๋ž˜๊ทธ showZ ๋Ÿฐํƒ€์ž„์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

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

  • stateValue - 0๊ฐ€ ๊บผ์ง‘๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๋ชจ๋“  ์ •์ˆ˜๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • showZ์— NumberConversions.ToInt ๋’ค์— 0 ๋˜๋Š” 1 ๊ฐ’์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜ ์ž์ฒด๋Š” ์ขŒํ‘œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ํŒจํ‚ท์„ ๋ณด๋‚ด์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” ํ˜„์žฌ ๋Ÿฐํƒ€์ž„์˜ ํ˜ธํ™˜์„ฑ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๋น„๊ณต๊ฐœ mulPath/showZ์—๋Š” ์†Œ๋น„์ž๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ž์‚ฐ์„ ๋‹ค์‹œ ๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ๋†’์ด ํ‘œ์‹œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ๋กœ์ปฌ ํ”Œ๋ž˜๊ทธ showZ ๋Ÿฐํƒ€์ž„์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
UO.SetShowZ(1);

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

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

  • showZ์— NumberConversions.ToInt ๋’ค์— 0 ๋˜๋Š” 1 ๊ฐ’์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜ ์ž์ฒด๋Š” ์ขŒํ‘œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ํŒจํ‚ท์„ ๋ณด๋‚ด์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.SetShowZ(0);
    return null;
}

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

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

  • ์ด๋Š” ํ˜„์žฌ ๋Ÿฐํƒ€์ž„์˜ ํ˜ธํ™˜์„ฑ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๋น„๊ณต๊ฐœ mulPath/showZ์—๋Š” ์†Œ๋น„์ž๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ž์‚ฐ์„ ๋‹ค์‹œ ๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ๋†’์ด ํ‘œ์‹œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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()
    {
        ApplyValue(1);
        return null;
    }

    void ApplyValue(dynamic value)
    {
        UO.SetShowZ(value);
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.SetShowZ(stateValue) โ€” UO.SetShowZ(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void SetShowZ(InjectionValue stateValue) => showZ = NumberConversions.ToInt(stateValue) != 0 ? 1 : 0;

UO.SetSilentMode

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

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

void UO.SetSilentMode(object? value);

๋กœ์ปฌ ํ”Œ๋ž˜๊ทธ SilentMode ๋Ÿฐํƒ€์ž„์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

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

  • value - 0๊ฐ€ ๊บผ์ง‘๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๋ชจ๋“  ์ •์ˆ˜๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • SilentMode๋ฅผ 0/1๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. GumpLinesResult๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. 0๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฐ๊ณผ GetGumpShortLines/GetGumpFullLines/GetGumpButtonsDescription๊ฐ€ ์ถ”๊ฐ€๋กœ ํ…์ŠคํŠธ ์ฐฝ์— ์ธ์‡„๋˜์–ด ์—ด๋ฆฝ๋‹ˆ๋‹ค. 1๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ์ถ”๊ฐ€ ํ‘œ์‹œ๊ฐ€ ์–ต์ œ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ ๋ฐฐ์—ด์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐํƒ€ Print ์‚ฌ์šด๋“œ์™€ ์„œ๋ฒ„ ๋ฉ”์‹œ์ง€๋Š” ์–ต์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • SilentMode๋ฅผ 0/1๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. GumpLinesResult๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. 0๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฐ๊ณผ GetGumpShortLines/GetGumpFullLines/GetGumpButtonsDescription๊ฐ€ ์ถ”๊ฐ€๋กœ ํ…์ŠคํŠธ ์ฐฝ์— ์ธ์‡„๋˜์–ด ์—ด๋ฆฝ๋‹ˆ๋‹ค. 1๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ์ถ”๊ฐ€ ํ‘œ์‹œ๊ฐ€ ์–ต์ œ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ ๋ฐฐ์—ด์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐํƒ€ Print ์‚ฌ์šด๋“œ์™€ ์„œ๋ฒ„ ๋ฉ”์‹œ์ง€๋Š” ์–ต์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
UO.SetSilentMode(1);

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

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

  • SilentMode๋ฅผ 0/1๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. GumpLinesResult๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. 0๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฐ๊ณผ GetGumpShortLines/GetGumpFullLines/GetGumpButtonsDescription๊ฐ€ ์ถ”๊ฐ€๋กœ ํ…์ŠคํŠธ ์ฐฝ์— ์ธ์‡„๋˜์–ด ์—ด๋ฆฝ๋‹ˆ๋‹ค. 1๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ์ถ”๊ฐ€ ํ‘œ์‹œ๊ฐ€ ์–ต์ œ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ ๋ฐฐ์—ด์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐํƒ€ Print ์‚ฌ์šด๋“œ์™€ ์„œ๋ฒ„ ๋ฉ”์‹œ์ง€๋Š” ์–ต์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.SetSilentMode(0);
    return null;
}

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

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

  • SilentMode๋ฅผ 0/1๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. GumpLinesResult๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. 0๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฐ๊ณผ GetGumpShortLines/GetGumpFullLines/GetGumpButtonsDescription๊ฐ€ ์ถ”๊ฐ€๋กœ ํ…์ŠคํŠธ ์ฐฝ์— ์ธ์‡„๋˜์–ด ์—ด๋ฆฝ๋‹ˆ๋‹ค. 1๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ์ถ”๊ฐ€ ํ‘œ์‹œ๊ฐ€ ์–ต์ œ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ ๋ฐฐ์—ด์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐํƒ€ Print ์‚ฌ์šด๋“œ์™€ ์„œ๋ฒ„ ๋ฉ”์‹œ์ง€๋Š” ์–ต์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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()
    {
        ApplyValue(1);
        return null;
    }

    void ApplyValue(dynamic value)
    {
        UO.SetSilentMode(value);
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "setsilentmode": state.SilentMode = Arg(0) != 0 ? 1 : 0; return InjectionValue.Unit;

UO.ShowJournal

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

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

void UO.ShowJournal();

๋กœ์ปฌ ํด๋ผ์ด์–ธํŠธ ๋กœ๊ทธ ์ฐฝ์„ ์—ฝ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ShowJournal๋Š” GameActions.OpenJournal(_world)๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ก์ด ์ง€์›Œ์ง€์ง€ ์•Š์œผ๋ฉฐ ํ…์ŠคํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ง€์ •๋œ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋งŒ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์—๋Š” ์„œ๋ฒ„ ํ™•์ธ์ด ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ๋กœ์ปฌ ํด๋ผ์ด์–ธํŠธ ๋กœ๊ทธ ์ฐฝ์„ ์—ฝ๋‹ˆ๋‹ค.
UO.ShowJournal();

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

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

  • ShowJournal๋Š” GameActions.OpenJournal(_world)๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ก์ด ์ง€์›Œ์ง€์ง€ ์•Š์œผ๋ฉฐ ํ…์ŠคํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Print("Journal example");
    UO.ShowJournal();
    return null;
}

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

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

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

     public object? RunScenario()
    {
        UO.ShowJournal();
        UO.Print(UO.LineCount());
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.ShowJournal() โ€” UO.ShowJournal()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "showjournal": bridge.ShowJournal(); break;

UO.Snap

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

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

int UO.Snap();
int UO.Snap(object? name);
int UO.Snap(object? name, object? quality);
int UO.Snap(object? file, object? quality, object? includeUI);

ํด๋ผ์ด์–ธํŠธ ๊ทธ๋ž˜ํ”ฝ ์ฐฝ์˜ ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

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

  • name โ€” ์„ ํƒ์  ํŒŒ์ผ ์ด๋ฆ„. .jpg/.jpeg๋Š” JPEG๋ฅผ ์„ ํƒํ•˜๊ณ , ๊ธฐํƒ€/์—†์Œ์€ PNG๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์˜ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ด๋ฆ„๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • file โ€” ์„ ํƒ์  ํŒŒ์ผ ์ด๋ฆ„. .jpg/.jpeg๋Š” JPEG๋ฅผ ์„ ํƒํ•˜๊ณ , ๊ธฐํƒ€/์—†์Œ์€ PNG๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์˜ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ด๋ฆ„๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • quality โ€” ์„ ํƒ ์‚ฌํ•ญ int, ๊ธฐ๋ณธ๊ฐ’์€ 100, 1..100๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. JPEG์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. PNG๋Š” ์†์‹ค ํ’ˆ์งˆ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • includeUI - ์„ ํƒ ์‚ฌํ•ญ bool, ๊ธฐ๋ณธ๊ฐ’ true. false๋Š” UI ์—†์ด ์„ธ๊ณ„/์กฐ๋ช…์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

์ˆซ์ž ํ”Œ๋ž˜๊ทธ int: 1 - ์ด๋ฏธ์ง€ ํŒŒ์ผ์ด ์ €์žฅ๋จ, 0 - ์บก์ฒ˜/์“ฐ๊ธฐ ์˜ค๋ฅ˜. ๊ทธ๋ž˜ํ”ฝ ์ฐฝ์ด ์—†์œผ๋ฉด RequireGameView๋Š” TakeScreenshot ์ด์ „์— ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

๋™์ž‘

  • TakeScreenshot๋Š” ExecutablePath/Data/Client/Screenshots์— ๊ธฐ๋กํ•˜๊ณ , ์ž˜๋ชป๋œ ์ด๋ฆ„ ๋ฌธ์ž๋ฅผ ์‚ญ์ œํ•˜๊ณ , ๋น„์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ๋‚ ์งœ๋ณ„๋กœ ์ด๋ฆ„์„ ์„ ํƒํ•˜๊ณ , ๊ธฐ์กด ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ _2/_3์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ž„์˜์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • UI๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐฑ๋ฒ„ํผ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. UI ์—†์ด RenderTarget2D๋ฅผ ๋งŒ๋“ค๊ณ  ์„ธ์ƒ์„ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. JPEG๋Š” ๋ณต์›์„ ํ†ตํ•ด FNA_GRAPHICS_JPEG_SAVE_QUALITY๋ฅผ ์ž„์‹œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. PNG SaveAsPng. TakeScreenshot ๋‚ด๋ถ€์˜ ์˜ค๋ฅ˜๋Š” ๊ธฐ๋ก๋˜์–ด 0๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ํด๋ผ์ด์–ธํŠธ ๊ทธ๋ž˜ํ”ฝ ์ฐฝ์˜ ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
UO.Print(UO.Snap());

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

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

  • TakeScreenshot๋Š” ExecutablePath/Data/Client/Screenshots์— ๊ธฐ๋กํ•˜๊ณ , ์ž˜๋ชป๋œ ์ด๋ฆ„ ๋ฌธ์ž๋ฅผ ์‚ญ์ œํ•˜๊ณ , ๋น„์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ๋‚ ์งœ๋ณ„๋กœ ์ด๋ฆ„์„ ์„ ํƒํ•˜๊ณ , ๊ธฐ์กด ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ _2/_3์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ž„์˜์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.Snap("manual-example.jpg", 85));
    return null;
}

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

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

  • UI๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐฑ๋ฒ„ํผ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. UI ์—†์ด RenderTarget2D๋ฅผ ๋งŒ๋“ค๊ณ  ์„ธ์ƒ์„ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. JPEG๋Š” ๋ณต์›์„ ํ†ตํ•ด FNA_GRAPHICS_JPEG_SAVE_QUALITY๋ฅผ ์ž„์‹œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. PNG SaveAsPng. TakeScreenshot ๋‚ด๋ถ€์˜ ์˜ค๋ฅ˜๋Š” ๊ธฐ๋ก๋˜์–ด 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.Print(UO.Snap("manual-world.png", 100, false));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.Snap() โ€” UO.Snap()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int Snap() => bridge.Snap(null, 100, true);

UO.Snap(name) โ€” UO.Snap(String)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int Snap(string name) => bridge.Snap(name, 100, true);

UO.Snap(name, quality) โ€” UO.Snap(String,Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: name (String), quality (Integer)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int Snap(string name, int quality) => bridge.Snap(name, Math.Max(1, Math.Min(100, quality)), true);

UO.Snap(file, quality, includeUI) โ€” UO.Snap(Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: file (Any), quality (Any), includeUI (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(Snap(values[0].ToString(), NumberConversions.ToInt(values[1]), ToBoolean(values[2])))

UO.TextClear

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

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

void UO.TextClear();

๋กœ์ปฌ ํ…์ŠคํŠธ ์ฐฝ์˜ ๋ฒ„ํผ๋ฅผ ์ง€์›๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • _textWindow๋ฅผ ์ง€์›๋‹ˆ๋‹ค. ์ฐฝ์ด ์—ด๋ ค ์žˆ์œผ๋ฉด ๋นˆ ๋ชฉ๋ก์œผ๋กœ ๋‹ค์‹œ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋‹ซํžŒ ์ฐฝ์€ ๋‹ซํžŒ ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ๋กœ๊ทธ๋Š” ์ง€์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ž‘์—…์€ ๋กœ์ปฌ ์ธํ„ฐํŽ˜์ด์Šค/๋ฒ„ํผ์ž…๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ๋ฉ”์‹œ์ง€๋‚˜ ์„œ๋ฒ„ ํ™•์ธ์ด ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ๋กœ์ปฌ ํ…์ŠคํŠธ ์ฐฝ์˜ ๋ฒ„ํผ๋ฅผ ์ง€์›๋‹ˆ๋‹ค.
UO.TextClear();

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

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

  • _textWindow๋ฅผ ์ง€์›๋‹ˆ๋‹ค. ์ฐฝ์ด ์—ด๋ ค ์žˆ์œผ๋ฉด ๋นˆ ๋ชฉ๋ก์œผ๋กœ ๋‹ค์‹œ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋‹ซํžŒ ์ฐฝ์€ ๋‹ซํžŒ ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ๋กœ๊ทธ๋Š” ์ง€์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.TextPrint("Old line");
    UO.TextClear();
    return null;
}

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

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

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

     public object? RunScenario()
    {
        UO.TextClose();
        UO.TextClear();
        UO.TextOpen();
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.TextClear() โ€” UO.TextClear()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void TextClear() => bridge.TextClear();

UO.TextClose

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

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

void UO.TextClose();

๋กœ์ปฌ ํ…์ŠคํŠธ ์ฐฝ์„ ๋‹ซ๊ณ  ๋ฒ„ํผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • _textWindowOpen=false๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ธฐ์กด YokoTextWindowGump๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. _textWindow ๋ชฉ๋ก์€ ์ง€์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. TextOpen๋Š” ํ•ด๋‹น ํ–‰์„ ๋‹ค์‹œ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • ์ž‘์—…์€ ๋กœ์ปฌ ์ธํ„ฐํŽ˜์ด์Šค/๋ฒ„ํผ์ž…๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ๋ฉ”์‹œ์ง€๋‚˜ ์„œ๋ฒ„ ํ™•์ธ์ด ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ๋กœ์ปฌ ํ…์ŠคํŠธ ์ฐฝ์„ ๋‹ซ๊ณ  ๋ฒ„ํผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
UO.TextClose();

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

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

  • _textWindowOpen=false๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ธฐ์กด YokoTextWindowGump๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. _textWindow ๋ชฉ๋ก์€ ์ง€์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. TextOpen๋Š” ํ•ด๋‹น ํ–‰์„ ๋‹ค์‹œ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.TextPrint("Retained line");
    UO.TextClose();
    return null;
}

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

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

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

     public object? RunScenario()
    {
        UO.TextPrint("Retained line");
        UO.TextClose();
        UO.Wait(250);
        UO.TextOpen();
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.TextClose() โ€” UO.TextClose()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void TextClose() => bridge.TextClose();

UO.TextOpen

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

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

void UO.TextOpen();

๋กœ์ปฌ ํ…์ŠคํŠธ ์ฐฝ์„ ์—ฝ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • _textWindowOpen=true์„ ์ €์žฅํ•˜๊ณ  YokoTextWindowGump๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.ํ˜„์žฌ _textWindow๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„ํผ๋Š” ์ง€์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์—ด๋ฉด ๋ˆ„์ ๋œ ํ–‰์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • ์ž‘์—…์€ ๋กœ์ปฌ ์ธํ„ฐํŽ˜์ด์Šค/๋ฒ„ํผ์ž…๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ๋ฉ”์‹œ์ง€๋‚˜ ์„œ๋ฒ„ ํ™•์ธ์ด ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ๋กœ์ปฌ ํ…์ŠคํŠธ ์ฐฝ์„ ์—ฝ๋‹ˆ๋‹ค.
UO.TextOpen();

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

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

  • _textWindowOpen=true์„ ์ €์žฅํ•˜๊ณ  YokoTextWindowGump๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.ํ˜„์žฌ _textWindow๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„ํผ๋Š” ์ง€์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์—ด๋ฉด ๋ˆ„์ ๋œ ํ–‰์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.TextPrint("Example");
    UO.TextOpen();
    return null;
}

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

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

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

     public object? RunScenario()
    {
        UO.TextOpen();
        UO.Wait(500);
        UO.TextClose();
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.TextOpen() โ€” UO.TextOpen()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void TextOpen() => bridge.TextOpen();

UO.TextPrint

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

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

void UO.TextPrint(object? text);

๋กœ์ปฌ ํ…์ŠคํŠธ ์ฐฝ์— ์ค„์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์—ฝ๋‹ˆ๋‹ค.

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

  • text โ€” ToString์„ ํ†ตํ•œ ํ…์ŠคํŠธ; ์ „์†ก๋œ ์ƒํƒœ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ํ•œ๊ณ„์—์„œ MaxTextWindowLines=2000๋Š” ์ด์ „ ์ค„์„ ์ œ๊ฑฐํ•œ ๋‹ค์Œ ํ…์ŠคํŠธ๋‚˜ ๋นˆ ์ค„์„ ์ถ”๊ฐ€ํ•˜๊ณ  _textWindowOpen=true๋ฅผ ์„ค์ •ํ•˜๊ณ  ์ฐฝ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋กœ๊ทธ์˜ UO.Print๋„ ์•„๋‹ˆ๊ณ  ์„œ๋ฒ„์— ๋Œ€ํ•œ ์Œ์„ฑ๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • ์ž‘์—…์€ ๋กœ์ปฌ ์ธํ„ฐํŽ˜์ด์Šค/๋ฒ„ํผ์ž…๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ๋ฉ”์‹œ์ง€๋‚˜ ์„œ๋ฒ„ ํ™•์ธ์ด ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.TextPrint");
UO.TextPrint("Example");

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

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

  • ๋กœ์ปฌ ํ…์ŠคํŠธ ์ฐฝ์— ์ค„์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์—ฝ๋‹ˆ๋‹ค.
UO.TextPrint("Example");

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

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

  • ํ•œ๊ณ„์—์„œ MaxTextWindowLines=2000๋Š” ์ด์ „ ์ค„์„ ์ œ๊ฑฐํ•œ ๋‹ค์Œ ํ…์ŠคํŠธ๋‚˜ ๋นˆ ์ค„์„ ์ถ”๊ฐ€ํ•˜๊ณ  _textWindowOpen=true๋ฅผ ์„ค์ •ํ•˜๊ณ  ์ฐฝ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋กœ๊ทธ์˜ UO.Print๋„ ์•„๋‹ˆ๊ณ  ์„œ๋ฒ„์— ๋Œ€ํ•œ ์Œ์„ฑ๋„ ์•„๋‹™๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var message = "Line 1";
    UO.TextPrint(message);
    UO.TextPrint("Line 2");
    return null;
}

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

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

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

     public object? RunScenario()
    {
        UO.TextClear();
        UO.TextPrint("Fresh report");
        UO.TextClose();
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.TextPrint(text) โ€” UO.TextPrint(String)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void TextPrint(string text) => bridge.TextPrint(text);

UO.UpdateFigure

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

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

dynamic UO.UpdateFigure(object? figureID, object? figure);

๊ธฐ์กด ์ง€์—ญ ์ง€๋„ ๊ทธ๋ฆผ์˜ ์„ค๋ช…์„ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.

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

  • figureID - int ID ์ƒํƒœ์ž…๋‹ˆ๋‹ค. MapFigures๊ฐ€ AddFigure์—์„œ ์ˆ˜์‹ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†์Œ ID๋Š” 0๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • figure โ€” [kind,coord,x1,y1,x2,y2,brushColor,brushStyle,color,worldNum,text]๊ฐ€ ํฌํ•จ๋œ ๋ฐฐ์—ด ๋˜๋Š” ๋ฌธ์ž์—ด | ์ตœ์†Œ ์ฒซ ๋ฒˆ์งธ 9 ์ˆซ์ž ํ•„๋“œ; worldNum๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ˜„์žฌ ์ง€๋„์ด๊ณ , ๊ธฐ๋ณธ์ ์œผ๋กœ ํ…์ŠคํŠธ๋Š” ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • figure[0] (kind) - ์ข…๋ฅ˜๋Š” 0..4, coord - 0..1, FigureID - ์–‘์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. WorldMapGump.SetYokoMapFigure๋Š” ์ด๋Ÿฌํ•œ ๊ฒฝ๊ณ„๋ฅผ ์œ„๋ฐ˜ํ•˜๋ฉด 0๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • figure[1] (coord) - ์ข…๋ฅ˜๋Š” 0..4, coord - 0..1, FigureID - ์–‘์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. WorldMapGump.SetYokoMapFigure๋Š” ์ด๋Ÿฌํ•œ ๊ฒฝ๊ณ„๋ฅผ ์œ„๋ฐ˜ํ•˜๋ฉด 0๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

์ˆซ์ž ํ”Œ๋ž˜๊ทธ int: 1 - ๊ตฌ๋ฌธ ๋ถ„์„์ด ์„ฑ๊ณตํ–ˆ๊ณ  ๋ธŒ๋ฆฌ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. SetMapFigure๊ฐ€ 0์ด ์•„๋‹Œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ ํ›„ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 0 - ์•„๋‹ˆ์š” ID, ๊ตฌ์กฐ/์ˆซ์ž ํ…์ŠคํŠธ ํ•„๋“œ ์˜ค๋ฅ˜ ๋˜๋Š” ๋ธŒ๋ฆฌ์ง€ ์‹คํŒจ.

๋™์ž‘

  • TryMapFigureArg๋Š” ๋ฐฐ์—ด ๋˜๋Š” |string๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ 9 ํ•„๋“œ๊ฐ€ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ˆซ์ž ํ…์ŠคํŠธ๋Š” TryStr2Int๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. ์ง€์›๋˜์ง€ ์•Š๋Š” ๋ณด๊ธฐ/์งง์€ ํ‘œ๊ธฐ๋ฒ• - 0, ๊ธฐํƒ€ ๋ณด๊ธฐ ๋ณ€ํ™˜ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ธŒ๋ฆฟ์ง€๊ฐ€ ์‹คํŒจํ•˜๋ฉด ๊ธฐ์กด ๋Ÿฐํƒ€์ž„ ํ•ญ๋ชฉ์ด ๋Œ€์ฒด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ฑ๊ณตํ•˜๋ฉด SerializeMapFigure๋ฅผ 10 ์ˆซ์ž ํ•„๋“œ ๋ฐ ํ…์ŠคํŠธ์™€ ํ•จ๊ป˜ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆผ์€ ๋กœ์ปฌ์—๋งŒ ํ•ด๋‹น๋˜๋ฉฐ ์„œ๋ฒ„ ํ•ญ๋ชฉ์—๋Š” ํ•ด๋‹น๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ข…๋ฅ˜: 0 ์„ , 1 ํƒ€์›(32 ์œค๊ณฝ์„  ์„ธ๊ทธ๋จผํŠธ), 2 ์ง์‚ฌ๊ฐํ˜• ์œค๊ณฝ์„ , 3 ํ™”์‚ดํ‘œ, 4 ํ…์ŠคํŠธ. coord=0 โ€” ์ง€๋„๋กœ ๋ณ€ํ™˜๋œ ์„ธ๊ณ„ ์ขŒํ‘œ, coord=1 โ€” ์ง€๋„ ๊ทธ๋ฆฌ๊ธฐ ์˜์—ญ์„ ๊ธฐ์ค€์œผ๋กœ ํ•œ ํ”ฝ์…€. x1/y1 ๋ฐ x2/y2 - ๋/๊ฒฝ๊ณ„; ์„ธ๊ณ„ ํ™”์‚ดํ‘œ x2=y2=0์˜ ๊ฒฝ์šฐ ํ”Œ๋ ˆ์ด์–ด์˜ ์‹œ์ž‘๊ณผ x1/y1์˜ ๋ชฉํ‘œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. color โ€” 0x00BBGGRR (๋งˆ์ด๋„ˆ byte ๋นจ๊ฐ„์ƒ‰), ์œค๊ณฝ์„  ์ƒ‰์ƒ. brushColor/brushStyle๊ฐ€ ์ €์žฅ๋˜์—ˆ์ง€๋งŒ ๋ Œ๋”๋ง์—์„œ๋Š” ์ด๋ฅผ ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฑ„์šฐ๊ธฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. worldNum<0๋Š” ๋ชจ๋“  ์ง€๋„์— ํ‘œ์‹œ๋˜๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ง€์ •๋œ ์ง€๋„์—๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ํ…์ŠคํŠธ๋Š” ์™ธ๊ณฝ์„  ์ƒ‰์ƒ์ด ์•„๋‹Œ ์ง€๋„ ๊ธ€๊ผด์˜ ์ฒซ ๋ฒˆ์งธ ์ง€์ (ํ…์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ๋„ํ˜•์˜ ๊ฒฝ์šฐ +3 ํ”ฝ์…€)์— ๊ทธ๋ ค์ง‘๋‹ˆ๋‹ค.
  • WorldMapGump๋Š” ํ”„๋กœ์„ธ์Šค์˜ ์ •์  ์‚ฌ์ „์— ๊ทธ๋ฆผ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ•œ ์„ธ๊ณ„/ํ”„๋กœํ•„์˜ ์ผ๋ฐ˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ๋Š” ๊ณตํ†ต GetPersistentState ๋ฐ ์นด์šดํ„ฐ ID๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ๊ด€๋ฆฌ์ž ํ”„๋กœ์„ธ์Šค๋Š” ๋„๋ฉด์„ ๊ณต์œ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. World.Clear/YokoScripts.Clear ๋ฐ ํ”„๋กœํ•„ ๋กœ๋“œ ๋กœ๋“œ๋Š” ์ด ์‚ฌ์ „์„ ์ง€์šฐ๊ฑฐ๋‚˜ ๋ณต์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋กœ๋”๋Š” UserStatics๋งŒ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ ๋„๋ฉด์€ worldNum๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ ์›”๋“œ/ํ”„๋กœํ•„ ๋ณ€๊ฒฝ์—๋„ ์‚ด์•„๋‚จ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ƒํƒœ๋Š” ๊ธฐ์กด ID ๋„๋ฉด์„ ๋‹ค์‹œ ๊ฐ•์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ClearFigures ๋„๋ฉด๊ณผ ํ˜„์žฌ ์ƒํƒœ ๊ธฐ๋ก์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์›๋‹ˆ๋‹ค. ์„ฑ๊ณต - ํ‘œ์‹œ ์ฆ๋ช…์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ/์‚ญ์ œ.

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

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

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

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

object?[] figure = { 0, 0, UO.X(), UO.Y(), UO.X() + 3, UO.Y(), 0, 0, 255 };
var id = UO.AddFigure(figure);
figure[8] = 65280;
UO.Print("Updated flag: " + Convert.ToString(UO.UpdateFigure(id, figure)));

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

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

  • ๊ธฐ์กด ์ง€์—ญ ์ง€๋„ ๊ทธ๋ฆผ์˜ ์„ค๋ช…์„ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.
dynamic[] figure = new dynamic[checked((int)(8) + 1)];
figure[0] = 0;
figure[1] = 0;
figure[2] = 100;
figure[3] = 100;
figure[4] = 101;
figure[5] = 101;
figure[6] = 0;
figure[7] = 0;
figure[8] = 0;
UO.Print(UO.UpdateFigure(1, figure));

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

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

  • TryMapFigureArg๋Š” ๋ฐฐ์—ด ๋˜๋Š” |string๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ 9 ํ•„๋“œ๊ฐ€ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ˆซ์ž ํ…์ŠคํŠธ๋Š” TryStr2Int๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. ์ง€์›๋˜์ง€ ์•Š๋Š” ๋ณด๊ธฐ/์งง์€ ํ‘œ๊ธฐ๋ฒ• - 0, ๊ธฐํƒ€ ๋ณด๊ธฐ ๋ณ€ํ™˜ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    dynamic[] figure = new dynamic[checked((int)(10) + 1)];
    figure[0] = 0;
    figure[1] = 0;
    figure[2] = UO.GetX();
    figure[3] = UO.GetY();
    figure[4] = UO.GetX() + 1;
    figure[5] = UO.GetY() + 1;
    figure[6] = 0;
    figure[7] = 0;
    figure[8] = 0;
    figure[9] = UO.WorldNum();
    figure[10] = "Example";
    var id = UO.AddFigure(figure);
    if (Truth(id > 0))
    {
        UO.Print(UO.UpdateFigure(id, figure));
        UO.RemoveFigure(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. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ๋ธŒ๋ฆฟ์ง€๊ฐ€ ์‹คํŒจํ•˜๋ฉด ๊ธฐ์กด ๋Ÿฐํƒ€์ž„ ํ•ญ๋ชฉ์ด ๋Œ€์ฒด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ฑ๊ณตํ•˜๋ฉด SerializeMapFigure๋ฅผ 10 ์ˆซ์ž ํ•„๋“œ ๋ฐ ํ…์ŠคํŠธ์™€ ํ•จ๊ป˜ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆผ์€ ๋กœ์ปฌ์—๋งŒ ํ•ด๋‹น๋˜๋ฉฐ ์„œ๋ฒ„ ํ•ญ๋ชฉ์—๋Š” ํ•ด๋‹น๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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 figure = "0|0|100|100|101|101|0|0|0";
        UO.Print(UO.UpdateFigure(1, figure));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.UpdateFigure(figureID, figure) โ€” UO.UpdateFigure(Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "updatefigure":

                {

                    int id = Arg(0);

                    if (!state.MapFigures.ContainsKey(id) || !TryMapFigureArg(1, out int[] figure, out string figureText))

                        return InjectionValue.False;

                    if (bridge.SetMapFigure(id, figure[0], figure[1], figure[2], figure[3], figure[4], figure[5], figure[6], figure[7], figure[8], figure[9], figureText) == 0)

                        return InjectionValue.False;

                    state.MapFigures[id] = SerializeMapFigure(figure, figureText);

                    return InjectionValue.True;

                }
โš ๏ธ **GitHub.com Fallback** โš ๏ธ