KO UO Topic character Part 3 - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

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

์„ฑ๊ฒฉ โ€” 3

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

์ฐธ์กฐ ๊ตฌ์„ฑ

1 ยท 2 ยท 3 ยท 4 ยท 5

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


UO.GetSex

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

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

int UO.GetSex();

ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์—์„œ ์„ฑ๋ณ„ ๋ฐ ์ธ์ข… ์ฝ”๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int - ํ˜ธํ™˜ ์ฝ”๋“œ: 0=์ธ๊ฐ„ ๋‚จ์„ฑ, 1=์ธ๊ฐ„ ์—ฌ์„ฑ, 2=์—˜ํ”„ ๋‚จ์„ฑ, 3=์—˜ํ”„ ์—ฌ์„ฑ, 4=๊ฐ€๊ณ ์ผ ๋‚จ์„ฑ, 5=๊ฐ€๊ณ ์ผ ์—ฌ์„ฑ. ๋ฌธ์ž๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋„ 0์ด๋ฏ€๋กœ Exists(self)์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ์ด๊ฒƒ์€ ๋‹จ์ˆœํ•œ bool ์•”์ปท์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ํ˜ธ์ถœ์€ self๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๋ณ„๊ณผ ์ธ์ข… ์ฝ”๋“œ๋Š” ๊ฐ’์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • Convert.ToString๋Š” ์ถœ๋ ฅํ•  ์ˆซ์ž๋ฅผ ๋ณ€ํ™˜ํ•˜๋ฉฐ ๊ฒฐ๊ณผ์˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var value = UO.GetSex();
UO.Print("GetSex: " + Convert.ToString(value));

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

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

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

    return null;
}

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

3. 1์ดˆ๋งŒ์— ๋ณ€ํ™”๋ฅผ ์ง€์ผœ๋ณด์„ธ์š” - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

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

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetSex() โ€” UO.GetSex()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.Sex

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


UO.GetStam

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

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

int UO.GetStam();
dynamic UO.GetStam(object? objID);

๋กœ์ปฌ ๋ชจ๋ธ์—์„œ ํ˜„์žฌ ์ฒด๋ ฅ์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int๋Š” ๋ฐฑ๋ถ„์œจ์ด๋‚˜ bool๊ฐ€ ์•„๋‹Œ Stamina ํ•„๋“œ์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. 0๋Š” ์‹ค์ œ ๊ฐ’์ด๊ฑฐ๋‚˜ ๋ˆ„๋ฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€๊ฐ’ 0์€ ์ œ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ mobile์˜ ๊ฒฝ์šฐ ์˜๋ฏธ๊ฐ€ ์•Œ๋ ค์ง€์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HP/HitsMax์—๋Š” ์ •ํ™•ํ•œ ํฌ์ธํŠธ ๋Œ€์‹  ์ƒ๋Œ€์ ์ธ ์„œ๋ฒ„ ๊ทœ๋ชจ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HP=0๋Š” ์‚ฌ๋ง์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Dead/IsDead๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ์ƒํƒœ๋ฅผ ์—ด์ง€ ์•Š์œผ๋ฉฐ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ด๋ฏธ ๋กœ๋“œ๋œ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. ํŠน์„ฑ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ํŒจํ‚ท์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” ๋ณ„๋„์˜ ๋…์„œ์ž…๋‹ˆ๋‹ค. Exists์™€ ๋‹ค์Œ ๋„์ „ ์‚ฌ์ด์— ์„ธ์ƒ์ด ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋Š” ์›์ž์„ฑ ์Šค๋ƒ…์ƒท์„ ํ˜•์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด๋ฅผ ์ฝ์„ ๋•Œ World.Get์€ ๋ˆ„๋ฝ๋œ ๋˜๋Š” IsDestroyed๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  ๊ฒฐ๊ณผ๋Š” 0์ž…๋‹ˆ๋‹ค. HP/HitsMax๋Š” ์ด๋Ÿฌํ•œ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์„ ํฌํ•จํ•˜์—ฌ ์—”ํ„ฐํ‹ฐ์—์„œ ์ฝ์Šต๋‹ˆ๋‹ค. Mana/Stamina - ๋ชจ๋ฐ”์ผ ์ „์šฉ์ž…๋‹ˆ๋‹ค. ๋…ผ์Ÿ ์—†์ด self์„ ์ฝ์œผ์„ธ์š”. ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋ณ€ํ˜•์ด ๋ฐ˜๋“œ์‹œ ID๋ฅผ ํฌํ•จํ•œ ๋ณ€ํ˜•์„ ๊ฐ€์งˆ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋ช…์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  • ์ธ์ˆ˜ ์—†์ด ์ฝ์œผ๋ฉด ๋ˆ„๋ฝ๋˜๊ฑฐ๋‚˜ ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์— ๋Œ€ํ•ด 0๋„ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” World.Get์„ ํ†ตํ•œ ํ˜•์‹๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ง์ ‘ Mana/Stamina ๋ฐ ์ตœ๋Œ€๊ฐ’์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ฃฝ์€ ์บ๋ฆญํ„ฐ๋Š” ๊ฐ’์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์บ๋ฆญํ„ฐ์˜ ๊ฐ€์น˜๋ฅผ ์ธ์‡„ํ•˜์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ํ˜ธ์ถœ์€ self๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ฐ’์€ ํ•˜๋‚˜์˜ ์ˆซ์ž๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ToString๋Š” ๋ฉ”์‹œ์ง€์šฉ์œผ๋กœ๋งŒ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
var value = UO.GetStam();
UO.Print("GetStam: " + Convert.ToString(value));

2. ํ™•์ธ ๋˜๋Š” ๊ณ„์‚ฐ ์‹œ ๊ฐ’ ์ ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ด ํ•„๋“œ์— ์ ์šฉ๋œ ์ž„๊ณ„๊ฐ’ ๋˜๋Š” ๊ณ„์‚ฐ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด์˜ ์ˆซ์ž๋Š” ์„œ๋ฒ„ ์ œํ•œ์ด ์•„๋‹Œ ์˜ˆ์‹œ ์„ค์ •์ž…๋‹ˆ๋‹ค. ์ตœ๋Œ€๊ฐ’์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ ์ „์— ์–‘์„ฑ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetStam();
    if (Truth(value < 15))
    {
        UO.Print("Known stamina is below the movement threshold of 15");
    }

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

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

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

     public object? RunScenario()
    {
        if (Truth(UO.Exists("lasttarget")))
        {
            var value = ReadValue("lasttarget");
            UO.Print("Selected value: " + Convert.ToString(value));
        }

        return null;
    }

    dynamic ReadValue(dynamic obj)
    {
        return UO.GetStam(obj);
    }

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.Stamina

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

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getstam": return new InjectionValue(arguments.Length > 0 ? bridge.GetStamina(Arg(0)) : bridge.Stamina);

UO.GetStamina

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

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

int UO.GetStamina();

๋กœ์ปฌ ๋ชจ๋ธ์—์„œ ํ˜„์žฌ ์ฒด๋ ฅ์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int๋Š” ๋ฐฑ๋ถ„์œจ์ด๋‚˜ bool๊ฐ€ ์•„๋‹Œ Stamina ํ•„๋“œ์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. 0๋Š” ์‹ค์ œ ๊ฐ’์ด๊ฑฐ๋‚˜ ๋ˆ„๋ฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€๊ฐ’ 0์€ ์ œ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ mobile์˜ ๊ฒฝ์šฐ ์˜๋ฏธ๊ฐ€ ์•Œ๋ ค์ง€์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HP/HitsMax์—๋Š” ์ •ํ™•ํ•œ ํฌ์ธํŠธ ๋Œ€์‹  ์ƒ๋Œ€์ ์ธ ์„œ๋ฒ„ ๊ทœ๋ชจ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HP=0๋Š” ์‚ฌ๋ง์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Dead/IsDead๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ์ƒํƒœ๋ฅผ ์—ด์ง€ ์•Š์œผ๋ฉฐ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ด๋ฏธ ๋กœ๋“œ๋œ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. ํŠน์„ฑ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ํŒจํ‚ท์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” ๋ณ„๋„์˜ ๋…์„œ์ž…๋‹ˆ๋‹ค. Exists์™€ ๋‹ค์Œ ๋„์ „ ์‚ฌ์ด์— ์„ธ์ƒ์ด ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋Š” ์›์ž์„ฑ ์Šค๋ƒ…์ƒท์„ ํ˜•์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด๋ฅผ ์ฝ์„ ๋•Œ World.Get์€ ๋ˆ„๋ฝ๋œ ๋˜๋Š” IsDestroyed๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  ๊ฒฐ๊ณผ๋Š” 0์ž…๋‹ˆ๋‹ค. HP/HitsMax๋Š” ์ด๋Ÿฌํ•œ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์„ ํฌํ•จํ•˜์—ฌ ์—”ํ„ฐํ‹ฐ์—์„œ ์ฝ์Šต๋‹ˆ๋‹ค. Mana/Stamina - ๋ชจ๋ฐ”์ผ ์ „์šฉ์ž…๋‹ˆ๋‹ค. ๋…ผ์Ÿ ์—†์ด self์„ ์ฝ์œผ์„ธ์š”. ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋ณ€ํ˜•์ด ๋ฐ˜๋“œ์‹œ ID๋ฅผ ํฌํ•จํ•œ ๋ณ€ํ˜•์„ ๊ฐ€์งˆ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋ช…์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  • ์ธ์ˆ˜ ์—†์ด ์ฝ์œผ๋ฉด ๋ˆ„๋ฝ๋˜๊ฑฐ๋‚˜ ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์— ๋Œ€ํ•ด 0๋„ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” World.Get์„ ํ†ตํ•œ ํ˜•์‹๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ง์ ‘ Mana/Stamina ๋ฐ ์ตœ๋Œ€๊ฐ’์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ฃฝ์€ ์บ๋ฆญํ„ฐ๋Š” ๊ฐ’์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์บ๋ฆญํ„ฐ์˜ ๊ฐ€์น˜๋ฅผ ์ธ์‡„ํ•˜์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ํ˜ธ์ถœ์€ self๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ฐ’์€ ํ•˜๋‚˜์˜ ์ˆซ์ž๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ToString๋Š” ๋ฉ”์‹œ์ง€์šฉ์œผ๋กœ๋งŒ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
var value = UO.GetStamina();
UO.Print("GetStamina: " + Convert.ToString(value));

2. ํ™•์ธ ๋˜๋Š” ๊ณ„์‚ฐ ์‹œ ๊ฐ’ ์ ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ด ํ•„๋“œ์— ์ ์šฉ๋œ ์ž„๊ณ„๊ฐ’ ๋˜๋Š” ๊ณ„์‚ฐ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด์˜ ์ˆซ์ž๋Š” ์„œ๋ฒ„ ์ œํ•œ์ด ์•„๋‹Œ ์˜ˆ์‹œ ์„ค์ •์ž…๋‹ˆ๋‹ค. ์ตœ๋Œ€๊ฐ’์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ ์ „์— ์–‘์„ฑ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetStamina();
    if (Truth(value < 15))
    {
        UO.Print("Known stamina is below the movement threshold of 15");
    }

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

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

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

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

    dynamic ReadValue()
    {
        return UO.GetStamina();
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetStamina() โ€” UO.GetStamina()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.Stamina

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


UO.GetStatLockState

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

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

int UO.GetStatLockState(object? statNum);

๊ตญ๋ถ€์ ์ธ ํŠน์„ฑ ๋ณ€ํ™” ๋ชจ๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • statNum - ํ•„์ˆ˜ ํŠน์„ฑ๋ฒˆํ˜ธ: 0 - ๋ณ€ํ™˜.ToString, 1 - DEX, 2 - INT. ์ด๋Š” ํ˜„์žฌ ๊ฐ’์ด ์•„๋‹ˆ๋ฉฐ ๋ฌธ์ž์—ด ์ด๋ฆ„๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int: 0 - ์ฆ๊ฐ€, 1 - ๊ฐ์†Œ, 2 - ์ฐจ๋‹จ. true/false๊ฐ€ ์•„๋‹Œ ๋ชจ๋“œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. 0..2 ์ด์™ธ์˜ ์ˆซ์ž์— ๋Œ€ํ•ด์„œ๋Š” โˆ’1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž๊ฐ€ ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ ์œ ํšจํ•œ ์ˆซ์ž๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ 0๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด๋ฏธ ์ˆ˜์‹ ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒŒ์ž„ ์Šค๋ ˆ๋“œ์—์„œ Invoke๋ฅผ ํ†ตํ•ด ์ฝ๊ธฐ๊ฐ€ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ํŒจํ‚ท์€ ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์Šคํ‚ฌ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ›ˆ๋ จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ์š”์ฒญ - ๋‘ ๊ฐœ์˜ ๊ฐœ๋ณ„ ์Šค๋ƒ…์ƒท.
  • ํ•„์ˆ˜ ํŠน์„ฑ ๋ฒˆํ˜ธ: 0 - ๋ณ€ํ™˜.ToString, 1 - DEX, 2 - INT. ์ด๋Š” ํ˜„์žฌ ๊ฐ’์ด ์•„๋‹ˆ๋ฉฐ ๋ฌธ์ž์—ด ์ด๋ฆ„๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • ExecuteClientApiCompatibility๋Š” ๋ช…๋ น ๋ถ„๊ธฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Text๋Š” ์Šคํ‚ฌ ์„ ํƒ๊ธฐ๋ฅผ ์ฝ๊ณ , Arg๋Š” ์ˆซ์ž์™€ ๋ชจ๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๋Š” ์ธ์ˆ˜๋Š” ๋ณ€ํ™˜ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ํ˜ธ์ถœ์ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ฝ๊ธฐ ๋ฐ ์ถœ๋ ฅ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ด ์˜ˆ์—์„œ๋Š” ์„ ํƒ๊ธฐ์™€ ๋…น์Œ ์‹œ ๋ชจ๋“œ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ค„์—์„œ๋Š” ์ด๋ฆ„์œผ๋กœ ์Šคํ‚ฌ์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์ˆซ์ž๋กœ ํŠน์„ฑ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Print ๊ฒฐ๊ณผ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
var selector = 0;
var mode = UO.GetStatLockState(selector);
UO.Print(Convert.ToString(mode));

2. ์กฐ๊ฑด ๋˜๋Š” ๋น„๊ต์— ์ ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ž„๊ณ„๊ฐ’ 95.1 ๋ฐ ๋ชจ๋“œ 0/1/2๊ฐ€ ์˜ˆ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. โˆ’1๋Š” ๋ชจ๋“œ ๋ณ€๊ฒฝ ์ „ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. ์“ด ํ›„์—๋Š” ๋กœ์ปฌ ๋ณต์‚ฌ๋ณธ๋งŒ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var mode = UO.GetStatLockState(0);
    if (Truth(mode == 2))
    {
        UO.Print("Locked");
    }
    else
    {
        if (Truth(mode == -1))
        {
            UO.Print("Unknown selector");
        }
        else
        {
            UO.Print("Mode: " + Convert.ToString(mode));
        }
    }

    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 ์•„๋ž˜์— ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์…€๋ ‰ํ„ฐ๋Š” ์Šคํ‚ฌ/ํŠน์„ฑ์„ ์„ ํƒํ•˜๊ณ , ๋ชจ๋“œ๋Š” ๋…นํ™” ๋ชจ๋“œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ReadValue/ReadMode ์›๋ž˜ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ApplyMode๋Š” ์ธ์ˆ˜๋ฅผ ํ™•์ธํ•˜๊ณ  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ๊ธฐ ์˜ˆ์‹œ์—์„œ UO.Wait(1000)๋Š” ๋‘ ์žฅ์˜ ๊ทธ๋ฆผ์„ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var before = ReadMode(0);
        await Delay(1000);
        var after = ReadMode(0);
        UO.Print(Convert.ToString(before) + " -> " + Convert.ToString(after));
        return null;
    }

    dynamic ReadMode(dynamic selector)
    {
        return UO.GetStatLockState(selector);
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetStatLockState(statNum) โ€” UO.GetStatLockState(Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "getstatlockstate": return new InjectionValue(bridge.GetStatLockState(Arg(0)));

UO.GetStatus

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

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

void UO.GetStatus(object? id);

์ง€์ •๋œ mobile์˜ ์ƒํƒœ์— ๋Œ€ํ•œ ์„œ๋ฒ„ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • string-์–‘์‹์€ GetObject๋ฅผ ํ†ตํ•ด ์ด๋ฆ„์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. int ํ˜•์‹์€ serial๋ฅผ ์ง์ ‘ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ฆฌ์ง€ ํ˜ธ์ถœ GameActions.RequestMobileStatus(world,serial,true). ๋ช…๋ น์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์›”๋“œ ์—…๋ฐ์ดํŠธ ํ›„ GetHP/GetMaxHP ๋ฐ ๊ธฐํƒ€ getter๋ฅผ ๋ณ„๋„๋กœ ์ฝ์–ด๋ณด์„ธ์š”.

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

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

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

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

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

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

1. ์ž์ฒด ์ƒํƒœ ์š”์ฒญ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ƒํƒœ ์š”์ฒญ์€ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
UO.GetStatus("self");

2. serial๋กœ ์ฟผ๋ฆฌ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • int ์–‘์‹์€ ๋™์ผํ•œ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.Self();
    UO.GetStatus(id);
    return null;
}

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

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

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

    async public Task<object?> RunScenarioAsync()
    {
        UO.GetStatus("self");
        await Delay(500);
        UO.Print(Convert.ToString(UO.GetHP()) + "/" + Convert.ToString(UO.GetMaxHP()));
        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void GetStatus(int id) => bridge.GetStatus(id);

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void GetStatus(string id) => GetStatus(GetObject(id));

UO.GetStr

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

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

int UO.GetStr();
int UO.GetStr(object? objID);

์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ํŒŒ์›Œ(Strength, Str)๋ฅผ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.

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

  • objID โ€” ํ•˜๋‚˜์˜ ์ธ์ˆ˜(serial ๋ฌธ์ž ๋ฒˆํ˜ธ, 10์ง„์ˆ˜/0x 16์ง„์ˆ˜ ๋ฌธ์ž์—ด, "self", "lasttarget" ๋˜๋Š” ์ด๋ฆ„ AddObject)๊ฐ€ ํฌํ•จ๋œ ํ‘œ์‹œ๋œ ํ˜•์‹์˜ ObjID์ž…๋‹ˆ๋‹ค. graphic/type ์ด์™ธ์˜ ๊ฐœ์ฒด๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ํ˜„์žฌ ๋ฌธ์ž๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int โ€” ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์˜ ํ˜„์žฌ ํ†ต๊ณ„ ํฌ์ธํŠธ, 0..65535; ๋ฐฑ๋ถ„์œจ, ID, ์Šคํ‚ฌ, ์ž ๊ธˆ ๋ชจ๋“œ ๋˜๋Š” bool๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. 0๋Š” ๋ˆ„๋ฝ/์‚ญ์ œ๋œ ๋ฌธ์ž ๋˜๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. == true๊ฐ€ ์•„๋‹Œ ์ˆ˜์น˜ ์š”๊ตฌ ์‚ฌํ•ญ๊ณผ ๋น„๊ตํ•˜์‹ญ์‹œ์˜ค. ์ด๋Š” ์Šคํ…Ÿ ํ•œ๋„๋‚˜ ์ˆ˜์ • ์—†์ด ๋ณด์žฅ๋œ ๊ธฐ๋ณธ ๊ฐ’์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • self์˜ ๊ฒฝ์šฐ (), ๋ช…์‹œ์  ๊ฐœ์ฒด์˜ ๊ฒฝ์šฐ (ObjID)๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์„ ํƒ์  ์ธ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.
  • Player๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.Strength Player๊ฐ€ ์กด์žฌํ•˜๊ณ  ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0. ์กด์žฌํ•˜๋Š” ์ฃฝ์€ ์บ๋ฆญํ„ฐ๋Š” ์ œ๊ฑฐ๋œ ๊ฐœ์ฒด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์Šคํ…Ÿ์€ HP, ๋งˆ๋‚˜, ์ฒด๋ ฅ์œผ๋กœ ๊ณ„์‚ฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • GetStr/GetInt/GetDex ObjID๋ฅผ ์ˆ˜๋ฝํ•ฉ๋‹ˆ๋‹ค. PlayerMobile ๋ฐ์ดํ„ฐ๋Š” self์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ serial - 0์˜ ๊ฒฝ์šฐ, ๋กœ๋“œ๋œ mobile์˜ ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํŠน์„ฑ์€ ๋Œ€์ฒด๋˜๊ฑฐ๋‚˜ ์ถ”์ธก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Invoke๋Š” ์Šคํฌ๋ฆฝํŠธ๋กœ ๋Œ€๊ธฐ๋ฅผ ์ทจ์†Œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์—์„œ ์ฝ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ๋ฅผ ์ฟผ๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋Œ€์ƒ์„ ์—ด์ง€ ์•Š์œผ๋ฉฐ, ํŒจํ‚ท์„ ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉฐ, ํŠน์„ฑ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ง€์—ฐ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ๋Š” ๋‹ค๋ฅธ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๊ฒฐ๊ณผ๋Š” ์—ฐ๊ฒฐ์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0์€ ๊ฐ’์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”. UO.Str(), UO.Strength(), UO.GetStr(), UO.GetStrength().
  • ExecuteClientApiCompatibility.Arg๋Š” ๋จผ์ € ๊ฐœ์ฒด ์ด๋ฆ„์„ ํ™•์ธํ•œ ๋‹ค์Œ ์ˆซ์ž๋ฅผ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž์—ด๋กœ ์ธํ•ด ๋Œ€์ƒ์ด ์•„๋‹Œ ๋ณ€ํ™˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. double์€ int๋กœ ์ค„์–ด๋“ค๊ณ , Array/void๋Š” 0๋กœ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. ๋ฌธ์ž๋ฅผ ์„ ํƒํ•˜๋ ค๋ฉด ์ด๋Ÿฌํ•œ ๋ณ€ํ™˜์ด ์•„๋‹Œ ์˜ฌ๋ฐ”๋ฅธ serial๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

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

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

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

  • value๋Š” ์ˆซ์ž ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ToString ์žก์ง€์šฉ์œผ๋กœ ํฌ๋งทํ•ฉ๋‹ˆ๋‹ค. ๋…ผ์Ÿ์ด๋‚˜ ์บ๋ฆญํ„ฐ ํ–‰๋™์ด ์—†์Šต๋‹ˆ๋‹ค.
var value = UO.GetStr();
UO.Print("Strength: " + Convert.ToString(value));

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

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

  • ๋ณ„๋„์˜ 1000 ms ์ „ํ›„; UO.Wait ์˜ˆ์‹œ์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Change=after-before๋Š” ์–‘์ˆ˜, 0 ๋˜๋Š” ์Œ์ˆ˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ž์ฒด๋กœ๋Š” ๋ชจ๋“  ์ค‘๊ฐ„ ์—…๋ฐ์ดํŠธ์™€ ์›”๋“œ ์ข…๋ฃŒ๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.GetStr();
    await Delay(1000);
    var after = UO.GetStr();
    var change = after - before;
    UO.Print("Change: " + Convert.ToString(change));
    return null;
}

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

3. ์™„์ „ํ•œ ์š”๊ตฌ์‚ฌํ•ญ ๊ฒ€์ฆ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ตœ์†Œ=80๋Š” ํด๋ผ์ด์–ธํŠธ ์ œํ•œ์ด ์•„๋‹Œ ์š”๊ตฌ ์‚ฌํ•ญ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. AttributeAtLeast(์ตœ์†Œ)๋Š” ๋ˆ„๋ฝ๋œ ๋ฌธ์ž๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  ํŠน์„ฑ์„ ํ•œ ๋ฒˆ ์ฝ๊ณ  bool๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: true ๋˜๋Š” >= ์ตœ์†Œ์ธ ๊ฒฝ์šฐ false. ๋…ผ๋ฆฌ์  ์˜๋ฏธ๋Š” ํŠน์„ฑ ์ž์ฒด๊ฐ€ ์•„๋‹Œ ๋น„๊ต์— ์˜ํ•ด ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.
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(Truth(AttributeAtLeast(80)) == true))
        {
            UO.Print("Requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic AttributeAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.GetStr();
        return value >= minimum;
    }

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

4. serial ๋ฐ ๊ฐœ์ฒด ์ด๋ฆ„์œผ๋กœ ๋ฌธ์ž ์„ ํƒ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • id๋Š” type๊ฐ€ ์•„๋‹ˆ๋ผ UO.Self()์˜ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. AddObject๋Š” ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๊ฐ€ ์ง€์ •๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ID๋ฅผ ๋ฒ”์œ„ ์—†์ด statSubject๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋‘ ํ˜ธ์ถœ ๋ชจ๋‘ ๋™์ผํ•œ ๋ฌธ์ž๋ฅผ ์„ ํƒํ•˜์ง€๋งŒ ํŒ๋…๊ฐ’์€ ์›์ž์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var id = UO.Self();
if (Truth(id != 0))
{
    UO.AddObject("statSubject", id);
    var direct = UO.GetStr(id);
    var byName = UO.GetStr("statSubject");
    UO.Print("Direct: " + Convert.ToString(direct) + "; alias: " + Convert.ToString(byName));
}

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.Strength

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

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "getstr": return new InjectionValue(arguments.Length > 0 ? bridge.GetStrength(Arg(0)) : bridge.Strength);

UO.GetStrength

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

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

int UO.GetStrength();

์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ํŒŒ์›Œ(Strength, Str)๋ฅผ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int โ€” ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์˜ ํ˜„์žฌ ํ†ต๊ณ„ ํฌ์ธํŠธ, 0..65535; ๋ฐฑ๋ถ„์œจ, ID, ์Šคํ‚ฌ, ์ž ๊ธˆ ๋ชจ๋“œ ๋˜๋Š” bool๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. 0๋Š” ๋ˆ„๋ฝ/์‚ญ์ œ๋œ ๋ฌธ์ž ๋˜๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. == true๊ฐ€ ์•„๋‹Œ ์ˆ˜์น˜ ์š”๊ตฌ ์‚ฌํ•ญ๊ณผ ๋น„๊ตํ•˜์‹ญ์‹œ์˜ค. ์ด๋Š” ์Šคํ…Ÿ ํ•œ๋„๋‚˜ ์ˆ˜์ • ์—†์ด ๋ณด์žฅ๋œ ๊ธฐ๋ณธ ๊ฐ’์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ •ํ™•ํ•œ ์„œ๋ช…์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • Player๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.Strength Player๊ฐ€ ์กด์žฌํ•˜๊ณ  ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0. ์กด์žฌํ•˜๋Š” ์ฃฝ์€ ์บ๋ฆญํ„ฐ๋Š” ์ œ๊ฑฐ๋œ ๊ฐœ์ฒด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์Šคํ…Ÿ์€ HP, ๋งˆ๋‚˜, ์ฒด๋ ฅ์œผ๋กœ ๊ณ„์‚ฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • GetStr/GetInt/GetDex ObjID๋ฅผ ์ˆ˜๋ฝํ•ฉ๋‹ˆ๋‹ค. PlayerMobile ๋ฐ์ดํ„ฐ๋Š” self์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ serial - 0์˜ ๊ฒฝ์šฐ, ๋กœ๋“œ๋œ mobile์˜ ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํŠน์„ฑ์€ ๋Œ€์ฒด๋˜๊ฑฐ๋‚˜ ์ถ”์ธก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Invoke๋Š” ์Šคํฌ๋ฆฝํŠธ๋กœ ๋Œ€๊ธฐ๋ฅผ ์ทจ์†Œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์—์„œ ์ฝ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ๋ฅผ ์ฟผ๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋Œ€์ƒ์„ ์—ด์ง€ ์•Š์œผ๋ฉฐ, ํŒจํ‚ท์„ ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉฐ, ํŠน์„ฑ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ง€์—ฐ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ๋Š” ๋‹ค๋ฅธ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๊ฒฐ๊ณผ๋Š” ์—ฐ๊ฒฐ์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0์€ ๊ฐ’์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”. UO.Str(), UO.Strength(), UO.GetStr(), UO.GetStrength().

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

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

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

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

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

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

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

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

  • value๋Š” ์ˆซ์ž ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ToString ์žก์ง€์šฉ์œผ๋กœ ํฌ๋งทํ•ฉ๋‹ˆ๋‹ค. ๋…ผ์Ÿ์ด๋‚˜ ์บ๋ฆญํ„ฐ ํ–‰๋™์ด ์—†์Šต๋‹ˆ๋‹ค.
var value = UO.GetStrength();
UO.Print("Strength: " + Convert.ToString(value));

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

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

  • ๋ณ„๋„์˜ 1000 ms ์ „ํ›„; UO.Wait ์˜ˆ์‹œ์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Change=after-before๋Š” ์–‘์ˆ˜, 0 ๋˜๋Š” ์Œ์ˆ˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ž์ฒด๋กœ๋Š” ๋ชจ๋“  ์ค‘๊ฐ„ ์—…๋ฐ์ดํŠธ์™€ ์›”๋“œ ์ข…๋ฃŒ๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.GetStrength();
    await Delay(1000);
    var after = UO.GetStrength();
    var change = after - before;
    UO.Print("Change: " + Convert.ToString(change));
    return null;
}

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

3. ์™„์ „ํ•œ ์š”๊ตฌ์‚ฌํ•ญ ๊ฒ€์ฆ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ตœ์†Œ=80๋Š” ํด๋ผ์ด์–ธํŠธ ์ œํ•œ์ด ์•„๋‹Œ ์š”๊ตฌ ์‚ฌํ•ญ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. AttributeAtLeast(์ตœ์†Œ)๋Š” ๋ˆ„๋ฝ๋œ ๋ฌธ์ž๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  ํŠน์„ฑ์„ ํ•œ ๋ฒˆ ์ฝ๊ณ  bool๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: true ๋˜๋Š” >= ์ตœ์†Œ์ธ ๊ฒฝ์šฐ false. ๋…ผ๋ฆฌ์  ์˜๋ฏธ๋Š” ํŠน์„ฑ ์ž์ฒด๊ฐ€ ์•„๋‹Œ ๋น„๊ต์— ์˜ํ•ด ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.
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(Truth(AttributeAtLeast(80)) == true))
        {
            UO.Print("Requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic AttributeAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.GetStrength();
        return value >= minimum;
    }

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.Strength

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


UO.GetTitle

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

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

dynamic UO.GetTitle(object? objID);

ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์•Œ๋ ค์ง„ ์บ๋ฆญํ„ฐ์˜ ์งํ•จ(์˜ˆ: ์ด๋ฆ„ ๋’ค์˜ ์ง์—… ๋˜๋Š” ์„œ๋ช…)์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • objID โ€” ํ•„์ˆ˜ serial/ID ๊ฐ์ฒด. type๋„ ์•„๋‹ˆ๊ณ  cliloc๋„ ์•„๋‹™๋‹ˆ๋‹ค. int, 10์ง„์ˆ˜/16์ง„์ˆ˜ ๋ฌธ์ž์—ด, self, backpack, lasttarget, finditem ๋˜๋Š” ์ด๋ฆ„ AddObject๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. 0๋Š” ๊ฐœ์ฒด๊ฐ€ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string โ€” ๋ชจ๋ฐ”์ผ์šฉ ์ œ๋ชฉ ํ•„๋“œ์˜ ํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์ œ๋ชฉ์„ ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ๊ฐœ์ฒด๊ฐ€ ๋ฌธ์ž๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜ ID๊ฐ€ ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ ๋นˆ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. serial, ์ „์ฒด ์ด๋ฆ„ ๋˜๋Š” ์†์„ฑ ๋ฐฐ์—ด์ด ์•„๋‹™๋‹ˆ๋‹ค. GetAltName์€ GetTitle์™€ ๋™์ผํ•œ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ํ˜ธ์ถœ ์ž์ฒด๋Š” ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์„œ๋ฒ„๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์œผ๋ฉฐ ๋‹จ์ผ ํด๋ฆญ์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„/์งํ•จ์„ ์š”์ฒญํ•˜๋ ค๋ฉด ClickOnObject๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”. ์‘๋‹ต์€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์˜ต๋‹ˆ๋‹ค.
  • ๊ธฐ์กด ๋ฌธ์ž์—๋Š” ๋นˆ ๋ฌธ์ž์—ด๋„ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. Exists ๊ฒ€์‚ฌ๋Š” ๊ฐ์ฒด๊ฐ€ ๋กœ๋“œ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ผ๋Š” ๋˜ ๋‹ค๋ฅธ ์งˆ๋ฌธ์— ๋‹ตํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๊ตฌํ˜„์—์„œ๋Š” ๋Œ€์ฒด ์ด๋ฆ„์ด ์บ๋ฆญํ„ฐ์˜ ์ œ๋ชฉ ํ•„๋“œ์— ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ObjID=self โ€” ํ˜„์žฌ ํด๋ผ์ด์–ธํŠธ์˜ ๋ฌธ์ž์ž…๋‹ˆ๋‹ค.
  • ์ œ๋ชฉ์—๋Š” ์ œ๋ชฉ๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋นˆ ํ•„๋“œ๋Š” ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๋ฅผ โ€‹โ€‹์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var title = UO.GetTitle("self");
UO.Print(title);

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

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

  • ObjID=id โ€” ๋งˆ์ง€๋ง‰ ๋Œ€์ƒ์˜ serial GetName์™€ ์ œ๋ชฉ์€ ๋”ฐ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ํ•ญ๋ชฉ ๋Œ€์ƒ์—๋Š” ์ œ๋ชฉ ํ•„๋“œ๊ฐ€ ์—†์œผ๋ฉฐ ๋นˆ ๋ฌธ์ž์—ด์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(id)))
    {
        var title = UO.GetTitle(id);
        if (Truth(title != ""))
        {
            UO.Print(UO.GetName(id) + " " + title);
        }
    }

    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. ์ฝ๊ธฐ ์ „์— ์ด๋ฆ„์„ ๋ฌป๋Š” ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • 350 โ€” ํ•œ ๋ฒˆ ํด๋ฆญํ•œ ํ›„ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์ผ์‹œ ์ค‘์ง€๋˜๋Š” ์˜ˆ; ์ด๋Š” getter ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„๊ฐ€ ๋‚˜์ค‘์— ์‘๋‹ตํ•  ์ˆ˜๋„ ์žˆ๊ณ  ์†Œ์œ ๊ถŒ์„ ์ „์†กํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋นˆ ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
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 = UO.GetSerial("lasttarget");
        if (Truth(UO.Exists(id)))
        {
            UO.ClickOnObject(id);
            UO.Wait(350);
            UO.Print(UO.GetTitle(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;
}

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "gettitle": return new InjectionValue(bridge.GetTitle(Arg(0, bridge.Self)));

UO.GetWeight

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

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

int UO.GetWeight();

์บ๋ฆญํ„ฐ์˜ ์ƒํƒœ ์นด์šดํ„ฐ(ํ˜„์žฌ ๋Œ์˜ ๋ฌด๊ฒŒ)๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

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

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

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

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

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

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

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

1. ์ €์žฅ๋œ ์นด์šดํ„ฐ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • value๋Š” ์ž์‹ ์˜ ๋ฌธ์ž์— ๋Œ€ํ•œ ์ธ์ˆ˜ ์—†๋Š” ํ˜ธ์ถœ์„ ํ•œ ๋ฒˆ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. Convert.ToString๋Š” ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋กœ๊ทธ ๋ฒˆํ˜ธ์˜ ํ˜•์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
var value = UO.GetWeight();
UO.Print("Weight: " + Convert.ToString(value));

2. ๋ณ€ํ™” ๊ด€์ฐฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • UO.Wait(500)๋Š” 500 ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์ „ํ›„๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ฐจ์ด๋Š” ์–‘์ˆ˜, 0 ๋˜๋Š” ์Œ์ˆ˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ์—…๋ฐ์ดํŠธ ๋ฐ ์บ๋ฆญํ„ฐ ๋ณ€๊ฒฝ์€ ์ƒ๋žต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์‹œ ์ •์ง€๊ฐ€ ๊ทธ ์˜ˆ์ž…๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.GetWeight();
    await Delay(500);
    var after = UO.GetWeight();
    var difference = after - before;
    UO.Print("Counter change: " + Convert.ToString(difference));
    return null;
}

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

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

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

  • CanCarry(extra)๋Š” ์Šคํ†ค์— ์ถ”๊ฐ€ ๊ฐ€์ค‘์น˜๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. 10๋Š” ์˜ˆ์‹œ์ด๋ฉฐ ์Šคํƒ ๊ฐœ์ˆ˜๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์Œ์ˆ˜ ์ถ”๊ฐ€, ํ”Œ๋ ˆ์ด์–ด ์—†์Œ ๋˜๋Š” ์ตœ๋Œ€ <= 0๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  ํ˜„์žฌ ๋ฌด๊ฒŒ์™€ ์ œํ•œ์„ ์ฝ์€ ๋‹ค์Œ bool๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: true ๋˜๋Š” false๋ฅผ ์ถ”๊ฐ€ <= ์ตœ๋Œ€ - ํ˜„์žฌ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋นผ๊ธฐ๋Š” ํ˜„์žฌ + ์ถ”๊ฐ€ ์˜ค๋ฒ„ํ”Œ๋กœ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฒ„๋กœ๋“œ๋˜๋ฉด extra=0์˜ ๊ฒฝ์šฐ์—๋„ ๊ฒฐ๊ณผ๋Š” false์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์„œ๋ฒ„ ํ™•์ธ์ด ์•„๋‹Œ ๋กœ์ปฌ ํ‰๊ฐ€์ž…๋‹ˆ๋‹ค. ์ฝ๊ธฐ๋Š” ์›์ž์ ์ด์ง€ ์•Š์œผ๋ฉฐ 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()
    {
        if (Truth(Truth(CanCarry(10)) == true))
        {
            UO.Print("Local check passed");
        }
        else
        {
            UO.Print("Local check failed or data unavailable");
        }

        return null;
    }

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

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

        return extra <= maximum - current;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetWeight() โ€” UO.GetWeight()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int Weight() => bridge.Weight;

UO.GetYellowBar

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

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

int UO.GetYellowBar(object? id);

๋…ธ๋ž€์ƒ‰ ์ฒด๋ ฅ ๋ฐ” ํ”Œ๋ž˜๊ทธ mobile๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int 1 - ๋กœ๋“œ๋œ mobile์—๋Š” IsYellowHits ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. int 0 - ์†์„ฑ์ด ๋ˆ„๋ฝ๋˜์—ˆ๊ฑฐ๋‚˜ ๊ฐ์ฒด๊ฐ€ mobile์ด ์•„๋‹ˆ๊ฑฐ๋‚˜ ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ…Œ๋งˆ ์ƒ‰์ƒ IDE ๋˜๋Š” ์ˆ˜๋Ÿ‰ HP์ด ์•„๋‹Œ ์„œ๋ฒ„/ํ˜ธํ™˜ ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—†๋‹ค๊ณ  ํ•ด์„œ ์ทจ์•ฝ์„ฑ์ด ์ž…์ฆ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ๋ณดํ˜ธ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • self ์ธ์ˆ˜๋Š” ํ•ด๋‹น ๋ฌธ์ž๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ - 1/0์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.
  • ์ด๊ฒƒ์€ ํ…Œ๋งˆ ์ƒ‰์ƒ IDE ๋˜๋Š” ์ˆ˜๋Ÿ‰ HP์ด ์•„๋‹Œ ์„œ๋ฒ„/ํ˜ธํ™˜ ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—†๋‹ค๊ณ  ํ•ด์„œ ์ทจ์•ฝ์„ฑ์ด ์ž…์ฆ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ๋ณดํ˜ธ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
var state = UO.GetYellowBar("self");
var hp = UO.GetHP("self");
UO.Print("Yellow flag: " + Convert.ToString(state));
UO.Print("Known HP: " + Convert.ToString(hp));

2. ์„ ํƒ๋จ ํ™•์ธ mobile - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • IsNpc ์ œ๋ชฉ ๋ฐ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด๋Š” ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. target์€ ๋ณ€๊ฒฝ๋˜๋Š” lasttarget์— ๋Œ€ํ•œ ์‹ค์‹œ๊ฐ„ ์ฐธ์กฐ๊ฐ€ ์•„๋‹Œ ๋‹จ์ผ serial์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” IsYellowHits ํ•„๋“œ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ์ ˆํ•œ ์ƒํƒœ๋ฅผ ์ˆ˜์‹ ํ•œ ํ›„์—๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.GetYellowBar(target);
        UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    return null;
}

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

3. ์ผ์‹œ ์ค‘์ง€ ์ „๊ณผ ํ›„์˜ ์ƒํƒœ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

    async public Task<object?> RunScenarioAsync()
    {
        var target = UO.GetSerial("lasttarget");
        if (Truth(UO.IsNPC(target)))
        {
            var before = UO.GetYellowBar(target);
            await Delay(500);
            if (Truth(UO.IsNPC(target)))
            {
                var after = UO.GetYellowBar(target);
                if (Truth(before != after))
                {
                    UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
                }
            }
            else
            {
                UO.Print("Mobile left the local world");
            }
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

UO.Gold

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

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

dynamic UO.Gold();

ํ˜„์žฌ ์บ๋ฆญํ„ฐ์˜ ์ƒํƒœ์—์„œ ๊ณจ๋“œ์˜ ์–‘์„ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int/double๋Š” ์Œ์ˆ˜๊ฐ€ ์•„๋‹Œ ํ•ฉ 0..4294967295์ž…๋‹ˆ๋‹ค. 2147483647 int๊นŒ์ง€ double(Double) ์œ„๊นŒ์ง€ ๋ฐ˜ํ™˜๋˜๋ฉฐ, ์ด๋Š” 32๋น„ํŠธ ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. 0์€ ๋˜ํ•œ ํ˜„์žฌ ์‚ญ์ œ ์ทจ์†Œ๋œ ํ”Œ๋ ˆ์ด์–ด๋‚˜ ๋ฐ›์€ ๊ธˆ์•ก์ด ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. bool, ID, ์Šคํƒ ์ˆ˜ ๋˜๋Š” ๋ฐฑํŒฉ/๋ฑ…ํฌ ๋ฐ”์ดํŒจ์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. CharacterStatus(0x11)์—์„œ Player.Gold ์บ์‹œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์นด์šดํ„ฐ์— ์–ด๋–ค ๊ธˆ์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ํŒ€์€ ๊ฐ€๋ฐฉ์„ ๋’ค์ง€๊ฑฐ๋‚˜ ์€ํ–‰ ์ž”๊ณ ๋ฅผ ์š”๊ตฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—†์Œ/ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด - 0; ์œ ๋ น ์กด์žฌ๋Š” ์ƒํƒœ ์–‘์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ReadGoldValue ๋ธŒ๋ฆฌ์ง€๋ฅผ ํ•œ ๋ฒˆ ์ฝ์Šต๋‹ˆ๋‹ค.Gold. ์ด์ „ C# ๋ธŒ๋ฆฌ์ง€๋Š” Int32 ์„œ๋ช…์„ ์œ ์ง€ํ•˜๊ณ  UInt32 ๋น„ํŠธ๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ํ™•์ธ๋˜์ง€ ์•Š์€ ๋ณ€ํ™˜์€ ๋ถ€ํ˜ธ ์—†๋Š” ํ•ฉ๊ณ„๋ฅผ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. ์ ์€ ์–‘์€ int๋กœ, ๋งŽ์€ ์–‘์€ double๋กœ ๋ณ€ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋น„ํŠธ๊ฐ€ ๋” ์ด์ƒ ์ž”์•ก์„ ๋งˆ์ด๋„ˆ์Šค๋กœ ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™˜์€ ๋กœ์ปฌ์ด๋ฉฐ ํŒจํ‚ค์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ๋Š” ๋‹ค๋ฅธ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๊ฒฐ๊ณผ๋Š” ์—ฐ๊ฒฐ์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0์€ ๊ฐ’์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ๋ฐ›์€ ๊ธˆ์•ก ์ธ์ถœ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • amount๋Š” ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ToString ์žก์ง€์šฉ์œผ๋กœ ํฌ๋งทํ•ฉ๋‹ˆ๋‹ค. ๊ธˆ์€ ์ถ”๊ตฌํ•˜๊ฑฐ๋‚˜ ์šด๋ฐ˜ํ•˜๊ฑฐ๋‚˜ ์†Œ๋น„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var amount = UO.Gold();
UO.Print("Status gold: " + Convert.ToString(amount));

2. ํฐ ๊ฐ€๊ฒฉ์˜ ์ „์ฒด ๊ธฐ๋Šฅ CanAfford - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๊ฐ€๊ฒฉ=3000000000.0๋Š” ํ•œ๋„๊ฐ€ ์•„๋‹Œ ๊ฐ€๊ฒฉ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. CanAfford(๊ฐ€๊ฒฉ)์€ ์Œ์ˆ˜ ๊ฐ€๊ฒฉ์„ ๊ฑฐ๋ถ€ํ•˜๊ฑฐ๋‚˜ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๊ธˆ์•ก์„ ํ•œ ๋ฒˆ ์ฝ๊ณ  bool๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. true ๋˜๋Š” ๊ธˆ์•ก >= ๊ฐ€๊ฒฉ์ธ ๊ฒฝ์šฐ false. ๊ธˆ์•ก ์ž์ฒด๋Š” bool๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์•„๋ž˜์— ์™„์ „ํžˆ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var price = 3000000000.0;
    if (Truth(Truth(CanAfford(price)) == true))
    {
        UO.Print("Local balance is sufficient");
    }
    else
    {
        UO.Print("Local check failed");
    }

    return null;
}

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

    var amount = UO.Gold();
    return amount >= price;
}

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

3. ๋ฐธ๋Ÿฐ์Šค ๋ณ€ํ™” ๊ด€์ฐฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.Gold();
        await Delay(500);
        var after = UO.Gold();
        var difference = after - before;
        UO.Print("Balance change: " + Convert.ToString(difference));
        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.Gold() โ€” UO.Gold()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "gold": return ReadGoldValue();

UO.HP

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

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

int UO.HP();

๋กœ์ปฌ ๋ชจ๋ธ์—์„œ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int๋Š” bool๋‚˜ ๋ฐฑ๋ถ„์œจ์ด ์•„๋‹Œ Hits ํ•„๋“œ์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. 0๋Š” ์‹ค์ œ ๊ฐ’์ด๊ฑฐ๋‚˜ ๋ˆ„๋ฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€๊ฐ’ 0์€ ์ œ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ mobile์˜ ๊ฒฝ์šฐ ์˜๋ฏธ๊ฐ€ ์•Œ๋ ค์ง€์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HP/HitsMax์—๋Š” ์ •ํ™•ํ•œ ํฌ์ธํŠธ ๋Œ€์‹  ์ƒ๋Œ€์ ์ธ ์„œ๋ฒ„ ๊ทœ๋ชจ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HP=0๋Š” ์‚ฌ๋ง์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ Dead/IsDead์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ์ƒํƒœ๋ฅผ ์—ด์ง€ ์•Š์œผ๋ฉฐ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ด๋ฏธ ๋กœ๋“œ๋œ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. ํŠน์„ฑ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ํŒจํ‚ท์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” ๋ณ„๋„์˜ ๋…์„œ์ž…๋‹ˆ๋‹ค. Exists์™€ ๋‹ค์Œ ๋„์ „ ์‚ฌ์ด์— ์„ธ์ƒ์ด ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋Š” ์›์ž์„ฑ ์Šค๋ƒ…์ƒท์„ ํ˜•์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด๋ฅผ ์ฝ์„ ๋•Œ World.Get์€ ๋ˆ„๋ฝ๋œ ๋˜๋Š” IsDestroyed๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  ๊ฒฐ๊ณผ๋Š” 0์ž…๋‹ˆ๋‹ค. HP/HitsMax๋Š” ์ด๋Ÿฌํ•œ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์„ ํฌํ•จํ•˜์—ฌ ์—”ํ„ฐํ‹ฐ์—์„œ ์ฝ์Šต๋‹ˆ๋‹ค. Mana/Stamina - ๋ชจ๋ฐ”์ผ ์ „์šฉ์ž…๋‹ˆ๋‹ค. ๋…ผ์Ÿ ์—†์ด self์„ ์ฝ์œผ์„ธ์š”. ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋ณ€ํ˜•์ด ๋ฐ˜๋“œ์‹œ ID๋ฅผ ํฌํ•จํ•œ ๋ณ€ํ˜•์„ ๊ฐ€์งˆ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋ช…์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  • ์ธ์ˆ˜ ์—†์ด ์ฝ์œผ๋ฉด ๋ˆ„๋ฝ๋˜๊ฑฐ๋‚˜ ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์— ๋Œ€ํ•ด 0๋„ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” World.Get์„ ํ†ตํ•œ ํ˜•์‹๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ง์ ‘ Mana/Stamina ๋ฐ ์ตœ๋Œ€๊ฐ’์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ฃฝ์€ ์บ๋ฆญํ„ฐ๋Š” ๊ฐ’์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์บ๋ฆญํ„ฐ์˜ ๊ฐ€์น˜๋ฅผ ์ธ์‡„ํ•˜์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ํ˜ธ์ถœ์€ self๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ฐ’์€ ํ•˜๋‚˜์˜ ์ˆซ์ž๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ToString๋Š” ๋ฉ”์‹œ์ง€์šฉ์œผ๋กœ๋งŒ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
var value = UO.HP();
UO.Print("HP: " + Convert.ToString(value));

2. ํ™•์ธ ๋˜๋Š” ๊ณ„์‚ฐ ์‹œ ๊ฐ’ ์ ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ด ํ•„๋“œ์— ์ ์šฉ๋œ ์ž„๊ณ„๊ฐ’ ๋˜๋Š” ๊ณ„์‚ฐ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด์˜ ์ˆซ์ž๋Š” ์„œ๋ฒ„ ์ œํ•œ์ด ์•„๋‹Œ ์˜ˆ์‹œ ์„ค์ •์ž…๋‹ˆ๋‹ค. ์ตœ๋Œ€๊ฐ’์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ ์ „์— ์–‘์„ฑ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.HP();
    var maximum = UO.GetMaxHP();
    if (Truth(maximum > 0) && Truth(value * 100 / maximum < 50))
    {
        UO.Print("Health below half of the known maximum");
    }

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

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

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

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

    dynamic ReadValue()
    {
        return UO.HP();
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.HP() โ€” UO.HP()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.GetHP(bridge.Self)

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


UO.Hidden

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

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

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

์บ๋ฆญํ„ฐ์˜ ์Šคํ…”์Šค๋ฅผ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

์ˆซ์ž ํ”Œ๋ž˜๊ทธ int: 1(์กฐ๊ฑด ์ถฉ์กฑ), 0(์กฐ๊ฑด ์ถฉ์กฑ๋˜์ง€ ์•Š์Œ). ์ด๊ฒƒ์€ ์ˆซ์ž ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค. C#์—์„œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜์„ธ์š”!= 0 ๋˜๋Š” ๊ฒฐ๊ณผ == 0์ž…๋‹ˆ๋‹ค. int์™€ true/false ๋ฐ if(๊ฒฐ๊ณผ)๋ฅผ ์ง์ ‘ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 1 - mobile์—๋Š” IsHidden์ด ์žˆ๊ณ , 0์—๋Š” ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—†๊ฑฐ๋‚˜ mobile๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฒฝ ๋’ค์˜ ๊ฐ€์‹œ์„ฑ์ด ์•„๋‹Œ ์„œ๋ฒ„ ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค.

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

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • ๋นˆ ๊ด„ํ˜ธ๋Š” self๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. active๋Š” ๊ฒฐ๊ณผ๋ฅผ ํ•œ ๋ฒˆ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. true ๋ฐ false๋Š” ๋‘ ๊ฐœ์˜ ๋ถ„๊ธฐ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. Print ์˜ˆ์‹œ ๋ฉ”์‹œ์ง€๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
var active = UO.Hidden();
if (Truth(Truth(active) == true))
{
    UO.Print("State is active");
}
else
{
    UO.Print("State is inactive or unavailable");
}

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

2. ์„ ํƒํ•œ ๊ฐœ์ฒด ๋ฐ ์ „์ฒด ๊ธฐ๋Šฅ ReadState - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • lasttarget โ€“ ์ด์ „์— ์„ ํƒํ•œ ๊ฐœ์ฒด. Exists๋Š” ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. obj๊ฐ€ ์œ ์ผํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ReadState์ž…๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ˆ˜์ • ์—†์ด ๋ช…๋ น ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ •์˜๋Š” ๋ณต์‚ฌ๋œ ์ฝ”๋“œ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("lasttarget")))
    {
        var observed = ReadState("lasttarget");
        UO.Print("State 1/0: " + Convert.ToString(observed));
    }

    return null;
}

dynamic ReadState(dynamic obj)
{
    return UO.Hidden(obj);
}

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

3. 0.5์ดˆ ๋งŒ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ๋‘ ๋ฒˆ์˜ ํ˜ธ์ถœ์€ self, UO.Wait(500)๋ฅผ ์ฝ๊ณ  500 ๋ฐ€๋ฆฌ์ดˆ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์ด๋ฏธ์ง€๊ฐ€ ๋น„๊ต๋ฉ๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ์ „ํ™˜์„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋์—†๋Š” ๊ธฐ๋‹ค๋ฆผ์€ ์—†์Šต๋‹ˆ๋‹ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.Hidden();
        await Delay(500);
        var after = UO.Hidden();
        if (Truth(before != after))
        {
            UO.Print("State changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.Hidden() โ€” UO.Hidden()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int Hidden() => Hidden("self");

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int Hidden(string idText) => Hidden(GetObject(idText));

UO.Int

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

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

int UO.Int();

์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ์ง€๋Šฅ(Intelligence, INT)์„ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int โ€” ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์˜ ํ˜„์žฌ ํ†ต๊ณ„ ํฌ์ธํŠธ, 0..65535; ๋ฐฑ๋ถ„์œจ, ID, ์Šคํ‚ฌ, ์ž ๊ธˆ ๋ชจ๋“œ ๋˜๋Š” bool๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. 0๋Š” ๋ˆ„๋ฝ/์‚ญ์ œ๋œ ๋ฌธ์ž ๋˜๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. == true๊ฐ€ ์•„๋‹Œ ์ˆ˜์น˜ ์š”๊ตฌ ์‚ฌํ•ญ๊ณผ ๋น„๊ตํ•˜์‹ญ์‹œ์˜ค. ์ด๋Š” ์Šคํ…Ÿ ํ•œ๋„๋‚˜ ์ˆ˜์ • ์—†์ด ๋ณด์žฅ๋œ ๊ธฐ๋ณธ ๊ฐ’์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ •ํ™•ํ•œ ์„œ๋ช…์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • Player๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.Intelligence Player๊ฐ€ ์กด์žฌํ•˜๊ณ  ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0. ์กด์žฌํ•˜๋Š” ์ฃฝ์€ ์บ๋ฆญํ„ฐ๋Š” ์ œ๊ฑฐ๋œ ๊ฐœ์ฒด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์Šคํ…Ÿ์€ HP, ๋งˆ๋‚˜, ์ฒด๋ ฅ์œผ๋กœ ๊ณ„์‚ฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • GetStr/GetInt/GetDex ObjID๋ฅผ ์ˆ˜๋ฝํ•ฉ๋‹ˆ๋‹ค. PlayerMobile ๋ฐ์ดํ„ฐ๋Š” self์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ serial - 0์˜ ๊ฒฝ์šฐ, ๋กœ๋“œ๋œ mobile์˜ ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํŠน์„ฑ์€ ๋Œ€์ฒด๋˜๊ฑฐ๋‚˜ ์ถ”์ธก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Invoke๋Š” ์Šคํฌ๋ฆฝํŠธ๋กœ ๋Œ€๊ธฐ๋ฅผ ์ทจ์†Œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์—์„œ ์ฝ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ๋ฅผ ์ฟผ๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋Œ€์ƒ์„ ์—ด์ง€ ์•Š์œผ๋ฉฐ, ํŒจํ‚ท์„ ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉฐ, ํŠน์„ฑ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ง€์—ฐ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ๋Š” ๋‹ค๋ฅธ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๊ฒฐ๊ณผ๋Š” ์—ฐ๊ฒฐ์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0์€ ๊ฐ’์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”. UO.Int(), UO.Intelligence(), UO.GetInt(), UO.GetIntelligence().

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

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

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

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

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

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

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

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

  • value๋Š” ์ˆซ์ž ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ToString ์žก์ง€์šฉ์œผ๋กœ ํฌ๋งทํ•ฉ๋‹ˆ๋‹ค. ๋…ผ์Ÿ์ด๋‚˜ ์บ๋ฆญํ„ฐ ํ–‰๋™์ด ์—†์Šต๋‹ˆ๋‹ค.
var value = UO.Int();
UO.Print("Intelligence: " + Convert.ToString(value));

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

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

  • ๋ณ„๋„์˜ 1000 ms ์ „ํ›„; UO.Wait ์˜ˆ์‹œ์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Change=after-before๋Š” ์–‘์ˆ˜, 0 ๋˜๋Š” ์Œ์ˆ˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ž์ฒด๋กœ๋Š” ๋ชจ๋“  ์ค‘๊ฐ„ ์—…๋ฐ์ดํŠธ์™€ ์›”๋“œ ์ข…๋ฃŒ๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.Int();
    await Delay(1000);
    var after = UO.Int();
    var change = after - before;
    UO.Print("Change: " + Convert.ToString(change));
    return null;
}

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

3. ์™„์ „ํ•œ ์š”๊ตฌ์‚ฌํ•ญ ๊ฒ€์ฆ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ตœ์†Œ=80๋Š” ํด๋ผ์ด์–ธํŠธ ์ œํ•œ์ด ์•„๋‹Œ ์š”๊ตฌ ์‚ฌํ•ญ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. AttributeAtLeast(์ตœ์†Œ)๋Š” ๋ˆ„๋ฝ๋œ ๋ฌธ์ž๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  ํŠน์„ฑ์„ ํ•œ ๋ฒˆ ์ฝ๊ณ  bool๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: true ๋˜๋Š” >= ์ตœ์†Œ์ธ ๊ฒฝ์šฐ false. ๋…ผ๋ฆฌ์  ์˜๋ฏธ๋Š” ํŠน์„ฑ ์ž์ฒด๊ฐ€ ์•„๋‹Œ ๋น„๊ต์— ์˜ํ•ด ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.
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(Truth(AttributeAtLeast(80)) == true))
        {
            UO.Print("Requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic AttributeAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.Int();
        return value >= minimum;
    }

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "int": return new InjectionValue(bridge.Intelligence);

UO.Intelligence

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

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

int UO.Intelligence();

์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ์ง€๋Šฅ(Intelligence, INT)์„ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int โ€” ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์˜ ํ˜„์žฌ ํ†ต๊ณ„ ํฌ์ธํŠธ, 0..65535; ๋ฐฑ๋ถ„์œจ, ID, ์Šคํ‚ฌ, ์ž ๊ธˆ ๋ชจ๋“œ ๋˜๋Š” bool๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. 0๋Š” ๋ˆ„๋ฝ/์‚ญ์ œ๋œ ๋ฌธ์ž ๋˜๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. == true๊ฐ€ ์•„๋‹Œ ์ˆ˜์น˜ ์š”๊ตฌ ์‚ฌํ•ญ๊ณผ ๋น„๊ตํ•˜์‹ญ์‹œ์˜ค. ์ด๋Š” ์Šคํ…Ÿ ํ•œ๋„๋‚˜ ์ˆ˜์ • ์—†์ด ๋ณด์žฅ๋œ ๊ธฐ๋ณธ ๊ฐ’์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ •ํ™•ํ•œ ์„œ๋ช…์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • Player๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.Intelligence Player๊ฐ€ ์กด์žฌํ•˜๊ณ  ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0. ์กด์žฌํ•˜๋Š” ์ฃฝ์€ ์บ๋ฆญํ„ฐ๋Š” ์ œ๊ฑฐ๋œ ๊ฐœ์ฒด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์Šคํ…Ÿ์€ HP, ๋งˆ๋‚˜, ์ฒด๋ ฅ์œผ๋กœ ๊ณ„์‚ฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • GetStr/GetInt/GetDex ObjID๋ฅผ ์ˆ˜๋ฝํ•ฉ๋‹ˆ๋‹ค. PlayerMobile ๋ฐ์ดํ„ฐ๋Š” self์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ serial - 0์˜ ๊ฒฝ์šฐ, ๋กœ๋“œ๋œ mobile์˜ ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํŠน์„ฑ์€ ๋Œ€์ฒด๋˜๊ฑฐ๋‚˜ ์ถ”์ธก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Invoke๋Š” ์Šคํฌ๋ฆฝํŠธ๋กœ ๋Œ€๊ธฐ๋ฅผ ์ทจ์†Œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์—์„œ ์ฝ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ๋ฅผ ์ฟผ๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋Œ€์ƒ์„ ์—ด์ง€ ์•Š์œผ๋ฉฐ, ํŒจํ‚ท์„ ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉฐ, ํŠน์„ฑ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ง€์—ฐ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ๋Š” ๋‹ค๋ฅธ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๊ฒฐ๊ณผ๋Š” ์—ฐ๊ฒฐ์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0์€ ๊ฐ’์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”. UO.Int(), UO.Intelligence(), UO.GetInt(), UO.GetIntelligence().

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

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

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

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

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

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

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

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

  • value๋Š” ์ˆซ์ž ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ToString ์žก์ง€์šฉ์œผ๋กœ ํฌ๋งทํ•ฉ๋‹ˆ๋‹ค. ๋…ผ์Ÿ์ด๋‚˜ ์บ๋ฆญํ„ฐ ํ–‰๋™์ด ์—†์Šต๋‹ˆ๋‹ค.
var value = UO.Intelligence();
UO.Print("Intelligence: " + Convert.ToString(value));

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

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

  • ๋ณ„๋„์˜ 1000 ms ์ „ํ›„; UO.Wait ์˜ˆ์‹œ์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Change=after-before๋Š” ์–‘์ˆ˜, 0 ๋˜๋Š” ์Œ์ˆ˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ž์ฒด๋กœ๋Š” ๋ชจ๋“  ์ค‘๊ฐ„ ์—…๋ฐ์ดํŠธ์™€ ์›”๋“œ ์ข…๋ฃŒ๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.Intelligence();
    await Delay(1000);
    var after = UO.Intelligence();
    var change = after - before;
    UO.Print("Change: " + Convert.ToString(change));
    return null;
}

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

3. ์™„์ „ํ•œ ์š”๊ตฌ์‚ฌํ•ญ ๊ฒ€์ฆ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ตœ์†Œ=80๋Š” ํด๋ผ์ด์–ธํŠธ ์ œํ•œ์ด ์•„๋‹Œ ์š”๊ตฌ ์‚ฌํ•ญ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. AttributeAtLeast(์ตœ์†Œ)๋Š” ๋ˆ„๋ฝ๋œ ๋ฌธ์ž๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  ํŠน์„ฑ์„ ํ•œ ๋ฒˆ ์ฝ๊ณ  bool๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: true ๋˜๋Š” >= ์ตœ์†Œ์ธ ๊ฒฝ์šฐ false. ๋…ผ๋ฆฌ์  ์˜๋ฏธ๋Š” ํŠน์„ฑ ์ž์ฒด๊ฐ€ ์•„๋‹Œ ๋น„๊ต์— ์˜ํ•ด ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.
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(Truth(AttributeAtLeast(80)) == true))
        {
            UO.Print("Requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic AttributeAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.Intelligence();
        return value >= minimum;
    }

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.Intelligence

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


UO.IsAlive

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

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

int UO.IsAlive();
int UO.IsAlive(object? value);

์‚ฌ๋ง ํ”์ ์ด ์—†๋Š” ๋ฌผ์ฒด์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

์ˆซ์ž ํ”Œ๋ž˜๊ทธ int: 1(์กฐ๊ฑด ์ถฉ์กฑ), 0(์กฐ๊ฑด ์ถฉ์กฑ๋˜์ง€ ์•Š์Œ). ์ด๊ฒƒ์€ ์ˆซ์ž ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค: C#์—์„œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜์„ธ์š”!= 0 ๋˜๋Š” ๊ฒฐ๊ณผ == 0. int์™€ true/false ๋ฐ if(๊ฒฐ๊ณผ)๋ฅผ ์ง์ ‘ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 1 - ์–‘์„ฑ serial์ด ์กด์žฌํ•˜๋ฉฐ ์ฃฝ์€ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ ๋ช…ํ•œ ํ•ญ๋ชฉ์€ 1๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” mobile ํ•„ํ„ฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ฃฝ์—ˆ๊ฑฐ๋‚˜ ์—†์–ด์ง„ ๊ฐ์ฒด๋Š” 0์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • ๋นˆ ๊ด„ํ˜ธ๋Š” self๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. active๋Š” ๊ฒฐ๊ณผ๋ฅผ ํ•œ ๋ฒˆ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. true ๋ฐ false๋Š” ๋‘ ๊ฐœ์˜ ๋ถ„๊ธฐ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. Print ์˜ˆ์‹œ ๋ฉ”์‹œ์ง€๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
var active = UO.IsAlive();
if (Truth(Truth(active) == true))
{
    UO.Print("State is active");
}
else
{
    UO.Print("State is inactive or unavailable");
}

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

2. ์„ ํƒํ•œ ๊ฐœ์ฒด ๋ฐ ์ „์ฒด ๊ธฐ๋Šฅ ReadState - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • lasttarget โ€“ ์ด์ „์— ์„ ํƒํ•œ ๊ฐœ์ฒด. Exists๋Š” ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. obj๊ฐ€ ์œ ์ผํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ReadState์ž…๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ˆ˜์ • ์—†์ด ๋ช…๋ น ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ •์˜๋Š” ๋ณต์‚ฌ๋œ ์ฝ”๋“œ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("lasttarget")))
    {
        var observed = ReadState("lasttarget");
        UO.Print("State 1/0: " + Convert.ToString(observed));
    }

    return null;
}

dynamic ReadState(dynamic obj)
{
    return UO.IsAlive(obj);
}

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

3. 0.5์ดˆ ๋งŒ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ๋‘ ๋ฒˆ์˜ ํ˜ธ์ถœ์€ self, UO.Wait(500)๋ฅผ ์ฝ๊ณ  500 ๋ฐ€๋ฆฌ์ดˆ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์ด๋ฏธ์ง€๊ฐ€ ๋น„๊ต๋ฉ๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ์ „ํ™˜์„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋์—†๋Š” ๊ธฐ๋‹ค๋ฆผ์€ ์—†์Šต๋‹ˆ๋‹ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.IsAlive();
        await Delay(500);
        var after = UO.IsAlive();
        if (Truth(before != after))
        {
            UO.Print("State changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.IsAlive() โ€” UO.IsAlive()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

serial => serial > 0 && bridge.Exists(serial) != 0 && IsDeadState(serial) == 0 ? 1 : 0

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

() => getter(bridge.Self)

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

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

serial => serial > 0 && bridge.Exists(serial) != 0 && IsDeadState(serial) == 0 ? 1 : 0

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

value => getter(GetObject(value))

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


UO.IsDead

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

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

int UO.IsDead();
dynamic UO.IsDead(object? objID);

์บ๋ฆญํ„ฐ ์‚ฌ๋ง์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

์ˆซ์ž ํ”Œ๋ž˜๊ทธ int: 1(์กฐ๊ฑด ์ถฉ์กฑ), 0(์กฐ๊ฑด ์ถฉ์กฑ ์•ˆ ๋จ). ์ด๊ฒƒ์€ ์ˆซ์ž ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค: C#์—์„œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜์„ธ์š”!= 0 ๋˜๋Š” ๊ฒฐ๊ณผ == 0. int์™€ true/false ๋ฐ if(๊ฒฐ๊ณผ)๋ฅผ ์ง์ ‘ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 1 - mobile์—๋Š” IsDead์ด ์žˆ๊ณ , 0์—๋Š” ๋ถ€ํ˜ธ๊ฐ€ ์—†๊ฑฐ๋‚˜ mobile๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. HP=0 ๊ทธ ์ž์ฒด๊ฐ€ ์ฃฝ์Œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

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

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • ๋นˆ ๊ด„ํ˜ธ๋Š” self๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. active๋Š” ๊ฒฐ๊ณผ๋ฅผ ํ•œ ๋ฒˆ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. true ๋ฐ false๋Š” ๋‘ ๊ฐœ์˜ ๋ถ„๊ธฐ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. Print ์˜ˆ์‹œ ๋ฉ”์‹œ์ง€๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
var active = UO.IsDead();
if (Truth(Truth(active) == true))
{
    UO.Print("State is active");
}
else
{
    UO.Print("State is inactive or unavailable");
}

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

2. ์„ ํƒํ•œ ๊ฐœ์ฒด ๋ฐ ์ „์ฒด ๊ธฐ๋Šฅ ReadState - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • lasttarget โ€“ ์ด์ „์— ์„ ํƒํ•œ ๊ฐœ์ฒด. Exists๋Š” ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. obj๊ฐ€ ์œ ์ผํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ReadState์ž…๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ˆ˜์ • ์—†์ด ๋ช…๋ น ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ •์˜๋Š” ๋ณต์‚ฌ๋œ ์ฝ”๋“œ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("lasttarget")))
    {
        var observed = ReadState("lasttarget");
        UO.Print("State 1/0: " + Convert.ToString(observed));
    }

    return null;
}

dynamic ReadState(dynamic obj)
{
    return UO.IsDead(obj);
}

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

3. 0.5์ดˆ ๋งŒ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ๋‘ ๋ฒˆ์˜ ํ˜ธ์ถœ์€ self, UO.Wait(500)๋ฅผ ์ฝ๊ณ  500 ๋ฐ€๋ฆฌ์ดˆ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์ด๋ฏธ์ง€๊ฐ€ ๋น„๊ต๋ฉ๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ์ „ํ™˜์„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋์—†๋Š” ๊ธฐ๋‹ค๋ฆผ์€ ์—†์Šต๋‹ˆ๋‹ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.IsDead();
        await Delay(500);
        var after = UO.IsDead();
        if (Truth(before != after))
        {
            UO.Print("State changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.IsDead() โ€” UO.IsDead()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

IsDeadState

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

() => getter(bridge.Self)

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

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "isdead": return new InjectionValue(arguments.Length > 0 ? bridge.IsDead(Arg(0)) : bridge.Dead());

UO.IsFemale

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

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

int UO.IsFemale(object? objID);

์—ฌ์„ฑ ์„ฑ๋ณ„ ์†์„ฑ mobile์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int 1 - ๋กœ๋“œ๋จ mobile์—๋Š” IsFemale ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. int 0 - ์†์„ฑ์ด ๋ˆ„๋ฝ๋˜์—ˆ๊ฑฐ๋‚˜ ๊ฐœ์ฒด๊ฐ€ mobile๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜ ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ฒด ์†Œ์œ ์ž์˜ ์ธ์ข…, ์ด๋ฆ„, ๋‚˜์ด ๋˜๋Š” ์œ ํ˜•์„ ๊ฒฐ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • self ์ธ์ˆ˜๋Š” ํ•ด๋‹น ๋ฌธ์ž๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ - 1/0์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.
  • ๊ฐœ์ฒด ์†Œ์œ ์ž์˜ ์ธ์ข…, ์ด๋ฆ„, ๋‚˜์ด ๋˜๋Š” ์œ ํ˜•์„ ๊ฒฐ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var state = UO.IsFemale("self");
if (Truth(state))
{
    UO.Print("Female flag is set");
}
else
{
    UO.Print("Female flag is not set");
}

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

2. ์„ ํƒ๋จ ํ™•์ธ mobile - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • IsNpc ์ œ๋ชฉ ๋ฐ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด๋Š” ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. target์€ ๋ณ€๊ฒฝ๋˜๋Š” lasttarget์— ๋Œ€ํ•œ ์‹ค์‹œ๊ฐ„ ์ฐธ์กฐ๊ฐ€ ์•„๋‹Œ ๋‹จ์ผ serial์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” IsFemale ํ•„๋“œ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ์ ˆํ•œ ์ƒํƒœ๋ฅผ ์ˆ˜์‹ ํ•œ ํ›„์—๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.IsFemale(target);
        UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    return null;
}

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

3. ์ผ์‹œ ์ค‘์ง€ ์ „๊ณผ ํ›„์˜ ์ƒํƒœ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

    async public Task<object?> RunScenarioAsync()
    {
        var target = UO.GetSerial("lasttarget");
        if (Truth(UO.IsNPC(target)))
        {
            var before = UO.IsFemale(target);
            await Delay(500);
            if (Truth(UO.IsNPC(target)))
            {
                var after = UO.IsFemale(target);
                if (Truth(before != after))
                {
                    UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
                }
            }
            else
            {
                UO.Print("Mobile left the local world");
            }
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "isfemale": return new InjectionValue(bridge.IsFemale(Arg(0, bridge.Self)));

UO.IsFlying

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

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

int UO.IsFlying();
int UO.IsFlying(object? value);

์บ๋ฆญํ„ฐ๊ฐ€ ํ˜„์žฌ ๋‚ ๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Gargoyle์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒฝ๋กœ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์ด๋‚˜ ๋น„ํ–‰ ํ™œ์„ฑํ™”๋ฅผ ์š”์ฒญํ•˜๊ธฐ ์ „์ž…๋‹ˆ๋‹ค. "๋‚ด ์บ๋ฆญํ„ฐ๊ฐ€ ์ง€๊ธˆ ๋‚ ๊ณ  ์žˆ๋‚˜์š”?"๋ผ๋Š” ์งˆ๋ฌธ์— ๋‹ตํ•ฉ๋‹ˆ๋‹ค. ๋…ผ์Ÿ์—†์ด. ์ด ๋ช…๋ น์€ ์ƒํƒœ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. ๋น„ํ–‰, ์ฐฉ๋ฅ™ ๋˜๋Š” ์บ๋ฆญํ„ฐ ์ด๋™์„ ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

  • value - ์„ ํƒ ์‚ฌํ•ญ serial ๋ฌธ์ž: ์ˆซ์ž, 16์ง„์ˆ˜ ๋ฌธ์ž์—ด, self, lasttarget ๋˜๋Š” UO.AddObject์„ ํ†ตํ•ด ์ €์žฅ๋œ ์ด๋ฆ„. ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ๊ท€ํ•˜์˜ ์บ๋ฆญํ„ฐ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํŠน์ • mobile์˜ ID์ด๋ฉฐ, graphic/type๋„ ์•„๋‹ˆ๊ณ  Z์˜ ์ขŒํ‘œ๋„ ์•„๋‹™๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„, ๋ˆ„๋ฝ/์ œ๊ฑฐ๋œ mobile ๋˜๋Š” ํ•ญ๋ชฉ์— 0์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

์ˆซ์ž ํ”Œ๋ž˜๊ทธ int: 1(์กฐ๊ฑด ์ถฉ์กฑ), 0(์กฐ๊ฑด ์ถฉ์กฑ๋˜์ง€ ์•Š์Œ). ์ด๊ฒƒ์€ ์ˆซ์ž ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค: C#์—์„œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜์„ธ์š”!= 0 ๋˜๋Š” ๊ฒฐ๊ณผ == 0. int์™€ true/false ๋ฐ if(๊ฒฐ๊ณผ)๋ฅผ ์ง์ ‘ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 1 - mobile์—๋Š” IsFlying์ด ์žˆ๊ณ , 0์—๋Š” ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—†๊ฑฐ๋‚˜ mobile๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ณ ๋„ Z ์ž์ฒด๊ฐ€ ๋น„ํ–‰์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

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

๋™์ž‘

  • ์ฃผ์š” ๊ฒŒ์ž„ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ๊ฐ€๊ณ ์ผ์˜ ๋น„ํ–‰์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ getter๋Š” ๊ฒฝํ•ฉ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „ 7.0.0.0 ์ด์ƒ์„ ์‚ฌ์šฉํ•˜์—ฌ mobile์—์„œ 0x04 ๋น„ํŠธ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์ด์ „ ํ”„๋กœํ† ์ฝœ์—์„œ๋Š” 0๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ง€๋ถ• ์œ„์— ์„œ๊ธฐ, ๋†’์€ Z, ๋‚ ๊ฐœ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋˜๋Š” ๊ฐ€๊ณ ์ผ ๊ฒฝ์ฃผ ์ž์ฒด๋Š” ๋น„ํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ฆ๊ฑฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ๋ณ„๋„์˜ UO.ToggleFly()๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. "์ผœ๊ธฐ" ๋ช…๋ น์ด ์•„๋‹Œ ์Šค์œ„์น˜ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ด๋ฏธ ๋น„ํ–‰ ์ค‘์ด๋ผ๋ฉด ์ฐฉ๋ฅ™์„ ์š”์ฒญํ•˜๋Š” ์ „ํ™”๊ฐ€ ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋œ ํ›„ ์ œํ•œ์ ์œผ๋กœ ๊ธฐ๋‹ค๋ฆฌ๋ฉด์„œ Flying์„ ๋‹ค์‹œ ์ฝ์œผ์„ธ์š”. false๋„ ์บ๋ฆญํ„ฐ/๋ฐ์ดํ„ฐ๊ฐ€ ์—†์–ด๋„ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์•ก์…˜ ํ”Œ๋ ˆ์ด ์ „ Connected๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
  • ๋กœ์ปฌ ๋ชจ๋ธ์„ ์ฝ์Šต๋‹ˆ๋‹ค. ๋Œ€์ƒ์„ ์—ด์ง€ ์•Š๊ณ , ์ƒํƒœ๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์œผ๋ฉฐ, ํ”Œ๋ž˜๊ทธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ, ํŒจํ‚ท์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ญ์ œ๋œ ๊ฐœ์ฒด๋Š” ํ•ด๋‹น ํ•ญ๋ชฉ์ด ์‚ฌ์ „์—์„œ ์‚ญ์ œ๋˜๊ธฐ ์ „์—๋„ ๋ˆ„๋ฝ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” ๋ณ„๋„์˜ ๋…์„œ์ž…๋‹ˆ๋‹ค. Exists์™€ ๋‹ค์Œ ๋„์ „ ์‚ฌ์ด์— ์„ธ์ƒ์ด ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋Š” ์›์ž์„ฑ ์Šค๋ƒ…์ƒท์„ ํ˜•์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ๋‹ค์Œ ์Šคํฌ๋ฆฝํŠธ ๋‹จ๊ณ„ ์ „ ๋ชจ๋“œ ํ™•์ธ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋นˆ ๊ด„ํ˜ธ๋Š” self์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. true๋Š” 1์™€ ๊ฐ™๊ณ , false๋Š” 0์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. UO.Flying() { ... }๊ฐ€ ํ—ˆ์šฉ๋˜๋Š” ๊ฒฝ์šฐ. ์ด ์˜ˆ์—์„œ๋Š” ์•„๋ฌด๊ฒƒ๋„ ์ „ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var active = UO.IsFlying();
if (Truth(Truth(active) == true))
{
    UO.Print("Flying mode active");
}
else
{
    UO.Print("Ground mode or character data unavailable");
}

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

2. ์ด์ „์— ์„ ํƒํ•œ ์บ๋ฆญํ„ฐ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ReadState(obj)๋Š” serial/alias๋ฅผ ์ทจํ•˜๊ณ  ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์ •์˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด๊ฐ€ ์—†์œผ๋ฉด ์ฝ๊ธฐ ์ „์— ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์บ๋ฆญํ„ฐ๋„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด๋ฏธ ๋ฐ›์€ ๋ฐ์ดํ„ฐ์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var target = Asc(UO.GetSerial("lasttarget"), 0);
    if (Truth(target != 0) && Truth(UO.Exists(target)))
    {
        if (Truth(ReadState(target)))
        {
            UO.AddObject("flying_mobile", target);
        }
    }

    return null;
}

dynamic ReadState(dynamic obj)
{
    if (!(Truth(UO.Exists(obj))))
    {
        return false;
    }

    return UO.IsFlying(obj);
}

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;

3. ํ•œ ๋ฒˆ ๋น„ํ–‰์„ ์š”์ฒญํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์„ธ์š” - ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์—…

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

  • ๋น„ํ–‰ ์ง€์› ์„œ๋ฒ„์˜ ๊ฐ€๊ณ ์ผ์— ๋Œ€ํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค. EnsureFlight(timeoutMs)๋Š” ๋น„ํ–‰์ด ๊ด€์ฐฐ๋˜๋ฉด 1/true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0/false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. 2000 โ€” ๋Œ€๊ธฐ ์ œํ•œ(๋ฐ€๋ฆฌ์ดˆ); 50 ms๋งˆ๋‹ค ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ๋น„ํ–‰ ์ค‘์ด๋ผ๋ฉด ToggleFly๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€ 1๊ฐœ์˜ ์š”์ฒญ์ด ์ „์†ก๋˜๋ฉด ์‘๋‹ต ์ƒํƒœ๊ฐ€ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ ์ผ์‹œ ์ค‘์ง€/์Šค์ผ€์ค„๋Ÿฌ ์ง€์—ฐ์œผ๋กœ ์ธํ•ด ์‹ค์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
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()
    {
        if (Truth(await EnsureFlight(2000)))
        {
            UO.Print("Flight confirmed; ready for the next stage");
        }
        else
        {
            UO.Print("Flight not confirmed; route was not started");
        }

        return null;
    }

    async Task<dynamic> EnsureFlight(dynamic timeoutMs)
    {
        if (!(Truth(UO.Connected())) || Truth(UO.Dead()))
        {
            return false;
        }

        if (Truth(UO.IsFlying()))
        {
            return true;
        }

        UO.ToggleFly();
        var waited = 0;
        while (Truth(waited < timeoutMs))
        {
            if (!(Truth(UO.Connected())))
            {
                return false;
            }

            if (Truth(UO.IsFlying()))
            {
                return true;
            }

            await Delay(50);
            waited += 50;
        }

        return UO.IsFlying();
    }

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

serial => bridge.Flying(serial)

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

() => getter(bridge.Self)

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

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

serial => bridge.Flying(serial)

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

value => getter(GetObject(value))

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


UO.IsFrozen

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

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

int UO.IsFrozen();
int UO.IsFrozen(object? value);

ํด๋ผ์ด์–ธํŠธ์— ์•Œ๋ ค์ง„ ์บ๋ฆญํ„ฐ์˜ ๋งˆ๋น„ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

  • value - ์„ ํƒ ์‚ฌํ•ญ serial/ID mobile: ์ˆซ์ž, 16์ง„์ˆ˜ ๋ฌธ์ž์—ด, self, lasttarget ๋˜๋Š” ๊ธฐํƒ€ ํ‘œ์ค€ ๊ฐœ์ฒด ์ด๋ฆ„ ๋˜๋Š” AddObject ์ด๋ฆ„. ์ด๊ฒƒ์€ graphic/type์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด self๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„์€ 0์—์„œ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ํƒ€๊ฒŸ์ด ์—ด๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

์ˆซ์ž ํ”Œ๋ž˜๊ทธ int: 1 (์กฐ๊ฑด ์ถฉ์กฑ) - ๋กœ๋“œ๋จ mobile์—๋Š” ํ”Œ๋ž˜๊ทธ IsParalyzed์ด ์žˆ์Šต๋‹ˆ๋‹ค. 0 (์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜์ง€ ์•Š์Œ) - ํ”Œ๋ž˜๊ทธ ์—†์Œ, mobile ์•Œ ์ˆ˜ ์—†์Œ, ์‚ญ์ œ๋˜์—ˆ๊ฑฐ๋‚˜ ๊ฐœ์ฒด๊ฐ€ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋งˆ๋น„ ์‹œ๊ฐ„์ด ์•„๋‹ˆ๋ฉฐ 0 ๊ฒฐ๊ณผ๋กœ ์ด๋™ ๋Šฅ๋ ฅ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋งˆ๋น„ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด Paralyzed๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. Is/Get, GetParalisa, Frozen ๋ฐ GetLocked ์˜ต์…˜์€ ๋™์ผํ•œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์€ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. ๋งˆ๋น„๋ฅผ ์ ์šฉํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋งˆ๋น„๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์œผ๋ฉฐ, ์„œ๋ฒ„์— ์—…๋ฐ์ดํŠธ ์š”์ฒญ์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์˜ ๊ฒฐ๊ณผ๋Š” int ์œ ํ˜•์ž…๋‹ˆ๋‹ค. if (value != 0) ๋˜๋Š” if (value == 0)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. true/false ๋ฐ C#์˜ if (๊ฐ’)๊ณผ์˜ ์ง์ ‘ ๋น„๊ต๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ’์€ ์ˆ˜๋Ÿ‰์ด๋‚˜ ID์ด ์•„๋‹Œ ํ”Œ๋ž˜๊ทธ์˜ ์˜๋ฏธ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ๋นˆ ๊ด„ํ˜ธ๋Š” self๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ๋Š” ํ”Œ๋ž˜๊ทธ์˜ ํ•˜๋‚˜์˜ ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. true์€ ์ˆ˜์น˜์ƒ์ˆ˜ 1์ž…๋‹ˆ๋‹ค.
  • false ๊ฒฐ๊ณผ๋Š” ๋ฒฝ, ์ฒด๋ ฅ ๋ถ€์กฑ ๋˜๋Š” ๊ธฐํƒ€ ์ •์ง€ ์ด์œ ๋ฅผ ๋ฐฐ์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var state = UO.IsFrozen();
if (Truth(Truth(state) == true))
{
    UO.Print("Paralysis flag is set");
}
else
{
    UO.Print("Paralysis flag is absent or unavailable");
}

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

2. ์„ ํƒ๋จ ํ™•์ธ mobile - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • target์€ ๋งˆ์ง€๋ง‰ ํƒ€๊ฒŸ์˜ 16์ง„์ˆ˜ ๋ฌธ์ž์—ด serial์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. IsNpc๋Š” ํ”Œ๋ ˆ์ด์–ด๋ฅผ ํฌํ•จํ•˜์—ฌ ๋กœ๋“œ๋œ mobile์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์ธ์ˆ˜๊ฐ€ ํฌํ•จ๋œ ๋ช…๋ น์€ ๋Œ€์ƒ์„ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋…€๋Š” ์ƒˆ๋กœ์šด ์บ๋ฆญํ„ฐ๋ฅผ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค lasttarget.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.IsFrozen(target);
        UO.Print("Selected mobile paralysis 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    return null;
}

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

3. ๋งˆ๋น„๊ฐ€ ์ œ๊ฑฐ๋  ๋•Œ๊นŒ์ง€ ์ œํ•œ๋œ ๋Œ€๊ธฐ - ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์—…

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

  • 100ms ๋™์•ˆ 10 ์ด์ƒ ์ผ์‹œ ์ค‘์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธ์ˆ˜ ์—†์ด ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค self๋ฅผ ๋‹ค์‹œ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ๋ฃจํ”„ ํ›„์—๋Š” self ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ๋ณ„๋„๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์•ฝ 1์ดˆ ๋™์•ˆ์˜ ๊ด€์ฐฐ๊ณผ ๋ช…๋ น ์‹คํ–‰์„ ํ•ฉํ•œ ๊ฒƒ์ด๋ฉฐ ๋งˆ๋น„๊ฐ€ ์™„์ „ํžˆ ์ œ๊ฑฐ๋œ๋‹ค๋Š” ๋ณด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.
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(Truth(UO.IsFrozen()) == true) && Truth(attempts < 10))
        {
            await Delay(100);
            attempts = attempts + 1;
        }

        if (Truth(UO.IsNPC("self")))
        {
            if (Truth(Truth(UO.IsFrozen()) == false))
            {
                UO.Print("Paralysis flag is clear");
            }
            else
            {
                UO.Print("Still paralyzed");
            }
        }
        else
        {
            UO.Print("Self is unavailable");
        }

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

serial => bridge.GetLocked(serial)

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

() => getter(bridge.Self)

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

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

serial => bridge.GetLocked(serial)

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

value => getter(GetObject(value))

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


UO.IsHidden

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

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

int UO.IsHidden();
dynamic UO.IsHidden(object? objID);

์บ๋ฆญํ„ฐ์˜ ์Šคํ…”์Šค๋ฅผ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

์ˆซ์ž ํ”Œ๋ž˜๊ทธ int: 1(์กฐ๊ฑด ์ถฉ์กฑ), 0(์กฐ๊ฑด ์ถฉ์กฑ๋˜์ง€ ์•Š์Œ). ์ด๊ฒƒ์€ ์ˆซ์ž ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค. C#์—์„œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜์„ธ์š”!= 0 ๋˜๋Š” ๊ฒฐ๊ณผ == 0์ž…๋‹ˆ๋‹ค. int์™€ true/false ๋ฐ if(๊ฒฐ๊ณผ)๋ฅผ ์ง์ ‘ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 1 - mobile์—๋Š” IsHidden์ด ์žˆ๊ณ , 0์—๋Š” ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—†๊ฑฐ๋‚˜ mobile๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฒฝ ๋’ค์˜ ๊ฐ€์‹œ์„ฑ์ด ์•„๋‹Œ ์„œ๋ฒ„ ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค.

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

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • ๋นˆ ๊ด„ํ˜ธ๋Š” self๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. active๋Š” ๊ฒฐ๊ณผ๋ฅผ ํ•œ ๋ฒˆ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. true ๋ฐ false๋Š” ๋‘ ๊ฐœ์˜ ๋ถ„๊ธฐ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. Print ์˜ˆ์‹œ ๋ฉ”์‹œ์ง€๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
var active = UO.IsHidden();
if (Truth(Truth(active) == true))
{
    UO.Print("State is active");
}
else
{
    UO.Print("State is inactive or unavailable");
}

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

2. ์„ ํƒํ•œ ๊ฐœ์ฒด ๋ฐ ์ „์ฒด ๊ธฐ๋Šฅ ReadState - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • lasttarget โ€“ ์ด์ „์— ์„ ํƒํ•œ ๊ฐœ์ฒด. Exists๋Š” ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. obj๊ฐ€ ์œ ์ผํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ReadState์ž…๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ˆ˜์ • ์—†์ด ๋ช…๋ น ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ •์˜๋Š” ๋ณต์‚ฌ๋œ ์ฝ”๋“œ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("lasttarget")))
    {
        var observed = ReadState("lasttarget");
        UO.Print("State 1/0: " + Convert.ToString(observed));
    }

    return null;
}

dynamic ReadState(dynamic obj)
{
    return UO.IsHidden(obj);
}

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

3. 0.5์ดˆ ๋งŒ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ๋‘ ๋ฒˆ์˜ ํ˜ธ์ถœ์€ self, UO.Wait(500)๋ฅผ ์ฝ๊ณ  500 ๋ฐ€๋ฆฌ์ดˆ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์ด๋ฏธ์ง€๊ฐ€ ๋น„๊ต๋ฉ๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ์ „ํ™˜์„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋์—†๋Š” ๊ธฐ๋‹ค๋ฆผ์€ ์—†์Šต๋‹ˆ๋‹ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.IsHidden();
        await Delay(500);
        var after = UO.IsHidden();
        if (Truth(before != after))
        {
            UO.Print("State changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.IsHidden() โ€” UO.IsHidden()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

serial => bridge.Hidden(serial)

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

() => getter(bridge.Self)

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

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "ishidden": return new InjectionValue(bridge.Hidden(Arg(0, bridge.Self)));

UO.IsParalysed

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

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

int UO.IsParalysed();
int UO.IsParalysed(object? value);

ํด๋ผ์ด์–ธํŠธ์— ์•Œ๋ ค์ง„ ์บ๋ฆญํ„ฐ์˜ ๋งˆ๋น„ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

  • value - ์„ ํƒ ์‚ฌํ•ญ serial/ID mobile: ์ˆซ์ž, 16์ง„์ˆ˜ ๋ฌธ์ž์—ด, self, lasttarget ๋˜๋Š” ๊ธฐํƒ€ ํ‘œ์ค€ ๊ฐœ์ฒด ์ด๋ฆ„ ๋˜๋Š” AddObject ์ด๋ฆ„. ์ด๊ฒƒ์€ graphic/type์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด self๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„์€ 0์—์„œ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ํƒ€๊ฒŸ์ด ์—ด๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

์ˆซ์ž ํ”Œ๋ž˜๊ทธ int: 1 (์กฐ๊ฑด ์ถฉ์กฑ) - ๋กœ๋“œ๋จ mobile์—๋Š” ํ”Œ๋ž˜๊ทธ IsParalyzed์ด ์žˆ์Šต๋‹ˆ๋‹ค. 0 (์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜์ง€ ์•Š์Œ) - ํ”Œ๋ž˜๊ทธ ์—†์Œ, mobile ์•Œ ์ˆ˜ ์—†์Œ, ์‚ญ์ œ๋˜์—ˆ๊ฑฐ๋‚˜ ๊ฐœ์ฒด๊ฐ€ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋งˆ๋น„ ์‹œ๊ฐ„์ด ์•„๋‹ˆ๋ฉฐ 0 ๊ฒฐ๊ณผ๋กœ ์ด๋™ ๋Šฅ๋ ฅ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋งˆ๋น„ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด Paralyzed๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. Is/Get, GetParalisa, Frozen ๋ฐ GetLocked ์˜ต์…˜์€ ๋™์ผํ•œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์€ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. ๋งˆ๋น„๋ฅผ ์ ์šฉํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋งˆ๋น„๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์œผ๋ฉฐ, ์„œ๋ฒ„์— ์—…๋ฐ์ดํŠธ ์š”์ฒญ์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์˜ ๊ฒฐ๊ณผ๋Š” int ์œ ํ˜•์ž…๋‹ˆ๋‹ค. if (value != 0) ๋˜๋Š” if (value == 0)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. true/false ๋ฐ C#์˜ if (๊ฐ’)๊ณผ์˜ ์ง์ ‘ ๋น„๊ต๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ’์€ ์ˆ˜๋Ÿ‰์ด๋‚˜ ID์ด ์•„๋‹Œ ํ”Œ๋ž˜๊ทธ์˜ ์˜๋ฏธ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ๋นˆ ๊ด„ํ˜ธ๋Š” self๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ๋Š” ํ”Œ๋ž˜๊ทธ์˜ ํ•˜๋‚˜์˜ ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. true์€ ์ˆ˜์น˜์ƒ์ˆ˜ 1์ž…๋‹ˆ๋‹ค.
  • false ๊ฒฐ๊ณผ๋Š” ๋ฒฝ, ์ฒด๋ ฅ ๋ถ€์กฑ ๋˜๋Š” ๊ธฐํƒ€ ์ •์ง€ ์ด์œ ๋ฅผ ๋ฐฐ์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var state = UO.IsParalysed();
if (Truth(Truth(state) == true))
{
    UO.Print("Paralysis flag is set");
}
else
{
    UO.Print("Paralysis flag is absent or unavailable");
}

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

2. ์„ ํƒ๋จ ํ™•์ธ mobile - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • target์€ ๋งˆ์ง€๋ง‰ ํƒ€๊ฒŸ์˜ 16์ง„์ˆ˜ ๋ฌธ์ž์—ด serial์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. IsNpc๋Š” ํ”Œ๋ ˆ์ด์–ด๋ฅผ ํฌํ•จํ•˜์—ฌ ๋กœ๋“œ๋œ mobile์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์ธ์ˆ˜๊ฐ€ ํฌํ•จ๋œ ๋ช…๋ น์€ ๋Œ€์ƒ์„ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋…€๋Š” ์ƒˆ๋กœ์šด ์บ๋ฆญํ„ฐ๋ฅผ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค lasttarget.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.IsParalysed(target);
        UO.Print("Selected mobile paralysis 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    return null;
}

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

3. ๋งˆ๋น„๊ฐ€ ์ œ๊ฑฐ๋  ๋•Œ๊นŒ์ง€ ์ œํ•œ๋œ ๋Œ€๊ธฐ - ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์—…

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

  • 100ms ๋™์•ˆ 10 ์ด์ƒ ์ผ์‹œ ์ค‘์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธ์ˆ˜ ์—†์ด ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค self๋ฅผ ๋‹ค์‹œ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ๋ฃจํ”„ ํ›„์—๋Š” self ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ๋ณ„๋„๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์•ฝ 1์ดˆ ๋™์•ˆ์˜ ๊ด€์ฐฐ๊ณผ ๋ช…๋ น ์‹คํ–‰์„ ํ•ฉํ•œ ๊ฒƒ์ด๋ฉฐ ๋งˆ๋น„๊ฐ€ ์™„์ „ํžˆ ์ œ๊ฑฐ๋œ๋‹ค๋Š” ๋ณด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.
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(Truth(UO.IsParalysed()) == true) && Truth(attempts < 10))
        {
            await Delay(100);
            attempts = attempts + 1;
        }

        if (Truth(UO.IsNPC("self")))
        {
            if (Truth(Truth(UO.IsParalysed()) == false))
            {
                UO.Print("Paralysis flag is clear");
            }
            else
            {
                UO.Print("Still paralyzed");
            }
        }
        else
        {
            UO.Print("Self is unavailable");
        }

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

serial => bridge.GetLocked(serial)

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

() => getter(bridge.Self)

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

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

serial => bridge.GetLocked(serial)

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

value => getter(GetObject(value))

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


UO.IsParalyzed

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

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

int UO.IsParalyzed();
int UO.IsParalyzed(object? objID);

ํด๋ผ์ด์–ธํŠธ์— ์•Œ๋ ค์ง„ ์บ๋ฆญํ„ฐ์˜ ๋งˆ๋น„ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

  • objID - ์„ ํƒ ์‚ฌํ•ญ serial/ID mobile: ์ˆซ์ž, 16์ง„์ˆ˜ ๋ฌธ์ž์—ด, self, lasttarget ๋˜๋Š” ๊ธฐํƒ€ ํ‘œ์ค€ ๊ฐœ์ฒด ์ด๋ฆ„ ๋˜๋Š” AddObject ์ด๋ฆ„. ์ด๊ฒƒ์€ graphic/type์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด self๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„์€ 0์—์„œ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ํƒ€๊ฒŸ์ด ์—ด๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

์ˆซ์ž ํ”Œ๋ž˜๊ทธ int: 1 (์กฐ๊ฑด ์ถฉ์กฑ) - ๋กœ๋“œ๋จ mobile์—๋Š” ํ”Œ๋ž˜๊ทธ IsParalyzed์ด ์žˆ์Šต๋‹ˆ๋‹ค. 0 (์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜์ง€ ์•Š์Œ) - ํ”Œ๋ž˜๊ทธ ์—†์Œ, mobile ์•Œ ์ˆ˜ ์—†์Œ, ์‚ญ์ œ๋˜์—ˆ๊ฑฐ๋‚˜ ๊ฐœ์ฒด๊ฐ€ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋งˆ๋น„ ์‹œ๊ฐ„์ด ์•„๋‹ˆ๋ฉฐ 0 ๊ฒฐ๊ณผ๋กœ ์ด๋™ ๋Šฅ๋ ฅ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋งˆ๋น„ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด Paralyzed๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. Is/Get, GetParalisa, Frozen ๋ฐ GetLocked ์˜ต์…˜์€ ๋™์ผํ•œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์€ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. ๋งˆ๋น„๋ฅผ ์ ์šฉํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋งˆ๋น„๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์œผ๋ฉฐ, ์„œ๋ฒ„์— ์—…๋ฐ์ดํŠธ ์š”์ฒญ์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์˜ ๊ฒฐ๊ณผ๋Š” int ์œ ํ˜•์ž…๋‹ˆ๋‹ค. if (value != 0) ๋˜๋Š” if (value == 0)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. true/false ๋ฐ C#์˜ if (๊ฐ’)๊ณผ์˜ ์ง์ ‘ ๋น„๊ต๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ’์€ ์ˆ˜๋Ÿ‰์ด๋‚˜ ID์ด ์•„๋‹Œ ํ”Œ๋ž˜๊ทธ์˜ ์˜๋ฏธ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ๋นˆ ๊ด„ํ˜ธ๋Š” self๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ๋Š” ํ”Œ๋ž˜๊ทธ์˜ ํ•˜๋‚˜์˜ ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. true์€ ์ˆ˜์น˜์ƒ์ˆ˜ 1์ž…๋‹ˆ๋‹ค.
  • false ๊ฒฐ๊ณผ๋Š” ๋ฒฝ, ์ฒด๋ ฅ ๋ถ€์กฑ ๋˜๋Š” ๊ธฐํƒ€ ์ •์ง€ ์ด์œ ๋ฅผ ๋ฐฐ์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var state = UO.IsParalyzed();
if (Truth(Truth(state) == true))
{
    UO.Print("Paralysis flag is set");
}
else
{
    UO.Print("Paralysis flag is absent or unavailable");
}

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

2. ์„ ํƒ๋จ ํ™•์ธ mobile - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • target์€ ๋งˆ์ง€๋ง‰ ํƒ€๊ฒŸ์˜ 16์ง„์ˆ˜ ๋ฌธ์ž์—ด serial์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. IsNpc๋Š” ํ”Œ๋ ˆ์ด์–ด๋ฅผ ํฌํ•จํ•˜์—ฌ ๋กœ๋“œ๋œ mobile์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์ธ์ˆ˜๊ฐ€ ํฌํ•จ๋œ ๋ช…๋ น์€ ๋Œ€์ƒ์„ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋…€๋Š” ์ƒˆ๋กœ์šด ์บ๋ฆญํ„ฐ๋ฅผ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค lasttarget.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.IsParalyzed(target);
        UO.Print("Selected mobile paralysis 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    return null;
}

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

3. ๋งˆ๋น„๊ฐ€ ์ œ๊ฑฐ๋  ๋•Œ๊นŒ์ง€ ์ œํ•œ๋œ ๋Œ€๊ธฐ - ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์—…

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

  • 100ms ๋™์•ˆ 10 ์ด์ƒ ์ผ์‹œ ์ค‘์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธ์ˆ˜ ์—†์ด ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค self๋ฅผ ๋‹ค์‹œ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ๋ฃจํ”„ ํ›„์—๋Š” self ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ๋ณ„๋„๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์•ฝ 1์ดˆ ๋™์•ˆ์˜ ๊ด€์ฐฐ๊ณผ ๋ช…๋ น ์‹คํ–‰์„ ํ•ฉํ•œ ๊ฒƒ์ด๋ฉฐ ๋งˆ๋น„๊ฐ€ ์™„์ „ํžˆ ์ œ๊ฑฐ๋œ๋‹ค๋Š” ๋ณด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.
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(Truth(UO.IsParalyzed()) == true) && Truth(attempts < 10))
        {
            await Delay(100);
            attempts = attempts + 1;
        }

        if (Truth(UO.IsNPC("self")))
        {
            if (Truth(Truth(UO.IsParalyzed()) == false))
            {
                UO.Print("Paralysis flag is clear");
            }
            else
            {
                UO.Print("Still paralyzed");
            }
        }
        else
        {
            UO.Print("Self is unavailable");
        }

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

serial => bridge.GetLocked(serial)

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

() => getter(bridge.Self)

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

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "isparalyzed": return new InjectionValue(bridge.GetLocked(Arg(0, bridge.Self)));

UO.IsPoisoned

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

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

int UO.IsPoisoned();
dynamic UO.IsPoisoned(object? objID);

์บ๋ฆญํ„ฐ์˜ ์ค‘๋… ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

์ˆซ์ž ํ”Œ๋ž˜๊ทธ int: 1(์กฐ๊ฑด ์ถฉ์กฑ), 0(์กฐ๊ฑด ์ถฉ์กฑ๋˜์ง€ ์•Š์Œ). ์ด๊ฒƒ์€ ์ˆซ์ž ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค. C#์—์„œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜์„ธ์š”!= 0 ๋˜๋Š” ๊ฒฐ๊ณผ == 0์ž…๋‹ˆ๋‹ค. int์™€ true/false ๋ฐ if(๊ฒฐ๊ณผ)๋ฅผ ์ง์ ‘ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 1 - mobile์—๋Š” IsPoisoned์ด ์žˆ๊ณ , 0์—๋Š” ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—†๊ฑฐ๋‚˜ mobile๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋…์˜ ์ •๋„์™€ ๋‚จ์€ ์‹œ๊ฐ„์€ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • ๋นˆ ๊ด„ํ˜ธ๋Š” self๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. active๋Š” ๊ฒฐ๊ณผ๋ฅผ ํ•œ ๋ฒˆ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. true ๋ฐ false๋Š” ๋‘ ๊ฐœ์˜ ๋ถ„๊ธฐ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. Print ์˜ˆ์‹œ ๋ฉ”์‹œ์ง€๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
var active = UO.IsPoisoned();
if (Truth(Truth(active) == true))
{
    UO.Print("State is active");
}
else
{
    UO.Print("State is inactive or unavailable");
}

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

2. ์„ ํƒํ•œ ๊ฐœ์ฒด ๋ฐ ์ „์ฒด ๊ธฐ๋Šฅ ReadState - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • lasttarget โ€“ ์ด์ „์— ์„ ํƒํ•œ ๊ฐœ์ฒด. Exists๋Š” ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. obj๊ฐ€ ์œ ์ผํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ReadState์ž…๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ˆ˜์ • ์—†์ด ๋ช…๋ น ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ •์˜๋Š” ๋ณต์‚ฌ๋œ ์ฝ”๋“œ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("lasttarget")))
    {
        var observed = ReadState("lasttarget");
        UO.Print("State 1/0: " + Convert.ToString(observed));
    }

    return null;
}

dynamic ReadState(dynamic obj)
{
    return UO.IsPoisoned(obj);
}

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

3. 0.5์ดˆ ๋งŒ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ๋‘ ๋ฒˆ์˜ ํ˜ธ์ถœ์€ self, UO.Wait(500)๋ฅผ ์ฝ๊ณ  500 ๋ฐ€๋ฆฌ์ดˆ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์ด๋ฏธ์ง€๊ฐ€ ๋น„๊ต๋ฉ๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ์ „ํ™˜์„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋์—†๋Š” ๊ธฐ๋‹ค๋ฆผ์€ ์—†์Šต๋‹ˆ๋‹ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.IsPoisoned();
        await Delay(500);
        var after = UO.IsPoisoned();
        if (Truth(before != after))
        {
            UO.Print("State changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.IsPoisoned() โ€” UO.IsPoisoned()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

serial => bridge.Poisoned(serial)

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

() => getter(bridge.Self)

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

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "ispoisoned": return new InjectionValue(bridge.Poisoned(Arg(0, bridge.Self)));

UO.IsYellowHits

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

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

int UO.IsYellowHits(object? objID);

๋…ธ๋ž€์ƒ‰ ์ฒด๋ ฅ ๋ฐ” ํ”Œ๋ž˜๊ทธ mobile๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int 1 - ๋กœ๋“œ๋œ mobile์—๋Š” IsYellowHits ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. int 0 - ์†์„ฑ์ด ๋ˆ„๋ฝ๋˜์—ˆ๊ฑฐ๋‚˜ ๊ฐ์ฒด๊ฐ€ mobile์ด ์•„๋‹ˆ๊ฑฐ๋‚˜ ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ…Œ๋งˆ ์ƒ‰์ƒ IDE ๋˜๋Š” ์ˆ˜๋Ÿ‰ HP์ด ์•„๋‹Œ ์„œ๋ฒ„/ํ˜ธํ™˜ ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—†๋‹ค๊ณ  ํ•ด์„œ ์ทจ์•ฝ์„ฑ์ด ์ž…์ฆ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ๋ณดํ˜ธ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • self ์ธ์ˆ˜๋Š” ํ•ด๋‹น ๋ฌธ์ž๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ - 1/0์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.
  • ์ด๊ฒƒ์€ ํ…Œ๋งˆ ์ƒ‰์ƒ IDE ๋˜๋Š” ์ˆ˜๋Ÿ‰ HP์ด ์•„๋‹Œ ์„œ๋ฒ„/ํ˜ธํ™˜ ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—†๋‹ค๊ณ  ํ•ด์„œ ์ทจ์•ฝ์„ฑ์ด ์ž…์ฆ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ๋ณดํ˜ธ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
var state = UO.IsYellowHits("self");
var hp = UO.GetHP("self");
UO.Print("Yellow flag: " + Convert.ToString(state));
UO.Print("Known HP: " + Convert.ToString(hp));

2. ์„ ํƒ๋จ ํ™•์ธ mobile - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • IsNpc ์ œ๋ชฉ ๋ฐ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด๋Š” ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. target์€ ๋ณ€๊ฒฝ๋˜๋Š” lasttarget์— ๋Œ€ํ•œ ์‹ค์‹œ๊ฐ„ ์ฐธ์กฐ๊ฐ€ ์•„๋‹Œ ๋‹จ์ผ serial์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” IsYellowHits ํ•„๋“œ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ์ ˆํ•œ ์ƒํƒœ๋ฅผ ์ˆ˜์‹ ํ•œ ํ›„์—๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.IsYellowHits(target);
        UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    return null;
}

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

3. ์ผ์‹œ ์ค‘์ง€ ์ „๊ณผ ํ›„์˜ ์ƒํƒœ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

    async public Task<object?> RunScenarioAsync()
    {
        var target = UO.GetSerial("lasttarget");
        if (Truth(UO.IsNPC(target)))
        {
            var before = UO.IsYellowHits(target);
            await Delay(500);
            if (Truth(UO.IsNPC(target)))
            {
                var after = UO.IsYellowHits(target);
                if (Truth(before != after))
                {
                    UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
                }
            }
            else
            {
                UO.Print("Mobile left the local world");
            }
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "isyellowhits": return new InjectionValue(bridge.GetYellowBar(Arg(0, bridge.Self)));

UO.LastStatus

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

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

int UO.LastStatus();

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ƒํƒœ๋ฅผ ์ˆ˜๋ฝํ•œ ๋งˆ์ง€๋ง‰ ๊ฐœ์ฒด์˜ serial๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int๋Š” 32 ๋น„ํŠธ serial์ด๋ฉฐ, type๋„ ์•„๋‹ˆ๊ณ  ๋…ผ๋ฆฌ์  ๊ฒฐ๊ณผ๋„ ์•„๋‹™๋‹ˆ๋‹ค. 0: ์•„์ง ์Šน์ธ๋œ ์ƒํƒœ๊ฐ€ ์—†๊ฑฐ๋‚˜ ์›”๋“œ๊ฐ€ ํด๋ฆฌ์–ด๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋น„ํŠธ๊ฐ€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์Œ์ˆ˜๋Š” serial๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. != 0๋ฅผ ํ™•์ธํ•˜์„ธ์š”. > 0์ด ์•„๋‹ˆ๊ณ  == true๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ฝ๊ธฐ๋Š” ํŒจํ‚ท์„ ๋ณด๋‚ด๊ฑฐ๋‚˜ ์ฐฝ์„ ์—ด๊ฑฐ๋‚˜ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. UO.GetStatus(id), RequestStats ๋ฐ UpdateObject๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์ „์†ก์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค LastStatus.
  • ์ˆ˜์‹ ๋œ ํŒจํ‚ค์ง€ 0x11๋Š” ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•ด serial ๋ฐ ํด๋ผ์ด์–ธํŠธ์— ์•Œ๋ ค์ง„ X/Y๋ฅผ World์— ํ•จ๊ป˜ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ํŒŒ๊ดด๋œ ๊ฐœ์ฒด ๋ฐ ๋ถˆ์™„์ „ํ•œ ๊ธฐ๋ณธ ํŒจํ‚ค์ง€๋Š” ํ•ญ๋ชฉ์„ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ํ›„์† ํŒจํ‚ค์ง€๊ฐ€ ์ด๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • X/Y๋Š” ํ˜„์žฌ ์œ„์น˜๊ฐ€ ์•„๋‹Œ ์ˆ˜์‹  ๋‹น์‹œ ์—”ํ„ฐํ‹ฐ์˜ ์Šค๋ƒ…์ƒท์ž…๋‹ˆ๋‹ค. mobile์˜ ๊ฒฝ์šฐ ์ด๋Š” ์›”๋“œ ์…€์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ํ•ญ๋ชฉ์˜ ๊ฒฝ์šฐ ์ด๋Š” ๋‚ด์šฉ์˜ ์ขŒํ‘œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒํƒœ ํŒจํ‚ค์ง€ ์ž์ฒด๋Š” X/Y๋ฅผ ์ „์†กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ˆ˜์‹  ํ›„ ๋ฌผ์ฒด๋ฅผ ์ด๋™/์ œ๊ฑฐํ•ด๋„ ์ด๋ฏธ์ง€๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. World.Clear๊ฐ€ ์žฌ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์ง€ํ˜•์ง€๋ฌผ์˜ ํ˜„์žฌ ์ขŒํ‘œ๋ฅผ ๋ณด๋ ค๋ฉด GetX/GetY๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๊ฐœ๋ณ„ ํ˜ธ์ถœ์€ ์›์ž์  ์Šค๋ƒ…์ƒท์„ ํ˜•์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ๊ทธ๋“ค ์‚ฌ์ด์˜ ๊ธฐ๋ก์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™๋“ฑ์„ฑ serial์€ ๊ท€ํ•˜์˜ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๋‹ต๋ณ€์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ด„ํ˜ธ๊ฐ€ ์—†๋Š” laststatus๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ณ€์ˆ˜๋กœ ์žฌ์ •์˜ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ผ์ด๋ธŒ ๋‚ด์žฅ ๊ฐ’์ž…๋‹ˆ๋‹ค. UO.LastStatus()๋Š” ๋“ฑ๋ก๋œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ๋งˆ์ง€๋ง‰ ๊ฐ’ ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๊ฐ’์€ ํ•œ ๋ฒˆ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค. serial์˜ ๊ฒฝ์šฐ HEX๋Š” ํŽธ๋ฆฌํ•œ 16์ง„์ˆ˜ ํ‘œ๊ธฐ๋ฒ•์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ขŒํ‘œ Convert.ToString์˜ ๊ฒฝ์šฐ ์ˆซ์ž๋ฅผ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ์€ ๊ฐœ์ฒด๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var value = UO.LastStatus();
UO.Print("Saved value: " + Hex(value));

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

2. ์ƒํƒœ ์ฟผ๋ฆฌ ๋ฐ ์•Œ๋ ค์ง„ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ œ๋ชฉ โ€” serial self. 500๋Š” ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„์˜ ์ผ์‹œ ์ค‘์ง€์ด๋ฉฐ ์˜ˆ์‹œ๋กœ๋งŒ ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ต๋ณ€์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ ˆ์ฝ”๋“œ๊ฐ€ ํ‘œ์‹œ๋˜๋ฉฐ, ์ด๋Š” ์˜ค๋ž˜๋˜์—ˆ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๊ฐœ์ฒด์— ์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var subject = UO.Self();
    if (Truth(subject != 0))
    {
        UO.GetStatus(subject);
        await Delay(500);
        var value = UO.LastStatus();
        UO.Print("Known value: " + Hex(value));
    }

    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
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. ์ „์ฒด ๋„์šฐ๋ฏธ ReadSavedStatus - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

     public object? RunScenario()
    {
        var expectedId = UO.LastStatus();
        if (Truth(expectedId != 0))
        {
            var value = ReadSavedStatus(expectedId);
            UO.Print("Checked value: " + Convert.ToString(value));
        }

        return null;
    }

    dynamic ReadSavedStatus(dynamic expectedId)
    {
        if (Truth(expectedId == 0) || Truth(UO.LastStatus() != expectedId))
        {
            return -1;
        }

        var value = UO.LastStatus();
        if (Truth(UO.LastStatus() != expectedId))
        {
            return -1;
        }

        return value;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.LastStatus() โ€” UO.LastStatus()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "laststatus": return new InjectionValue(bridge.LastStatus);

UO.LastStatusX

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

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

int UO.LastStatusX();

๋งˆ์ง€๋ง‰์œผ๋กœ ์Šน์ธ๋œ ์ƒํƒœ ๊ฐ์ฒด์˜ ์ €์žฅ๋œ X ์ขŒํ‘œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int์€ X์˜ ์ €์žฅ๋œ ์ขŒํ‘œ์ด๋ฉฐ, ์ƒํƒœ์ฐฝ์˜ ํ”ฝ์…€๋„ ์•„๋‹ˆ๊ณ  bool๋„ ์•„๋‹™๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ƒํƒœ ์ „ ๋˜๋Š” ์›”๋“œ ํด๋ฆฌ์–ด ํ›„ - 0; ์ขŒํ‘œ 0 ์ž์ฒด๋„ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ˆ„๋ฝ๋œ ํ•ญ๋ชฉ์„ ๊ตฌ๋ณ„ํ•˜๋ ค๋ฉด UO.LastStatus()๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

๋™์ž‘

  • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ฝ๊ธฐ๋Š” ํŒจํ‚ท์„ ๋ณด๋‚ด๊ฑฐ๋‚˜ ์ฐฝ์„ ์—ด๊ฑฐ๋‚˜ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. UO.GetStatus(id), RequestStats ๋ฐ UpdateObject๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์ „์†ก์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค LastStatus.
  • ์ˆ˜์‹ ๋œ ํŒจํ‚ค์ง€ 0x11๋Š” ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•ด serial ๋ฐ ํด๋ผ์ด์–ธํŠธ์— ์•Œ๋ ค์ง„ X/Y๋ฅผ World์— ํ•จ๊ป˜ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ํŒŒ๊ดด๋œ ๊ฐœ์ฒด ๋ฐ ๋ถˆ์™„์ „ํ•œ ๊ธฐ๋ณธ ํŒจํ‚ค์ง€๋Š” ํ•ญ๋ชฉ์„ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ํ›„์† ํŒจํ‚ค์ง€๊ฐ€ ์ด๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • X/Y๋Š” ํ˜„์žฌ ์œ„์น˜๊ฐ€ ์•„๋‹Œ ์ˆ˜์‹  ๋‹น์‹œ ์—”ํ„ฐํ‹ฐ์˜ ์Šค๋ƒ…์ƒท์ž…๋‹ˆ๋‹ค. mobile์˜ ๊ฒฝ์šฐ ์ด๋Š” ์›”๋“œ ์…€์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ํ•ญ๋ชฉ์˜ ๊ฒฝ์šฐ ์ด๋Š” ๋‚ด์šฉ์˜ ์ขŒํ‘œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒํƒœ ํŒจํ‚ค์ง€ ์ž์ฒด๋Š” X/Y๋ฅผ ์ „์†กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ˆ˜์‹  ํ›„ ๋ฌผ์ฒด๋ฅผ ์ด๋™/์ œ๊ฑฐํ•ด๋„ ์ด๋ฏธ์ง€๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. World.Clear๊ฐ€ ์žฌ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์ง€ํ˜•์ง€๋ฌผ์˜ ํ˜„์žฌ ์ขŒํ‘œ๋ฅผ ๋ณด๋ ค๋ฉด GetX/GetY๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๊ฐœ๋ณ„ ํ˜ธ์ถœ์€ ์›์ž์  ์Šค๋ƒ…์ƒท์„ ํ˜•์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ๊ทธ๋“ค ์‚ฌ์ด์˜ ๊ธฐ๋ก์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™๋“ฑ์„ฑ serial์€ ๊ท€ํ•˜์˜ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๋‹ต๋ณ€์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ด„ํ˜ธ๊ฐ€ ์—†๋Š” laststatus๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ณ€์ˆ˜๋กœ ์žฌ์ •์˜ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ผ์ด๋ธŒ ๋‚ด์žฅ ๊ฐ’์ž…๋‹ˆ๋‹ค. UO.LastStatus()๋Š” ๋“ฑ๋ก๋œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ๋งˆ์ง€๋ง‰ ๊ฐ’ ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๊ฐ’์€ ํ•œ ๋ฒˆ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค. serial์˜ ๊ฒฝ์šฐ HEX๋Š” ํŽธ๋ฆฌํ•œ 16์ง„์ˆ˜ ํ‘œ๊ธฐ๋ฒ•์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ขŒํ‘œ Convert.ToString์˜ ๊ฒฝ์šฐ ์ˆซ์ž๋ฅผ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ์€ ๊ฐœ์ฒด๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var value = UO.LastStatusX();
UO.Print("Saved value: " + Convert.ToString(value));

2. ์ƒํƒœ ์ฟผ๋ฆฌ ๋ฐ ์•Œ๋ ค์ง„ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ œ๋ชฉ โ€” serial self. 500๋Š” ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„์˜ ์ผ์‹œ ์ค‘์ง€์ด๋ฉฐ ์˜ˆ์‹œ๋กœ๋งŒ ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ต๋ณ€์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ ˆ์ฝ”๋“œ๊ฐ€ ํ‘œ์‹œ๋˜๋ฉฐ, ์ด๋Š” ์˜ค๋ž˜๋˜์—ˆ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๊ฐœ์ฒด์— ์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var subject = UO.Self();
    if (Truth(subject != 0))
    {
        UO.GetStatus(subject);
        await Delay(500);
        var value = UO.LastStatusX();
        UO.Print("Known value: " + Convert.ToString(value));
    }

    return null;
}

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

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

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

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

     public object? RunScenario()
    {
        var expectedId = UO.LastStatus();
        if (Truth(expectedId != 0))
        {
            var value = ReadSavedStatus(expectedId);
            UO.Print("Checked value: " + Convert.ToString(value));
        }

        return null;
    }

    dynamic ReadSavedStatus(dynamic expectedId)
    {
        if (Truth(expectedId == 0) || Truth(UO.LastStatus() != expectedId))
        {
            return -1;
        }

        var value = UO.LastStatusX();
        if (Truth(UO.LastStatus() != expectedId))
        {
            return -1;
        }

        return value;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.LastStatusX() โ€” UO.LastStatusX()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int LastStatusX() => bridge is IStatusSnapshotBridge snapshot ? snapshot.LastStatusX : bridge.GetX(bridge.LastStatus);

UO.LastStatusY

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

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

int UO.LastStatusY();

๋งˆ์ง€๋ง‰์œผ๋กœ ์Šน์ธ๋œ ์ƒํƒœ ๊ฐ์ฒด์˜ ์ €์žฅ๋œ Y ์ขŒํ‘œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int์€ Y์˜ ์ €์žฅ๋œ ์ขŒํ‘œ์ด๋ฉฐ, ์ƒํƒœ์ฐฝ์˜ ํ”ฝ์…€๋„ ์•„๋‹ˆ๊ณ  bool๋„ ์•„๋‹™๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ƒํƒœ ์ „ ๋˜๋Š” ์›”๋“œ ํด๋ฆฌ์–ด ํ›„ - 0; ์ขŒํ‘œ 0 ์ž์ฒด๋„ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ˆ„๋ฝ๋œ ํ•ญ๋ชฉ์„ ๊ตฌ๋ณ„ํ•˜๋ ค๋ฉด UO.LastStatus()๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

๋™์ž‘

  • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ฝ๊ธฐ๋Š” ํŒจํ‚ท์„ ๋ณด๋‚ด๊ฑฐ๋‚˜ ์ฐฝ์„ ์—ด๊ฑฐ๋‚˜ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. UO.GetStatus(id), RequestStats ๋ฐ UpdateObject๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์ „์†ก์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค LastStatus.
  • ์ˆ˜์‹ ๋œ ํŒจํ‚ค์ง€ 0x11๋Š” ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•ด serial ๋ฐ ํด๋ผ์ด์–ธํŠธ์— ์•Œ๋ ค์ง„ X/Y๋ฅผ World์— ํ•จ๊ป˜ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ํŒŒ๊ดด๋œ ๊ฐœ์ฒด ๋ฐ ๋ถˆ์™„์ „ํ•œ ๊ธฐ๋ณธ ํŒจํ‚ค์ง€๋Š” ํ•ญ๋ชฉ์„ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ํ›„์† ํŒจํ‚ค์ง€๊ฐ€ ์ด๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • X/Y๋Š” ํ˜„์žฌ ์œ„์น˜๊ฐ€ ์•„๋‹Œ ์ˆ˜์‹  ๋‹น์‹œ ์—”ํ„ฐํ‹ฐ์˜ ์Šค๋ƒ…์ƒท์ž…๋‹ˆ๋‹ค. mobile์˜ ๊ฒฝ์šฐ ์ด๋Š” ์›”๋“œ ์…€์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ํ•ญ๋ชฉ์˜ ๊ฒฝ์šฐ ์ด๋Š” ๋‚ด์šฉ์˜ ์ขŒํ‘œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒํƒœ ํŒจํ‚ค์ง€ ์ž์ฒด๋Š” X/Y๋ฅผ ์ „์†กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ˆ˜์‹  ํ›„ ๋ฌผ์ฒด๋ฅผ ์ด๋™/์ œ๊ฑฐํ•ด๋„ ์ด๋ฏธ์ง€๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. World.Clear๊ฐ€ ์žฌ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์ง€ํ˜•์ง€๋ฌผ์˜ ํ˜„์žฌ ์ขŒํ‘œ๋ฅผ ๋ณด๋ ค๋ฉด GetX/GetY๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๊ฐœ๋ณ„ ํ˜ธ์ถœ์€ ์›์ž์  ์Šค๋ƒ…์ƒท์„ ํ˜•์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ๊ทธ๋“ค ์‚ฌ์ด์˜ ๊ธฐ๋ก์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™๋“ฑ์„ฑ serial์€ ๊ท€ํ•˜์˜ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๋‹ต๋ณ€์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ด„ํ˜ธ๊ฐ€ ์—†๋Š” laststatus๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ณ€์ˆ˜๋กœ ์žฌ์ •์˜ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ผ์ด๋ธŒ ๋‚ด์žฅ ๊ฐ’์ž…๋‹ˆ๋‹ค. UO.LastStatus()๋Š” ๋“ฑ๋ก๋œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ๋งˆ์ง€๋ง‰ ๊ฐ’ ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๊ฐ’์€ ํ•œ ๋ฒˆ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค. serial์˜ ๊ฒฝ์šฐ HEX๋Š” ํŽธ๋ฆฌํ•œ 16์ง„์ˆ˜ ํ‘œ๊ธฐ๋ฒ•์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ขŒํ‘œ Convert.ToString์˜ ๊ฒฝ์šฐ ์ˆซ์ž๋ฅผ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ์€ ๊ฐœ์ฒด๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var value = UO.LastStatusY();
UO.Print("Saved value: " + Convert.ToString(value));

2. ์ƒํƒœ ์ฟผ๋ฆฌ ๋ฐ ์•Œ๋ ค์ง„ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ œ๋ชฉ โ€” serial self. 500๋Š” ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„์˜ ์ผ์‹œ ์ค‘์ง€์ด๋ฉฐ ์˜ˆ์‹œ๋กœ๋งŒ ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ต๋ณ€์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ ˆ์ฝ”๋“œ๊ฐ€ ํ‘œ์‹œ๋˜๋ฉฐ, ์ด๋Š” ์˜ค๋ž˜๋˜์—ˆ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๊ฐœ์ฒด์— ์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var subject = UO.Self();
    if (Truth(subject != 0))
    {
        UO.GetStatus(subject);
        await Delay(500);
        var value = UO.LastStatusY();
        UO.Print("Known value: " + Convert.ToString(value));
    }

    return null;
}

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

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

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

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

     public object? RunScenario()
    {
        var expectedId = UO.LastStatus();
        if (Truth(expectedId != 0))
        {
            var value = ReadSavedStatus(expectedId);
            UO.Print("Checked value: " + Convert.ToString(value));
        }

        return null;
    }

    dynamic ReadSavedStatus(dynamic expectedId)
    {
        if (Truth(expectedId == 0) || Truth(UO.LastStatus() != expectedId))
        {
            return -1;
        }

        var value = UO.LastStatusY();
        if (Truth(UO.LastStatus() != expectedId))
        {
            return -1;
        }

        return value;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.LastStatusY() โ€” UO.LastStatusY()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int LastStatusY() => bridge is IStatusSnapshotBridge snapshot ? snapshot.LastStatusY : bridge.GetY(bridge.LastStatus);

UO.Life

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

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

dynamic UO.Life();

๋กœ์ปฌ ๋ชจ๋ธ์—์„œ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int๋Š” bool๋‚˜ ๋ฐฑ๋ถ„์œจ์ด ์•„๋‹Œ Hits ํ•„๋“œ์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. 0๋Š” ์‹ค์ œ ๊ฐ’์ด๊ฑฐ๋‚˜ ๋ˆ„๋ฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€๊ฐ’ 0์€ ์ œ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ mobile์˜ ๊ฒฝ์šฐ ์˜๋ฏธ๊ฐ€ ์•Œ๋ ค์ง€์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HP/HitsMax์—๋Š” ์ •ํ™•ํ•œ ํฌ์ธํŠธ ๋Œ€์‹  ์ƒ๋Œ€์ ์ธ ์„œ๋ฒ„ ๊ทœ๋ชจ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HP=0๋Š” ์‚ฌ๋ง์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ Dead/IsDead์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ์ƒํƒœ๋ฅผ ์—ด์ง€ ์•Š์œผ๋ฉฐ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ด๋ฏธ ๋กœ๋“œ๋œ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. ํŠน์„ฑ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ํŒจํ‚ท์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” ๋ณ„๋„์˜ ๋…์„œ์ž…๋‹ˆ๋‹ค. Exists์™€ ๋‹ค์Œ ๋„์ „ ์‚ฌ์ด์— ์„ธ์ƒ์ด ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋Š” ์›์ž์„ฑ ์Šค๋ƒ…์ƒท์„ ํ˜•์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด๋ฅผ ์ฝ์„ ๋•Œ World.Get์€ ๋ˆ„๋ฝ๋œ ๋˜๋Š” IsDestroyed๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  ๊ฒฐ๊ณผ๋Š” 0์ž…๋‹ˆ๋‹ค. HP/HitsMax๋Š” ์ด๋Ÿฌํ•œ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์„ ํฌํ•จํ•˜์—ฌ ์—”ํ„ฐํ‹ฐ์—์„œ ์ฝ์Šต๋‹ˆ๋‹ค. Mana/Stamina - ๋ชจ๋ฐ”์ผ ์ „์šฉ์ž…๋‹ˆ๋‹ค. ๋…ผ์Ÿ ์—†์ด self์„ ์ฝ์œผ์„ธ์š”. ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋ณ€ํ˜•์ด ๋ฐ˜๋“œ์‹œ ID๋ฅผ ํฌํ•จํ•œ ๋ณ€ํ˜•์„ ๊ฐ€์งˆ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋ช…์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  • ์ธ์ˆ˜ ์—†์ด ์ฝ์œผ๋ฉด ๋ˆ„๋ฝ๋˜๊ฑฐ๋‚˜ ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์— ๋Œ€ํ•ด 0๋„ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” World.Get์„ ํ†ตํ•œ ํ˜•์‹๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ง์ ‘ Mana/Stamina ๋ฐ ์ตœ๋Œ€๊ฐ’์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ฃฝ์€ ์บ๋ฆญํ„ฐ๋Š” ๊ฐ’์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์บ๋ฆญํ„ฐ์˜ ๊ฐ€์น˜๋ฅผ ์ธ์‡„ํ•˜์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ํ˜ธ์ถœ์€ self๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ฐ’์€ ํ•˜๋‚˜์˜ ์ˆซ์ž๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ToString๋Š” ๋ฉ”์‹œ์ง€์šฉ์œผ๋กœ๋งŒ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
var value = UO.Life();
UO.Print("Life: " + Convert.ToString(value));

2. ํ™•์ธ ๋˜๋Š” ๊ณ„์‚ฐ ์‹œ ๊ฐ’ ์ ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ด ํ•„๋“œ์— ์ ์šฉ๋œ ์ž„๊ณ„๊ฐ’ ๋˜๋Š” ๊ณ„์‚ฐ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด์˜ ์ˆซ์ž๋Š” ์„œ๋ฒ„ ์ œํ•œ์ด ์•„๋‹Œ ์˜ˆ์‹œ ์„ค์ •์ž…๋‹ˆ๋‹ค. ์ตœ๋Œ€๊ฐ’์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ ์ „์— ์–‘์„ฑ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.Life();
    var maximum = UO.GetMaxHP();
    if (Truth(maximum > 0) && Truth(value * 100 / maximum < 50))
    {
        UO.Print("Health below half of the known maximum");
    }

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

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

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

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

    dynamic ReadValue()
    {
        return UO.Life();
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.Life() โ€” UO.Life()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "life": return new InjectionValue(bridge.GetHP(bridge.Self));

UO.Luck

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

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

int UO.Luck();

์บ๋ฆญํ„ฐ์˜ ์ƒํƒœ ์นด์šดํ„ฐ(ํ–‰์šด ํฌ์ธํŠธ)๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

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

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

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

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

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

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

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

1. ์ €์žฅ๋œ ์นด์šดํ„ฐ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • value๋Š” ์ž์‹ ์˜ ๋ฌธ์ž์— ๋Œ€ํ•œ ์ธ์ˆ˜ ์—†๋Š” ํ˜ธ์ถœ์„ ํ•œ ๋ฒˆ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. Convert.ToString๋Š” ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋กœ๊ทธ ๋ฒˆํ˜ธ์˜ ํ˜•์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
var value = UO.Luck();
UO.Print("Luck: " + Convert.ToString(value));

2. ๋ณ€ํ™” ๊ด€์ฐฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • UO.Wait(500)๋Š” 500 ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์ „ํ›„๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ฐจ์ด๋Š” ์–‘์ˆ˜, 0 ๋˜๋Š” ์Œ์ˆ˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ์—…๋ฐ์ดํŠธ ๋ฐ ์บ๋ฆญํ„ฐ ๋ณ€๊ฒฝ์€ ์ƒ๋žต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์‹œ ์ •์ง€๊ฐ€ ๊ทธ ์˜ˆ์ž…๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.Luck();
    await Delay(500);
    var after = UO.Luck();
    var difference = after - before;
    UO.Print("Counter change: " + Convert.ToString(difference));
    return null;
}

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

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

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

  • LuckAtLeast(์ตœ์†Œ) ์ˆซ์ž ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. 1000๋Š” ์˜ˆ์‹œ์ด์ง€ ํ•œ๋„๋‚˜ ๋น„์œจ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ”Œ๋ ˆ์ด์–ด ๋ถ€์žฌ๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  ํ–‰์šด์„ ํ•œ ๋ฒˆ ์ฝ๊ณ  bool: true ๋˜๋Š” false ๊ฐ’ >= ์ตœ์†Œ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ–‰์šด ์ž์ฒด๋Š” bool๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์บ์‹œ๋œ ํฌ์ธํŠธ๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ „๋ฆฌํ’ˆ ๋“œ๋กญ์„ ์˜ˆ์ธกํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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(Truth(LuckAtLeast(1000)) == true))
        {
            UO.Print("Local check passed");
        }
        else
        {
            UO.Print("Local check failed or data unavailable");
        }

        return null;
    }

    dynamic LuckAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.Luck();
        return value >= minimum;
    }

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "luck": return new InjectionValue(bridge.Luck);

UO.Mana

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

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

dynamic UO.Mana();

๋กœ์ปฌ ๋ชจ๋ธ์—์„œ ํ˜„์žฌ ๋งˆ๋‚˜๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int๋Š” ๋ฐฑ๋ถ„์œจ์ด๋‚˜ bool๊ฐ€ ์•„๋‹Œ Mana ํ•„๋“œ์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. 0๋Š” ์‹ค์ œ ๊ฐ’์ด๊ฑฐ๋‚˜ ๋ˆ„๋ฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€๊ฐ’ 0์€ ์ œ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ mobile์˜ ๊ฒฝ์šฐ ์˜๋ฏธ๊ฐ€ ์•Œ๋ ค์ง€์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HP/HitsMax์—๋Š” ์ •ํ™•ํ•œ ํฌ์ธํŠธ ๋Œ€์‹  ์ƒ๋Œ€์ ์ธ ์„œ๋ฒ„ ๊ทœ๋ชจ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HP=0๋Š” ์‚ฌ๋ง์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Dead/IsDead๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ์ƒํƒœ๋ฅผ ์—ด์ง€ ์•Š์œผ๋ฉฐ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ด๋ฏธ ๋กœ๋“œ๋œ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. ํŠน์„ฑ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ํŒจํ‚ท์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” ๋ณ„๋„์˜ ๋…์„œ์ž…๋‹ˆ๋‹ค. Exists์™€ ๋‹ค์Œ ๋„์ „ ์‚ฌ์ด์— ์„ธ์ƒ์ด ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋Š” ์›์ž์„ฑ ์Šค๋ƒ…์ƒท์„ ํ˜•์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด๋ฅผ ์ฝ์„ ๋•Œ World.Get์€ ๋ˆ„๋ฝ๋œ ๋˜๋Š” IsDestroyed๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  ๊ฒฐ๊ณผ๋Š” 0์ž…๋‹ˆ๋‹ค. HP/HitsMax๋Š” ์ด๋Ÿฌํ•œ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์„ ํฌํ•จํ•˜์—ฌ ์—”ํ„ฐํ‹ฐ์—์„œ ์ฝ์Šต๋‹ˆ๋‹ค. Mana/Stamina - ๋ชจ๋ฐ”์ผ ์ „์šฉ์ž…๋‹ˆ๋‹ค. ๋…ผ์Ÿ ์—†์ด self์„ ์ฝ์œผ์„ธ์š”. ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋ณ€ํ˜•์ด ๋ฐ˜๋“œ์‹œ ID๋ฅผ ํฌํ•จํ•œ ๋ณ€ํ˜•์„ ๊ฐ€์งˆ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋ช…์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  • ์ธ์ˆ˜ ์—†์ด ์ฝ์œผ๋ฉด ๋ˆ„๋ฝ๋˜๊ฑฐ๋‚˜ ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์— ๋Œ€ํ•ด 0๋„ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” World.Get์„ ํ†ตํ•œ ํ˜•์‹๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ง์ ‘ Mana/Stamina ๋ฐ ์ตœ๋Œ€๊ฐ’์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ฃฝ์€ ์บ๋ฆญํ„ฐ๋Š” ๊ฐ’์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์บ๋ฆญํ„ฐ์˜ ๊ฐ€์น˜๋ฅผ ์ธ์‡„ํ•˜์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ํ˜ธ์ถœ์€ self๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ฐ’์€ ํ•˜๋‚˜์˜ ์ˆซ์ž๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ToString๋Š” ๋ฉ”์‹œ์ง€์šฉ์œผ๋กœ๋งŒ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
var value = UO.Mana();
UO.Print("Mana: " + Convert.ToString(value));

2. ํ™•์ธ ๋˜๋Š” ๊ณ„์‚ฐ ์‹œ ๊ฐ’ ์ ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ด ํ•„๋“œ์— ์ ์šฉ๋œ ์ž„๊ณ„๊ฐ’ ๋˜๋Š” ๊ณ„์‚ฐ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด์˜ ์ˆซ์ž๋Š” ์„œ๋ฒ„ ์ œํ•œ์ด ์•„๋‹Œ ์˜ˆ์‹œ ์„ค์ •์ž…๋‹ˆ๋‹ค. ์ตœ๋Œ€๊ฐ’์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ ์ „์— ์–‘์„ฑ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.Mana();
    if (Truth(value >= 10))
    {
        UO.Print("At least ten mana points are known");
    }

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

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

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

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

    dynamic ReadValue()
    {
        return UO.Mana();
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.Mana() โ€” UO.Mana()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "mana": return new InjectionValue(bridge.Mana);

UO.MaxHP

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

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

int UO.MaxHP();

๋กœ์ปฌ ๋ชจ๋ธ์—์„œ ์ตœ๋Œ€ ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int๋Š” ๋ฐฑ๋ถ„์œจ์ด๋‚˜ bool๊ฐ€ ์•„๋‹Œ HitsMax ํ•„๋“œ์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. 0๋Š” ์‹ค์ œ ๊ฐ’์ด๊ฑฐ๋‚˜ ๋ˆ„๋ฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€๊ฐ’ 0์€ ์ œ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ mobile์˜ ๊ฒฝ์šฐ ์˜๋ฏธ๊ฐ€ ์•Œ๋ ค์ง€์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HP/HitsMax์—๋Š” ์ •ํ™•ํ•œ ํฌ์ธํŠธ ๋Œ€์‹  ์ƒ๋Œ€์ ์ธ ์„œ๋ฒ„ ๊ทœ๋ชจ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HP=0๋Š” ์‚ฌ๋ง์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Dead/IsDead๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ์ƒํƒœ๋ฅผ ์—ด์ง€ ์•Š์œผ๋ฉฐ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ด๋ฏธ ๋กœ๋“œ๋œ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. ํŠน์„ฑ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ํŒจํ‚ท์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” ๋ณ„๋„์˜ ๋…์„œ์ž…๋‹ˆ๋‹ค. Exists์™€ ๋‹ค์Œ ๋„์ „ ์‚ฌ์ด์— ์„ธ์ƒ์ด ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋Š” ์›์ž์„ฑ ์Šค๋ƒ…์ƒท์„ ํ˜•์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด๋ฅผ ์ฝ์„ ๋•Œ World.Get์€ ๋ˆ„๋ฝ๋œ ๋˜๋Š” IsDestroyed๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  ๊ฒฐ๊ณผ๋Š” 0์ž…๋‹ˆ๋‹ค. HP/HitsMax๋Š” ์ด๋Ÿฌํ•œ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์„ ํฌํ•จํ•˜์—ฌ ์—”ํ„ฐํ‹ฐ์—์„œ ์ฝ์Šต๋‹ˆ๋‹ค. Mana/Stamina - ๋ชจ๋ฐ”์ผ ์ „์šฉ์ž…๋‹ˆ๋‹ค. ๋…ผ์Ÿ ์—†์ด self์„ ์ฝ์œผ์„ธ์š”. ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋ณ€ํ˜•์ด ๋ฐ˜๋“œ์‹œ ID๋ฅผ ํฌํ•จํ•œ ๋ณ€ํ˜•์„ ๊ฐ€์งˆ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋ช…์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  • ์ธ์ˆ˜ ์—†์ด ์ฝ์œผ๋ฉด ๋ˆ„๋ฝ๋˜๊ฑฐ๋‚˜ ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์— ๋Œ€ํ•ด 0๋„ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” World.Get์„ ํ†ตํ•œ ํ˜•์‹๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ง์ ‘ Mana/Stamina ๋ฐ ์ตœ๋Œ€๊ฐ’์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ฃฝ์€ ์บ๋ฆญํ„ฐ๋Š” ๊ฐ’์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์บ๋ฆญํ„ฐ์˜ ๊ฐ€์น˜๋ฅผ ์ธ์‡„ํ•˜์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ํ˜ธ์ถœ์€ self๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ฐ’์€ ํ•˜๋‚˜์˜ ์ˆซ์ž๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ToString๋Š” ๋ฉ”์‹œ์ง€์šฉ์œผ๋กœ๋งŒ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
var value = UO.MaxHP();
UO.Print("MaxHP: " + Convert.ToString(value));

2. ํ™•์ธ ๋˜๋Š” ๊ณ„์‚ฐ ์‹œ ๊ฐ’ ์ ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ด ํ•„๋“œ์— ์ ์šฉ๋œ ์ž„๊ณ„๊ฐ’ ๋˜๋Š” ๊ณ„์‚ฐ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด์˜ ์ˆซ์ž๋Š” ์„œ๋ฒ„ ์ œํ•œ์ด ์•„๋‹Œ ์˜ˆ์‹œ ์„ค์ •์ž…๋‹ˆ๋‹ค. ์ตœ๋Œ€๊ฐ’์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ ์ „์— ์–‘์„ฑ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.MaxHP();
    if (Truth(value > 0))
    {
        UO.Print("Known HP percent: " + Convert.ToString(UO.GetHP() * 100 / value));
    }
    else
    {
        UO.Print("HP maximum unavailable");
    }

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

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

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

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

    dynamic ReadValue()
    {
        return UO.MaxHP();
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.MaxHP() โ€” UO.MaxHP()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.GetMaxHP(bridge.Self)

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


UO.MaxLife

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

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

dynamic UO.MaxLife();

๋กœ์ปฌ ๋ชจ๋ธ์—์„œ ์ตœ๋Œ€ ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int๋Š” ๋ฐฑ๋ถ„์œจ์ด๋‚˜ bool๊ฐ€ ์•„๋‹Œ HitsMax ํ•„๋“œ์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. 0๋Š” ์‹ค์ œ ๊ฐ’์ด๊ฑฐ๋‚˜ ๋ˆ„๋ฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€๊ฐ’ 0์€ ์ œ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ mobile์˜ ๊ฒฝ์šฐ ์˜๋ฏธ๊ฐ€ ์•Œ๋ ค์ง€์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HP/HitsMax์—๋Š” ์ •ํ™•ํ•œ ํฌ์ธํŠธ ๋Œ€์‹  ์ƒ๋Œ€์ ์ธ ์„œ๋ฒ„ ๊ทœ๋ชจ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HP=0๋Š” ์‚ฌ๋ง์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Dead/IsDead๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ์ƒํƒœ๋ฅผ ์—ด์ง€ ์•Š์œผ๋ฉฐ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ด๋ฏธ ๋กœ๋“œ๋œ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. ํŠน์„ฑ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ํŒจํ‚ท์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” ๋ณ„๋„์˜ ๋…์„œ์ž…๋‹ˆ๋‹ค. Exists์™€ ๋‹ค์Œ ๋„์ „ ์‚ฌ์ด์— ์„ธ์ƒ์ด ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋Š” ์›์ž์„ฑ ์Šค๋ƒ…์ƒท์„ ํ˜•์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด๋ฅผ ์ฝ์„ ๋•Œ World.Get์€ ๋ˆ„๋ฝ๋œ ๋˜๋Š” IsDestroyed๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  ๊ฒฐ๊ณผ๋Š” 0์ž…๋‹ˆ๋‹ค. HP/HitsMax๋Š” ์ด๋Ÿฌํ•œ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์„ ํฌํ•จํ•˜์—ฌ ์—”ํ„ฐํ‹ฐ์—์„œ ์ฝ์Šต๋‹ˆ๋‹ค. Mana/Stamina - ๋ชจ๋ฐ”์ผ ์ „์šฉ์ž…๋‹ˆ๋‹ค. ๋…ผ์Ÿ ์—†์ด self์„ ์ฝ์œผ์„ธ์š”. ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋ณ€ํ˜•์ด ๋ฐ˜๋“œ์‹œ ID๋ฅผ ํฌํ•จํ•œ ๋ณ€ํ˜•์„ ๊ฐ€์งˆ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋ช…์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  • ์ธ์ˆ˜ ์—†์ด ์ฝ์œผ๋ฉด ๋ˆ„๋ฝ๋˜๊ฑฐ๋‚˜ ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์— ๋Œ€ํ•ด 0๋„ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” World.Get์„ ํ†ตํ•œ ํ˜•์‹๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ง์ ‘ Mana/Stamina ๋ฐ ์ตœ๋Œ€๊ฐ’์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ฃฝ์€ ์บ๋ฆญํ„ฐ๋Š” ๊ฐ’์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์บ๋ฆญํ„ฐ์˜ ๊ฐ€์น˜๋ฅผ ์ธ์‡„ํ•˜์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ํ˜ธ์ถœ์€ self๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ฐ’์€ ํ•˜๋‚˜์˜ ์ˆซ์ž๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ToString๋Š” ๋ฉ”์‹œ์ง€์šฉ์œผ๋กœ๋งŒ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
var value = UO.MaxLife();
UO.Print("MaxLife: " + Convert.ToString(value));

2. ํ™•์ธ ๋˜๋Š” ๊ณ„์‚ฐ ์‹œ ๊ฐ’ ์ ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ด ํ•„๋“œ์— ์ ์šฉ๋œ ์ž„๊ณ„๊ฐ’ ๋˜๋Š” ๊ณ„์‚ฐ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด์˜ ์ˆซ์ž๋Š” ์„œ๋ฒ„ ์ œํ•œ์ด ์•„๋‹Œ ์˜ˆ์‹œ ์„ค์ •์ž…๋‹ˆ๋‹ค. ์ตœ๋Œ€๊ฐ’์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ ์ „์— ์–‘์„ฑ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.MaxLife();
    if (Truth(value > 0))
    {
        UO.Print("Known HP percent: " + Convert.ToString(UO.GetHP() * 100 / value));
    }
    else
    {
        UO.Print("HP maximum unavailable");
    }

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

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

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

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

    dynamic ReadValue()
    {
        return UO.MaxLife();
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.MaxLife() โ€” UO.MaxLife()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "maxlife": return new InjectionValue(bridge.GetMaxHP(bridge.Self));

UO.MaxMana

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

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

dynamic UO.MaxMana();

๋กœ์ปฌ ๋ชจ๋ธ์—์„œ ์ตœ๋Œ€ ๋งˆ๋‚˜๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int๋Š” ๋ฐฑ๋ถ„์œจ์ด๋‚˜ bool๊ฐ€ ์•„๋‹Œ ManaMax ํ•„๋“œ์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. 0๋Š” ์‹ค์ œ ๊ฐ’์ด๊ฑฐ๋‚˜ ๋ˆ„๋ฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€๊ฐ’ 0์€ ์ œ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ mobile์˜ ๊ฒฝ์šฐ ์˜๋ฏธ๊ฐ€ ์•Œ๋ ค์ง€์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HP/HitsMax์—๋Š” ์ •ํ™•ํ•œ ํฌ์ธํŠธ ๋Œ€์‹  ์ƒ๋Œ€์ ์ธ ์„œ๋ฒ„ ๊ทœ๋ชจ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HP=0๋Š” ์‚ฌ๋ง์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Dead/IsDead๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ์ƒํƒœ๋ฅผ ์—ด์ง€ ์•Š์œผ๋ฉฐ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ด๋ฏธ ๋กœ๋“œ๋œ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. ํŠน์„ฑ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ํŒจํ‚ท์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” ๋ณ„๋„์˜ ๋…์„œ์ž…๋‹ˆ๋‹ค. Exists์™€ ๋‹ค์Œ ๋„์ „ ์‚ฌ์ด์— ์„ธ์ƒ์ด ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋Š” ์›์ž์„ฑ ์Šค๋ƒ…์ƒท์„ ํ˜•์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด๋ฅผ ์ฝ์„ ๋•Œ World.Get์€ ๋ˆ„๋ฝ๋œ ๋˜๋Š” IsDestroyed๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  ๊ฒฐ๊ณผ๋Š” 0์ž…๋‹ˆ๋‹ค. HP/HitsMax๋Š” ์ด๋Ÿฌํ•œ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์„ ํฌํ•จํ•˜์—ฌ ์—”ํ„ฐํ‹ฐ์—์„œ ์ฝ์Šต๋‹ˆ๋‹ค. Mana/Stamina - ๋ชจ๋ฐ”์ผ ์ „์šฉ์ž…๋‹ˆ๋‹ค. ๋…ผ์Ÿ ์—†์ด self์„ ์ฝ์œผ์„ธ์š”. ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋ณ€ํ˜•์ด ๋ฐ˜๋“œ์‹œ ID๋ฅผ ํฌํ•จํ•œ ๋ณ€ํ˜•์„ ๊ฐ€์งˆ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋ช…์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  • ์ธ์ˆ˜ ์—†์ด ์ฝ์œผ๋ฉด ๋ˆ„๋ฝ๋˜๊ฑฐ๋‚˜ ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์— ๋Œ€ํ•ด 0๋„ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” World.Get์„ ํ†ตํ•œ ํ˜•์‹๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ง์ ‘ Mana/Stamina ๋ฐ ์ตœ๋Œ€๊ฐ’์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ฃฝ์€ ์บ๋ฆญํ„ฐ๋Š” ๊ฐ’์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์บ๋ฆญํ„ฐ์˜ ๊ฐ€์น˜๋ฅผ ์ธ์‡„ํ•˜์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ํ˜ธ์ถœ์€ self๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ฐ’์€ ํ•˜๋‚˜์˜ ์ˆซ์ž๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ToString๋Š” ๋ฉ”์‹œ์ง€์šฉ์œผ๋กœ๋งŒ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
var value = UO.MaxMana();
UO.Print("MaxMana: " + Convert.ToString(value));

2. ํ™•์ธ ๋˜๋Š” ๊ณ„์‚ฐ ์‹œ ๊ฐ’ ์ ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ด ํ•„๋“œ์— ์ ์šฉ๋œ ์ž„๊ณ„๊ฐ’ ๋˜๋Š” ๊ณ„์‚ฐ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด์˜ ์ˆซ์ž๋Š” ์„œ๋ฒ„ ์ œํ•œ์ด ์•„๋‹Œ ์˜ˆ์‹œ ์„ค์ •์ž…๋‹ˆ๋‹ค. ์ตœ๋Œ€๊ฐ’์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ ์ „์— ์–‘์„ฑ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.MaxMana();
    if (Truth(value > 0))
    {
        UO.Print("Mana percent: " + Convert.ToString(UO.Mana() * 100 / value));
    }

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

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

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

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

    dynamic ReadValue()
    {
        return UO.MaxMana();
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.MaxMana() โ€” UO.MaxMana()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "maxmana": return new InjectionValue(bridge.MaxMana);

UO.MaxStam

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

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

dynamic UO.MaxStam();

๋กœ์ปฌ ๋ชจ๋ธ์—์„œ ์ตœ๋Œ€ ๋‚ด๊ตฌ์„ฑ์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int๋Š” ๋ฐฑ๋ถ„์œจ์ด๋‚˜ bool๊ฐ€ ์•„๋‹Œ StaminaMax ํ•„๋“œ์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. 0๋Š” ์‹ค์ œ ๊ฐ’์ด๊ฑฐ๋‚˜ ๋ˆ„๋ฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€๊ฐ’ 0์€ ์ œ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ mobile์˜ ๊ฒฝ์šฐ ์˜๋ฏธ๊ฐ€ ์•Œ๋ ค์ง€์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HP/HitsMax์—๋Š” ์ •ํ™•ํ•œ ํฌ์ธํŠธ ๋Œ€์‹  ์ƒ๋Œ€์ ์ธ ์„œ๋ฒ„ ๊ทœ๋ชจ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HP=0๋Š” ์‚ฌ๋ง์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Dead/IsDead๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ์ƒํƒœ๋ฅผ ์—ด์ง€ ์•Š์œผ๋ฉฐ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ด๋ฏธ ๋กœ๋“œ๋œ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. ํŠน์„ฑ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ํŒจํ‚ท์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” ๋ณ„๋„์˜ ๋…์„œ์ž…๋‹ˆ๋‹ค. Exists์™€ ๋‹ค์Œ ๋„์ „ ์‚ฌ์ด์— ์„ธ์ƒ์ด ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋Š” ์›์ž์„ฑ ์Šค๋ƒ…์ƒท์„ ํ˜•์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด๋ฅผ ์ฝ์„ ๋•Œ World.Get์€ ๋ˆ„๋ฝ๋œ ๋˜๋Š” IsDestroyed๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  ๊ฒฐ๊ณผ๋Š” 0์ž…๋‹ˆ๋‹ค. HP/HitsMax๋Š” ์ด๋Ÿฌํ•œ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์„ ํฌํ•จํ•˜์—ฌ ์—”ํ„ฐํ‹ฐ์—์„œ ์ฝ์Šต๋‹ˆ๋‹ค. Mana/Stamina - ๋ชจ๋ฐ”์ผ ์ „์šฉ์ž…๋‹ˆ๋‹ค. ๋…ผ์Ÿ ์—†์ด self์„ ์ฝ์œผ์„ธ์š”. ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋ณ€ํ˜•์ด ๋ฐ˜๋“œ์‹œ ID๋ฅผ ํฌํ•จํ•œ ๋ณ€ํ˜•์„ ๊ฐ€์งˆ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋ช…์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  • ์ธ์ˆ˜ ์—†์ด ์ฝ์œผ๋ฉด ๋ˆ„๋ฝ๋˜๊ฑฐ๋‚˜ ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์— ๋Œ€ํ•ด 0๋„ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” World.Get์„ ํ†ตํ•œ ํ˜•์‹๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ง์ ‘ Mana/Stamina ๋ฐ ์ตœ๋Œ€๊ฐ’์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ฃฝ์€ ์บ๋ฆญํ„ฐ๋Š” ๊ฐ’์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์บ๋ฆญํ„ฐ์˜ ๊ฐ€์น˜๋ฅผ ์ธ์‡„ํ•˜์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ํ˜ธ์ถœ์€ self๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ฐ’์€ ํ•˜๋‚˜์˜ ์ˆซ์ž๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ToString๋Š” ๋ฉ”์‹œ์ง€์šฉ์œผ๋กœ๋งŒ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
var value = UO.MaxStam();
UO.Print("MaxStam: " + Convert.ToString(value));

2. ํ™•์ธ ๋˜๋Š” ๊ณ„์‚ฐ ์‹œ ๊ฐ’ ์ ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ด ํ•„๋“œ์— ์ ์šฉ๋œ ์ž„๊ณ„๊ฐ’ ๋˜๋Š” ๊ณ„์‚ฐ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด์˜ ์ˆซ์ž๋Š” ์„œ๋ฒ„ ์ œํ•œ์ด ์•„๋‹Œ ์˜ˆ์‹œ ์„ค์ •์ž…๋‹ˆ๋‹ค. ์ตœ๋Œ€๊ฐ’์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ ์ „์— ์–‘์„ฑ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.MaxStam();
    if (Truth(value > 0))
    {
        UO.Print("Stamina percent: " + Convert.ToString(UO.Stamina() * 100 / value));
    }

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

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

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

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

    dynamic ReadValue()
    {
        return UO.MaxStam();
    }

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

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.MaxStam() โ€” UO.MaxStam()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "maxstam": return new InjectionValue(bridge.MaxStamina);
โš ๏ธ **GitHub.com Fallback** โš ๏ธ