Skip to content

UO Topic items Part 2

Codex edited this page Oct 12, 2026 · 3 revisions

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

Предмети — 2

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

Частини довідника

1 · 2

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


UO.MoveItem

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

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

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

Переносить один конкретний предмет/стек по serial: захоплення і скидання у контейнер чи землю.

Параметри

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

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

int 1 - клієнт прийняв запит захоплення та скидання; 0 — Виконати запит не вдалося. При waitConfirmation=true одиниця додатково вимагає зміни контейнера/координат або зменшення вихідного стека. Це не serial нового стека і не число перенесених елементів. Сервер може відмовити у дії.

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

Поведінка

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

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

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

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

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

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

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

1. Весь предмет у рюкзак – прямий скрипт

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

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

2. Частина стека в конкретне місце скрині - функція сценарію

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

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

3. Земля під персонажем – клас сценарію

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

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

     public object? RunScenario()
    {
        var ok = UO.MoveItem("loot", 0, "ground");
        return null;
    }
}

4. Від скрині до землі поруч з персонажем - прямий сценарій

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

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

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

5. Запросити підтвердження, що спостерігається — функція сценарію

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

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

    return null;
}

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

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

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

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

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

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

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

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

public int MoveItem(InjectionValue id)

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

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

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

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

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

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

public int MoveItem(InjectionValue id, InjectionValue amount)

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

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

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

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

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

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

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

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

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

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

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

values => new InjectionValue(CompactMoveItem(values))

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

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

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

values => new InjectionValue(CompactMoveItem(values))

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

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

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

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

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

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

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

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

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

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

values => new InjectionValue(CompactMoveItem(values))

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

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

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

values => new InjectionValue(CompactMoveItem(values))

UO.MoveItems

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

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

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

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

Параметри

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

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

Зареєструватись object? фактично повертає int 1/true, якщо прийнято хоча б один запит перенесення, інакше 0/false. Це не кількість предметів і не гарантія перенесення всіх збігів. Перевірте вміст після відповіді сервера. Аварійне скасування перериває процедуру і має повертати false.

Поведінка

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

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

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

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

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

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

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

1. Зібрати золото з вибраної скрині в рюкзак - прямий скрипт

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

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

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

2. Покласти бинти в задане місце гампа скрині - функція сценарію

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

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

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

    return null;
}

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

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

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

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

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

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

        return null;
    }

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

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

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

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

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

UO.MoveItems(container, itemsType, itemsColor, moveIntoID, x, y, z, delayMS) — UO.MoveItems(Any,Any,Any,Any,Any,Any,Any,Any)

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

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

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

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

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

UO.Name

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

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

string UO.Name();

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

Параметри

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

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

string – відоме клієнту ім'я. Порожній рядок означає порожнє/невідоме значення або відсутність об'єкта. Це не serial та не шлях профілю. Ігрове ім'я/титул не перекладається мовою IDE.

Поведінка

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

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

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

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

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

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

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

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

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

  • Параметрів немає: читається self.
  • Порожній рядок опрацьовується явно; це не текст "0".
var text = UO.Name();
if (Truth(text != ""))
{
    UO.Print(text);
}
else
{
    UO.Print("Text is unavailable");
}

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

2. Додати текст до повідомлення журналу — функція сценарію

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

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

3. Порівняти два знімки – клас сценарію

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

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

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

        return null;
    }

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

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

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

UO.Name() — UO.Name()

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

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

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

Створення API: Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди.


UO.Picking

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

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

int UO.Picking();

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

Параметри

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

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

int 1 - ItemHold.Enabled встановлений; 0 — не встановлено. Це стан клієнта, що не ID і не підтвердження серверної доставки. Враховується предмет, піднятий мишею чи іншим скриптом.

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

Поведінка

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

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

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

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

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

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

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

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

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

  • Аргументів немає.
  • Виводиться 1 або 0.
UO.Print(Convert.ToString(UO.Picking()));

2. Перевірити зайняті руки до захоплення – функція сценарію

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

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

    return null;
}

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

3. Дочекайтеся вільного курсору з обмеженням - клас сценарію

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

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

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

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

        return null;
    }

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

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

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

UO.Picking() — UO.Picking()

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

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

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

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

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

UO.ReceiveObjectName

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

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

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

Запитує ім'я single-click запитом.

Параметри

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

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

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

Поведінка

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

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

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

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

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

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

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

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

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

  • Запитує ім'я single-click запитом.
UO.ReceiveObjectName("lasttarget");

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

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

  • Bridge.ReceiveObjectName викликає Click(id), потім чекає до max(0,timeout), поки GetName(id) порожньо; паузи не більше 25 ms. Вже відоме ім'я завершує очікування одразу.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("lasttarget")))
    {
        UO.ReceiveObjectName("lasttarget", 1000);
    }

    return null;
}

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

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

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

  • Без timeout виконується лише Click. Ім'я, що повертається, немає: прочитайте GetName окремо; Закінчення очікування може означати timeout.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var id = UO.GetSerial("lasttarget");
        if (Truth(UO.Exists(id)))
        {
            UO.ReceiveObjectName(id, 1000);
            UO.Print(UO.GetName(id));
        }

        return null;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

UO.TicksUse

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

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

int UO.TicksUse();

Читає збережену позначку TicksUse.

Параметри

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

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

int - позначка UO.Timer в десятих частках секунди від старту runtime. 0 - позначка ще не встановлена ​​або подія була в першу десяту секунди; це не мілісекунди та не календарний час.

Поведінка

  • Повертає поле ticksUse. Його оновлює UseObject; це не автоматичне відстеження всіх ручних/серверних дій. Сама команда позначку не змінює.
  • UO.Timer() - позначка обчислює вік десятих секунди. Між різними runtime позначки не порівнюються.

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

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

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

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

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

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

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

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

  • Читає збережену позначку TicksUse.
var stamp = UO.TicksUse();
UO.Print(stamp);

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

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

  • Повертає поле ticksUse. Його оновлює UseObject; це не автоматичне відстеження всіх ручних/серверних дій. Сама команда позначку не змінює.
return  RunScenario();
 object? RunScenario()
{
    var stamp = UO.TicksUse();
    var ageTenths = UO.Timer() - stamp;
    UO.Print(ageTenths);
    return null;
}

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

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

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

     public object? RunScenario()
    {
        var before = UO.TicksUse();
        UO.Wait(250);
        var after = UO.TicksUse();
        UO.Print(before = after);
        return null;
    }
}

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

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

UO.TicksUse() — UO.TicksUse()

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

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

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

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

public int TicksUse() => ticksUse;

UO.UpdateObject

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

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

void UO.UpdateObject(object? id);

Вимагає оновлення вже завантаженого об'єкта.

Параметри

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

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

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

Поведінка

  • Для Mobile викликається RequestMobileStatus(..., true), для Item - SingleClick. Якщо serial немає в обох локальних таблицях, дії немає. Це не завантаження невідомого об'єкта та не підтвердження оновлення.
  • Bridge надсилає запит на ігровому потоці. Діють правила сервера; вбудованого очікування підтвердження немає.

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

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

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

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

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

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

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

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

  • Вимагає оновлення вже завантаженого об'єкта.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
    UO.UpdateObject(id);
}

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

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

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

  • Для Mobile викликається RequestMobileStatus(..., true), для Item - SingleClick. Якщо serial немає в обох локальних таблицях, дії немає. Це не завантаження невідомого об'єкта та не підтвердження оновлення.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("self");
    if (Truth(UO.Exists(id)))
    {
        UO.UpdateObject(id);
    }

    return null;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

UO.UseFromGround

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

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

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

Шукає об'єкт заданого graphic на землі/у світі та відразу викликає його застосування. Зазвичай використовується для предметів, що лежать поруч, наприклад для відкриття рюкзака. Важлива особливість цього runtime: пошук заснований на FindType та може знайти також mobile з таким body; це не суворо item-only вибірка. Для предметів із явним радіусом та вибором найближчого використовуйте UseType(..., ground, ...).

Параметри

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

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

int — serial першого знайденого об'єкта, переданого UseObject, або 0. Це не кількість об'єктів, не graphic і не true/false. Об'єкт можна знайти, але сервер може заборонити застосування. Перевіряйте id != 0 та окремо очікуваний ігровий ефект.

Поведінка

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

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

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

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

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

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

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

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

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

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

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

2. Застосувати рюкзак потрібного фарбування поряд на тій самій висоті – функція сценарію

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

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

    return null;
}

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

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

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

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

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

        return null;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

public int UseFromGround(InjectionValue type, InjectionValue color)

        {

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

            if (id != 0)

                UseObject(id);

            else

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

            return id;

        }

UO.UseItemOnMobile

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

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

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

Готує мету персонажа та використовує предмет.

Параметри

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

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

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

Поведінка

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

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

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

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

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

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

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

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

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

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

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

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

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

    return null;
}

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

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

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

  • Не перевіряє тип мети/предмета і не чекає на cursor. Підготовка мети раніше використання запобігає пропуску target, що швидко прийшов, але сервер все одно визначає допустимість дії.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var item = UO.GetSerial("lastobject");
        if (Truth(UO.Exists(item)))
        {
            UO.UseItemOnMobile(item, "self");
            UO.Print(UO.Waiting());
        }

        return null;
    }

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

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

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

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

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

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

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

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

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

UO.UseObject

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

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

void UO.UseObject(object? objID);

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

Параметри

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

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

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

Поведінка

  • GetObject дозволяє аліас; невідоме ім'я дає -1. Після виклику runtime оновлює TicksUse значенням UO.Timer; це момент запиту, а чи не підтвердження сервера.
  • Bridge надсилає запит на ігровому потоці. Діють правила сервера; вбудованого очікування підтвердження немає.

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

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

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

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

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

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

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

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

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

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

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

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

  • GetObject дозволяє аліас; невідоме ім'я дає -1. Після виклику runtime оновлює TicksUse значенням UO.Timer; це момент запиту, а чи не підтвердження сервера.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("self");
    if (Truth(UO.Exists(id)))
    {
        UO.UseObject(id);
    }

    return null;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

public void UseObject(int id)

        {

            bridge.UseObject(id);

            ticksUse = Timer();

        }

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

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

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

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

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

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

UO.UseType

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

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

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

Знаходить один предмет потрібного graphic/type та застосовує його. Наприклад, випити зілля з рюкзака, відкрити поряд рюкзак або використовувати річ з вибраного контейнера. Персонажу ця команда не шукає та не переміщає. Якщо предмет вимагає приціл, ціль потрібно підготувати окремо.

Параметри

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

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

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

Поведінка

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

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

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

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

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

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

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

1. Застосувати лікувальне зілля з рюкзака – прямий скрипт

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

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

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

2. Відкрити найближчий рюкзак на землі в межах двох клітин – функція сценарію

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

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

    return null;
}

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

3. Використовувати предмет із заздалегідь вибраного контейнера – клас сценарію

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

  • itemType - graphic речі, source - окремий serial контейнера. Помічник повертає serial/0 так само, як UseType. Навіть знайдену річ сервер може забороняти використовувати із чужого чи віддаленого контейнера.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var source = Asc(UO.GetSerial("lasttarget"), 0);
        if (Truth(source == 0) || !(Truth(UO.Exists(source))))
        {
            return null;
        }

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

        return null;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        {

            new InjectionValue(type),

            new InjectionValue(color)

        });

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

values => new InjectionValue(CompactUseType(values))

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

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

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

values => new InjectionValue(CompactUseType(values))

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

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

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

values => new InjectionValue(CompactUseType(values))

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

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

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

values => new InjectionValue(CompactUseType(values))

UO.UseWorldObject

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

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

void UO.UseWorldObject(object? serialOrName);

Дозволяє serialOrName через GetObject і викликає UseObject. Рядкове ім'я - аліас об'єкта, не ім'я graphic/type.

Параметри

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

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

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

Поведінка

  • У metadata зареєстрована прямо на UserObject. Це звичайне використання serial, а не пошук у всьому серверному світі.
  • Bridge надсилає запит на ігровому потоці. Діють правила сервера; вбудованого очікування підтвердження немає.

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

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

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

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

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

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

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

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

  • Дозволяє serialOrName через GetObject і викликає UseObject. Рядкове ім'я - аліас об'єкта, не ім'я graphic/type.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
    UO.UseWorldObject(id);
}

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

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

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

  • У metadata зареєстрована прямо на UserObject. Це звичайне використання serial, а не пошук у всьому серверному світі.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("self");
    if (Truth(UO.Exists(id)))
    {
        UO.UseWorldObject(id);
    }

    return null;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

public void UserObject(InjectionValue serialOrName)

            => UseObject(GetObject(serialOrName));

UO.UserObject

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

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

void UO.UserObject(object? serialOrName);

Дозволяє serialOrName через GetObject і викликає UseObject. Рядкове ім'я - аліас об'єкта, не ім'я graphic/type.

Параметри

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

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

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

Поведінка

  • Той самий шлях використання, що UO.UseWorldObject. Команда не створює об'єкт користувача і не додає ім'я AddObject.
  • Bridge надсилає запит на ігровому потоці. Діють правила сервера; вбудованого очікування підтвердження немає.

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

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

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

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

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

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

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

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

  • Дозволяє serialOrName через GetObject і викликає UseObject. Рядкове ім'я - аліас об'єкта, не ім'я graphic/type.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
    UO.UserObject(id);
}

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

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

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

  • Той самий шлях використання, що UO.UseWorldObject. Команда не створює об'єкт користувача і не додає ім'я AddObject.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("self");
    if (Truth(UO.Exists(id)))
    {
        UO.UserObject(id);
    }

    return null;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

public void UserObject(InjectionValue serialOrName)

            => UseObject(GetObject(serialOrName));

Clone this wiki locally