Skip to content

UO Topic character Part 4

Codex edited this page Oct 12, 2026 · 4 revisions

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

Персонаж і спорядження — 4

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

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

1 · 2 · 3 · 4 · 5

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


UO.MaxStamina

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

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

int UO.MaxStamina();

Читає максимальну витривалість із локальної моделі.

Параметри

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

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

int — значення поля StaminaMax, не відсоток і не bool. 0 буває справжнім значенням або ознакою відсутніх даних. Нульовий максимум не можна використовувати як дільник. У чужого mobile значення можуть бути невідомі. HP/HitsMax можуть містити відносну шкалу сервера замість точних очок. HP=0 не доводить смерть; для цього є Dead/IsDead.

Поведінка

  • Команда не відкриває status і не вимагає оновлення сервера. Клієнт лише читає вже завантажені дані. Не змінює характеристики та не відправляє пакети.
  • Результат – окреме читання. Світ може змінитися між Exists та наступним викликом; Кілька запитів не утворюють атомарний знімок.
  • Під час читання об'єкта World.Get відкидає відсутній або IsDestroyed і виходить 0. HP/HitsMax читаються в Entity, включаючи предмети з цими полями; Mana/Stamina – тільки у Mobile. Без аргументу читається self. Однойменний варіант без параметрів не обов'язково має варіант з ID: дивіться сигнатури.
  • Читання без аргументів теж повертає 0 для відсутнього чи знищеного Player. Це стосується і прямих Mana/Stamina та їх максимумів, а не тільки форм через World.Get. Присутній мертвий персонаж може зберігати значення.

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

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

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

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

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

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

1. Вивести значення свого персонажа - прямий скрипт

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

  • Виклик без аргументів читає self. value зберігає одне число, Convert.ToString перетворює його лише повідомлення.
var value = UO.MaxStamina();
UO.Print("MaxStamina: " + Convert.ToString(value));

2. Застосувати значення у перевірці чи розрахунку – функція сценарію

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

  • Показано прикладний поріг або розрахунок цього поля. Числа в умові – налаштування прикладу, не межі сервера. Перед розподілом на максимум перевіряється його позитивність.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.MaxStamina();
    if (Truth(value > 0))
    {
        UO.Print("Stamina percent: " + Convert.ToString(UO.Stamina() * 100 / value));
    }

    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. Повна допоміжна функція ReadValue - клас сценарію

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

  • У цього імені немає форми з ID. ReadValue без параметрів читає 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 before = ReadValue();
        await Delay(1000);
        var after = ReadValue();
        UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        return null;
    }

    dynamic ReadValue()
    {
        return UO.MaxStamina();
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}

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

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

UO.MaxStamina() — UO.MaxStamina()

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

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

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

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

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

() => bridge.MaxStamina

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


UO.MaxWeight

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

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

int UO.MaxWeight();

Читає лічильник статусу свого персонажа: максимальна вага у stones.

Параметри

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

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

int — максимальна вага в stones, 0..65535 у моделі клієнта. 0 може бути реальним значенням, відсутністю даних або відсутнім/знищеним Player. Ця кількість не bool, ID або type: 1 означає одну одиницю, а не успіх. Команда не перебирає об'єкти та не повертає масив.

Поведінка

  • Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
  • Читання в ігровому потоці бере Player. WeightMax, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
  • MaxWeight читає кеш WeightMax. Власний статус type >= 5 задає серверну межу UInt16, навіть якщо вона дорівнює 0. Старий розширений статус обчислює його один раз під час прийому: протокол UO >= 5.0.0a — 7 * floor(Strength / 2) + 40; старіший - Strength * 4 + 25. Результат зберігається як UInt16; крайні значення обертаються за модулем 65536. Strength=101 дає відповідно 390 або 429. При окремій зміні Strength сам getter межа не перераховує.
  • CharacterStatus перевіряє обов'язкове тіло до оновлення. Weight є у своєму розширеному статусі, слоти - з type 3, Luck - з type 4, серверний WeightMax - з type 5. Компактний/старий пакет без необов'язкового лічильника залишає його попередній кеш. Новий Player починає з нулів; дзвінок не доводить отримання свіжого статусу.
  • Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди. C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
  • Кожен дзвінок читає локальні дані заново. Змінна зберігає знімок; окремі читання можуть отримати різні оновлення сервера. Ненульовий результат не перевіряє підключення. Нуль може бути значенням чи відсутністю даних.

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

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

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

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

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

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

1. Вивести збережений лічильник - прямий скрипт

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

  • value зберігає один виклик без аргументів для свого персонажа; Convert.ToString форматує число для журналу, не змінюючи його значення.
var value = UO.MaxWeight();
UO.Print("WeightMax: " + Convert.ToString(value));

2. Спостерігати зміну – функція сценарію

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

  • UO.Wait(500) поділяє before та after на 500 мілісекунд. difference може бути позитивною, нульовою або негативною; проміжні оновлення та зміна персонажа можуть бути пропущені. Пауза належить наприклад.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.MaxWeight();
    await Delay(500);
    var after = UO.MaxWeight();
    var difference = after - before;
    UO.Print("Counter change: " + Convert.ToString(difference));
    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));

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

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

  • CanCarry(extra) отримує додаткову вагу в stones; 10 - приклад, не число стопок. Відкидає негативний extra, відсутність Player або maximum <= 0, читає поточну вагу та межу, потім повертає bool: true або false за extra <= maximum - current. Віднімання уникає переповнення current + extra. При перевантаженні результат false навіть для extra=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()
    {
        if (Truth(Truth(CanCarry(10)) == true))
        {
            UO.Print("Local check passed");
        }
        else
        {
            UO.Print("Local check failed or data unavailable");
        }

        return null;
    }

    dynamic CanCarry(dynamic extra)
    {
        if (Truth(extra < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.Weight();
        var maximum = UO.MaxWeight();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extra <= maximum - current;
    }

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

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

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

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

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

public int MaxWeight() => bridge.MaxWeight;

UO.Mount

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

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

void UO.Mount();
void UO.Mount(object? mount);

Запитує посадку на обрану верхову тварину/предмет.

Параметри

  • mount - Необов'язковий serial мети. Без аргументу береться LastTarget. Це ID, не graphic/type. Живий mobile має бути завантажений і перебувати не далі однієї клітини; предмет повинен перебувати в інвентарі персонажа (наприклад, ethereal mount). Довільний предмет у інвентарі не стає їздовим: вирішує сервер.

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

void — значення, що повертається, немає. Викликайте окремим рядком, не порівнюйте результат з 1/true. Перевіряйте шар 25 після відповіді сервера.

Поведінка

  • Команда надсилає запит використання об'єкта протоколу UO (0x06), без емуляції миші. Вона обходить загальний обробник double-click інтерфейсу: у war mode запит не замінюється атакою.
  • Стан верхової тварини читається із шару 25. Воно змінюється після даних сервера; повернення з команди не підтверджує завершення посадки/спішування.
  • Повторні mount/dismount запити тимчасово поєднуються: до зміни шару, зміни персонажа або закінчення 5 секунд новий запит не надсилається. Це захищає від дублювання між скриптами.
  • За відсутності персонажа, поза грою або для мертвого персонажа, запит не надсилається. Остаточні правила володіння, доступності та посадки визначає сервер.
  • Якщо персонаж уже верхи, мета дорівнює 0/self, знищена, мертва або недоступна за вказаними умовами, запит не надсилається. Предмет землі відкидається.

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

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

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

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

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

UO.Print("Calling UO.Mount");
UO.Mount();

1. Посадка на lasttarget без параметрів - прямий скрипт

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

  • Аргументів немає: використовується LastTarget. Print не підтверджує згоду сервера.
if (Truth(UO.GetSerial("lasttarget") == "0x00000000"))
{
    UO.Print("Mount target not selected");
    return null;
}
UO.Mount();
UO.Print("Mount request processed locally");

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

2. Передайте явний ID та перевірте функцію сценарію рівня

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

  • mount=target, номер 25 відноситься до шару власного персонажа. Якщо вже верхи, новий запит не потрібний.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(target == "0x00000000"))
    {
        return null;
    }

    if (Truth(UO.ObjAtLayer(25) == 0))
    {
        UO.Mount(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. Повна функція з обмеженим очікуванням – клас сценарію

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

  • target - ID цілі. Один запит, потім до 20 очікувань по 50 мс. true/false повертає наш helper, сама UO.Mount повертає Unit.
  • false означає, що шар не з'явився цей термін; запізніла відповідь сервера все ще можлива.
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 mounted = await TryMount("lasttarget");
        UO.Print("Mounted within one second: " + Convert.ToString(mounted));
        return null;
    }

    async Task<dynamic> TryMount(dynamic target)
    {
        if (Truth(UO.ObjAtLayer(25) != 0))
        {
            return true;
        }

        if (Truth(target == "0x00000000"))
        {
            return false;
        }

        UO.Mount(target);
        var attempts = 0;
        while (Truth(attempts < 20))
        {
            if (Truth(UO.ObjAtLayer(25) != 0))
            {
                return true;
            }

            await Delay(50);
            attempts = attempts + 1;
        }

        return false;
    }

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

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

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

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

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

case "mount": bridge.Mount(Arg(0, bridge.LastTarget)); break;

UO.Mount(mount) — UO.Mount(Any)

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

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

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

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

case "mount": bridge.Mount(Arg(0, bridge.LastTarget)); break;

UO.ObjAtLayer

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

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

dynamic UO.ObjAtLayer(object? layer);

Знаходить предмет на вказаному прошарку екіпірування власного персонажа.

Параметри

  • layer — Один обов'язковий аргумент: число шару 1..29 або рядкове ім'я зі списку нижче. Число 0 та ім'я Invalid дають 0. Регістр і пробіли імені ігноруються. Невідоме рядкове ім'я викликає помилку скрипту; Чисельний рядок "1" не замінює число 1.

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

Числова форма повертає int - serial предмета, або 0 для порожнього/неприпустимого шару. Строкова форма повертає string виду "0x40001001", якщо предмет знайдений, інакше int 0. Це ID предмет, а не номер шару, graphic/type або кількість. Метадані object? Рядковий форми відображають два можливі типи результату.

Поведінка

  • Читається локальна модель клієнта; запитів серверу, очікування та переміщення немає.
  • Результат відноситься до моменту читання. Після UO.Wait або іншої дії об'єкт та його прапори можуть змінитися.
  • Перевіряються дані екіпірування self. Команда не відкриває сумку, не надягає предмет та не надсилає запит огляду.
  • Числа поза 1..29 дають 0 без перетворення за модулем 256; наприклад, 257 не може вибрати праву руку.
  • Всі числові шари, що підтримуються, і рядкові імена:
  • 1 OneHanded/Rhand/RightHand; 2 TwoHanded/Lhand/LeftHand; 3 Shoes; 4 Pants; 5 Shirt; 6 Helmet/Hat; 7 Gloves; 8 Ring; 9 Talisman; 10 Necklace/Neck.
  • 11 Hair; 12 Waist; 13 Torso; 14 Bracelet/Brace; 15 Face; 16 Beard; 17 Tunic; 18 Earrings/Ear; 19 Arms; 20 Cloak.
  • 21 Backpack/Bpack/BackpackLayer; 22 Robe; 23 Skirt; 24 Legs; 25 Mount; 26 ShopBuyRestock/Rstk; 27 ShopBuy/NRstk; 28 ShopSell/Sell; 29 Bank.

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

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

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

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

object? item = UO.ObjAtLayer("Rhand");
if (item is string serial) UO.Print("Equipped serial: " + serial);
else UO.Print("The layer is empty");

1. Предмет у правій руці на ім'я шару — прямий скрипт

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

  • Rhand вибирає шар 1. При успіху hand - hex-рядок; за відсутності - число 0.
  • Convert.ToString дозволяє вивести обидва можливі типи. Результат не можна приймати за graphic зброї.
object? hand = UO.ObjAtLayer("Rhand");
if (hand is string serial)
{
    UO.Print("Right hand serial: " + serial);
}
else
{
    UO.Print("Right hand is empty or unavailable");
}

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

2. Числовий шар та властивості предмета – функція сценарію

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

  • Число 2 вибирає TwoHanded. Ця форма завжди повертає int.
  • Exists перевіряє, що предмет доступний для читання його властивостей. GetGraphic повертає окремий type.
return  RunScenario();
 object? RunScenario()
{
    var item = UO.ObjAtLayer(2);
    if (Truth(UO.Exists(item)))
    {
        UO.Print("Two-handed layer serial: " + Convert.ToString(item));
        UO.Print("Graphic: " + UO.GetGraphic(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. Отримати рюкзак та перевірити неприпустимий шар – клас сценарію

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

  • 21 - шар Backpack; результат 0 можливий до завантаження екіпіровки.
  • 257 за межами списку і завжди дає 0. Це не альтернативне позначення шару 1.
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.ObjAtLayer(21);
        var invalid = UO.ObjAtLayer(257);
        UO.Print("Backpack serial: " + Convert.ToString(bag));
        UO.Print("Invalid layer: " + Convert.ToString(invalid));
        return null;
    }
}

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

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

UO.ObjAtLayer(layer) — UO.ObjAtLayer(Any)

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

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

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

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

case "objatlayer":

                    return new InjectionValue(arguments[0].Kind == InjectionValueKind.String

                        ? GetObject(ObjAtLayer(Text(0))) : bridge.ObjAtLayer(Arg(0)));

UO.ObjAtLayer(layer) — UO.ObjAtLayer(String)

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

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

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

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

public InjectionValue ObjAtLayer(string layer)

        {

            var id = bridge.ObjAtLayer(ConvertLayer(layer));

            if (id == 0)

                return InjectionValue.Zero;



            return new InjectionValue("0x" + id.ToString("X8"));

        }

UO.ObjAtLayerEx

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

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

int UO.ObjAtLayerEx(object? layerType, object? playerID);

Читає предмет/контейнер у заданому шарі зазначеного завантаженого персонажа.

Параметри

  • layerType — Числовий номер шару 1..29. Приймається ціле чи числове рядок, наприклад 26 або "0x1A". Рядкові імена Rhand/ShopBuyRestock та bare-константи шарів тут не перетворюються на номери. Використовуйте число.
  • playerID — Serial персонажа/mobile, числом, hex-рядком або об'єктним ім'ям, що дозволяється, наприклад "self"/"lasttarget". Graphic/type предмета або ID самого контейнера не підходять.

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

int: serial предмета/контейнера на шарі або 0 при порожньому/невідомому шарі, неприпустимому номері або відсутності завантаженого Mobile. Це не bool та не номер шару.

Поведінка

  • Читання локальне, без target, покупки, відкриття контейнера та запиту мережі.
  • Перевіряється діапазон 1..29. Конвертація невідповідного рядкового параметра може спричинити помилку; довільне ім'я шару не слід передавати замість числа.
  • Для власного персонажа з рядковим ім'ям шару доступна окрема UO.ObjAtLayer. Не плутайте layer із world Z, індексом статики чи координатою гампа.

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

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

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

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

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

var result = UO.ObjAtLayerEx(26, UO.GetSerial("lasttarget"));
UO.Print("ObjAtLayerEx: " + Convert.ToString(result));

1. Отримати магазинний контейнер та перерахувати товари — прямий скрипт

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

  • LayerType=26; PlayerID=vendor; shop - serial контейнера. Для GetContent передається shop, а не номер шару.
  • Масив індексується з 0 до довжини мінус 1. Кожен елемент – serial. Порожній масив означає відсутність завантажених безпосередніх елементів; покупка не виконується.
var vendor = UO.GetSerial("lasttarget");
if (Truth(vendor == "0x00000000"))
{
    UO.Print("Vendor not selected");
    return null;
}
var shop = UO.ObjAtLayerEx(26, vendor);
if (Truth(shop == 0))
{
    UO.Print("ShopBuyRestock container is not loaded");
    return null;
}
UO.Print("Shop container ID: " + Convert.ToString(shop));
var items = UO.GetContent(shop);
var i = 0;
while (Truth(i < ArrayLength(items)))
{
    var item = items[i];
    UO.Print(UO.GetName(item) + " | ID: " + Convert.ToString(item));
    UO.Print("Graphic: " + Convert.ToString(UO.GetType(item)));
    i = i + 1;
}
UO.Print("Loaded entries: " + Convert.ToString(ArrayLength(items)));

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. Відібрати товари потрібного graphic та порахувати одиниці – функція сценарію

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

  • wantedType - graphic, а item - ID окремого предмета. stacks рахує записи/стопки; units складає кількість у них.
  • Це читання вже одержаної кількості, а не залишок, гарантований майбутньою покупкою. Ціна тут не призначається.
return  RunScenario();
 object? RunScenario()
{
    var vendor = UO.GetSerial("lasttarget");
    if (Truth(vendor == "0x00000000"))
    {
        UO.Print("Vendor not selected");
        return null;
    }

    var shop = UO.ObjAtLayerEx(26, vendor);
    if (Truth(shop == 0))
    {
        UO.Print("Shop layer is not loaded");
        return null;
    }

    var wantedType = 0x1766;
    var stacks = 0;
    var units = 0;
    var items = UO.GetContent(shop);
    var i = 0;
    while (Truth(i < ArrayLength(items)))
    {
        var item = items[i];
        if (Truth(UO.GetType(item) == wantedType))
        {
            stacks = stacks + 1;
            units = units + UO.GetQuantity(item);
        }

        i = i + 1;
    }

    UO.Print("Stacks: " + Convert.ToString(stacks) + " | Units: " + Convert.ToString(units));
    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. Порівняти три магазинні шари через повну процедуру - клас сценарію

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

  • ShowVendorLayer оголошена повністю. vendor - ID, NPC, layerNumber - 26, 27, 28, caption - тільки підпис.
  • Контейнери може бути невідомі клієнту. 0 перевіряється до GetContent: явний GetContent(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 vendor = UO.GetSerial("lasttarget");
        if (Truth(vendor == "0x00000000"))
        {
            UO.Print("Vendor not selected");
            return null;
        }

        ShowVendorLayer(vendor, 26, "ShopBuyRestock / Rstk");
        ShowVendorLayer(vendor, 27, "ShopBuy / NRstk");
        ShowVendorLayer(vendor, 28, "ShopSell / Sell");
        return null;
    }

    void ShowVendorLayer(dynamic vendor, dynamic layerNumber, dynamic caption)
    {
        var container = UO.ObjAtLayerEx(layerNumber, vendor);
        if (Truth(container == 0))
        {
            UO.Print(caption + ": not loaded");
            return;
        }

        var items = UO.GetContent(container);
        UO.Print(caption + " | Container ID: " + Convert.ToString(container));
        UO.Print("Loaded entries: " + Convert.ToString(ArrayLength(items)));
    }

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

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

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

UO.ObjAtLayerEx(layerType, playerID) — UO.ObjAtLayerEx(Any,Any)

Параметри: layerType (Any), playerID (Any)

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

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

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

case "objatlayerex": return new InjectionValue(bridge.ObjAtLayerEx(Arg(0), Arg(1)));

UO.Paralyzed

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

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

int UO.Paralyzed();
int UO.Paralyzed(object? value);

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

Параметри

  • value — Необов'язковий serial/ID mobile: число, hex-рядок, self, lasttarget або інше стандартне ім'я об'єкта або ім'я AddObject. Це не graphic/type. Без аргументу використається self. Невідоме ім'я дозволяється у 0; target не відкривається.

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

Числовий прапор "int": "1" (умова виконано) - завантажений "mobile" має прапор "IsParalyzed"; 0 (умова не виконано) - прапора немає, mobile невідомий, вилучений або об'єкт є предметом. Це не час паралічу і не гарантія можливості руху в результаті 0.

Поведінка

  • Використовуйте Paralyzed для перевірки прапора паралічу. Варіанти Is/Get, GetParalisa, Frozen і GetLocked читають той же прапор.
  • Команда лише читає локальні дані. Вона не накладає і не знімає параліч, не чекає його закінчення і не надсилає запит на оновлення серверу.
  • Результат цієї команди має тип int: використовуйте if (value != 0) або if (value == 0). Пряме порівняння з true/false та if (value) у C# неприпустимі. Значення зберігає сенс прапора, а чи не кількості чи ID.

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

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

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

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

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

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

1. Перевірити себе через true - прямий скрипт

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

  • Порожні дужки вибирають self. state зберігає один знімок прапора; true - числова константа 1.
  • Результат false не виключає стіни, відсутність витривалості або іншу причину зупинки.
var state = UO.Paralyzed();
if (Truth(Truth(state) == true))
{
    UO.Print("Paralysis flag is set");
}
else
{
    UO.Print("Paralysis flag is absent or unavailable");
}

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

2. Перевірити вибраного mobile - функція сценарію

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

  • target зберігає hex-рядок serial останньої мети. IsNpc перевіряє, що це завантажений mobile, включаючи гравців.
  • Команда з аргументом читає саме target. Вона не вибирає нового персонажа і не змінює lasttarget.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.Paralyzed(target);
        UO.Print("Selected mobile paralysis 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. Обмежене очікування для усунення паралічу – клас сценарію

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

  • Не більше 10 пауз по 100 мс. Кожен виклик без аргументу наново читає self.
  • Після циклу окремо перевіряється наявність self. Це спостереження приблизно на секунду плюс виконання команд, а не гарантоване зняття паралічу.
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 attempts = 0;
        while (Truth(Truth(UO.Paralyzed()) == true) && Truth(attempts < 10))
        {
            await Delay(100);
            attempts = attempts + 1;
        }

        if (Truth(UO.IsNPC("self")))
        {
            if (Truth(Truth(UO.Paralyzed()) == false))
            {
                UO.Print("Paralysis flag is clear");
            }
            else
            {
                UO.Print("Still paralyzed");
            }
        }
        else
        {
            UO.Print("Self is unavailable");
        }

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

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

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

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

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

case "paralyzed": return new InjectionValue(bridge.GetLocked(bridge.Self));

UO.Paralyzed(value) — UO.Paralyzed(Any)

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

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

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

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

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

serial => bridge.GetLocked(serial)

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

value => getter(GetObject(value))

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


UO.PhysicalResist

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

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

int UO.PhysicalResist();

Читає поле опору поточного персонажа: фізична броня/опір.

Параметри

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

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

int - знакове значення статусу, -32768..32767 у моделі клієнта. Негативне значення зберігається. 0 буває реальним опором, відсутністю даних чи відсутнім/знищеним Player; GetResist також дає 0 для невідомого селектора Це не bool, ID, навички або межі опору. 1 означає один пункт, а чи не успішне виконання.

Поведінка

  • Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
  • Читання в ігровому потоці бере Player. PhysicalResistance, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
  • PhysicalResistance - серверне поле броні/статусу: класичний сервер може передавати рейтинг броні, а правила з опорами - фізичний опір. API не переводить одне в інше і не обчислює відсоток зниження шкоди. Armor та фізичні псевдоніми читають одне поле.
  • CharacterStatus перевіряє обов'язкове тіло до зміни імені, здоров'я та власних характеристик, потім переводить кожне слово опору у знаковий Int16. Обрізане обов'язкове тіло не змінює попередні дані. Необов'язковий хвіст type 6 зберігає колишні правила; команди опорів не читають із нього максимальні межі.
  • Кожен дзвінок читає локальні дані заново. Змінна зберігає знімок; окремі читання можуть отримати різні оновлення сервера. Ненульовий результат не перевіряє підключення. Нуль може бути значенням чи відсутністю даних.
  • Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди. C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

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

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

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

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

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

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

1. Вивести збережене значення - прямий скрипт

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

  • value зберігає результат одного дзвінка. Convert.ToString форматує число для журналу. Аргументів нема: читається свій персонаж.
var value = UO.PhysicalResist();
UO.Print("PhysicalResistance: " + Convert.ToString(value));

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

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

  • Між before та after стоїть UO.Wait(500) мілісекунд; Відмінність може бути негативною. Проміжні оновлення можуть бути пропущені. Пауза відноситься, наприклад, не до затримки API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.PhysicalResist();
    await Delay(500);
    var after = UO.PhysicalResist();
    var difference = after - before;
    UO.Print("Resistance change: " + Convert.ToString(difference));
    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));

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

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

  • minimum = 50 - приклад вимоги, не межа клієнта. ResistanceAtLeast відкидає відсутній Player, читає одне значення і повертає bool: true або false за умовою value >= minimum. Сам опір не bool. Функцію повністю оголошено нижче.
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(Truth(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic ResistanceAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.PhysicalResist();
        return value >= minimum;
    }

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

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

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

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

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

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

() => bridge.Armor

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


UO.Poison

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

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

void UO.Poison();
void UO.Poison(object? target);

Використовує досвід Poisoning, при необхідності на заданій меті.

Параметри

  • target — Необов'язковий serial/аліас цілі. Без аргументів - тільки UseSkill("Poisoning"). З аргументом - UseSkillAtTarget("Poisoning", target).

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

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

Поведінка

  • Зареєстрована legacy-команда не є getter опору отрути або стану отруєння. Гілка викликає навичку та відкидає її 1/0.
  • У формі з метою UseSkillAtTarget перевіряє позитивний serial, готує ціль до запиту навички; при неприйнятому навичці скасовує target. Отруєння цілі сервером не гарантується.

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

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

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

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

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

UO.Print("Calling UO.Poison");
UO.Poison();

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

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

  • Використовує досвід Poisoning, при необхідності на заданій меті.
UO.Poison();

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

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

  • Зареєстрована legacy-команда не є getter опору отрути або стану отруєння. Гілка викликає навичку та відкидає її 1/0.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("lasttarget")))
    {
        UO.Poison("lasttarget");
    }

    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. Повна допоміжна функція – клас сценарію

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

  • У формі з метою UseSkillAtTarget перевіряє позитивний serial, готує ціль до запиту навички; при неприйнятому навичці скасовує 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 id = UO.GetSerial("lasttarget");
        if (Truth(UO.Exists(id)))
        {
            UO.Poison(id);
            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.Poison() — UO.Poison()

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

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

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

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

case "poison":

                    if (arguments.Length > 0) UseSkillAtTarget(new InjectionValue("Poisoning"), arguments[0]);

                    else UseSkill("Poisoning");

                    break;

UO.Poison(target) — UO.Poison(Any)

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

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

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

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

case "poison":

                    if (arguments.Length > 0) UseSkillAtTarget(new InjectionValue("Poisoning"), arguments[0]);

                    else UseSkill("Poisoning");

                    break;

UO.PoisonResist

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

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

int UO.PoisonResist();

Читає поле опору поточного персонажа: отрута.

Параметри

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

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

int - знакове значення статусу, -32768..32767 у моделі клієнта. Негативне значення зберігається. 0 буває реальним опором, відсутністю даних чи відсутнім/знищеним Player; GetResist також дає 0 для невідомого селектора Це не bool, ID, навички або межі опору. 1 означає один пункт, а чи не успішне виконання.

Поведінка

  • Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
  • Читання в ігровому потоці бере Player. PoisonResistance, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
  • Стихійні поля приходять у розширеному CharacterStatus (0x11), type >= 4. Сама команда не перевіряє епоху сервера. Компактний/старий статус без цих полів залишає попередній кеш; у нового Player вихідно 0. Опір отрути не є прапор Poisoned; це також не навик Resisting Spells.
  • CharacterStatus перевіряє обов'язкове тіло до зміни імені, здоров'я та власних характеристик, потім переводить кожне слово опору у знаковий Int16. Обрізане обов'язкове тіло не змінює попередні дані. Необов'язковий хвіст type 6 зберігає колишні правила; команди опорів не читають із нього максимальні межі.
  • Кожен дзвінок читає локальні дані заново. Змінна зберігає знімок; окремі читання можуть отримати різні оновлення сервера. Ненульовий результат не перевіряє підключення. Нуль може бути значенням чи відсутністю даних.
  • Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди. C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

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

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

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

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

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

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

1. Вивести збережене значення - прямий скрипт

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

  • value зберігає результат одного дзвінка. Convert.ToString форматує число для журналу. Аргументів нема: читається свій персонаж.
var value = UO.PoisonResist();
UO.Print("PoisonResistance: " + Convert.ToString(value));

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

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

  • Між before та after стоїть UO.Wait(500) мілісекунд; Відмінність може бути негативною. Проміжні оновлення можуть бути пропущені. Пауза відноситься, наприклад, не до затримки API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.PoisonResist();
    await Delay(500);
    var after = UO.PoisonResist();
    var difference = after - before;
    UO.Print("Resistance change: " + Convert.ToString(difference));
    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));

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

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

  • minimum = 50 - приклад вимоги, не межа клієнта. ResistanceAtLeast відкидає відсутній Player, читає одне значення і повертає bool: true або false за умовою value >= minimum. Сам опір не bool. Функцію повністю оголошено нижче.
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(Truth(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic ResistanceAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.PoisonResist();
        return value >= minimum;
    }

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

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

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

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

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

case "poisonresist": return new InjectionValue(bridge.PoisonResistance);

UO.Poisoned

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

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

int UO.Poisoned();
int UO.Poisoned(object? id);

Перевіряє отруєння персонажа.

Параметри

  • id — Необов'язковий об'єкт у показаних формах: serial числом/hex-рядком, self, lasttarget або зареєстроване ім'я AddObject. Це не type. Без аргументу читається self. Невідомий текст у деяких формах викликає помилку перетворення; перевіряйте ім'я перед викликом.

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

Числовий прапор int: 1 (умова виконана), 0 (умова не виконано). Це числовий прапор: в C# перевіряйте result != 0 або result == 0. Пряме порівняння int з true/false та if (result) неприпустимо. "1" - "mobile" має "IsPoisoned", "0" - прапора немає або "mobile" немає. Ступінь отрути і час, що залишився, не повертаються.

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

Поведінка

  • Читає локальну модель: не відкриває target, не вимагає status, не змінює прапор і не відправляє пакет. Знищений об'єкт вважається відсутнім ще до видалення запису зі словника.
  • Результат – окреме читання. Світ може змінитися між Exists та наступним викликом; Кілька запитів не утворюють атомарний знімок.
  • Для Poisoned/Flying враховується версія протоколу: до 7.0.0.0 біт 0x04 означає отруту; починаючи з 7.0.0.0 він означає політ, а отрута зберігається окремо. Політ не обчислюється із Z.

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

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

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

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

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

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

1. Перевірити власний стан – прямий скрипт

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

  • Порожні дужки читають self. active зберігає результат один раз; true і false задають дві гілки. Print лише виводить приклад повідомлення.
var active = UO.Poisoned();
if (Truth(Truth(active) == true))
{
    UO.Print("State is active");
}
else
{
    UO.Print("State is inactive or unavailable");
}

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

2. Вибраний об'єкт та повна функція ReadState — функція сценарію

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

  • lasttarget — вибраний раніше об'єкт. Exists перевіряє його наявність. obj - єдиний параметр ReadState; функція повертає результат команди без зміни. Її визначення входить у код, що копіюється.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("lasttarget")))
    {
        var observed = ReadState("lasttarget");
        UO.Print("State 1/0: " + Convert.ToString(observed));
    }

    return null;
}

dynamic ReadState(dynamic obj)
{
    return UO.Poisoned(obj);
}

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

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

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

  • Два виклики без аргументів читають self, UO.Wait(500) задає 500 мілісекунд. Порівнюються два знімки; проміжні переходи можуть бути пропущені. Нескінченного очікування немає.
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 before = UO.Poisoned();
        await Delay(500);
        var after = UO.Poisoned();
        if (Truth(before != after))
        {
            UO.Print("State changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
        }

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

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

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

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

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

public int Poisoned() => bridge.Poisoned(bridge.Self);

UO.Poisoned(id) — UO.Poisoned(Any)

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

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

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

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

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

UO.Race

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

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

dynamic UO.Race();

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

Параметри

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

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

int — 1=human, 2=elf, 3=gargoyle за моделлю клієнта. 0 означає відсутність завантаженого персонажа. Це не body/graphic та не serial.

Поведінка

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

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

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

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

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

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

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

1. Вивести поточне значення свого персонажа - прямий скрипт

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

  • Виклик без аргументів відноситься до self. Раса персонажа зберігається у значенні.
  • Convert.ToString перетворює число для виведення і не змінює значення результату.
var value = UO.Race();
UO.Print("Race: " + Convert.ToString(value));

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

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

  • Значення читається одного разу без аргументів. Расу персонажа використовують у показаному розрахунку чи умови.
  • Числові пороги — приклад умов скрипту, а чи не нові межі клієнта. Поле зберігає серверні одиниці та обмеження, описані вище.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.Race();
    if (Truth(value == 3))
    {
        UO.Print("Player race is gargoyle");
    }

    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(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 before = UO.Race();
        await Delay(1000);
        var after = UO.Race();
        if (Truth(before != after))
        {
            UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        }

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

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

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

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

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

case "race": return new InjectionValue(bridge.Race);

UO.RemoveEarrings

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

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

void UO.RemoveEarrings();

Вимагає зняття предмета із шару Ear.

Параметри

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

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

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

Поведінка

  • ExecuteLegacyManualAlias викликає Unequip("Ear"). ConvertLayer вибирає числовий шар, bridge.Unequip запитує перенесення в рюкзак.
  • Результат внутрішнього Unequip (1/0) у legacy-команди відкидається; викликайте окремим рядком. За відсутності речі/рюкзака запит може виконуватися. Перевірка ObjAtLayer після дзвінка читає лише локальний стан.

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

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

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

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

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

UO.Print("Calling UO.RemoveEarrings");
UO.RemoveEarrings();

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

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

  • Вимагає зняття предмета із шару Ear.
UO.RemoveEarrings();

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

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

  • ExecuteLegacyManualAlias викликає Unequip("Ear"). ConvertLayer вибирає числовий шар, bridge.Unequip запитує перенесення в рюкзак.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.ObjAtLayer("Ear"));
    UO.RemoveEarrings();
    return null;
}

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

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

  • Результат внутрішнього Unequip (1/0) у legacy-команди відкидається; викликайте окремим рядком. За відсутності речі/рюкзака запит може виконуватися. Перевірка ObjAtLayer після дзвінка читає лише локальний стан.
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.RemoveEarrings();
        UO.Wait(500);
        UO.Print(UO.ObjAtLayer("Ear"));
        return null;
    }
}

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

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

UO.RemoveEarrings() — UO.RemoveEarrings()

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

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

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

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

case "removeearrings": Unequip("Ear"); break;

UO.RemoveHat

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

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

void UO.RemoveHat();

Запитує зняття предмета із шару Hat.

Параметри

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

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

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

Поведінка

  • ExecuteLegacyManualAlias викликає Unequip("Hat"). ConvertLayer вибирає числовий шар, bridge.Unequip запитує перенесення в рюкзак.
  • Результат внутрішнього Unequip (1/0) у legacy-команди відкидається; викликайте окремим рядком. За відсутності речі/рюкзака запит може виконуватися. Перевірка ObjAtLayer після дзвінка читає лише локальний стан.

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

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

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

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

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

UO.Print("Calling UO.RemoveHat");
UO.RemoveHat();

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

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

  • Запитує зняття предмета із шару Hat.
UO.RemoveHat();

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

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

  • ExecuteLegacyManualAlias викликає Unequip("Hat"). ConvertLayer вибирає числовий шар, bridge.Unequip запитує перенесення в рюкзак.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.ObjAtLayer("Hat"));
    UO.RemoveHat();
    return null;
}

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

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

  • Результат внутрішнього Unequip (1/0) у legacy-команди відкидається; викликайте окремим рядком. За відсутності речі/рюкзака запит може виконуватися. Перевірка ObjAtLayer після дзвінка читає лише локальний стан.
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.RemoveHat();
        UO.Wait(500);
        UO.Print(UO.ObjAtLayer("Hat"));
        return null;
    }
}

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

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

UO.RemoveHat() — UO.RemoveHat()

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

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

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

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

case "removehat": Unequip("Hat"); break;

UO.RemoveNeckless

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

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

void UO.RemoveNeckless();

Вимагає зняття предмета з шару Neck.

Параметри

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

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

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

Поведінка

  • ExecuteLegacyManualAlias викликає Unequip("Neck"). ConvertLayer вибирає числовий шар, bridge.Unequip запитує перенесення в рюкзак.
  • Результат внутрішнього Unequip (1/0) у legacy-команди відкидається; викликайте окремим рядком. За відсутності речі/рюкзака запит може виконуватися. Перевірка ObjAtLayer після дзвінка читає лише локальний стан.

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

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

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

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

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

UO.Print("Calling UO.RemoveNeckless");
UO.RemoveNeckless();

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

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

  • Вимагає зняття предмета з шару Neck.
UO.RemoveNeckless();

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

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

  • ExecuteLegacyManualAlias викликає Unequip("Neck"). ConvertLayer вибирає числовий шар, bridge.Unequip запитує перенесення в рюкзак.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.ObjAtLayer("Neck"));
    UO.RemoveNeckless();
    return null;
}

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

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

  • Результат внутрішнього Unequip (1/0) у legacy-команди відкидається; викликайте окремим рядком. За відсутності речі/рюкзака запит може виконуватися. Перевірка ObjAtLayer після дзвінка читає лише локальний стан.
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.RemoveNeckless();
        UO.Wait(500);
        UO.Print(UO.ObjAtLayer("Neck"));
        return null;
    }
}

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

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

UO.RemoveNeckless() — UO.RemoveNeckless()

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

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

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

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

case "removeneckless": Unequip("Neck"); break;

UO.RemoveRing

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

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

void UO.RemoveRing();

Запитує зняття предмета із шару Ring.

Параметри

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

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

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

Поведінка

  • ExecuteLegacyManualAlias викликає Unequip("Ring"). ConvertLayer вибирає числовий шар, bridge.Unequip запитує перенесення в рюкзак.
  • Результат внутрішнього Unequip (1/0) у legacy-команди відкидається; викликайте окремим рядком. За відсутності речі/рюкзака запит може виконуватися. Перевірка ObjAtLayer після дзвінка читає лише локальний стан.

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

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

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

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

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

UO.Print("Calling UO.RemoveRing");
UO.RemoveRing();

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

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

  • Запитує зняття предмета із шару Ring.
UO.RemoveRing();

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

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

  • ExecuteLegacyManualAlias викликає Unequip("Ring"). ConvertLayer вибирає числовий шар, bridge.Unequip запитує перенесення в рюкзак.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.ObjAtLayer("Ring"));
    UO.RemoveRing();
    return null;
}

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

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

  • Результат внутрішнього Unequip (1/0) у legacy-команди відкидається; викликайте окремим рядком. За відсутності речі/рюкзака запит може виконуватися. Перевірка ObjAtLayer після дзвінка читає лише локальний стан.
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.RemoveRing();
        UO.Wait(500);
        UO.Print(UO.ObjAtLayer("Ring"));
        return null;
    }
}

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

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

UO.RemoveRing() — UO.RemoveRing()

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

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

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

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

case "removering": Unequip("Ring"); break;

UO.RequestStats

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

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

void UO.RequestStats(object? objID);

Запитує status персонажа по serial.

Параметри

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

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

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

Поведінка

  • RequestStats викликає RequestMobileStatus(_world, serial, true). Виклик не повертає масив характеристик та не чекає відповіді; GetHP/GetStr після нього читають локальну модель.
  • Bridge надсилає запит на ігровому потоці. Діють правила сервера; вбудованого очікування підтвердження немає.

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

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

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

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

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

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

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

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

  • Запитує status персонажа по serial.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
    UO.RequestStats(id);
}

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

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

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

  • RequestStats викликає RequestMobileStatus(_world, serial, true). Виклик не повертає масив характеристик та не чекає відповіді; GetHP/GetStr після нього читають локальну модель.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("self");
    if (Truth(UO.Exists(id)))
    {
        UO.RequestStats(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.RequestStats(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.RequestStats(objID) — UO.RequestStats(Any)

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

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

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

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

case "requeststats": bridge.RequestStats(Arg(0)); return InjectionValue.Unit;

UO.ResistCold

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

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

int UO.ResistCold();

Читає поле опору поточного персонажа: мороз.

Параметри

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

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

int - знакове значення статусу, -32768..32767 у моделі клієнта. Негативне значення зберігається. 0 буває реальним опором, відсутністю даних чи відсутнім/знищеним Player; GetResist також дає 0 для невідомого селектора Це не bool, ID, навички або межі опору. 1 означає один пункт, а чи не успішне виконання.

Поведінка

  • Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
  • Читання в ігровому потоці бере Player. ColdResistance, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
  • Стихійні поля приходять у розширеному CharacterStatus (0x11), type >= 4. Сама команда не перевіряє епоху сервера. Компактний/старий статус без цих полів залишає попередній кеш; у нового Player вихідно 0. Опір отрути не є прапор Poisoned; це також не навик Resisting Spells.
  • CharacterStatus перевіряє обов'язкове тіло до зміни імені, здоров'я та власних характеристик, потім переводить кожне слово опору у знаковий Int16. Обрізане обов'язкове тіло не змінює попередні дані. Необов'язковий хвіст type 6 зберігає колишні правила; команди опорів не читають із нього максимальні межі.
  • Кожен дзвінок читає локальні дані заново. Змінна зберігає знімок; окремі читання можуть отримати різні оновлення сервера. Ненульовий результат не перевіряє підключення. Нуль може бути значенням чи відсутністю даних.
  • Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди. C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

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

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

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

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

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

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

1. Вивести збережене значення - прямий скрипт

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

  • value зберігає результат одного дзвінка. Convert.ToString форматує число для журналу. Аргументів нема: читається свій персонаж.
var value = UO.ResistCold();
UO.Print("ColdResistance: " + Convert.ToString(value));

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

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

  • Між before та after стоїть UO.Wait(500) мілісекунд; Відмінність може бути негативною. Проміжні оновлення можуть бути пропущені. Пауза відноситься, наприклад, не до затримки API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.ResistCold();
    await Delay(500);
    var after = UO.ResistCold();
    var difference = after - before;
    UO.Print("Resistance change: " + Convert.ToString(difference));
    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));

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

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

  • minimum = 50 - приклад вимоги, не межа клієнта. ResistanceAtLeast відкидає відсутній Player, читає одне значення і повертає bool: true або false за умовою value >= minimum. Сам опір не bool. Функцію повністю оголошено нижче.
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(Truth(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic ResistanceAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.ResistCold();
        return value >= minimum;
    }

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

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

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

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

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

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

() => bridge.ColdResistance

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


UO.ResistEnergy

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

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

int UO.ResistEnergy();

Читає поле опору нинішнього персонажа: енергія.

Параметри

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

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

int - знакове значення статусу, -32768..32767 у моделі клієнта. Негативне значення зберігається. 0 буває реальним опором, відсутністю даних чи відсутнім/знищеним Player; GetResist також дає 0 для невідомого селектора Це не bool, ID, навички або межі опору. 1 означає один пункт, а чи не успішне виконання.

Поведінка

  • Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
  • Читання в ігровому потоці бере Player. EnergyResistance, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
  • Стихійні поля приходять у розширеному CharacterStatus (0x11), type >= 4. Сама команда не перевіряє епоху сервера. Компактний/старий статус без цих полів залишає попередній кеш; у нового Player вихідно 0. Опір отрути не є прапор Poisoned; це також не навик Resisting Spells.
  • CharacterStatus перевіряє обов'язкове тіло до зміни імені, здоров'я та власних характеристик, потім переводить кожне слово опору у знаковий Int16. Обрізане обов'язкове тіло не змінює попередні дані. Необов'язковий хвіст type 6 зберігає колишні правила; команди опорів не читають із нього максимальні межі.
  • Кожен дзвінок читає локальні дані заново. Змінна зберігає знімок; окремі читання можуть отримати різні оновлення сервера. Ненульовий результат не перевіряє підключення. Нуль може бути значенням чи відсутністю даних.
  • Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди. C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

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

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

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

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

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

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

1. Вивести збережене значення - прямий скрипт

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

  • value зберігає результат одного дзвінка. Convert.ToString форматує число для журналу. Аргументів нема: читається свій персонаж.
var value = UO.ResistEnergy();
UO.Print("EnergyResistance: " + Convert.ToString(value));

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

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

  • Між before та after стоїть UO.Wait(500) мілісекунд; Відмінність може бути негативною. Проміжні оновлення можуть бути пропущені. Пауза відноситься, наприклад, не до затримки API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.ResistEnergy();
    await Delay(500);
    var after = UO.ResistEnergy();
    var difference = after - before;
    UO.Print("Resistance change: " + Convert.ToString(difference));
    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));

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

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

  • minimum = 50 - приклад вимоги, не межа клієнта. ResistanceAtLeast відкидає відсутній Player, читає одне значення і повертає bool: true або false за умовою value >= minimum. Сам опір не bool. Функцію повністю оголошено нижче.
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(Truth(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic ResistanceAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.ResistEnergy();
        return value >= minimum;
    }

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

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

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

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

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

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

() => bridge.EnergyResistance

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


UO.ResistFire

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

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

int UO.ResistFire();

Читає поле опору нинішнього персонажа: вогонь.

Параметри

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

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

int - знакове значення статусу, -32768..32767 у моделі клієнта. Негативне значення зберігається. 0 буває реальним опором, відсутністю даних чи відсутнім/знищеним Player; GetResist також дає 0 для невідомого селектора Це не bool, ID, навички або межі опору. 1 означає один пункт, а чи не успішне виконання.

Поведінка

  • Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
  • Читання в ігровому потоці бере Player. FireResistance, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
  • Стихійні поля приходять у розширеному CharacterStatus (0x11), type >= 4. Сама команда не перевіряє епоху сервера. Компактний/старий статус без цих полів залишає попередній кеш; у нового Player вихідно 0. Опір отрути не є прапор Poisoned; це також не навик Resisting Spells.
  • CharacterStatus перевіряє обов'язкове тіло до зміни імені, здоров'я та власних характеристик, потім переводить кожне слово опору у знаковий Int16. Обрізане обов'язкове тіло не змінює попередні дані. Необов'язковий хвіст type 6 зберігає колишні правила; команди опорів не читають із нього максимальні межі.
  • Кожен дзвінок читає локальні дані заново. Змінна зберігає знімок; окремі читання можуть отримати різні оновлення сервера. Ненульовий результат не перевіряє підключення. Нуль може бути значенням чи відсутністю даних.
  • Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди. C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

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

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

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

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

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

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

1. Вивести збережене значення - прямий скрипт

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

  • value зберігає результат одного дзвінка. Convert.ToString форматує число для журналу. Аргументів нема: читається свій персонаж.
var value = UO.ResistFire();
UO.Print("FireResistance: " + Convert.ToString(value));

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

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

  • Між before та after стоїть UO.Wait(500) мілісекунд; Відмінність може бути негативною. Проміжні оновлення можуть бути пропущені. Пауза відноситься, наприклад, не до затримки API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.ResistFire();
    await Delay(500);
    var after = UO.ResistFire();
    var difference = after - before;
    UO.Print("Resistance change: " + Convert.ToString(difference));
    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));

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

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

  • minimum = 50 - приклад вимоги, не межа клієнта. ResistanceAtLeast відкидає відсутній Player, читає одне значення і повертає bool: true або false за умовою value >= minimum. Сам опір не bool. Функцію повністю оголошено нижче.
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(Truth(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic ResistanceAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.ResistFire();
        return value >= minimum;
    }

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

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

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

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

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

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

() => bridge.FireResistance

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


UO.ResistPhysical

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

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

int UO.ResistPhysical();

Читає поле опору поточного персонажа: фізична броня/опір.

Параметри

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

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

int - знакове значення статусу, -32768..32767 у моделі клієнта. Негативне значення зберігається. 0 буває реальним опором, відсутністю даних чи відсутнім/знищеним Player; GetResist також дає 0 для невідомого селектора Це не bool, ID, навички або межі опору. 1 означає один пункт, а чи не успішне виконання.

Поведінка

  • Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
  • Читання в ігровому потоці бере Player. PhysicalResistance, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
  • PhysicalResistance - серверне поле броні/статусу: класичний сервер може передавати рейтинг броні, а правила з опорами - фізичний опір. API не переводить одне в інше і не обчислює відсоток зниження шкоди. Armor та фізичні псевдоніми читають одне поле.
  • CharacterStatus перевіряє обов'язкове тіло до зміни імені, здоров'я та власних характеристик, потім переводить кожне слово опору у знаковий Int16. Обрізане обов'язкове тіло не змінює попередні дані. Необов'язковий хвіст type 6 зберігає колишні правила; команди опорів не читають із нього максимальні межі.
  • Кожен дзвінок читає локальні дані заново. Змінна зберігає знімок; окремі читання можуть отримати різні оновлення сервера. Ненульовий результат не перевіряє підключення. Нуль може бути значенням чи відсутністю даних.
  • Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди. C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

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

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

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

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

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

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

1. Вивести збережене значення - прямий скрипт

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

  • value зберігає результат одного дзвінка. Convert.ToString форматує число для журналу. Аргументів нема: читається свій персонаж.
var value = UO.ResistPhysical();
UO.Print("PhysicalResistance: " + Convert.ToString(value));

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

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

  • Між before та after стоїть UO.Wait(500) мілісекунд; Відмінність може бути негативною. Проміжні оновлення можуть бути пропущені. Пауза відноситься, наприклад, не до затримки API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.ResistPhysical();
    await Delay(500);
    var after = UO.ResistPhysical();
    var difference = after - before;
    UO.Print("Resistance change: " + Convert.ToString(difference));
    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));

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

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

  • minimum = 50 - приклад вимоги, не межа клієнта. ResistanceAtLeast відкидає відсутній Player, читає одне значення і повертає bool: true або false за умовою value >= minimum. Сам опір не bool. Функцію повністю оголошено нижче.
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(Truth(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic ResistanceAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.ResistPhysical();
        return value >= minimum;
    }

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

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

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

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

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

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

() => bridge.Armor

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


UO.ResistPoison

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

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

int UO.ResistPoison();

Читає поле опору поточного персонажа: отрута.

Параметри

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

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

int - знакове значення статусу, -32768..32767 у моделі клієнта. Негативне значення зберігається. 0 буває реальним опором, відсутністю даних чи відсутнім/знищеним Player; GetResist також дає 0 для невідомого селектора Це не bool, ID, навички або межі опору. 1 означає один пункт, а чи не успішне виконання.

Поведінка

  • Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
  • Читання в ігровому потоці бере Player. PoisonResistance, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
  • Стихійні поля приходять у розширеному CharacterStatus (0x11), type >= 4. Сама команда не перевіряє епоху сервера. Компактний/старий статус без цих полів залишає попередній кеш; у нового Player вихідно 0. Опір отрути не є прапор Poisoned; це також не навик Resisting Spells.
  • CharacterStatus перевіряє обов'язкове тіло до зміни імені, здоров'я та власних характеристик, потім переводить кожне слово опору у знаковий Int16. Обрізане обов'язкове тіло не змінює попередні дані. Необов'язковий хвіст type 6 зберігає колишні правила; команди опорів не читають із нього максимальні межі.
  • Кожен дзвінок читає локальні дані заново. Змінна зберігає знімок; окремі читання можуть отримати різні оновлення сервера. Ненульовий результат не перевіряє підключення. Нуль може бути значенням чи відсутністю даних.
  • Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди. C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

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

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

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

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

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

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

1. Вивести збережене значення - прямий скрипт

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

  • value зберігає результат одного дзвінка. Convert.ToString форматує число для журналу. Аргументів нема: читається свій персонаж.
var value = UO.ResistPoison();
UO.Print("PoisonResistance: " + Convert.ToString(value));

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

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

  • Між before та after стоїть UO.Wait(500) мілісекунд; Відмінність може бути негативною. Проміжні оновлення можуть бути пропущені. Пауза відноситься, наприклад, не до затримки API.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.ResistPoison();
    await Delay(500);
    var after = UO.ResistPoison();
    var difference = after - before;
    UO.Print("Resistance change: " + Convert.ToString(difference));
    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));

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

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

  • minimum = 50 - приклад вимоги, не межа клієнта. ResistanceAtLeast відкидає відсутній Player, читає одне значення і повертає bool: true або false за умовою value >= minimum. Сам опір не bool. Функцію повністю оголошено нижче.
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(Truth(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic ResistanceAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.ResistPoison();
        return value >= minimum;
    }

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

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

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

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

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

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

() => bridge.PoisonResistance

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


UO.Self

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

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

int UO.Self();

Повертає ID поточного персонажа.

Параметри

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

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

int — serial/ID, не graphic/type, шар, кількість предметів або bool. 0 — поточного об'єкта немає. Зберігаються всі 32 біта serial; перевіряйте != 0, не == true або > 0. Збережений результат сам не оновлюється. Читає World.Player.Serial; відсутній або знищений Player дає 0. Смерть відрізняється від видалення: присутній привид зберігає ID персонажа.

Поведінка

  • Параметрів немає. Читає локальні дані через Invoke на ігровому потоці; скасування скрипта перериває очікування цього потоку. Не надсилає пакет, не відкриває контейнер/target і не переносить предмет.
  • Вбудований self/backpack без дужок читається заново, якщо його не перекрила змінна скрипта. Строкові імена обробляє команда, що приймає. У призначенні перенесення "self" означає рюкзак, а UO.Self() повертає serial персонажа. Для ID контейнера явно використовуйте UO.Backpack().
  • World.Clear видаляє Player; наступні читання дають 0. Вхід у світ або заміна сумки можуть змінити ID. Окремі читання не є атомарними. Ненульова ID не доводить підключення, дозвіл сервера або завантаження вмісту.

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

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

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

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

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

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

1. Прочитати та вивести ID — прямий скрипт

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

  • id зберігає результат одного дзвінка; HEX форматує serial для журналу. Приклад нічого не вибирає та не використовує.
var id = UO.Self();
UO.Print("ID: " + Hex(id));

string Hex(object? value) => Convert.ToInt64(value).ToString("X");

2. Виявити зміну ID — функція сценарію

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

  • before/after читаються з інтервалом 250 мс. UO.Wait доданий лише у приклад. Рівність означає однакові кінцеві ID; проміжні зміни можуть бути пропущені.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.Self();
    await Delay(250);
    var after = UO.Self();
    if (Truth(before != after))
    {
        UO.Print("ID changed: " + Hex(after));
    }

    return null;
}

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

3. Повна функція IsOwnSerial - клас сценарію

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

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

     public object? RunScenario()
    {
        var candidate = UO.LastTarget();
        if (Truth(Truth(IsOwnSerial(candidate)) == true))
        {
            UO.Print("Own object selected");
        }
        else
        {
            UO.Print("Different object or no own object");
        }

        return null;
    }

    dynamic IsOwnSerial(dynamic candidate)
    {
        var current = UO.Self();
        return Truth(current != 0) && Truth(current == candidate);
    }

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

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

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

UO.Self() — UO.Self()

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

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

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

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

case "self": return new InjectionValue(bridge.Self);

UO.SetARExtParams

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

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

void UO.SetARExtParams();
void UO.SetARExtParams(object? shardName);
void UO.SetARExtParams(object? shardName, object? charName);
void UO.SetARExtParams(object? shardName, object? charName, object? useAtEveryConnect);

Задає сервер зі списку шардів та персонажа для наступного входу. Корисно, коли скрипт повинен перепідключити певним персонажем того ж облікового запису.

Параметри

  • shardName — Необов'язкове ім'я сервера зі списку входу, не IP і не порт. Порожнє або пропущене значення набирає поточний ShardName. Прогалини з обох боків видаляються.
  • charName — Необов'язкове ім'я існуючого персонажа облікового запису. Порожнє або пропущене значення бере ім'я self, якщо воно відоме. Це ім'я, не номер слота та не serial; Непусте ім'я має пріоритет над слотом профілю.
  • useAtEveryConnect — Необов'язковий прапор: false/0 за умовчанням — одноразовий вибір; true/1 або інше ненульове ціле — зберігати вибір для подальших входів у цьому сеансі.

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

void - значення немає. Це налаштування наступного входу, а чи не підтвердження підключення чи існування персонажа.

Поведінка

  • У менеджері одноразові імена зберігаються через невдалі мережеві спроби і витрачаються лише після входження у світ. Наступне підключення повертається до параметрів профілю. Постійний вибір діє до нового настроювання або завершення власника сеансу; файл профілю менеджера не переписується. Нове налаштування під час входу відноситься до наступного входу і не втрачається при завершенні поточного.
  • В окремому графічному клієнті сервер зберігається як LastServerName, персонаж - через LastCharacterManager. Після успішного входу персонаж також стає останнім використаним: одноразовість не означає автоматичного повернення до колишнього персонажа. Постійний override живе у поточному процесі.
  • Сама команда не включає автореконнект і не розриває зв'язок. Для цього окремо використовують SetARStatus, Connect та Disconnect. Імена повинні бути присутніми у списках сервера, порівняння не враховує регістр. Якщо в менеджері вимкнено автоматичний вхід персонажем, залишається ручний вибір. Офлайн ім'я self може бути невідомим: вказуйте імена явно. Команда не змінює обліковий запис, пароль, IP, порт та Encryption; пусті значення без доступного поточного імені не очищають заданий вибір.

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

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

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

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

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

UO.Print("Calling UO.SetARExtParams");
UO.SetARExtParams("", "", true);

1. SetARExtParams - 1 - прямий скрипт

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

  • Перший приклад працює лише онлайн. Два порожні рядки беруть поточні імена; true зберігає їх для повторних входів, SetARStatus(true) включає політику автореконнекту. Негайного перепідключення немає.
if (!(Truth(UO.Connected())))
{
    return null;
}
UO.SetARExtParams("", "", true);
UO.SetARStatus(true);

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

2. SetARExtParams — 2 — функція сценарію

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

  • Другий приклад вибирає Example Character тільки якщо це ім'я є реальним GetCharsListForShard. Масив індексується з 0; ToLowerInvariant порівнює імена без урахування регістру. false означає один успішний вхід, після налаштування включається автореконнект і викликається Disconnect. Замініть своє ім'я на своє. За відсутності імені зв'язок зберігається. Автопауза може затримати відновлення до відновлення зв'язку.
return  RunScenario();
 object? RunScenario()
{
    if (!(Truth(UO.Connected())))
    {
        return null;
    }

    var wanted = "Example Character";
    var names = UO.GetCharsListForShard();
    var i = 0;
    while (Truth(i < ArrayLength(names)))
    {
        if (Truth(Convert.ToString(names[i]) == Convert.ToString(wanted)))
        {
            UO.SetARExtParams("", names[i], false);
            UO.SetARStatus(true);
            UO.Disconnect();
            return null;
        }

        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. SetARExtParams - 3 - клас сценарію

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

  • Третій приклад запускають із працюючого офлайн-скрипту. Явно задані Example Shard та Example Character; замініть їх на реальні імена. true зберігає вибір, false у SetARStatus відключає автоматичні повтори, Connect запитує один вхід. Потрібні збережені реквізити облікового запису. Connect не чекає на готовність світу; автоматично зупинений скрипт не дійде до цих рядків без відновлення.
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.Connected()))
        {
            return null;
        }

        UO.SetARExtParams("Example Shard", "Example Character", true);
        UO.SetARStatus(false);
        UO.Connect();
        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.SetARExtParams() — UO.SetARExtParams()

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

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

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

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

case "setarextparams":

                {

                    string requestedShard = arguments.Length > 0 ? Text(0) : string.Empty;

                    string requestedCharacter = arguments.Length > 1 ? Text(1) : string.Empty;

                    state.AutoReconnectShard = string.IsNullOrWhiteSpace(requestedShard)

                        ? bridge.ShardName

                        : requestedShard;

                    state.AutoReconnectCharacter = string.IsNullOrWhiteSpace(requestedCharacter)

                        ? bridge.GetName(bridge.Self) ?? string.Empty

                        : requestedCharacter;

                    int useAtEveryConnect = arguments.Length > 2 ? Arg(2) : 0;

                    bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect);

                    return InjectionValue.Unit;

                }

UO.SetARExtParams(shardName) — UO.SetARExtParams(Any)

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

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

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

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

case "setarextparams":

                {

                    string requestedShard = arguments.Length > 0 ? Text(0) : string.Empty;

                    string requestedCharacter = arguments.Length > 1 ? Text(1) : string.Empty;

                    state.AutoReconnectShard = string.IsNullOrWhiteSpace(requestedShard)

                        ? bridge.ShardName

                        : requestedShard;

                    state.AutoReconnectCharacter = string.IsNullOrWhiteSpace(requestedCharacter)

                        ? bridge.GetName(bridge.Self) ?? string.Empty

                        : requestedCharacter;

                    int useAtEveryConnect = arguments.Length > 2 ? Arg(2) : 0;

                    bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect);

                    return InjectionValue.Unit;

                }

UO.SetARExtParams(shardName, charName) — UO.SetARExtParams(Any,Any)

Параметри: shardName (Any), charName (Any)

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

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

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

case "setarextparams":

                {

                    string requestedShard = arguments.Length > 0 ? Text(0) : string.Empty;

                    string requestedCharacter = arguments.Length > 1 ? Text(1) : string.Empty;

                    state.AutoReconnectShard = string.IsNullOrWhiteSpace(requestedShard)

                        ? bridge.ShardName

                        : requestedShard;

                    state.AutoReconnectCharacter = string.IsNullOrWhiteSpace(requestedCharacter)

                        ? bridge.GetName(bridge.Self) ?? string.Empty

                        : requestedCharacter;

                    int useAtEveryConnect = arguments.Length > 2 ? Arg(2) : 0;

                    bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect);

                    return InjectionValue.Unit;

                }

UO.SetARExtParams(shardName, charName, useAtEveryConnect) — UO.SetARExtParams(Any,Any,Any)

Параметри: shardName (Any), charName (Any), useAtEveryConnect (Any)

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

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

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

case "setarextparams":

                {

                    string requestedShard = arguments.Length > 0 ? Text(0) : string.Empty;

                    string requestedCharacter = arguments.Length > 1 ? Text(1) : string.Empty;

                    state.AutoReconnectShard = string.IsNullOrWhiteSpace(requestedShard)

                        ? bridge.ShardName

                        : requestedShard;

                    state.AutoReconnectCharacter = string.IsNullOrWhiteSpace(requestedCharacter)

                        ? bridge.GetName(bridge.Self) ?? string.Empty

                        : requestedCharacter;

                    int useAtEveryConnect = arguments.Length > 2 ? Arg(2) : 0;

                    bridge.SetReconnectSelection(state.AutoReconnectShard, state.AutoReconnectCharacter, useAtEveryConnect);

                    return InjectionValue.Unit;

                }

UO.SetARStatus

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

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

void UO.SetARStatus(object? value);

Вмикає або вимикає автоматичне перепідключення.

Параметри

  • value — 0 вимикає; будь-яке ненульове ціле включає.

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

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

Поведінка

  • Bridge.SetAutoReconnect змінює налаштування автоматичного перепідключення. Значення сприймається як enabled != 0; негайний вхід/вихід серверу не виконується.
  • Змінює налаштування клієнта. Значення не є результатом перевірки з'єднання та не підтверджує обробку сервером.

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

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

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

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

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

UO.Print("Calling UO.SetARStatus");
UO.SetARStatus(1);

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

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

  • Вмикає або вимикає автоматичне перепідключення.
UO.SetARStatus(1);

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

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

  • Bridge.SetAutoReconnect змінює налаштування автоматичного перепідключення. Значення сприймається як enabled != 0; негайний вхід/вихід серверу не виконується.
return  RunScenario();
 object? RunScenario()
{
    UO.SetARStatus(0);
    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()
    {
        ApplyMode(1);
        return null;
    }

    void ApplyMode(dynamic mode)
    {
        UO.SetARStatus(mode);
    }
}

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

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

UO.SetARStatus(value) — UO.SetARStatus(Any)

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

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

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

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

case "setarstatus": bridge.SetAutoReconnect(Arg(0)); return InjectionValue.Unit;

UO.SetArm

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

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

void UO.SetArm(object? name);

Запам'ятовує поточну зброю та щит у іменованому наборі.

Параметри

  • name - Строкове ім'я набору, наприклад "travel" або "battle". Імена нечутливі до регістру. Набори одягу та зброї зберігаються окремо: однакове ім'я допустиме в обох. Це не ID речі та не ім'я файлу. Тільки SetDress допускає відсутність імені: тоді записується окремий набір для DressSavedSet/EquipDressSet.

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

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

Поведінка

  • Одяг: шари 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. Зброя: тільки 1 та 2. Волосся, борода, рюкзак, тварина та банк у ці набори не входять.
  • Записуються конкретні serial вже завантажених речей у своїх шарах. Повторне збереження того самого імені замінює запис. Порожні шари теж мають сенс: при відновленні відповідний шар буде звільнений у власний рюкзак. Тому збережений повністю порожній набір знімає речі своїх прошарків.
  • Набір зберігається в стані runtime. Сам виклик не створює файл і не гарантує перенесення набору в інший профіль або новий timer. Спочатку збережіть потрібний набір у стані. Завантаження/збереження загального стану клієнта – окремий механізм.
  • UO.SetDress · UO.Dress · UO.DressSavedSet · UO.SetArm · UO.Arm · UO.DressSpeed
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

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

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

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

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

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

UO.Print("Calling UO.SetArm");
UO.SetArm("battle");

1. Пряме використання – прямий скрипт

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

  • Знімок робиться зараз, коли потрібні речі вже одягнені. Виклик не надягає предметів з рюкзака.
UO.SetArm("battle");

2. Імена та режим запиту – функція сценарію

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

  • Однакове ім'я використовується у різних сховищах. SetDress() також окремо зберігає безіменний набір; це не вибір раніше записаного імені.
return  RunScenario();
 object? RunScenario()
{
    UO.SetArm("battle");
    UO.SetDress("battle");
    return null;
}

3. Повний допоміжний сценарій - клас сценарію

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

  • SaveIfReady перевіряє контрольний шар: 3 — взуття для одягу, 1 — права рука для зброї. Якщо вона порожня, знімок не перезаписується. Повертається 1/0 належить помічнику, а не SetDress/SetArm.
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()
    {
        return SaveIfReady("battle");
        return null;
    }

    dynamic SaveIfReady(dynamic name)
    {
        if (Truth(UO.ObjAtLayerEx(1, UO.Self()) == 0))
        {
            return 0;
        }

        UO.SetArm(name);
        return 1;
    }

    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.SetArm(name) — UO.SetArm(String)

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

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

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

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

public void SetArm(string name)

            => SetEquip(name, armSets, weaponLayers, "Arm set.");

UO.SetDress

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

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

void UO.SetDress();
void UO.SetDress(object? name);

Запам'ятовує поточні одягнені одяг та зброю для подальшого відновлення.

Параметри

  • name - Строкове ім'я набору, наприклад "travel" або "battle". Імена нечутливі до регістру. Набори одягу та зброї зберігаються окремо: однакове ім'я допустиме в обох. Це не ID речі та не ім'я файлу. Тільки SetDress допускає відсутність імені: тоді записується окремий набір для DressSavedSet/EquipDressSet.

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

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

Поведінка

  • Одяг: шари 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. Зброя: тільки 1 та 2. Волосся, борода, рюкзак, тварина та банк у ці набори не входять.
  • Записуються конкретні serial вже завантажених речей у своїх шарах. Повторне збереження того самого імені замінює запис. Порожні шари теж мають сенс: при відновленні відповідний шар буде звільнений у власний рюкзак. Тому збережений повністю порожній набір знімає речі своїх прошарків.
  • Набір зберігається в стані runtime. Сам виклик не створює файл і не гарантує перенесення набору в інший профіль або новий timer. Спочатку збережіть потрібний набір у стані. Завантаження/збереження загального стану клієнта – окремий механізм.
  • UO.SetDress · UO.Dress · UO.DressSavedSet · UO.SetArm · UO.Arm · UO.DressSpeed
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

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

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

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

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

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

UO.Print("Calling UO.SetDress");
UO.SetDress();

1. Пряме використання – прямий скрипт

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

  • Знімок робиться зараз, коли потрібні речі вже одягнені. Виклик не надягає предметів з рюкзака.
UO.SetDress("travel");

2. Імена та режим запиту – функція сценарію

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

  • Однакове ім'я використовується у різних сховищах. SetDress() також окремо зберігає безіменний набір; це не вибір раніше записаного імені.
return  RunScenario();
 object? RunScenario()
{
    UO.SetArm("battle");
    UO.SetDress("battle");
    UO.SetDress();
    return null;
}

3. Повний допоміжний сценарій - клас сценарію

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

  • SaveIfReady перевіряє контрольний шар: 3 — взуття для одягу, 1 — права рука для зброї. Якщо вона порожня, знімок не перезаписується. Повертається 1/0 належить помічнику, а не SetDress/SetArm.
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()
    {
        return SaveIfReady("travel");
        return null;
    }

    dynamic SaveIfReady(dynamic name)
    {
        if (Truth(UO.ObjAtLayerEx(3, UO.Self()) == 0))
        {
            return 0;
        }

        UO.SetDress(name);
        return 1;
    }

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

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

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

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

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

case "setdress": SetDress("__stealth_saved_set__"); return InjectionValue.Unit;

UO.SetDress(name) — UO.SetDress(String)

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

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

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

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

public void SetDress(string name)

            => SetEquip(name, dressSets, dressLayers, "Clothing set.");

UO.SetDressSpeed

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

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

void UO.SetDressSpeed(object? delayms);

Задає паузу між запитами перевдягання.

Параметри

  • delayms - int, мілісекунди. Значення обмежується до 10..10000 включно.

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

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

Поведінка

  • SetDressSpeed зберігає state.DressSpeed = max (10, min(10000, delayms)). Цим користуються операції збережених комплектів; швидкість дозволених сервером дій не змінюється.
  • Значення менше 10 стає 10, більше 10000 — 10000. Команда не вдягає та не знімає предмети.
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

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

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

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

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

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

UO.Print("Calling UO.SetDressSpeed");
UO.SetDressSpeed(250);

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

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

  • Задає паузу між запитами перевдягання.
UO.SetDressSpeed(250);

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

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

  • SetDressSpeed зберігає state.DressSpeed = max (10, min(10000, delayms)). Цим користуються операції збережених комплектів; швидкість дозволених сервером дій не змінюється.
return  RunScenario();
 object? RunScenario()
{
    UO.SetDressSpeed(0);
    UO.Print(UO.DressSpeed());
    return null;
}

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

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

  • Значення менше 10 стає 10, більше 10000 — 10000. Команда не вдягає та не знімає предмети.
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.SetDressSpeed(20000);
        UO.Print(UO.DressSpeed());
        return null;
    }
}

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

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

UO.SetDressSpeed(delayms) — UO.SetDressSpeed(Integer)

Параметри: delayms (Integer)

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

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

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

public void SetDressSpeed(int delayms) => state.DressSpeed = Math.Max(10, Math.Min(10_000, delayms));

UO.SetStatLockState

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

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

void UO.SetStatLockState(object? statNum, object? statState);

Запитує зміну режиму характеристики.

Параметри

  • statNum - Обов'язковий номер характеристики: 0 — STR, 1 — DEX, 2 — INT. Це не її поточне значення і назва рядком.
  • statState — Обов'язковий режим: ?0? — підвищення, ?1? — зниження, ?2? — блокування. Це три коди, не bool; true/false не замінюють назви всіх режимів.

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

void - значення, що повертається немає. Не можна використовувати результат як успіх/помилка або порівнювати з true. Подальше читання показує локальну модель, а чи не підтвердження сервера.

Поведінка

  • Допустимий запит надсилає один пакет через GameActions і відразу змінює локальний режим. Сервер може застосувати свої обмеження; підвищення навички чи характеристики не гарантується. Невідома навичка, неприпустимий індекс/режим та відсутність персонажа ігноруються без пакета.
  • Обов'язковий номер характеристики: 0 — STR, 1 — DEX, 2 — INT. Це не її поточне значення і назва рядком.
  • ExecuteClientApiCompatibility вибирає гілку команди. Text читає селектор навички, Arg - числові номери та режими. Неперетворюваний аргумент може завершити виклик помилкою перетворення.

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

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

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

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

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

UO.Print("Calling UO.SetStatLockState");
UO.SetStatLockState(0, 2);

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

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

  • У прикладі явно задані selector і при записі mode. Перший рядок вибирає навичку на ім'я або характеристику за номером. Print лише виводить результат.
var selector = 0;
var mode = 2;
UO.SetStatLockState(selector, mode);
UO.Print(Convert.ToString(UO.GetStatLockState(selector)));

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

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

  • Поріг 95.1 та режими 0/1/2 задані для прикладу. −1 перевіряється до зміни режиму. Після запису читається лише локальна копія; це не очікування відповіді сервера.
return  RunScenario();
 object? RunScenario()
{
    var selector = 0;
    var before = UO.GetStatLockState(selector);
    if (Truth(before >= 0) && Truth(before <= 2))
    {
        UO.SetStatLockState(selector, 0);
        UO.Print(Convert.ToString(UO.GetStatLockState(selector)));
    }

    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. selector вибирає навичку/характеристику, mode визначає режим запису. ReadValue/ReadMode повертають вихідне число; ApplyMode перевіряє аргументи, виконує дію та не повертає значення. UO.Wait(1000) у прикладі читання розділяє два знімки.
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()
    {
        ApplyMode(0, 2);
        return null;
    }

    void ApplyMode(dynamic selector, dynamic mode)
    {
        if (Truth(mode < 0) || Truth(mode > 2))
        {
            return;
        }

        if (Truth(UO.GetStatLockState(selector) < 0))
        {
            return;
        }

        UO.SetStatLockState(selector, mode);
    }

    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.SetStatLockState(statNum, statState) — UO.SetStatLockState(Any,Any)

Параметри: statNum (Any), statState (Any)

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

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

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

case "setstatlockstate":

                case "setstatstate": bridge.SetStatLockState(Arg(0), Arg(1)); return InjectionValue.Unit;

UO.SetStatState

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

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

void UO.SetStatState(object? statNum, object? statState);

Запитує зміну режиму характеристики.

Параметри

  • statNum - Обов'язковий номер характеристики: 0 — STR, 1 — DEX, 2 — INT. Це не її поточне значення і назва рядком.
  • statState — Обов'язковий режим: ?0? — підвищення, ?1? — зниження, ?2? — блокування. Це три коди, не bool; true/false не замінюють назви всіх режимів.

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

void - значення, що повертається немає. Не можна використовувати результат як успіх/помилка або порівнювати з true. Подальше читання показує локальну модель, а чи не підтвердження сервера.

Поведінка

  • Допустимий запит надсилає один пакет через GameActions і відразу змінює локальний режим. Сервер може застосувати свої обмеження; підвищення навички чи характеристики не гарантується. Невідома навичка, неприпустимий індекс/режим та відсутність персонажа ігноруються без пакета.
  • Обов'язковий номер характеристики: 0 — STR, 1 — DEX, 2 — INT. Це не її поточне значення і назва рядком.
  • ExecuteClientApiCompatibility вибирає гілку команди. Text читає селектор навички, Arg - числові номери та режими. Неперетворюваний аргумент може завершити виклик помилкою перетворення.

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

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

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

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

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

UO.Print("Calling UO.SetStatState");
UO.SetStatState(0, 2);

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

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

  • У прикладі явно задані selector і при записі mode. Перший рядок вибирає навичку на ім'я або характеристику за номером. Print лише виводить результат.
var selector = 0;
var mode = 2;
UO.SetStatState(selector, mode);
UO.Print(Convert.ToString(UO.GetStatLockState(selector)));

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

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

  • Поріг 95.1 та режими 0/1/2 задані для прикладу. −1 перевіряється до зміни режиму. Після запису читається лише локальна копія; це не очікування відповіді сервера.
return  RunScenario();
 object? RunScenario()
{
    var selector = 0;
    var before = UO.GetStatLockState(selector);
    if (Truth(before >= 0) && Truth(before <= 2))
    {
        UO.SetStatState(selector, 0);
        UO.Print(Convert.ToString(UO.GetStatLockState(selector)));
    }

    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. selector вибирає навичку/характеристику, mode визначає режим запису. ReadValue/ReadMode повертають вихідне число; ApplyMode перевіряє аргументи, виконує дію та не повертає значення. UO.Wait(1000) у прикладі читання розділяє два знімки.
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()
    {
        ApplyMode(0, 2);
        return null;
    }

    void ApplyMode(dynamic selector, dynamic mode)
    {
        if (Truth(mode < 0) || Truth(mode > 2))
        {
            return;
        }

        if (Truth(UO.GetStatLockState(selector) < 0))
        {
            return;
        }

        UO.SetStatState(selector, mode);
    }

    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.SetStatState(statNum, statState) — UO.SetStatState(Any,Any)

Параметри: statNum (Any), statState (Any)

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

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

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

case "setstatlockstate":

                case "setstatstate": bridge.SetStatLockState(Arg(0), Arg(1)); return InjectionValue.Unit;

UO.Sex

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

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

dynamic UO.Sex();

Читає код статі та раси з моделі клієнта.

Параметри

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

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

int — сумісний код: 0=human male, 1=human female, 2=elf male, 3=elf female, 4=gargoyle male, 5=gargoyle Без персонажа також 0, тому для наявності перевіряйте Exists(self). Це не простий bool female.

Поведінка

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

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

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

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

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

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

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

1. Вивести поточне значення свого персонажа - прямий скрипт

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

  • Виклик без аргументів відноситься до self. Код статі та раси зберігається у value.
  • Convert.ToString перетворює число для виведення і не змінює значення результату.
var value = UO.Sex();
UO.Print("Sex: " + Convert.ToString(value));

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

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

  • Значення читається одного разу без аргументів. Код статі та раси використовується у наведеному розрахунку або умові.
  • Числові пороги — приклад умов скрипту, а чи не нові межі клієнта. Поле зберігає серверні одиниці та обмеження, описані вище.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.Sex();
    if (Truth(value == 4) || Truth(value == 5))
    {
        UO.Print("Gargoyle sex/race code");
    }

    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(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 before = UO.Sex();
        await Delay(1000);
        var after = UO.Sex();
        if (Truth(before != after))
        {
            UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        }

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

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

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

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

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

case "sex": return new InjectionValue(bridge.Sex);

UO.Stam

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

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

dynamic UO.Stam();

Читає поточну витривалість із локальної моделі.

Параметри

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

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

int — значення поля Stamina, не відсоток і не bool. 0 буває справжнім значенням або ознакою відсутніх даних. Нульовий максимум не можна використовувати як дільник. У чужого mobile значення можуть бути невідомі. HP/HitsMax можуть містити відносну шкалу сервера замість точних очок. HP=0 не доводить смерть; для цього є Dead/IsDead.

Поведінка

  • Команда не відкриває status і не вимагає оновлення сервера. Клієнт лише читає вже завантажені дані. Не змінює характеристики та не відправляє пакети.
  • Результат – окреме читання. Світ може змінитися між Exists та наступним викликом; Кілька запитів не утворюють атомарний знімок.
  • Під час читання об'єкта World.Get відкидає відсутній або IsDestroyed і виходить 0. HP/HitsMax читаються в Entity, включаючи предмети з цими полями; Mana/Stamina – тільки у Mobile. Без аргументу читається self. Однойменний варіант без параметрів не обов'язково має варіант з ID: дивіться сигнатури.
  • Читання без аргументів теж повертає 0 для відсутнього чи знищеного Player. Це стосується і прямих Mana/Stamina та їх максимумів, а не тільки форм через World.Get. Присутній мертвий персонаж може зберігати значення.

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

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

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

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

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

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

1. Вивести значення свого персонажа - прямий скрипт

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

  • Виклик без аргументів читає self. value зберігає одне число, Convert.ToString перетворює його лише повідомлення.
var value = UO.Stam();
UO.Print("Stam: " + Convert.ToString(value));

2. Застосувати значення у перевірці чи розрахунку – функція сценарію

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

  • Показано прикладний поріг або розрахунок цього поля. Числа в умові – налаштування прикладу, не межі сервера. Перед розподілом на максимум перевіряється його позитивність.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.Stam();
    if (Truth(value < 15))
    {
        UO.Print("Known stamina is below the movement threshold of 15");
    }

    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. Повна допоміжна функція ReadValue - клас сценарію

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

  • У цього імені немає форми з ID. ReadValue без параметрів читає 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 before = ReadValue();
        await Delay(1000);
        var after = ReadValue();
        UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        return null;
    }

    dynamic ReadValue()
    {
        return UO.Stam();
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}

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

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

UO.Stam() — UO.Stam()

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

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

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

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

case "stam": return new InjectionValue(bridge.Stamina);

UO.Stamina

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

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

int UO.Stamina();

Читає поточну витривалість із локальної моделі.

Параметри

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

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

int — значення поля Stamina, не відсоток і не bool. 0 буває справжнім значенням або ознакою відсутніх даних. Нульовий максимум не можна використовувати як дільник. У чужого mobile значення можуть бути невідомі. HP/HitsMax можуть містити відносну шкалу сервера замість точних очок. HP=0 не доводить смерть; для цього є Dead/IsDead.

Поведінка

  • Команда не відкриває status і не вимагає оновлення сервера. Клієнт лише читає вже завантажені дані. Не змінює характеристики та не відправляє пакети.
  • Результат – окреме читання. Світ може змінитися між Exists та наступним викликом; Кілька запитів не утворюють атомарний знімок.
  • Під час читання об'єкта World.Get відкидає відсутній або IsDestroyed і виходить 0. HP/HitsMax читаються в Entity, включаючи предмети з цими полями; Mana/Stamina – тільки у Mobile. Без аргументу читається self. Однойменний варіант без параметрів не обов'язково має варіант з ID: дивіться сигнатури.
  • Читання без аргументів теж повертає 0 для відсутнього чи знищеного Player. Це стосується і прямих Mana/Stamina та їх максимумів, а не тільки форм через World.Get. Присутній мертвий персонаж може зберігати значення.

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

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

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

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

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

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

1. Вивести значення свого персонажа - прямий скрипт

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

  • Виклик без аргументів читає self. value зберігає одне число, Convert.ToString перетворює його лише повідомлення.
var value = UO.Stamina();
UO.Print("Stamina: " + Convert.ToString(value));

2. Застосувати значення у перевірці чи розрахунку – функція сценарію

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

  • Показано прикладний поріг або розрахунок цього поля. Числа в умові – налаштування прикладу, не межі сервера. Перед розподілом на максимум перевіряється його позитивність.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.Stamina();
    if (Truth(value < 15))
    {
        UO.Print("Known stamina is below the movement threshold of 15");
    }

    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. Повна допоміжна функція ReadValue - клас сценарію

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

  • У цього імені немає форми з ID. ReadValue без параметрів читає 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 before = ReadValue();
        await Delay(1000);
        var after = ReadValue();
        UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        return null;
    }

    dynamic ReadValue()
    {
        return UO.Stamina();
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}

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

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

UO.Stamina() — UO.Stamina()

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

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

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

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

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

() => bridge.Stamina

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


UO.Str

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

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

int UO.Str();

Читає поточну силу (Strength) персонажа.

Параметри

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

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

int — поточні окуляри характеристики, 0..65535 у моделі клієнта; не відсоток, ID, навичка, режим блокування або bool. 0 також означає відсутність/видалення персонажа або недоступний об'єкт. Порівнюйте з числовою вимогою, не == true. Це не межа характеристики та не гарантоване базове значення без модифікаторів.

Поведінка

  • Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
  • Читає Player.Strength, якщо Player існує й не знищений; інакше 0. Присутній мертвий персонаж не є видаленим об’єктом. Характеристика не обчислюється з HP, мани чи витривалості.
  • GetStr/GetInt/GetDex приймають ObjID. Дані PlayerMobile доступні лише для self; для іншого serial - 0, навіть для завантаженого mobile. Чужа характеристика не підставляється і вгадується.
  • Invoke читає на ігровому потоці з можливістю скасувати очікування на скрипт. Чи не запитує status, не відкриває target, не посилає пакет, не змінює характеристику і не додає затримку.
  • Кожен дзвінок читає локальні дані заново. Змінна зберігає знімок; окремі читання можуть отримати різні оновлення сервера. Ненульовий результат не перевіряє підключення. Нуль може бути значенням чи відсутністю даних.
  • У C# використовуйте точне написання: UO.Str(), UO.Strength(), UO.GetStr() або UO.GetStrength(). C# враховує регістр літер.

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

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

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

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

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

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

1. Прочитати та вивести окуляри — прямий скрипт

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

  • value зберігає числовий результат; Convert.ToString лише форматує його для журналу. Аргументів та дії персонажа немає.
var value = UO.Str();
UO.Print("Strength: " + Convert.ToString(value));

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

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

  • before та after поділяє 1000 мс; UO.Wait доданий у приклад. change=after-before буває позитивним, нульовим чи негативним. Сам собою він не розрізняє всі проміжні оновлення і вихід зі світу.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.Str();
    await Delay(1000);
    var after = UO.Str();
    var change = after - before;
    UO.Print("Change: " + Convert.ToString(change));
    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));

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

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

  • minimum = 80 - приклад вимоги, не межа клієнта. AttributeAtLeast(minimum) відкидає відсутнього персонажа, один раз читає характеристику та повертає bool: true або false за умовою >= minimum. Логічне значення дає порівняння, не сама характеристика.
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(Truth(AttributeAtLeast(80)) == true))
        {
            UO.Print("Requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic AttributeAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.Str();
        return value >= minimum;
    }

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

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

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

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

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

case "str": return new InjectionValue(bridge.Strength);

UO.Strength

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

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

int UO.Strength();

Читає поточну силу (Strength, Convert. ToString) персонажа.

Параметри

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

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

int — поточні окуляри характеристики, 0..65535 у моделі клієнта; не відсоток, ID, навичка, режим блокування або bool. 0 також означає відсутність/видалення персонажа або недоступний об'єкт. Порівнюйте з числовою вимогою, не == true. Це не межа характеристики та не гарантоване базове значення без модифікаторів.

Поведінка

  • Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
  • Читає Player.Strength, якщо Player існує й не знищений; інакше 0. Присутній мертвий персонаж не є видаленим об’єктом. Характеристика не обчислюється з HP, мани чи витривалості.
  • GetStr/GetInt/GetDex приймають ObjID. Дані PlayerMobile доступні лише для self; для іншого serial - 0, навіть для завантаженого mobile. Чужа характеристика не підставляється і вгадується.
  • Invoke читає на ігровому потоці з можливістю скасувати очікування на скрипт. Чи не запитує status, не відкриває target, не посилає пакет, не змінює характеристику і не додає затримку.
  • Кожен дзвінок читає локальні дані заново. Змінна зберігає знімок; окремі читання можуть отримати різні оновлення сервера. Ненульовий результат не перевіряє підключення. Нуль може бути значенням чи відсутністю даних.
  • C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool. UO.Str(), UO.Strength(), UO.GetStr(), UO.GetStrength().

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

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

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

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

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

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

1. Прочитати та вивести окуляри — прямий скрипт

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

  • value зберігає числовий результат; Convert.ToString лише форматує його для журналу. Аргументів та дії персонажа немає.
var value = UO.Strength();
UO.Print("Strength: " + Convert.ToString(value));

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

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

  • before та after поділяє 1000 мс; UO.Wait доданий у приклад. change=after-before буває позитивним, нульовим чи негативним. Сам собою він не розрізняє всі проміжні оновлення і вихід зі світу.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.Strength();
    await Delay(1000);
    var after = UO.Strength();
    var change = after - before;
    UO.Print("Change: " + Convert.ToString(change));
    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));

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

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

  • minimum = 80 - приклад вимоги, не межа клієнта. AttributeAtLeast(minimum) відкидає відсутнього персонажа, один раз читає характеристику та повертає bool: true або false за умовою >= minimum. Логічне значення дає порівняння, не сама характеристика.
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(Truth(AttributeAtLeast(80)) == true))
        {
            UO.Print("Requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic AttributeAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.Strength();
        return value >= minimum;
    }

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

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

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

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

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

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

() => bridge.Strength

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


UO.TicksDead

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

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

int UO.TicksDead();

Читає чи вперше встановлює позначку поміченої смерті.

Параметри

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

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

int - UO.Timer в десятих секунди від старту runtime, спочатку 0. Чи не число смертей і не тривалість смерті.

Поведінка

  • При кожному дзвінку, якщо bridge.Dead()!=0 та ticksDead==0, зберігає Timer(). Інакше повертає колишнє ticksDead. Після пожвавлення поле цим способом не скидається.
  • Це позначка першого дзвінка TicksDead під час поміченої смерті, не точний час серверної події. У першій десятій секунді значення 0 може бути встановлене повторно.

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

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

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

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

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

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

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

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

  • Читає чи вперше встановлює позначку поміченої смерті.
UO.Print(UO.TicksDead());

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

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

  • При кожному дзвінку, якщо bridge.Dead()!=0 та ticksDead==0, зберігає Timer(). Інакше повертає колишнє ticksDead. Після пожвавлення поле цим способом не скидається.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.IsDead()))
    {
        var stamp = UO.TicksDead();
        UO.Print(UO.Timer() - stamp);
    }

    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. Повна допоміжна функція – клас сценарію

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

  • Це позначка першого дзвінка TicksDead під час поміченої смерті, не точний час серверної події. У першій десятій секунді значення 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 before = UO.TicksDead();
        UO.Wait(500);
        UO.Print(before = UO.TicksDead());
        return null;
    }
}

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

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

UO.TicksDead() — UO.TicksDead()

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

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

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

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

public int TicksDead()

        {

            if (bridge.Dead() != 0 && ticksDead == 0)

                ticksDead = Timer();

            return ticksDead;

        }

UO.ToggleFly

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

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

void UO.ToggleFly();

Запитує перемикання польоту свого Gargoyle: із землі — у політ, із польоту — на землю. Це дія, а UO.Flying() тільки перевіряє стан. Команда стане в нагоді перед маршрутом, що вимагає певного режиму.

Параметри

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

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

void - значення немає. Це не true/false і не підтвердження сервера. Фактичний результат перевіряйте через UO.Flying() після обробки серверної відповіді.

Поведінка

  • Єдина форма - UO.ToggleFly(), без ID, координат і параметра true/false. Належить до свого персонажа; політ іншого mobile змінити не можна.
  • Відправляє запит 0xBF з підкомандою 0x0032. Сам виклик не перевіряє расу, версію протоколу, дозволу сервера та поточний режим; вибирайте його для свого Gargoyle на сервері з підтримкою польоту.
  • Сервер може відмовити, а оновлення стану надходить пізніше. Не викликайте ToggleFly у циклі очікування: повторний запит може скасувати попереднє перемикання. Надішліть один запит і читайте Flying до тайм-ауту.
  • Висота Z та ознака польоту - різні дані. UO.Flying() повертає int 1/true або 0/false; false також можливий за відсутності персонажа або старого протоколу.

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

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

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

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

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

UO.Print("Calling UO.ToggleFly");
UO.ToggleFly();

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

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

  • Приклад призначений для свого Gargoyle на сервері, що підтримує політ. EnsureFlight(timeoutMs) повертає 1/true, якщо спостерігається політ, інакше 0/false. 2000 - межа очікування в мілісекундах; перевірки кожні 50 мс. Якщо вже летить, ToggleFly не викликається. Відправляється не більше одного запиту, потім перевіряється стан у відповідь. Пауза скрипта/затримка планувальника може збільшити реальний час.
if (Truth(await EnsureFlight(2000)))
{
    UO.Print("Flight confirmed; ready for the next stage");
}
else
{
    UO.Print("Flight not confirmed; route was not started");
}

async Task<dynamic> EnsureFlight(dynamic timeoutMs)
{
    if (!(Truth(UO.Connected())) || Truth(UO.Dead()))
    {
        return false;
    }
    if (Truth(UO.Flying()))
    {
        return true;
    }
    UO.ToggleFly();
    var waited = 0;
    while (Truth(waited < timeoutMs))
    {
        if (!(Truth(UO.Connected())))
        {
            return false;
        }
        if (Truth(UO.Flying()))
        {
            return true;
        }
        await Delay(50);
        waited += 50;
    }
    return UO.Flying();
}

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;

2. Запросити посадку лише під час польоту – функція сценарію

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

  • До 40 очікувань по 50 мс, лише один запит. Перевірка Connected не дає прийняти вимкнення за успішну посадку. Пауза скрипта може збільшити час.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    if (Truth(UO.Connected()) && Truth(UO.Flying()))
    {
        UO.ToggleFly();
        var checks = 0;
        while (Truth(UO.Connected()) && Truth(UO.Flying()) && Truth(checks < 40))
        {
            await Delay(50);
            checks += 1;
        }

        if (Truth(UO.Connected()) && !(Truth(UO.Flying())))
        {
            UO.Print("Landing state observed");
        }
        else
        {
            UO.Print("Landing not confirmed");
        }
    }

    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. Команда ручного перемикання для гарячої клавіші – клас сценарію

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

  • Призначте Main на клавішу одного запиту перемикання. Це не EnsureFlight: повторне натискання під час польоту запитує посадку. Повторні клавіші або два паралельні скрипти можуть надіслати кілька запитів; обмежувач тут не встановлюється.
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.Connected()) && !(Truth(UO.Dead())))
        {
            UO.ToggleFly();
        }

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

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

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

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

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

case "togglefly": bridge.ToggleFly(); return InjectionValue.Unit;

Clone this wiki locally