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

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Будинки та складені об’єкти

Головна · C# · IDE · Команди UO · За абеткою · Приклади · Мови

Будинки та інші складені об’єкти світу (multi): їхні частини, розташування й перевірка об’єкта в заданій точці.

Розділи

Тема Команди та пояснення
Список складених об’єктів UO.GetMultis
Частини складеного об’єкта UO.GetMultiAllParts
Частини об’єкта в точці UO.GetMultiPartsAtPosition
Перевірка будинку 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 — Serial/ID конкретного об'єкта: int, десятковий/hex-рядок або встановлений аліас self, backpack, lasttarget, lastobject або ім'я AddObject. Це не graphic/type. Має бути ID завантаженого будинку в HouseManager.

Повернене значення

Array<Array>. Кожен рядок містить 9 полів: [0] graphic/type компоненти, [1] hue, [2] світовий X, [3] світовий Y, [4] світовий Z, [5] multiOffsetX - Зміщення X від multi, [6] multiOffsetY - Зміщення Y, [7] multiOffsetZ - Зміщення Z, [8] multiSerial — serial вдома. Немає компонентів - порожній Array. Graphic не є ID; в окремих статичних компонентів тут немає власного serial.

Поведінка

  • Читаються дані, які вже завантажені клієнтом. Команда не відкриває контейнер, не переміщає предмети та не завантажує об'єкти з усього сервера.
  • Array - масив з індексами від 0. Зберігайте його у var, перевіряйте ArrayLength перед доступом. Елементи можуть зникнути зі світу після зйомки: перед дією перевіряйте Exists(serial).
  • Повертаються відомі, не видалені компоненти HouseManager. Окрема статика карти та land до цього списку не входять. Рядки є знімком; фіксований порядок або сортування за Z не обіцяються.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні 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 компоненти.
  • Не передавайте part[0] у команду, що очікує serial вдома: це 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.

Повернене значення

Array<Array>. Кожен рядок містить 9 полів: [0] graphic/type компоненти, [1] hue, [2] світовий X, [3] світовий Y, [4] світовий Z, [5] multiOffsetX - Зміщення X від multi, [6] multiOffsetY - Зміщення Y, [7] multiOffsetZ - Зміщення Z, [8] multiSerial — serial вдома. Немає компонентів - порожній Array. Graphic не є ID; в окремих статичних компонентів тут немає власного serial.

Поведінка

  • Читаються дані, які вже завантажені клієнтом. Команда не відкриває контейнер, не переміщає предмети та не завантажує об'єкти з усього сервера.
  • Array - масив з індексами від 0. Зберігайте його у var, перевіряйте ArrayLength перед доступом. Елементи можуть зникнути зі світу після зйомки: перед дією перевіряйте Exists(serial).
  • Повертаються відомі, не видалені компоненти HouseManager. Окрема статика карти та land до цього списку не входять. Рядки є знімком; фіксований порядок або сортування за Z не обіцяються.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні 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 компоненти.
  • Не передавайте part[0] у команду, що очікує serial вдома: це 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();

Список завантажених об'єктів, розпізнаних клієнтом як дома/multi.

Параметри

Параметрів немає.

Повернене значення

Array — serial предметів світу, для яких IsHouse повертає 1. Порожній Array, якщо таких об'єктів немає. Це ID будинків, не список компонентів графіки, не координати і не список всіх будинків сервера.

Поведінка

  • Читаються дані, які вже завантажені клієнтом. Команда не відкриває контейнер, не переміщає предмети та не завантажує об'єкти з усього сервера.
  • Array - масив з індексами від 0. Зберігайте його у var, перевіряйте ArrayLength перед доступом. Елементи можуть зникнути зі світу після зйомки: перед дією перевіряйте Exists(serial).
  • Дані читаються із завантажених предметів світу. Для компонентів одного будинку використовуйте GetMultiAllParts(serial).

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

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

1. Отримати розмір списку – прямий скрипт

Параметри та порядок виконання:

  • Параметрів немає; вибираються завантажені предмети будинків/multi.
  • Довжина – число записів/ID. Це не сума Amount у стопках. Порожній список дає 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 — функція сценарію

Параметри та порядок виконання:

  • Параметрів немає; вибираються завантажені предмети будинків/multi.
  • items[i] - числовий serial. Hex використовується лише для виведення. Цикл не звертається за останнім індексом.
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. Перевірити перший запис перед читанням – клас сценарію

Параметри та порядок виконання:

  • Параметрів немає; вибираються завантажені предмети будинків/multi.
  • Перевіряються дві різні речі: запис у знімку та існування об'єкту зараз. Порядок без явного сортування означає близькість.
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);

Перевіряє ознаку multi у завантаженого об'єкта: будинку, корабля або іншої багатотайлової конструкції.

Параметри

  • objID — Обов'язковий serial/ID конкретного об'єкта: int, hex-рядок або аліас self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse або ім'я AddObject. Це не graphic/type. Невстановлене ім'я дозволяється у 0; ніякий новий target команда не відкриває.

Повернене значення

int 1 - предмет з ознакою IsMulti. int 0 — звичайний предмет, mobile, невідомий чи віддалений об'єкт. Назва не обмежує результат будинками: корабель також може дати 1. Команда не повертає власника будинку, регіону чи площі.

Результат команди — числовий прапор: 1 означає виконану умову, 0 — невиконану. Після var result = команда (...) перевіряйте if (result != 0) або if (result == 0). Збережіть результат одного виклику: повторний виклик може виконати дію знову або прочитати стан, що вже змінився.

Поведінка

  • Читається локальна модель клієнта; запитів серверу, очікування та переміщення немає.
  • Результат відноситься до моменту читання. Після UO.Wait або іншої дії об'єкт та його прапори можуть змінитися.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

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

1. Перевірити вибрану конструкцію – прямий скрипт

Параметри та порядок виконання:

  • target повинен містити serial об'єкта multi, а не graphic окремої стіни.
  • 1 означає клас multi; це не доказ, що конструкція є саме житловим будинком.
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. Відокремити multi від звичайного предмета – функція сценарію

Параметри та порядок виконання:

  • Спочатку перевіряється наявність, потім виключаються mobile.
  • Нуль без Exists міг би означати відсутність об'єкта, а чи не звичайний предмет.
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** ⚠️