Skip to content

RU UO Topic items Part 2

Codex edited this page Oct 12, 2026 · 3 revisions

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

Предметы — 2

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

Части справочника

1 · 2

Полное описание команд


UO.MoveItem

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

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

int UO.MoveItem(object? id);
int UO.MoveItem(object? id, object? amount);
int UO.MoveItem(object? id, object? amount, object? targetContainer);
int UO.MoveItem(object? item, object? amount, object? container, object? x);
int UO.MoveItem(object? item, object? amount, object? container, object? x, object? y);
int UO.MoveItem(object? id, object? amount, object? targetContainer, object? x, object? y, object? z);
int UO.MoveItem(object? item, object? amount, object? container, object? x, object? y, object? z, object? timeout);
int UO.MoveItem(object? item, object? amount, object? container, object? x, object? y, object? z, object? timeout, object? waitConfirmation);

Переносит один конкретный предмет/стек по serial: захват и сброс в контейнер либо на землю.

Параметры

  • id — Serial конкретного предмета/персонажа: число, hex/десятичная строка, self/backpack/lasttarget/lastobject/lastcontainer/lastcorpse/finditem/laststatus либо сохранённое имя AddObject. Это не type. Объект должен быть загружен; перед действием проверяйте Exists.
  • item — Serial конкретного предмета/персонажа: число, hex/десятичная строка, self/backpack/lasttarget/lastobject/lastcontainer/lastcorpse/finditem/laststatus либо сохранённое имя AddObject. Это не type. Объект должен быть загружен; перед действием проверяйте Exists.
  • amount — Количество единиц внутри одного стека. 0 или отрицательное значение означает весь стек; положительное ограничивается доступным количеством. Это НЕ число стопок, которое ограничивает MassMove. По умолчанию 0.
  • targetContainer — Serial контейнера или установленное имя AddObject; backpack/self/my выбирают рюкзак, receiving/catchbag — SetCatchBag, а без него рюкзак. lastcontainer/lastobject/lasttarget/lastcorpse/finditem/laststatus допустимы, когда разрешаются в нужный контейнер. ground или 0 явно выбирает землю; -1 — прежний селектор рюкзака. Неизвестное или неустановленное имя вызывает ошибку до захвата предмета. Без аргумента назначения используется рюкзак.
  • container — Serial контейнера или установленное имя AddObject; backpack/self/my выбирают рюкзак, receiving/catchbag — SetCatchBag, а без него рюкзак. lastcontainer/lastobject/lasttarget/lastcorpse/finditem/laststatus допустимы, когда разрешаются в нужный контейнер. ground или 0 явно выбирает землю; -1 — прежний селектор рюкзака. Неизвестное или неустановленное имя вызывает ошибку до захвата предмета. Без аргумента назначения используется рюкзак.
  • x — При контейнере — X в гампе, по умолчанию 65535 (автоматически). При земле — мировая X, по умолчанию X персонажа.
  • y — Y в гампе либо мировая Y; по умолчанию 65535 для контейнера или Y персонажа для земли.
  • z — Высота, по умолчанию 0 в контейнере либо Z персонажа на земле.
  • timeout — Седьмой аргумент: максимум ожидания в мс, по умолчанию 1000; отрицательное значение приравнивается к 0. Используется только с восьмым waitConfirmation=true.
  • waitConfirmation — Восьмой аргумент: true/1 включает ожидание наблюдаемого изменения мира; false/0 (по умолчанию) возвращает результат отправки запроса.

Возвращает

int 1 — клиент принял запрос захвата и сброса; 0 — запрос выполнить не удалось. При waitConfirmation=true единица дополнительно требует наблюдаемого изменения контейнера/координат или уменьшения исходного стека. Это не serial нового стека и не число перенесённых items. Сервер может отказать в действии.

Результат команды — числовой флаг: 1 означает выполненное условие, 0 — невыполненное. После var result = команда(...) проверяйте if (result != 0) или if (result == 0). Сохраните результат одного вызова: повторный вызов может выполнить действие снова либо прочитать уже изменившееся состояние.

Поведение

  • Поддерживаются все длины от 1 до 8 аргументов. При заданном x можно опустить y/z: для них применяются описанные значения по умолчанию.
  • Известное имя назначения разрешается до захвата. Для земли используйте явно ground/0; опечатка в имени не должна сбрасывать предмет на пол.
  • Предмет может находиться в сундуке, сумке или рюкзаке: ground задаёт назначение на земле независимо от исходного контейнера. В первом аргументе указывается serial самого предмета, а не сундука и не type. Команда сама выполняет захват; предварительно брать предмет мышью не нужно.
  • При включённом DropCheckCoord сброс на землю дальше двух клеток отклоняется. Сервер дополнительно проверяет доступность места. X/Y — клетки карты, а не пиксели гампа; Z — высота выбранной поверхности, в том числе отрицательная. Для контейнера X/Y по-прежнему означают место внутри его гампа.
  • Ожидание подтверждения использует состояние мира клиента: для частичного стека — уменьшение количества, для целого — контейнер, для земли ещё X/Y/Z. Внутри контейнера точное место гампа этим ожиданием не подтверждается; исчезновение/слияние стека может осложнить проверку.
  • Это не подтверждение отдельным transaction ID. Если предмет уже находился в том же контейнере, совпадение контейнера не доказывает новое перемещение внутри гампа.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

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

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

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

1. Весь предмет в рюкзак — прямой скрипт

Параметры и ход выполнения:

  • loot — имя AddObject; amount отсутствует и равен 0, назначение — рюкзак.
  • Переносится один предмет/стек, а не все предметы данного типа.
var ok = UO.MoveItem("loot");
UO.Print("Move request: " + Convert.ToString(ok));

2. Часть стека в конкретное место сундука — функция сценария

Параметры и ход выполнения:

  • amount=10 единиц одной стопки, chest — имя контейнера, x/y=60/70 внутри гампа, z=0.
  • Количество не имеет значения «десять стопок», принятого у MassMove.
return  RunScenario();
 object? RunScenario()
{
    var ok = UO.MoveItem("loot", 10, "chest", 60, 70, 0);
    return null;
}

3. Земля под персонажем — класс сценария

Параметры и ход выполнения:

  • ground явно выбирает землю; отсутствующие X/Y/Z берутся у персонажа.
  • Для другой точки передайте её мировые координаты, учитывая дальность и DropCheckCoord.
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 ok = UO.MoveItem("loot", 0, "ground");
        return null;
    }
}

4. Из сундука на землю рядом с персонажем — прямой скрипт

Параметры и ход выполнения:

  • ground_item — сохранённый serial выбранного предмета в открытом сундуке. Исходный сундук отдельным параметром не передаётся. amount=0 берёт весь стек; например, 10 возьмёт до десяти единиц этого стека.
  • ground явно выбирает землю. x/y — абсолютные координаты клетки на одну клетку по X от персонажа; z берётся у персонажа и подходит, если соседняя поверхность на той же высоте. На лестнице, столе или другом этаже задайте фактическую Z нужной поверхности.
  • sent=1 означает отправку запроса клиентом; без восьмого параметра подтверждение сервера не ожидается. Значение 0 означает, что запрос выполнить не удалось. Это числовой флаг int 1/0: проверяйте sent != 0 либо sent == 0; сравнение с bool недопустимо.
  • Для сброса непосредственно под ноги достаточно UO.MoveItem('ground_item', 0, 'ground'): все три координаты будут взяты у персонажа. Для помещения внутрь сундука вместо ground укажите serial/имя сундука и координаты его гампа.
UO.AddObject("ground_item");
var x = UO.GetX() + 1;
var y = UO.GetY();
var z = UO.GetZ();
var sent = UO.MoveItem("ground_item", 0, "ground", x, y, z);
if (Truth(sent == 1))
{
    UO.Print("Ground move request sent");
}
else
{
    UO.Print("Ground move request was not sent");
}

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

5. Запросить наблюдаемое подтверждение — функция сценария

Параметры и ход выполнения:

  • timeout=1500 мс используется, потому что waitConfirmation=true. x/y=-1 — автоматическое место.
  • 0 может означать тайм-аут уже отправленного запроса. Не повторяйте перенос вслепую; сначала проверьте текущее состояние предмета.
return  RunScenario();
 object? RunScenario()
{
    var ok = UO.MoveItem("loot", 0, "backpack", -1, -1, 0, 1500, true);
    if (Truth(ok == 0))
    {
        UO.Print("Move was rejected or not confirmed");
    }

    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.MoveItem(id) — UO.MoveItem(Any)

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

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public int MoveItem(InjectionValue id)

            => CompactMoveItem(new[] { id });

UO.MoveItem(id, amount) — UO.MoveItem(Any,Any)

Параметры: id (Any), amount (Any)

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public int MoveItem(InjectionValue id, InjectionValue amount)

            => CompactMoveItem(new[] { id, amount });

UO.MoveItem(id, amount, targetContainer) — UO.MoveItem(Any,Any,Any)

Параметры: id (Any), amount (Any), targetContainer (Any)

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public int MoveItem(InjectionValue id, InjectionValue amount, InjectionValue targetContainer)

            => CompactMoveItem(new[] { id, amount, targetContainer });

UO.MoveItem(item, amount, container, x) — UO.MoveItem(Any,Any,Any,Any)

Параметры: item (Any), amount (Any), container (Any), x (Any)

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

При вызове:

Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.

Внутренний код реализации, не самостоятельный скрипт.

values => new InjectionValue(CompactMoveItem(values))

UO.MoveItem(item, amount, container, x, y) — UO.MoveItem(Any,Any,Any,Any,Any)

Параметры: item (Any), amount (Any), container (Any), x (Any), y (Any)

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

При вызове:

Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.

Внутренний код реализации, не самостоятельный скрипт.

values => new InjectionValue(CompactMoveItem(values))

UO.MoveItem(id, amount, targetContainer, x, y, z) — UO.MoveItem(Any,Any,Any,Any,Any,Any)

Параметры: id (Any), amount (Any), targetContainer (Any), x (Any), y (Any), z (Any)

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public int MoveItem(InjectionValue id, InjectionValue amount, InjectionValue targetContainer, InjectionValue x, InjectionValue y, InjectionValue z)

            => CompactMoveItem(new[] { id, amount, targetContainer, x, y, z });

UO.MoveItem(item, amount, container, x, y, z, timeout) — UO.MoveItem(Any,Any,Any,Any,Any,Any,Any)

Параметры: item (Any), amount (Any), container (Any), x (Any), y (Any), z (Any), timeout (Any)

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

При вызове:

Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.

Внутренний код реализации, не самостоятельный скрипт.

values => new InjectionValue(CompactMoveItem(values))

UO.MoveItem(item, amount, container, x, y, z, timeout, waitConfirmation) — UO.MoveItem(Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: item (Any), amount (Any), container (Any), x (Any), y (Any), z (Any), timeout (Any), waitConfirmation (Any)

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

При вызове:

Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.

Внутренний код реализации, не самостоятельный скрипт.

values => new InjectionValue(CompactMoveItem(values))

UO.MoveItems

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

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

dynamic UO.MoveItems(object? container, object? itemsType, object? itemsColor, object? moveIntoID, object? x, object? y, object? z, object? delayMS);

Перекладывает все подходящие предметы непосредственно из одного контейнера в другой либо на землю. Предметы выбираются по graphic и hue; каждая стопка переносится целиком. Это перенос вещей, а не ходьба персонажа и не интерактивное включение MassMove.

Параметры

  • container — Serial исходного контейнера, например backpack, "backpack", имя AddObject или hex-ID. Содержимое должно быть уже загружено. 0 не является допустимым источником; ground не выбирает вещи вокруг персонажа. Для рюкзака указывайте backpack, а не self.
  • itemsType — Graphic предмета, например 0x0EED — золото. Не ID вещи и не тело mobile. Отрицательное число или 0xFFFF — все типы. Массив/маска типов не принимается.
  • itemsColor — Hue вещи. -1 (либо другое отрицательное число) и 0xFFFF — любой; 0 — только hue 0. Не serial и не notoriety.
  • moveIntoID — Serial контейнера назначения или объектный алиас. Для своего рюкзака — backpack. Для земли — число 0 (также ground/"ground"/UO.Ground()). Источник и назначение должны различаться. -1 не является сокращением backpack в этой команде. Self — serial mobile, а не автоматическая подстановка его рюкзака.
  • x — При ненулевом контейнере — позиция ВНУТРИ его гампа; -1,-1 оставляют размещение серверу. При земле — мировые координаты 0..65535, обе обязательны и неотрицательны. Не экранные пиксели игрового мира и не конечная точка маршрута.
  • y — При ненулевом контейнере — позиция ВНУТРИ его гампа; -1,-1 оставляют размещение серверу. При земле — мировые координаты 0..65535, обе обязательны и неотрицательны. Не экранные пиксели игрового мира и не конечная точка маршрута.
  • z — Высота мира при выкладывании на землю; используйте реальную высоту места (протокольный диапазон -128..127). В контейнерном примере указывают 0. Это не индекс слоя экипировки.
  • delayMS — Задержка между принятыми запросами в миллисекундах. Реально применяется max(GrabDelay, max(0, DelayMS)); ожидание есть также после последнего отправленного переноса. 350 не означает 350 предметов и не гарантирует подтверждение за 350 мс.

Возвращает

Регистрация object? фактически возвращает int 1/true, если принят хотя бы один запрос переноса, иначе 0/false. Это не количество предметов и не гарантия переноса ВСЕХ совпадений. Проверяйте содержимое после ответа сервера. Аварийная отмена прерывает процедуру и не обязана возвращать false.

Поведение

  • Все восемь аргументов обязательны. Однократно создаётся список прямых дочерних предметов исходного контейнера; рекурсивного обхода нет. Попавший в список вложенный мешок перемещается как один предмет вместе с содержимым, а не распаковывается.
  • Берёт всю текущую стопку каждого совпадения. Предел количества предметов или единиц этой командой не задаётся; для таких сценариев смотрите UO.MassMove. Ignore не используется как дополнительный фильтр этой выборки.
  • Перед каждым действием повторно проверяет, что предмет ещё в исходном контейнере. Запрет вложить контейнер в себя/потомка и недоступность предмета могут привести к пропуску. Очередь не является транзакцией: уже отправленные действия не откатываются.
  • При source=0, одинаковых source/destination или земле с отрицательными X/Y возвращает 0 и сообщает ошибку. Сервер определяет разрешение, дальность, вместимость и окончательный результат. Не выполняйте одновременно другие операции с поднятыми вещами.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

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

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

object? result = UO.MoveItems("lasttarget", 0x0EED, -1, "backpack", -1, -1, 0, 350);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Собрать золото из выбранного сундука в рюкзак — прямой скрипт

Параметры и ход выполнения:

  • 0x0EED — type золота; -1 в ItemsColor — любой hue. -1,-1 после backpack — автоматическое положение в гампе, а не земля. 350 мс — минимальная желаемая задержка, с учётом GrabDelay. Все прямые стопки золота берутся целиком.
var source = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(source == 0) || Truth(source == UO.Backpack()) || !(Truth(UO.Exists(source))))
{
    return null;
}
var sent = UO.MoveItems(source, 0x0EED, -1, "backpack", -1, -1, 0, 350);
if (Truth(Truth(sent) == false))
{
    UO.Print("No gold transfer request was accepted");
}

int Asc(object? value, int fallback = 0) { string text = Convert.ToString(value) ?? ""; if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback; return int.TryParse(text, out int number) ? number : fallback; }
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Положить бинты в заданное место гампа сундука — функция сценария

Параметры и ход выполнения:

  • 0x0E21 — бинты, не тело человека. backpack — источник, destination — serial сундука. Все совпадения направляются в одну точку 30,40; сервер может объединить стопки или скорректировать положение.
return  RunScenario();
 object? RunScenario()
{
    var destination = Asc(UO.GetSerial("lasttarget"), 0);
    if (Truth(destination == 0) || Truth(destination == UO.Backpack()) || !(Truth(UO.Exists(destination))))
    {
        return null;
    }

    var sent = UO.MoveItems("backpack", 0x0E21, -1, destination, 30, 40, 0, 350);
    if (Truth(sent != 0))
    {
        UO.Print("Transfer requested; verify the destination contents");
    }

    return null;
}

int Asc(object? value, int fallback = 0)
{
    string text = Convert.ToString(value) ?? "";
    if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
        return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
    return int.TryParse(text, out int number) ? number : fallback;
}

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

3. Выложить все прямые стопки выбранного type рядом на землю — класс сценария

Параметры и ход выполнения:

  • itemType задаёт тип, не количество; переносятся все его прямые стопки в рюкзаке. X+1/Y/Z — пример соседней точки на одной высоте: при склоне/стене выберите правильную координату. 0 назначения обязателен для мирового режима. true говорит только о принятом запросе, не об освобождённом рюкзаке.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (!(Truth(DropTypeBesideMe(0x0EED))))
        {
            UO.Print("No ground drop request was accepted");
        }

        return null;
    }

    dynamic DropTypeBesideMe(dynamic itemType)
    {
        if (!(Truth(UO.Connected())) || Truth(UO.Dead()))
        {
            return false;
        }

        var x = UO.GetX() + 1;
        var y = UO.GetY();
        var z = UO.GetZ();
        return UO.MoveItems("backpack", itemType, -1, 0, x, y, z, 350);
    }

    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.MoveItems(container, itemsType, itemsColor, moveIntoID, x, y, z, delayMS) — UO.MoveItems(Any,Any,Any,Any,Any,Any,Any,Any)

Параметры: container (Any), itemsType (Any), itemsColor (Any), moveIntoID (Any), x (Any), y (Any), z (Any), delayMS (Any)

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "moveitems": return new InjectionValue(bridge.MoveItems(Arg(0), ResolveType(arguments[1]), Arg(2), Arg(3), Arg(4), Arg(5), Arg(6), Arg(7)));

UO.Name

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

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

string UO.Name();

Читает имя персонажа.

Параметры

Параметров нет.

Возвращает

string — известное клиенту имя. Пустая строка означает пустое/неизвестное значение либо отсутствие объекта. Это не serial и не путь профиля. Игровое имя/титул не переводится по языку IDE.

Поведение

  • Читаются уже полученные локальные данные. Запрос не открывает status и не заставляет сервер прислать обновление. После смерти, перехода карты или удаления объекта значения могут измениться между двумя вызовами.
  • C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

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

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

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

1. Показать текст после входа — прямой скрипт

Параметры и ход выполнения:

  • Параметров нет: читается self.
  • Пустая строка обрабатывается явно; это не текст "0".
var text = UO.Name();
if (Truth(text != ""))
{
    UO.Print(text);
}
else
{
    UO.Print("Text is unavailable");
}

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

2. Добавить текст в сообщение журнала — функция сценария

Параметры и ход выполнения:

  • Читается свой персонаж, значение сохраняется строкой.
  • Оператор + соединяет строки; Convert.ToString для этого результата не нужен.
return  RunScenario();
 object? RunScenario()
{
    var text = UO.Name();
    UO.Print("Player имя: " + text);
    return null;
}

3. Сравнить два снимка — класс сценария

Параметры и ход выполнения:

  • Оба вызова относятся к self; UO.Wait задаёт паузу 1000 мс.
  • Различие может означать обновление данных либо выход из мира. Пример не меняет имя или титул.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var previous = UO.Name();
        await Delay(1000);
        var current = UO.Name();
        if (Truth(previous != current))
        {
            UO.Print("Updated text: " + current);
        }

        return null;
    }

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

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

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.Name() — UO.Name()

Параметры: Параметров нет.

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

При вызове:

Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.

Внутренний код реализации, не самостоятельный скрипт.

() => bridge.GetName(bridge.Self)

Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.


UO.Picking

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

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

int UO.Picking();

Проверяет, занят ли курсор клиента поднятым предметом.

Параметры

Параметров нет.

Возвращает

int 1 — ItemHold.Enabled установлен; 0 — не установлен. Это состояние клиента, не ID и не подтверждение серверной доставки. Учитывается предмет, поднятый мышью или другим скриптом.

Результат команды — числовой флаг: 1 означает выполненное условие, 0 — невыполненное. После var result = команда(...) проверяйте if (result != 0) или if (result == 0). Сохраните результат одного вызова: повторный вызов может выполнить действие снова либо прочитать уже изменившееся состояние.

Поведение

  • Чтение не поднимает и не сбрасывает предмет.
  • Для собственного переноса проверяйте также результат Drag/DragItem; чужой занятый курсор не означает, что нужный предмет успешно взят.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

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

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

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

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

Параметры и ход выполнения:

  • Аргументов нет.
  • Выводится 1 или 0.
UO.Print(Convert.ToString(UO.Picking()));

2. Проверить занятые руки до захвата — функция сценария

Параметры и ход выполнения:

  • Один аргумент Drag означает весь стек и timeout=0.
  • Picking проверяет общий курсор клиента. Не запускайте два независимых переноса одновременно.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Picking() == 0))
    {
        if (Truth(UO.Drag("loot")))
        {
            var dropped = UO.DropItem("backpack", -1, -1, 0);
        }
    }

    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. Подождать свободный курсор с пределом — класс сценария

Параметры и ход выполнения:

  • Проверка повторяется до двадцати раз с паузами по 50 мс.
  • Команда не освобождает курсор и не отменяет чужой перенос.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var tries = 0;
        while (Truth(UO.Picking()) && Truth(tries < 20))
        {
            await Delay(50);
            tries = tries + 1;
        }

        if (Truth(UO.Picking()))
        {
            UO.Print("Cursor is still occupied");
        }

        return null;
    }

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

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

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.Picking() — UO.Picking()

Параметры: Параметров нет.

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public int Picking() => bridge.Picking();

UO.ReceiveObjectName

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

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

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

Запрашивает имя объекта single-click запросом.

Параметры

  • id — Serial/ID объекта: int, числовая/hex-строка или установленный алиас, например "lasttarget". Это не graphic/type. До действия проверяйте загруженный объект.
  • timeout — Необязательный int, миллисекунды; по умолчанию 0. Отрицательное значение не добавляет ожидания.

Возвращает

void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.

Поведение

  • Bridge.ReceiveObjectName вызывает Click(id), затем ждёт до max(0,timeout), пока GetName(id) пусто; паузы не больше 25 ms. Уже известное имя завершает ожидание сразу.
  • Без timeout выполняется только Click. Возвращаемого имени нет: прочитайте GetName отдельно; окончание ожидания может означать timeout.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

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

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

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

1. Прямой вызов — прямой скрипт

Параметры и ход выполнения:

  • Запрашивает имя объекта single-click запросом.
UO.ReceiveObjectName("lasttarget");

2. Явный вариант — функция сценария

Параметры и ход выполнения:

  • Bridge.ReceiveObjectName вызывает Click(id), затем ждёт до max(0,timeout), пока GetName(id) пусто; паузы не больше 25 ms. Уже известное имя завершает ожидание сразу.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("lasttarget")))
    {
        UO.ReceiveObjectName("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 выполняется только Click. Возвращаемого имени нет: прочитайте GetName отдельно; окончание ожидания может означать 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.ReceiveObjectName(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.ReceiveObjectName(id) — UO.ReceiveObjectName(Any)

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

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

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

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

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

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

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

UO.TicksUse

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

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

int UO.TicksUse();

Читает сохранённую отметку TicksUse.

Параметры

Параметров нет.

Возвращает

int — отметка UO.Timer в десятых долях секунды от старта runtime. 0 — отметка ещё не установлена либо событие было в первую десятую секунды; это не миллисекунды и не календарное время.

Поведение

  • Возвращает поле ticksUse. Его обновляет UseObject; это не автоматическое наблюдение всех ручных/серверных действий. Сама команда отметку не меняет.
  • UO.Timer() - отметка вычисляет возраст в десятых секунды. Между разными runtime отметки не сравниваются.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

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

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

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

1. Прямой вызов — прямой скрипт

Параметры и ход выполнения:

  • Читает сохранённую отметку TicksUse.
var stamp = UO.TicksUse();
UO.Print(stamp);

2. Явный вариант — функция сценария

Параметры и ход выполнения:

  • Возвращает поле ticksUse. Его обновляет UseObject; это не автоматическое наблюдение всех ручных/серверных действий. Сама команда отметку не меняет.
return  RunScenario();
 object? RunScenario()
{
    var stamp = UO.TicksUse();
    var ageTenths = UO.Timer() - stamp;
    UO.Print(ageTenths);
    return null;
}

3. Полная вспомогательная функция — класс сценария

Параметры и ход выполнения:

  • UO.Timer() - отметка вычисляет возраст в десятых секунды. Между разными runtime отметки не сравниваются.
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.TicksUse();
        UO.Wait(250);
        var after = UO.TicksUse();
        UO.Print(before = after);
        return null;
    }
}

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

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.TicksUse() — UO.TicksUse()

Параметры: Параметров нет.

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public int TicksUse() => ticksUse;

UO.UpdateObject

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

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

void UO.UpdateObject(object? id);

Запрашивает обновление уже загруженного объекта.

Параметры

  • id — Serial/ID объекта: int, числовая/hex-строка или установленный алиас, например "lasttarget". Это не graphic/type. До действия проверяйте загруженный объект.

Возвращает

void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.

Поведение

  • Для Mobile вызывается RequestMobileStatus(..., true), для Item — SingleClick. Если serial отсутствует в обеих локальных таблицах, действия нет. Это не загрузка неизвестного объекта и не подтверждение обновления.
  • Bridge посылает запрос на игровом потоке. Действуют правила сервера; встроенного ожидания подтверждения нет.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

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

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

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

1. Прямой вызов — прямой скрипт

Параметры и ход выполнения:

  • Запрашивает обновление уже загруженного объекта.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
    UO.UpdateObject(id);
}

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

2. Явный вариант — функция сценария

Параметры и ход выполнения:

  • Для Mobile вызывается RequestMobileStatus(..., true), для Item — SingleClick. Если serial отсутствует в обеих локальных таблицах, действия нет. Это не загрузка неизвестного объекта и не подтверждение обновления.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("self");
    if (Truth(UO.Exists(id)))
    {
        UO.UpdateObject(id);
    }

    return null;
}

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

3. Полная вспомогательная функция — класс сценария

Параметры и ход выполнения:

  • Bridge посылает запрос на игровом потоке. Действуют правила сервера; встроенного ожидания подтверждения нет.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

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

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

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

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

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.UpdateObject(id) — UO.UpdateObject(Any)

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

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public void UpdateObject(InjectionValue id) => bridge.UpdateObject(GetObject(id));

UO.UseFromGround

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

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

int UO.UseFromGround(object? @type);
int UO.UseFromGround(object? @type, object? color);

Ищет объект заданного graphic на земле/в мире и сразу вызывает его применение. Обычно используется для лежащих рядом предметов, например для открытия рюкзака. Важная особенность этого runtime: поиск основан на FindType и может найти также mobile с таким body; это не строго item-only выборка. Для предметов с явным радиусом и выбором ближайшего используйте UseType(..., ground, ...).

Параметры

  • type — Обязательный graphic. Например 0x0E75 — рюкзак. Число или числовая hex-строка; отрицательное число/0xFFFF — любой graphic. Значения тела, например 0x0190 (мужчина) и 0x0191 (женщина), могут выбрать mobile; не подставляйте их вместо type предмета. Одновременно два типа этой формой не передаются.
  • color — Необязательный hue, по умолчанию -1 (любой). Отрицательное число/0xFFFF — любой, 0 — только hue 0. Других параметров нет: container, distance, nearest и maxZ в эту команду не добавляют.

Возвращает

int — serial первого найденного объекта, переданного UseObject, либо 0. Это не число объектов, не graphic и не true/false. Объект может быть найден, но сервер может запретить применение. Проверяйте id != 0 и отдельно ожидаемый игровой эффект.

Поведение

  • Использует текущие FindDistance и FindVertical, учитывает Ignore. Контейнер поиска фиксирован как ground, вложенное содержимое не обходится. Mobiles исключают self; по жизни/видимости/notoriety отдельного ограничения нет.
  • Обновляет FindItem/FindCount/GetFoundItems всеми совпадениями поиска, но применяет только первый результат. Ближайший не гарантирован; предметы мира проверяются раньше mobiles.
  • Не подбирает предмет в рюкзак, не перемещает персонажа, не ждёт ответа сервера или окончания target. При отсутствии совпадения печатает сообщение. Для поиска без действия используйте UO.FindType.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

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

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.UseFromGround(0x0E75);
UO.Print("UseFromGround: " + Convert.ToString(result));

1. Открыть лежащий рюкзак стандартного типа — прямой скрипт

Параметры и ход выполнения:

  • Только type; любой hue. Используются текущие FindDistance/FindVertical. bag — ID первого результата, а не обязательно ближайшего. Содержимое откроется только если сервер разрешит.
var bag = UO.UseFromGround(0x0E75);
if (Truth(bag != 0))
{
    UO.AddObject("ground_bag", bag);
}
else
{
    UO.Print("No loaded ground backpack matches the search settings");
}

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

2. Применить рюкзак нужной окраски рядом на той же высоте — функция сценария

Параметры и ход выполнения:

  • Поиск ограничен двумя клетками и одинаковой Z. Цвет 0x0044 дан для примера: замените на hue своей вещи. Настройки восстанавливаются даже при ошибке.
return  RunScenario();
 object? RunScenario()
{
    var oldDistance = UO.FindDistance();
    var oldZ = UO.FindVertical();
    try
    {
        UO.FindDistance(2);
        UO.FindVertical(0);
        var bag = UO.UseFromGround(0x0E75, 0x0044);
        if (Truth(bag != 0))
        {
            UO.AddObject("colored_ground_bag", bag);
        }
    }
    finally
    {
        UO.FindDistance(oldDistance);
        UO.FindVertical(oldZ);
    }

    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. Полная функция с явным радиусом поиска — класс сценария

Параметры и ход выполнения:

  • radius задаёт FindDistance, а не третий аргумент UseFromGround. 3000 мс — время просмотра примера, не подтверждение открытия; тип окна 3 — контейнер. В Find* остаются результаты этого поиска.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var selected = OpenGroundBagWithin(2);
        if (Truth(selected != 0))
        {
            await Delay(3000);
            UO.CloseClientUIWindow(3, selected);
        }

        return null;
    }

    dynamic OpenGroundBagWithin(dynamic radius)
    {
        var previous = UO.FindDistance();
        try
        {
            UO.FindDistance(radius);
            return UO.UseFromGround(0x0E75, -1);
        }
        finally
        {
            UO.FindDistance(previous);
        }
    }

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

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

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.UseFromGround(type) — UO.UseFromGround(Any)

Параметры: type (Any)

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public int UseFromGround(InjectionValue type) => UseFromGround(type, new InjectionValue(-1));

UO.UseFromGround(type, color) — UO.UseFromGround(Any,Any)

Параметры: type (Any), color (Any)

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public int UseFromGround(InjectionValue type, InjectionValue color)

        {

            int id = bridge.FindType(ResolveType(type), NumberConversions.ToInt(color), 1, -1, false);

            if (id != 0)

                UseObject(id);

            else

                SystemMessage("No matching item found on ground.");

            return id;

        }

UO.UseItemOnMobile

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

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

void UO.UseItemOnMobile(object? itemSerial, object? targetSerial);

Готовит цель персонажа и использует предмет.

Параметры

  • itemSerial — Serial/ID объекта: int, числовая/hex-строка или установленный алиас, например "lasttarget". Это не graphic/type. До действия проверяйте загруженный объект.
  • targetSerial — Serial/ID объекта: int, числовая/hex-строка или установленный алиас, например "lasttarget". Это не graphic/type. До действия проверяйте загруженный объект.

Возвращает

void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.

Поведение

  • ExecuteClientApiCompatibility сначала вызывает bridge.WaitTargetObject(TargetSerial), затем bridge.UseObject(ItemSerial). Аргументы не переставляются. Эти прямые bridge-вызовы не обновляют runtime TicksTarget/TicksUse.
  • Не проверяет тип цели/предмета и не ждёт cursor. Подготовка цели раньше использования предотвращает пропуск быстро пришедшего target, но сервер всё равно определяет допустимость действия.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

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

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.UseItemOnMobile");
UO.UseItemOnMobile("0x40001234", "self");

1. Прямой вызов — прямой скрипт

Параметры и ход выполнения:

  • Готовит цель персонажа и использует предмет.
UO.UseItemOnMobile("0x40001234", "self");

2. Явный вариант — функция сценария

Параметры и ход выполнения:

  • ExecuteClientApiCompatibility сначала вызывает bridge.WaitTargetObject(TargetSerial), затем bridge.UseObject(ItemSerial). Аргументы не переставляются. Эти прямые bridge-вызовы не обновляют runtime TicksTarget/TicksUse.
return  RunScenario();
 object? RunScenario()
{
    var item = UO.GetSerial("lastobject");
    var mobile = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(item)) && Truth(UO.Exists(mobile)))
    {
        UO.UseItemOnMobile(item, mobile);
    }

    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. Полная вспомогательная функция — класс сценария

Параметры и ход выполнения:

  • Не проверяет тип цели/предмета и не ждёт cursor. Подготовка цели раньше использования предотвращает пропуск быстро пришедшего 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 item = UO.GetSerial("lastobject");
        if (Truth(UO.Exists(item)))
        {
            UO.UseItemOnMobile(item, "self");
            UO.Print(UO.Waiting());
        }

        return null;
    }

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

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

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.UseItemOnMobile(itemSerial, targetSerial) — UO.UseItemOnMobile(Any,Any)

Параметры: itemSerial (Any), targetSerial (Any)

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "useitemonmobile": bridge.WaitTargetObject(Arg(1)); bridge.UseObject(Arg(0)); return InjectionValue.Unit;

UO.UseObject

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

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

void UO.UseObject(object? objID);

Запрашивает использование объекта по serial. Bridge вызывает GameActions.DoubleClick; предмет не ищется по type.

Параметры

  • objID — Serial/ID объекта: int, числовая/hex-строка или установленный алиас, например "lasttarget". Это не graphic/type. До действия проверяйте загруженный объект.

Возвращает

void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.

Поведение

  • GetObject разрешает алиас; неизвестное имя даёт -1. После вызова runtime обновляет TicksUse значением UO.Timer; это момент запроса, а не подтверждение сервера.
  • Bridge посылает запрос на игровом потоке. Действуют правила сервера; встроенного ожидания подтверждения нет.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

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

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

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

1. Прямой вызов — прямой скрипт

Параметры и ход выполнения:

  • Запрашивает использование объекта по serial. Bridge вызывает GameActions.DoubleClick; предмет не ищется по type.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
    UO.UseObject(id);
}

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

2. Явный вариант — функция сценария

Параметры и ход выполнения:

  • GetObject разрешает алиас; неизвестное имя даёт -1. После вызова runtime обновляет TicksUse значением UO.Timer; это момент запроса, а не подтверждение сервера.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("self");
    if (Truth(UO.Exists(id)))
    {
        UO.UseObject(id);
    }

    return null;
}

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

3. Полная вспомогательная функция — класс сценария

Параметры и ход выполнения:

  • Bridge посылает запрос на игровом потоке. Действуют правила сервера; встроенного ожидания подтверждения нет.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

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

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

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

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

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.UseObject(objID) — UO.UseObject(Any)

Параметры: objID (Any/Integer/String)

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "useobject": bridge.UseObject(Arg(0)); return InjectionValue.Unit;

UO.UseObject(objID) — UO.UseObject(Integer)

Параметры: objID (Any/Integer/String)

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public void UseObject(int id)

        {

            bridge.UseObject(id);

            ticksUse = Timer();

        }

UO.UseObject(objID) — UO.UseObject(String)

Параметры: objID (Any/Integer/String)

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public void UseObject(string id) => UseObject(GetObject(id));

UO.UseType

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

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

int UO.UseType(object? @type);
int UO.UseType(object? @type, object? color);
int UO.UseType(object? @type, object? color, object? container);
int UO.UseType(object? @type, object? color, object? container, object? distance);
int UO.UseType(object? @type, object? color, object? container, object? distance, object? nearest);
int UO.UseType(object? @type, object? color, object? container, object? distance, object? nearest, object? maxZ);

Находит один предмет нужного graphic/type и применяет его. Например, выпить зелье из рюкзака, открыть лежащий рядом рюкзак или использовать вещь из выбранного контейнера. Персонажа эта команда не ищет и не перемещает. Если предмет требует прицел, цель нужно подготовить отдельно.

Параметры

  • type — Graphic предмета: число или hex-строка; например 0x0F0C — тип лечебного зелья, 0x0E75 — рюкзака. Это не serial и не body персонажа. Отрицательное число или 0xFFFF разрешают любой type; для осмысленного действия лучше точный graphic.
  • color — Hue предмета, по умолчанию -1 (любой). Любое отрицательное число или 0xFFFF снимает фильтр; 0 выбирает именно неокрашенную вещь. Не notoriety и не цвет текста.
  • container — По умолчанию -1: свой рюкзак и загруженные вложенные контейнеры. "my" означает то же. "backpack" либо явный serial контейнера задают корень рекурсивного обхода. ground/"ground"/UO.Ground(), числовые 0/1 обозначают только предметы мира. Self не является синонимом backpack; используйте явный рюкзак. Неизвестный/нулевой объектный алиас может разрешиться как рюкзак: передаваемый контейнер предварительно проверяйте через Exists.
  • distance — Максимальная геометрическая дальность X/Y, не длина пути. По умолчанию или при отрицательном аргументе — FindDistance. 0 означает ту же клетку. У вещей в контейнере клиент учитывает расстояние до владельца.
  • nearest — По умолчанию true: выбрать ближайшую вещь, при равенстве меньший serial. false: первый найденный при обходе без сортировки. Не число предметов и не режим бега.
  • maxZ — Максимальная абсолютная разница мировой высоты Z с персонажем. По умолчанию или при отрицательном аргументе — FindVertical. 0 требует одинаковую Z. Для вещи в сумке используется высота внешнего контейнера на земле либо персонажа-владельца; внутренние координаты гампа не считаются мировыми. Это фильтр высоты, не проверка проходимости или линии обзора.

Возвращает

int — serial предмета, для которого вызван UseObject; 0, если совпадений нет. Даже регистрация с ReturnKind object? фактически возвращает число. Это не true/false и не подтверждение применения сервером: проверяйте used != 0, а не used == true. Для успеха эффекта нужна отдельная проверка состояния, содержимого или журнала.

Поведение

  • От 1 до 6 аргументов. Чтобы задать дальность, укажите также color и container. Чтобы задать maxZ, заполните все шесть позиций. Массив type, маска через | и дополнительные цели этой командой не принимаются.
  • Обычные формы с int/string и расширенные формы используют CompactUseType: только items, Ignore, расстояние и высота; контейнеры обходятся рекурсивно по уже загруженному содержимому. Контейнер для загрузки автоматически не открывается. FindItem/FindCount/GetFoundItems этой ветвью не обновляются.
  • Высота общих владельцев и контейнеров вычисляется один раз за вызов, чтобы не повторять обход для каждой стопки. Циклическая или чрезмерно глубокая цепочка контейнеров (128 звеньев без найденного корня) не используется как совпадение по высоте.
  • Сохранена общая совместимая регистрация двух object?: она направляет вызов в bridge.UseType, использующий FindType по рюкзаку, обновляющий Find* и выбирающий первый результат. Для предсказуемой компактной формы используйте int/string, а не неявные преобразования неподходящих видов значений.
  • UseObject отправляет действие применения, но команда не ждёт target, исцеления, выпивания, открытия окна или серверного отказа. Дальность поиска не расширяет допустимую сервером дальность использования.
  • При отсутствии совпадения компактная форма печатает сообщение и возвращает 0. При отсутствии персонажа/связи результат не следует считать разрешением на действие. Для точного ID используйте UO.UseObject.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

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

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.UseType(0x0F0C);
UO.Print("UseType: " + Convert.ToString(result));

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

Параметры и ход выполнения:

  • 0x0F0C — пример стандартного типа лечебного зелья. Сервер может отклонить действие из-за состояния персонажа, задержки или собственных правил. Цвет и дальность отдельно не заданы: действуют defaults.
if (!(Truth(UO.Connected())) || Truth(UO.Dead()))
{
    return null;
}
var used = UO.UseType(0x0F0C);
if (Truth(used == 0))
{
    UO.Print("No matching healing potion in the loaded backpack");
}
else
{
    UO.Print("Potion use requested; check health and the game message");
}

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

2. Открыть ближайший рюкзак на земле в пределах двух клеток — функция сценария

Параметры и ход выполнения:

  • 0x0E75 — type рюкзака, -1 — любой hue, ground — предметы мира. 2 — клетки X/Y, true — ближайший, 4 — разница Z. Возврат bag — ID. Доступ к содержимому определяет сервер; команда не подбирает рюкзак.
return  RunScenario();
 object? RunScenario()
{
    var bag = UO.UseType(0x0E75, -1, "ground", 2, true, 4);
    if (Truth(bag != 0))
    {
        UO.AddObject("nearby_bag", bag);
    }
    else
    {
        UO.Print("No suitable ground backpack within the selected bounds");
    }

    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. Использовать предмет из заранее выбранного контейнера — класс сценария

Параметры и ход выполнения:

  • itemType — graphic вещи, source — отдельный serial контейнера. Помощник возвращает serial/0 так же, как UseType. Даже найденную вещь сервер может запрещать использовать из чужого или удалённого контейнера.
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 source = Asc(UO.GetSerial("lasttarget"), 0);
        if (Truth(source == 0) || !(Truth(UO.Exists(source))))
        {
            return null;
        }

        UO.AddObject("supply", source);
        var used = UseFromNamedSupply(0x0F0C);
        if (Truth(used == 0))
        {
            UO.Print("Supply item was not found with these filters");
        }

        return null;
    }

    dynamic UseFromNamedSupply(dynamic itemType)
    {
        var source = Asc(UO.GetSerial("supply"), 0);
        if (Truth(source == 0) || !(Truth(UO.Exists(source))))
        {
            return 0;
        }

        return UO.UseType(itemType, 0, source, 2, false, 16);
    }

    int Asc(object? value, int fallback = 0)
    {
        string text = Convert.ToString(value) ?? "";
        if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
            return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
        return int.TryParse(text, out int number) ? number : fallback;
    }

    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.UseType(type) — UO.UseType(Integer)

Параметры: type (Integer/String)

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public int UseType(int type) => UseType(type, -1);

UO.UseType(type) — UO.UseType(String)

Параметры: type (Integer/String)

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public int UseType(string type) => UseType(ResolveType(type));

UO.UseType(type, color) — UO.UseType(Any,Any)

Параметры: type (Any/Integer/String), color (Any/Integer/String)

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "usetype": return new InjectionValue(bridge.UseType(ResolveType(arguments[0]), arguments.Length > 1 ? Arg(1) : -1));

UO.UseType(type, color) — UO.UseType(Integer,Integer)

Параметры: type (Any/Integer/String), color (Any/Integer/String)

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public int UseType(int type, int color) => CompactUseType(new[]

        {

            new InjectionValue(type),

            new InjectionValue(color)

        });

UO.UseType(type, color) — UO.UseType(Integer,String)

Параметры: type (Any/Integer/String), color (Any/Integer/String)

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public int UseType(int type, string color) => UseType(type, NumberConversions.ToInt(color));

UO.UseType(type, color) — UO.UseType(String,Integer)

Параметры: type (Any/Integer/String), color (Any/Integer/String)

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public int UseType(string type, int color) => UseType(ResolveType(type), color);

UO.UseType(type, color) — UO.UseType(String,String)

Параметры: type (Any/Integer/String), color (Any/Integer/String)

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public int UseType(string type, string color) => UseType(ResolveType(type), NumberConversions.ToInt(color));

UO.UseType(type, color, container) — UO.UseType(Any,Any,Any)

Параметры: type (Any), color (Any), container (Any)

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

При вызове:

Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.

Внутренний код реализации, не самостоятельный скрипт.

values => new InjectionValue(CompactUseType(values))

UO.UseType(type, color, container, distance) — UO.UseType(Any,Any,Any,Any)

Параметры: type (Any), color (Any), container (Any), distance (Any)

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

При вызове:

Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.

Внутренний код реализации, не самостоятельный скрипт.

values => new InjectionValue(CompactUseType(values))

UO.UseType(type, color, container, distance, nearest) — UO.UseType(Any,Any,Any,Any,Any)

Параметры: type (Any), color (Any), container (Any), distance (Any), nearest (Any)

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

При вызове:

Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.

Внутренний код реализации, не самостоятельный скрипт.

values => new InjectionValue(CompactUseType(values))

UO.UseType(type, color, container, distance, nearest, maxZ) — UO.UseType(Any,Any,Any,Any,Any,Any)

Параметры: type (Any), color (Any), container (Any), distance (Any), nearest (Any), maxZ (Any)

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

При вызове:

Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.

Внутренний код реализации, не самостоятельный скрипт.

values => new InjectionValue(CompactUseType(values))

UO.UseWorldObject

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

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

void UO.UseWorldObject(object? serialOrName);

Разрешает serialOrName через GetObject и вызывает UseObject. Строковое имя — алиас объекта, не имя graphic/type.

Параметры

  • serialOrName — Serial/ID объекта: int, числовая/hex-строка или установленный алиас, например "lasttarget". Это не graphic/type. До действия проверяйте загруженный объект.

Возвращает

void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.

Поведение

  • В metadata зарегистрирована прямо на UserObject. Это обычное использование serial, а не поиск во всём серверном мире.
  • Bridge посылает запрос на игровом потоке. Действуют правила сервера; встроенного ожидания подтверждения нет.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

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

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

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

1. Прямой вызов — прямой скрипт

Параметры и ход выполнения:

  • Разрешает serialOrName через GetObject и вызывает UseObject. Строковое имя — алиас объекта, не имя graphic/type.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
    UO.UseWorldObject(id);
}

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

2. Явный вариант — функция сценария

Параметры и ход выполнения:

  • В metadata зарегистрирована прямо на UserObject. Это обычное использование serial, а не поиск во всём серверном мире.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("self");
    if (Truth(UO.Exists(id)))
    {
        UO.UseWorldObject(id);
    }

    return null;
}

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

3. Полная вспомогательная функция — класс сценария

Параметры и ход выполнения:

  • Bridge посылает запрос на игровом потоке. Действуют правила сервера; встроенного ожидания подтверждения нет.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

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

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

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

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

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.UseWorldObject(serialOrName) — UO.UseWorldObject(Any)

Параметры: serialOrName (Any)

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public void UserObject(InjectionValue serialOrName)

            => UseObject(GetObject(serialOrName));

UO.UserObject

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

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

void UO.UserObject(object? serialOrName);

Разрешает serialOrName через GetObject и вызывает UseObject. Строковое имя — алиас объекта, не имя graphic/type.

Параметры

  • serialOrName — Serial/ID объекта: int, числовая/hex-строка или установленный алиас, например "lasttarget". Это не graphic/type. До действия проверяйте загруженный объект.

Возвращает

void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.

Поведение

  • Тот же путь использования, что UO.UseWorldObject. Команда не создаёт пользовательский объект и не добавляет имя AddObject.
  • Bridge посылает запрос на игровом потоке. Действуют правила сервера; встроенного ожидания подтверждения нет.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

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

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

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

1. Прямой вызов — прямой скрипт

Параметры и ход выполнения:

  • Разрешает serialOrName через GetObject и вызывает UseObject. Строковое имя — алиас объекта, не имя graphic/type.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
    UO.UserObject(id);
}

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

2. Явный вариант — функция сценария

Параметры и ход выполнения:

  • Тот же путь использования, что UO.UseWorldObject. Команда не создаёт пользовательский объект и не добавляет имя AddObject.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("self");
    if (Truth(UO.Exists(id)))
    {
        UO.UserObject(id);
    }

    return null;
}

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

3. Полная вспомогательная функция — класс сценария

Параметры и ход выполнения:

  • Bridge посылает запрос на игровом потоке. Действуют правила сервера; встроенного ожидания подтверждения нет.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

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

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

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

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

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.UserObject(serialOrName) — UO.UserObject(Any)

Параметры: serialOrName (Any)

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public void UserObject(InjectionValue serialOrName)

            => UseObject(GetObject(serialOrName));

Clone this wiki locally