Skip to content

RU UO Topic containers

Codex edited this page Oct 12, 2026 · 4 revisions

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

Контейнеры

Главная · C# · IDE · UO API · A–Z · Примеры · Языки

Чтение содержимого, открытие и выбор контейнера назначения. Закрытый или ещё не загруженный контейнер не даёт клиенту полного списка предметов.

Разделы

Тема Команды и пояснения
Backpack UO.Backpack
Bank UO.ObjAtLayerEx · UO.OpenContainer
OpenContainer UO.OpenContainer
LastContainer UO.LastContainer
ContainerOf UO.ContainerOf · UO.GetParent
IsContainer UO.IsContainer
Вложенные контейнеры UO.GetContent · UO.FindTypeEx · UO.FindTypesArrayEx
Receiving Container UO.SetReceivingContainer · UO.UnsetReceivingContainer
Catch Bag UO.SetCatchBag · UO.UnsetCatchBag
Container Transfers UO.MoveItem · UO.MoveItems · UO.MassMove · UO.EmptyContainer

Все команды темы

Backpack / Ground

UO.Backpack · UO.Ground

OpenContainer

UO.OpenContainer

LastContainer

UO.LastContainer

ContainerOf

UO.ContainerOf · UO.GetParent · UO.ContainerOff

IsContainer

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