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

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

์„ฑ๊ฒฉ โ€” 4

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

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

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

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


UO.MaxStamina

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

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

int UO.MaxStamina();

๋กœ์ปฌ ๋ชจ๋ธ์—์„œ ์ตœ๋Œ€ ๋‚ด๊ตฌ์„ฑ์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

  • ์ด ํ•„๋“œ์— ์ ์šฉ๋œ ์ž„๊ณ„๊ฐ’ ๋˜๋Š” ๊ณ„์‚ฐ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด์˜ ์ˆซ์ž๋Š” ์„œ๋ฒ„ ์ œํ•œ์ด ์•„๋‹Œ ์˜ˆ์‹œ ์„ค์ •์ž…๋‹ˆ๋‹ค. ์ตœ๋Œ€๊ฐ’์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ ์ „์— ์–‘์„ฑ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.MaxStamina();
    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.MaxStamina();
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.MaxStamina() โ€” UO.MaxStamina()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.MaxStamina

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


UO.MaxWeight

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

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

int UO.MaxWeight();

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

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ •ํ™•ํ•œ ์„œ๋ช…์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๊ฒŒ์ž„ ์Šค๋ ˆ๋“œ์—์„œ ์ฝ์œผ๋ฉด Player๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.WeightMax ํ˜„์žฌ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์กด์žฌํ•˜๊ณ  ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0. ์žฅ๋น„๊ฐ€ ์ •๋ ฌ๋˜์ง€ ์•Š๊ณ , ๋ณด๋„ˆ์Šค๊ฐ€ ๋‹ค์‹œ ๊ณ„์‚ฐ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ƒํƒœ๊ฐ€ ์š”์ฒญ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ ๋ น์€ ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • MaxWeight๋Š” WeightMax ์บ์‹œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ƒํƒœ type >= 5๋Š” 0์™€ ๋™์ผํ•˜๋”๋ผ๋„ ์„œ๋ฒ„ ์ œํ•œ์„ โ€‹โ€‹UInt16์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ํ™•์žฅ ์ƒํƒœ๋Š” ์ˆ˜์‹  ์‹œ ์ด๋ฅผ ํ•œ ๋ฒˆ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœํ† ์ฝœ UO >= 5.0.0a - 7 * Floor(Strength / 2) + 40; ์˜ค๋ž˜๋œ ๊ฒƒ์€ ๋ณ€ํ™˜์ž…๋‹ˆ๋‹ค.ToString * 4 + 25. ๊ฒฐ๊ณผ๋Š” UInt16์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๊ทน๋‹จ๊ฐ’์€ ๋ชจ๋“ˆ๋กœ 65536๋กœ ๋ž˜ํ•‘๋ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ToString=101๋Š” ๊ฐ๊ฐ 390 ๋˜๋Š” 429๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Strength๋ฅผ ๋ณ„๋„๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ getter ์ž์ฒด๋Š” ํ•œ๋„๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • 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.MaxWeight();
UO.Print("MaxWeight: " + Convert.ToString(result));

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

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

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

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

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

  • UO.Wait(500)๋Š” 500 ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์ „ํ›„๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ฐจ์ด๋Š” ์–‘์ˆ˜, 0 ๋˜๋Š” ์Œ์ˆ˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ์—…๋ฐ์ดํŠธ ๋ฐ ์บ๋ฆญํ„ฐ ๋ณ€๊ฒฝ์€ ์ƒ๋žต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์‹œ ์ •์ง€๊ฐ€ ๊ทธ ์˜ˆ์ž…๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.MaxWeight();
    await Delay(500);
    var after = UO.MaxWeight();
    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.Weight();
        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.MaxWeight() โ€” UO.MaxWeight()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int MaxWeight() => bridge.MaxWeight;

UO.Mount

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

int UO.Mount();
int UO.Mount(object? mount);

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

Mount์™€ Dismount๋Š” ์ˆ˜๋™ ๋”๋ธ” ํด๋ฆญ์ด๋‚˜ ์ „ํˆฌ ๋ชจ๋“œ ๊ณต๊ฒฉ ์ฒ˜๋ฆฌ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๊ฐœ์ฒด ์‚ฌ์šฉ ์š”์ฒญ์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. int๋Š” Mount ๋ ˆ์ด์–ด์˜ ํ˜„์žฌ ์•„์ดํ…œ serial์ด๋ฉฐ ์„ฑ๊ณต ์—ฌ๋ถ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์‘๋‹ต์€ ๋น„๋™๊ธฐ์ด๋ฏ€๋กœ Mount๊ฐ€ ์•„์ง 0, Dismount๊ฐ€ ์ œ๊ฑฐ ์ „ serial์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‘๋‹ต ํ›„ ObjAtLayer("Mount")๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

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

  • mount โ€” ํƒˆ๊ฒƒ ์‹œ๋ฆฌ์–ผ ๋ฒˆํ˜ธ. ์ƒ๋žตํ•˜๋ฉด ๋งˆ์ง€๋ง‰ ๋Œ€์ƒ.

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

์ฑ„ํŒ… ๋ช…๋ น

#mount 0x00001234
#mount

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

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

1

int mountLayerSerial = UO.Mount(0x00001234);
UO.Print(UO.Int2Hex(mountLayerSerial));

2

int currentSerial = UO.Mount();
UO.Print(UO.Int2Hex(currentSerial));

3

UO.Mount(0x00001234);
for (int attempt = 0; attempt < 40; attempt++)
{
    var serial = UO.ObjAtLayer("Mount");
    if (Convert.ToString(serial) != "0" && Convert.ToString(serial) != "0x00000000")
    {
        UO.Print(Convert.ToString(serial));
        break;
    }
    await WaitAsync(50);
}

4

new CommandSample().Execute(UO);

sealed class CommandSample
{
    public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
    {
        int mountLayerSerial = api.Mount(0x00001234);
        api.Print(api.Int2Hex(mountLayerSerial));
    }
}

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

CSharpGameApi.Mount
  -> CSharpScriptGlobals
  -> InjectionScript.Runtime.InjectionApiUO.Mount
ClassicUOInjectionApiBridge -> NativeMountController.Request
  -> OutgoingPackets.Send_UseObjectRequest (0x06)
  -> MountedLayerSerialUnsafe -> Player.FindItemByLayer(Layer.Mount)

์ถœ์ฒ˜

ClassicUO ยท ServUO BaseMount


UO.ObjAtLayer

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

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

dynamic UO.ObjAtLayer(object? layer);

์ž์‹ ์˜ ์บ๋ฆญํ„ฐ ์žฅ๋น„ ์ค‘ ์ง€์ •๋œ ๋ ˆ์ด์–ด์— ์žˆ๋Š” ์•„์ดํ…œ์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

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

  • layer โ€” ํ•˜๋‚˜์˜ ํ•„์ˆ˜ ์ธ์ˆ˜: ๋ ˆ์ด์–ด ๋ฒˆํ˜ธ 1..29 ๋˜๋Š” ์•„๋ž˜ ๋ชฉ๋ก์˜ ๋ฌธ์ž์—ด ์ด๋ฆ„. ์ˆซ์ž 0 ๋ฐ ์ด๋ฆ„ Invalid๋Š” 0๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์˜ ๋Œ€์†Œ๋ฌธ์ž ๋ฐ ํ›„ํ–‰ ๊ณต๋ฐฑ์€ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ๋ฌธ์ž์—ด ์ด๋ฆ„์œผ๋กœ ์ธํ•ด ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž ๋ฌธ์ž์—ด "1"์€ ์ˆซ์ž 1๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

์ˆซ์ž ํ˜•์‹์€ ํ•ญ๋ชฉ์˜ ๊ฒฝ์šฐ int - serial๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ์œ ํšจํ•˜์ง€ ์•Š์€ ๋ ˆ์ด์–ด์˜ ๊ฒฝ์šฐ 0๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ•ญ๋ชฉ์ด ๋ฐœ๊ฒฌ๋˜๋ฉด ๋ฌธ์ž์—ด ํ˜•์‹์€ "0x40001001" ํ˜•์‹์˜ string๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด int 0๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ ˆ์ด์–ด ๋ฒˆํ˜ธ, graphic/type ๋˜๋Š” ์ˆ˜๋Ÿ‰์ด ์•„๋‹Œ ํ•ญ๋ชฉ์˜ ID์ž…๋‹ˆ๋‹ค. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ object? ๋ฌธ์ž์—ด ํ˜•์‹์€ ๋‘ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ ์œ ํ˜•์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋กœ์ปฌ ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์„ ์ฝ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์— ๋Œ€ํ•œ ์š”์ฒญ๋„ ์—†๊ณ  ๊ธฐ๋‹ค๋ฆฌ๊ฑฐ๋‚˜ ์ด๋™ํ•  ํ•„์š”๋„ ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” ์ฝ๋Š” ์ˆœ๊ฐ„์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. UO.Wait ๋˜๋Š” ๋‹ค๋ฅธ ์ž‘์—… ํ›„์— ๊ฐœ์ฒด์™€ ํ•ด๋‹น ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์žฅ๋น„ ๋ฐ์ดํ„ฐ self๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํŒ€์—์„œ๋Š” ๊ฐ€๋ฐฉ์„ ๊ฐœ๋ด‰ํ•˜๊ฑฐ๋‚˜, ๋ฌผํ’ˆ์„ ์˜ฌ๋ ค ๋†“๊ฑฐ๋‚˜, ๊ฒ€์‚ฌ ์š”์ฒญ์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • 1..29 ์™ธ๋ถ€์˜ ์ˆซ์ž๋Š” ๋ชจ๋“ˆ๋กœ ๋ณ€ํ™˜ ์—†์ด 0 256๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 257๋Š” ์˜ค๋ฅธ์†์„ ์„ ํƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ง€์›๋˜๋Š” ๋ชจ๋“  ์ˆซ์ž ๋ ˆ์ด์–ด ๋ฐ ๋ฌธ์ž์—ด ์ด๋ฆ„:
  • 1 OneHanded/Rhand/RightHand; 2 TwoHanded/Lhand/LeftHand; 3 Shoes; 4 Pants; 5 Shirt; 6 Helmet/Hat; 7 Gloves; 8 Ring; 9 Talisman; 10 Necklace/Neck.
  • 11 Hair; 12 Waist; 13 Torso; 14 Bracelet/Brace; 15 Face; 16 Beard; 17 Tunic; 18 Earrings/Ear; 19 Arms; 20 Cloak.
  • 21 Backpack/Bpack/BackpackLayer; 22 Robe; 23 Skirt; 24 Legs; 25 Mount; 26 ShopBuyRestock/Rstk; 27 ShopBuy/NRstk; 28 ShopSell/Sell; 29 Bank.

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

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

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

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

object? item = UO.ObjAtLayer("Rhand");
if (item is string serial) UO.Print("Equipped serial: " + serial);
else UO.Print("The layer is empty");

1. ๋ ˆ์ด์–ด ์ด๋ฆ„๋ณ„๋กœ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ํ•ญ๋ชฉ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • Rhand๋Š” ๋ ˆ์ด์–ด 1๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๊ณตํ•˜๋ฉด hand๋Š” 16์ง„์ˆ˜ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ์—†๋Š” ๊ฒฝ์šฐ ์ˆซ์ž 0.
  • Convert.ToString๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‘ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ์œ ํ˜•์„ ๋ชจ๋‘ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๋ฌด๊ธฐ์˜ graphic๋กœ ๊ฐ„์ฃผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
object? hand = UO.ObjAtLayer("Rhand");
if (hand is string serial)
{
    UO.Print("Right hand serial: " + serial);
}
else
{
    UO.Print("Right hand is empty 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. ๋ฒˆํ˜ธ ๋ ˆ์ด์–ด ๋ฐ ํ•ญ๋ชฉ ์†์„ฑ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ˆซ์ž 2๋Š” TwoHanded๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด ์–‘์‹์€ ํ•ญ์ƒ int๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • Exists๋Š” ํ•ญ๋ชฉ์˜ ์†์„ฑ์„ ์ฝ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. GetGraphic๋Š” ๋ณ„๋„์˜ type๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var item = UO.ObjAtLayer(2);
    if (Truth(UO.Exists(item)))
    {
        UO.Print("Two-handed layer serial: " + Convert.ToString(item));
        UO.Print("Graphic: " + UO.GetGraphic(item));
    }

    return null;
}

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

3. ๋ฐฐ๋‚ญ์„ ๊ฐ€์ ธ์˜ค๊ณ  ์ž˜๋ชป๋œ ๋ ˆ์ด์–ด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š” - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

     public object? RunScenario()
    {
        var bag = UO.ObjAtLayer(21);
        var invalid = UO.ObjAtLayer(257);
        UO.Print("Backpack serial: " + Convert.ToString(bag));
        UO.Print("Invalid layer: " + Convert.ToString(invalid));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.ObjAtLayer(layer) โ€” UO.ObjAtLayer(Any)

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

๊ฒฐ๊ณผ: dynamic / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "objatlayer":

                    return new InjectionValue(arguments[0].Kind == InjectionValueKind.String

                        ? GetObject(ObjAtLayer(Text(0))) : bridge.ObjAtLayer(Arg(0)));

UO.ObjAtLayer(layer) โ€” UO.ObjAtLayer(String)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

public InjectionValue ObjAtLayer(string layer)

        {

            var id = bridge.ObjAtLayer(ConvertLayer(layer));

            if (id == 0)

                return InjectionValue.Zero;



            return new InjectionValue("0x" + id.ToString("X8"));

        }

UO.ObjAtLayerEx

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

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

int UO.ObjAtLayerEx(object? layerType, object? playerID);

์ง€์ •๋œ ๋กœ๋“œ๋œ ์บ๋ฆญํ„ฐ์— ๋Œ€ํ•ด ์ง€์ •๋œ ๋ ˆ์ด์–ด์˜ ํ•ญ๋ชฉ/์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • layerType โ€” ๋ ˆ์ด์–ด์˜ ์ˆซ์ž ๋ฒˆํ˜ธ 1..29. 26 ๋˜๋Š” "0x1A"์™€ ๊ฐ™์€ ์ •์ˆ˜ ๋˜๋Š” ์ˆซ์ž ๋ฌธ์ž์—ด์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ์ด๋ฆ„ Rhand/ShopBuyRestock ๋ฐ ๋ฒ ์–ด ๋ ˆ์ด์–ด ์ƒ์ˆ˜๋Š” ์—ฌ๊ธฐ์„œ ์ˆซ์ž๋กœ ๋ณ€ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • playerID โ€” ๋ฌธ์ž ์ผ๋ จ/mobile, ์ˆซ์ž, 16์ง„์ˆ˜ ๋ฌธ์ž์—ด ๋˜๋Š” "self"/"lasttarget"์™€ ๊ฐ™์€ ํ™•์ธ ๊ฐ€๋Šฅํ•œ ๊ฐœ์ฒด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์•„์ดํ…œ์˜ ๊ทธ๋ž˜ํ”ฝ/type ๋˜๋Š” ์šฉ๊ธฐ ์ž์ฒด์˜ ID๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int: ๋ ˆ์ด์–ด์— ์žˆ๋Š” ํ•ญ๋ชฉ/์ปจํ…Œ์ด๋„ˆ์˜ serial ๋˜๋Š” 0 ๋ ˆ์ด์–ด๊ฐ€ ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋ฒˆํ˜ธ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋กœ๋“œ๋œ ๋ชจ๋ฐ”์ผ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” bool ๋˜๋Š” ๋ ˆ์ด์–ด ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ฝ๊ธฐ๋Š” ๋Œ€์ƒ, ๊ตฌ๋งค, ์ปจํ…Œ์ด๋„ˆ ๊ฐœ๋ด‰ ๋ฐ ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์—†์ด ๋กœ์ปฌ์ž…๋‹ˆ๋‹ค.
  • 1..29 ๋ฒ”์œ„๊ฐ€ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. ๋ถ€์ ์ ˆํ•œ ๋ฌธ์ž์—ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณ€ํ™˜ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆซ์ž ๋Œ€์‹  ์ž„์˜์˜ ๋ ˆ์ด์–ด ์ด๋ฆ„์„ ์ „๋‹ฌํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฌธ์ž์—ด ๋ ˆ์ด์–ด ์ด๋ฆ„์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๋ฌธ์ž์—๋Š” ๋ณ„๋„์˜ UO.ObjAtLayer์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ ˆ์ด์–ด๋ฅผ ์ •์  ์ธ๋ฑ์Šค ๋˜๋Š” ๊ฒ€ํ”„ ์ขŒํ‘œ์ธ world Z์™€ ํ˜ผ๋™ํ•˜์ง€ ๋งˆ์„ธ์š”.

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

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

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

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

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

var result = UO.ObjAtLayerEx(26, UO.GetSerial("lasttarget"));
UO.Print("ObjAtLayerEx: " + Convert.ToString(result));

1. ์Šคํ† ์–ด ์ปจํ…Œ์ด๋„ˆ ์ˆ˜์‹  ๋ฐ ์ œํ’ˆ ๋‚˜์—ด - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • LayerType=26; ํ”Œ๋ ˆ์ด์–ดID=๊ณต๊ธ‰์—…์ฒด; ์ƒ์  โ€” serial ์ปจํ…Œ์ด๋„ˆ. GetContent์˜ ๊ฒฝ์šฐ ๋ ˆ์ด์–ด ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹Œ ์ƒ์ ์ด ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด์€ 0๋ถ€ํ„ฐ ๊ธธ์ด์—์„œ 1๋ฅผ ๋บ€ ๊ธธ์ด๊นŒ์ง€ ์ธ๋ฑ์‹ฑ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์š”์†Œ๋Š” serial์ž…๋‹ˆ๋‹ค. ๋นˆ ๋ฐฐ์—ด์€ ๋กœ๋“œ๋œ ์ง์ ‘ ์š”์†Œ๊ฐ€ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๋งค๊ฐ€ ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
var vendor = UO.GetSerial("lasttarget");
if (Truth(vendor == "0x00000000"))
{
    UO.Print("Vendor not selected");
    return null;
}
var shop = UO.ObjAtLayerEx(26, vendor);
if (Truth(shop == 0))
{
    UO.Print("ShopBuyRestock container is not loaded");
    return null;
}
UO.Print("Shop container ID: " + Convert.ToString(shop));
var items = UO.GetContent(shop);
var i = 0;
while (Truth(i < ArrayLength(items)))
{
    var item = items[i];
    UO.Print(UO.GetName(item) + " | ID: " + Convert.ToString(item));
    UO.Print("Graphic: " + Convert.ToString(UO.GetType(item)));
    i = i + 1;
}
UO.Print("Loaded entries: " + Convert.ToString(ArrayLength(items)));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. ์›ํ•˜๋Š” graphic ์ƒํ’ˆ์„ ์„ ํƒํ•˜๊ณ  ์ˆ˜๋Ÿ‰๊ณ„์‚ฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • wantedType๋Š” graphic์ด๊ณ , ์•„์ดํ…œ์€ ๊ฐœ๋ณ„ ์•„์ดํ…œ์˜ ID์ž…๋‹ˆ๋‹ค. ์Šคํƒ์€ ๋ ˆ์ฝ”๋“œ/์Šคํƒ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์œ„๋Š” ์ˆซ์ž๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋Š” ํ–ฅํ›„ ๊ตฌ๋งค ์‹œ ๋ณด์žฅ๋˜๋Š” ์ž”์•ก์ด ์•„๋‹ˆ๋ผ ์ด๋ฏธ ๋ฐ›์€ ์ˆ˜๋Ÿ‰์„ ์ฝ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์ง€์ •๋œ ๊ฐ€๊ฒฉ์ด ์—†์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var vendor = UO.GetSerial("lasttarget");
    if (Truth(vendor == "0x00000000"))
    {
        UO.Print("Vendor not selected");
        return null;
    }

    var shop = UO.ObjAtLayerEx(26, vendor);
    if (Truth(shop == 0))
    {
        UO.Print("Shop layer is not loaded");
        return null;
    }

    var wantedType = 0x1766;
    var stacks = 0;
    var units = 0;
    var items = UO.GetContent(shop);
    var i = 0;
    while (Truth(i < ArrayLength(items)))
    {
        var item = items[i];
        if (Truth(UO.GetType(item) == wantedType))
        {
            stacks = stacks + 1;
            units = units + UO.GetQuantity(item);
        }

        i = i + 1;
    }

    UO.Print("Stacks: " + Convert.ToString(stacks) + " | Units: " + Convert.ToString(units));
    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. ์ „์ฒด ์ ˆ์ฐจ๋ฅผ ํ†ตํ•ด 3๊ฐœ์˜ ์Šคํ† ์–ด ๋ ˆ์ด์–ด ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

     public object? RunScenario()
    {
        var vendor = UO.GetSerial("lasttarget");
        if (Truth(vendor == "0x00000000"))
        {
            UO.Print("Vendor not selected");
            return null;
        }

        ShowVendorLayer(vendor, 26, "ShopBuyRestock / Rstk");
        ShowVendorLayer(vendor, 27, "ShopBuy / NRstk");
        ShowVendorLayer(vendor, 28, "ShopSell / Sell");
        return null;
    }

    void ShowVendorLayer(dynamic vendor, dynamic layerNumber, dynamic caption)
    {
        var container = UO.ObjAtLayerEx(layerNumber, vendor);
        if (Truth(container == 0))
        {
            UO.Print(caption + ": not loaded");
            return;
        }

        var items = UO.GetContent(container);
        UO.Print(caption + " | Container ID: " + Convert.ToString(container));
        UO.Print("Loaded entries: " + Convert.ToString(ArrayLength(items)));
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.ObjAtLayerEx(layerType, playerID) โ€” UO.ObjAtLayerEx(Any,Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "objatlayerex": return new InjectionValue(bridge.ObjAtLayerEx(Arg(0), Arg(1)));

UO.Paralyzed

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

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

int UO.Paralyzed();
int UO.Paralyzed(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.Paralyzed();
UO.Print("Paralyzed: " + Convert.ToString(result));

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

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

  • ๋นˆ ๊ด„ํ˜ธ๋Š” self๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ๋Š” ํ”Œ๋ž˜๊ทธ์˜ ํ•˜๋‚˜์˜ ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. true์€ ์ˆ˜์น˜์ƒ์ˆ˜ 1์ž…๋‹ˆ๋‹ค.
  • false ๊ฒฐ๊ณผ๋Š” ๋ฒฝ, ์ฒด๋ ฅ ๋ถ€์กฑ ๋˜๋Š” ๊ธฐํƒ€ ์ •์ง€ ์ด์œ ๋ฅผ ๋ฐฐ์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var state = UO.Paralyzed();
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.Paralyzed(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.Paralyzed()) == true) && Truth(attempts < 10))
        {
            await Delay(100);
            attempts = attempts + 1;
        }

        if (Truth(UO.IsNPC("self")))
        {
            if (Truth(Truth(UO.Paralyzed()) == 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.Paralyzed() โ€” UO.Paralyzed()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "paralyzed": return new InjectionValue(bridge.GetLocked(bridge.Self));

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

serial => bridge.GetLocked(serial)

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

value => getter(GetObject(value))

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


UO.PhysicalResist

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

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

int UO.PhysicalResist();

ํ˜„์žฌ ์บ๋ฆญํ„ฐ์˜ ์ €ํ•ญ ํ•„๋“œ(๋ฌผ๋ฆฌ ๋ฐฉ์–ด๊ตฌ/์ €ํ•ญ)๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int๋Š” ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์˜ ์„œ๋ช…๋œ ์ƒํƒœ ๊ฐ’, -32768..32767์ž…๋‹ˆ๋‹ค. ์Œ์ˆ˜ ๊ฐ’์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. 0๋Š” ์‹ค์ œ ์ €ํ•ญ, ๋ฐ์ดํ„ฐ ๋ถ€์กฑ ๋˜๋Š” ํ”Œ๋ ˆ์ด์–ด ๋ˆ„๋ฝ/ํŒŒ๊ดด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GetResist๋Š” ์•Œ ์ˆ˜ ์—†๋Š” ์„ ํƒ๊ธฐ์— ๋Œ€ํ•ด 0๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. bool, ID, ์Šคํ‚ฌ ํ•œ๊ณ„๋‚˜ ์ €ํ•ญ ํ•œ๊ณ„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. 1๋Š” ์„ฑ๊ณต์ด ์•„๋‹Œ 1์ ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

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

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

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

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

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

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

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

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

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

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

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

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

  • ์ „ํ›„ ์‚ฌ์ด์—๋Š” UO.Wait(500) ๋ฐ€๋ฆฌ์ดˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐจ์ด๋Š” ์Œ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ˆ„๋ฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์‹œ ์ •์ง€๋Š” ์ง€์—ฐ API์ด ์•„๋‹Œ ์˜ˆ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.PhysicalResist();
    await Delay(500);
    var after = UO.PhysicalResist();
    var difference = after - before;
    UO.Print("Resistance change: " + Convert.ToString(difference));
    return null;
}

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

3. ์ตœ์†Œ ์ €ํ•ญ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ ์™„๋ฃŒ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ตœ์†Œ=50๋Š” ํด๋ผ์ด์–ธํŠธ ์ œํ•œ์ด ์•„๋‹Œ ์š”๊ตฌ ์‚ฌํ•ญ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. ResistanceAtLeast๋Š” ๋ˆ„๋ฝ๋œ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  ํ•˜๋‚˜์˜ ๊ฐ’์„ ์ฝ๊ณ  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(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

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

        var value = UO.PhysicalResist();
        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.PhysicalResist() โ€” UO.PhysicalResist()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.Armor

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


UO.Poison

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

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

void UO.Poison();
void UO.Poison(object? target);

ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํŠน์ • ๋Œ€์ƒ์—๊ฒŒ ์ค‘๋… ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

  • target - ์„ ํƒ ์‚ฌํ•ญ serial/๋Œ€์ƒ ๋ณ„์นญ. ์ธ์ˆ˜ ์—†์Œ - UseSkill("์ค‘๋…")๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜ ์‚ฌ์šฉ - UseSkillAtTarget("์ค‘๋…", ๋Œ€์ƒ).

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํŠน์ • ๋Œ€์ƒ์—๊ฒŒ ์ค‘๋… ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
UO.Poison();

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

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

  • ๋“ฑ๋ก๋œ ๋ ˆ๊ฑฐ์‹œ ๋ช…๋ น์–ด๋Š” ๋… ์ €ํ•ญ์ด๋‚˜ ๋… ์ƒํƒœ์— ๋Œ€ํ•œ ๊ฒŒํ„ฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐ€์ง€๋Š” ์Šคํ‚ฌ์„ ์†Œํ™˜ํ•˜๊ณ  1/0 ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("lasttarget")))
    {
        UO.Poison("lasttarget");
    }

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

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

  • ๋Œ€์ƒ์ด ์žˆ๋Š” ํ˜•ํƒœ์—์„œ UseSkillAtTarget๋Š” ๊ธ์ •์ ์ธ 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 id = UO.GetSerial("lasttarget");
        if (Truth(UO.Exists(id)))
        {
            UO.Poison(id);
            UO.Print(UO.Waiting());
        }

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "poison":

                    if (arguments.Length > 0) UseSkillAtTarget(new InjectionValue("Poisoning"), arguments[0]);

                    else UseSkill("Poisoning");

                    break;

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "poison":

                    if (arguments.Length > 0) UseSkillAtTarget(new InjectionValue("Poisoning"), arguments[0]);

                    else UseSkill("Poisoning");

                    break;

UO.PoisonResist

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

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

int UO.PoisonResist();

ํ˜„์žฌ ์บ๋ฆญํ„ฐ์˜ ์ €ํ•ญ ํ•„๋“œ์ธ ๋…์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int๋Š” ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์˜ ์„œ๋ช…๋œ ์ƒํƒœ ๊ฐ’, -32768..32767์ž…๋‹ˆ๋‹ค. ์Œ์ˆ˜ ๊ฐ’์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. 0๋Š” ์‹ค์ œ ์ €ํ•ญ, ๋ฐ์ดํ„ฐ ๋ถ€์กฑ ๋˜๋Š” ํ”Œ๋ ˆ์ด์–ด ๋ˆ„๋ฝ/ํŒŒ๊ดด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GetResist๋Š” ์•Œ ์ˆ˜ ์—†๋Š” ์„ ํƒ๊ธฐ์— ๋Œ€ํ•ด 0๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. bool, ID, ์Šคํ‚ฌ ํ•œ๊ณ„๋‚˜ ์ €ํ•ญ ํ•œ๊ณ„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. 1๋Š” ์„ฑ๊ณต์ด ์•„๋‹Œ 1์ ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ •ํ™•ํ•œ ์„œ๋ช…์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๊ฒŒ์ž„ ์Šค๋ ˆ๋“œ์—์„œ ์ฝ์œผ๋ฉด Player๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.PoisonResistance ํ˜„์žฌ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์กด์žฌํ•˜๊ณ  ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0. ์žฅ๋น„๊ฐ€ ์ •๋ ฌ๋˜์ง€ ์•Š๊ณ , ๋ณด๋„ˆ์Šค๊ฐ€ ๋‹ค์‹œ ๊ณ„์‚ฐ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ƒํƒœ๊ฐ€ ์š”์ฒญ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ ๋ น์€ ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์š”์†Œ ํ•„๋“œ๋Š” ํ™•์žฅ๋œ CharacterStatus (0x11), type >= 4๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๋ช…๋ น ์ž์ฒด๋Š” ์„œ๋ฒ„ ์‹œ๋Œ€๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ•„๋“œ๊ฐ€ ์—†๋Š” ์••์ถ•/์ด์ „ ์ƒํƒœ๋Š” ์ด์ „ ์บ์‹œ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ํ”Œ๋ ˆ์ด์–ด๋Š” ์ฒ˜์Œ์—๋Š” 0์ž…๋‹ˆ๋‹ค. ๋… ์ €ํ•ญ์€ Poisoned ํ”Œ๋ž˜๊ทธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฃผ๋ฌธ ์ €ํ•ญ ์Šคํ‚ฌ๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • CharacterStatus๋Š” ์ด๋ฆ„, ์ฒด๋ ฅ, ์ž์‹ ์˜ ํŠน์„ฑ์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ์‹ ์ฒด๋ฅผ ํ™•์ธํ•œ ๋‹ค์Œ ๊ฐ ์ €ํ•ญ ๋‹จ์–ด๋ฅผ ์„œ๋ช…๋œ Int16์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ž˜๋ฆฐ ํ•„์ˆ˜ ๋ณธ๋ฌธ์€ ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ ํƒ์  ๊ผฌ๋ฆฌ type 6๋Š” ๋™์ผํ•œ ๊ทœ์น™์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ €ํ•ญ ๋ช…๋ น์€ ์ตœ๋Œ€ ํ•œ๊ณ„๋ฅผ ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ๋Š” ๋‹ค๋ฅธ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๊ฒฐ๊ณผ๋Š” ์—ฐ๊ฒฐ์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0์€ ๊ฐ’์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

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

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

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

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

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

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

  • ์ „ํ›„ ์‚ฌ์ด์—๋Š” UO.Wait(500) ๋ฐ€๋ฆฌ์ดˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐจ์ด๋Š” ์Œ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ˆ„๋ฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์‹œ ์ •์ง€๋Š” ์ง€์—ฐ API์ด ์•„๋‹Œ ์˜ˆ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.PoisonResist();
    await Delay(500);
    var after = UO.PoisonResist();
    var difference = after - before;
    UO.Print("Resistance change: " + Convert.ToString(difference));
    return null;
}

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

3. ์ตœ์†Œ ์ €ํ•ญ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ ์™„๋ฃŒ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ตœ์†Œ=50๋Š” ํด๋ผ์ด์–ธํŠธ ์ œํ•œ์ด ์•„๋‹Œ ์š”๊ตฌ ์‚ฌํ•ญ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. ResistanceAtLeast๋Š” ๋ˆ„๋ฝ๋œ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  ํ•˜๋‚˜์˜ ๊ฐ’์„ ์ฝ๊ณ  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(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

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

        var value = UO.PoisonResist();
        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.PoisonResist() โ€” UO.PoisonResist()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "poisonresist": return new InjectionValue(bridge.PoisonResistance);

UO.Poisoned

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

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

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

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

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

  • id โ€” ํ‘œ์‹œ๋œ ํ˜•์‹์˜ ์„ ํƒ์  ๊ฐœ์ฒด: 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.Poisoned();
UO.Print("Poisoned: " + Convert.ToString(result));

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

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

  • ๋นˆ ๊ด„ํ˜ธ๋Š” self๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. active๋Š” ๊ฒฐ๊ณผ๋ฅผ ํ•œ ๋ฒˆ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. true ๋ฐ false๋Š” ๋‘ ๊ฐœ์˜ ๋ถ„๊ธฐ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. Print ์˜ˆ์‹œ ๋ฉ”์‹œ์ง€๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
var active = UO.Poisoned();
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.Poisoned(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.Poisoned();
        await Delay(500);
        var after = UO.Poisoned();
        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.Poisoned() โ€” UO.Poisoned()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int Poisoned() => bridge.Poisoned(bridge.Self);

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

UO.Race

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

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

dynamic UO.Race();

ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์—์„œ ์บ๋ฆญํ„ฐ์˜ ์ธ์ข…์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int โ€” 1=์ธ๊ฐ„, 2=์š”์ •, 3=๊ฐ€๊ณ ์ผ(ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์— ๋”ฐ๋ฆ„). 0๋Š” ๋กœ๋“œ๋œ ๋ฌธ์ž๊ฐ€ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. body/graphic๋„ ์•„๋‹ˆ๊ณ  serial๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

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

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

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

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

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

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

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

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

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

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

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

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

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

    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.Race();
        await Delay(1000);
        var after = UO.Race();
        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.Race() โ€” UO.Race()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "race": return new InjectionValue(bridge.Race);

UO.RemoveEarrings

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

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

void UO.RemoveEarrings();

Ear ๋ ˆ์ด์–ด์—์„œ ํ•ญ๋ชฉ ์ œ๊ฑฐ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ExecuteLegacyManualAlias๊ฐ€ Unequip("๊ท€")๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ConvertLayer ์ˆซ์ž ๋ ˆ์ด์–ด์ธ ๋ธŒ๋ฆฌ์ง€๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Unequip ๋ฐฐ๋‚ญ์œผ๋กœ ์ด๋™์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
  • ๋ ˆ๊ฑฐ์‹œ ๋ช…๋ น์˜ ๋‚ด๋ถ€ Unequip(1/0) ๊ฒฐ๊ณผ๋Š” ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. ์•„์ดํ…œ/๋ฐฐ๋‚ญ์ด ์—†์„ ๊ฒฝ์šฐ ์š”์ฒญ์ด ์‹คํ–‰๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœ ํ›„ ObjAtLayer ๊ฒ€์‚ฌ๋Š” ๋กœ์ปฌ ์ƒํƒœ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • Ear ๋ ˆ์ด์–ด์—์„œ ํ•ญ๋ชฉ ์ œ๊ฑฐ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
UO.RemoveEarrings();

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

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

  • ExecuteLegacyManualAlias๊ฐ€ Unequip("๊ท€")๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ConvertLayer ์ˆซ์ž ๋ ˆ์ด์–ด์ธ ๋ธŒ๋ฆฌ์ง€๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Unequip ๋ฐฐ๋‚ญ์œผ๋กœ ์ด๋™์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.ObjAtLayer("Ear"));
    UO.RemoveEarrings();
    return null;
}

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

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

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

     public object? RunScenario()
    {
        UO.RemoveEarrings();
        UO.Wait(500);
        UO.Print(UO.ObjAtLayer("Ear"));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.RemoveEarrings() โ€” UO.RemoveEarrings()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "removeearrings": Unequip("Ear"); break;

UO.RemoveHat

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

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

void UO.RemoveHat();

๋ชจ์ž ๋ ˆ์ด์–ด์—์„œ ํ•ญ๋ชฉ ์ œ๊ฑฐ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ExecuteLegacyManualAlias๊ฐ€ Unequip("๋ชจ์ž")๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ConvertLayer ์ˆซ์ž ๋ ˆ์ด์–ด์ธ ๋ธŒ๋ฆฌ์ง€๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Unequip ๋ฐฐ๋‚ญ์œผ๋กœ ์ด๋™์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
  • ๋ ˆ๊ฑฐ์‹œ ๋ช…๋ น์˜ ๋‚ด๋ถ€ Unequip(1/0) ๊ฒฐ๊ณผ๋Š” ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. ์•„์ดํ…œ/๋ฐฐ๋‚ญ์ด ์—†์„ ๊ฒฝ์šฐ ์š”์ฒญ์ด ์‹คํ–‰๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœ ํ›„ ObjAtLayer ๊ฒ€์‚ฌ๋Š” ๋กœ์ปฌ ์ƒํƒœ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ๋ชจ์ž ๋ ˆ์ด์–ด์—์„œ ํ•ญ๋ชฉ ์ œ๊ฑฐ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
UO.RemoveHat();

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

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

  • ExecuteLegacyManualAlias๊ฐ€ Unequip("๋ชจ์ž")๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ConvertLayer ์ˆซ์ž ๋ ˆ์ด์–ด์ธ ๋ธŒ๋ฆฌ์ง€๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Unequip ๋ฐฐ๋‚ญ์œผ๋กœ ์ด๋™์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.ObjAtLayer("Hat"));
    UO.RemoveHat();
    return null;
}

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

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

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

     public object? RunScenario()
    {
        UO.RemoveHat();
        UO.Wait(500);
        UO.Print(UO.ObjAtLayer("Hat"));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.RemoveHat() โ€” UO.RemoveHat()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "removehat": Unequip("Hat"); break;

UO.RemoveNeckless

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

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

void UO.RemoveNeckless();

Neck ๋ ˆ์ด์–ด์—์„œ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•˜๋„๋ก ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ExecuteLegacyManualAlias๋Š” Unequip("๋ชฉ")์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ConvertLayer ์ˆซ์ž ๋ ˆ์ด์–ด์ธ ๋ธŒ๋ฆฌ์ง€๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Unequip ๋ฐฐ๋‚ญ์œผ๋กœ ์ด๋™์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
  • ๋ ˆ๊ฑฐ์‹œ ๋ช…๋ น์˜ ๋‚ด๋ถ€ Unequip(1/0) ๊ฒฐ๊ณผ๋Š” ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. ์•„์ดํ…œ/๋ฐฐ๋‚ญ์ด ์—†์„ ๊ฒฝ์šฐ ์š”์ฒญ์ด ์‹คํ–‰๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœ ํ›„ ObjAtLayer ๊ฒ€์‚ฌ๋Š” ๋กœ์ปฌ ์ƒํƒœ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • Neck ๋ ˆ์ด์–ด์—์„œ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•˜๋„๋ก ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
UO.RemoveNeckless();

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

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

  • ExecuteLegacyManualAlias๋Š” Unequip("๋ชฉ")์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ConvertLayer ์ˆซ์ž ๋ ˆ์ด์–ด์ธ ๋ธŒ๋ฆฌ์ง€๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Unequip ๋ฐฐ๋‚ญ์œผ๋กœ ์ด๋™์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.ObjAtLayer("Neck"));
    UO.RemoveNeckless();
    return null;
}

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

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

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

     public object? RunScenario()
    {
        UO.RemoveNeckless();
        UO.Wait(500);
        UO.Print(UO.ObjAtLayer("Neck"));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.RemoveNeckless() โ€” UO.RemoveNeckless()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "removeneckless": Unequip("Neck"); break;

UO.RemoveRing

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

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

void UO.RemoveRing();

๋ง ๋ ˆ์ด์–ด์—์„œ ํ•ญ๋ชฉ ์ œ๊ฑฐ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ExecuteLegacyManualAlias๊ฐ€ Unequip("๋ฒจ์†Œ๋ฆฌ")๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ConvertLayer ์ˆซ์ž ๋ ˆ์ด์–ด์ธ ๋ธŒ๋ฆฌ์ง€๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Unequip ๋ฐฐ๋‚ญ์œผ๋กœ ์ด๋™์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
  • ๋ ˆ๊ฑฐ์‹œ ๋ช…๋ น์˜ ๋‚ด๋ถ€ Unequip(1/0) ๊ฒฐ๊ณผ๋Š” ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. ์•„์ดํ…œ/๋ฐฐ๋‚ญ์ด ์—†์„ ๊ฒฝ์šฐ ์š”์ฒญ์ด ์‹คํ–‰๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœ ํ›„ ObjAtLayer ๊ฒ€์‚ฌ๋Š” ๋กœ์ปฌ ์ƒํƒœ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ๋ง ๋ ˆ์ด์–ด์—์„œ ํ•ญ๋ชฉ ์ œ๊ฑฐ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
UO.RemoveRing();

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

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

  • ExecuteLegacyManualAlias๊ฐ€ Unequip("๋ฒจ์†Œ๋ฆฌ")๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ConvertLayer ์ˆซ์ž ๋ ˆ์ด์–ด์ธ ๋ธŒ๋ฆฌ์ง€๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Unequip ๋ฐฐ๋‚ญ์œผ๋กœ ์ด๋™์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.ObjAtLayer("Ring"));
    UO.RemoveRing();
    return null;
}

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

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

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

     public object? RunScenario()
    {
        UO.RemoveRing();
        UO.Wait(500);
        UO.Print(UO.ObjAtLayer("Ring"));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.RemoveRing() โ€” UO.RemoveRing()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "removering": Unequip("Ring"); break;

UO.RequestStats

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

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

void UO.RequestStats(object? objID);

serial๋กœ ์บ๋ฆญํ„ฐ์˜ ์ƒํƒœ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • RequestStats๋Š” RequestMobileStatus(_world, serial, true)์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ์€ ํŠน์„ฑ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. GetHP/GetStr ๋‹ค์Œ์— ๋กœ์ปฌ ๋ชจ๋ธ์„ ์ฝ์Šต๋‹ˆ๋‹ค.
  • Bridge๋Š” ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‚ด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • serial๋กœ ์บ๋ฆญํ„ฐ์˜ ์ƒํƒœ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
    UO.RequestStats(id);
}

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

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

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

  • RequestStats๋Š” RequestMobileStatus(_world, serial, true)์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ์€ ํŠน์„ฑ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. GetHP/GetStr ๋‹ค์Œ์— ๋กœ์ปฌ ๋ชจ๋ธ์„ ์ฝ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("self");
    if (Truth(UO.Exists(id)))
    {
        UO.RequestStats(id);
    }

    return null;
}

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

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

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

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

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

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

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

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "requeststats": bridge.RequestStats(Arg(0)); return InjectionValue.Unit;

UO.ResistCold

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

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

int UO.ResistCold();

ํ˜„์žฌ ์บ๋ฆญํ„ฐ์˜ ์ €ํ•ญ ํ•„๋“œ: ์ฝœ๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int๋Š” ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์˜ ์„œ๋ช…๋œ ์ƒํƒœ ๊ฐ’, -32768..32767์ž…๋‹ˆ๋‹ค. ์Œ์ˆ˜ ๊ฐ’์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. 0๋Š” ์‹ค์ œ ์ €ํ•ญ, ๋ฐ์ดํ„ฐ ๋ถ€์กฑ ๋˜๋Š” ํ”Œ๋ ˆ์ด์–ด ๋ˆ„๋ฝ/ํŒŒ๊ดด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GetResist๋Š” ์•Œ ์ˆ˜ ์—†๋Š” ์„ ํƒ๊ธฐ์— ๋Œ€ํ•ด 0๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. bool, ID, ์Šคํ‚ฌ ํ•œ๊ณ„๋‚˜ ์ €ํ•ญ ํ•œ๊ณ„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. 1๋Š” ์„ฑ๊ณต์ด ์•„๋‹Œ 1์ ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ •ํ™•ํ•œ ์„œ๋ช…์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๊ฒŒ์ž„ ์Šค๋ ˆ๋“œ์—์„œ ์ฝ์œผ๋ฉด Player๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.ColdResistance ํ˜„์žฌ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์กด์žฌํ•˜๊ณ  ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0. ์žฅ๋น„๊ฐ€ ์ •๋ ฌ๋˜์ง€ ์•Š๊ณ , ๋ณด๋„ˆ์Šค๊ฐ€ ๋‹ค์‹œ ๊ณ„์‚ฐ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ƒํƒœ๊ฐ€ ์š”์ฒญ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ ๋ น์€ ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์š”์†Œ ํ•„๋“œ๋Š” ํ™•์žฅ๋œ CharacterStatus (0x11), type >= 4๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๋ช…๋ น ์ž์ฒด๋Š” ์„œ๋ฒ„ ์‹œ๋Œ€๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ•„๋“œ๊ฐ€ ์—†๋Š” ์••์ถ•/์ด์ „ ์ƒํƒœ๋Š” ์ด์ „ ์บ์‹œ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ํ”Œ๋ ˆ์ด์–ด๋Š” ์ฒ˜์Œ์—๋Š” 0์ž…๋‹ˆ๋‹ค. ๋… ์ €ํ•ญ์€ Poisoned ํ”Œ๋ž˜๊ทธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฃผ๋ฌธ ์ €ํ•ญ ์Šคํ‚ฌ๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • CharacterStatus๋Š” ์ด๋ฆ„, ์ฒด๋ ฅ, ์ž์‹ ์˜ ํŠน์„ฑ์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ์‹ ์ฒด๋ฅผ ํ™•์ธํ•œ ๋‹ค์Œ ๊ฐ ์ €ํ•ญ ๋‹จ์–ด๋ฅผ ์„œ๋ช…๋œ Int16์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ž˜๋ฆฐ ํ•„์ˆ˜ ๋ณธ๋ฌธ์€ ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ ํƒ์  ๊ผฌ๋ฆฌ type 6๋Š” ๋™์ผํ•œ ๊ทœ์น™์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ €ํ•ญ ๋ช…๋ น์€ ์ตœ๋Œ€ ํ•œ๊ณ„๋ฅผ ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ๋Š” ๋‹ค๋ฅธ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๊ฒฐ๊ณผ๋Š” ์—ฐ๊ฒฐ์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0์€ ๊ฐ’์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

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

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

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

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

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

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

  • ์ „ํ›„ ์‚ฌ์ด์—๋Š” UO.Wait(500) ๋ฐ€๋ฆฌ์ดˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐจ์ด๋Š” ์Œ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ˆ„๋ฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์‹œ ์ •์ง€๋Š” ์ง€์—ฐ API์ด ์•„๋‹Œ ์˜ˆ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.ResistCold();
    await Delay(500);
    var after = UO.ResistCold();
    var difference = after - before;
    UO.Print("Resistance change: " + Convert.ToString(difference));
    return null;
}

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

3. ์ตœ์†Œ ์ €ํ•ญ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ ์™„๋ฃŒ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ตœ์†Œ=50๋Š” ํด๋ผ์ด์–ธํŠธ ์ œํ•œ์ด ์•„๋‹Œ ์š”๊ตฌ ์‚ฌํ•ญ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. ResistanceAtLeast๋Š” ๋ˆ„๋ฝ๋œ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  ํ•˜๋‚˜์˜ ๊ฐ’์„ ์ฝ๊ณ  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(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

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

        var value = UO.ResistCold();
        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.ResistCold() โ€” UO.ResistCold()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.ColdResistance

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


UO.ResistEnergy

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

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

int UO.ResistEnergy();

ํ˜„์žฌ ์บ๋ฆญํ„ฐ์˜ ์ €ํ•ญ์žฅ์ธ ์—๋„ˆ์ง€๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int๋Š” ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์˜ ์„œ๋ช…๋œ ์ƒํƒœ ๊ฐ’, -32768..32767์ž…๋‹ˆ๋‹ค. ์Œ์ˆ˜ ๊ฐ’์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. 0๋Š” ์‹ค์ œ ์ €ํ•ญ, ๋ฐ์ดํ„ฐ ๋ถ€์กฑ ๋˜๋Š” ํ”Œ๋ ˆ์ด์–ด ๋ˆ„๋ฝ/ํŒŒ๊ดด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GetResist๋Š” ์•Œ ์ˆ˜ ์—†๋Š” ์„ ํƒ๊ธฐ์— ๋Œ€ํ•ด 0๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. bool, ID, ์Šคํ‚ฌ ํ•œ๊ณ„๋‚˜ ์ €ํ•ญ ํ•œ๊ณ„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. 1๋Š” ์„ฑ๊ณต์ด ์•„๋‹Œ 1์ ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ •ํ™•ํ•œ ์„œ๋ช…์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๊ฒŒ์ž„ ์Šค๋ ˆ๋“œ์—์„œ ์ฝ์œผ๋ฉด Player๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.EnergyResistance ํ˜„์žฌ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์กด์žฌํ•˜๊ณ  ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0. ์žฅ๋น„๊ฐ€ ์ •๋ ฌ๋˜์ง€ ์•Š๊ณ , ๋ณด๋„ˆ์Šค๊ฐ€ ๋‹ค์‹œ ๊ณ„์‚ฐ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ƒํƒœ๊ฐ€ ์š”์ฒญ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ ๋ น์€ ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์š”์†Œ ํ•„๋“œ๋Š” ํ™•์žฅ๋œ CharacterStatus (0x11), type >= 4๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๋ช…๋ น ์ž์ฒด๋Š” ์„œ๋ฒ„ ์‹œ๋Œ€๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ•„๋“œ๊ฐ€ ์—†๋Š” ์••์ถ•/์ด์ „ ์ƒํƒœ๋Š” ์ด์ „ ์บ์‹œ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ํ”Œ๋ ˆ์ด์–ด๋Š” ์ฒ˜์Œ์—๋Š” 0์ž…๋‹ˆ๋‹ค. ๋… ์ €ํ•ญ์€ Poisoned ํ”Œ๋ž˜๊ทธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฃผ๋ฌธ ์ €ํ•ญ ์Šคํ‚ฌ๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • CharacterStatus๋Š” ์ด๋ฆ„, ์ฒด๋ ฅ, ์ž์‹ ์˜ ํŠน์„ฑ์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ์‹ ์ฒด๋ฅผ ํ™•์ธํ•œ ๋‹ค์Œ ๊ฐ ์ €ํ•ญ ๋‹จ์–ด๋ฅผ ์„œ๋ช…๋œ Int16์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ž˜๋ฆฐ ํ•„์ˆ˜ ๋ณธ๋ฌธ์€ ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ ํƒ์  ๊ผฌ๋ฆฌ type 6๋Š” ๋™์ผํ•œ ๊ทœ์น™์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ €ํ•ญ ๋ช…๋ น์€ ์ตœ๋Œ€ ํ•œ๊ณ„๋ฅผ ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ๋Š” ๋‹ค๋ฅธ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๊ฒฐ๊ณผ๋Š” ์—ฐ๊ฒฐ์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0์€ ๊ฐ’์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

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

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

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

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

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

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

  • ์ „ํ›„ ์‚ฌ์ด์—๋Š” UO.Wait(500) ๋ฐ€๋ฆฌ์ดˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐจ์ด๋Š” ์Œ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ˆ„๋ฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์‹œ ์ •์ง€๋Š” ์ง€์—ฐ API์ด ์•„๋‹Œ ์˜ˆ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.ResistEnergy();
    await Delay(500);
    var after = UO.ResistEnergy();
    var difference = after - before;
    UO.Print("Resistance change: " + Convert.ToString(difference));
    return null;
}

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

3. ์ตœ์†Œ ์ €ํ•ญ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ ์™„๋ฃŒ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ตœ์†Œ=50๋Š” ํด๋ผ์ด์–ธํŠธ ์ œํ•œ์ด ์•„๋‹Œ ์š”๊ตฌ ์‚ฌํ•ญ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. ResistanceAtLeast๋Š” ๋ˆ„๋ฝ๋œ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  ํ•˜๋‚˜์˜ ๊ฐ’์„ ์ฝ๊ณ  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(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

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

        var value = UO.ResistEnergy();
        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.ResistEnergy() โ€” UO.ResistEnergy()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.EnergyResistance

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


UO.ResistFire

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

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

int UO.ResistFire();

ํ˜„์žฌ ์บ๋ฆญํ„ฐ์˜ ์ €ํ•ญ ํ•„๋“œ์ธ ๋ถˆ์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int๋Š” ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์˜ ์„œ๋ช…๋œ ์ƒํƒœ ๊ฐ’, -32768..32767์ž…๋‹ˆ๋‹ค. ์Œ์ˆ˜ ๊ฐ’์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. 0๋Š” ์‹ค์ œ ์ €ํ•ญ, ๋ฐ์ดํ„ฐ ๋ถ€์กฑ ๋˜๋Š” ํ”Œ๋ ˆ์ด์–ด ๋ˆ„๋ฝ/ํŒŒ๊ดด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GetResist๋Š” ์•Œ ์ˆ˜ ์—†๋Š” ์„ ํƒ๊ธฐ์— ๋Œ€ํ•ด 0๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. bool, ID, ์Šคํ‚ฌ ํ•œ๊ณ„๋‚˜ ์ €ํ•ญ ํ•œ๊ณ„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. 1๋Š” ์„ฑ๊ณต์ด ์•„๋‹Œ 1์ ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ •ํ™•ํ•œ ์„œ๋ช…์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๊ฒŒ์ž„ ์Šค๋ ˆ๋“œ์—์„œ ์ฝ์œผ๋ฉด Player๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.FireResistance ํ˜„์žฌ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์กด์žฌํ•˜๊ณ  ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0. ์žฅ๋น„๊ฐ€ ์ •๋ ฌ๋˜์ง€ ์•Š๊ณ , ๋ณด๋„ˆ์Šค๊ฐ€ ๋‹ค์‹œ ๊ณ„์‚ฐ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ƒํƒœ๊ฐ€ ์š”์ฒญ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ ๋ น์€ ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์š”์†Œ ํ•„๋“œ๋Š” ํ™•์žฅ๋œ CharacterStatus (0x11), type >= 4๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๋ช…๋ น ์ž์ฒด๋Š” ์„œ๋ฒ„ ์‹œ๋Œ€๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ•„๋“œ๊ฐ€ ์—†๋Š” ์••์ถ•/์ด์ „ ์ƒํƒœ๋Š” ์ด์ „ ์บ์‹œ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ํ”Œ๋ ˆ์ด์–ด๋Š” ์ฒ˜์Œ์—๋Š” 0์ž…๋‹ˆ๋‹ค. ๋… ์ €ํ•ญ์€ Poisoned ํ”Œ๋ž˜๊ทธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฃผ๋ฌธ ์ €ํ•ญ ์Šคํ‚ฌ๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • CharacterStatus๋Š” ์ด๋ฆ„, ์ฒด๋ ฅ, ์ž์‹ ์˜ ํŠน์„ฑ์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ์‹ ์ฒด๋ฅผ ํ™•์ธํ•œ ๋‹ค์Œ ๊ฐ ์ €ํ•ญ ๋‹จ์–ด๋ฅผ ์„œ๋ช…๋œ Int16์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ž˜๋ฆฐ ํ•„์ˆ˜ ๋ณธ๋ฌธ์€ ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ ํƒ์  ๊ผฌ๋ฆฌ type 6๋Š” ๋™์ผํ•œ ๊ทœ์น™์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ €ํ•ญ ๋ช…๋ น์€ ์ตœ๋Œ€ ํ•œ๊ณ„๋ฅผ ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ๋Š” ๋‹ค๋ฅธ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๊ฒฐ๊ณผ๋Š” ์—ฐ๊ฒฐ์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0์€ ๊ฐ’์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

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

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

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

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

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

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

  • ์ „ํ›„ ์‚ฌ์ด์—๋Š” UO.Wait(500) ๋ฐ€๋ฆฌ์ดˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐจ์ด๋Š” ์Œ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ˆ„๋ฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์‹œ ์ •์ง€๋Š” ์ง€์—ฐ API์ด ์•„๋‹Œ ์˜ˆ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.ResistFire();
    await Delay(500);
    var after = UO.ResistFire();
    var difference = after - before;
    UO.Print("Resistance change: " + Convert.ToString(difference));
    return null;
}

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

3. ์ตœ์†Œ ์ €ํ•ญ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ ์™„๋ฃŒ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ตœ์†Œ=50๋Š” ํด๋ผ์ด์–ธํŠธ ์ œํ•œ์ด ์•„๋‹Œ ์š”๊ตฌ ์‚ฌํ•ญ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. ResistanceAtLeast๋Š” ๋ˆ„๋ฝ๋œ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  ํ•˜๋‚˜์˜ ๊ฐ’์„ ์ฝ๊ณ  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(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

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

        var value = UO.ResistFire();
        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.ResistFire() โ€” UO.ResistFire()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.FireResistance

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


UO.ResistPhysical

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

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

int UO.ResistPhysical();

ํ˜„์žฌ ์บ๋ฆญํ„ฐ์˜ ์ €ํ•ญ ํ•„๋“œ(๋ฌผ๋ฆฌ ๋ฐฉ์–ด๊ตฌ/์ €ํ•ญ)๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int๋Š” ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์˜ ์„œ๋ช…๋œ ์ƒํƒœ ๊ฐ’, -32768..32767์ž…๋‹ˆ๋‹ค. ์Œ์ˆ˜ ๊ฐ’์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. 0๋Š” ์‹ค์ œ ์ €ํ•ญ, ๋ฐ์ดํ„ฐ ๋ถ€์กฑ ๋˜๋Š” ํ”Œ๋ ˆ์ด์–ด ๋ˆ„๋ฝ/ํŒŒ๊ดด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GetResist๋Š” ์•Œ ์ˆ˜ ์—†๋Š” ์„ ํƒ๊ธฐ์— ๋Œ€ํ•ด 0๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. bool, ID, ์Šคํ‚ฌ ํ•œ๊ณ„๋‚˜ ์ €ํ•ญ ํ•œ๊ณ„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. 1๋Š” ์„ฑ๊ณต์ด ์•„๋‹Œ 1์ ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

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

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

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

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

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

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

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

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

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

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

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

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

  • ์ „ํ›„ ์‚ฌ์ด์—๋Š” UO.Wait(500) ๋ฐ€๋ฆฌ์ดˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐจ์ด๋Š” ์Œ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ˆ„๋ฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์‹œ ์ •์ง€๋Š” ์ง€์—ฐ API์ด ์•„๋‹Œ ์˜ˆ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.ResistPhysical();
    await Delay(500);
    var after = UO.ResistPhysical();
    var difference = after - before;
    UO.Print("Resistance change: " + Convert.ToString(difference));
    return null;
}

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

3. ์ตœ์†Œ ์ €ํ•ญ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ ์™„๋ฃŒ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ตœ์†Œ=50๋Š” ํด๋ผ์ด์–ธํŠธ ์ œํ•œ์ด ์•„๋‹Œ ์š”๊ตฌ ์‚ฌํ•ญ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. ResistanceAtLeast๋Š” ๋ˆ„๋ฝ๋œ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  ํ•˜๋‚˜์˜ ๊ฐ’์„ ์ฝ๊ณ  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(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

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

        var value = UO.ResistPhysical();
        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.ResistPhysical() โ€” UO.ResistPhysical()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.Armor

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


UO.ResistPoison

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

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

int UO.ResistPoison();

ํ˜„์žฌ ์บ๋ฆญํ„ฐ์˜ ์ €ํ•ญ ํ•„๋“œ์ธ ๋…์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int๋Š” ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์˜ ์„œ๋ช…๋œ ์ƒํƒœ ๊ฐ’, -32768..32767์ž…๋‹ˆ๋‹ค. ์Œ์ˆ˜ ๊ฐ’์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. 0๋Š” ์‹ค์ œ ์ €ํ•ญ, ๋ฐ์ดํ„ฐ ๋ถ€์กฑ ๋˜๋Š” ํ”Œ๋ ˆ์ด์–ด ๋ˆ„๋ฝ/ํŒŒ๊ดด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GetResist๋Š” ์•Œ ์ˆ˜ ์—†๋Š” ์„ ํƒ๊ธฐ์— ๋Œ€ํ•ด 0๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. bool, ID, ์Šคํ‚ฌ ํ•œ๊ณ„๋‚˜ ์ €ํ•ญ ํ•œ๊ณ„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. 1๋Š” ์„ฑ๊ณต์ด ์•„๋‹Œ 1์ ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ •ํ™•ํ•œ ์„œ๋ช…์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๊ฒŒ์ž„ ์Šค๋ ˆ๋“œ์—์„œ ์ฝ์œผ๋ฉด Player๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.PoisonResistance ํ˜„์žฌ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์กด์žฌํ•˜๊ณ  ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0. ์žฅ๋น„๊ฐ€ ์ •๋ ฌ๋˜์ง€ ์•Š๊ณ , ๋ณด๋„ˆ์Šค๊ฐ€ ๋‹ค์‹œ ๊ณ„์‚ฐ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ƒํƒœ๊ฐ€ ์š”์ฒญ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ ๋ น์€ ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์š”์†Œ ํ•„๋“œ๋Š” ํ™•์žฅ๋œ CharacterStatus (0x11), type >= 4๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๋ช…๋ น ์ž์ฒด๋Š” ์„œ๋ฒ„ ์‹œ๋Œ€๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ•„๋“œ๊ฐ€ ์—†๋Š” ์••์ถ•/์ด์ „ ์ƒํƒœ๋Š” ์ด์ „ ์บ์‹œ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ํ”Œ๋ ˆ์ด์–ด๋Š” ์ฒ˜์Œ์—๋Š” 0์ž…๋‹ˆ๋‹ค. ๋… ์ €ํ•ญ์€ Poisoned ํ”Œ๋ž˜๊ทธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฃผ๋ฌธ ์ €ํ•ญ ์Šคํ‚ฌ๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • CharacterStatus๋Š” ์ด๋ฆ„, ์ฒด๋ ฅ, ์ž์‹ ์˜ ํŠน์„ฑ์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ์‹ ์ฒด๋ฅผ ํ™•์ธํ•œ ๋‹ค์Œ ๊ฐ ์ €ํ•ญ ๋‹จ์–ด๋ฅผ ์„œ๋ช…๋œ Int16์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ž˜๋ฆฐ ํ•„์ˆ˜ ๋ณธ๋ฌธ์€ ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ ํƒ์  ๊ผฌ๋ฆฌ type 6๋Š” ๋™์ผํ•œ ๊ทœ์น™์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ €ํ•ญ ๋ช…๋ น์€ ์ตœ๋Œ€ ํ•œ๊ณ„๋ฅผ ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ๋Š” ๋‹ค๋ฅธ ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๊ฒฐ๊ณผ๋Š” ์—ฐ๊ฒฐ์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0์€ ๊ฐ’์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

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

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

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

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

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

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

  • ์ „ํ›„ ์‚ฌ์ด์—๋Š” UO.Wait(500) ๋ฐ€๋ฆฌ์ดˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐจ์ด๋Š” ์Œ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ˆ„๋ฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์‹œ ์ •์ง€๋Š” ์ง€์—ฐ API์ด ์•„๋‹Œ ์˜ˆ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.ResistPoison();
    await Delay(500);
    var after = UO.ResistPoison();
    var difference = after - before;
    UO.Print("Resistance change: " + Convert.ToString(difference));
    return null;
}

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

3. ์ตœ์†Œ ์ €ํ•ญ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ ์™„๋ฃŒ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ตœ์†Œ=50๋Š” ํด๋ผ์ด์–ธํŠธ ์ œํ•œ์ด ์•„๋‹Œ ์š”๊ตฌ ์‚ฌํ•ญ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. ResistanceAtLeast๋Š” ๋ˆ„๋ฝ๋œ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  ํ•˜๋‚˜์˜ ๊ฐ’์„ ์ฝ๊ณ  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(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

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

        var value = UO.ResistPoison();
        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.ResistPoison() โ€” UO.ResistPoison()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.PoisonResistance

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


UO.Self

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

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

int UO.Self();

ํ˜„์žฌ ๋ฌธ์ž์˜ ID๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int - serial/ID, graphic/type, ๋ ˆ์ด์–ด, ํ•ญ๋ชฉ ์ˆ˜ ๋˜๋Š” bool๊ฐ€ ์•„๋‹˜. 0โ€”ํ˜„์žฌ ๊ฐœ์ฒด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  32 ๋น„ํŠธ serial๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. != 0๋ฅผ ํ™•์ธํ•˜์„ธ์š”. == true ๋˜๋Š” > 0๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ €์žฅ๋œ ๊ฒฐ๊ณผ๋Š” ์ž์ฒด์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. World.Player.Serial์„ ์ฝ์Šต๋‹ˆ๋‹ค. ์‹ค์ข…๋˜๊ฑฐ๋‚˜ ํŒŒ๊ดด๋œ ํ”Œ๋ ˆ์ด์–ด๋Š” 0๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฃฝ์Œ์€ ์ œ๊ฑฐ์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์กด์žฌํ•˜๋Š” ์œ ๋ น์€ ์บ๋ฆญํ„ฐ์˜ ID์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์—์„œ Invoke๋ฅผ ํ†ตํ•ด ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ทจ์†Œํ•˜๋ฉด ํ•ด๋‹น ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ๋Œ€๊ธฐ๊ฐ€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๋ฅผ ๋ณด๋‚ด์ง€ ์•Š๊ณ , ์ปจํ…Œ์ด๋„ˆ/๋Œ€์ƒ์„ ์—ด์ง€ ์•Š์œผ๋ฉฐ, ์•„์ดํ…œ์„ ์ „์†กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ด„ํ˜ธ ์—†์ด ๋‚ด์žฅ๋œ self/backpack๋Š” ์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜๋กœ ์žฌ์ •์˜๋˜์ง€ ์•Š๋Š” ํ•œ ๋‹ค์‹œ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ์ด๋ฆ„์€ ์ˆ˜์‹  ๋ช…๋ น์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์šด๋ฐ˜ ๋Œ€์ƒ์—์„œ "self"๋Š” ๋ฐฐ๋‚ญ์„ ์˜๋ฏธํ•˜๊ณ , UO.Self()๋Š” ์บ๋ฆญํ„ฐ์˜ serial๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ID ์ปจํ…Œ์ด๋„ˆ์˜ ๊ฒฝ์šฐ UO.Backpack()๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • World.Clear๋Š” ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ํ›„์† ํŒ๋… ๊ฒฐ๊ณผ๋Š” 0์ž…๋‹ˆ๋‹ค. ์„ธ๊ณ„์— ์ž…์žฅํ•˜๊ฑฐ๋‚˜ ์žฅ์ฐฉํ•œ ๊ฐ€๋ฐฉ์„ ๋ฐ”๊พธ๋ฉด ID๊ฐ€ ๋ฐ”๋€” ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ๋Š” ์›์ž์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ID๋Š” ์—ฐ๊ฒฐ, ์„œ๋ฒ„ ํ™•์ธ ๋˜๋Š” ์ฝ˜ํ…์ธ  ๋กœ๋”ฉ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • id๋Š” ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ์šฉ HEX ํ˜•์‹ serial. ์ด ์˜ˆ์—์„œ๋Š” ์•„๋ฌด ๊ฒƒ๋„ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var id = UO.Self();
UO.Print("ID: " + Hex(id));

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

2. ๋ณ€๊ฒฝ ๊ฐ์ง€ ID - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ด์ „/์ดํ›„๋Š” 250 ms ๊ฐ„๊ฒฉ์œผ๋กœ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค. UO.Wait๋Š” ์˜ˆ์‹œ์šฉ์œผ๋กœ๋งŒ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ‰๋“ฑ์€ ๋™์ผํ•œ ์ตœ์ข… ID์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๋ˆ„๋ฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.Self();
    await Delay(250);
    var after = UO.Self();
    if (Truth(before != after))
    {
        UO.Print("ID changed: " + Hex(after));
    }

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

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

  • ํ›„๋ณด์ž - ์ €์žฅ๋จ ID LastTarget. IsOwnSerial(ํ›„๋ณด์ž)๋Š” ํ•˜๋‚˜์˜ serial๋ฅผ ์ทจํ•˜๊ณ  bool๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ 0์ด ์•„๋‹Œ ์ž์ฒด ID์— ๋Œ€ํ•ด 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()
    {
        var candidate = UO.LastTarget();
        if (Truth(Truth(IsOwnSerial(candidate)) == true))
        {
            UO.Print("Own object selected");
        }
        else
        {
            UO.Print("Different object or no own object");
        }

        return null;
    }

    dynamic IsOwnSerial(dynamic candidate)
    {
        var current = UO.Self();
        return Truth(current != 0) && Truth(current == candidate);
    }

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "self": return new InjectionValue(bridge.Self);

UO.SetARExtParams

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

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

void UO.SetARExtParams();
void UO.SetARExtParams(object? shardName);
void UO.SetARExtParams(object? shardName, object? charName);
void UO.SetARExtParams(object? shardName, object? charName, object? useAtEveryConnect);

์ƒค๋“œ ๋ชฉ๋ก์—์„œ ์„œ๋ฒ„๋ฅผ ์ง€์ •ํ•˜๊ณ  ํ›„์† ๋กœ๊ทธ์ธ์„ ์œ„ํ•œ ์บ๋ฆญํ„ฐ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ๊ณ„์ •์˜ ํŠน์ • ์บ๋ฆญํ„ฐ๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‹ค์‹œ ์—ฐ๊ฒฐํ•ด์•ผ ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

  • shardName โ€” IP ๋˜๋Š” ํฌํŠธ๊ฐ€ ์•„๋‹Œ ๋กœ๊ทธ์ธ ๋ชฉ๋ก์˜ ์„œ๋ฒ„ ํ‘œ์‹œ ์ด๋ฆ„(์„ ํƒ ์‚ฌํ•ญ)์ž…๋‹ˆ๋‹ค. ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ๋ˆ„๋ฝ๋œ ๊ฐ’์€ ํ˜„์žฌ ShardName์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ์ž๋ฆฌ ์ฃผ๋ณ€์˜ ๊ณต๋ฐฑ์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
  • charName - ๊ธฐ์กด ๊ณ„์ • ์บ๋ฆญํ„ฐ์˜ ์„ ํƒ์  ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ๋ˆ„๋ฝ๋œ ๊ฐ’์€ ์•Œ๋ ค์ง„ ๊ฒฝ์šฐ self๋ผ๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์Šฌ๋กฏ ๋ฒˆํ˜ธ๋‚˜ serial๊ฐ€ ์•„๋‹Œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๋น„์–ด ์žˆ์ง€ ์•Š์€ ์ด๋ฆ„์€ ํ”„๋กœํ•„ ์Šฌ๋กฏ๋ณด๋‹ค ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • useAtEveryConnect - ์„ ํƒ์  ํ”Œ๋ž˜๊ทธ: false/0 ๊ธฐ๋ณธ์ ์œผ๋กœ - ์ผํšŒ์„ฑ ์„ ํƒ; true/1 ๋˜๋Š” ๊ธฐํƒ€ 0์ด ์•„๋‹Œ ์ •์ˆ˜โ€”์ด ์„ธ์…˜์—์„œ ํ–ฅํ›„ ๋กœ๊ทธ์ธ์„ ์œ„ํ•ด ์„ ํƒ ํ•ญ๋ชฉ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์บ๋ฆญํ„ฐ์˜ ์—ฐ๊ฒฐ์ด๋‚˜ ์กด์žฌ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹ค์Œ ์ž…๋ ฅ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ด€๋ฆฌ์ž์—์„œ nonce๋Š” ์‹คํŒจํ•œ ๋„คํŠธ์›Œํฌ ์‹œ๋„์— ๋Œ€ํ•ด ์ €์žฅ๋˜๋ฉฐ ์„ธ๊ณ„์— ๋“ค์–ด๊ฐ„ ํ›„์—๋งŒ ์†Œ๋น„๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์—ฐ๊ฒฐ์€ ํ”„๋กœํ•„ ์„ค์ •์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ์ง€์†์ ์ธ ์„ ํƒ์€ ์ƒˆ๋กœ์šด ์„ค์ •์ด๋‚˜ ์„ธ์…˜ ์†Œ์œ ์ž๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ง€์†๋ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž ํ”„๋กœํ•„ ํŒŒ์ผ์€ ๋ฎ์–ด์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ ์ค‘ ์ƒˆ๋กœ์šด ์„ค์ •์€ ๋‹ค์Œ ๋กœ๊ทธ์ธ์— ์ ์šฉ๋˜๋ฉฐ ํ˜„์žฌ ๋กœ๊ทธ์ธ์ด ์™„๋ฃŒ๋˜์–ด๋„ ์†์‹ค๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ณ„๋„์˜ ๊ทธ๋ž˜ํ”ฝ ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ์„œ๋ฒ„๋Š” LastServerName, ์บ๋ฆญํ„ฐ๋Š” LastCharacterManager๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•˜๋ฉด ํ•ด๋‹น ์บ๋ฆญํ„ฐ๋Š” ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉํ•œ ์บ๋ฆญํ„ฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ผํšŒ์šฉ์ด ์ด์ „ ์บ๋ฆญํ„ฐ๋กœ ์ž๋™์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์˜๊ตฌ ์žฌ์ •์˜๋Š” ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋ช…๋ น ์ž์ฒด๋Š” ์ž๋™ ์žฌ์—ฐ๊ฒฐ์„ ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์—ฐ๊ฒฐ์„ ๋Š์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด SetARStatus, Connect ๋ฐ Disconnect๋ฅผ ๋ณ„๋„๋กœ ์‚ฌ์šฉํ•˜์„ธ์š”. ์„œ๋ฒ„ ๋ชฉ๋ก์— ์ด๋ฆ„์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋น„๊ต์—์„œ๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž์—์„œ ์ž๋™ ๋ฌธ์ž ์ž…๋ ฅ์ด ๋น„ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ ์ˆ˜๋™ ์„ ํƒ์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์˜คํ”„๋ผ์ธ ์ด๋ฆ„ self์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜์„ธ์š”. ์ด ๋ช…๋ น์€ ๊ณ„์ •, ๋น„๋ฐ€๋ฒˆํ˜ธ, IP, ํฌํŠธ ๋ฐ ์•”ํ˜ธํ™”๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๋นˆ ๊ฐ’์€ ์ด์ „์— ์„ค์ •๋œ ์„ ํƒ์„ ์ง€์šฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.SetARExtParams");
UO.SetARExtParams("", "", true);

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

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

  • ์ฒซ ๋ฒˆ์งธ ์˜ˆ๋Š” ์˜จ๋ผ์ธ์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ๋นˆ ์ค„์€ ํ˜„์žฌ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. true๋Š” ์žฌ๋กœ๊ทธ์ธ์„ ์œ„ํ•ด ์ €์žฅํ•˜๊ณ , SetARStatus(true)๋Š” ์ž๋™ ์žฌ์—ฐ๊ฒฐ ์ •์ฑ…์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰๊ฐ์ ์ธ ์žฌ์ ‘์†์€ ์—†์Šต๋‹ˆ๋‹ค.
if (!(Truth(UO.Connected())))
{
    return null;
}
UO.SetARExtParams("", "", true);
UO.SetARStatus(true);

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

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

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

  • ๋‘ ๋ฒˆ์งธ ์˜ˆ์—์„œ๋Š” ์ด ์ด๋ฆ„์ด ์‹ค์ œ GetCharsListForShard์ธ ๊ฒฝ์šฐ์—๋งŒ ์˜ˆ์ œ ๋ฌธ์ž๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด์€ 0๋กœ ์ธ๋ฑ์‹ฑ๋ฉ๋‹ˆ๋‹ค. ToLowerInvariant๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ์ด๋ฆ„์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. false๋Š” ํ•œ ๋ฒˆ์˜ ์„ฑ๊ณต์ ์ธ ์ž…๋ ฅ์„ ์˜๋ฏธํ•˜๋ฉฐ, ๊ตฌ์„ฑ ํ›„ ์ž๋™ ์žฌ์—ฐ๊ฒฐ์ด ํ™œ์„ฑํ™”๋˜๊ณ  Disconnect๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์„ ๊ท€ํ•˜์˜ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊พธ์‹ญ์‹œ์˜ค. ์ด๋ฆ„์ด ์—†์œผ๋ฉด ์—ฐ๊ฒฐ์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ž๋™ ์ผ์‹œ์ค‘์ง€๋Š” ์—ฐ๊ฒฐ์ด ๋ณต์›๋  ๋•Œ๊นŒ์ง€ ๋ณต๊ท€๋ฅผ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (!(Truth(UO.Connected())))
    {
        return null;
    }

    var wanted = "Example Character";
    var names = UO.GetCharsListForShard();
    var i = 0;
    while (Truth(i < ArrayLength(names)))
    {
        if (Truth(Convert.ToString(names[i]) == Convert.ToString(wanted)))
        {
            UO.SetARExtParams("", names[i], false);
            UO.SetARStatus(true);
            UO.Disconnect();
            return null;
        }

        i += 1;
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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

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

  • ์„ธ ๋ฒˆ์งธ ์˜ˆ๋Š” ์‹คํ–‰ ์ค‘์ธ ์˜คํ”„๋ผ์ธ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ ์ƒค๋“œ์™€ ์˜ˆ์‹œ ์บ๋ฆญํ„ฐ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊พธ์‹ญ์‹œ์˜ค. true๋Š” ์„ ํƒ ์‚ฌํ•ญ์„ ์ €์žฅํ•˜๊ณ , SetARStatus์˜ false๋Š” ์ž๋™ ๋ฐ˜๋ณต์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ , Connect๋Š” ํ•˜๋‚˜์˜ ์ž…๋ ฅ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ๋œ ๊ณ„์ • ์„ธ๋ถ€์ •๋ณด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Connect๋Š” ์„ธ์ƒ์ด ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž๋™์œผ๋กœ ์ผ์‹œ ์ค‘์ง€๋œ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์ง€ ์•Š์œผ๋ฉด ์ด ์ค„์— ๋„๋‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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.Connected()))
        {
            return null;
        }

        UO.SetARExtParams("Example Shard", "Example Character", true);
        UO.SetARStatus(false);
        UO.Connect();
        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.SetARExtParams() โ€” UO.SetARExtParams()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "setarextparams":

                {

                    string requestedShard = arguments.Length > 0 ? Text(0) : string.Empty;

                    string requestedCharacter = arguments.Length > 1 ? Text(1) : string.Empty;

                    state.AutoReconnectShard = string.IsNullOrWhiteSpace(requestedShard)

                        ? bridge.ShardName

                        : requestedShard;

                    state.AutoReconnectCharacter = string.IsNullOrWhiteSpace(requestedCharacter)

                        ? bridge.GetName(bridge.Self) ?? string.Empty

                        : requestedCharacter;

                    int useAtEveryConnect = arguments.Length > 2 ? Arg(2) : 0;

                    bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect);

                    return InjectionValue.Unit;

                }

UO.SetARExtParams(shardName) โ€” UO.SetARExtParams(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "setarextparams":

                {

                    string requestedShard = arguments.Length > 0 ? Text(0) : string.Empty;

                    string requestedCharacter = arguments.Length > 1 ? Text(1) : string.Empty;

                    state.AutoReconnectShard = string.IsNullOrWhiteSpace(requestedShard)

                        ? bridge.ShardName

                        : requestedShard;

                    state.AutoReconnectCharacter = string.IsNullOrWhiteSpace(requestedCharacter)

                        ? bridge.GetName(bridge.Self) ?? string.Empty

                        : requestedCharacter;

                    int useAtEveryConnect = arguments.Length > 2 ? Arg(2) : 0;

                    bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect);

                    return InjectionValue.Unit;

                }

UO.SetARExtParams(shardName, charName) โ€” UO.SetARExtParams(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "setarextparams":

                {

                    string requestedShard = arguments.Length > 0 ? Text(0) : string.Empty;

                    string requestedCharacter = arguments.Length > 1 ? Text(1) : string.Empty;

                    state.AutoReconnectShard = string.IsNullOrWhiteSpace(requestedShard)

                        ? bridge.ShardName

                        : requestedShard;

                    state.AutoReconnectCharacter = string.IsNullOrWhiteSpace(requestedCharacter)

                        ? bridge.GetName(bridge.Self) ?? string.Empty

                        : requestedCharacter;

                    int useAtEveryConnect = arguments.Length > 2 ? Arg(2) : 0;

                    bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect);

                    return InjectionValue.Unit;

                }

UO.SetARExtParams(shardName, charName, useAtEveryConnect) โ€” UO.SetARExtParams(Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: shardName (Any), charName (Any), useAtEveryConnect (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "setarextparams":

                {

                    string requestedShard = arguments.Length > 0 ? Text(0) : string.Empty;

                    string requestedCharacter = arguments.Length > 1 ? Text(1) : string.Empty;

                    state.AutoReconnectShard = string.IsNullOrWhiteSpace(requestedShard)

                        ? bridge.ShardName

                        : requestedShard;

                    state.AutoReconnectCharacter = string.IsNullOrWhiteSpace(requestedCharacter)

                        ? bridge.GetName(bridge.Self) ?? string.Empty

                        : requestedCharacter;

                    int useAtEveryConnect = arguments.Length > 2 ? Arg(2) : 0;

                    bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect);

                    return InjectionValue.Unit;

                }

UO.SetARStatus

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

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

void UO.SetARStatus(object? value);

์ž๋™ ์žฌ์—ฐ๊ฒฐ์„ ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • Bridge.SetAutoReconnect๋Š” ์ž๋™ ์žฌ์—ฐ๊ฒฐ ์„ค์ •์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์€ ํ™œ์„ฑํ™”๋œ ๊ฒƒ์œผ๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค != 0; ์„œ๋ฒ„์— ์ฆ‰์‹œ ๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ ์„ค์ •์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์„œ๋ฒ„์˜ ์ฒ˜๋ฆฌ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ์ž๋™ ์žฌ์—ฐ๊ฒฐ์„ ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
UO.SetARStatus(1);

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

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

  • Bridge.SetAutoReconnect๋Š” ์ž๋™ ์žฌ์—ฐ๊ฒฐ ์„ค์ •์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์€ ํ™œ์„ฑํ™”๋œ ๊ฒƒ์œผ๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค != 0; ์„œ๋ฒ„์— ์ฆ‰์‹œ ๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.SetARStatus(0);
    return null;
}

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

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

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

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

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

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "setarstatus": bridge.SetAutoReconnect(Arg(0)); return InjectionValue.Unit;

UO.SetArm

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

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

void UO.SetArm(object? name);

๋ช…๋ช…๋œ ์„ธํŠธ์˜ ํ˜„์žฌ ๋ฌด๊ธฐ์™€ ๋ฐฉํŒจ๋ฅผ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค.

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

  • name โ€” "travel" ๋˜๋Š” "battle"๊ณผ ๊ฐ™์€ ์„ธํŠธ์˜ ๋ฌธ์ž์—ด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์˜๋ฅ˜์™€ ๋ฌด๊ธฐ ์„ธํŠธ๋Š” ๋ณ„๋„๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค์— ๋™์ผํ•œ ์ด๋ฆ„์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ID ์‚ฌ๋ฌผ์ด๋‚˜ ํŒŒ์ผ ์ด๋ฆ„์ด ์•„๋‹™๋‹ˆ๋‹ค. SetDress๋งŒ ์ด๋ฆ„์ด ์—†๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ DressSavedSet/EquipDressSet์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์„ธํŠธ๊ฐ€ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. ๊ฒฐ๊ณผ๋ฅผ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ true์™€ ๋น„๊ตํ•˜์ง€ ๋งˆ์„ธ์š”. ์ €์žฅํ•˜๊ณ  ์‚ญ์ œํ•˜๋ฉด ์žฅ๋น„๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•ญ๋ชฉ์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ์˜๋ฅ˜: ๋ ˆ์ด์–ด๋“œ 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. ๋ฌด๊ธฐ: 1 ๋ฐ 2๋งŒ ํ•ด๋‹น. ๋จธ๋ฆฌ์นด๋ฝ, ์ˆ˜์—ผ, ๋ฐฐ๋‚ญ, ๋™๋ฌผ, ์€ํ–‰์€ ์ด ์„ธํŠธ์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฏธ ๋กœ๋“œ๋œ ํŠน์ • serial ํ•ญ๋ชฉ์€ ์ž์ฒด ๋ ˆ์ด์–ด์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ์ด๋ฆ„์„ ๋‹ค์‹œ ์ €์žฅํ•˜๋ฉด ํ•ญ๋ชฉ์ด ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ๋นˆ ๋ ˆ์ด์–ด๋„ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณต์›๋˜๋ฉด ํ•ด๋‹น ์ ์œ  ๋ ˆ์ด์–ด๊ฐ€ ์ž์ฒด ๋ฐฑํŒฉ์œผ๋กœ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ €์žฅ๋œ ์™„์ „ํžˆ ๋น„์–ด ์žˆ๋Š” ์„ธํŠธ๋Š” ํ•ด๋‹น ๋ ˆ์ด์–ด์—์„œ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • ์„ธํŠธ๋Š” ๋Ÿฐํƒ€์ž„ ์ƒํƒœ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ ์ž์ฒด๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋ฉฐ ์„ธํŠธ๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœํ•„์ด๋‚˜ ์ƒˆ ๋Ÿฐํƒ€์ž„์œผ๋กœ ์ „์†ก๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์›ํ•˜๋Š” ์„ธํŠธ๋ฅผ ์‚ฌ์šฉ๋œ ์ƒํƒœ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์˜ ์ผ๋ฐ˜ ์ƒํƒœ๋ฅผ ๋กœ๋“œ/์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ๋ณ„๋„์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค.
  • UO.SetDress ยท UO.Dress ยท UO.DressSavedSet ยท UO.SetArm ยท UO.Arm ยท UO.DressSpeed
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.SetArm");
UO.SetArm("battle");

1. ์ง์ ‘ ์‚ฌ์šฉ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ํ•„์š”ํ•œ ๊ฒƒ๋“ค์ด ์ด๋ฏธ ์žฅ์ฐฉ๋˜์—ˆ์„ ๋•Œ ์‚ฌ์ง„์ด ์ดฌ์˜๋ฉ๋‹ˆ๋‹ค. ์ด ์ฑŒ๋ฆฐ์ง€๋Š” ๋ฐฐ๋‚ญ์— ์žˆ๋Š” ์•„์ดํ…œ์„ ์žฅ์ฐฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
UO.SetArm("battle");

2. ์ด๋ฆ„ ๋ฐ ์ฟผ๋ฆฌ ๋ชจ๋“œ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋™์ผํ•œ ์ด๋ฆ„์ด ๋‹ค๋ฅธ ์ €์žฅ์†Œ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. SetDress()๋Š” ์ด๋ฆ„์ด ์ง€์ •๋˜์ง€ ์•Š์€ ์„ธํŠธ๋„ ๋ณ„๋„๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์— ๋…น์Œ๋œ ์ด๋ฆ„์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.SetArm("battle");
    UO.SetDress("battle");
    return null;
}

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

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

  • SaveIfReady๋Š” ์ปจํŠธ๋กค ๋ ˆ์ด์–ด๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. 3 - ์˜ท์€ ์‹ ๋ฐœ, 1 - ๋ฌด๊ธฐ๋Š” ์˜ค๋ฅธ์†. ๋น„์–ด ์žˆ์œผ๋ฉด ์Šค๋ƒ…์ƒท์„ ๋ฎ์–ด์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ 1/0๋Š” SetDress/SetArm๊ฐ€ ์•„๋‹Œ ๋„์šฐ๋ฏธ์— ์†ํ•ฉ๋‹ˆ๋‹ค.
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()
    {
        return SaveIfReady("battle");
        return null;
    }

    dynamic SaveIfReady(dynamic name)
    {
        if (Truth(UO.ObjAtLayerEx(1, UO.Self()) == 0))
        {
            return 0;
        }

        UO.SetArm(name);
        return 1;
    }

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void SetArm(string name)

            => SetEquip(name, armSets, weaponLayers, "Arm set.");

UO.SetDress

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

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

void UO.SetDress();
void UO.SetDress(object? name);

์ดํ›„์˜ ๋ณต์›์„ ์œ„ํ•ด ํ˜„์žฌ ์ฐฉ์šฉํ•˜๊ณ  ์žˆ๋Š” ์˜๋ณต๊ณผ ๊ฐ‘์˜ท์„ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค.

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

  • name โ€” "travel" ๋˜๋Š” "battle"๊ณผ ๊ฐ™์€ ์„ธํŠธ์˜ ๋ฌธ์ž์—ด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์˜๋ฅ˜์™€ ๋ฌด๊ธฐ ์„ธํŠธ๋Š” ๋ณ„๋„๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค์— ๋™์ผํ•œ ์ด๋ฆ„์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ID ์‚ฌ๋ฌผ์ด๋‚˜ ํŒŒ์ผ ์ด๋ฆ„์ด ์•„๋‹™๋‹ˆ๋‹ค. SetDress๋งŒ ์ด๋ฆ„์ด ์—†๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ DressSavedSet/EquipDressSet์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์„ธํŠธ๊ฐ€ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. ๊ฒฐ๊ณผ๋ฅผ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ true์™€ ๋น„๊ตํ•˜์ง€ ๋งˆ์„ธ์š”. ์ €์žฅํ•˜๊ณ  ์‚ญ์ œํ•˜๋ฉด ์žฅ๋น„๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•ญ๋ชฉ์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ์˜๋ฅ˜: ๋ ˆ์ด์–ด๋“œ 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. ๋ฌด๊ธฐ: 1 ๋ฐ 2๋งŒ ํ•ด๋‹น. ๋จธ๋ฆฌ์นด๋ฝ, ์ˆ˜์—ผ, ๋ฐฐ๋‚ญ, ๋™๋ฌผ, ์€ํ–‰์€ ์ด ์„ธํŠธ์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฏธ ๋กœ๋“œ๋œ ํŠน์ • serial ํ•ญ๋ชฉ์€ ์ž์ฒด ๋ ˆ์ด์–ด์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ์ด๋ฆ„์„ ๋‹ค์‹œ ์ €์žฅํ•˜๋ฉด ํ•ญ๋ชฉ์ด ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ๋นˆ ๋ ˆ์ด์–ด๋„ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณต์›๋˜๋ฉด ํ•ด๋‹น ์ ์œ  ๋ ˆ์ด์–ด๊ฐ€ ์ž์ฒด ๋ฐฑํŒฉ์œผ๋กœ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ €์žฅ๋œ ์™„์ „ํžˆ ๋น„์–ด ์žˆ๋Š” ์„ธํŠธ๋Š” ํ•ด๋‹น ๋ ˆ์ด์–ด์—์„œ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • ์„ธํŠธ๋Š” ๋Ÿฐํƒ€์ž„ ์ƒํƒœ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ ์ž์ฒด๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋ฉฐ ์„ธํŠธ๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœํ•„์ด๋‚˜ ์ƒˆ ๋Ÿฐํƒ€์ž„์œผ๋กœ ์ „์†ก๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์›ํ•˜๋Š” ์„ธํŠธ๋ฅผ ์‚ฌ์šฉ๋œ ์ƒํƒœ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์˜ ์ผ๋ฐ˜ ์ƒํƒœ๋ฅผ ๋กœ๋“œ/์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ๋ณ„๋„์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค.
  • UO.SetDress ยท UO.Dress ยท UO.DressSavedSet ยท UO.SetArm ยท UO.Arm ยท UO.DressSpeed
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ง์ ‘ ์‚ฌ์šฉ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ํ•„์š”ํ•œ ๊ฒƒ๋“ค์ด ์ด๋ฏธ ์žฅ์ฐฉ๋˜์—ˆ์„ ๋•Œ ์‚ฌ์ง„์ด ์ดฌ์˜๋ฉ๋‹ˆ๋‹ค. ์ด ์ฑŒ๋ฆฐ์ง€๋Š” ๋ฐฐ๋‚ญ์— ์žˆ๋Š” ์•„์ดํ…œ์„ ์žฅ์ฐฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
UO.SetDress("travel");

2. ์ด๋ฆ„ ๋ฐ ์ฟผ๋ฆฌ ๋ชจ๋“œ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋™์ผํ•œ ์ด๋ฆ„์ด ๋‹ค๋ฅธ ์ €์žฅ์†Œ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. SetDress()๋Š” ์ด๋ฆ„์ด ์ง€์ •๋˜์ง€ ์•Š์€ ์„ธํŠธ๋„ ๋ณ„๋„๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์— ๋…น์Œ๋œ ์ด๋ฆ„์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.SetArm("battle");
    UO.SetDress("battle");
    UO.SetDress();
    return null;
}

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

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

  • SaveIfReady๋Š” ์ปจํŠธ๋กค ๋ ˆ์ด์–ด๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. 3 - ์˜ท์€ ์‹ ๋ฐœ, 1 - ๋ฌด๊ธฐ๋Š” ์˜ค๋ฅธ์†. ๋น„์–ด ์žˆ์œผ๋ฉด ์Šค๋ƒ…์ƒท์„ ๋ฎ์–ด์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ 1/0๋Š” SetDress/SetArm๊ฐ€ ์•„๋‹Œ ๋„์šฐ๋ฏธ์— ์†ํ•ฉ๋‹ˆ๋‹ค.
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()
    {
        return SaveIfReady("travel");
        return null;
    }

    dynamic SaveIfReady(dynamic name)
    {
        if (Truth(UO.ObjAtLayerEx(3, UO.Self()) == 0))
        {
            return 0;
        }

        UO.SetDress(name);
        return 1;
    }

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "setdress": SetDress("__stealth_saved_set__"); return InjectionValue.Unit;

UO.SetDress(name) โ€” UO.SetDress(String)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void SetDress(string name)

            => SetEquip(name, dressSets, dressLayers, "Clothing set.");

UO.SetDressSpeed

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

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

void UO.SetDressSpeed(object? delayms);

์˜ท ๊ฐˆ์•„์ž…๊ธฐ ์š”์ฒญ ์‚ฌ์ด์— ์ผ์‹œ ์ค‘์ง€๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

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

  • delayms - int, ๋ฐ€๋ฆฌ์ดˆ. ๊ฐ’์€ 10..10000 ํฌํ•จ์œผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • SetDressSpeed๋Š” ์ƒํƒœ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.DressSpeed = max(10, min(10000, Delayms)). ์ €์žฅ๋œ ์„ธํŠธ ์ž‘์—…์€ ์ด๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ํ—ˆ์šฉํ•˜๋Š” ์ž‘์—… ์†๋„๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • 10๋ณด๋‹ค ์ž‘์€ ๊ฐ’์€ 10๊ฐ€ ๋˜๊ณ , 10000๋ณด๋‹ค ํฐ ๊ฐ’์€ 10000๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ํŒ€์—์„œ๋Š” ๋ฌผ๊ฑด์„ ์ฐฉ์šฉํ•˜๊ฑฐ๋‚˜ ๋ฒ—์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.SetDressSpeed");
UO.SetDressSpeed(250);

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

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

  • ์˜ท ๊ฐˆ์•„์ž…๊ธฐ ์š”์ฒญ ์‚ฌ์ด์— ์ผ์‹œ ์ค‘์ง€๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
UO.SetDressSpeed(250);

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

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

  • SetDressSpeed๋Š” ์ƒํƒœ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.DressSpeed = max(10, min(10000, Delayms)). ์ €์žฅ๋œ ์„ธํŠธ ์ž‘์—…์€ ์ด๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ํ—ˆ์šฉํ•˜๋Š” ์ž‘์—… ์†๋„๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.SetDressSpeed(0);
    UO.Print(UO.DressSpeed());
    return null;
}

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

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

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

     public object? RunScenario()
    {
        UO.SetDressSpeed(20000);
        UO.Print(UO.DressSpeed());
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.SetDressSpeed(delayms) โ€” UO.SetDressSpeed(Integer)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void SetDressSpeed(int delayms) => state.DressSpeed = Math.Max(10, Math.Min(10_000, delayms));

UO.SetStatLockState

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

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

void UO.SetStatLockState(object? statNum, object? statState);

ํŠน์„ฑ ๋ชจ๋“œ๋กœ์˜ ๋ณ€๊ฒฝ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

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

  • statNum - ํ•„์ˆ˜ ํŠน์„ฑ๋ฒˆํ˜ธ: 0 - ๋ณ€ํ™˜.ToString, 1 - DEX, 2 - INT. ์ด๋Š” ํ˜„์žฌ ๊ฐ’์ด ์•„๋‹ˆ๋ฉฐ ๋ฌธ์ž์—ด ์ด๋ฆ„๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • statState โ€” ํ•„์ˆ˜ ๋ชจ๋“œ: 0 โ€” ์ฆ๊ฐ€, 1 โ€” ๊ฐ์†Œ, 2 โ€” ์ฐจ๋‹จ. ์ด๋Š” bool์ด ์•„๋‹Œ ์„ธ ๊ฐ€์ง€ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. true/false ๋ชจ๋“  ๋ชจ๋“œ์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ์ง€ ๋งˆ์„ธ์š”.

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ์„ฑ๊ณต/์‹คํŒจ๋กœ ์‚ฌ์šฉ๋˜๊ฑฐ๋‚˜ true์™€ ๋น„๊ตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ›„์† ์ฝ๊ธฐ์—์„œ๋Š” ์„œ๋ฒ„์˜ ํ™•์ธ์ด ์•„๋‹Œ ๋กœ์ปฌ ๋ชจ๋ธ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋™์ž‘

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

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

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

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

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

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

UO.Print("Calling UO.SetStatLockState");
UO.SetStatLockState(0, 2);

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

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

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

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

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

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

    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  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        ApplyMode(0, 2);
        return null;
    }

    void ApplyMode(dynamic selector, dynamic mode)
    {
        if (Truth(mode < 0) || Truth(mode > 2))
        {
            return;
        }

        if (Truth(UO.GetStatLockState(selector) < 0))
        {
            return;
        }

        UO.SetStatLockState(selector, mode);
    }

    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.SetStatLockState(statNum, statState) โ€” UO.SetStatLockState(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "setstatlockstate":

                case "setstatstate": bridge.SetStatLockState(Arg(0), Arg(1)); return InjectionValue.Unit;

UO.SetStatState

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

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

void UO.SetStatState(object? statNum, object? statState);

ํŠน์„ฑ ๋ชจ๋“œ๋กœ์˜ ๋ณ€๊ฒฝ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

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

  • statNum - ํ•„์ˆ˜ ํŠน์„ฑ๋ฒˆํ˜ธ: 0 - ๋ณ€ํ™˜.ToString, 1 - DEX, 2 - INT. ์ด๋Š” ํ˜„์žฌ ๊ฐ’์ด ์•„๋‹ˆ๋ฉฐ ๋ฌธ์ž์—ด ์ด๋ฆ„๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • statState โ€” ํ•„์ˆ˜ ๋ชจ๋“œ: 0 โ€” ์ฆ๊ฐ€, 1 โ€” ๊ฐ์†Œ, 2 โ€” ์ฐจ๋‹จ. ์ด๋Š” bool์ด ์•„๋‹Œ ์„ธ ๊ฐ€์ง€ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. true/false ๋ชจ๋“  ๋ชจ๋“œ์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ์ง€ ๋งˆ์„ธ์š”.

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ์„ฑ๊ณต/์‹คํŒจ๋กœ ์‚ฌ์šฉ๋˜๊ฑฐ๋‚˜ true์™€ ๋น„๊ตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ›„์† ์ฝ๊ธฐ์—์„œ๋Š” ์„œ๋ฒ„์˜ ํ™•์ธ์ด ์•„๋‹Œ ๋กœ์ปฌ ๋ชจ๋ธ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋™์ž‘

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

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

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

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

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

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

UO.Print("Calling UO.SetStatState");
UO.SetStatState(0, 2);

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

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

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

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

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

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

    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  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        ApplyMode(0, 2);
        return null;
    }

    void ApplyMode(dynamic selector, dynamic mode)
    {
        if (Truth(mode < 0) || Truth(mode > 2))
        {
            return;
        }

        if (Truth(UO.GetStatLockState(selector) < 0))
        {
            return;
        }

        UO.SetStatState(selector, mode);
    }

    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.SetStatState(statNum, statState) โ€” UO.SetStatState(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "setstatlockstate":

                case "setstatstate": bridge.SetStatLockState(Arg(0), Arg(1)); return InjectionValue.Unit;

UO.Sex

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

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

dynamic UO.Sex();

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

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

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

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

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

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

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

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

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

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

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

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

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

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

  • ์ธ์ˆ˜ ์—†์ด ๊ฐ’์„ ํ•œ ๋ฒˆ ์ฝ์Šต๋‹ˆ๋‹ค. ์„ฑ๋ณ„ ๋ฐ ์ธ์ข… ์ฝ”๋“œ๋Š” ํ‘œ์‹œ๋œ ๊ณ„์‚ฐ ๋˜๋Š” ์กฐ๊ฑด์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ˆซ์ž ์ž„๊ณ„๊ฐ’์€ ์Šคํฌ๋ฆฝํŠธ ์กฐ๊ฑด์˜ ์˜ˆ์ด๋ฉฐ ์ƒˆ๋กœ์šด ํด๋ผ์ด์–ธํŠธ ์ œํ•œ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ•„๋“œ์—๋Š” ์œ„์— ์„ค๋ช…๋œ ์„œ๋ฒ„ ๋‹จ์œ„ ๋ฐ ์ œํ•œ ์‚ฌํ•ญ์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.Sex();
    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.Sex();
        await Delay(1000);
        var after = UO.Sex();
        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.Sex() โ€” UO.Sex()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "sex": return new InjectionValue(bridge.Sex);

UO.Stam

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

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

dynamic UO.Stam();

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

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

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

๋ฐ˜ํ™˜๊ฐ’

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๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

  • ์ด ํ•„๋“œ์— ์ ์šฉ๋œ ์ž„๊ณ„๊ฐ’ ๋˜๋Š” ๊ณ„์‚ฐ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด์˜ ์ˆซ์ž๋Š” ์„œ๋ฒ„ ์ œํ•œ์ด ์•„๋‹Œ ์˜ˆ์‹œ ์„ค์ •์ž…๋‹ˆ๋‹ค. ์ตœ๋Œ€๊ฐ’์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ ์ „์— ์–‘์„ฑ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.Stam();
    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.Stam();
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.Stam() โ€” UO.Stam()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "stam": return new InjectionValue(bridge.Stamina);

UO.Stamina

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

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

int UO.Stamina();

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

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

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

๋ฐ˜ํ™˜๊ฐ’

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.Stamina();
UO.Print("Stamina: " + Convert.ToString(result));

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

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

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

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

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

  • ์ด ํ•„๋“œ์— ์ ์šฉ๋œ ์ž„๊ณ„๊ฐ’ ๋˜๋Š” ๊ณ„์‚ฐ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด์˜ ์ˆซ์ž๋Š” ์„œ๋ฒ„ ์ œํ•œ์ด ์•„๋‹Œ ์˜ˆ์‹œ ์„ค์ •์ž…๋‹ˆ๋‹ค. ์ตœ๋Œ€๊ฐ’์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ ์ „์— ์–‘์„ฑ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.Stamina();
    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.Stamina();
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.Stamina() โ€” UO.Stamina()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.Stamina

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


UO.Str

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

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

int UO.Str();

์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ํž˜(Strength)์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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.Str(), UO.Strength(), UO.GetStr() ๋˜๋Š” UO.GetStrength(). C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • value๋Š” ์ˆซ์ž ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ToString ์žก์ง€์šฉ์œผ๋กœ ํฌ๋งทํ•ฉ๋‹ˆ๋‹ค. ๋…ผ์Ÿ์ด๋‚˜ ์บ๋ฆญํ„ฐ ํ–‰๋™์ด ์—†์Šต๋‹ˆ๋‹ค.
var value = UO.Str();
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.Str();
    await Delay(1000);
    var after = UO.Str();
    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.Str();
        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.Str() โ€” UO.Str()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "str": return new InjectionValue(bridge.Strength);

UO.Strength

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

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

int UO.Strength();

์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ํŒŒ์›Œ(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.Strength();
UO.Print("Strength: " + Convert.ToString(result));

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

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

  • value๋Š” ์ˆซ์ž ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ToString ์žก์ง€์šฉ์œผ๋กœ ํฌ๋งทํ•ฉ๋‹ˆ๋‹ค. ๋…ผ์Ÿ์ด๋‚˜ ์บ๋ฆญํ„ฐ ํ–‰๋™์ด ์—†์Šต๋‹ˆ๋‹ค.
var value = UO.Strength();
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.Strength();
    await Delay(1000);
    var after = UO.Strength();
    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.Strength();
        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.Strength() โ€” UO.Strength()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.Strength

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


UO.TicksDead

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

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

int UO.TicksDead();

์ฒ˜์Œ์œผ๋กœ ์ธ์ง€๋œ ์ฃฝ์Œ์„ ์ฝ๊ฑฐ๋‚˜ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int โ€” UO.Timer ๋Ÿฐํƒ€์ž„ ์‹œ์ž‘ ํ›„ 10๋ถ„์˜ 1์ดˆ, ์ฒ˜์Œ์—๋Š” 0์ž…๋‹ˆ๋‹ค. ์‚ฌ๋ง์ž ์ˆ˜๋‚˜ ์‚ฌ๋ง ๊ธฐ๊ฐ„์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค bridge.Dead()!=0 ๋ฐ ticksDead==0์ด๋ฉด Timer()๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ด์ „ ticksDead์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ถ€ํ™œ ํ›„์—๋Š” ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ํ•„๋“œ๊ฐ€ ์žฌ์„ค์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” ์„œ๋ฒ„ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ์ •ํ™•ํ•œ ์‹œ๊ฐ„์ด ์•„๋‹ˆ๋ผ ์‚ฌ๋ง์ด ๊ด€์ธก๋œ ์‹œ์ ์˜ ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ TicksDead ํ‘œ์‹œ์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ 10๋ถ„์˜ 1์ดˆ ์•ˆ์— 0 ๊ฐ’์„ ์žฌ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ์ฒ˜์Œ์œผ๋กœ ์ธ์ง€๋œ ์ฃฝ์Œ์„ ์ฝ๊ฑฐ๋‚˜ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
UO.Print(UO.TicksDead());

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

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

  • ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค bridge.Dead()!=0 ๋ฐ ticksDead==0์ด๋ฉด Timer()๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ด์ „ ticksDead์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ถ€ํ™œ ํ›„์—๋Š” ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ํ•„๋“œ๊ฐ€ ์žฌ์„ค์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.IsDead()))
    {
        var stamp = UO.TicksDead();
        UO.Print(UO.Timer() - stamp);
    }

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

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

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

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.TicksDead() โ€” UO.TicksDead()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int TicksDead()

        {

            if (bridge.Dead() != 0 && ticksDead == 0)

                ticksDead = Timer();

            return ticksDead;

        }

UO.ToggleFly

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

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

void UO.ToggleFly();

์ž์‹ ์˜ ๊ฐ€๊ณ ์ผ ๋น„ํ–‰์„ ์ง€์ƒ์—์„œ ๋น„ํ–‰์œผ๋กœ, ๋น„ํ–‰์—์„œ ์ง€์ƒ์œผ๋กœ ์ „ํ™˜ํ•˜๋„๋ก ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์•ก์…˜์ด๋ฉฐ, UO.Flying()๋Š” ์ƒํƒœ๋งŒ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ํŠน์ • ๋ชจ๋“œ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ๋กœ ์ด์ „์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

void - ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. true/false๋‚˜ ์„œ๋ฒ„ ํ™•์ธ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์‘๋‹ต ์ฒ˜๋ฆฌ ํ›„ UO.Flying()๋ฅผ ํ†ตํ•ด ์‹ค์ œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ์œ ์ผํ•œ ํ˜•์‹์€ UO.ToggleFly()์ด๋ฉฐ ID์ด ์—†๊ณ  ์ขŒํ‘œ์™€ ๋งค๊ฐœ๋ณ€์ˆ˜ true/false๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์„ฑ๊ฒฉ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ mobile ํ•ญ๊ณตํŽธ์€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ํ•˜์œ„ ๋ช…๋ น 0x0032๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ 0xBF์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ํ˜ธ์ถœ ์ž์ฒด๋Š” ์ธ์ข…, ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „, ์„œ๋ฒ„ ๊ถŒํ•œ ๋˜๋Š” ํ˜„์žฌ ๋ชจ๋“œ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋น„ํ–‰ ๊ฐ€๋Šฅ ์„œ๋ฒ„์—์„œ ์ž์‹ ๋งŒ์˜ ๊ฐ€๊ณ ์ผ์„ ์„ ํƒํ•˜์„ธ์š”.
  • ์„œ๋ฒ„์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋Š” ๋‚˜์ค‘์— ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๋Œ€๊ธฐ ๋ฃจํ”„์—์„œ ToggleFly๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ๋งˆ์„ธ์š”. ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋ฉด ์ด์ „ ์Šค์œ„์น˜๊ฐ€ ์ทจ์†Œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‹œ๊ฐ„์ด ์ดˆ๊ณผ๋  ๋•Œ๊นŒ์ง€ Flying์„ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ๊ณ ๋„ Z์™€ ๋น„ํ–‰ ํ‘œ์‹œ๋Š” ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. UO.Flying()๋Š” int 1/true ๋˜๋Š” 0/false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. false๋Š” ๋ฌธ์ž๊ฐ€ ์—†๊ฑฐ๋‚˜ ์ด์ „ ํ”„๋กœํ† ์ฝœ์ธ ๊ฒฝ์šฐ์—๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋น„ํ–‰์„ ํ™œ์„ฑํ™”ํ•˜๊ณ  ๊ฒฐ๊ณผ ํ™•์ธ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

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

async Task<dynamic> EnsureFlight(dynamic timeoutMs)
{
    if (!(Truth(UO.Connected())) || Truth(UO.Dead()))
    {
        return false;
    }
    if (Truth(UO.Flying()))
    {
        return true;
    }
    UO.ToggleFly();
    var waited = 0;
    while (Truth(waited < timeoutMs))
    {
        if (!(Truth(UO.Connected())))
        {
            return false;
        }
        if (Truth(UO.Flying()))
        {
            return true;
        }
        await Delay(50);
        waited += 50;
    }
    return UO.Flying();
}

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;

2. ๋น„ํ–‰ ์ค‘์—๋งŒ ํƒ‘์Šน ์š”์ฒญ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ตœ๋Œ€ 40์€ 50 ms ๋™์•ˆ ๋Œ€๊ธฐํ•˜๋ฉฐ ์š”์ฒญ์€ ๋‹จ ํ•œ ๋ฒˆ์ž…๋‹ˆ๋‹ค. Connected ํ™•์ธ์€ ์ •์ง€๊ฐ€ ์„ฑ๊ณต์ ์ธ ์ฐฉ๋ฅ™์œผ๋กœ ๋ฐ›์•„๋“ค์—ฌ์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ผ์‹œ ์ค‘์ง€ํ•˜๋ฉด ์‹ค์ œ ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    if (Truth(UO.Connected()) && Truth(UO.Flying()))
    {
        UO.ToggleFly();
        var checks = 0;
        while (Truth(UO.Connected()) && Truth(UO.Flying()) && Truth(checks < 40))
        {
            await Delay(50);
            checks += 1;
        }

        if (Truth(UO.Connected()) && !(Truth(UO.Flying())))
        {
            UO.Print("Landing state observed");
        }
        else
        {
            UO.Print("Landing not confirmed");
        }
    }

    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. ๋‹จ์ถ•ํ‚ค์— ๋Œ€ํ•œ ์ˆ˜๋™ ํ† ๊ธ€ ๋ช…๋ น - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ํ•˜๋‚˜์˜ ์ „ํ™˜ ์š”์ฒญ์— ๋Œ€ํ•ด ํ‚ค์— Main์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. EnsureFlight์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋น„ํ–‰ ์š”์ฒญ ์ค‘์— ๋‹ค์‹œ ๋ˆ„๋ฅด์„ธ์š”. ํ‚ค ๋ฐ˜๋ณต ๋˜๋Š” ๋‘ ๊ฐœ์˜ ๋ณ‘๋ ฌ ์Šคํฌ๋ฆฝํŠธ๋Š” ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋ฆฌ๋ฏธํ„ฐ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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.Connected()) && !(Truth(UO.Dead())))
        {
            UO.ToggleFly();
        }

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "togglefly": bridge.ToggleFly(); return InjectionValue.Unit;
โš ๏ธ **GitHub.com Fallback** โš ๏ธ