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

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

ํŒŒํ‹ฐ

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

๊ทธ๋ฃน ์ดˆ๋Œ€, ํšŒ์›, ์ข…๋ฃŒ ๋ฐ ๋ฉ”์‹œ์ง€. ์ด๋Ÿฌํ•œ ๊ฑฐ๋ž˜๋Š” ์ผ๋ฐ˜์ ์ธ ์—ฐ์„ค ๋ฐ ์ƒ์—…์  ๊ฑฐ๋ž˜์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์„น์…˜

์ฃผ์ œ ๋ช…๋ น ๋ฐ ์„ค๋ช…
InParty UO.InParty
Invite UO.InviteToParty
Accept UO.PartyAcceptInvite
Decline UO.PartyDeclineInvite
Leave UO.PartyLeave
Remove Member UO.RemoveFromParty
Members List UO.PartyMembersList
PartySay UO.PartySay
๋น„๊ณต๊ฐœ ํŒŒํ‹ฐ ๋ฉ”์‹œ์ง€ UO.PartyPrivateMessageTo

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

ํŒŒํ‹ฐ

UO.InParty ยท UO.InviteToParty ยท UO.PartyAcceptInvite ยท UO.PartyDeclineInvite ยท UO.PartyLeave ยท UO.RemoveFromParty ยท UO.PartyMembersList ยท UO.PartyCanLootMe ยท UO.PartySay ยท UO.PartyPrivateMessageTo

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

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

UO.PartyMembersList

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

var members = UO.PartyMembersList();
UO.Print(UO.GetArrayLength(members));

UO.PartySay

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

UO.PartySay("Ready");

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


UO.InParty

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

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

int UO.InParty();

ํด๋ผ์ด์–ธํŠธ์˜ ํŒŒํ‹ฐ ์ƒํƒœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ˜„์žฌ ๊ทธ๋ฃน์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int 1 โ€” 0์ด ์•„๋‹Œ serial ๋ฆฌ๋”๊ฐ€ ํŒŒํ‹ฐ์— ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. int 0 - ๋ฆฌ๋”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ฐธ๊ฐ€์ž ์ˆ˜๋‚˜ ๋ชฉ๋ก์— ์žˆ๋Š” ์ž์‹ ์˜ ์บ๋ฆญํ„ฐ ์ง€์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

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

๋™์ž‘

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

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

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

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

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

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

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

1. ๊ทธ๋ฃน ์กด์žฌ์— ๋”ฐ๋ฅธ ํฌํฌ ์Šคํฌ๋ฆฝํŠธ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋…ผ์Ÿ์ด ์—†์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์บ๋ฆญํ„ฐ์˜ ๊ทธ๋ฃน์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ํŒ€์ด ๊ทธ๋ฃน์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ดˆ๋Œ€๋ฅผ ์ˆ˜๋ฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
if (Truth(UO.InParty()))
{
    UO.Print("Party is active");
}
else
{
    UO.Print("No active party");
}

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

2. ์ƒํƒœ๋ฅผ ํ•œ ๋ฒˆ ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • inParty๋Š” ์ฐธ๊ฐ€์ž ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ˆซ์ž bool์ž…๋‹ˆ๋‹ค.
  • ๋ณ€์ˆ˜๋ฅผ ์žฌ์‚ฌ์šฉํ•ด๋„ ๋ณ€๊ฒฝ๋œ ๊ทธ๋ฃน์„ ๋‹ค์‹œ ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var inParty = UO.InParty();
    UO.Print("Party 1/0: " + Convert.ToString(inParty));
    return null;
}

3. ๋ช‡ ๋ฒˆ์˜ ํ™•์ธ๋งŒ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

    async public Task<object?> RunScenarioAsync()
    {
        var attempts = 0;
        while (Truth(UO.InParty() == 0) && Truth(attempts < 10))
        {
            await Delay(200);
            attempts = attempts + 1;
        }

        if (Truth(UO.InParty()))
        {
            UO.Print("Party state received");
        }
        else
        {
            UO.Print("Party still absent");
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.InParty() โ€” UO.InParty()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "inparty": return new InjectionValue(bridge.InParty());

UO.InviteToParty

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

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

void UO.InviteToParty(object? objID);

๊ทธ๋ฃน์— ๊ฐ€์ž…ํ•  ์บ๋ฆญํ„ฐ์˜ ์ดˆ๋Œ€๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • PartyInvite๋Š” serial๋ฅผ _manager.QueueTarget์— ๋„ฃ์€ ๋‹ค์Œ RequestPartyInviteByTarget๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ๋Œ€์ƒ์˜ ๋Œ€๊ธฐ์—ด์ด ์ค€๋น„๋œ ๋‹ค์Œ ์ดˆ๋Œ€ ์š”์ฒญ์ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
  • Bridge๋Š” ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‚ด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.InviteToParty");
UO.InviteToParty(UO.GetSerial("lasttarget"));

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

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

  • ๊ทธ๋ฃน์— ๊ฐ€์ž…ํ•  ์บ๋ฆญํ„ฐ์˜ ์ดˆ๋Œ€๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
    UO.InviteToParty(id);
}

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

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

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

  • PartyInvite๋Š” serial๋ฅผ _manager.QueueTarget์— ๋„ฃ์€ ๋‹ค์Œ RequestPartyInviteByTarget๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ๋Œ€์ƒ์˜ ๋Œ€๊ธฐ์—ด์ด ์ค€๋น„๋œ ๋‹ค์Œ ์ดˆ๋Œ€ ์š”์ฒญ์ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("self");
    if (Truth(UO.Exists(id)))
    {
        UO.InviteToParty(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. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

     public object? RunScenario()
    {
        ApplyToLoaded(UO.GetSerial("lasttarget"));
        return null;
    }

    void ApplyToLoaded(dynamic id)
    {
        if (Truth(UO.Exists(id)))
        {
            UO.InviteToParty(id);
        }
    }

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "invitetoparty": bridge.PartyInvite(Arg(0)); return InjectionValue.Unit;

UO.PartyAcceptInvite

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

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

void UO.PartyAcceptInvite();

์ €์žฅ๋œ ๊ทธ๋ฃน ์ดˆ๋Œ€๋ฅผ ์ˆ˜๋ฝํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • PartyAcceptInvite Party.Inviter๊ฐ€ 0์ด ์•„๋‹Œ ๊ฒฝ์šฐ RequestPartyAccept๋ฅผ ๋ณด๋‚ด๊ณ  ๋กœ์ปฌ์—์„œ Leader=Inviter๋ฅผ ํ• ๋‹นํ•˜๊ณ  Inviter๋ฅผ ์ง€์›๋‹ˆ๋‹ค. ์ดˆ๋Œ€๊ฐ€ ์—†์œผ๋ฉด ์•„๋ฌด ์กฐ์น˜๋„ ์—†์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ์ œ์—์„œ UO.Wait๋Š” ์Šคํฌ๋ฆฝํŠธ ์ผ์‹œ ์ค‘์ง€๋งŒ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ผ์‹œ ์ค‘์ง€๊ฐ€ ๋๋‚ฌ๋‹ค๊ณ  ํ•ด์„œ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์™„๋ฃŒํ–ˆ์Œ์„ ์ฆ๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ์ €์žฅ๋œ ๊ทธ๋ฃน ์ดˆ๋Œ€๋ฅผ ์ˆ˜๋ฝํ•ฉ๋‹ˆ๋‹ค.
UO.PartyAcceptInvite();

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

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

  • PartyAcceptInvite Party.Inviter๊ฐ€ 0์ด ์•„๋‹Œ ๊ฒฝ์šฐ RequestPartyAccept๋ฅผ ๋ณด๋‚ด๊ณ  ๋กœ์ปฌ์—์„œ Leader=Inviter๋ฅผ ํ• ๋‹นํ•˜๊ณ  Inviter๋ฅผ ์ง€์›๋‹ˆ๋‹ค. ์ดˆ๋Œ€๊ฐ€ ์—†์œผ๋ฉด ์•„๋ฌด ์กฐ์น˜๋„ ์—†์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.PartyAcceptInvite();
    UO.Print(UO.InParty());
    return null;
}

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

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

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

     public object? RunScenario()
    {
        UO.PartyAcceptInvite();
        UO.Wait(500);
        UO.Print(UO.GetArrayLength(UO.PartyMembersList()));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.PartyAcceptInvite() โ€” UO.PartyAcceptInvite()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "partyacceptinvite": bridge.PartyAcceptInvite(); return InjectionValue.Unit;

UO.PartyCanLootMe

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

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

void UO.PartyCanLootMe(object? value);

ํŒŒํ‹ฐ์›์ด ์‹œ์ฒด์—์„œ ์•„์ดํ…œ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • PartyCanLoot๋Š” ๋กœ์ปฌ์—์„œ Party.CanLoot๋ฅผ ์„ค์ •ํ•˜๊ณ  RequestPartyLootState(ํ™œ์„ฑํ™”)๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๊ฐ’์ด ์ผœ์ง€๊ณ , 0๊ฐ€ ๊บผ์ง‘๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์—ฌ์ „ํžˆ ๊ทœ์น™์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • Bridge๋Š” ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‚ด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ํŒŒํ‹ฐ์›์ด ์‹œ์ฒด์—์„œ ์•„์ดํ…œ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
UO.PartyCanLootMe(1);

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

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

  • PartyCanLoot๋Š” ๋กœ์ปฌ์—์„œ Party.CanLoot๋ฅผ ์„ค์ •ํ•˜๊ณ  RequestPartyLootState(ํ™œ์„ฑํ™”)๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๊ฐ’์ด ์ผœ์ง€๊ณ , 0๊ฐ€ ๊บผ์ง‘๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์—ฌ์ „ํžˆ ๊ทœ์น™์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.PartyCanLootMe(0);
    return null;
}

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

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

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

     public object? RunScenario()
    {
        ApplyMode(1);
        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "partycanlootme": bridge.PartyCanLoot(Arg(0) != 0); return InjectionValue.Unit;

UO.PartyDeclineInvite

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

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

void UO.PartyDeclineInvite();

์ €์žฅ๋œ ๊ทธ๋ฃน ์ดˆ๋Œ€๋ฅผ ๊ฑฐ์ ˆํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • PartyDeclineInvite Party.Inviter๊ฐ€ 0์ด ์•„๋‹ˆ๋ฉด Send_PartyDecline์„ ๋ณด๋‚ด๊ณ  Inviter๋ฅผ ์ง€์›๋‹ˆ๋‹ค. ์ดˆ๋Œ€๊ฐ€ ์—†์œผ๋ฉด ์•„๋ฌด ์กฐ์น˜๋„ ์—†์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ์ œ์—์„œ UO.Wait๋Š” ์Šคํฌ๋ฆฝํŠธ ์ผ์‹œ ์ค‘์ง€๋งŒ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ผ์‹œ ์ค‘์ง€๊ฐ€ ๋๋‚ฌ๋‹ค๊ณ  ํ•ด์„œ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์™„๋ฃŒํ–ˆ์Œ์„ ์ฆ๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ์ €์žฅ๋œ ๊ทธ๋ฃน ์ดˆ๋Œ€๋ฅผ ๊ฑฐ์ ˆํ•ฉ๋‹ˆ๋‹ค.
UO.PartyDeclineInvite();

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

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

  • PartyDeclineInvite Party.Inviter๊ฐ€ 0์ด ์•„๋‹ˆ๋ฉด Send_PartyDecline์„ ๋ณด๋‚ด๊ณ  Inviter๋ฅผ ์ง€์›๋‹ˆ๋‹ค. ์ดˆ๋Œ€๊ฐ€ ์—†์œผ๋ฉด ์•„๋ฌด ์กฐ์น˜๋„ ์—†์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.PartyDeclineInvite();
    UO.Print(UO.InParty());
    return null;
}

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

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

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

     public object? RunScenario()
    {
        UO.PartyDeclineInvite();
        UO.Wait(500);
        UO.Print(UO.GetArrayLength(UO.PartyMembersList()));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.PartyDeclineInvite() โ€” UO.PartyDeclineInvite()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "partydeclineinvite": bridge.PartyDeclineInvite(); return InjectionValue.Unit;

UO.PartyLeave

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

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

void UO.PartyLeave();

ํ˜„์žฌ ์บ๋ฆญํ„ฐ์—๊ฒŒ ๊ทธ๋ฃน ํƒˆํ‡ด๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • PartyLeave ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์žˆ์œผ๋ฉด GameActions.RequestPartyQuit(_world.Player)๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์—†์œผ๋ฉด ์•„๋ฌด ๊ฒƒ๋„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ์ œ์—์„œ UO.Wait๋Š” ์Šคํฌ๋ฆฝํŠธ ์ผ์‹œ ์ค‘์ง€๋งŒ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ผ์‹œ ์ค‘์ง€๊ฐ€ ๋๋‚ฌ๋‹ค๊ณ  ํ•ด์„œ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์™„๋ฃŒํ–ˆ์Œ์„ ์ฆ๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ํ˜„์žฌ ์บ๋ฆญํ„ฐ์—๊ฒŒ ๊ทธ๋ฃน ํƒˆํ‡ด๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
UO.PartyLeave();

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

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

  • PartyLeave ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์žˆ์œผ๋ฉด GameActions.RequestPartyQuit(_world.Player)๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์—†์œผ๋ฉด ์•„๋ฌด ๊ฒƒ๋„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.InParty()))
    {
        UO.PartyLeave();
    }

    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()
    {
        UO.PartyLeave();
        UO.Wait(500);
        UO.Print(UO.InParty());
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.PartyLeave() โ€” UO.PartyLeave()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "partyleave": bridge.PartyLeave(); return InjectionValue.Unit;

UO.PartyMembersList

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

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

dynamic UO.PartyMembersList();

Bridge๋Š” ๋น„์–ด ์žˆ์ง€ ์•Š์€ Party.Members ํ•ญ๋ชฉ์„ ํ•„ํ„ฐ๋งํ•˜๊ณ  ๋ชฉ๋ก ์ˆœ์„œ๋Œ€๋กœ serial ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

๋กœ์ปฌ Party.Members์˜ int serial ๋ฉค๋ฒ„ ๋ฐฐ์—ด. ๋นˆ ํ•ญ๋ชฉ/์ผ๋ จ๋ฒˆํ˜ธ=0๋Š” ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด์ด ๋น„์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • Bridge๋Š” ๋น„์–ด ์žˆ์ง€ ์•Š์€ Party.Members ํ•ญ๋ชฉ์„ ํ•„ํ„ฐ๋งํ•˜๊ณ  ๋ชฉ๋ก ์ˆœ์„œ๋Œ€๋กœ serial ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ์€ ์„œ๋ฒ„์—์„œ ๊ทธ๋ฃน์„ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ตฌ์„ฑ์›์„ ์ดˆ๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€, ๋Œ€์ƒ ๋˜๋Š” ์ž๋™ ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ์ƒํƒœ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • Bridge๋Š” ๋น„์–ด ์žˆ์ง€ ์•Š์€ Party.Members ํ•ญ๋ชฉ์„ ํ•„ํ„ฐ๋งํ•˜๊ณ  ๋ชฉ๋ก ์ˆœ์„œ๋Œ€๋กœ serial ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
var members = UO.PartyMembersList();
UO.Print(UO.GetArrayLength(members));

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

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

  • Bridge๋Š” ๋น„์–ด ์žˆ์ง€ ์•Š์€ Party.Members ํ•ญ๋ชฉ์„ ํ•„ํ„ฐ๋งํ•˜๊ณ  ๋ชฉ๋ก ์ˆœ์„œ๋Œ€๋กœ serial ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ์€ ์„œ๋ฒ„์—์„œ ๊ทธ๋ฃน์„ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ตฌ์„ฑ์›์„ ์ดˆ๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var members = UO.PartyMembersList();
    if (Truth(UO.GetArrayLength(members) > 0))
    {
        UO.Print(Hex(members[0]));
    }

    return null;
}

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;

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

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

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

     public object? RunScenario()
    {
        var before = UO.PartyMembersList();
        UO.Wait(500);
        var after = UO.PartyMembersList();
        UO.Print(before);
        UO.Print(after);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.PartyMembersList() โ€” UO.PartyMembersList()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "partymemberslist":

                    return new InjectionValue(bridge.PartyMembersList().Select(serial => new InjectionValue(serial)).ToArray());

UO.PartyPrivateMessageTo

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

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

void UO.PartyPrivateMessageTo(object? objID, object? msg);

๊ทธ๋ฃน ๊ตฌ์„ฑ์›์—๊ฒŒ ๋น„๊ณต๊ฐœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • PartySay๋Š” Text(1) ๋ฐ Arg(0)๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. GameActions.SayParty(text, serial)๋Š” ์ „์†ก๋œ serial์— ๋ฉ”์‹œ์ง€ ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ˆœ์„œ๋Š” ๋จผ์ € ObjID์ด๊ณ  ๊ทธ ๋‹ค์Œ์ด Msg์ž…๋‹ˆ๋‹ค.
  • Bridge๋Š” ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‚ด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.PartyPrivateMessageTo");
UO.PartyPrivateMessageTo("lasttarget", "Ready");

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

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

  • ๊ทธ๋ฃน ๊ตฌ์„ฑ์›์—๊ฒŒ ๋น„๊ณต๊ฐœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
UO.PartyPrivateMessageTo("lasttarget", "Ready");

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

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

  • PartySay๋Š” Text(1) ๋ฐ Arg(0)๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. GameActions.SayParty(text, serial)๋Š” ์ „์†ก๋œ serial์— ๋ฉ”์‹œ์ง€ ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ˆœ์„œ๋Š” ๋จผ์ € ObjID์ด๊ณ  ๊ทธ ๋‹ค์Œ์ด Msg์ž…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(id)))
    {
        UO.PartyPrivateMessageTo(id, "Ready");
    }

    return null;
}

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

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

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

  • Bridge๋Š” ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‚ด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.
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()
    {
        SendPartyMessage(UO.GetSerial("lasttarget"), "Ready");
        return null;
    }

    void SendPartyMessage(dynamic id, dynamic message)
    {
        if (Truth(id != "0x00000000") && Truth(Len(message) > 0))
        {
            UO.PartyPrivateMessageTo(id, message);
        }
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.PartyPrivateMessageTo(objID, msg) โ€” UO.PartyPrivateMessageTo(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "partyprivatemessageto": bridge.PartySay(Text(1), Arg(0)); return InjectionValue.Unit;

UO.PartySay

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

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

void UO.PartySay(object? msg);

์ „์ฒด ๊ทธ๋ฃน์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

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

  • msg โ€” ToString์„ ํ†ตํ•œ ํ…์ŠคํŠธ; ์ „์†ก๋œ ์ƒํƒœ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • GameActions.SayParty(๋ฌธ์ž, 0)๋กœ ์ „ํ™”ํ•ฉ๋‹ˆ๋‹ค. Null serial๋Š” ๊ทธ๋ฃน ๋ฉ”์‹œ์ง€๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฃน ๊ตฌ์„ฑ ๋ฐ ์ „๋‹ฌ์€ ์„œ๋ฒ„์— ์˜ํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.
  • Bridge๋Š” ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‚ด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.PartySay");
UO.PartySay("Ready");

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

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

  • ์ „์ฒด ๊ทธ๋ฃน์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
UO.PartySay("Ready");

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

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

  • GameActions.SayParty(๋ฌธ์ž, 0)๋กœ ์ „ํ™”ํ•ฉ๋‹ˆ๋‹ค. Null serial๋Š” ๊ทธ๋ฃน ๋ฉ”์‹œ์ง€๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฃน ๊ตฌ์„ฑ ๋ฐ ์ „๋‹ฌ์€ ์„œ๋ฒ„์— ์˜ํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var message = "Ready";
    if (Truth(UO.IsOnline()))
    {
        UO.PartySay(message);
    }

    return null;
}

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

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

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

  • Bridge๋Š” ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‚ด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.
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()
    {
        SendText("Ready");
        return null;
    }

    void SendText(dynamic message)
    {
        if (Truth(Len(message) > 0))
        {
            UO.PartySay(message);
        }
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "partysay": bridge.PartySay(Text(0), 0); return InjectionValue.Unit;

UO.RemoveFromParty

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

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

void UO.RemoveFromParty(object? objID);

serial๊นŒ์ง€ ๊ทธ๋ฃน ํšŒ์› ์‚ญ์ œ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • PartyRemove๊ฐ€ RequestPartyRemoveMember์—๊ฒŒ ์ „ํ™”๋ฅผ ๊ฒ๋‹ˆ๋‹ค. ํ•ด์ƒ๋„๋Š” ํ˜„์žฌ ์บ๋ฆญํ„ฐ์™€ ์„œ๋ฒ„์˜ ์—ญํ• ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ฐธ๊ฐ€์ž ๋ชฉ๋ก์€ ์ด ๋ช…๋ น์— ์˜ํ•ด ๋™๊ธฐ์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Bridge๋Š” ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‚ด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.RemoveFromParty");
UO.RemoveFromParty(UO.GetSerial("lasttarget"));

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

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

  • serial๊นŒ์ง€ ๊ทธ๋ฃน ํšŒ์› ์‚ญ์ œ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
    UO.RemoveFromParty(id);
}

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

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

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

  • PartyRemove๊ฐ€ RequestPartyRemoveMember์—๊ฒŒ ์ „ํ™”๋ฅผ ๊ฒ๋‹ˆ๋‹ค. ํ•ด์ƒ๋„๋Š” ํ˜„์žฌ ์บ๋ฆญํ„ฐ์™€ ์„œ๋ฒ„์˜ ์—ญํ• ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ฐธ๊ฐ€์ž ๋ชฉ๋ก์€ ์ด ๋ช…๋ น์— ์˜ํ•ด ๋™๊ธฐ์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("self");
    if (Truth(UO.Exists(id)))
    {
        UO.RemoveFromParty(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. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

     public object? RunScenario()
    {
        ApplyToLoaded(UO.GetSerial("lasttarget"));
        return null;
    }

    void ApplyToLoaded(dynamic id)
    {
        if (Truth(UO.Exists(id)))
        {
            UO.RemoveFromParty(id);
        }
    }

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "removefromparty": bridge.PartyRemove(Arg(0)); return InjectionValue.Unit;
โš ๏ธ **GitHub.com Fallback** โš ๏ธ