Skip to content

UO Topic containers

Codex edited this page Oct 12, 2026 · 6 revisions

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

Сумка та контейнери

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

Відкриття сумки, банку й інших контейнерів, читання їхнього вмісту та вибір контейнера для перенесення предметів. Якщо вміст ще не отримано від сервера, клієнт може не бачити всіх предметів.

Розділи

Тема Команди та пояснення
Сумка персонажа UO.Backpack
Банк UO.ObjAtLayerEx · UO.OpenContainer
Відкриття контейнера UO.OpenContainer
Останній контейнер UO.LastContainer
Контейнер предмета UO.ContainerOf · UO.GetParent
Перевірка контейнера UO.IsContainer
Вкладені контейнери UO.GetContent · UO.FindTypeEx · UO.FindTypesArrayEx
Контейнер призначення UO.SetReceivingContainer · UO.UnsetReceivingContainer
Сумка для отримання предметів UO.SetCatchBag · UO.UnsetCatchBag
Перенесення між контейнерами UO.MoveItem · UO.MoveItems · UO.MassMove · UO.EmptyContainer

Усі команди теми

Сумка та земля

UO.Backpack · UO.Ground

Відкриття контейнера

UO.OpenContainer

Останній контейнер

UO.LastContainer

Контейнер предмета

UO.ContainerOf · UO.GetParent · UO.ContainerOff

Перевірка контейнера

UO.IsContainer

Вкладені контейнери

UO.GetContent

Контейнер призначення

UO.SetReceivingContainer · UO.UnsetReceivingContainer

Сумка для отримання предметів

UO.SetCatchBag · UO.UnsetCatchBag

Приклади на тему

Нижче наведено короткі приклади. У повному описі кожної команди є параметри, результат, обмеження та кілька самостійних скриптів: прямий код, варіант із функцією та варіант із класом.

UO.OpenContainer

Параметри, результат та всі сценарії

UO.OpenContainer("lasttarget");

UO.EmptyContainer

Параметри, результат та всі сценарії

UO.Print("Select a chest or corpse");
var sent = UO.EmptyContainer(350);
if (Truth(sent == 0))
{
    UO.Print("Cancelled, empty, unavailable, or a transfer failed");
}

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

Повний опис команд


UO.Backpack

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

C#-сигнатури

int UO.Backpack();

Повертає ID одягненого рюкзака поточного персонажа.

Параметри

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

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

int — serial/ID, не graphic/type, шар, кількість предметів або bool. 0 — поточного об'єкта немає. Зберігаються всі 32 біта serial; перевіряйте != 0, не == true або > 0. Збережений результат сам не оновлюється. Шукає невіддалений предмет на шарі Backpack поточного Player. Немає/знищений Player, немає рюкзака або сумка видалена - 0. Повертає контейнер, який не містить; нову сумку не створює.

Поведінка

  • Параметрів немає. Читає локальні дані через Invoke на ігровому потоці; скасування скрипта перериває очікування цього потоку. Не надсилає пакет, не відкриває контейнер/target і не переносить предмет.
  • Вбудований self/backpack без дужок читається заново, якщо його не перекрила змінна скрипта. Строкові імена обробляє команда, що приймає. У призначенні перенесення "self" означає рюкзак, а UO.Self() повертає serial персонажа. Для ID контейнера явно використовуйте UO.Backpack().
  • World.Clear видаляє Player; наступні читання дають 0. Вхід у світ або заміна сумки можуть змінити ID. Окремі читання не є атомарними. Ненульова ID не доводить підключення, дозвіл сервера або завантаження вмісту.

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

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

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

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

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

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

1. Прочитати та вивести ID — прямий скрипт

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

  • id зберігає результат одного дзвінка; HEX форматує serial для журналу. Приклад нічого не вибирає та не використовує.
var id = UO.Backpack();
UO.Print("ID: " + Hex(id));

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

2. Виявити зміну ID — функція сценарію

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

  • before/after читаються з інтервалом 250 мс. UO.Wait доданий лише у приклад. Рівність означає однакові кінцеві ID; проміжні зміни можуть бути пропущені.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.Backpack();
    await Delay(250);
    var after = UO.Backpack();
    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 - клас сценарію

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

  • candidate - збережений ID LastTarget. IsOwnSerial(candidate) приймає один serial і повертає bool: true для поточного ненулевого власного ID, інакше false. Визначення функції наведено повністю; target не змінюється.
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.Backpack();
        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.Backpack() — UO.Backpack()

Параметри: Немає параметрів.

Результат: int / Integer.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "backpack": return new InjectionValue(bridge.Backpack);

UO.ContainerOf

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

C#-сигнатури

string UO.ContainerOf(object? name);

Читає безпосереднього батька предмета.

Параметри

  • name — Serial/ID конкретного об'єкта: int, десятковий/hex-рядок або встановлений аліас self, backpack, lasttarget, lastobject або ім'я AddObject. Це не graphic/type.

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

string виду "0x40001234" - serial контейнера / персонажа-власника. Для предмета землі це " 0x00000000" чи " 0xFFFFFFFF " . Для невідомого імені/об'єкта або Mobile - "0x00000000". Це не graphic контейнер, не ID самого предмета та не кореневий власник вкладеної сумки.

Поведінка

  • Читається поле Container локального предмета без рекурсивного обходу і звернення до сервера. Перевіряйте Exists до інтерпретації нульового результату. Ground використовує два допустимі уявлення.

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

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

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

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

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

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

1. Дізнатись контейнер предмета — прямий скрипт

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

  • item - serial знайденої стопки. type=0x0EED передається лише FindType.
  • parent означає безпосередній рюкзак, не персонажа, в якому знаходиться рюкзак.
var item = UO.FindType(0x0EED, -1, "backpack");
if (Truth(item != ""))
{
    var parent = UO.ContainerOf(item);
    UO.Print(Convert.ToString(parent));
}

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

2. Дізнатись власника рюкзака — функція сценарію

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

  • Аргументом є рюкзак.
  • Батьком екіпірованого рюкзака буде serial персонажа.
return  RunScenario();
 object? RunScenario()
{
    var bag = UO.GetSerial("backpack");
    if (Truth(UO.Exists(bag)))
    {
        UO.Print(Convert.ToString(UO.ContainerOf(bag)));
    }

    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. Перевірити предмет на землі - клас сценарію

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

  • GetContent("ground") дає ID предметів поза контейнерами.
  • Обидва уявлення землі допустимі. Одного нульового батька без Exists недостатньо для виведення положення предмета.
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.GetContent("ground");
        if (Truth(ArrayLength(items) > 0))
        {
            var item = items[0];
            if (Truth(UO.Exists(item)))
            {
                UO.Print(Convert.ToString(UO.ContainerOf(item)));
            }
        }

        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.ContainerOf(name) — UO.ContainerOf(Any)

Параметри: name (Any)

Результат: string / String.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public string ContainerOf(InjectionValue name)

        {

            if (TryGetObject(name, out int id))

            {

                var containerId = bridge.ContainerOf(id);

                if (containerId < 0)

                    return "0xFFFFFFFF";



                return $"0x{containerId:X8}";

            }



            return "0x00000000";

        }

UO.ContainerOff

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

C#-сигнатури

void UO.ContainerOff();

Скидає призначений одержуючий контейнер runtime.

Параметри

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

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

void - значення, що повертається немає.

Поведінка

  • Викликає UnsetReceivingContainer та записує State.ReceivingContainer=0. Наступні операції Grab без явного призначення використовують рюкзак, якщо він доступний. Предмети не переміщуються та вікно контейнера не закривається.

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

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

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

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

Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.

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

1. Скинути призначення – прямий скрипт

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

  • Стан ReceivingContainer стає 0.
UO.ContainerOff();

2. Скидання після призначення – функція сценарію

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

  • Призначення очищується; дія не переміщує вміст.
return  RunScenario();
 object? RunScenario()
{
    UO.SetReceivingContainer("backpack");
    UO.ContainerOff();
    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()
    {
        UO.ContainerOff();
        UO.ContainerOff();
        return null;
    }
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.ContainerOff() — UO.ContainerOff()

Параметри: Немає параметрів.

Результат: void / Unit.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public void UnsetReceivingContainer() => bridge.UnsetReceivingContainer();

UO.GetContent

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

C#-сигнатури

dynamic UO.GetContent(object? id);

Читає прямий вміст контейнера або завантажених предметів на землі.

Параметри

  • id — Serial/ID конкретного об'єкта: int, десятковий/hex-рядок або встановлений аліас self, backpack, lasttarget, lastobject або ім'я AddObject. Це не graphic/type. Рядки my/backpack вибирають рюкзак. Тільки явні 0, "0" або "ground" вибирають землю. Невідомий аліас, відсутній рюкзак, негативний ID або невідповідний вид значення дають порожній масив.

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

Array - serial кожного прямого дочірнього предмета. Для ground/0 - предмети поза контейнерами; враховуються обидві звичайні позначки землі 0 та 0xFFFFFFFF. Без записів повертається порожній Array. Список містить ID, не type та не шари.

Поведінка

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

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

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

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

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

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

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

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

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

  • ID="backpack" - рюкзак поточного персонажа, тільки прямі вкладені предмети.
  • Довжина – число записів/ID. Це не сума Amount у стопках. Порожній список дає 0.
var items = UO.GetContent("backpack");
UO.Print(Convert.ToString(ArrayLength(items)));

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

2. Обійти всі знайдені ID — функція сценарію

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

  • ID="backpack" - рюкзак поточного персонажа, тільки прямі вкладені предмети.
  • items[i] - числовий serial. Hex використовується лише для виведення. Цикл не звертається за останнім індексом.
return  RunScenario();
 object? RunScenario()
{
    var items = UO.GetContent("backpack");
    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. Перевірити перший запис перед читанням – клас сценарію

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

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

4. Отримати усі завантажені предмети землі — прямий скрипт

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

  • ID="ground" явно вибирає землю. NPC/гравці до цього списку не включаються.
  • Радіус пошуку тут не обмежується FindDistance. Для фільтра type та відстані є GetWorldItems(type,color,distance).
var groundItems = UO.GetContent("ground");
UO.Print(Convert.ToString(ArrayLength(groundItems)));

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

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetContent(id) — UO.GetContent(Any)

Параметри: id (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "getcontent":

                case "getequipment":

                {

                    InjectionValue selection = arguments[0];

                    bool ground = false, explicitZero;

                    int container;

                    if (selection.Kind == InjectionValueKind.String)

                    {

                        string text = Text(0).Trim();

                        ground = text.Equals("ground", StringComparison.OrdinalIgnoreCase);

                        explicitZero = NumberConversions.TryStr2Int(text, out int literal) && literal == 0;

                        container = ground ? 0 : text.Equals("my", StringComparison.OrdinalIgnoreCase)

                            ? bridge.Backpack : GetObject(text);

                    }

                    else

                    {

                        if (selection.Kind != InjectionValueKind.Integer && selection.Kind != InjectionValueKind.Decimal)

                            return new InjectionValue(Array.Empty<InjectionValue>());

                        container = Arg(0);

                        explicitZero = selection.Kind == InjectionValueKind.Integer ? selection.Integer == 0 : selection.Decimal == 0d;

                    }

                    // Only an explicit ground/zero selector may query world items.

                    if (container < 0 || container == 0 && !ground && !explicitZero)

                        return new InjectionValue(Array.Empty<InjectionValue>());

                    bool equipment = name.Equals("GetEquipment", StringComparison.OrdinalIgnoreCase);

                    int[] items = equipment

                        ? container == 0 ? Array.Empty<int>() : bridge.GetEquipment(container)

                        : bridge.GetContent(container);

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

                }

UO.GetParent

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

C#-сигнатури

dynamic UO.GetParent(object? objID);

Читає безпосереднього батька предмета.

Параметри

  • objID — Serial/ID конкретного об'єкта: int, десятковий/hex-рядок або встановлений аліас self, backpack, lasttarget, lastobject або ім'я AddObject. Це не graphic/type.

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

int - serial контейнера / персонажа-власника. Для предмета на землі це 0 або -1 (біти 0xFFFFFFFF), залежно від запису клієнта. Для невідомого об'єкта або Mobile - 0. Це не graphic контейнер, не ID самого предмета та не кореневий власник вкладеної сумки.

Поведінка

  • Читається поле Container локального предмета без рекурсивного обходу і звернення до сервера. Перевіряйте Exists до інтерпретації нульового результату. Ground використовує два допустимі уявлення.

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

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

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

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

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

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

1. Дізнатись контейнер предмета — прямий скрипт

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

  • item - serial знайденої стопки. type=0x0EED передається лише FindType.
  • parent означає безпосередній рюкзак, не персонажа, в якому знаходиться рюкзак.
var item = UO.FindType(0x0EED, -1, "backpack");
if (Truth(item != ""))
{
    var parent = UO.GetParent(item);
    UO.Print(Convert.ToString(parent));
}

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

2. Дізнатись власника рюкзака — функція сценарію

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

  • Аргументом є рюкзак.
  • Батьком екіпірованого рюкзака буде serial персонажа.
return  RunScenario();
 object? RunScenario()
{
    var bag = UO.GetSerial("backpack");
    if (Truth(UO.Exists(bag)))
    {
        UO.Print(Convert.ToString(UO.GetParent(bag)));
    }

    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. Перевірити предмет на землі - клас сценарію

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

  • GetContent("ground") дає ID предметів поза контейнерами.
  • Обидва уявлення землі допустимі. Одного нульового батька без Exists недостатньо для виведення положення предмета.
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.GetContent("ground");
        if (Truth(ArrayLength(items) > 0))
        {
            var item = items[0];
            if (Truth(UO.Exists(item)))
            {
                UO.Print(Convert.ToString(UO.GetParent(item)));
            }
        }

        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.GetParent(objID) — UO.GetParent(Any)

Параметри: objID (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "getparent": return new InjectionValue(bridge.ContainerOf(Arg(0)));

UO.Ground

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

C#-сигнатури

int UO.Ground();

Повертає спеціальне позначення землі для параметра контейнера пошуку або призначення перенесення.

Параметри

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

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

int, завжди 0. Цей нуль — допустиме позначення землі, а не false, не помилка пошуку, не ID предмета, graphic, номер карти або координати. Не перевіряйте Ground() як ознаку успіху; перевіряйте результат пошуку або перенесення, якому передали це значення.

Поведінка

  • Параметрів немає. Сам виклик Ground() нічого не шукає, не переміщає, не відкриває target, не відправляє пакети та не змінює результати попереднього пошуку. До входу в гру теж повертає 0.
  • Передавайте в позицію container/destination команд "FindType", "FindList", Count, "FindTypeEx", "FindTypesArrayEx", "CountEx" або "MoveItem". Пошук бачить завантажені об'єкти світу, але не завантажує далекі клітки. Для перенесення на землю X/Y/Z — координати світу, які не пікселі вікна контейнера.
  • FindType(type, color), як і раніше, шукає в інвентарі: другий параметр — колір. Для землі пишіть FindType(type, color, UO.Ground()). У старих компактних FindType/MoveItem число -1 позначає інвентар; у сумісних FindTypeEx/FindTypesArrayEx/CountEx -1 також допускається як земля. Використовуйте UO.Ground() або явне ім'я ground, не переносіть числові позначення між різними командами без перевірки.
  • Відмінності позначень між командами та приклади вище описують цей клієнт.

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

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

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

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

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

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

1. Прочитати позначення землі — прямий скрипт

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

  • destination отримує int 0, Print виводить це число. Сам виклик нічого не викидає.
var destination = UO.Ground();
UO.Print(Convert.ToString(destination));

2. Знайти стопку золота на землі - функція сценарію

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

  • 0x0EED - графіка золота; другий -1 означає будь-який hue. Ground() задає пошук у світі, false відключає рекурсію контейнерів. FindTypeEx повертає один serial або 0 за відсутності результату. != 0 перевіряє цей serial. Використовуються поточні FindDistance/FindVertical та список Ignore.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.FindTypeEx(0x0EED, -1, UO.Ground(), false);
    if (Truth(id != 0))
    {
        UO.Print(Hex(id));
    }
    else
    {
        UO.Print("0");
    }

    return null;
}

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

3. Повна функція для пошуку двох графіків на землі — клас сценарію

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

  • FindGroundTypes(firstType, secondType, radius, height) шукає золото 0x0EED і чорні перли 0x0F7A з radius=5 та height=10. оголошення змінної types[1] створює два осередки; colors[0] та containers[0] - по одній. Ціла стопка вважається одним результатом; типи/кольори — альтернативи, що перетинаються контейнери не дублюють ID. Функція повертає збережений масив serial; Finally відновлює обидві межі. Main виводить кожен ID. Код функції наведено повністю.
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 ids = FindGroundTypes(0x0EED, 0x0F7A, 5, 10);
        foreach (var id in ids)
        {
            UO.Print(Hex(id));
        }

        return null;
    }

    dynamic FindGroundTypes(dynamic firstType, dynamic secondType, dynamic radius, dynamic height)
    {
        var oldDistance = UO.FindDistance();
        var oldVertical = UO.FindVertical();
        dynamic[] types = new dynamic[checked((int)(1) + 1)];
        types[0] = firstType;
        types[1] = secondType;
        dynamic[] colors = new dynamic[checked((int)(0) + 1)];
        colors[0] = -1;
        dynamic[] containers = new dynamic[checked((int)(0) + 1)];
        containers[0] = UO.Ground();
        try
        {
            UO.FindDistance(radius);
            UO.FindVertical(height);
            UO.FindTypesArrayEx(types, colors, containers, false);
            return UO.GetFoundItems();
        }
        finally
        {
            UO.FindDistance(oldDistance);
            UO.FindVertical(oldVertical);
        }
    }

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

4. Перенести відомий предмет на клітину персонажа - прямий скрипт

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

  • Замініть 0x40001001 на serial доступного предмета. IsObjectExists спочатку перевіряє завантажений об'єкт. MoveItem(item, amount, destination, X, Y, Z): amount=0 - весь стос, Ground() - земля, GetX/GetY/GetZ - світова клітина персонажа. result дорівнює 1, якщо клієнт прийняв запит перенесення, інакше 0. Це результат MoveItem, а не Ground() і не підтвердження доставки від сервера.
var item = 0x40001001;
if (Truth(UO.IsObjectExists(item)))
{
    var result = UO.MoveItem(item, 0, UO.Ground(), UO.GetX("self"), UO.GetY("self"), UO.GetZ("self"));
}

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.Ground() — UO.Ground()

Параметри: Немає параметрів.

Результат: int / Integer.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "ground": return new InjectionValue(0);

UO.IsContainer

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

C#-сигнатури

int UO.IsContainer(object? objID);

Перевіряє прапор Container в tiledata графічного типу завантаженого предмета.

Параметри

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

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

int 1 — відомий предмет має ознаку контейнера у даних його graphic. int 0 - Такої ознаки немає, об'єкт є mobile, невідомий чи видалений. Це не кількість речей у контейнері, не ознака відкритого гампа та не підтвердження доступу до вмісту.

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

Поведінка

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

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

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

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

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

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

var result = UO.IsContainer(UO.GetSerial("lastobject"));
UO.Print("IsContainer: " + Convert.ToString(result));

1. Перевірити останній використаний предмет – прямий скрипт

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

  • item - serial об'єкта lastobject, а не його type.
  • Команда читає лише ознаку контейнера та не відкриває його.
var item = UO.GetSerial("lastobject");
if (Truth(UO.IsContainer(item)))
{
    UO.Print("Known container: " + item);
}
else
{
    UO.Print("Not a known container");
}

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

2. Вибрати контейнер перед пошуком – функція сценарію

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

  • bag повинен бути обраний заздалегідь і вміст повинен бути відомий клієнту.
  • FindType отримує type золота, будь-який hue та serial контейнера. Порожній результат не доводить, що серверний контейнер порожній.
return  RunScenario();
 object? RunScenario()
{
    var bag = UO.GetSerial("lasttarget");
    if (Truth(UO.IsContainer(bag)))
    {
        var found = UO.FindType(0x0EED, -1, bag);
        UO.Print("Known gold item: " + found);
    }

    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. Окремо перевірити наявність та класифікацію – клас сценарію.

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

  • Exists і IsContainer відповідають різні питання про одне serial.
  • При невідповідних або ще недоступних tiledata класифікація може відрізнятися від очікуваної; не використовуйте її як перевірку прав на скриню.
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.GetSerial("backpack");
        var exists = UO.Exists(bag);
        var container = UO.IsContainer(bag);
        UO.Print("Loaded: " + Convert.ToString(exists));
        UO.Print("Container flag: " + Convert.ToString(container));
        return null;
    }
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.IsContainer(objID) — UO.IsContainer(Any)

Параметри: objID (Any)

Результат: int / Integer.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "iscontainer": return new InjectionValue(bridge.IsContainer(Arg(0)));

UO.LastContainer

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

C#-сигнатури

dynamic UO.LastContainer();

Читає serial останній контейнер.

Параметри

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

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

int - збережений serial; 0 означає, що serial не встановлено. Це не bool та не graphic/type; ненульовий ID може вже бути відсутнім у світі.

Поведінка

  • Джерело поля: _world. LastContainer. Команда не вибирає, не використовує та не атакує об'єкт.
  • Читає поточний локальний стан. Пакету, target та автоматичного оновлення немає; окремі читання можуть бачити різні стани.

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

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

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

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

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

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

1. Прямий виклик – прямий скрипт

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

  • Читає serial останній контейнер.
var id = UO.LastContainer();
UO.Print(Hex(id));

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

2. Явний варіант – функція сценарію

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

  • Джерело поля: _world. LastContainer. Команда не вибирає, не використовує та не атакує об'єкт.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.LastContainer();
    if (Truth(id != 0) && Truth(UO.Exists(id)))
    {
        UO.Print(UO.GetName(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. Повна допоміжна функція – клас сценарію

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

  • Читає поточний локальний стан. Пакету, target та автоматичного оновлення немає; окремі читання можуть бачити різні стани.
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.LastContainer();
        UO.Wait(500);
        var after = UO.LastContainer();
        UO.Print(before = after);
        return null;
    }
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.LastContainer() — UO.LastContainer()

Параметри: Немає параметрів.

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "lastcontainer": return new InjectionValue(bridge.GetLastContainer());

UO.OpenContainer

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

C#-сигнатури

void UO.OpenContainer(object? id);
void UO.OpenContainer(object? id, object? timeout);

Запитує відкриття контейнера.

Параметри

  • id — Serial/ID об'єкта: int, числова/hex-рядок або встановлений аліас, наприклад "lasttarget". Це не graphic/type. До дії перевіряйте завантажений об'єкт.
  • timeout - Необов'язковий int, мілісекунди; за замовчуванням 0. Негативне значення не додає очікування.

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

void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.

Поведінка

  • Bridge.OpenContainer викликає UseObject(id), потім UO.Wait(timeout), тільки якщо timeout>0. Пауза фіксована; наявність/вміст контейнера не перевіряється.
  • Без timeout паузи немає. Не слід вважати закінчення паузи доказом відкриття або повного завантаження вмісту.

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

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

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

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

Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.

UO.Print("Calling UO.OpenContainer");
UO.OpenContainer("lasttarget");

1. Прямий виклик – прямий скрипт

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

  • Запитує відкриття контейнера.
UO.OpenContainer("lasttarget");

2. Явний варіант – функція сценарію

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

  • Bridge.OpenContainer викликає UseObject(id), потім UO.Wait(timeout), тільки якщо timeout>0. Пауза фіксована; наявність/вміст контейнера не перевіряється.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("lasttarget")))
    {
        UO.OpenContainer("lasttarget", 1000);
    }

    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. Повна допоміжна функція – клас сценарію

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

  • Без timeout паузи немає. Не слід вважати закінчення паузи доказом відкриття або повного завантаження вмісту.
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.OpenContainer(id, 1000);
            UO.Print(UO.GetName(id));
        }

        return null;
    }

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

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.OpenContainer(id) — UO.OpenContainer(Any)

Параметри: id (Any)

Результат: void / Unit.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public void OpenContainer(InjectionValue id) => bridge.OpenContainer(GetObject(id), 0);

UO.OpenContainer(id, timeout) — UO.OpenContainer(Any,Any)

Параметри: id (Any), timeout (Any)

Результат: void / Unit.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public void OpenContainer(InjectionValue id, InjectionValue timeout) => bridge.OpenContainer(GetObject(id), NumberConversions.ToInt(timeout));

UO.SetCatchBag

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

C#-сигнатури

void UO.SetCatchBag();
void UO.SetCatchBag(object? container);

Параметри

  • container - Serial контейнера, його збережене ім'я, "backpack" або "my". 0 знімає призначення. Без аргументів використовується lastobject — останній застосований об'єкт, а чи не скидання. Якщо ім'я не дозволилося у позитивний serial, призначення знімається. Сама установка не перевіряє серверну доступність та придатність об'єкта для перенесення.

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

void: значення, що повертається, немає. Не можна використовувати var result = UO.SetCatchBag(...), if UO.SetCatchBag(...) або очікувати число 1 як підтвердження. Реальне переміщення виконує окрема команда, наприклад Grab.

Поведінка

  • UO.SetCatchBag() та UO.SetReceivingContainer() мають різні значення форми без аргументів: перша бере lastobject, друга скидає контейнер.
  • Явний скидання: UO.UnsetCatchBag(), UO.UnsetReceivingContainer() або UO.SetCatchBag(0). Після скидання Grab без окремого призначення використовує рюкзак.
  • Установлений serial не означає, що сервер дозволить покласти туди предмет. Відстань, існування та доступність перевіряються під час фактичного перенесення.
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

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

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

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

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

Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.

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

1. Явно призначити свій рюкзак - прямий скрипт

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

  • Єдиний параметр container отримує рядок "backpack". Runtime дозволяє її в serial свого рюкзака.
  • Виклик записано окремим рядком без var result, тому що повертає Unit. Повідомлення Print описує налаштування, а не підтверджує перенесення предмета.
var destination = "backpack";
UO.SetCatchBag(destination);
UO.Print("Receiving container: own backpack");

2. Вибрати останній використаний контейнер – функція сценарію

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

  • Це навантаження параметрів немає: всередині використовується ім'я lastobject.
  • Порожні дужки не означають скидання. Попередньо оберіть відповідний контейнер звичайним подвійним кліком. Доступність сумки для перенесення залежить від поточного стану гри.
return  RunScenario();
 object? RunScenario()
{
    UO.SetCatchBag();
    UO.Print("Destination taken from lastobject");
    return null;
}

3. Задати конкретний serial і потім повернути стандартне призначення – клас сценарію

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

  • У першому викликі container=bag містить hex-рядок serial. 0x40001234 - приклад, його потрібно замінити своїм значенням.
  • У другому дзвінку container=0 знімає призначення. Наступні Grab без явного контейнера використовують рюкзак.
  • Скидання знаходиться після передбачуваного блоку переносів. Встановлення та скидання не повертають результат і не переміщують предмети власними силами.
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 = "0x40001234";
        UO.SetCatchBag(bag);
        UO.Print("Configured destination: " + bag);
        UO.SetCatchBag(0);
        UO.Print("Destination reset to the normal backpack fallback");
        return null;
    }
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.SetCatchBag() — UO.SetCatchBag()

Параметри: Немає параметрів.

Результат: void / Unit.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "setcatchbag":

                    SetReceivingContainer(arguments.Length > 0 ? arguments[0].ToString() : "lastobject");

                    break;

UO.SetCatchBag(container) — UO.SetCatchBag(Any)

Параметри: container (Any)

Результат: void / Unit.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "setcatchbag":

                    SetReceivingContainer(arguments.Length > 0 ? arguments[0].ToString() : "lastobject");

                    break;

UO.SetReceivingContainer

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

C#-сигнатури

void UO.SetReceivingContainer();
void UO.SetReceivingContainer(object? id);

Задає контейнер для майбутнього Grab.

Параметри

  • id - Необов'язковий serial/аліас. "my"/"backpack" - поточний рюкзак. Позитивний ID зберігається без перевірки існування; 0/негативний/немає аргументу очищує налаштування.

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

void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.

Поведінка

  • Рядок дозволяється GetObject, крім спеціальних my/backpack. Bridge.SetReceivingContainer присвоює State.ReceivingContainer. Перенесення предмета цим викликом не виконується.
  • Після чищення Grab без явного призначення використовує рюкзак. Позитивний ID сам не підтверджує, що контейнер завантажений або доступний серверу.
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

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

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

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

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

Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.

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

1. Прямий виклик – прямий скрипт

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

  • Задає контейнер для майбутнього Grab.
UO.SetReceivingContainer("backpack");

2. Явний варіант – функція сценарію

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

  • Рядок дозволяється GetObject, крім спеціальних my/backpack. Bridge.SetReceivingContainer присвоює State.ReceivingContainer. Перенесення предмета цим викликом не виконується.
return  RunScenario();
 object? RunScenario()
{
    UO.SetReceivingContainer();
    return null;
}

3. Повна допоміжна функція – клас сценарію

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

  • Після чищення Grab без явного призначення використовує рюкзак. Позитивний ID сам не підтверджує, що контейнер завантажений або доступний серверу.
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.GetSerial("lastcontainer");
        if (Truth(UO.IsContainer(bag)))
        {
            UO.SetReceivingContainer(bag);
        }

        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.SetReceivingContainer() — UO.SetReceivingContainer()

Параметри: Немає параметрів.

Результат: void / Unit.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public void SetReceivingContainer() => UnsetReceivingContainer();

UO.SetReceivingContainer(id) — UO.SetReceivingContainer(Integer)

Параметри: id (Integer/String)

Результат: void / Unit.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public void SetReceivingContainer(int id)

        {

            if (id <= 0)

                bridge.UnsetReceivingContainer();

            else

                bridge.SetReceivingContainer(id);

        }

UO.SetReceivingContainer(id) — UO.SetReceivingContainer(String)

Параметри: id (Integer/String)

Результат: void / Unit.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public void SetReceivingContainer(string id)

        {

            string name = (id ?? string.Empty).Trim();

            if (name.Equals("my", StringComparison.OrdinalIgnoreCase)

                || name.Equals("backpack", StringComparison.OrdinalIgnoreCase))

            {

                SetReceivingContainer(bridge.Backpack);

                return;

            }

            SetReceivingContainer(GetObject(id));

        }

UO.UnsetCatchBag

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

C#-сигнатури

void UO.UnsetCatchBag();

Очищує контейнер для прийому Grab.

Параметри

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

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

void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.

Поведінка

  • ExecuteLegacyManualAlias викликає UnsetReceivingContainer; bridge надає ReceivingContainer=0. Наступний Grab використовує рюкзак. Це не видалення сумки.
  • Змінює або показує лише вказані локальні дані. Серверного підтвердження цієї команди немає.
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

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

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

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

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

Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.

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

1. Прямий виклик – прямий скрипт

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

  • Очищує контейнер для прийому Grab.
UO.UnsetCatchBag();

2. Явний варіант – функція сценарію

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

  • ExecuteLegacyManualAlias викликає UnsetReceivingContainer; bridge надає ReceivingContainer=0. Наступний Grab використовує рюкзак. Це не видалення сумки.
return  RunScenario();
 object? RunScenario()
{
    UO.SetCatchBag("backpack");
    UO.UnsetCatchBag();
    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()
    {
        UO.UnsetCatchBag();
        UO.Print(UO.Backpack());
        return null;
    }
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.UnsetCatchBag() — UO.UnsetCatchBag()

Параметри: Немає параметрів.

Результат: void / Unit.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "unsetcatchbag": UnsetReceivingContainer(); break;

UO.UnsetReceivingContainer

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

C#-сигнатури

void UO.UnsetReceivingContainer();

Очищає збережений контейнер прийому.

Параметри

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

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

void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.

Поведінка

  • UnsetReceivingContainer присвоює ReceivingContainer=0. Наступний Grab без певного призначення використовує рюкзак. Предмети не переносяться.
  • Змінює або показує лише вказані локальні дані. Серверного підтвердження цієї команди немає.
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

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

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

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

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

Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.

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

1. Прямий виклик – прямий скрипт

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

  • Очищає збережений контейнер прийому.
UO.UnsetReceivingContainer();

2. Явний варіант – функція сценарію

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

  • UnsetReceivingContainer присвоює ReceivingContainer=0. Наступний Grab без певного призначення використовує рюкзак. Предмети не переносяться.
return  RunScenario();
 object? RunScenario()
{
    UO.SetReceivingContainer("backpack");
    UO.UnsetReceivingContainer();
    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()
    {
        UO.UnsetReceivingContainer();
        UO.Print(UO.Backpack());
        return null;
    }
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.UnsetReceivingContainer() — UO.UnsetReceivingContainer()

Параметри: Немає параметрів.

Результат: void / Unit.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public void UnsetReceivingContainer() => bridge.UnsetReceivingContainer();

Clone this wiki locally