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

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

๋ฉ€ํ‹ฐ & ํ•˜์šฐ์Šค

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

์„ธ๊ณ„์˜ ๋ณตํ•ฉ ๊ฐœ์ฒด: ์ง‘๊ณผ ๊ธฐํƒ€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€, ์ง€๋„์—์„œ์˜ ํ•ด๋‹น ๋ถ€๋ถ„ ๋ฐ ์œ„์น˜.

์„น์…˜

์ฃผ์ œ ๋ช…๋ น ๋ฐ ์„ค๋ช…
GetMultis UO.GetMultis
Multi Parts UO.GetMultiAllParts
Parts at Position UO.GetMultiPartsAtPosition
IsHouse UO.IsHouse

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

๋ฉ€ํ‹ฐ/ํ•˜์šฐ์Šค

UO.GetMultis ยท UO.GetMultiAllParts ยท UO.GetMultiPartsAtPosition ยท UO.IsHouse

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

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

UO.GetMultis

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

var items = UO.GetMultis();
UO.Print(Convert.ToString(ArrayLength(items)));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

UO.GetMultiAllParts

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

var houses = UO.GetMultis();
if (Truth(ArrayLength(houses) == 0))
{
    return null;
}
var parts = UO.GetMultiAllParts(houses[0]);
UO.Print(Convert.ToString(ArrayLength(parts)));

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;

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


UO.GetMultiAllParts

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

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

dynamic UO.GetMultiAllParts(object? multiID);

ํ•œ ์ง‘์˜ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ๊ธฐ๋ก์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • multiID โ€” ํŠน์ • ๊ฐ์ฒด์˜ ์ผ๋ จ๋ฒˆํ˜ธ/ID: int, 10์ง„์ˆ˜/16์ง„์ˆ˜ ๋ฌธ์ž์—ด ๋˜๋Š” ๋ณ„์นญ ์„ค์ • self, backpack, lasttarget, lastobject ๋˜๋Š” ์ด๋ฆ„ AddObject. ์ด๊ฒƒ์€ graphic/type์ด ์•„๋‹™๋‹ˆ๋‹ค. HouseManager์—๋Š” ์ง‘์— ID๊ฐ€ ๋กœ๋“œ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

๋ฐฐ์—ด<๋ฐฐ์—ด>. ๊ฐ ์ค„์—๋Š” 9 ํ•„๋“œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค: [0] graphic/type ๊ตฌ์„ฑ์š”์†Œ, [1] hue, [2] world X, [3] world Y, [4] ์„ธ๊ณ„ Z, [5] multiOffsetX - ๋‹ค์ค‘์˜ ์˜คํ”„์…‹ X, [6] multiOffsetY - ์˜คํ”„์…‹ Y, [7] multiOffsetZ - ์˜คํ”„์…‹ Z, [8] multiSerial - serial ์ง‘์—์„œ. ๊ตฌ์„ฑ์š”์†Œ ์—†์Œ - ๋นˆ ๋ฐฐ์—ด. ๊ทธ๋ž˜ํ”ฝ์ด ID๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ •์  ๊ตฌ์„ฑ ์š”์†Œ์—๋Š” ์—ฌ๊ธฐ์— ์ž์ฒด serial์ด ์—†์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด๋ฏธ ๋‹ค์šด๋กœ๋“œํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ „์ฒด ์„œ๋ฒ„์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์—ด๊ฑฐ๋‚˜ ํ•ญ๋ชฉ์„ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ๊ฐœ์ฒด๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด - 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. var์— ์ €์žฅํ•˜๊ณ , ArrayLength๋ฅผ ํ™•์ธํ•œ ํ›„ ์ ‘์†ํ•˜์„ธ์š”. ์Šค๋ƒ…์ƒท์„ ์ฐ์€ ํ›„ ์š”์†Œ๊ฐ€ ์„ธ๊ณ„์—์„œ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ธฐ ์ „์— Exists(serial)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
  • ์•Œ๋ ค์ง„ ์‚ญ์ œ๋˜์ง€ ์•Š์€ ๊ตฌ์„ฑ ์š”์†Œ HouseManager๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ์ •์  ์ง€๋„์™€ ํ† ์ง€๋Š” ์ด ๋ชฉ๋ก์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ–‰์€ ์Šค๋ƒ…์ƒท์ž…๋‹ˆ๋‹ค. ๊ณ ์ • ์ˆœ์„œ ๋˜๋Š” Z ์ •๋ ฌ์€ ์•ฝ์†๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

var multis = (object?[])UO.GetMultis();
if (multis.Length > 0) {
    var parts = (object?[])UO.GetMultiAllParts(multis[0]);
    UO.Print("Parts: " + parts.Length);
}

1. ๊ตฌ์„ฑ์š”์†Œ ๊ณ„์‚ฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋จผ์ €, ๋กœ๋“œ๋œ ์ฃผํƒ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธธ์ด๋Š” ๋†’์ด๋‚˜ ์ฃผํƒ ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ตฌ์„ฑ์š”์†Œ์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค.
var houses = UO.GetMultis();
if (Truth(ArrayLength(houses) == 0))
{
    return null;
}
var parts = UO.GetMultiAllParts(houses[0]);
UO.Print(Convert.ToString(ArrayLength(parts)));

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 ์ฝ๊ธฐ ๋ฐ ์ฒซ ๋ฒˆ์งธ ๊ตฌ์„ฑ์š”์†Œ ์œ„์น˜ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • parts[0]๋Š” ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์ž…๋‹ˆ๋‹ค. ๊ทธ๋…€์˜ [0] - type, [2]/[3]/[4] - ์„ธ๊ณ„ X/Y/Z.
  • ๋Œ€์‹  ์ธ๋ฑ์Šค [5]/[6]/[7]์—๋Š” ์ƒ๋Œ€ ์˜คํ”„์…‹์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var houses = UO.GetMultis();
    if (Truth(ArrayLength(houses) == 0))
    {
        return null;
    }

    var parts = UO.GetMultiAllParts(houses[0]);
    if (Truth(ArrayLength(parts) > 0))
    {
        var part = parts[0];
        UO.Print("Type: 0x" + Hex(part[0]));
        UO.Print(Convert.ToString(part[2]) + "," + Convert.ToString(part[3]) + "," + Convert.ToString(part[4]));
    }

    return null;
}

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

3. ํŠธ๋ž˜๋ฒ„์Šค ๊ตฌ์„ฑ ์š”์†Œ ๋ฐ ์ถœ๋ ฅ ์†Œ์œ ์ž - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • [8]๋Š” ์ง‘์—์„œ serial์ด๊ณ , [7]๋Š” Z ๊ตฌ์„ฑ์š”์†Œ์˜ ์˜คํ”„์…‹์ž…๋‹ˆ๋‹ค.
  • ์ง‘์—์„œ serial๊ฐ€ ์˜ˆ์ƒ๋˜๋Š” ๋ช…๋ น์— ๋ถ€๋ถ„[0]์„ ์ „๋‹ฌํ•˜์ง€ ๋งˆ์„ธ์š”. ์ด๋Š” ๋ณ„๋„์˜ ๊ตฌ์„ฑ์š”์†Œ์˜ graphic์ž…๋‹ˆ๋‹ค.
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 houses = UO.GetMultis();
        if (Truth(ArrayLength(houses) == 0))
        {
            return null;
        }

        var parts = UO.GetMultiAllParts(houses[0]);
        var i = 0;
        while (Truth(i < ArrayLength(parts)))
        {
            var part = parts[i];
            UO.Print("Multi: 0x" + Hex(part[8]) + ", offset Z: " + Convert.ToString(part[7]));
            i = i + 1;
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetMultiAllParts(multiID) โ€” UO.GetMultiAllParts(Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getmultiallparts":

                    return new InjectionValue((bridge.GetMultiAllParts(Arg(0)) ?? Array.Empty<int[]>())

                        .Select(part => new InjectionValue((part ?? Array.Empty<int>()).Select(value => new InjectionValue(value)).ToArray())).ToArray());

UO.GetMultiPartsAtPosition

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

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

dynamic UO.GetMultiPartsAtPosition(object? x, object? y);

์ง€์ •๋œ ์›”๋“œ ์…€์— ์žˆ๋Š” ์ฃผํƒ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • x โ€” ์ง‘ ๋‚ด๋ถ€ ์˜คํ”„์…‹์ด ์•„๋‹Œ ํ˜„์žฌ ์ง€๋„ ์…€์˜ ์„ธ๊ณ„ X ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค.
  • y โ€” ์…€์˜ ์„ธ๊ณ„ ์ขŒํ‘œ Y. ๋ชจ๋“  Z ๋†’์ด์—์„œ ์ด ์…€์— ๋กœ๋“œ๋œ ๋ชจ๋“  ์ฃผํƒ์˜ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

๋ฐฐ์—ด<๋ฐฐ์—ด>. ๊ฐ ์ค„์—๋Š” 9 ํ•„๋“œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค: [0] graphic/type ๊ตฌ์„ฑ์š”์†Œ, [1] hue, [2] world X, [3] world Y, [4] ์„ธ๊ณ„ Z, [5] multiOffsetX - ๋‹ค์ค‘์˜ ์˜คํ”„์…‹ X, [6] multiOffsetY - ์˜คํ”„์…‹ Y, [7] multiOffsetZ - ์˜คํ”„์…‹ Z, [8] multiSerial - serial ์ง‘์—์„œ. ๊ตฌ์„ฑ์š”์†Œ ์—†์Œ - ๋นˆ ๋ฐฐ์—ด. ๊ทธ๋ž˜ํ”ฝ์ด ID๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ •์  ๊ตฌ์„ฑ ์š”์†Œ์—๋Š” ์—ฌ๊ธฐ์— ์ž์ฒด serial์ด ์—†์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด๋ฏธ ๋‹ค์šด๋กœ๋“œํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ „์ฒด ์„œ๋ฒ„์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์—ด๊ฑฐ๋‚˜ ํ•ญ๋ชฉ์„ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ๊ฐœ์ฒด๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด - 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. var์— ์ €์žฅํ•˜๊ณ , ArrayLength๋ฅผ ํ™•์ธํ•œ ํ›„ ์ ‘์†ํ•˜์„ธ์š”. ์Šค๋ƒ…์ƒท์„ ์ฐ์€ ํ›„ ์š”์†Œ๊ฐ€ ์„ธ๊ณ„์—์„œ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ธฐ ์ „์— Exists(serial)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
  • ์•Œ๋ ค์ง„ ์‚ญ์ œ๋˜์ง€ ์•Š์€ ๊ตฌ์„ฑ ์š”์†Œ HouseManager๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ์ •์  ์ง€๋„์™€ ํ† ์ง€๋Š” ์ด ๋ชฉ๋ก์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ–‰์€ ์Šค๋ƒ…์ƒท์ž…๋‹ˆ๋‹ค. ๊ณ ์ • ์ˆœ์„œ ๋˜๋Š” Z ์ •๋ ฌ์€ ์•ฝ์†๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ๊ตฌ์„ฑ์š”์†Œ ๊ณ„์‚ฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • X/Y - ์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ์œ„์น˜.
  • ๊ธธ์ด๋Š” ๋†’์ด๋‚˜ ์ฃผํƒ ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ตฌ์„ฑ์š”์†Œ์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค.
var parts = UO.GetMultiPartsAtPosition(UO.GetX(), UO.GetY());
UO.Print(Convert.ToString(ArrayLength(parts)));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

2. graphic ์ฝ๊ธฐ ๋ฐ ์ฒซ ๋ฒˆ์งธ ๊ตฌ์„ฑ์š”์†Œ ์œ„์น˜ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • parts[0]๋Š” ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์ž…๋‹ˆ๋‹ค. ๊ทธ๋…€์˜ [0] - type, [2]/[3]/[4] - ์„ธ๊ณ„ X/Y/Z.
  • ๋Œ€์‹  ์ธ๋ฑ์Šค [5]/[6]/[7]์—๋Š” ์ƒ๋Œ€ ์˜คํ”„์…‹์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var parts = UO.GetMultiPartsAtPosition(UO.GetX(), UO.GetY());
    if (Truth(ArrayLength(parts) > 0))
    {
        var part = parts[0];
        UO.Print("Type: 0x" + Hex(part[0]));
        UO.Print(Convert.ToString(part[2]) + "," + Convert.ToString(part[3]) + "," + Convert.ToString(part[4]));
    }

    return null;
}

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

3. ํŠธ๋ž˜๋ฒ„์Šค ๊ตฌ์„ฑ ์š”์†Œ ๋ฐ ์ถœ๋ ฅ ์†Œ์œ ์ž - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • [8]๋Š” ์ง‘์—์„œ serial์ด๊ณ , [7]๋Š” Z ๊ตฌ์„ฑ์š”์†Œ์˜ ์˜คํ”„์…‹์ž…๋‹ˆ๋‹ค.
  • ์ง‘์—์„œ serial๊ฐ€ ์˜ˆ์ƒ๋˜๋Š” ๋ช…๋ น์— ๋ถ€๋ถ„[0]์„ ์ „๋‹ฌํ•˜์ง€ ๋งˆ์„ธ์š”. ์ด๋Š” ๋ณ„๋„์˜ ๊ตฌ์„ฑ์š”์†Œ์˜ graphic์ž…๋‹ˆ๋‹ค.
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 parts = UO.GetMultiPartsAtPosition(UO.GetX(), UO.GetY());
        var i = 0;
        while (Truth(i < ArrayLength(parts)))
        {
            var part = parts[i];
            UO.Print("Multi: 0x" + Hex(part[8]) + ", offset Z: " + Convert.ToString(part[7]));
            i = i + 1;
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetMultiPartsAtPosition(x, y) โ€” UO.GetMultiPartsAtPosition(Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getmultipartsatposition":

                    return new InjectionValue((bridge.GetMultiPartsAtPosition(Arg(0), Arg(1)) ?? Array.Empty<int[]>())

                        .Select(part => new InjectionValue((part ?? Array.Empty<int>()).Select(value => new InjectionValue(value)).ToArray())).ToArray());

UO.GetMultis

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

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

dynamic UO.GetMultis();

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ™ˆ/๋ฉ€ํ‹ฐ๋กœ ์ธ์‹ํ•œ ๋กœ๋“œ๋œ ๊ฐœ์ฒด ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

๋ฐฐ์—ด์€ IsHouse๊ฐ€ 1๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์›”๋“œ ์•„์ดํ…œ์˜ serial์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๊ฐ์ฒด๊ฐ€ ์—†์œผ๋ฉด ๋นˆ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ID ์ฃผํƒ์ด๋ฉฐ ๊ทธ๋ž˜ํ”ฝ ๊ตฌ์„ฑ ์š”์†Œ ๋ชฉ๋ก๋„ ์•„๋‹ˆ๊ณ  ์ขŒํ‘œ ๋ชฉ๋ก๋„ ์•„๋‹ˆ๋ฉฐ ์„œ๋ฒ„์˜ ๋ชจ๋“  ์ฃผํƒ ๋ชฉ๋ก๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด๋ฏธ ๋‹ค์šด๋กœ๋“œํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ „์ฒด ์„œ๋ฒ„์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์—ด๊ฑฐ๋‚˜ ํ•ญ๋ชฉ์„ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ๊ฐœ์ฒด๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด - 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. var์— ์ €์žฅํ•˜๊ณ , ArrayLength๋ฅผ ํ™•์ธํ•œ ํ›„ ์ ‘์†ํ•˜์„ธ์š”. ์Šค๋ƒ…์ƒท์„ ์ฐ์€ ํ›„ ์š”์†Œ๊ฐ€ ์„ธ๊ณ„์—์„œ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ธฐ ์ „์— Exists(serial)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
  • ๋กœ๋“œ๋œ ์›”๋“œ ์•„์ดํ…œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ํ•œ ์ง‘์˜ ๊ตฌ์„ฑ ์š”์†Œ์—๋Š” GetMultiAllParts(serial)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

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

1. ๋ชฉ๋ก ํฌ๊ธฐ ๊ฐ€์ ธ์˜ค๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋กœ๋“œ๋œ ํ•˜์šฐ์Šค/๋ฉ€ํ‹ฐ ์•„์ดํ…œ์ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.
  • ๊ธธ์ด - ๋ ˆ์ฝ”๋“œ ์ˆ˜/ID. ์ด๊ฒƒ์€ ์Šคํƒ์˜ ์–‘์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋นˆ ๋ชฉ๋ก์€ 0์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
var items = UO.GetMultis();
UO.Print(Convert.ToString(ArrayLength(items)));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

2. ๋ฐœ๊ฒฌ๋œ ๋ชจ๋“  ํ•ญ๋ชฉ ํƒ์ƒ‰ ID - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋กœ๋“œ๋œ ํ•˜์šฐ์Šค/๋ฉ€ํ‹ฐ ์•„์ดํ…œ์ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.
  • items[i] โ€” ์ˆซ์ž serial. 16์ง„์ˆ˜๋Š” ์ถœ๋ ฅ์—๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ฃจํ”„๋Š” ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค์— ์•ก์„ธ์Šคํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var items = UO.GetMultis();
    var i = 0;
    while (Truth(i < ArrayLength(items)))
    {
        UO.Print("0x" + Hex(items[i]));
        i = i + 1;
    }

    return null;
}

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

3. ์ฝ๊ธฐ ์ „์— ์ฒซ ๋ฒˆ์งธ ๊ธฐ๋ก์„ ํ™•์ธํ•˜์„ธ์š” - ์Šคํฌ๋ฆฝํŠธ ์ˆ˜์—…

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

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

     public object? RunScenario()
    {
        var items = UO.GetMultis();
        if (Truth(ArrayLength(items) > 0))
        {
            var first = items[0];
            if (Truth(UO.Exists(first)))
            {
                UO.Print(UO.GetName(first));
            }
        }
        else
        {
            UO.Print("Empty list");
        }

        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;
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetMultis() โ€” UO.GetMultis()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getmultis":

                    return new InjectionValue(bridge.GetWorldItems().Where(id => bridge.IsHouse(id) != 0).Select(id => new InjectionValue(id)).ToArray());

UO.IsHouse

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

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

int UO.IsHouse(object? objID);

๋กœ๋“œ๋œ ๊ฐœ์ฒด(์ง‘, ๋ฐฐ ๋˜๋Š” ๊ธฐํƒ€ ๋‹ค์ค‘ ํƒ€์ผ ๊ตฌ์กฐ)์— ๋Œ€ํ•œ ๋‹ค์ค‘ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int 1 - IsMulti ์†์„ฑ์„ ๊ฐ€์ง„ ์•„์ดํ…œ. int 0 - ์ผ๋ฐ˜ ๊ฐœ์ฒด, mobile, ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์›๊ฒฉ ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„์€ ๊ฒฐ๊ณผ๋ฅผ ์ฃผํƒ์œผ๋กœ ์ œํ•œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐฐ๋Š” 1๋„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒ€์€ ์ง‘์ฃผ์ธ, ์ง€์—ญ ๋˜๋Š” ์ง€์—ญ์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๋™์ž‘

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

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

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

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

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

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

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

1. ์„ ํƒํ•œ ๋””์ž์ธ ํ™•์ธ - ๋‹ค์ด๋ ‰ํŠธ ์Šคํฌ๋ฆฝํŠธ

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

  • ํƒ€๊ฒŸ์€ ๊ฐœ๋ณ„ ๋ฒฝ์˜ graphic์ด ์•„๋‹Œ ๋‹ค์ค‘ ๊ฐ์ฒด์˜ serial๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • 1๋Š” ํด๋ž˜์Šค ๋ฉ€ํ‹ฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ•ด๋‹น ๊ตฌ์กฐ๋ฌผ์ด ์ฃผ๊ฑฐ์šฉ ๊ฑด๋ฌผ์ด๋ผ๋Š” ์ฆ๊ฑฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsHouse(target)))
{
    UO.Print("Loaded multi structure");
}

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

2. ๋ฉ€ํ‹ฐ์™€ ์ผ๋ฐ˜ ์•„์ดํ…œ ๋ถ„๋ฆฌ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋จผ์ € ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ ๋‹ค์Œ mobile๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • Exists๊ฐ€ ์—†๋Š” 0์€ ์ผ๋ฐ˜ ๊ฐœ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐœ์ฒด๊ฐ€ ์—†์Œ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(target)))
    {
        if (Truth(UO.IsNPC(target) == 0))
        {
            if (Truth(UO.IsHouse(target)))
            {
                UO.Print("Multi");
            }
            else
            {
                UO.Print("Ordinary 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. ์บ๋ฆญํ„ฐ์˜ ์œ„์น˜์™€ ์ง‘ ๊ฐœ์ฒด๋ฅผ ํ˜ผ๋™ํ•˜์ง€ ๋งˆ์„ธ์š” - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

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

  • self๋Š” mobile์ด๋ฏ€๋กœ ์ง‘ ์•ˆ์—์„œ๋„ ์ฒซ ๋ฒˆ์งธ ๊ฒฐ๊ณผ๋Š” 0์ž…๋‹ˆ๋‹ค.
  • ๊ตฌ๋ฌธ์„ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด ์ž์ฒด 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 selfIsMulti = UO.IsHouse("self");
        var selectedIsMulti = UO.IsHouse("lasttarget");
        UO.Print("Self: " + Convert.ToString(selfIsMulti));
        UO.Print("Selected object: " + Convert.ToString(selectedIsMulti));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "ishouse": return new InjectionValue(bridge.IsHouse(Arg(0)));
โš ๏ธ **GitHub.com Fallback** โš ๏ธ