Skip to content

UO Topic items

Codex edited this page Oct 12, 2026 · 6 revisions

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

Предмети

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

Читання властивостей, використання, фарбування та перенесення предметів. Параметр serial визначає конкретний предмет, а type або graphic — його графічний тип. Кількість одиниць у стосі та кількість окремих предметів розрізняються.

Розділи

Тема Команди та пояснення
Властивості предметів 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
Перенесення предметів UO.Grab · UO.Drag · UO.Drop · UO.MoveItem · UO.MoveItems · UO.MassMove · UO.EmptyContainer
Предмети на землі UO.GetWorldItems · UO.FindType · UO.CountGround · UO.MoveItem
Предмети в контейнері UO.GetContent · UO.FindTypeEx · UO.OpenContainer
Предмети, створені лише в клієнті UO.MakeFakeItem · UO.DeleteObject
Фарбування 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

Перенесення предметів

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

Фарбування

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, без кольору, кількості, контейнера, імені предмета, шару або властивостей. Два предмети одного типу різних кольорів вимагають окремого кольору у пошуку. Запис не підтверджує, що предмет існує, доступний або що сервер дозволить дію.

Самостійні 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 і не повний список властивостей інструмента.

Поведінка

  • Читаються останні дані, які вже відомі клієнту; запит на оновлення серверу не надсилається.
  • Невідомий об'єкт та ще не отримана властивість можуть мати нульове/порожнє значення. Перевіряйте 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. Це не число дочірніх предметів скрині і не ліміт елементів команди 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].
  • Параметри зберігають порядок. Не передавайте весь ряд замість масиву параметрів.
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 і відсутній серверний прапор Можувальний. Вага 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 повертають поточну позицію персонажа.
  • Після виклику візьміть та скиньте мишею зразок. Команда відправить його та інші відповідні елементи на зазначені координати, навіть якщо миша була над контейнером. Сервер перевіряє доступність землі.
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