Skip to content

RU UO Topic items

Codex edited this page Oct 12, 2026 · 4 revisions

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

Предметы

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

Свойства, использование и перенос предметов. Serial выбирает конкретный предмет; type/graphic выбирает вид. Перенос единиц стека и число переносимых items имеют разные параметры.

Разделы

Тема Команды и пояснения
Item Properties UO.GetSerial · UO.GetType · UO.GetGraphic · UO.GetColor · UO.GetQuantity · UO.GetName · UO.GetTooltip · UO.ContainerOf · UO.GetParent · UO.GetLayer · UO.IsMovable · UO.GetX · UO.GetY · UO.GetZ
Поиск предметов UO.FindType · UO.FindTypeEx · UO.FindTypesArrayEx · UO.FindItem · UO.FindAnyType · UO.FindAtCoord · UO.FindList · UO.FindDistance · UO.FindVertical
Использование предметов UO.UseObject · UO.UseType · UO.UseFromGround · UO.UseWorldObject · UO.UseItemOnMobile
Moving Предметы UO.Grab · UO.Drag · UO.Drop · UO.MoveItem · UO.MoveItems · UO.MassMove · UO.EmptyContainer
Ground Предметы UO.GetWorldItems · UO.FindType · UO.CountGround · UO.MoveItem
Контейнерные предметы UO.GetContent · UO.FindTypeEx · UO.OpenContainer
Поддельные/клиентские товары UO.MakeFakeItem · UO.DeleteObject
Dye UO.Dye

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

Свойства предмета

UO.Exists · UO.IsObjectExists · UO.GetSerial · UO.GetType · UO.GetGraphic · UO.GetColor · UO.GetQuantity · UO.Name · UO.GetName · UO.GetAltName · UO.GetTooltip · UO.GetTooltipRec · UO.GetLayer · UO.GetLocked · UO.IsMovable · UO.GetFlags · UO.ReceiveObjectName · UO.UpdateObject

Использование предметов

UO.UseObject · UO.UseType · UO.UseFromGround · UO.UseWorldObject · UO.UseItemOnMobile · UO.ClickOnObject · UO.TicksUse

Moving Предметы

UO.Grab · UO.Drag · UO.DragItem · UO.Drop · UO.DropHere · UO.DropItem · UO.MoveItem · UO.MoveItems · UO.MassMove · UO.EmptyContainer · UO.DropDelay · UO.DropCheckCoord · UO.Picking

Поддельные/клиентские предметы

UO.MakeFakeItem · UO.DeleteObject

Dye

UO.Dye

Сохраненные объекты

UO.AddObject · UO.AddType · UO.EasyObject · UO.UserObject · UO.LastObject · UO.Forget

Примеры по теме

В каждой карточке команды есть несколько самостоятельных сценариев: прямой код, функции и классы. Ниже приведены отдельные короткие сценарии; ограничения и полный разбор находятся в карточках.

UO.MoveItem

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

var ok = UO.MoveItem("loot");
UO.Print("Move request: " + Convert.ToString(ok));

UO.MassMove

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

UO.MassMove(350, 0);
UO.Print("Drag one sample item to the destination container");

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

1 · 2

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


UO.AddObject

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

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

void UO.AddObject(object? name);
void UO.AddObject(object? name, object? objectRawId);

Сохраняет именованный serial объекта для последующего использования скриптами. Двухаргументная форма задаёт объект сразу; одноаргументная запускает выбор объекта курсором.

Параметры

  • name — непустое имя, по которому объект будет доступен в runtime.
  • objectRawId — serial или уже сохранённое имя объекта. Одноаргументная перегрузка этот параметр не принимает, а запрашивает выбор объекта.

Возвращает

void. Проверяйте сохранённую привязку чтением объекта по имени; вызов не возвращает serial.

Поведение

  • При двух аргументах runtime разрешает objectRawId и сохраняет serial под name. При одном аргументе клиент запрашивает выбор объекта: выбирается предмет или mobile, но не клетка карты. Перед выбором прежняя привязка с таким именем удаляется; отмена/потеря курсора не восстанавливает её.

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

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

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

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

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

UO.Print("Calling UO.AddObject");
UO.AddObject("target");

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

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

  • Сохранить serial известного предмета под удобным именем.
UO.AddObject("supplyBox", "0x40012345");

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

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

  • Запросить выбор предмета или mobile курсором и назвать его target.
return  RunScenario();
 object? RunScenario()
{
    UO.AddObject("target");
    return null;
}

3. Повторное сохранение имени заменяет привязку на новый serial. — класс сценария

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

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

     public object? RunScenario()
    {
        var selectedSerial = "0x40012345";
        UO.AddObject("supplyBox", selectedSerial);
        return null;
    }
}

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

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

UO.AddObject(name) — UO.AddObject(String)

Параметры: name (String)

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

При вызове:

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

public void AddObject(string name)

        {

            SystemMessage($"What is {name}");

            bridge.AddObject(name);

        }

UO.AddObject(name, objectRawId) — UO.AddObject(Any,Any)

Параметры: name (Any), objectRawId (Any)

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

При вызове:

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

public void AddObject(InjectionValue name, InjectionValue objectRawId) 

            => ObjectChecked(objectRawId, id => AddObject((string)name, id));

UO.AddType

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

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

void UO.AddType(object? name);
void UO.AddType(object? name, object? @type);

Сохраняет понятное имя для графического типа предмета или тела mobile. Например, после UO.AddType("bandage", 0x0E21) можно искать или использовать бинты через имя "bandage", не повторяя числовой type в каждой строке. Это настройка соответствия имя → Graphic, а не создание предмета и не запоминание одного конкретного ID.

Параметры

  • name — Обязательная строка в кавычках — ваше имя типа. Пробелы по краям удаляются, регистр не важен: "Bandage" и "bandage" — одна запись. Пустая строка, числовое имя, слово any, символ | и управляющие символы запрещены. Это значение параметра, а не новая переменная или UO-команда: в последующих вызовах также нужны кавычки.
  • type — Необязательный int 0..65535: Graphic/type, например 0x0E21 или 3617. Допустима строка с десятичным/шестнадцатеричным числом либо имя уже сохранённого типа; последнее копирует его текущее число, не создаёт связь между именами. ID вида 0x40001001, отрицательное число, дробь и неизвестное имя не принимаются. Если аргумент отсутствует, появляется курсор выбора: щёлкните по загруженному предмету, в том числе внутри контейнера, или mobile. Сохраняется Graphic выбранного объекта; поверхность земли и статический тайл не подходят.

Возвращает

void — возвращаемого значения нет. Пишите отдельной строкой, без var result = и без сравнения с true/1. Команда не возвращает выбранный type, serial или признак успешного выбора. При отмене мышью старая запись сохраняется; если имени раньше не было, оно остаётся неопределённым. Следующая строка скрипта выполняется и после обычной отмены, поэтому не запускайте действие автоматически, предполагая, что пользователь обязательно выбрал новый предмет.

Поведение

  • Форма AddType(name, type) сохраняет число сразу, без курсора и без сетевого действия. Повтор с тем же именем заменяет его тип. Ошибочное значение не уничтожает прежнюю запись. Форма AddType(name) ждёт выбора; Esc, замена курсора другим действием или неподходящая цель оставляют запись без изменения. Принудительная остановка скрипта прерывает ожидание и освобождает только принадлежащий ему курсор.
  • Имена типов хранятся отдельно от AddObject: одинаковое слово может обозначать type в FindType и serial в UseObject. AddType("supply", 0x0E21) само по себе не делает UseObject("supply") допустимым. Для конкретного предмета применяйте AddObject/GetSerial; для семейства предметов — AddType и параметр type.
  • Имена разрешаются в параметрах type у FindType (все формы), FindTypeEx, FindTypesArrayEx, FindList, FindNotoriety, GetWorldItems, UseType, UseFromGround, Count, CountGround, CountEx, EquipT, WaitTargetType, WaitTargetGround и WaitTargetObjectType. В масках типов GetMobiles/FindAnyType/WaitTarget можно комбинировать имена через | или массив; правила notoriety остаются отдельными. Слова human/near и другие фильтры FindMobile не переопределяются.
  • Сохраняется только Graphic, без цвета, количества, контейнера, имени предмета, слоя или свойств. Два предмета одного типа разных цветов требуют отдельного color в поиске. Запись не подтверждает, что предмет сейчас существует, доступен или что сервер разрешит действие.

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

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

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

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

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

UO.Print("Calling UO.AddType");
UO.AddType("my_tool");

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

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

  • gold_stack — имя; 0x0EED — Graphic золота. FindType: -1 — любой цвет, ground — земля, 2 — радиус поиска. Возвращается строка serial или пустая строка.
  • MoveItem получает найденный serial, 0 для всей стопки и backpack как назначение. Это одна стопка, а не все стопки в радиусе. Доступность переноса и реальный результат зависят от сервера; определение типа само ничего не переносит.
UO.AddType("gold_stack", 0x0EED);
var item = UO.FindType("gold_stack", -1, "ground", 2);
if (Truth(item == ""))
{
    UO.Print("No loaded gold stack within 2 tiles");
    return null;
}
var moved = UO.MoveItem(item, 0, "backpack");
if (Truth(moved == 0))
{
    UO.Print("Move request failed");
}

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

2. Использовать бинт только при нехватке здоровья — функция сценария

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

  • Строковое число 0x0E21 сохраняется как int Graphic. Life/MaxHP сравнивают HP персонажа. FindType ищет любой цвет рекурсивно в рюкзаке; -1 в distance использует стандартное поведение поиска.
  • self — цель применения, bandage после FindType — переменная с serial. Очередь таргета готовится до использования предмета. Скрипт отправляет использование и не утверждает, что лечение уже завершилось; таймер/правила лечения зависят от сервера.
return  RunScenario();
 object? RunScenario()
{
    UO.AddType("bandage", "0x0E21");
    if (Truth(UO.Life() >= UO.MaxHP()))
    {
        return null;
    }

    var bandage = UO.FindType("bandage", -1, "backpack", -1, true);
    if (Truth(bandage == ""))
    {
        UO.Print("No loaded bandages in backpack");
        return null;
    }

    UO.WaitTargetObject("self");
    UO.UseObject(bandage);
    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. Назначить свой инструмент мышью, применять отдельной процедурой — класс сценария

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

  • В Main указан только name, поэтому открывается курсор. Сохраняется тип инструмента, не его ID и не цвет. UseSavedTool — обычная отдельная процедура C#, а не встроенная команда.
  • UseType ищет экземпляр сохранённого типа любого цвета в рюкзаке и использует его; возвращает int serial или 0 при отсутствии. Если имя никогда не было определено, это ошибка аргумента, а не результат 0. После отмены назначения Main не вызывает UseSavedTool.
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.AddType("my_tool");
        return null;
    }

    void UseSavedTool()
    {
        var used = UO.UseType("my_tool", -1, "backpack");
        if (Truth(used == 0))
        {
            UO.Print("No matching loaded tool in backpack");
        }
    }

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

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

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

При вызове:

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

case "addtype":

                    AddType(arguments);

                    break;

UO.AddType(name, type) — UO.AddType(Any,Any)

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

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

При вызове:

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

case "addtype":

                    AddType(arguments);

                    break;

UO.ClickOnObject

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

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

void UO.ClickOnObject(object? objID);

Отправляет одиночный щелчок по объекту через GameActions.SingleClick.

Параметры

  • objID — Serial объекта или поддерживаемое имя self/backpack/lasttarget/сохранённого объекта; числовые строки и 0x-строки разрешаются runtime.

Возвращает

void — возвращаемого значения нет.

Поведение

  • Click разрешает ссылку через ObjectChecked. ClickOnObject сначала использует Arg для serial и вызывает Click(int). Это запрос подписи/информации объекта, а не DoubleClick и не использование предмета. Серверный ответ приходит асинхронно.

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

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

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

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

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

UO.Print("Calling UO.ClickOnObject");
UO.ClickOnObject("self");

1. Щёлкнуть по персонажу — прямой скрипт

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

  • Одиночный щелчок отправляется по self.
UO.ClickOnObject("self");

2. Щёлкнуть по последней цели — функция сценария

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

  • Перед отправкой проверяется локальное существование цели.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.LastTarget();
    if (Truth(UO.Exists(target)))
    {
        UO.ClickOnObject(target);
    }

    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. Щёлкнуть по рюкзаку — класс сценария

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

  • Одиночный щелчок по рюкзаку не открывает его как двойной щелчок.
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.Backpack();
        if (Truth(bag != 0))
        {
            UO.ClickOnObject(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.ClickOnObject(objID) — UO.ClickOnObject(Any)

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

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

При вызове:

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

case "clickonobject": Click(Arg(0)); return InjectionValue.Unit;

UO.DeleteObject

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

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

void UO.DeleteObject(object? name);

Удаляет сохранённое имя объекта из таблицы runtime.

Параметры

  • name — string имени в таблице Objects; удаляется только эта запись.

Возвращает

void — возвращаемого значения нет.

Поведение

  • При найденном имени удаляет запись и печатает подтверждение; при отсутствующем имени печатает сообщение not found. Серверный объект и его содержимое не удаляются.

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

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

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

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

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

UO.Print("Calling UO.DeleteObject");
UO.DeleteObject("temporary");

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

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

  • Удаляется только связь temporary с serial персонажа.
UO.AddObject("temporary",UO.Self());
UO.DeleteObject("temporary");

2. Отсутствующее имя — функция сценария

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

  • Отсутствующее имя вызывает диагностическое сообщение.
return  RunScenario();
 object? RunScenario()
{
    UO.DeleteObject("missing-example-name");
    return null;
}

3. Сохранить имя в переменной — класс сценария

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

  • string-переменная определяет точную удаляемую запись.
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 name = "temporary";
        UO.AddObject(name, UO.Self());
        UO.DeleteObject(name);
        return null;
    }
}

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

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

UO.DeleteObject(name) — UO.DeleteObject(String)

Параметры: name (String)

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

При вызове:

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

public void DeleteObject(string name)

        {

            if (objects.TryGet(name, out int value))

            {

                objects.Remove(name);

                SystemMessage($"Object {name} has been deleted");

            }

            else

                SystemMessage($"Object {name} not found");

        }

UO.Drag

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

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

int UO.Drag(object? id);
int UO.Drag(object? id, object? amount);
int UO.Drag(object? id, object? amount, object? timeout);
void UO.Drag(object? fromX, object? fromY, object? toX, object? toY);

Поднимает конкретный предмет на курсор; отдельная четырёхаргументная форма перетаскивает мышь в окне Windows.

Параметры

  • id — Serial конкретного предмета/персонажа: число, hex/десятичная строка, self/backpack/lasttarget/lastobject/lastcontainer/lastcorpse/finditem/laststatus либо сохранённое имя AddObject. Это не type. Объект должен быть загружен; перед действием проверяйте Exists.
  • amount — Количество единиц внутри одного стека. 0 или отрицательное значение означает весь стек; положительное ограничивается доступным количеством. Это НЕ число стопок, которое ограничивает MassMove. При отсутствии равен 0.
  • timeout — Необязательный третий аргумент: ожидание наблюдаемого Picking до указанного числа миллисекунд; по умолчанию 0. Отрицательное значение приравнивается к 0.
  • fromX — Только форма из четырёх int: начальный X мыши в пикселях клиентского окна.
  • fromY — Начальный Y мыши в пикселях клиентского окна.
  • toX — Конечный X мыши в пикселях.
  • toY — Конечный Y мыши в пикселях.

Возвращает

При 1..3 аргументах int: 1 — запрос подъёма принят клиентом (при timeout>0 также наблюдался занятый курсор); 0 — подъём отклонён или истёк тайм-аут. При четырёх аргументах null: возвращаемого значения нет. Это не ID предмета.

Поведение

  • Для игрового переноса предпочтительна форма id[,amount[,timeout]] и последующий DropItem либо единый MoveItem.
  • Форма fromX/fromY/toX/toY использует события мыши Windows: перемещение, нажатие, перемещение, отпускание. Она не имеет серверного подтверждения и зависит от реального содержимого/фокуса окна.
  • Занятый курсор не равнозначен успешному переносу в назначение. Захват и сброс — отдельные действия.

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

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

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

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

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

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

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

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

  • loot — serial через AddObject. amount=0 означает весь стек; -1/-1 задаёт автоматическое место в гампе.
  • DropItem завершает захват того же runtime. Единица означает отправку запроса, а не подтверждение сервера.
if (Truth(UO.Drag("loot", 0)))
{
    var dropped = UO.DropItem("backpack", -1, -1, 0);
    UO.Print("Drop request: " + Convert.ToString(dropped));
}

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

2. Взять часть стека с ограниченным ожиданием — функция сценария

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

  • amount=10 — до десяти единиц одной стопки; timeout=500 мс.
  • 44/55 — координаты внутри рюкзака, не карты. Если предмет взять нельзя, DropItem не вызывается.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Drag("loot", 10, 500)))
    {
        var dropped = UO.DropItem("backpack", 44, 55, 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. Проверить занятые руки до захвата — класс сценария

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

  • Один аргумент Drag означает весь стек и timeout=0.
  • Picking проверяет общий курсор клиента. Не запускайте два независимых переноса одновременно.
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(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;
}

4. Четыре координаты мыши — прямой скрипт

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

  • Это пиксели окна: начало (100,120), конец (260,180). Здесь нет serial, amount или timeout.
  • Используйте только когда нужные элементы находятся в этих местах; для предметов надёжнее адресация по serial.
UO.Drag(100, 120, 260, 180);

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

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

UO.Drag(id) — UO.Drag(Any)

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

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

При вызове:

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

public int Drag(InjectionValue id) => Drag(id, InjectionValue.Zero, InjectionValue.Zero);

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

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

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

При вызове:

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

public int Drag(InjectionValue id, InjectionValue amount) => Drag(id, amount, InjectionValue.Zero);

UO.Drag(id, amount, timeout) — UO.Drag(Any,Any,Any)

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

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

При вызове:

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

public int Drag(InjectionValue id, InjectionValue amount, InjectionValue timeout)

        {

            int serial = GetObject(id);

            if (serial == 0)

                return 0;

            int requestedAmount = NumberConversions.ToInt(amount);

            int timeoutMs = Math.Max(0, NumberConversions.ToInt(timeout));

            int result = bridge.DragItem(serial, requestedAmount);

            if (result == 0 || timeoutMs <= 0)

                return result;



            DateTime deadline = DateTime.UtcNow.AddMilliseconds(timeoutMs);

            do

            {

                if (bridge.Picking() != 0)

                    return 1;

                if (DateTime.UtcNow >= deadline)

                    break;

                bridge.Wait(10);

            }

            while (true);



            SystemMessage($"UO.Drag: item pickup was not observable within {timeoutMs} ms.");

            return 0;

        }

UO.Drag(fromX, fromY, toX, toY) — UO.Drag(Integer,Integer,Integer,Integer)

Параметры: fromX (Integer), fromY (Integer), toX (Integer), toY (Integer)

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

При вызове:

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

public void Drag(int fromX, int fromY, int toX, int toY) => bridge.Drag(fromX, fromY, toX, toY);

UO.DragItem

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

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

dynamic UO.DragItem(object? objID, object? count);

Поднимает конкретный предмет и запоминает его для DropItem этого runtime.

Параметры

  • objID — Serial конкретного предмета/персонажа: число, hex/десятичная строка, self/backpack/lasttarget/lastobject/lastcontainer/lastcorpse/finditem/laststatus либо сохранённое имя AddObject. Это не type. Объект должен быть загружен; перед действием проверяйте Exists.
  • count — Количество единиц внутри одного стека. 0 или отрицательное значение означает весь стек; положительное ограничивается доступным количеством. Это НЕ число стопок, которое ограничивает MassMove.

Возвращает

int 1 — клиент принял подъём; 0 — предмет не найден или PickUp отказал. Метадата совместимости object? не означает произвольный тип результата. Это не serial.

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

Поведение

  • Оба аргумента обязательны. Встроенного ожидания подтверждения нет; форма Drag(id,amount,timeout) добавляет ожидание локального Picking.
  • После успешного захвата завершите действие DropItem. Предмет, вручную взятый мышью, не устанавливает память DragItem данного runtime.

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

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

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

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

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

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

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

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

  • ObjID=loot через AddObject, Count=0 — весь стек.
  • Вторая команда сбрасывает тот же поднятый предмет.
if (Truth(UO.DragItem("loot", 0)))
{
    var ok = UO.DropItem("backpack", -1, -1, 0);
}

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

2. Поднять пять единиц — функция сценария

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

  • Замените ObjID своим serial. Count=5 относится к единицам одной стопки.
  • Место 44/55 находится внутри гампа рюкзака.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.DragItem(0x40001234, 5)))
    {
        var ok = UO.DropItem("backpack", 44, 55, 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. Показать неудачный захват — класс сценария

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

  • picked — int 1/0.
  • Не вызывайте DropItem после неудачного захвата: курсор может принадлежать другому действию.
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 picked = UO.DragItem("loot", 0);
        if (Truth(picked == 0))
        {
            UO.Print("Item was not picked up");
        }
        else
        {
            var ok = 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;
}

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

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

UO.DragItem(objID, count) — UO.DragItem(Any,Any)

Параметры: objID (Any), count (Any)

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

При вызове:

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

case "dragitem": return new InjectionValue(bridge.DragItem(Arg(0), Arg(1)));

UO.Drop

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

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

int UO.Drop(object? @object);
int UO.Drop(object? @object, object? count);
int UO.Drop(object? @object, object? count, object? destination);
dynamic UO.Drop(object? objID, object? count, object? x, object? y, object? z);

Выполняет полный перенос указанного предмета, по умолчанию на землю под персонажем.

Параметры

  • object — Serial конкретного предмета/персонажа: число, hex/десятичная строка, self/backpack/lasttarget/lastobject/lastcontainer/lastcorpse/finditem/laststatus либо сохранённое имя AddObject. Это не type. Объект должен быть загружен; перед действием проверяйте Exists.
  • objID — Serial конкретного предмета/персонажа: число, hex/десятичная строка, self/backpack/lasttarget/lastobject/lastcontainer/lastcorpse/finditem/laststatus либо сохранённое имя AddObject. Это не type. Объект должен быть загружен; перед действием проверяйте Exists.
  • count — Количество единиц внутри одного стека. 0 или отрицательное значение означает весь стек; положительное ограничивается доступным количеством. Это НЕ число стопок, которое ограничивает MassMove. В короткой форме без count равен 0.
  • destination — Только в форме с тремя аргументами: Serial контейнера или установленное имя AddObject; backpack/self/my выбирают рюкзак, receiving/catchbag — SetCatchBag, а без него рюкзак. lastcontainer/lastobject/lasttarget/lastcorpse/finditem/laststatus допустимы, когда разрешаются в нужный контейнер. ground или 0 явно выбирает землю; -1 — прежний селектор рюкзака. Неизвестное или неустановленное имя вызывает ошибку до захвата предмета. Без аргумента назначения используется рюкзак.
  • x — Только в форме с пятью аргументами: мировая X назначения на земле.
  • y — Мировая Y для пятиаргументной формы.
  • z — Мировая высота для пятиаргументной формы.

Возвращает

int 1 — запрос полного переноса принят клиентом; 0 — не удалось. Пятиаргументная совместимая форма имеет метадату object?, но фактически также возвращает int 1/0. Это не сброс ранее взятого DragItem: для него используйте DropItem.

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

Поведение

  • Зарегистрированы формы с 1, 2, 3 и 5 аргументами. Формы с четырьмя аргументами нет.
  • Drop(item) переносит весь стек на землю под собой; Drop(item,count) задаёт единицы; Drop(item,count,destination) позволяет контейнер.
  • Drop(item,count,X,Y,Z) всегда означает землю. Для контейнера с координатами гампа используйте MoveItem.
  • Действуют ограничения подъёма, DropCheckCoord и проверки сервера. Команда не ждёт отдельного подтверждения доставки.

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

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

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

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

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

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

1. Весь стек под ноги — прямой скрипт

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

  • object=loot через AddObject, count=0 по умолчанию.
  • Назначение — текущая точка персонажа на земле.
var ok = UO.Drop("loot");

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

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

  • count=5 единиц одной стопки; destination=backpack.
  • Третий аргумент здесь контейнер, не X.
return  RunScenario();
 object? RunScenario()
{
    var ok = UO.Drop("loot", 5, "backpack");
    return null;
}

3. Явная точка на земле — класс сценария

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

  • ObjID замените своим serial; Count=0 весь стек; X/Y/Z=1445/1690/0.
  • Для этой формы третье значение — X. Предварительный Drag не нужен.
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.Drop(0x40001234, 0, 1445, 1690, 0);
        return null;
    }
}

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

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

UO.Drop(object) — UO.Drop(Any)

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

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

При вызове:

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

case "drop":

                    if (arguments.Length > 0)

                        return new InjectionValue(MoveItem(arguments[0], arguments.Length > 1 ? arguments[1] : InjectionValue.Zero, arguments.Length > 2 ? arguments[2] : new InjectionValue("ground")));

                    return InjectionValue.False;

UO.Drop(object, count) — UO.Drop(Any,Any)

Параметры: object (Any), count (Any)

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

При вызове:

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

case "drop":

                    if (arguments.Length > 0)

                        return new InjectionValue(MoveItem(arguments[0], arguments.Length > 1 ? arguments[1] : InjectionValue.Zero, arguments.Length > 2 ? arguments[2] : new InjectionValue("ground")));

                    return InjectionValue.False;

UO.Drop(object, count, destination) — UO.Drop(Any,Any,Any)

Параметры: object (Any), count (Any), destination (Any)

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

При вызове:

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

case "drop":

                    if (arguments.Length > 0)

                        return new InjectionValue(MoveItem(arguments[0], arguments.Length > 1 ? arguments[1] : InjectionValue.Zero, arguments.Length > 2 ? arguments[2] : new InjectionValue("ground")));

                    return InjectionValue.False;

UO.Drop(objID, count, x, y, z) — UO.Drop(Any,Any,Any,Any,Any)

Параметры: objID (Any), count (Any), x (Any), y (Any), z (Any)

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

При вызове:

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

case "drop": return new InjectionValue(MoveItemChecked(Arg(0), Arg(1), 0, Arg(2), Arg(3), Arg(4)) ? 1 : 0);

UO.DropCheckCoord

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

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

dynamic UO.DropCheckCoord();
dynamic UO.DropCheckCoord(object? value);

Читает или меняет проверку дальности координат при сбросе предметов на землю.

Параметры

  • value — Необязательное значение: 0 выключает, ненулевой int включает. Без аргумента состояние только читается.

Возвращает

int 0/1 — текущее состояние после возможной записи; обе формы возвращают число.

Поведение

  • MoveItemChecked при наземном назначении и включённом флаге отклоняет Chebyshev-расстояние X/Y больше 2 клеток от персонажа. Проверка не меняет координаты и не проверяет серверное разрешение на перенос. Контейнерные назначения не ограничиваются этим флагом.

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

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

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

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

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

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

1. Прочитать флаг — прямой скрипт

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

  • Чтение возвращает текущую нормализованную настройку.
var enabled = UO.DropCheckCoord();
UO.Print(Convert.ToString(enabled));

2. Включить защиту дальности — функция сценария

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

  • Наземные переносы через MoveItemChecked теперь ограничены двумя клетками.
return  RunScenario();
 object? RunScenario()
{
    var enabled = UO.DropCheckCoord(1);
    UO.Print(Convert.ToString(enabled));
    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()
    {
        var old = UO.DropCheckCoord();
        var temporary = UO.DropCheckCoord(0);
        var restored = UO.DropCheckCoord(old);
        return null;
    }
}

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

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

UO.DropCheckCoord() — UO.DropCheckCoord()

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

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

При вызове:

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

case "dropcheckcoord":

                    if (arguments.Length > 0) state.DropCheckCoord = Arg(0) != 0 ? 1 : 0;

                    return new InjectionValue(state.DropCheckCoord);

UO.DropCheckCoord(value) — UO.DropCheckCoord(Any)

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

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

При вызове:

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

case "dropcheckcoord":

                    if (arguments.Length > 0) state.DropCheckCoord = Arg(0) != 0 ? 1 : 0;

                    return new InjectionValue(state.DropCheckCoord);

UO.DropDelay

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

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

dynamic UO.DropDelay();
dynamic UO.DropDelay(object? value);

Читает или меняет задержку GrabDelay runtime, используемую переносами предметов.

Параметры

  • value — Необязательная задержка в миллисекундах; bridge ограничивает до 50..10000.

Возвращает

Без аргумента int с текущей GrabDelay. Форма записи возвращает null, хотя метаданные обеих форм содержат object?.

Поведение

  • SetDropDelay и GetDropDelay используют State.GrabDelay. Настройка задаёт клиентскую задержку переносов, а не подтверждение их завершения сервером.

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

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

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

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

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

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

1. Прочитать задержку — прямой скрипт

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

  • Чтение возвращает миллисекунды.
var ms = UO.DropDelay();
UO.Print(Convert.ToString(ms));

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

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

  • Запись устанавливает 250 мс.
return  RunScenario();
 object? RunScenario()
{
    UO.DropDelay(250);
    return null;
}

3. Граница снизу — класс сценария

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

  • Ноль ограничивается до 50 мс, после чего восстанавливается прежнее значение.
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 previous = UO.DropDelay();
        UO.DropDelay(0);
        UO.Print(Convert.ToString(UO.DropDelay()));
        UO.DropDelay(previous);
        return null;
    }
}

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

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

UO.DropDelay() — UO.DropDelay()

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

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

При вызове:

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

case "dropdelay":

                    if (arguments.Length > 0) { bridge.SetDropDelay(Arg(0)); return InjectionValue.Unit; }

                    return new InjectionValue(bridge.GetDropDelay());

UO.DropDelay(value) — UO.DropDelay(Any)

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

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

При вызове:

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

case "dropdelay":

                    if (arguments.Length > 0) { bridge.SetDropDelay(Arg(0)); return InjectionValue.Unit; }

                    return new InjectionValue(bridge.GetDropDelay());

UO.DropHere

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

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

int UO.DropHere(object? @object);

Переносит весь указанный предмет/стек на землю в текущую точку персонажа.

Параметры

  • object — Serial конкретного предмета/персонажа: число, hex/десятичная строка, self/backpack/lasttarget/lastobject/lastcontainer/lastcorpse/finditem/laststatus либо сохранённое имя AddObject. Это не type. Объект должен быть загружен; перед действием проверяйте Exists.

Возвращает

int 1 — запрос переноса принят клиентом; 0 — не выполнен. Это не serial и не подтверждение сервера.

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

Поведение

  • Зарегистрирована форма ровно с одним аргументом. Для части стека используйте Drop(item,count) либо MoveItem.
  • X/Y/Z берутся у персонажа во время вызова. Предварительный DragItem не требуется.

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

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

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

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

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

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

1. Бросить известный предмет — прямой скрипт

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

  • object — serial, замените реальным.
  • Весь стек переносится под персонажа.
var ok = UO.DropHere(0x40001234);

2. Использовать сохранённое имя — функция сценария

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

  • loot задан через AddObject.
  • Exists проверяет доступность, а не разрешение сервера на перенос.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("loot")))
    {
        var ok = UO.DropHere("loot");
    }

    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. Обработать отказ клиента — класс сценария

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

  • ok — int 1/0.
  • Для подтверждения серверного результата отдельно проверяйте положение и контейнер предмета.
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.DropHere("loot");
        if (Truth(ok == 0))
        {
            UO.Print("Drop request was not accepted");
        }

        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.DropHere(object) — UO.DropHere(Any)

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

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

При вызове:

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

case "drophere":

                    if (arguments.Length > 0)

                        return new InjectionValue(MoveItem(arguments[0], arguments.Length > 1 ? arguments[1] : InjectionValue.Zero, new InjectionValue("ground"), new InjectionValue(GetX()), new InjectionValue(GetY()), new InjectionValue(GetZ())));

                    return InjectionValue.False;

UO.DropItem

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

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

dynamic UO.DropItem(object? moveIntoID, object? x, object? y, object? z);

Сбрасывает предмет, ранее успешно взятый Drag/DragItem в том же runtime.

Параметры

  • moveIntoID — Serial назначения, backpack либо установленное имя AddObject. Число 0 означает землю. Используйте backpack, а не self: этот низкоуровневый аргумент разрешает self в serial персонажа.
  • x — Для контейнера — место внутри гампа (-1/65535 автоматически); для земли — мировая X.
  • y — Для контейнера — место внутри гампа (-1/65535 автоматически); для земли — мировая Y.
  • z — Высота сброса; в контейнере обычно 0, на земле фактическая Z точки.

Возвращает

int 1 — сброс отправлен и курсор отмечен Dropped; 0 — не было успешного DragItem, курсор изменился/недоступен или назначение недопустимо. Метадата object? совместимости не меняет этот результат. Это не количество и не serial.

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

Поведение

  • Требуются все четыре аргумента. Этот вариант не берёт предмет заново; Drop и MoveItem выполняют полный перенос по serial.
  • Проверяется, что удерживается именно предмет, запомненный этим runtime. Чужой либо вручную взятый предмет не должен сбрасываться случайно.
  • После отправки память захвата очищается. Установленный GrabDelay добавляет паузу в потоке скрипта. Серверный отказ возможен после возврата.

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

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

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

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

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

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

1. Автоматическое место в рюкзаке — прямой скрипт

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

  • MoveIntoID=backpack, X/Y=-1, Z=0.
  • Проверяется успешный захват до сброса.
if (Truth(UO.DragItem("loot", 0)))
{
    var ok = UO.DropItem("backpack", -1, -1, 0);
}

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

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

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

  • chest задан через AddObject. X=60/Y=70 — координаты в его гампе.
  • amount=10 относится к Drag, у DropItem собственного количества нет.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Drag("loot", 10)))
    {
        var ok = UO.DropItem("chest", 60, 70, 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. Положить на землю под персонажем — класс сценария

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

  • MoveIntoID=0 явно выбирает землю.
  • X/Y/Z — точка мира, а не координаты контейнера.
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 x = UO.GetX();
        var y = UO.GetY();
        var z = UO.GetZ();
        if (Truth(UO.DragItem("loot", 0)))
        {
            var ok = UO.DropItem(0, x, y, z);
        }

        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.DropItem(moveIntoID, x, y, z) — UO.DropItem(Any,Any,Any,Any)

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

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

При вызове:

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

case "dropitem": return new InjectionValue(bridge.DropDraggedItem(Arg(0), Arg(1), Arg(2), Arg(3)));

UO.Dye

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

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

void UO.Dye(object? dyeObject);
void UO.Dye(object? dyeObject, object? target);

Использует переданный предмет окраски; при втором аргументе заранее ставит объектную UO.Wait-target.

Параметры

  • dyeObject — Serial объекта или поддерживаемое имя self/backpack/lasttarget/сохранённого объекта; числовые строки и 0x-строки разрешаются runtime.
  • target — Необязательный объект/serial следующей цели. Без второго аргумента новая цель не ставится.

Возвращает

void — возвращаемого значения нет.

Поведение

  • Двухаргументная форма сначала вызывает WaitTargetObject(target), затем UseObject(dyeObject). Форма с одним аргументом только использует предмет. Это отправка действий; цвет, право окраски и итог определяются сервером.

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

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

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

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

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

UO.Print("Calling UO.Dye");
UO.Dye(UO.LastObject());

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

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

  • Одноаргументный вызов не задаёт цель.
var dye = UO.LastObject();
if (Truth(UO.Exists(dye)))
{
    UO.Dye(dye);
}

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

2. Окрасить выбранную цель — функция сценария

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

  • Target ставится перед двойным щелчком по dye.
return  RunScenario();
 object? RunScenario()
{
    var dye = UO.LastObject();
    var target = UO.LastTarget();
    if (Truth(UO.Exists(dye)) && Truth(UO.Exists(target)))
    {
        UO.Dye(dye, target);
    }

    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. Сохранённые имена — класс сценария

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

  • Пример использует предварительно сохранённые имена dye и cloth.
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(UO.Exists("dye")) && Truth(UO.Exists("cloth")))
        {
            UO.Dye("dye", "cloth");
        }

        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.Dye(dyeObject) — UO.Dye(Any)

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

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

При вызове:

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

case "dye":

                    if (arguments.Length > 1) bridge.WaitTargetObject(Arg(1));

                    bridge.UseObject(Arg(0, bridge.GetLastObject()));

                    break;

UO.Dye(dyeObject, target) — UO.Dye(Any,Any)

Параметры: dyeObject (Any), target (Any)

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

При вызове:

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

case "dye":

                    if (arguments.Length > 1) bridge.WaitTargetObject(Arg(1));

                    bridge.UseObject(Arg(0, bridge.GetLastObject()));

                    break;

UO.EasyObject

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

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

void UO.EasyObject(object? name);
void UO.EasyObject(object? name, object? @object);

Сохраняет имя объекта без интерактивного запроса target.

Параметры

  • name — Имя записи runtime Objects, преобразуемое в string.
  • object — Необязательный serial/ссылка. Без него сохраняется GetLastObject.

Возвращает

void — возвращаемого значения нет.

Поведение

  • State.Objects.Set заменяет запись имени. Одноаргументная форма использует последний использованный объект, а не LastTarget. Наличие объекта в мире отдельно не проверяется этой веткой.

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

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

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

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

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

UO.Print("Calling UO.EasyObject");
UO.EasyObject("last-used");

1. Сохранить последний объект — прямой скрипт

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

  • Имя получает текущий LastObject.
UO.EasyObject("last-used");

2. Сохранить себя — функция сценария

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

  • Двухаргументная форма сохраняет переданный serial.
return  RunScenario();
 object? RunScenario()
{
    UO.EasyObject("me", UO.Self());
    return null;
}

3. Удалить временную запись — класс сценария

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

  • Forget удаляет только сохранённую связь имени.
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.EasyObject("temporary", UO.Self());
        UO.Forget("temporary");
        return null;
    }
}

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

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

UO.EasyObject(name) — UO.EasyObject(Any)

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

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

При вызове:

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

case "easyobject":

                    if (arguments.Length > 1) state.Objects.Set(Text(0), Arg(1));

                    else if (arguments.Length > 0) state.Objects.Set(Text(0), bridge.GetLastObject());

                    break;

UO.EasyObject(name, object) — UO.EasyObject(Any,Any)

Параметры: name (Any), object (Any)

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

При вызове:

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

case "easyobject":

                    if (arguments.Length > 1) state.Objects.Set(Text(0), Arg(1));

                    else if (arguments.Length > 0) state.Objects.Set(Text(0), bridge.GetLastObject());

                    break;

UO.EmptyContainer

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

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

int UO.EmptyContainer(object? delay);
int UO.EmptyContainer(object? delay, object? source);
int UO.EmptyContainer(object? delay, object? source, object? destination);

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

Параметры

  • delay — Первый обязательный параметр: задержка между переносами, в миллисекундах. Например 350 — 0,35 секунды. Используются целые значения; отрицательные приводятся к 0. GrabDelay отдельно к этой задержке не добавляется. Последняя пауза сохраняется, чтобы следующая строка не обгоняла последний запрос.
  • source — Второй необязательный параметр: serial исходного контейнера, числовая/hex-строка либо сохранённое имя объекта. Поддерживаются lastobject, lastcontainer, lasttarget, lastcorpse, backpack/my. Если параметр отсутствует или равен 0, появляется прицел. Выберите предмет-контейнер или труп; Esc отменяет действие.
  • destination — Третий необязательный параметр — serial или сохранённое имя контейнера назначения. backpack/self/my выбирают рюкзак персонажа. receiving/catchbag выбирают установленный SetCatchBag контейнер (или рюкзак, если не установлен). lastcontainer/lastobject/lasttarget/lastcorpse/finditem/laststatus допустимы, если разрешаются в доступный контейнер. Неизвестный или не установленный псевдоним даёт ошибку. Если параметр не указан, используется рюкзак; настройка receiving container этот выбор не подменяет. Назначение должно существовать и отличаться от source. Земля/0 здесь не являются допустимым контейнером назначения.

Возвращает

int: 1, если источник был непустым и для каждого выбранного прямого предмета удалось отправить запрос переноса; 0 при пустом источнике, отмене прицела, неверном назначении, тайм-ауте загрузки или частичной/полной неудаче отправки. Это результат запросов клиента, не гарантия подтверждённого сервером опустошения.

Поведение

  • Точные формы: EmptyContainer(delay), EmptyContainer(delay, source), EmptyContainer(delay, source, destination). В игровом чате со стандартным префиксом: ,emptycontainer 350; из скрипта: UO.EmptyContainer(350).
  • При выборе прицелом команда ждёт выбора, отмены или аварийной остановки. Клиент продолжает обновлять изображение и сеть. Esc не отправляет переносов, не использует старый объект и возвращает 0. Если другой прицел заменил этот выбор, действие также отменяется.
  • Если содержимое ещё не загружено, клиент открывает источник и ждёт ответ сервера до 3000 мс. Скрытое от клиента содержимое невозможно перенести без получения данных сервера. Недоступный/слишком далёкий сундук или запрет сервера приводят к неудаче, а не к выбору другого контейнера.
  • После получения данных создаётся список прямых предметов. Каждый стек переносится полностью, по одному запросу захвата и сброса. Вложенная сумка переносится целиком; её содержимое отдельно не перебирается. Новые предметы, добавленные позже, не входят в текущий список.
  • Перед каждым запросом повторно проверяется, что предмет ещё в исходном контейнере. Нельзя вложить контейнер в самого себя или собственного потомка. Если курсор занят другим предметом, команда не сбрасывает его от вашего имени.
  • Отсутствующий контейнер назначения не подменяется рюкзаком. Результат 1 не означает, что сервер принял все действия: при необходимости проверьте содержимое после обновления сервера. Аварийная остановка прерывает ожидание; уже отправленные действия не откатываются.
  • Неизвестное сохранённое имя или недопустимый формат аргумента вызывает ошибку API, а не возврат 0. Отличайте это от корректного serial отсутствующего объекта: для него операция возвращает 0.

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

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

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

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

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

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

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

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

  • Единственный параметр delay=350 задаёт интервал 350 мс. source отсутствует, поэтому появляется прицел.
  • destination также отсутствует: содержимое идёт в рюкзак персонажа. Выбирайте сам контейнер/труп, а не один предмет внутри него.
  • sent получает 1 или 0. Значение 0 объединяет отмену, пустоту и неудачу; подробности также смотрите в журнале.
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;

2. Из известного сундука в рюкзак без прицела — функция сценария

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

  • delay=350; source — реальный serial сундука, замените примерный ID своим. Прицел не появляется.
  • Третий параметр не указан, поэтому destination=backpack. Все типы прямых предметов и полные стеки включаются в перенос.
  • Print выводит клиентский результат отправки, не число предметов и не подтверждение сервера.
return  RunScenario();
 object? RunScenario()
{
    var source = "0x40001234";
    var sent = UO.EmptyContainer(350, source);
    UO.Print("Client request result: " + Convert.ToString(sent));
    return null;
}

3. Между двумя выбранными контейнерами — класс сценария

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

  • AddObject с одним параметром предлагает выбрать объект и сохраняет его имя. Два выбора выполняются последовательно.
  • У EmptyContainer delay=350; source=source_bag; destination=destination_bag. Третий параметр задаёт конкретную сумку вместо рюкзака.
  • Имена должны указывать на разные контейнеры. Отменённый AddObject удаляет прежнее значение своего имени, поэтому старая сумка не используется случайно.
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.Print("Select source");
        UO.AddObject("source_bag");
        UO.Print("Select destination");
        UO.AddObject("destination_bag");
        var sent = UO.EmptyContainer(350, "source_bag", "destination_bag");
        UO.Print("Client request result: " + Convert.ToString(sent));
        return null;
    }
}

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

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

  • delay=500 — интервал полсекунды. source=lastcontainer — последний контейнер, открытый сервером в этом клиенте.
  • destination — явный ID вашего сундука; замените пример. lastcontainer и lastobject имеют разный смысл: последний открытый контейнер и последний использованный объект.
  • Перед запуском убедитесь, что последним открыли именно нужный источник. Перенос не открывает его вложенные сумки рекурсивно.
var destination = "0x40005678";
UO.EmptyContainer(500, "lastcontainer", destination);

5. Выбрать источник прицелом, назначение указать заранее — функция сценария

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

  • delay=350; source=0 специально вызывает прицел, сохраняя возможность передать третий параметр.
  • destination=storage указывает на заранее сохранённый сундук. После выбора источника содержимое переносится туда.
  • Esc возвращает sent=0 без переноса. Если storage неизвестен или не существует, другой контейнер автоматически не выбирается.
return  RunScenario();
 object? RunScenario()
{
    UO.AddObject("storage", "0x40005678");
    var sent = UO.EmptyContainer(350, 0, "storage");
    return null;
}

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

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

UO.EmptyContainer(delay) — UO.EmptyContainer(Any)

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

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

При вызове:

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

case "emptycontainer": return ExecuteEmptyContainer(arguments);

UO.EmptyContainer(delay, source) — UO.EmptyContainer(Any,Any)

Параметры: delay (Any), source (Any)

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

При вызове:

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

case "emptycontainer": return ExecuteEmptyContainer(arguments);

UO.EmptyContainer(delay, source, destination) — UO.EmptyContainer(Any,Any,Any)

Параметры: delay (Any), source (Any), destination (Any)

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

При вызове:

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

case "emptycontainer": return ExecuteEmptyContainer(arguments);

UO.Exists

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

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

int UO.Exists(object? id);

Проверяет наличие не удалённого объекта в локальном мире клиента.

Параметры

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

Возвращает

int 1 — serial сейчас разрешается в загруженный предмет или mobile. int 0 — объект неизвестен клиенту, удалён либо алиас не установлен. Это не ответ сервера о существовании объекта: предмет вне видимой области может существовать на сервере и давать 0 здесь.

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

Поведение

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

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

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

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

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

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

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

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

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

  • Аргумент backpack — алиас serial рюкзака собственного персонажа.
  • 1 не означает, что содержимое рюкзака уже полностью получено или что он открыт.
var present = UO.Exists("backpack");
if (Truth(present))
{
    UO.Print("Backpack is loaded");
}
else
{
    UO.Print("Backpack 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. Повторно проверить сохранённый serial — функция сценария

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

  • target сохраняет конкретный serial. Новое значение lasttarget не подменит его.
  • После паузы 500 мс объект мог уйти из видимости, поэтому проверка выполняется заново.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var target = UO.GetSerial("lasttarget");
    await Delay(500);
    if (Truth(UO.Exists(target)))
    {
        UO.Print(UO.GetName(target));
    }
    else
    {
        UO.Print("Saved target is no longer loaded");
    }

    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;

3. Отличить форматирование ID от наличия объекта — класс сценария

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

  • GetSerial форматирует число 1073746484 как 0x40001234, даже если объекта нет.
  • Только следующая проверка сообщает о наличии этого serial в текущем локальном мире.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var serial = UO.GetSerial("1073746484");
        UO.Print("Serial: " + serial);
        var present = UO.Exists(serial);
        UO.Print("Present 1/0: " + Convert.ToString(present));
        return null;
    }
}

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

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

UO.Exists(id) — UO.Exists(Integer)

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

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

При вызове:

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

public int Exists(int id) => bridge.Exists(id);

UO.Exists(id) — UO.Exists(String)

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

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

При вызове:

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

public int Exists(string id) => Exists(GetObject(id));

UO.Forget

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

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

void UO.Forget(object? name);

Без сообщения удаляет сохранённое имя из runtime Objects.

Параметры

  • name — Имя записи, преобразуемое в string.

Возвращает

void — возвращаемого значения нет.

Поведение

  • Ветка вызывает state.Objects.Remove. В отличие от DeleteObject, эта форма не печатает подтверждение и не сообщает об отсутствующем имени. Объект игрового мира не удаляется.

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

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

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

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

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

UO.Print("Calling UO.Forget");
UO.Forget("temporary");

1. Удалить временное имя — прямой скрипт

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

  • Удаляется только связь имени с serial.
UO.EasyObject("temporary",UO.Self());
UO.Forget("temporary");

2. Отсутствующее имя — функция сценария

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

  • Отсутствующее имя допускается без сообщения.
return  RunScenario();
 object? RunScenario()
{
    UO.Forget("missing-example-name");
    return null;
}

3. Имя из переменной — класс сценария

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

  • Удаление относится к точной строке name.
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 name = "temporary";
        UO.EasyObject(name, UO.Self());
        UO.Forget(name);
        return null;
    }
}

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

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

UO.Forget(name) — UO.Forget(Any)

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

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

При вызове:

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

case "forget": if (arguments.Length > 0) state.Objects.Remove(Text(0)); break;

UO.GetAltName

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

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

dynamic UO.GetAltName(object? objID);

Читает известный клиенту титул персонажа: например, профессию или подпись после имени.

Параметры

  • objID — Обязательный serial/ID объекта, не type и не cliloc. Допускается int, десятичная/hex-строка, self, backpack, lasttarget, finditem или имя AddObject. 0 означает отсутствие объекта.

Возвращает

string — текст поля Title у Mobile. Пустая строка, если титул неизвестен, объект не является персонажем или ID отсутствует. Это не serial, не полное имя и не массив свойств. GetAltName использует то же поле, что GetTitle.

Поведение

  • Сам вызов читает локальные данные, не ждёт сервер и не отправляет одиночный клик. Для запроса имени/титула используйте ClickOnObject отдельно; ответ приходит асинхронно.
  • Пустая строка допустима и у существующего персонажа. Проверка Exists отвечает на другой вопрос — загружен ли объект.
  • В этой реализации альтернативное имя сопоставлено полю Title персонажа.

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

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

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

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

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

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

1. Титул своего персонажа — прямой скрипт

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

  • ObjID=self — персонаж текущего клиента.
  • title содержит только титул; пустое поле не означает ошибку скрипта.
var title = UO.GetAltName("self");
UO.Print(title);

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

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

  • ObjID=id — serial последней цели. GetName и титул читаются отдельно.
  • Цель-предмет не имеет поля Title и даст пустую строку.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(id)))
    {
        var title = UO.GetAltName(id);
        if (Truth(title != ""))
        {
            UO.Print(UO.GetName(id) + " " + title);
        }
    }

    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. Запросить имя перед чтением — класс сценария

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

  • 350 — пример паузы в миллисекундах после одиночного клика; это не параметр getter.
  • Сервер может ответить позже или не передать титул. Сохраняйте обработку пустой строки.
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.ClickOnObject(id);
            UO.Wait(350);
            UO.Print(UO.GetAltName(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.GetAltName(objID) — UO.GetAltName(Any)

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

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

При вызове:

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

case "getaltname": return new InjectionValue(bridge.GetAltName(Arg(0)));

UO.GetColor

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

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

string UO.GetColor();
string UO.GetColor(object? id);

Читает hue объекта и форматирует его как шестнадцатеричную строку.

Параметры

  • id — Serial/ID объекта, а не graphic/type. Число, hex-строка, стандартное имя self/backpack/lasttarget/lastobject/lastcontainer/laststatus/finditem/lastcorpse или имя AddObject. Алиас должен быть установлен; существование проверяется Exists. В зарегистрированной форме без аргументов используется self.

Возвращает

string вида "0x0481" — код hue/цвета, четыре hex-цифры после 0x. Для отсутствующего объекта возвращается "0x0000"; этот же код бывает у неокрашенного предмета. Цвет не является graphic/type или уникальным serial.

Поведение

  • Читаются последние данные, уже известные клиенту; запрос обновления серверу не отправляется.
  • Неизвестный объект и ещё не полученное свойство могут иметь нулевое/пустое значение. Проверяйте Exists и условия конкретного действия.

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

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

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

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

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

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

1. Узнать цвет последнего предмета — прямой скрипт

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

  • id=lastobject — последний использованный объект.
  • Результат уже является hex-строкой и не требует Int2Hex.
var hue = UO.GetColor("lastobject");
UO.Print(hue);

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

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

  • type и hue — разные признаки образца; FindType принимает оба hex-представления.
  • match — найденный serial или пустая строка. Цвет не заменяет type.
return  RunScenario();
 object? RunScenario()
{
    var sample = UO.GetSerial("lastobject");
    if (Truth(UO.Exists(sample)))
    {
        var type = UO.GetGraphic(sample);
        var hue = UO.GetColor(sample);
        var match = UO.FindType(type, hue, "backpack");
        UO.Print(match);
    }

    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. Перевести hue в целое для сравнения — класс сценария

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

  • GetColor читает self; Hex2Int преобразует hex-текст в int.
  • Нулевой hue сам по себе не сообщает, присутствует ли персонаж в мире.
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 hue = UO.Hex2Int(UO.GetColor("self"));
        if (Truth(hue == 0))
        {
            UO.Print("Hue is zero");
        }

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

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

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

При вызове:

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

public string GetColor() => GetColor(new InjectionValue(bridge.Self));

UO.GetColor(id) — UO.GetColor(Any)

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

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

При вызове:

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

public string GetColor(InjectionValue id) => NumberConversions.ToHex((short)bridge.GetColor(GetObject(id)));

UO.GetFlags

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

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

int UO.GetFlags(object? id);

Читает битовую маску Entity.Flags из локального известного объекта.

Параметры

  • id — Serial объекта или поддерживаемое имя self/backpack/lasttarget/сохранённого объекта; числовые строки и 0x-строки разрешаются runtime.

Возвращает

int — исходная Entity.Flags. Неизвестный/отсутствующий Entity возвращает 0; это маска, а не логический результат.

Поведение

  • GetObject разрешает ссылку, затем bridge.World.Get читает Entity.Flags на игровом потоке. Нулевое значение может означать объект без флагов или отсутствие модели; Exists отделяет эти случаи. Команда не запрашивает обновление статуса.

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

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

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

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

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

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

1. Флаги себя — прямой скрипт

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

  • Выводится маска текущего персонажа.
var flags = UO.GetFlags("self");
UO.Print(Convert.ToString(flags));

2. Флаги известной цели — функция сценария

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

  • Проверка Exists отличает отсутствующую модель.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.LastTarget();
    if (Truth(UO.Exists(id)))
    {
        var flags = UO.GetFlags(id);
        UO.Print(Convert.ToString(flags));
    }

    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. Отсутствующий serial — класс сценария

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

  • Нулевой serial обычно не соответствует Entity и возвращает 0.
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 flags = UO.GetFlags(0);
        UO.Print(Convert.ToString(flags));
        return null;
    }
}

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

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

UO.GetFlags(id) — UO.GetFlags(Any)

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

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

При вызове:

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

public int GetFlags(InjectionValue id) => bridge.GetFlags(GetObject(id));

UO.GetGraphic

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

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

string UO.GetGraphic();
string UO.GetGraphic(object? id);

Читает graphic предмета или body персонажа и возвращает его в шестнадцатеричном тексте.

Параметры

  • id — Serial конкретного объекта либо разрешаемый алиас, например "self", "backpack", "lasttarget" или имя, сохранённое AddObject. Graphic/type сюда не передаётся. В форме без аргументов используется self.

Возвращает

string вида "0x0EED" — графический type/body объекта. Это не уникальный ID/serial. Для неизвестного объекта bridge возвращает graphic 0, который форматируется как "0x0000". Команда не возвращает true/false.

Поведение

  • Команда читает локальные данные клиента. Она не посылает target и не меняет объект на сервере.
  • Число 0 может быть допустимым значением данных. Отсутствие объекта проверяйте Exists(serial), а не только значением его свойства.

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

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

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

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

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

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

1. Проверить type найденного предмета — прямой скрипт

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

  • FindType получает type золота и возвращает serial.
  • GetGraphic(serial) возвращает текст "0x0EED"; переменные item и graphic имеют разный смысл.
var item = UO.FindType(0x0EED, -1, "backpack");
if (Truth(item != ""))
{
    var graphic = UO.GetGraphic(item);
    UO.Print("Graphic: " + graphic);
}

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

2. Прочитать body своего персонажа — функция сценария

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

  • Форма без аргумента использует self.
  • body — код внешнего вида персонажа, а не его serial.
return  RunScenario();
 object? RunScenario()
{
    var body = UO.GetGraphic();
    UO.Print("Body graphic: " + body);
    return null;
}

3. Передать прочитанный graphic в новый поиск — класс сценария

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

  • lastobject — образец; graphic — строка hex, которую FindType принимает как type.
  • -1 допускает любой цвет, backpack задаёт область поиска. sameType снова является serial.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var graphic = UO.GetGraphic("lastobject");
        var sameType = UO.FindType(graphic, -1, "backpack");
        if (Truth(sameType != ""))
        {
            UO.Print("Matching serial: " + sameType);
        }

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

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

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

При вызове:

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

public string GetGraphics() => GetGraphics(bridge.Self);

UO.GetGraphic(id) — UO.GetGraphic(Integer)

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

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

При вызове:

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

public string GetGraphics(int id) => $"0x{bridge.GetGraphics(id):X4}";

UO.GetGraphic(id) — UO.GetGraphic(String)

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

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

При вызове:

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

public string GetGraphics(string id) => GetGraphics(GetObject(id));

UO.GetLayer

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

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

string UO.GetLayer();
string UO.GetLayer(object? id);

Параметры

  • id — Serial конкретного объекта либо разрешаемый алиас, например "self", "backpack", "lasttarget" или имя, сохранённое AddObject. Graphic/type сюда не передаётся. В форме без аргументов используется self.

Возвращает

string — имя слоя, например "Rhand", "Lhand", "Hat", "Bpack" или "Mount". Возвращается первое каноническое имя для номера слоя, поэтому Helmet выводится как "Hat", а Backpack — как "Bpack". Нулевой слой, неизвестный предмет или self дают "Invalid". Неизвестный ненулевой номер форматируется как "0xNN". Это не serial, не graphic и не высота Z.

Поведение

  • Команда читает локальные данные клиента. Она не посылает target и не меняет объект на сервере.
  • Число 0 может быть допустимым значением данных. Отсутствие объекта проверяйте Exists(serial), а не только значением его свойства.

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

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

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

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

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

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

1. Определить слой предмета в правой руке — прямой скрипт

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

  • ObjAtLayer("Rhand") выбирает предмет на правой руке; 0 означает пустой слот.
  • GetLayer получает serial найденного предмета и возвращает строку "Rhand".
object? item = UO.ObjAtLayer("Rhand");
if (item is string serial)
{
    var layer = UO.GetLayer(serial);
    UO.Print(layer);
}

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

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

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

  • id="backpack" — serial рюкзака текущего персонажа.
  • Проверяется каноническое имя Bpack, а не алиас Backpack.
return  RunScenario();
 object? RunScenario()
{
    var layer = UO.GetLayer("backpack");
    if (Truth(layer == "Bpack"))
    {
        UO.Print("Player backpack layer");
    }
    else
    {
        UO.Print("Layer: " + layer);
    }

    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. Обработать отсутствие экипировки — класс сценария

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

  • lastobject должен быть актуальным алиасом предмета.
  • Invalid означает нулевой слой. Само по себе это не доказывает отсутствие предмета: предмет в сумке тоже не экипирован.
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 layer = UO.GetLayer("lastobject");
        if (Truth(layer == "Invalid"))
        {
            UO.Print("No equipment layer");
        }
        else
        {
            UO.Print("Equipment layer: " + layer);
        }

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

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

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

При вызове:

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

public string GetLayer() => GetLayer(new InjectionValue(bridge.Self));

UO.GetLayer(id) — UO.GetLayer(Any)

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

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

При вызове:

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

public string GetLayer(InjectionValue id) => ConvertLayer(bridge.GetLayer(GetObject(id)));

UO.GetLocked

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

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

int UO.GetLocked(object? id);

Проверяет паралич mobile.

Параметры

  • id — Обязательный serial/ID конкретного объекта: int, hex-строка либо алиас self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse или имя AddObject. Это не graphic/type. Неустановленное имя разрешается в 0; никакой новый target команда не открывает. Аргумент обязателен; для себя передайте self.

Возвращает

int 1 — загруженный mobile имеет признак IsParalyzed. int 0 — признак отсутствует, объект не является mobile, неизвестен или удалён. Несмотря на название Locked, это не замок сундука, не закреплённость предмета и не любая причина невозможности движения. Читается тот же флаг, что у Paralyzed.

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

Поведение

  • Читается локальная модель клиента; запросов серверу, ожидания и перемещения нет.
  • Результат относится к моменту чтения. После UO.Wait или другого действия объект и его флаги могут измениться.
  • Несмотря на название Locked, это не замок сундука, не закреплённость предмета и не любая причина невозможности движения. Читается тот же флаг, что у Paralyzed.

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

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

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

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

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

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

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

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

  • Аргумент self явно выбирает своего персонажа. state — только 1/0.
  • Несмотря на название Locked, это не замок сундука, не закреплённость предмета и не любая причина невозможности движения. Читается тот же флаг, что у Paralyzed.
var state = UO.GetLocked("self");
var paralyzed = UO.Paralyzed();
UO.Print("GetLocked: " + Convert.ToString(state));
UO.Print("Paralyzed: " + Convert.ToString(paralyzed));

2. Проверить выбранного mobile — функция сценария

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

  • IsNpc исключает предмет и неизвестный объект. target сохраняет один serial, а не живую ссылку на меняющийся lasttarget.
  • Результат относится к полю IsParalyzed. Данные обновляются только после получения соответствующего состояния клиентом.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.GetLocked(target);
        UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

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

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

  • UO.Wait(500) — пауза в миллисекундах. После неё отдельно проверяется, что mobile ещё существует.
  • Сравниваются два снимка. Промежуточные изменения могут быть пропущены, и это не непрерывная подписка на серверные события.
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 target = UO.GetSerial("lasttarget");
        if (Truth(UO.IsNPC(target)))
        {
            var before = UO.GetLocked(target);
            await Delay(500);
            if (Truth(UO.IsNPC(target)))
            {
                var after = UO.GetLocked(target);
                if (Truth(before != after))
                {
                    UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
                }
            }
            else
            {
                UO.Print("Mobile left the local world");
            }
        }

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

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

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

При вызове:

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

public int GetLocked(InjectionValue id) => bridge.GetLocked(GetObject(id));

UO.GetName

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

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

string UO.GetName();
string UO.GetName(object? id);

Читает известное клиенту имя предмета или персонажа.

Параметры

  • id — Serial/ID объекта, а не graphic/type. Число, hex-строка, стандартное имя self/backpack/lasttarget/lastobject/lastcontainer/laststatus/finditem/lastcorpse или имя AddObject. Алиас должен быть установлен; существование проверяется Exists. В зарегистрированной форме без аргументов используется self.

Возвращает

string — имя объекта. Неизвестный объект или ещё не полученное имя дают пустую строку "". Это не serial, не type и не полный список свойств из tooltip.

Поведение

  • Читаются последние данные, уже известные клиенту; запрос обновления серверу не отправляется.
  • Неизвестный объект и ещё не полученное свойство могут иметь нулевое/пустое значение. Проверяйте Exists и условия конкретного действия.

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

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

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

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

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

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

1. Вывести имя персонажа — прямой скрипт

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

  • Без аргумента используется self.
  • Результат — текст имени, его можно выводить напрямую.
var name = UO.GetName();
UO.Print(name);

2. Обработать неизвестное имя цели — функция сценария

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

  • lasttarget — алиас объекта. GetName не открывает новый target.
  • Пустое имя не доказывает отсутствие объекта: сначала могла прийти информация о serial без имени.
return  RunScenario();
 object? RunScenario()
{
    var name = UO.GetName("lasttarget");
    if (Truth(name == ""))
    {
        UO.Print("Name is not available");
    }
    else
    {
        UO.Print("Target: " + name);
    }

    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. Сравнить имя без учёта регистра — класс сценария

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

  • ToLowerInvariant переводит строку в нижний регистр для сравнения.
  • Имя задаёт сервер и оно может быть локализовано. Для отбора по графическому типу используйте FindType/GetGraphic.
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 name = UO.GetName("lastobject");
        if (Truth(Convert.ToString(name) == "gold"))
        {
            UO.Print("Known name matches");
        }

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

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

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

При вызове:

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

public string GetName() => GetName("self");

UO.GetName(id) — UO.GetName(Any)

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

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

При вызове:

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

case "getname":

                case "charname": return new InjectionValue(bridge.GetName(Arg(0, bridge.Self)));

UO.GetName(id) — UO.GetName(Integer)

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

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

При вызове:

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

public string GetName(int id) => bridge.GetName(id);

UO.GetName(id) — UO.GetName(String)

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

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

При вызове:

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

public string GetName(string id) => GetName(GetObject(id));

UO.GetQuantity

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

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

int UO.GetQuantity(object? id);

Читает количество единиц в одном стеке предмета.

Параметры

  • id — Serial/ID объекта, а не graphic/type. Число, hex-строка, стандартное имя self/backpack/lasttarget/lastobject/lastcontainer/laststatus/finditem/lastcorpse или имя AddObject. Алиас должен быть установлен; существование проверяется Exists. В зарегистрированной форме без аргументов используется self. Для этой команды id обязателен.

Возвращает

int — поле Amount конкретного предмета. Стек из 1000 единиц обычно возвращает 1000; одиночный предмет — 1. Для неизвестного serial и для персонажа возвращается 0. Это не число дочерних предметов сундука и не лимит items команды MassMove.

Поведение

  • Читаются последние данные, уже известные клиенту; запрос обновления серверу не отправляется.
  • Неизвестный объект и ещё не полученное свойство могут иметь нулевое/пустое значение. Проверяйте Exists и условия конкретного действия.

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

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

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

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

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

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

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

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

  • FindType ищет type золота любого цвета в рюкзаке.
  • gold содержит один serial, поэтому amount относится только к одной найденной стопке.
var gold = UO.FindType(0x0EED, -1, "backpack");
if (Truth(gold != ""))
{
    var amount = UO.GetQuantity(gold);
    UO.Print("Units in this stack: " + Convert.ToString(amount));
}

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

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

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

  • id=sample — последний использованный предмет.
  • 50 означает единицы в данном стеке. Здесь не подсчитываются 50 отдельных items.
return  RunScenario();
 object? RunScenario()
{
    var sample = UO.GetSerial("lastobject");
    if (Truth(UO.Exists(sample)))
    {
        if (Truth(UO.GetQuantity(sample) >= 50))
        {
            UO.Print("At least 50 units in this item");
        }
    }

    return null;
}

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

3. Отличить количество стопок от единиц — класс сценария

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

  • FindCount относится к результатам последнего поиска; GetQuantity — к одному serial.
  • Числа могут сильно различаться. MassMove quantity ограничивает целые items, включая стопки.
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.FindType(0x0EED, -1, "backpack");
        var stacks = UO.FindCount();
        if (Truth(item != ""))
        {
            var units = UO.GetQuantity(item);
            UO.Print("Matching items: " + Convert.ToString(stacks));
            UO.Print("Units in selected item: " + Convert.ToString(units));
        }

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

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

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

При вызове:

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

case "getquantity": return new InjectionValue(bridge.GetQuantity(Arg(0)));

UO.GetQuantity(id) — UO.GetQuantity(Integer)

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

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

При вызове:

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

public int GetQuantity(int id) => bridge.GetQuantity(id);

UO.GetQuantity(id) — UO.GetQuantity(String)

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

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

При вызове:

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

public int GetQuantity(string id) => GetQuantity(GetObject(id));

UO.GetSerial

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

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

string UO.GetSerial();
string UO.GetSerial(object? id);

Разрешает имя объекта в его serial и форматирует serial как hex-строку.

Параметры

  • id — Необязательная строка: стандартный алиас, имя AddObject или числовой текст (десятичный/hex). Без аргумента используется serial текущего персонажа.

Возвращает

string вида "0x40001234" — уникальный serial/ID объекта, восемь hex-цифр после 0x. Неразрешённое имя даёт "0x00000000". Это не type. Числовой текст форматируется даже если такой объект не загружен; GetSerial сам по себе не проверяет Exists.

Поведение

  • Имена алиасов читаются из текущего состояния скрипта/клиента. Сохранённая строка serial не меняется автоматически, если алиас впоследствии указывает на другой объект.

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

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

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

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

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

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

1. Получить ID своего персонажа — прямой скрипт

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

  • Параметров нет, выбран self.
  • serial — hex-строка. Значение 0x00000000 означает отсутствие serial персонажа.
var serial = UO.GetSerial();
UO.Print(serial);

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

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

  • id="lasttarget" разрешается в serial последней цели.
  • Exists проверяет наличие объекта, GetName читает его известное клиенту имя.
return  RunScenario();
 object? RunScenario()
{
    var serial = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(serial)))
    {
        UO.Print(UO.GetName(serial));
    }
    else
    {
        UO.Print("Target is not loaded");
    }

    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. Сравнить числовые представления — класс сценария

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

  • id — строка с десятичным serial 1073746484.
  • Результат 0x40001234 показывает форматирование. Это пример числа, он не создаёт объект и не гарантирует его наличие.
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 serial = UO.GetSerial("1073746484");
        UO.Print(serial);
        return null;
    }
}

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

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

UO.GetSerial() — UO.GetSerial()

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

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

При вызове:

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

public string GetSerial() => NumberConversions.ToHex(bridge.Self);

UO.GetSerial(id) — UO.GetSerial(String)

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

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

При вызове:

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

public string GetSerial(string id) => NumberConversions.ToHex(GetObject(id));

UO.GetTooltip

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

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

dynamic UO.GetTooltip(object? objID);

Читает готовый текст свойств объекта из OPL. GetTooltip и GetCliloc являются синонимами.

Параметры

  • objID — Обязательный serial/ID объекта, не type и не cliloc. Допускается int, десятичная/hex-строка, self, backpack, lasttarget, finditem или имя AddObject. 0 означает отсутствие объекта.

Возвращает

string — имя и текст свойств, разделённые переводом строки, либо только непустая часть. Пустая строка при ObjID=0 или если свойства не получены. Это готовый текст; числовые ID cliloc и параметры возвращает GetTooltipRec.

Поведение

  • Если запись уже есть в OPL, возвращается её текст сразу. При отсутствии записи отправляется запрос свойств и ожидается ответ до 200 мс с проверкой каждые 10 мс. Пауза не означает гарантированное получение ответа.
  • Нужны доступный объект и поддержка свойств сервером. Пустой результат не является доказательством отсутствия объекта: используйте Exists отдельно.
  • Текст может содержать разметку сервера. Не разбирайте числовые свойства по позиции строки; для этого используйте GetTooltipRec.

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

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

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

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

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

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

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

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

  • FindType: золото 0x0EED, любой hue=-1, прямое содержимое backpack. ObjID=item — найденный serial.
  • Результат getter — текст, а не количество золота. Для количества используйте FindCount(item).
var item = UO.FindType(0x0EED, -1, "backpack");
if (Truth(item != ""))
{
    UO.Print(UO.GetTooltip(item));
}

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

2. Обработать отсутствие ответа — функция сценария

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

  • ObjID=lasttarget должен указывать на нужный объект.
  • Пустая строка обрабатывается отдельно; автоматически повторять запрос в бесконечном цикле не нужно.
return  RunScenario();
 object? RunScenario()
{
    var text = UO.GetTooltip("lasttarget");
    if (Truth(text == ""))
    {
        UO.Print("No properties received");
    }
    else
    {
        UO.Print(text);
    }

    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. Сохранить текст до следующего действия — класс сценария

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

  • id и saved — отдельные переменные: уникальный ID объекта и снимок его текста.
  • saved не изменится автоматически, если свойства на сервере позже поменяются.
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");
        var saved = UO.GetTooltip(id);
        UO.Print("Object: 0x" + Hex(id));
        UO.Print(saved);
        return null;
    }

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

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

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

UO.GetTooltip(objID) — UO.GetTooltip(Any)

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

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

При вызове:

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

case "getcliloc":

                case "gettooltip":

                    return new InjectionValue(bridge.GetTooltip(Arg(0)));

UO.GetTooltipRec

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

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

dynamic UO.GetTooltipRec(object? objID);

Читает структурированные свойства: cliloc ID и параметры каждой записи OPL.

Параметры

  • objID — Обязательный serial/ID объекта, не type и не cliloc. Допускается int, десятичная/hex-строка, self, backpack, lasttarget, finditem или имя AddObject. 0 означает отсутствие объекта.

Возвращает

Array — отдельный снимок строк свойств. Каждая строка равна [clilocID:int, parameters:Array]. rows[i][0] — номер локализованного сообщения, rows[i][1] — массив параметров. ArrayLength(rows) — число свойств; ArrayLength(parameters) — число параметров одного свойства. Пустой массив при ObjID=0 или отсутствии полученных записей. Это не список ID предметов и не готовый текст.

Поведение

  • Запись из кэша возвращается сразу. При отсутствии OPL запрашиваются свойства с ожиданием до 120 мс; отмена процедуры прерывает ожидание. Известная пустая OPL не вызывает ожидание.
  • Начальные служебные табуляции пропускаются как в ClilocLoader. Пустые внутренние параметры сохраняют позиции; #число сохраняется строкой для последующей локализации. Неизвестные параметры дают пустой массив.
  • Изменение возвращённого массива не меняет кэш клиента. Для текста используйте GetTooltip/GetCliloc; для перевода одной строки — GetClilocByID(clilocID, parameters).

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

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

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

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

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

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

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

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

  • ObjID=lasttarget — объект. rows содержит свойства, i — индекс от 0. row[0] является cliloc, а не serial.
  • Цикл не выполняется для пустого массива. Каждая запись обрабатывается один раз.
var rows = UO.GetTooltipRec("lasttarget");
var i = 0;
while (Truth(i < ArrayLength(rows)))
{
    var row = rows[i];
    UO.Print("Cliloc: " + Convert.ToString(row[0]));
    i = i + 1;
}

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

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

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

  • GetClilocByID получает clilocID=row[0] и массив подстановок=row[1].
  • Параметры сохраняют порядок. Не передавайте весь row вместо массива параметров.
return  RunScenario();
 object? RunScenario()
{
    var rows = UO.GetTooltipRec("lasttarget");
    var i = 0;
    while (Truth(i < ArrayLength(rows)))
    {
        var row = rows[i];
        var text = UO.GetClilocByID(row[0], row[1]);
        UO.Print(text);
        i = i + 1;
    }

    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;

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

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

  • wanted — пример ID свойства; замените нужным cliloc. args[0] — первый параметр, исходно string.
  • Перед Val проверяются число параметров и числовой формат. Параметр может быть текстом или ссылкой #cliloc.
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 rows = UO.GetTooltipRec("lasttarget");
        var wanted = 1060401;
        var i = 0;
        while (Truth(i < ArrayLength(rows)))
        {
            var row = rows[i];
            var args = row[1];
            if (Truth(row[0] == wanted) && Truth(ArrayLength(args) > 0))
            {
                if (Truth(IsNumeric(args[0])))
                {
                    UO.Print("Value: " + Convert.ToString(Val(args[0])));
                }
            }

            i = i + 1;
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool IsNumeric(object? value) => double.TryParse(Convert.ToString(value), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out _);
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
    double Val(object? value) => double.TryParse(Convert.ToString(value), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out var number) ? number : 0;
}

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

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

UO.GetTooltipRec(objID) — UO.GetTooltipRec(Any)

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

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

При вызове:

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

case "gettooltiprec":

                    return new InjectionValue(bridge.GetTooltipRecords(Arg(0)).Select(entry =>

                        new InjectionValue(new[]

                        {

                            new InjectionValue(entry.ClilocID),

                            new InjectionValue(entry.Parameters.Select(value => new InjectionValue(value)).ToArray())

                        })).ToArray());

UO.GetType

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

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

dynamic UO.GetType(object? objID);

Читает числовой graphic предмета или body персонажа.

Параметры

Возвращает

int — graphic/type предмета либо body персонажа, например 0x0EED (3821) для золота. Значение 0 возвращается, если объект не найден. GetType не возвращает serial или текст "0x…"; строковую форму даёт GetGraphic.

Поведение

  • Команда читает локальные данные клиента. Она не посылает target и не меняет объект на сервере.
  • Число 0 может быть допустимым значением данных. Отсутствие объекта проверяйте Exists(serial), а не только значением его свойства.

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

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

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

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

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

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

1. Сравнить числовой type с константой — прямой скрипт

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

  • ObjID="lastobject" — алиас конкретного объекта.
  • 0x0EED является числом graphic; сравнение не ищет объект с таким serial.
var graphic = UO.GetType("lastobject");
if (Truth(graphic == 0x0EED))
{
    UO.Print("Gold graphic");
}

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

2. Получить type собственного рюкзака — функция сценария

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

  • ObjID="backpack" — текущий рюкзак.
  • Convert.ToString форматирует возвращённое число для вывода.
return  RunScenario();
 object? RunScenario()
{
    var graphic = UO.GetType("backpack");
    UO.Print("Backpack type: " + Convert.ToString(graphic));
    return null;
}

3. Проверить существование объекта до чтения type — класс сценария

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

  • Пустая строка FindType проверяется до Exists.
  • Exists возвращает логическое 1/0; GetType возвращает номер graphic.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var item = UO.FindType(0x0EED, -1, "backpack");
        if (Truth(item != ""))
        {
            if (Truth(UO.Exists(item)))
            {
                UO.Print("Type: " + Convert.ToString(UO.GetType(item)));
            }
        }

        return null;
    }

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

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

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

UO.GetType(objID) — UO.GetType(Any)

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

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

При вызове:

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

case "gettype": return new InjectionValue(bridge.GetGraphics(Arg(0)));

UO.Grab

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

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

int UO.Grab();
int UO.Grab(object? id);
int UO.Grab(object? amount, object? id);
int UO.Grab(object? amount, object? item, object? container);
int UO.Grab(object? amount, object? item, object? container, object? timeout);

Переносит предмет в заданный/приёмный контейнер, либо открывает выбор предмета.

Параметры

  • id — Serial/алиас предмета. Без аргументов начинается интерактивный выбор; с одним аргументом берётся ровно 1 единица этого предмета.
  • item — Serial/алиас предмета. Без аргументов начинается интерактивный выбор; с одним аргументом берётся ровно 1 единица этого предмета.
  • id / item — Serial/алиас предмета. Без аргументов начинается интерактивный выбор; с одним аргументом берётся ровно 1 единица этого предмета.
  • amount — В формах 2..4 — количество первым аргументом, затем item. 0 означает весь стек по правилам MoveItem; не меняйте порядок с формой Grab(item).
  • container — Только формы 3/4: явное назначение. Без него — state.ReceivingContainer, если >0, иначе backpack. Строки self/my/backpack в назначении означают рюкзак; ground — землю.
  • timeout — Только форма 4, миллисекунды. Передаётся в CompactMoveItem с ожиданием подтверждения; координаты ground берутся из self, контейнера — 0xFFFF/0xFFFF/0.

Возвращает

Числовой флаг int: 1 — интерактивный выбор принят, либо перенос принят/подтверждён согласно выбранной форме; 0 — неудача/нет подходящего предмета. Безаргументный результат не означает, что предмет уже перенесён.

Поведение

  • CompactGrab сохраняет историческую форму Grab(item)=1 единица. Формы без timeout используют CompactMoveItem без принудительного ожидания подтверждения; форма с timeout задаёт UO.Wait=true.
  • Serial 0 сразу даёт 0. Неразрешённые/неподходящие объекты проверяются дальше путём MoveItem. Серверные правила, stack amount и текущий контейнер влияют на результат. Три/четыре аргумента не являются координатами drop.
  • amount<=0 запрашивает весь стек. В форме с timeout отрицательная пауза становится 0, но выполняется минимум одна локальная проверка; между проверками UO.Wait(10). Частичный перенос подтверждается уменьшением исходного количества, полный — назначением и для ground X/Y/Z. Это наблюдение состояния мира, не свежий ответ протокола с ID запроса; уже подходящее состояние может дать 1 сразу. Timeout даёт 0, хотя запрос уже мог быть отправлен.

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

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

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

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

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

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

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

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

  • Переносит предмет в заданный/приёмный контейнер, либо открывает выбор предмета.
var accepted = UO.Grab();
UO.Print(accepted);

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

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

  • CompactGrab сохраняет историческую форму Grab(item)=1 единица. Формы без timeout используют CompactMoveItem без принудительного ожидания подтверждения; форма с timeout задаёт UO.Wait=true.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("lastobject")))
    {
        UO.Print(UO.Grab("lastobject"));
    }

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

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

  • Serial 0 сразу даёт 0. Неразрешённые/неподходящие объекты проверяются дальше путём MoveItem. Серверные правила, stack amount и текущий контейнер влияют на результат. Три/четыре аргумента не являются координатами drop.
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(UO.Exists("lastobject")))
        {
            UO.Print(UO.Grab(0, "lastobject", "backpack", 2000));
        }

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

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

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

При вызове:

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

public int Grab() => bridge.RequestInteractiveGrabTarget();

UO.Grab(id) — UO.Grab(Any)

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

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

При вызове:

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

public int Grab(InjectionValue id) => CompactGrab(new[] { id });

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

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

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

При вызове:

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

case "grab": return new InjectionValue(CompactGrab(arguments));

UO.Grab(amount, id) — UO.Grab(Integer,Integer)

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

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

При вызове:

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

public int Grab(int amount, int id) => CompactGrab(new[] { new InjectionValue(amount), new InjectionValue(id) });

UO.Grab(amount, id) — UO.Grab(Integer,String)

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

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

При вызове:

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

public int Grab(int amount, string id) => CompactGrab(new[] { new InjectionValue(amount), new InjectionValue(id) });

UO.Grab(amount, id) — UO.Grab(String,String)

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

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

При вызове:

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

public int Grab(string amount, string id) => CompactGrab(new[] { new InjectionValue(amount), new InjectionValue(id) });

UO.Grab(amount, item, container) — UO.Grab(Any,Any,Any)

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

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

При вызове:

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

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

values => new InjectionValue(CompactGrab(values))

UO.Grab(amount, item, container, timeout) — UO.Grab(Any,Any,Any,Any)

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

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

При вызове:

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

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

values => new InjectionValue(CompactGrab(values))

UO.IsMovable

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

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

int UO.IsMovable(object? objID);

Проверяет локальные признаки переносимости известного предмета по правилам подбора Classic UO.

Параметры

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

Возвращает

int 1 — предмет не удалён, не multi и не заблокирован локальным правилом веса/Movable для предметов на земле. int 0 — mobile, multi, неизвестный/удалённый предмет либо заблокированный предмет на земле. 1 не гарантирует успешный Drag/MoveItem: дальность, доступ, состояние курсора и окончательное решение сервера проверяются отдельно.

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

Поведение

  • Читается локальная модель клиента; запросов серверу, ожидания и перемещения нет.
  • Результат относится к моменту чтения. После UO.Wait или другого действия объект и его флаги могут измениться.
  • На земле предмет считается заблокированным, когда вес его записи tiledata больше 90 и отсутствует серверный флаг Movable. Вес 90 и меньше не требует этого флага.
  • Внутри контейнера правило блокировки предмета на земле не применяется. Вес tiledata здесь служебный признак, а не GetQuantity и не текущий вес персонажа.
  • В документации других клиентов описание веса может отличаться. Здесь описано фактическое правило GameActions.PickUp этого клиента.

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

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

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

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

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

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

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

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

  • item — serial последнего использованного предмета. Число movable не является его количеством.
  • Пример ничего не поднимает и не отправляет серверу.
var item = UO.GetSerial("lastobject");
var movable = UO.IsMovable(item);
UO.Print("Locally movable 1/0: " + Convert.ToString(movable));

2. Отдельно оценить признак и расстояние — функция сценария

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

  • Для предмета на земле GetDistance показывает известную клиенту дальность.
  • Даже при movable=1 предмет может быть слишком далеко. Положительный результат не является разрешением сервера на перенос.
return  RunScenario();
 object? RunScenario()
{
    var item = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(item)))
    {
        var movable = UO.IsMovable(item);
        var distance = UO.GetDistance(item);
        UO.Print("Movable: " + Convert.ToString(movable));
        UO.Print("Distance: " + Convert.ToString(distance));
    }

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

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

  • FindType выбирает один serial золота любого цвета в рюкзаке.
  • IsMovable проверяет предмет целиком. GetQuantity отдельно читает число единиц; результат IsMovable не заменяет этот счётчик.
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.FindType(0x0EED, -1, "backpack");
        if (Truth(item != ""))
        {
            if (Truth(UO.IsMovable(item)))
            {
                var units = UO.GetQuantity(item);
                UO.Print("Selected stack units: " + Convert.ToString(units));
            }
        }

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

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

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

При вызове:

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

case "ismovable": return new InjectionValue(bridge.IsMovable(Arg(0)));

UO.IsObjectExists

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

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

int UO.IsObjectExists(object? objID);

Проверяет наличие не удалённого объекта в локальном мире клиента.

Параметры

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

Возвращает

int 1 — serial сейчас разрешается в загруженный предмет или mobile. int 0 — объект неизвестен клиенту, удалён либо алиас не установлен. Это не ответ сервера о существовании объекта: предмет вне видимой области может существовать на сервере и давать 0 здесь.

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

Поведение

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

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

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

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

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

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

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

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

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

  • Аргумент backpack — алиас serial рюкзака собственного персонажа.
  • 1 не означает, что содержимое рюкзака уже полностью получено или что он открыт.
var present = UO.IsObjectExists("backpack");
if (Truth(present))
{
    UO.Print("Backpack is loaded");
}
else
{
    UO.Print("Backpack 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. Повторно проверить сохранённый serial — функция сценария

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

  • target сохраняет конкретный serial. Новое значение lasttarget не подменит его.
  • После паузы 500 мс объект мог уйти из видимости, поэтому проверка выполняется заново.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var target = UO.GetSerial("lasttarget");
    await Delay(500);
    if (Truth(UO.IsObjectExists(target)))
    {
        UO.Print(UO.GetName(target));
    }
    else
    {
        UO.Print("Saved target is no longer loaded");
    }

    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;

3. Отличить форматирование ID от наличия объекта — класс сценария

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

  • GetSerial форматирует число 1073746484 как 0x40001234, даже если объекта нет.
  • Только следующая проверка сообщает о наличии этого serial в текущем локальном мире.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var serial = UO.GetSerial("1073746484");
        UO.Print("Serial: " + serial);
        var present = UO.IsObjectExists(serial);
        UO.Print("Present 1/0: " + Convert.ToString(present));
        return null;
    }
}

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

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

UO.IsObjectExists(objID) — UO.IsObjectExists(Any)

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

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

При вызове:

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

case "isobjectexists": return new InjectionValue(bridge.Exists(Arg(0)));

UO.LastObject

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

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

dynamic UO.LastObject();

Читает serial последнего использованного объекта.

Параметры

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

Возвращает

int — сохранённый serial; 0 означает, что serial не установлен. Это не bool и не graphic/type; ненулевой ID может уже отсутствовать в мире.

Поведение

  • Источник поля: _world.LastObject. Команда не выбирает, не использует и не атакует объект.
  • Читает текущее локальное состояние. Пакета, target и автоматического обновления нет; отдельные чтения могут видеть разные состояния.

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

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

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

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

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

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

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

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

  • Читает serial последнего использованного объекта.
var id = UO.LastObject();
UO.Print(Hex(id));

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

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

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

  • Источник поля: _world.LastObject. Команда не выбирает, не использует и не атакует объект.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.LastObject();
    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.LastObject();
        UO.Wait(500);
        var after = UO.LastObject();
        UO.Print(before = after);
        return null;
    }
}

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

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

UO.LastObject() — UO.LastObject()

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

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

При вызове:

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

case "lastobject": return new InjectionValue(bridge.GetLastObject());

UO.MakeFakeItem

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

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

void UO.MakeFakeItem(object? @type);
void UO.MakeFakeItem(object? @type, object? serial);
void UO.MakeFakeItem(object? @type, object? serial, object? count);
void UO.MakeFakeItem(object? @type, object? serial, object? count, object? color);
void UO.MakeFakeItem(object? @type, object? serial, object? count, object? color, object? x);
void UO.MakeFakeItem(object? @type, object? serial, object? count, object? color, object? x, object? y);

Создаёт или изменяет только локальный предмет клиента.

Параметры

  • type — Обязательный graphic 1..65535; не именованный type через ResolveType: эта legacy-ветка использует Arg/int.
  • serial — Необязательный serial предмета. 0 (по умолчанию) выделяет свободный ID из локального диапазона около 0x7FFEFFFF; явный item serial может совпасть с уже загруженным предметом и изменить его локальную модель.
  • count — Необязательное количество, по умолчанию 1. Неположительное становится 1; максимум 65535.
  • color — Необязательный hue, по умолчанию 0; ограничивается до 0..65535.
  • x — Необязательные мировые координаты, по умолчанию self; отрицательные используют self, затем ограничиваются 0..65535. Z всегда текущий Player.Z.
  • y — Необязательные мировые координаты, по умолчанию self; отрицательные используют self, затем ограничиваются 0..65535. Z всегда текущий Player.Z.

Возвращает

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

Поведение

  • CreateFakeItem требует Player и допустимый graphic/item serial. GetOrCreateItem возвращает локальную модель; если она в контейнере, удаляет связь. Назначает ground container 0xFFFFFFFF, graphic/amount/hue/X/Y/Z, Layer.Invalid, AllowedToDraw=true, IsDamageable=false и IsMulti=false.
  • Legacy-команда отбрасывает возвращённый serial. При 0 выводит сообщение об ошибке. Сервер предмет не создаёт: действие не даёт реального предмета, добычи или права переноса. Для примера оставляйте serial=0.

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

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

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

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

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

UO.Print("Calling UO.MakeFakeItem");
UO.MakeFakeItem(0x0E21);

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

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

  • Создаёт или изменяет только локальный предмет клиента.
UO.MakeFakeItem(0x0E21);

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

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

  • CreateFakeItem требует Player и допустимый graphic/item serial. GetOrCreateItem возвращает локальную модель; если она в контейнере, удаляет связь. Назначает ground container 0xFFFFFFFF, graphic/amount/hue/X/Y/Z, Layer.Invalid, AllowedToDraw=true, IsDamageable=false и IsMulti=false.
return  RunScenario();
 object? RunScenario()
{
    UO.MakeFakeItem(0x0E21, 0, 5, 0);
    return null;
}

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

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

  • Legacy-команда отбрасывает возвращённый serial. При 0 выводит сообщение об ошибке. Сервер предмет не создаёт: действие не даёт реального предмета, добычи или права переноса. Для примера оставляйте serial=0.
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.MakeFakeItem(0x0E21, 0, 1, 0, UO.GetX(), UO.GetY());
        return null;
    }
}

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

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

UO.MakeFakeItem(type) — UO.MakeFakeItem(Any)

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

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

При вызове:

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

case "makefakeitem":

                {

                    int graphic = Arg(0);

                    int serial = Arg(1, 0);

                    int amount = Arg(2, 1);

                    int hue = Arg(3, 0);

                    int x = Arg(4, bridge.GetX(bridge.Self));

                    int y = Arg(5, bridge.GetY(bridge.Self));

                    int createdSerial = bridge.CreateFakeItem(graphic, serial, amount, hue, x, y);

                    if (createdSerial == 0)

                        SystemMessage("MakeFakeItem: invalid graphic/serial or no active player.");

                    break;

                }

UO.MakeFakeItem(type, serial) — UO.MakeFakeItem(Any,Any)

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

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

При вызове:

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

case "makefakeitem":

                {

                    int graphic = Arg(0);

                    int serial = Arg(1, 0);

                    int amount = Arg(2, 1);

                    int hue = Arg(3, 0);

                    int x = Arg(4, bridge.GetX(bridge.Self));

                    int y = Arg(5, bridge.GetY(bridge.Self));

                    int createdSerial = bridge.CreateFakeItem(graphic, serial, amount, hue, x, y);

                    if (createdSerial == 0)

                        SystemMessage("MakeFakeItem: invalid graphic/serial or no active player.");

                    break;

                }

UO.MakeFakeItem(type, serial, count) — UO.MakeFakeItem(Any,Any,Any)

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

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

При вызове:

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

case "makefakeitem":

                {

                    int graphic = Arg(0);

                    int serial = Arg(1, 0);

                    int amount = Arg(2, 1);

                    int hue = Arg(3, 0);

                    int x = Arg(4, bridge.GetX(bridge.Self));

                    int y = Arg(5, bridge.GetY(bridge.Self));

                    int createdSerial = bridge.CreateFakeItem(graphic, serial, amount, hue, x, y);

                    if (createdSerial == 0)

                        SystemMessage("MakeFakeItem: invalid graphic/serial or no active player.");

                    break;

                }

UO.MakeFakeItem(type, serial, count, color) — UO.MakeFakeItem(Any,Any,Any,Any)

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

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

При вызове:

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

case "makefakeitem":

                {

                    int graphic = Arg(0);

                    int serial = Arg(1, 0);

                    int amount = Arg(2, 1);

                    int hue = Arg(3, 0);

                    int x = Arg(4, bridge.GetX(bridge.Self));

                    int y = Arg(5, bridge.GetY(bridge.Self));

                    int createdSerial = bridge.CreateFakeItem(graphic, serial, amount, hue, x, y);

                    if (createdSerial == 0)

                        SystemMessage("MakeFakeItem: invalid graphic/serial or no active player.");

                    break;

                }

UO.MakeFakeItem(type, serial, count, color, x) — UO.MakeFakeItem(Any,Any,Any,Any,Any)

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

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

При вызове:

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

case "makefakeitem":

                {

                    int graphic = Arg(0);

                    int serial = Arg(1, 0);

                    int amount = Arg(2, 1);

                    int hue = Arg(3, 0);

                    int x = Arg(4, bridge.GetX(bridge.Self));

                    int y = Arg(5, bridge.GetY(bridge.Self));

                    int createdSerial = bridge.CreateFakeItem(graphic, serial, amount, hue, x, y);

                    if (createdSerial == 0)

                        SystemMessage("MakeFakeItem: invalid graphic/serial or no active player.");

                    break;

                }

UO.MakeFakeItem(type, serial, count, color, x, y) — UO.MakeFakeItem(Any,Any,Any,Any,Any,Any)

Параметры: type (Any), serial (Any), count (Any), color (Any), x (Any), y (Any)

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

При вызове:

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

case "makefakeitem":

                {

                    int graphic = Arg(0);

                    int serial = Arg(1, 0);

                    int amount = Arg(2, 1);

                    int hue = Arg(3, 0);

                    int x = Arg(4, bridge.GetX(bridge.Self));

                    int y = Arg(5, bridge.GetY(bridge.Self));

                    int createdSerial = bridge.CreateFakeItem(graphic, serial, amount, hue, x, y);

                    if (createdSerial == 0)

                        SystemMessage("MakeFakeItem: invalid graphic/serial or no active player.");

                    break;

                }

UO.MassMove

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

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

void UO.MassMove();
void UO.MassMove(object? delay);
void UO.MassMove(object? delay, object? quantity);
void UO.MassMove(object? delay, object? quantity, object? @type);
void UO.MassMove(object? delay, object? quantity, object? @type, object? destination);
void UO.MassMove(object? delay, object? quantity, object? @type, object? destination, object? x, object? y, object? z);

Включает одноразовый массовый перенос предметов выбранного типа. После Activate MassMove перетащите один подходящий предмет мышью: из него определяется исходный контейнер. Остальные предметы этого типа из того же источника следуют автоматически. Третий параметр — TYPE/Graphic, не ID предмета. Все формы включают ожидание первого ручного переноса; явное назначение задаёт, куда он пойдёт.

Параметры

  • delay — Первый параметр — задержка между запросами переноса в миллисекундах, целое число от 0 до 2147483647. 350 означает 0,35 секунды. При 0 отправляется не более одного очередного переноса за игровой кадр. Задержка не добавляется к GrabDelay. Отрицательное значение выключает режим и очищает очередь; для выключения предпочтительна ясная запись UO.MassMove().
  • quantity — Второй параметр — ОБЩИЙ предел отдельных предметов-объектов (items), включая первый ручной перенос. Один стек/стопка считается одним item независимо от количества внутри. 50 означает до 50 целых стопок либо 50 одиночных предметов. Стек по этому лимиту НЕ разделяется. 0 или отсутствие параметра — все подходящие items. Отрицательные значения недопустимы.
  • type — Третий параметр — код типа предмета (Graphic/Type), целое 0..65535, например 0x0EED или строка "0x0EED" для золота. Это НЕ serial/ID и НЕ имя AddObject. 0 или отсутствие определяет тип по первому ручному переносу. При явном типе перетаскивание другого типа не активирует очередь; режим продолжает ждать подходящий предмет.
  • destination — Четвёртый параметр — назначение. Serial сундука (число/hex-строка) или сохранённое имя AddObject выбирает контейнер; X/Y — место внутри его окна. backpack, self и my выбирают рюкзак текущего персонажа, также с координатами внутри рюкзака. ground или 0 выбирает землю: X/Y/Z — абсолютная позиция на карте, все три параметра обязательны. lastcontainer — последний открытый контейнер; lastobject, lasttarget, lastcorpse, finditem, laststatus допустимы, если указывают на доступный контейнер. receiving и catchbag выбирают установленный SetCatchBag контейнер, а если он не установлен — рюкзак. self/my здесь означают именно рюкзак, хотя GetX(self) читает позицию персонажа. Имена сравниваются без учёта регистра; неизвестное или ещё не установленное имя даёт ошибку, а не сбрасывает предмет на землю. Без destination место запоминается из первого ручного сброса: можно положить образец как внутрь контейнера, так и на землю. Для земли запоминаются мировые X/Y/Z первого сброса.
  • x — Пятый параметр. Для контейнера — координата внутри контейнера; -1 или 65535 означает автоматическое размещение. Для земли — абсолютная координата карты, от 0 до 65535. При форме без X/Y/Z в явном контейнере используется -1.
  • y — Шестой параметр. Для контейнера — координата внутри контейнера, -1/65535 для автоматического размещения; для земли — абсолютная координата карты 0..65535. При форме без координат в явном контейнере используется -1.
  • z — Седьмой параметр — высота назначения, целое -128..127. В контейнере обычно 0; на земле укажите реальную высоту. В короткой форме высота и X/Y берутся из ручного переноса.

Возвращает

void: значения нет. Activate MassMove означает включение ожидания ручного переноса. Итоговая строка сообщает число отдельных items, для которых отправлены запросы, включая первый. Стек считается одним item; результат не подтверждает принятие каждого запроса сервером.

Поведение

  • Зарегистрированы формы с 0, 1, 2, 3, 4 и 7 аргументами. X/Y/Z задаются только вместе. Формы с 5, 6 или 8 аргументами не поддерживаются. Порядок: delay, quantity, type, destination, x, y, z.
  • Активируйте режим ДО захвата мышью. Первый ручной перенос считается одним item: стек из 1000 переносится целиком и расходует только одно место из лимита 50. Включённый режим берёт полные стеки без диалога разделения. Если часть стека была взята до включения, такой перенос отклоняется: положите часть обратно и начните заново.
  • Одна активация относится к одному ручному переносу. После выбора образца режим выбора выключается; оставшаяся очередь обрабатывается автоматически. Обычный вызов MoveItem из другого скрипта не считается ручным выбором образца.
  • Сравнивается тип Graphic. Цвет в этой команде не фильтруется. Обрабатывается только прямое содержимое исходного контейнера; вложенные сумки не раскрываются. Новые предметы, появившиеся после создания очереди, в неё не добавляются. Если образец лежал на земле, учитываются загруженные предметы того же типа в радиусе захвата.
  • Количество — верхний предел запросов. Команда не повторяет отвергнутые сервером переносы автоматически. При отказе сервера, недоступном назначении, смерти персонажа или невозможности взять очередной предмет операция прекращается. При занятом курсоре очередь ждёт освобождения до 5 секунд.
  • UO.MassMove() выключает режим и отменяет оставшуюся очередь. UO.TerminateAll() и выход с персонажа также отменяют её. Уже отправленный запрос отменой не откатывается. Очередь исполняется клиентом после возврата команды; следующая строка скрипта не означает, что сервер уже завершил перенос.
  • Для полного переноса содержимого разных типов используйте EmptyContainer. Для переноса одного конкретного предмета — MoveItem. Восемь аргументов source, type, color, destination, x, y, z, delay относятся к MoveItems, а не к MassMove.
  • Повторный корректный вызов этой же команды, пока режим ещё ждёт первого переноса мышью, выключает ожидание: Deactivate MassMove/MassPriceMove появляется прямо в игровом окне. Следующий вызов снова включает режим. После первого переноса для остановки оставшейся очереди используйте форму без аргументов. Уже отправленные запросы не откатываются.

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

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

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

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

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

UO.Print("Calling UO.MassMove");
UO.MassMove(350, 0);

1. Включить перенос мышью без ограничения количества — прямой скрипт

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

  • delay=350: следующие запросы разделены минимум 350 мс. quantity=0: верхнего пользовательского лимита нет.
  • type, destination и X/Y/Z не переданы. После Activate MassMove перетащите образец из сумки в сундук: тип и источник берутся из него, назначение — из места сброса.
  • Если образец — золото, перемещаются загруженные стеки золота того же исходного контейнера. Предметы других типов остаются. Print только поясняет последующее ручное действие.
UO.MassMove(350, 0);
UO.Print("Drag one sample item to the destination container");

2. Перенести 50 целых стопок из 100 — функция сценария

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

  • delay задаёт 350 мс. total передаётся во второй параметр quantity и ограничивает ВСЮ операцию 50 отдельными items.
  • Если в источнике лежат 100 стопок одного типа, будут перенесены 50 стопок целиком: первая ручная и ещё 49. В каждой стопке может быть разное количество; оно не влияет на счётчик. Если это одиночные предметы, переносятся 50 одиночных предметов.
  • Остальные параметры отсутствуют: первый захват и назначение выбираются мышью после вызова.
return  RunScenario();
 object? RunScenario()
{
    var delay = 350;
    var total = 50;
    UO.MassMove(delay, total);
    return null;
}

3. Выбрать тип золота и задать сундук заранее — класс сценария

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

  • goldType — TYPE золота, не ID отдельной стопки. AddObject сохраняет serial сундука в chest; замените 0x40005678 своим ID.
  • delay=350 мс, quantity=50 отдельных items, type=0x0EED, destination=chest. В лимит входят первая стопка и ещё не более 49; все целиком.
  • x=-1 и y=-1 задают автоматическое размещение в сундуке, z=0. Это все семь параметров.
  • Очередь начнётся после ручного перетаскивания золота. Его исходная сумка станет источником. Явный chest заменяет место сброса мыши; предмет другого типа очередь не запускает.
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 goldType = "0x0EED";
        UO.AddObject("chest", "0x40005678");
        UO.MassMove(350, 50, goldType, "chest", -1, -1, 0);
        UO.Print("Now drag one gold stack from the source bag");
        return null;
    }
}

4. Выбрать образец мышью, но заранее задать землю — прямой скрипт

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

  • delay=350 мс, quantity=0 — все подходящие items. type=0 берёт тип из будущего ручного переноса.
  • destination=0 означает землю, поэтому указана полная тройка x,y,z. GetX/GetY/GetZ здесь возвращают текущую позицию персонажа.
  • После вызова возьмите и сбросьте мышью образец. Команда отправит его и остальные подходящие items на указанные координаты, даже если мышь была над контейнером. Сервер проверяет доступность земли.
var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
UO.MassMove(350, 0, 0, 0, x, y, z);

5. Перенести до десяти предметов известного типа в рюкзак — функция сценария

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

  • delay=500 — полсекунды; quantity=10 — десять отдельных предметов/стеков за всю операцию.
  • type=0x0F7A — графический тип предмета. Укажите свой тип; серийный номер вида 0x40001234 здесь недопустим.
  • destination=backpack — рюкзак персонажа. Координаты не переданы, поэтому внутри него используются x=-1, y=-1, z=0.
  • Первым ручным переносом подходящего предмета выбирается источник. Если источник — уже рюкзак, выберите другую исходную сумку для полезного переноса.
return  RunScenario();
 object? RunScenario()
{
    UO.MassMove(500, 10, "0x0F7A", "backpack");
    UO.Print("Drag one matching item from the source chest");
    return null;
}

6. Выбрать место внутри сундука по уже лежащему предмету — класс сценария

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

  • Сначала вручную положите предмет в нужное место сундука. Первый AddObject выбирает сам сундук и сохраняет его ID в chest. Второй выбирает предмет внутри него и сохраняет ID в position_sample.
  • GetX/GetY для предмета внутри контейнера возвращают его координаты внутри этого контейнера. Они не зависят от того, где на экране расположено окно сундука.
  • delay=350 мс, quantity=50 целых items, type=0 определяется будущим ручным переносом из источника, destination=chest.
  • x и y задают выбранное место внутри сундука, последний z=0. Предмет position_sample служит только для чтения координат; источник и переносимый тип определяются последующим ручным переносом.
  • Для рюкзака замените chest на backpack или self. Для земли используйте ground и координаты карты, например UO.GetX(), UO.GetY(), UO.GetZ() без аргументов для текущей позиции персонажа.
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.Print("Select the destination chest");
        UO.AddObject("chest");
        UO.Print("Select an item already at the desired position inside that chest");
        UO.AddObject("position_sample");
        var x = UO.GetX("position_sample");
        var y = UO.GetY("position_sample");
        UO.MassMove(350, 50, 0, "chest", x, y, 0);
        UO.Print("Drag one source item to start the transfer");
        return null;
    }
}

7. Из сундука на землю: выбрать место мышью — прямой скрипт

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

  • delay=350 — не менее 350 мс между последующими запросами. quantity=50 — до 50 отдельных items/целых стопок, включая образец; это не 50 единиц из одного стека.
  • После Activate MassMove возьмите предмет в открытом сундуке и положите мышью на землю. Его тип и исходный сундук определяются по образцу; мировые X/Y/Z назначения запоминаются по месту этого сброса.
  • Остальные загруженные предметы того же типа из этого сундука направляются на ту же точку земли. Содержимое вложенных сумок и другие типы не затрагиваются. Для всех подходящих items вместо 50 укажите 0.
  • У MassMove нет возвращаемого значения. Процедура завершается после включения режима, очередь продолжает работать в клиенте. Итоговое сообщение считает отправленные запросы, а не подтверждения сервера. Для отмены оставшейся очереди вызовите UO.MassMove().
UO.MassMove(350, 50);
UO.Print("Drag one item from the chest onto the ground");

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

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

UO.MassMove() — UO.MassMove()

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

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

При вызове:

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

case "massmove":

                    if (arguments.Length == 0) bridge.MassMove(-1, 0, 0, -1, -1, -1, 0);

                    else bridge.MassMove(NumberConversions.ToInt(arguments[0]),

                        arguments.Length > 1 ? NumberConversions.ToInt(arguments[1]) : 0,

                        arguments.Length > 2 ? ResolveType(arguments[2]) : 0,

                        arguments.Length > 3 ? ResolveTransferDestination(arguments[3], true) : -1,

                        arguments.Length > 4 ? NumberConversions.ToInt(arguments[4]) : -1,

                        arguments.Length > 5 ? NumberConversions.ToInt(arguments[5]) : -1,

                        arguments.Length > 6 ? NumberConversions.ToInt(arguments[6]) : 0);

                    break;

UO.MassMove(delay) — UO.MassMove(Any)

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

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

При вызове:

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

case "massmove":

                    if (arguments.Length == 0) bridge.MassMove(-1, 0, 0, -1, -1, -1, 0);

                    else bridge.MassMove(NumberConversions.ToInt(arguments[0]),

                        arguments.Length > 1 ? NumberConversions.ToInt(arguments[1]) : 0,

                        arguments.Length > 2 ? ResolveType(arguments[2]) : 0,

                        arguments.Length > 3 ? ResolveTransferDestination(arguments[3], true) : -1,

                        arguments.Length > 4 ? NumberConversions.ToInt(arguments[4]) : -1,

                        arguments.Length > 5 ? NumberConversions.ToInt(arguments[5]) : -1,

                        arguments.Length > 6 ? NumberConversions.ToInt(arguments[6]) : 0);

                    break;

UO.MassMove(delay, quantity) — UO.MassMove(Any,Any)

Параметры: delay (Any), quantity (Any)

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

При вызове:

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

case "massmove":

                    if (arguments.Length == 0) bridge.MassMove(-1, 0, 0, -1, -1, -1, 0);

                    else bridge.MassMove(NumberConversions.ToInt(arguments[0]),

                        arguments.Length > 1 ? NumberConversions.ToInt(arguments[1]) : 0,

                        arguments.Length > 2 ? ResolveType(arguments[2]) : 0,

                        arguments.Length > 3 ? ResolveTransferDestination(arguments[3], true) : -1,

                        arguments.Length > 4 ? NumberConversions.ToInt(arguments[4]) : -1,

                        arguments.Length > 5 ? NumberConversions.ToInt(arguments[5]) : -1,

                        arguments.Length > 6 ? NumberConversions.ToInt(arguments[6]) : 0);

                    break;

UO.MassMove(delay, quantity, type) — UO.MassMove(Any,Any,Any)

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

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

При вызове:

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

case "massmove":

                    if (arguments.Length == 0) bridge.MassMove(-1, 0, 0, -1, -1, -1, 0);

                    else bridge.MassMove(NumberConversions.ToInt(arguments[0]),

                        arguments.Length > 1 ? NumberConversions.ToInt(arguments[1]) : 0,

                        arguments.Length > 2 ? ResolveType(arguments[2]) : 0,

                        arguments.Length > 3 ? ResolveTransferDestination(arguments[3], true) : -1,

                        arguments.Length > 4 ? NumberConversions.ToInt(arguments[4]) : -1,

                        arguments.Length > 5 ? NumberConversions.ToInt(arguments[5]) : -1,

                        arguments.Length > 6 ? NumberConversions.ToInt(arguments[6]) : 0);

                    break;

UO.MassMove(delay, quantity, type, destination) — UO.MassMove(Any,Any,Any,Any)

Параметры: delay (Any), quantity (Any), type (Any), destination (Any)

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

При вызове:

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

case "massmove":

                    if (arguments.Length == 0) bridge.MassMove(-1, 0, 0, -1, -1, -1, 0);

                    else bridge.MassMove(NumberConversions.ToInt(arguments[0]),

                        arguments.Length > 1 ? NumberConversions.ToInt(arguments[1]) : 0,

                        arguments.Length > 2 ? ResolveType(arguments[2]) : 0,

                        arguments.Length > 3 ? ResolveTransferDestination(arguments[3], true) : -1,

                        arguments.Length > 4 ? NumberConversions.ToInt(arguments[4]) : -1,

                        arguments.Length > 5 ? NumberConversions.ToInt(arguments[5]) : -1,

                        arguments.Length > 6 ? NumberConversions.ToInt(arguments[6]) : 0);

                    break;

UO.MassMove(delay, quantity, type, destination, x, y, z) — UO.MassMove(Any,Any,Any,Any,Any,Any,Any)

Параметры: delay (Any), quantity (Any), type (Any), destination (Any), x (Any), y (Any), z (Any)

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

При вызове:

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

case "massmove":

                    if (arguments.Length == 0) bridge.MassMove(-1, 0, 0, -1, -1, -1, 0);

                    else bridge.MassMove(NumberConversions.ToInt(arguments[0]),

                        arguments.Length > 1 ? NumberConversions.ToInt(arguments[1]) : 0,

                        arguments.Length > 2 ? ResolveType(arguments[2]) : 0,

                        arguments.Length > 3 ? ResolveTransferDestination(arguments[3], true) : -1,

                        arguments.Length > 4 ? NumberConversions.ToInt(arguments[4]) : -1,

                        arguments.Length > 5 ? NumberConversions.ToInt(arguments[5]) : -1,

                        arguments.Length > 6 ? NumberConversions.ToInt(arguments[6]) : 0);

                    break;

Clone this wiki locally