Skip to content

UO Topic combat

Codex edited this page Oct 12, 2026 · 7 revisions

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

Бій і лікування

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

Атака, бойовий режим, здібності зброї та лікування бинтами. Надсилання команди означає запит на дію; її виконання залежить від стану персонажа й відповіді сервера.

Розділи

Тема Команди та пояснення
Атака UO.Attack
Атака найближчої цілі UO.AttackNearest
Остання ціль атаки UO.LastAttack
Бойовий режим UO.WarMode
Ціль у бойовому режимі UO.WarTargetID
Здібності зброї UO.GetWeaponAbilities · UO.GetAbilityID · UO.GetAbilityName · UO.GetActiveAbility
Основна здібність UO.UsePrimaryAbility
Друга здібність UO.UseSecondaryAbility
Особливі прийоми UO.Specmove
Лікування себе бинтом UO.BandageSelf

Усі команди теми

Атака

UO.Attack · UO.AttackNearest · UO.LastAttack · UO.WarMode · UO.IsWarMode · UO.SetWarMode · UO.WarTargetID

Здібності зброї

UO.GetWeaponAbilities · UO.GetAbilityID · UO.GetAbilityName · UO.GetActiveAbility · UO.UseAbility · UO.UsePrimaryAbility · UO.UseSecondaryAbility · UO.Specmove

Лікування себе бинтом

UO.BandageSelf

Класи спорядження сервера

UO.SetClassMask · UO.ClearClassMask · UO.AttackNearest

Назви груп та типи одягнених речей задаються скриптом; порядок імен через | задає пріоритет.

Приклади на тему

Нижче наведено короткі приклади. У повному описі кожної команди є параметри, результат, обмеження та кілька самостійних скриптів: прямий код, варіант із функцією та варіант із класом.

UO.Attack

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

var selected = UO.LastTarget();
var allowed = UO.GetMobiles(10, "5|6", -1, 8, false, false, true, true);
var i = 0;
while (Truth(i < ArrayLength(allowed)))
{
    if (Truth(allowed[i] == selected))
    {
        UO.Attack(selected);
        return null;
    }
    i += 1;
}
UO.Print("Selected target does not pass the filters");

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;

UO.GetWeaponAbilities

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

var abilities = UO.GetWeaponAbilities();
UO.Print(UO.GetArrayLength(abilities));

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


UO.Attack

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

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

void UO.Attack(object? objID);

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

Параметри

  • objID — Serial mobile: int, десятковий/hex-рядок або ім'я об'єкта (наприклад lasttarget або ім'я AddObject). Чи не graphic/type і не назва класу. Обов'язковий аргумент; 0 не є командою зупинки бою. Для вибору мети без її ID використовуйте пошук або ігровий target.

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

void - значення немає. Пишіть UO.Attack(enemy) окремим рядком, не var result=UO.Attack(...). Завершення дзвінка не підтверджує попадання, шкоду або згоду сервера.

Поведінка

  • Сам собою виклик не відкидає мертвих, далеких, self, союзників, порожній serial або предмети. Перевіряйте обрану мету; краще відфільтрований mobile з GetMobiles/FindMan.
  • Використовується штатний GameActions.Attack: можливе питання про кримінальну атаку при EnabledCriminalActionQuery. При звичайному ході оновлюються LastAttack/NewTargetSystemSerial і надсилається пакет запиту атаки.
  • Команда сама не вмикає WarMode, не виконує подвійний клік мишею, не прокладає маршрут і не запускає цикл повторних атак. Обробка бойового режиму та подальшого бою залежить від сервера.
  • Для рядка невідомого об'єктного імені можлива помилка дозволу. Перевірка Exists доводить наявність об'єкта, але не те, що це mobile; GetMobiles видає саме mobiles.

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

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

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

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

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

UO.Print("Calling UO.Attack");
UO.Attack(UO.LastTarget());

1. Атакувати останню обрану живу мету після перевірки – прямий скрипт

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

  • lasttarget може бути предметом чи дружнім персонажем. Список allowed виключає ці випадки; Attack викликається максимум один раз.
var selected = UO.LastTarget();
var allowed = UO.GetMobiles(10, "5|6", -1, 8, false, false, true, true);
var i = 0;
while (Truth(i < ArrayLength(allowed)))
{
    if (Truth(allowed[i] == selected))
    {
        UO.Attack(selected);
        return null;
    }
    i += 1;
}
UO.Print("Selected target does not pass the filters");

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. Спочатку знайти Enemy, потім атакувати при доступній висоті – функція сценарію

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

  • FindMan повертає serial і не атакує. Перевірку IsDead додано окремо, тому що у FindMan немає aliveOnly.
return  RunScenario();
 object? RunScenario()
{
    var enemy = UO.FindMan(5, 6, true, 4, -1, -1, false);
    if (Truth(enemy == 0))
    {
        return null;
    }

    if (Truth(UO.IsDead(enemy) == 0))
    {
        UO.AddObject("enemy", enemy);
        UO.Attack(enemy);
    }

    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. Найближча мета з окремою перевіркою геометрії – клас сценарію

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

  • GetMobiles вже впорядкований nearest=true. Якщо перед першою метою стіна, перевіряється така; наявність visibleOnly сама по собі не замінює CheckLOS. Серверна перевірка може відрізнятись.
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 targets = UO.GetMobiles(8, 5, -1, 10, true, false, true, true);
        var i = 0;
        while (Truth(i < ArrayLength(targets)))
        {
            var enemy = targets[i];
            if (Truth(UO.CheckLOS(UO.GetX("self"), UO.GetY("self"), UO.GetZ("self"), UO.GetX(enemy), UO.GetY(enemy), UO.GetZ(enemy), UO.WorldNum())))
            {
                UO.Attack(enemy);
                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;
}

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

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

UO.Attack(objID) — UO.Attack(Any)

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

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

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

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

case "attack": bridge.Attack(Arg(0)); return InjectionValue.Unit;

UO.Attack(objID) — UO.Attack(Integer)

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

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

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

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

public void Attack(int id) => bridge.Attack(id);

UO.Attack(objID) — UO.Attack(String)

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

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

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

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

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

UO.AttackNearest

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

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

int UO.AttackNearest(object? notoriety);
int UO.AttackNearest(object? notoriety, object? distance);
int UO.AttackNearest(object? notoriety, object? distance, object? body);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color, object? classMask);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color, object? classMask, object? aliveOnly);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color, object? classMask, object? aliveOnly, object? visibleOnly);

Вибирає одну потрібну бойову мету і передає її обробникові атаки. Фільтри обмежують допустимі персонажі; користувальницький classMask задає екіпірування та пріоритет класів, nearest - вибір усередині класу.

Параметри

  • notoriety - Статус відношення до персонажа, отриманий від сервера: 0 - Невідомий, 1 — Innocent, 2 — Ally, 3 — Gray, 4 — Criminal, 5 — Enemy, 6 — Murderer, 7 - Invulnerable. Число означає один статус; "5|6або масив чисел - будь-який з перерахованих. Це не колір одягу і не клас. Негативне число (зазвичай -1), 0xFFFF, "any", порожній рядок або порожній масив окремо відключають цей фільтр. Некоректний рядок без допустимих чисел не знаходить нікого. Порядок статусів пріоритет не задає. Фільтр 5 вибирає Enemy, а не автоматично будь-якого NPC/монстра; реальні значення залежить від сервера.
  • distance — Горизонтальний радіус у клітинах включно: 5 допускає відстань 0..5. Відстань — max(abs(dx),abs(dy)), тому сусідня діагональ теж 1. За замовчуванням або за негативного числа береться UO.FindDistance(), а не безлімітний пошук. 0 залишає ту ж клітину X/Y. Чи не довжина маршруту; перешкоди та поверхи цим параметром не перевіряються.
  • body — Graphic тіла персонажа/NPC, не ID конкретного персонажа і не type одягненої броні. Число, hex-рядок, рядок 0x0190|0x0191" або масив чисел. 0x0190 (400) - чоловік-людина; 0x0191 (401) - жінка-людина. Маска поєднує обидва тіла. Список автоматично не включає інші раси, привидів або перетворення; таблиці стандартних графічних типів тіла. Негативне число (-1 за умовчанням), 0xFFFF, "any", порожній рядок або порожній масив окремо - будь-яке тіло. Невідомий текст без допустимого числа дає результат.
  • maxZ — максимальна abs(Z цілі - Z власного персонажа) включно, в одиницях Z світу. Це не кількість поверхів і не клітинки X/Y. maxZ=4 за Z гравця 10 допускає Z цілі 6..14; 0 вимагає однакової висоти. За замовчуванням/за від’ємного числа використовується UO.FindVertical(). На сходах однакова Z може виключити потрібну ціль. Навіть мала різниця Z не доводить доступність поверху.
  • nearest — true/1 за умовчанням вибирає найближчого відповідного персонажа; рівну відстань дозволяється меншим serial. false/0 зберігає перший відповідний об'єкт у порядку списку клієнта, не вибирає найдальшого. При classMask спочатку діє пріоритет класу, потім відстань усередині класу.
  • color — Hue самого mobile: int або числове/hex-рядок. Негативне число (-1 за умовчанням) і 0xFFFF - будь-який hue; 0 - саме hue 0, а не будь-яке значення. Чи не колір смужки notoriety і не відтінок одягу. Колір одягненої речі цей параметр не перевіряє.
  • classMask - Імена правил, заздалегідь визначених UO.SetClassMask в цьому ж скриптовому ході. Наприклад "DTMH|мисливець|запасний" - пріоритет зліва направо; також допускається масив рядків. Назви будь-які, регістр не важливий. Розділювачі рядка: |, кома або;. Будь-яке невідоме ім'я/порожній елемент у списку скасовує вибір повністю: результат 0, Атаки немає. Це не числова бітова маска: 7 не означає три класи. Пропущений аргумент, -1, "-1Magne/Tank/Archer не вбудовано: без реєстрації таких правил збігів не буде.
  • aliveOnly — true/1 виключає mobiles з IsDead != 0; false/0 за умовчанням не додає цієї умови. Не порівняння HP з нулем, не пошук трупів-предметів і не гарантія, що ціль залишиться живою після виклику.
  • visibleOnly — true/1 вимагає IsVisible=1 за поточним станом ClassicUO; false/0 за умовчанням не додає умову. Це видимість завантаженого об'єкта клієнту, а чи не перевірка стін/лінії огляду. Для геометричної перевірки є окрема UO.CheckLOS з координатами; сервер все одно може відхилити дію.

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

int — serial вибраного mobile, або 0, коли потрібної мети немає або classMask недійсний. Це не 1/0-прапор, не body/type, не відстань і не підтвердження удару. Перевіряйте enemy != 0; enemy == true неприпустимо в C#: int не порівнюється з bool. При ненульовому ID обробник ClassicUO ще може показати підтвердження атаки Innocent; сервер може відхилити дію.

Поведінка

  • Пошук локальний: тільки вже завантажені mobiles. Враховується Ignore; self виключений, крім явного includeSelf=true у командах, що його підтримують. Контейнери та предмети не є мобільними.
  • Умови застосовуються разом (AND). Допустимі альтернативи всередині body/notoriety об'єднані через OR. Пошук не змінює FindItem, FindCount та GetFoundItems.
  • У body/notoriety маска з допустимими числами використовує саме їх: "any|5" однаково обмежує значенням 5. Порожні/невірні елементи поруч із допустимими числами ігноруються. Для відсутності обмеження передайте окремо -1. Не переносіть це правило на classMask: невідоме ім'я класу відхиляє весь список.
  • Команди не відкривають область світу, не біжать до мети та не перевіряють прохідність маршруту. Між вибором та обробкою сервером стан світу може змінитися.
  • Передача true та 1 рівнозначна для прапорів, false та 0 також. Інші ненульові числа теж перетворюються на true, але 8/9 не є окремими режимами; використовуйте зрозумілі true/false.
  • Ім'я — мітка користувача, а не серверна професія. Можна назвати правило DTMH, мою групу або будь-яким іншим словом. Двигун не визначає навички/клас на сервері на ім'я персонажа.
  • Required один type або плоский масив означає хоча б одну річ зі списку. Масив груп означає: потрібна хоча б одна річ із КОЖНОЇ групи. Наприклад [шкіра, палиці] вимагає шкіру І палицю. Це набір альтернатив, а не вимога одягнути весь перерахований гардероб.
  • Будь-яка одягнена річ з forbidden виключає персонажа з цього правила, навіть у виконаних required. Шкіра плюс заборонений chain не проходить правило шкіри. Інші правила продовжують перевірятись.
  • Враховуються лише завантажені речі, одягнені на шарах 1..24 крім рюкзака 21. Вміст рюкзака/скрині, маунт 25, магазин 26..28 та банк 29 не вважаються одягом. Порівнюється graphic/type; serial, ім'я та hue речі тут не використовуються.
  • Список без завантаженого відповідного екіпірування не збігається. Відсутність забороненої речі в локальних даних не доводить її відсутність на сервері, якщо сервер ще не надіслав екіпірування. Клієнт не вгадує приховані дані.
  • Правила належать одному runtime скрипту, включаючи його функції та Include; не передаються іншим самостійним запускам та не зберігаються у профіль. При новому запуску визначте їх знову, наприклад, загальною процедурою налаштування. Повторний SetClassMask замінює правило з тим самим ім'ям тільки після повної перевірки нових даних.
  • Масиви копіюються під час реєстрації. Зміна вихідного масиву не змінює правило: повторіть SetClassMask. Кілька правил, що збіглися, дозволяються порядком імен в classMask. Жодних стандартних таблиць одягу сервера немає.
  • Підтримуються 1..9 позиційних аргументів. Пропускати можна хвіст; щоб задати classMask, потрібно передати перші шість аргументів. Використовуйте іменовані var, щоб бачити зміст кожної позиції.
  • Вибирається одна ціль, атака відправляється один раз. Це не автоматичний цикл бою. Без classMask фільтр екіпірування та читання речей не виконуються.
  • Спочатку загальні фільтри, потім пріоритет ліворуч, потім nearest. nearest=false все одно зберігає пріоритет класів, але всередині першого класу вибирає перший mobile у списку клієнта.
  • Стара спроба пошуку підрядка в імені/титулі замінена правилами екіпірування. Перенесіть такі скрипти на явний SetClassMask; Ім'я персонажа більше не видає його за певний клас.

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

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

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

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

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

var result = UO.AttackNearest(5, 5);
UO.Print("AttackNearest: " + Convert.ToString(result));

1. Найближчий Enemy у п'яти клітинах: коротка форма – прямий скрипт

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

  • body=-1, maxZ=FindVertical(), nearest=true, color=-1, classMask відключений, aliveOnly=false, visibleOnly=false. Для обов'язкового виключення мертвих використовуйте повну форму нижче.
var enemy = UO.AttackNearest(5, 5);
if (Truth(enemy == 0))
{
    return null;
}
UO.AddObject("combat_target", enemy);

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

2. Тільки задані тіла та сама висота: всі прапори без класів — функція сценарію

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

  • maxZ=0 корисний для суворого порівняння висоти, але може відсікнути мету на сходинці. visibleOnly не перевіряє стіну. Усі дев'ять аргументів підписано; повертається ID, не true.
return  RunScenario();
 object? RunScenario()
{
    var status = "5|6";
    var radius = 8;
    var bodies = "0x0190|0x0191";
    var heightTolerance = 0;
    dynamic chooseNearest = true;
    var bodyHue = -1;
    var equipmentClasses = -1;
    dynamic requireAlive = true;
    dynamic requireVisible = true;
    var enemy = UO.AttackNearest(status, radius, bodies, heightTolerance, chooseNearest, bodyHue, equipmentClasses, requireAlive, requireVisible);
    if (Truth(enemy != 0))
    {
        UO.AddObject("enemy_same_height", enemy);
    }

    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. Свої назви, свої речі та порядок атаки – клас сценарію

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

  • Спочатку вибирається DTMH; тільки якщо підходящих DTMH немає - важкий, потім мисливець. DTMH на 10 клітинах має пріоритет над важким на 2 клітинах. Для зворотного порядку поміняйте рядок classMask. З двох DTMH вибирається найближчий.
  • Gear — повністю наведена функція користувача C#, не окрема команда UO. Два масиву Gear(leather, staves) утворюють дві обов'язкові групи. Додавання типу у leather розширює альтернативи; не вимагає вдягати дві шкіряні речі.
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 leather = Gear(0x13C4, 0x13C7);
        var staves = Gear(0x0DF0, 0x0E81);
        var chain = Gear(0x13BF, 0x13C0);
        var plate = Gear(0x1415, 0x1411);
        var bows = Gear(0x13B2, 0x0F50);
        UO.SetClassMask("DTMH", Gear(leather, staves), chain);
        UO.SetClassMask("охотник", bows);
        UO.SetClassMask("тяжёлый", plate);
        var notoriety = "5|6";
        var distance = 12;
        var body = -1;
        var maxZ = 8;
        dynamic nearest = true;
        var color = -1;
        var classMask = "DTMH|тяжёлый|охотник";
        dynamic aliveOnly = true;
        dynamic visibleOnly = true;
        var enemy = UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly, visibleOnly);
        if (Truth(enemy == 0))
        {
            UO.Print("No matching enemy; no attack sent");
            return null;
        }

        UO.AddObject("selected_enemy", enemy);
        return null;
    }

    dynamic Gear(params dynamic[] values)
    {
        return values;
    }

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

4. nearest = false: перший у списку, а не найдальший - прямий скрипт

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

  • 10 - радіус, 4 - допустима різниця Z, обидва -1 після прапора відключають color і classMask. Порядок списку клієнтів не гарантовано між оновленнями світу. Для передбачуваної близькості скористайтеся true.
dynamic sortByDistance = false;
var target = UO.AttackNearest(5, 10, -1, 4, sortByDistance, -1, -1, true, true);
if (Truth(target == 0))
{
    return null;
}
UO.AddObject("current_enemy", target);

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

5. Перевпорядкувати власні групи — функція сценарію

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

  • Змінюється лише порядок позначок: жодних нових таблиць одягу чи назв у клієнті додавати не потрібно. Щоб заборонити fallback на важкий, видаліть його з priority.
return  RunScenario();
 object? RunScenario()
{
    var leather = Gear(0x13C4, 0x13C7);
    var staves = Gear(0x0DF0, 0x0E81);
    var chain = Gear(0x13BF, 0x13C0);
    var plate = Gear(0x1415, 0x1411);
    var bows = Gear(0x13B2, 0x0F50);
    UO.SetClassMask("DTMH", Gear(leather, staves), chain);
    UO.SetClassMask("охотник", bows);
    UO.SetClassMask("тяжёлый", plate);
    var priority = "охотник|DTMH|тяжёлый";
    var enemy = UO.AttackNearest(5, 12, -1, 8, true, -1, priority, true, true);
    if (Truth(enemy != 0))
    {
        UO.AddObject("priority_enemy", enemy);
    }

    return null;
}

dynamic Gear(params dynamic[] values)
{
    return values;
}

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.AttackNearest(notoriety) — UO.AttackNearest(Any)

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

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

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

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

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

values => new InjectionValue(CompactAttackNearest(values))

UO.AttackNearest(notoriety, distance) — UO.AttackNearest(Any,Any)

Параметри: notoriety (Any), distance (Any)

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

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

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

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

values => new InjectionValue(CompactAttackNearest(values))

UO.AttackNearest(notoriety, distance, body) — UO.AttackNearest(Any,Any,Any)

Параметри: notoriety (Any), distance (Any), body (Any)

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

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

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

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

values => new InjectionValue(CompactAttackNearest(values))

UO.AttackNearest(notoriety, distance, body, maxZ) — UO.AttackNearest(Any,Any,Any,Any)

Параметри: notoriety (Any), distance (Any), body (Any), maxZ (Any)

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

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

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

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

values => new InjectionValue(CompactAttackNearest(values))

UO.AttackNearest(notoriety, distance, body, maxZ, nearest) — UO.AttackNearest(Any,Any,Any,Any,Any)

Параметри: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any)

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

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

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

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

values => new InjectionValue(CompactAttackNearest(values))

UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color) — UO.AttackNearest(Any,Any,Any,Any,Any,Any)

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

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

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

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

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

values => new InjectionValue(CompactAttackNearest(values))

UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask) — UO.AttackNearest(Any,Any,Any,Any,Any,Any,Any)

Параметри: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any), classMask (Any)

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

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

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

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

values => new InjectionValue(CompactAttackNearest(values))

UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly) — UO.AttackNearest(Any,Any,Any,Any,Any,Any,Any,Any)

Параметри: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any), classMask (Any), aliveOnly (Any)

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

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

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

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

values => new InjectionValue(CompactAttackNearest(values))

UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly, visibleOnly) — UO.AttackNearest(Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметри: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any), classMask (Any), aliveOnly (Any), visibleOnly (Any)

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

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

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

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

values => new InjectionValue(CompactAttackNearest(values))

UO.BandageSelf

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

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

void UO.BandageSelf();

Ставить персонажа як UO.Wait-target і використовує на собі бинт типу 0x0E21, вибраний з рюкзака. Операція надсилається клієнтом і виконується сервером асинхронно.

Параметри

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

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

void. Метод не повертає статус лікування та не чекає завершення бинтування.

Поведінка

  • Runtime ставить мету Self, потім шукає в рюкзаку найближчий відповідний предмет типу 0x0E21 з будь-яким hue і використовує його. Якщо бинт не знайдено, пошук повідомляє про це системний журнал; результат пошуку не повертається скрипту, що викликає. Можливість та результат лікування залежать від серверного стану персонажа.

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

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

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

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

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

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

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

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

  • Одноразово використати знайдений у рюкзаку бинт на собі.
UO.BandageSelf();

2. Спочатку перевірити з'єднання, потім відправити дію; виклик не чекає на закінчення лікування. - Функція сценарію

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

  • Спочатку перевірити з'єднання, потім відправити дію; виклик не чекає на закінчення лікування.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Connected()))
    {
        UO.BandageSelf();
    }

    return null;
}

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

3. Процедура тільки надсилає використання бинта і не повідомляє про успіх лікування. - Клас сценарію

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

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

     public object? RunScenario()
    {
        ApplyBandage();
        return null;
    }

    void ApplyBandage()
    {
        UO.BandageSelf();
    }
}

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

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

UO.BandageSelf() — UO.BandageSelf()

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

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

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

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

public void BandageSelf()

        {

            var foundBandages = FindType(new InjectionValue(0x0e21), new InjectionValue(0), new InjectionValue("my"));

            if (foundBandages != string.Empty)

            {

                WaitTargetSelf();

                UseObject(foundBandages);

            }

            else

                SystemMessage("No bandages found.");

        }

UO.ClearClassMask

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

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

int UO.ClearClassMask();
int UO.ClearClassMask(object? name);

Видаляє одне правило екіпіровки або всі правила поточного скриптового runtime. Корисно перед переналаштуванням наборів або вимкненням тимчасового пріоритету.

Параметри

  • name — Необов'язкове ім'я, передане SetClassMask. Реєстр не важливий. Без аргументів видаляються всі правила цього runtime. Це не ряд пріоритетів: "mage|tank" тут неприпустимо; видаляйте по одному або викличте без аргументів.

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

int – кількість віддалених правил. З ім'ям 1 означає видалено, 0 — такого правила не було. Без аргументів повертається 0..N, не логічний прапор. Тому загальний результат порівнюйте з > 0, а чи не з true.

Поведінка

  • Не скасовує вже відправлену атаку та не зупиняє скрипт. Не змінює екіпірування персонажів.
  • Після видалення ім'я залишається невідомим для наступного AttackNearest. Видаліть його також із classMask або зареєструйте знову; невідоме ім'я блокує весь вибір.
  • Чужі runtime та їхні правила не торкаються. Для звичайного пошуку без класів використовуйте classMask=-1, а не порожній набір обов'язкового одягу.

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

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

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

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

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

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

1. Видалити тимчасовий клас і використати прямий скрипт.

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

  • Вилучення не перемикає зброю та не завершує бій. Воно змінює лише подальшу класифікацію.
UO.SetClassMask("временный", 0x13B2);
UO.SetClassMask("основной", 0x1415);
UO.ClearClassMask("временный");
var enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "основной", true, true);
if (Truth(enemy != 0))
{
    UO.AddObject("main_enemy", enemy);
}

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

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

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

  • removed – кількість віддалених правил. Новий набір створюється у тому ж runtime, без перезапуску клієнта.
return  RunScenario();
 object? RunScenario()
{
    UO.SetClassMask("старый_набор", 0x13B2);
    var removed = UO.ClearClassMask();
    UO.SetClassMask("новый_набор", 0x0F50);
    var enemy = UO.AttackNearest(5, 8, -1, 4, true, -1, "новый_набор", true, true);
    if (Truth(enemy != 0))
    {
        UO.AddObject("new_enemy", enemy);
    }

    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. Скинути правила та перейти до звичайної найближчої мети – клас сценарію

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

  • Не передавайте дистанційне ім'я: результат був би 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()
    {
        UO.SetClassMask("по_одежде", 0x13C4);
        UO.ClearClassMask();
        var classes = -1;
        var enemy = UO.AttackNearest(5, 5, -1, 4, true, -1, classes, true, true);
        if (Truth(enemy != 0))
        {
            UO.AddObject("enemy_without_classes", enemy);
        }

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

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

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

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

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

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

args => new InjectionValue(ClearClassMask(null))

UO.ClearClassMask(name) — UO.ClearClassMask(Any)

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

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

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

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

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

args => new InjectionValue(ClearClassMask(ReadClassName(args[0])))

UO.GetAbilityID

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

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

int UO.GetAbilityID(object? abilityName);

Дозволяє ім'я здатності зброї або числовий рядок у ID каталогу клієнта.

Параметри

  • abilityName — string: ім'я AbilityData, ім'я enum Ability або десятковий ID. Прогалини/пунктуація видаляються при порівнянні імен, регістр не враховується.

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

int 1..AbilityData.Abilities.Length - відома здатність; 0 — невідоме ім'я, порожній нормалізований рядок або числовий ID поза каталогом.

Поведінка

  • ResolveClassicUOAbilityId спочатку розбирає десятковий int, потім порівнює нормалізовані імена каталогу та enum. Команда не активує здатність та не перевіряє відповідність поточній зброї.

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

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

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

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

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

var result = UO.GetAbilityID("Armor Ignore");
UO.Print("GetAbilityID: " + Convert.ToString(result));

1. Дозволити ім'я – прямий скрипт

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

  • Число позначає ID каталогу, а не застосування можливості.
var id = UO.GetAbilityID("Armor Ignore");
UO.Print(Convert.ToString(id));

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

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

  • Рядок 1 проходить числовий шлях резолвера.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetAbilityID("1");
    UO.Print(Convert.ToString(id));
    return null;
}

3. Невідоме ім'я – клас сценарію

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

  • Відсутнє ім'я повертає 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 id = UO.GetAbilityID("unknown-example-ability");
        UO.Print(Convert.ToString(id));
        return null;
    }
}

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

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

UO.GetAbilityID(abilityName) — UO.GetAbilityID(String)

Параметри: abilityName (String)

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

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

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

public int GetAbilityID(string abilityName) => bridge.ResolveAbility(abilityName);

UO.GetAbilityName

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

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

string UO.GetAbilityName(object? abilityId);

Повертає ім'я здатності зброї за її ID каталогу.

Параметри

  • abilityId — int: індексація ID починається з 1; bridge читає AbilityData.Abilities[abilityId-1].

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

string імені каталогу. Для ID менше 1 або більше довжини каталогу повертається порожній рядок.

Поведінка

  • Читання локальне та не активує здатність. ID каталогу не означає, що здатність присутня у поточної зброї.

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

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

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

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

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

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

1. Перше ім'я – прямий скрипт

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

  • ID 1 відповідає першому елементу каталогу.
var name = UO.GetAbilityName(1);
UO.Print(name);

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

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

  • Ім'я повертається по ID, знайденому резолвером.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetAbilityID("Armor Ignore");
    if (Truth(id > 0))
    {
        UO.Print(UO.GetAbilityName(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. Невірний ID - клас сценарію

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

  • ID 0 повертає рядок довжини 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 name = UO.GetAbilityName(0);
        UO.Print(Convert.ToString(Len(name)));
        return null;
    }

    int Len(object? value) => Convert.ToString(value)?.Length ?? 0;
}

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

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

UO.GetAbilityName(abilityId) — UO.GetAbilityName(Integer)

Параметри: abilityId (Integer)

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

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

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

public string GetAbilityName(int abilityId) => bridge.GetAbilityName(abilityId);

UO.GetActiveAbility

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

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

dynamic UO.GetActiveAbility();

Читає ім'я активованої бойової здатності свого персонажа.

Параметри

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

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

string - англійське ім'я активованої здібності, наприклад Armor Ignore. Рядок "0", якщо жодна здатність не активована або персонаж відсутня. Це не int 0, не ID здібності та не підтвердження успішного удару.

Поведінка

  • Читаються прапори PrimaryAbility/SecondaryAbility поточного персонажа. Якщо обидва активні, вибирається первинна здатність. Прапор активності виключається із номера перед пошуком імені.
  • Дані читаються локально; сам getter не активує здатність і не витрачає ману. Після атаки сервер може зняти активацію.

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

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

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

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

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

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

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

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

  • Аргументів немає; читається символ поточного клієнта.
  • За відсутності активації друкується рядок 0.
var name = UO.GetActiveAbility();
UO.Print(name);

2. Активувати первинну здатність лише за відсутності активної – функція сценарію

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

  • Порівняння виконується з рядком 0. UsePrimaryAbility викликається окремо.
  • Це запит активації, а чи не доказ успішного удару. Доступність залежить від зброї та правил сервера.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.GetActiveAbility() == "0"))
    {
        UO.UsePrimaryAbility();
    }

    return null;
}

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

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

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

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

     public object? RunScenario()
    {
        var name = UO.GetActiveAbility();
        if (Truth(name != "0"))
        {
            var id = UO.GetAbilityID(name);
            UO.Print("Ability ID: " + Convert.ToString(id));
        }

        return null;
    }

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

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

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

UO.GetActiveAbility() — UO.GetActiveAbility()

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

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

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

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

case "getactiveability": return new InjectionValue(bridge.GetActiveAbility());

UO.GetWeaponAbilities

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

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

dynamic UO.GetWeaponAbilities();

Bridge читає Player.Abilities, застосовує ((byte) value & 0x7F), зберігає позитивні ID у вихідному порядку.

Параметри

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

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

Array позитивних int ID здібностей поточної зброї. Старший прапор 0x80 знято; нульові значення виключено. Без Player – порожній масив.

Поведінка

  • Bridge читає Player.Abilities, застосовує ((byte)value & 0x7F), зберігає позитивні ID у вихідному порядку. Повертає доступні ID, а не факт активного режиму та не імена.
  • Читає поточний локальний стан. Пакету, target та автоматичного оновлення немає; окремі читання можуть бачити різні стани.

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

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

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

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

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

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

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

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

  • Bridge читає Player.Abilities, застосовує ((byte) value & 0x7F), зберігає позитивні ID у вихідному порядку.
var abilities = UO.GetWeaponAbilities();
UO.Print(UO.GetArrayLength(abilities));

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

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

  • Bridge читає Player.Abilities, застосовує ((byte)value & 0x7F), зберігає позитивні ID у вихідному порядку. Повертає доступні ID, а не факт активного режиму та не імена.
return  RunScenario();
 object? RunScenario()
{
    var abilities = UO.GetWeaponAbilities();
    if (Truth(UO.GetArrayLength(abilities) > 0))
    {
        UO.Print(UO.GetAbilityName(abilities[0]));
    }

    return null;
}

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

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

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

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

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

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

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

UO.GetWeaponAbilities() — UO.GetWeaponAbilities()

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

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

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

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

public InjectionValue GetWeaponAbilities() => new InjectionValue(

            (bridge.GetWeaponAbilities() ?? Array.Empty<int>()).Select(value => new InjectionValue(value)).ToArray());

UO.IsWarMode

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

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

int UO.IsWarMode(object? objID);

Перевіряє бойову стійку mobile.

Параметри

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

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

int 1 — завантажений mobile має ознаку InWarMode. int 0 — ознака відсутня, об'єкт не є mobile, невідомий чи видалений. Не повідомляє, кого атакує персонаж і не включає бойовий режим. Читання чужого режиму обмежено отриманими від сервера даними.

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

Поведінка

  • Читається локальна модель клієнта; запитів серверу, очікування та переміщення немає.
  • Результат відноситься до моменту читання. Після UO.Wait або іншої дії об'єкт та його прапори можуть змінитися.
  • Не повідомляє, кого атакує персонаж і не включає бойовий режим. Читання чужого режиму обмежено отриманими від сервера даними.

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

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

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

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

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

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

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

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

  • Аргумент self явно вибирає свого персонажа. state — лише 1/0.
  • Не повідомляє, кого атакує персонаж і не включає бойовий режим. Читання чужого режиму обмежено отриманими від сервера даними.
var state = UO.IsWarMode("self");
if (Truth(state))
{
    UO.Print("Combat stance is active");
}
else
{
    UO.Print("Combat stance is inactive");
}

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

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

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

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

    return null;
}

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

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

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

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

    async public Task<object?> RunScenarioAsync()
    {
        var target = UO.GetSerial("lasttarget");
        if (Truth(UO.IsNPC(target)))
        {
            var before = UO.IsWarMode(target);
            await Delay(500);
            if (Truth(UO.IsNPC(target)))
            {
                var after = UO.IsWarMode(target);
                if (Truth(before != after))
                {
                    UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
                }
            }
            else
            {
                UO.Print("Mobile left the local world");
            }
        }

        return null;
    }

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

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

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

UO.IsWarMode(objID) — UO.IsWarMode(Any)

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

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

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

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

case "iswarmode": return new InjectionValue(arguments.Length > 0 ? bridge.IsWarMode(Arg(0)) : WarMode());

UO.LastAttack

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

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

dynamic UO.LastAttack();

Читає serial останньої мети атаки.

Параметри

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

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

int - збережений serial; 0 означає, що serial не встановлено. Це не bool та не graphic/type; ненульовий ID може вже бути відсутнім у світі.

Поведінка

  • Джерело поля: bridge. LastAttack. Команда не вибирає, не використовує та не атакує об'єкт.
  • Читає поточний локальний стан. Пакету, target та автоматичного оновлення немає; окремі читання можуть бачити різні стани.

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

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

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

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

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

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

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

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

  • Читає serial останньої мети атаки.
var id = UO.LastAttack();
UO.Print(Hex(id));

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

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

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

  • Джерело поля: bridge. LastAttack. Команда не вибирає, не використовує та не атакує об'єкт.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.LastAttack();
    if (Truth(id != 0) && Truth(UO.Exists(id)))
    {
        UO.Print(UO.GetName(id));
    }

    return null;
}

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

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

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

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

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

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

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

UO.LastAttack() — UO.LastAttack()

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

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

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

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

case "lastattack":

                case "wartargetid": return new InjectionValue(bridge.LastAttack);

UO.SetClassMask

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

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

int UO.SetClassMask(object? name, object? required);
int UO.SetClassMask(object? name, object? required, object? forbidden);

Створює або замінює власний клас екіпірування для classMask в UO.AttackNearest. Ви вибираєте ім'я та graphic/type речей; вбудовані назви професій не потрібні.

Параметри

  • name — Непустий рядок з вашою назвою, наприклад "DTMH", "моя_група", "арчер_з_щитом". Регістр не важливий, прогалини по краях забираються. | , ; заборонено: це роздільники пріоритетів. any/all/-1 зарезервовані для відключення фільтра.
  • required — Один type, плоский масив альтернатив або масив обов'язкових груп. Кожна група - type або плоский масив. Потрібна хоча б одна річ із кожної групи; порожні обов'язкові групи неприпустимі. Кожен type — int/числовий/hex-рядок 1..65534. Вкладеність глибше за масив груп не приймається. Це graphic речей, не serial і не body персонажа.
  • forbidden — необов'язковий type або плоский масив заборонених типів. За замовчуванням заборонених речей немає; порожній масив також дозволено. Якщо будь-яка така річ одягнена, правило не збігається. Ті самі межі 1..65534; -1/any тут не приймаються. Цілком забороняти всі альтернативи обов'язкової групи не можна.

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

int 1 — правило перевірено та записано. Помилковий тип/ім'я/порожня обов'язкова група/суперечність викликає помилку скрипта, яку можна перехопити try/CATCH; колишнє правило зберігається. Чи не повертає serial або знайдених персонажів, не починає атаку.

Поведінка

  • Ім'я — мітка користувача, а не серверна професія. Можна назвати правило DTMH, мою групу або будь-яким іншим словом. Двигун не визначає навички/клас на сервері на ім'я персонажа.
  • Required один type або плоский масив означає хоча б одну річ зі списку. Масив груп означає: потрібна хоча б одна річ із КОЖНОЇ групи. Наприклад [шкіра, палиці] вимагає шкіру І палицю. Це набір альтернатив, а не вимога одягнути весь перерахований гардероб.
  • Будь-яка одягнена річ з forbidden виключає персонажа з цього правила, навіть у виконаних required. Шкіра плюс заборонений chain не проходить правило шкіри. Інші правила продовжують перевірятись.
  • Враховуються лише завантажені речі, одягнені на шарах 1..24 крім рюкзака 21. Вміст рюкзака/скрині, маунт 25, магазин 26..28 та банк 29 не вважаються одягом. Порівнюється graphic/type; serial, ім'я та hue речі тут не використовуються.
  • Список без завантаженого відповідного екіпірування не збігається. Відсутність забороненої речі в локальних даних не доводить її відсутність на сервері, якщо сервер ще не надіслав екіпірування. Клієнт не вгадує приховані дані.
  • Правила належать одному runtime скрипту, включаючи його функції та Include; не передаються іншим самостійним запускам та не зберігаються у профіль. При новому запуску визначте їх знову, наприклад, загальною процедурою налаштування. Повторний SetClassMask замінює правило з тим самим ім'ям тільки після повної перевірки нових даних.
  • Масиви копіюються під час реєстрації. Зміна вихідного масиву не змінює правило: повторіть SetClassMask. Кілька правил, що збіглися, дозволяються порядком імен в classMask. Жодних стандартних таблиць одягу сервера немає.

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

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

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

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

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

var result = UO.SetClassMask("simple_sword", 0x0F5E);
UO.Print("SetClassMask: " + Convert.ToString(result));

1. DTMH: своя шкіра без chain - прямий скрипт

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

  • DTMH — лише ваше ім'я. Значення в myLeather/forbiddenChain — приклади: замініть/доповніть реальними graphic вашого сервера. Плоский список означає OR, а не повний комплект.
var myLeather = Gear(0x13C4, 0x13C7);
var forbiddenChain = Gear(0x13BF, 0x13C0);
UO.SetClassMask("DTMH", myLeather, forbiddenChain);
var enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "DTMH", true, true);
if (Truth(enemy != 0))
{
    UO.AddObject("leather_enemy", enemy);
}

dynamic Gear(params dynamic[] values)
{
    return values;
}

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

2. Свої назви, свої речі та порядок атаки – функція сценарію

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

  • Спочатку вибирається DTMH; тільки якщо підходящих DTMH немає - важкий, потім мисливець. DTMH на 10 клітинах має пріоритет над важким на 2 клітинах. Для зворотного порядку поміняйте рядок classMask. З двох DTMH вибирається найближчий.
  • Gear — повністю наведена функція користувача C#, не окрема команда UO. Два масиву Gear(leather, staves) утворюють дві обов'язкові групи. Додавання типу у leather розширює альтернативи; не вимагає вдягати дві шкіряні речі.
return  RunScenario();
 object? RunScenario()
{
    var leather = Gear(0x13C4, 0x13C7);
    var staves = Gear(0x0DF0, 0x0E81);
    var chain = Gear(0x13BF, 0x13C0);
    var plate = Gear(0x1415, 0x1411);
    var bows = Gear(0x13B2, 0x0F50);
    UO.SetClassMask("DTMH", Gear(leather, staves), chain);
    UO.SetClassMask("охотник", bows);
    UO.SetClassMask("тяжёлый", plate);
    var notoriety = "5|6";
    var distance = 12;
    var body = -1;
    var maxZ = 8;
    dynamic nearest = true;
    var color = -1;
    var classMask = "DTMH|тяжёлый|охотник";
    dynamic aliveOnly = true;
    dynamic visibleOnly = true;
    var enemy = UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly, visibleOnly);
    if (Truth(enemy == 0))
    {
        UO.Print("No matching enemy; no attack sent");
        return null;
    }

    UO.AddObject("selected_enemy", enemy);
    return null;
}

dynamic Gear(params dynamic[] values)
{
    return values;
}

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

3. Повний набір обов'язкових типів через оголошення змінної – клас сценарію

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

  • оголошення змінної required[1] створює два елементи з індексами 0 та 1. Дві вкладені групи вимагають torso Та weapon; плоский [torsoType,weaponType] означав би torso АБО weapon.
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()
    {
        dynamic[] required = new dynamic[checked((int)(1) + 1)];
        dynamic[] torso = new dynamic[checked((int)(0) + 1)];
        dynamic[] weapon = new dynamic[checked((int)(0) + 1)];
        torso[0] = 0x13C4;
        weapon[0] = 0x0DF0;
        required[0] = torso;
        required[1] = weapon;
        UO.SetClassMask("мой_комплект", required);
        var enemy = UO.AttackNearest(5, 6, -1, 4, true, -1, "мой_комплект", true, true);
        if (Truth(enemy != 0))
        {
            UO.AddObject("outfit_enemy", enemy);
        }

        return null;
    }

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

4. Змінити одяг у правилі перед наступною атакою – прямий скрипт

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

  • Повторна реєстрація замінює копію правила. Старе ім'я залишається тим самим, тому рядок пріоритетів переписувати не потрібно.
dynamic[] allowed = new dynamic[checked((int)(0) + 1)];
allowed[0] = 0x13B2;
UO.SetClassMask("приоритетный", allowed);
allowed[0] = 0x0F50;
UO.SetClassMask("приоритетный", allowed);
var enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "приоритетный", true, true);
if (Truth(enemy != 0))
{
    UO.AddObject("updated_outfit", enemy);
}

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.SetClassMask(name, required) — UO.SetClassMask(Any,Any)

Параметри: name (Any), required (Any)

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

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

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

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

args => new InjectionValue(SetClassMask(args))

UO.SetClassMask(name, required, forbidden) — UO.SetClassMask(Any,Any,Any)

Параметри: name (Any), required (Any), forbidden (Any)

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

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

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

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

args => new InjectionValue(SetClassMask(args))

UO.SetWarMode

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

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

void UO.SetWarMode(object? value);

Запитує бойовий чи мирний режим персонажа.

Параметри

  • value - 0 - мирний режим; будь-яке ненульове ціле – бойовий режим.

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

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

Поведінка

  • WarMode передає режим у GameActions.ToggleWarMode: 0 вимикає, будь-яке ненульове значення включає. Без Player дії немає.
  • Bridge надсилає запит на ігровому потоці. Діють правила сервера; вбудованого очікування підтвердження немає.

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

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

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

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

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

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

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

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

  • Запитує бойовий чи мирний режим персонажа.
UO.SetWarMode(1);

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

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

  • WarMode передає режим у GameActions.ToggleWarMode: 0 вимикає, будь-яке ненульове значення включає. Без Player дії немає.
return  RunScenario();
 object? RunScenario()
{
    UO.SetWarMode(0);
    return null;
}

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()
    {
        ApplyMode(1);
        return null;
    }

    void ApplyMode(dynamic mode)
    {
        UO.SetWarMode(mode);
    }
}

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

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

UO.SetWarMode(value) — UO.SetWarMode(Any)

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

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

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

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

case "setwarmode": WarMode(Arg(0)); return InjectionValue.Unit;

UO.Specmove

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

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

void UO.Specmove(object? direction);
void UO.Specmove(object? direction, object? running);

Передає один крок кроку безпосередньо bridge.

Параметри

  • direction — int; напрямок & 7 daët 0..7 N, NE,E, SE,S, SW,W, NW.
  • running — Необов'язковий Числовий прапор int: 0/відсутність — ходьба, ненульове — біг.

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

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

Поведінка

  • ExecuteLegacyManualAlias викликає bridge.Step(direction & 7, running != 0) і відкидає весь код результату 0/2/3/4/5/7; назовні повертається void. Це один крок/поворот, не маршрут. Очікування всередині Step до 10000 мс зберігається, але скрипт не отримує коду підтвердження, відмови або тайм-ауту.
  • Гілка не виконує runtime-умови MoveCheckStamina/MoveExitOnDisconnect/MoveOpenDoor з UO.Step. Сам bridge/Player.Walk та сервер все одно перевіряють рух.
  • QueueStep на ігровому потоці перевіряє гравця, з'єднання, напрямок, чергу, темп та локальну прохідність. Перед Player.Walk кожен виклик окремо фіксує покоління Confirm/Deny свого sequence та Walker; потім повертає Result разом із цим знімком. Step і чекаючий StepControlled перевіряють тільки цю збережену пару, а не загальні поля наступного запиту; заміна гравця/Walker припиняє очікування загальною відмовою. Підтвердження іншої чергової команди не підтверджує цього кроку. Поворот без переміщення залишається окремим випадком.

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

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

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

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

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

UO.Print("Calling UO.Specmove");
UO.Specmove(0);

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

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

  • Передає один крок кроку безпосередньо bridge.
UO.Specmove(0);

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

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

  • ExecuteLegacyManualAlias викликає bridge.Step(direction&7,running!=0), потім відкидає повертається 1/0. Це один крок, не шлях до координати.
return  RunScenario();
 object? RunScenario()
{
    UO.Specmove(2, 1);
    return null;
}

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

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

  • Гілка не виконує runtime-умови MoveCheckStamina/MoveExitOnDisconnect/MoveOpenDoor з UO.Step. Сам bridge/Player.Walk та сервер все одно перевіряють рух.

Стандартна швидкість руху

Мінімальний інтервал кроку: пішки — ходьба 400 мс, біг 200 мс; верхи - ходьба 200 мс, біг 100 мс.

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

Кроки, маршрути, Follow, керування мишею/клавішами та карта використовують загальну чергу персонажа. Заміна маршруту, поворот або корекція позиції сервером не скасовують паузу, що залишилася після запиту кроку. Після затримки немає прискореної серії компенсації пропущених кадрів. Очікування підтвердження, перешкоди та поганий зв'язок можуть сповільнити рух.

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.GetX();
        UO.Specmove(2, 0);
        UO.Wait(500);
        UO.Print(UO.GetX() - before);
        return null;
    }
}

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

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

UO.Specmove(direction) — UO.Specmove(Any)

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

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

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

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

case "specmove": bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0); break;

UO.Specmove(direction, running) — UO.Specmove(Any,Any)

Параметри: direction (Any), running (Any)

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

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

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

case "specmove": bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0); break;

UO.UseAbility

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

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

int UO.UseAbility(object? abilityId);

Запитує здатність, доступну поточній зброї.

Параметри

  • abilityId — Ім'я можливості чи int ID 1..AbilityData.Abilities.Length. Імена нормалізуються: зберігаються лише літери/цифри та порівнюються у верхньому регістрі. Числовий текст означає ID.

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

Числовий прапор int: 1 — ID збігся з основною/додатковою здатністю поточного Player і відповідний GameActions викликаний; 0 - немає Player, невідомий ID/ім'я або здатність не належить поточній зброї.

Поведінка

  • Рядкова форма використовує ResolveAbility; числова відразу bridge. UseAbility. Bridge маскує 0x80 у двох поточних здібностей і зіставляє ID, потім викликає UsePrimaryAbility або UseSecondaryAbility.
  • Це прийняття локального запиту, не підтвердження влучення, витрати mana або активації сервером. Доступні ID читаються GetWeaponAbilities, активне ім'я - GetActiveAbility.
  • GameActions перемикає біт вибору здатності 0x80. Вже обрана здатність посилає ID 0 та знімає вибір; інакше очищаються обидва біти вибору, посилається обраний ID, потім локально ставиться його біт. Тому повторний дзвінок може вимкнути здатність. Локальна зміна не означає успішного удару або підтвердження сервера.

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

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

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

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

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

var result = UO.UseAbility("Armor Ignore");
UO.Print("UseAbility: " + Convert.ToString(result));

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

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

  • Запитує здатність, доступну поточній зброї.
UO.Print(UO.UseAbility("Armor Ignore"));

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

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

  • Рядкова форма використовує ResolveAbility; числова відразу bridge. UseAbility. Bridge маскує 0x80 у двох поточних здібностей і зіставляє ID, потім викликає UsePrimaryAbility або UseSecondaryAbility.
return  RunScenario();
 object? RunScenario()
{
    var abilities = UO.GetWeaponAbilities();
    if (Truth(UO.GetArrayLength(abilities) > 0))
    {
        UO.Print(UO.UseAbility(abilities[0]));
    }

    return null;
}

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

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

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

  • Це прийняття локального запиту, не підтвердження влучення, витрати mana або активації сервером. Доступні ID читаються GetWeaponAbilities, активне ім'я - GetActiveAbility.
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.GetAbilityID("Armor Ignore");
        if (Truth(id > 0))
        {
            var accepted = UO.UseAbility(id);
            UO.Print(accepted);
            UO.Print(UO.GetActiveAbility());
        }

        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.UseAbility(abilityId) — UO.UseAbility(Integer)

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

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

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

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

public int UseAbility(int abilityId) => bridge.UseAbility(abilityId);

UO.UseAbility(abilityId) — UO.UseAbility(String)

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

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

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

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

public int UseAbility(string abilityName)

        {

            int abilityId = bridge.ResolveAbility(abilityName);

            return abilityId > 0 ? bridge.UseAbility(abilityId) : 0;

        }

UO.UsePrimaryAbility

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

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

void UO.UsePrimaryAbility();

Викликає основну здатність зброї.

Параметри

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

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

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

Поведінка

  • UsePrimaryAbility передає GameActions.UsePrimaryAbility(_world) через Invoke. Повертається ознаки прийняття немає; активна здатність перевіряється окремо.
  • У прикладах UO.Wait задає лише паузу скрипта; закінчення паузи не доводить виконання запиту сервером.
  • GameActions перемикає біт вибору здатності 0x80. Вже обрана здатність посилає ID 0 та знімає вибір; інакше очищаються обидва біти вибору, посилається обраний ID, потім локально ставиться його біт. Тому повторний дзвінок може вимкнути здатність. Локальна зміна не означає успішного удару або підтвердження сервера.

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

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

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

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

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

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

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

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

  • Викликає основну здатність зброї.
UO.UsePrimaryAbility();

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

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

  • UsePrimaryAbility передає GameActions.UsePrimaryAbility(_world) через Invoke. Повертається ознаки прийняття немає; активна здатність перевіряється окремо.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.GetWeaponAbilities());
    UO.UsePrimaryAbility();
    return null;
}

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

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

  • У прикладах UO.Wait задає лише паузу скрипта; закінчення паузи не доводить виконання запиту сервером.
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.UsePrimaryAbility();
        UO.Print(UO.GetActiveAbility());
        return null;
    }
}

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

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

UO.UsePrimaryAbility() — UO.UsePrimaryAbility()

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

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

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

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

case "useprimaryability": bridge.UsePrimaryAbility(); return InjectionValue.Unit;

UO.UseSecondaryAbility

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

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

void UO.UseSecondaryAbility();

Викликає додаткову здатність до зброї.

Параметри

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

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

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

Поведінка

  • UseSecondaryAbility передає GameActions.UseSecondaryAbility(_world) через Invoke. Повертається ознаки прийняття немає; активна здатність перевіряється окремо.
  • У прикладах UO.Wait задає лише паузу скрипта; закінчення паузи не доводить виконання запиту сервером.
  • GameActions перемикає біт вибору здатності 0x80. Вже обрана здатність посилає ID 0 та знімає вибір; інакше очищаються обидва біти вибору, посилається обраний ID, потім локально ставиться його біт. Тому повторний дзвінок може вимкнути здатність. Локальна зміна не означає успішного удару або підтвердження сервера.

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

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

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

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

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

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

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

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

  • Викликає додаткову здатність до зброї.
UO.UseSecondaryAbility();

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

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

  • UseSecondaryAbility передає GameActions.UseSecondaryAbility(_world) через Invoke. Повертається ознаки прийняття немає; активна здатність перевіряється окремо.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.GetWeaponAbilities());
    UO.UseSecondaryAbility();
    return null;
}

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

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

  • У прикладах UO.Wait задає лише паузу скрипта; закінчення паузи не доводить виконання запиту сервером.
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.UseSecondaryAbility();
        UO.Print(UO.GetActiveAbility());
        return null;
    }
}

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

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

UO.UseSecondaryAbility() — UO.UseSecondaryAbility()

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

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

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

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

case "usesecondaryability": bridge.UseSecondaryAbility(); return InjectionValue.Unit;

UO.WarMode

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

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

int UO.WarMode();
void UO.WarMode(object? mode);

Читає чи запитує бойовий режим персонажа.

Параметри

  • mode — Необов'язковий int: 0 вимикає, будь-яке ненульове значення включає. Форма без аргументів лише читає.

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

Без аргументів Числовий прапор "int": "1" - поточний Player в бойовому режимі, "0" - мирний режим/ні Player. З mode - null, результату немає.

Поведінка

  • WarMode() читає Player.InWarMode локально. WarMode(mode) викликає GameActions.ToggleWarMode з вибраним режимом; без Player запит не виконується.
  • Не надавайте результат форми з аргументом змінної. Негайне повторне читання не є підтвердженням мережі.

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

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

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

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

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

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

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

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

  • Читає чи запитує бойовий режим персонажа.
var active = UO.WarMode();
UO.Print(active);

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

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

  • WarMode() читає Player.InWarMode локально. WarMode(mode) викликає GameActions.ToggleWarMode з вибраним режимом; без Player запит не виконується.
return  RunScenario();
 object? RunScenario()
{
    UO.WarMode(1);
    UO.Wait(250);
    UO.Print(UO.WarMode());
    return null;
}

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

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

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

     public object? RunScenario()
    {
        var before = UO.WarMode();
        UO.WarMode(0);
        UO.Print(before);
        return null;
    }
}

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

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

UO.WarMode() — UO.WarMode()

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

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

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

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

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

UO.WarMode(mode) — UO.WarMode(Integer)

Параметри: mode (Integer)

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

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

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

public void WarMode(int mode) => bridge.WarMode(mode);

UO.WarTargetID

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

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

dynamic UO.WarTargetID();

Читає serial останньої мети атаки.

Параметри

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

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

int - збережений serial; 0 означає, що serial не встановлено. Це не bool та не graphic/type; ненульовий ID може вже бути відсутнім у світі.

Поведінка

  • Джерело поля: bridge. LastAttack. Команда не вибирає, не використовує та не атакує об'єкт.
  • Читає поточний локальний стан. Пакету, target та автоматичного оновлення немає; окремі читання можуть бачити різні стани.

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

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

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

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

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

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

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

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

  • Читає serial останньої мети атаки.
var id = UO.WarTargetID();
UO.Print(Hex(id));

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

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

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

  • Джерело поля: bridge. LastAttack. Команда не вибирає, не використовує та не атакує об'єкт.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.WarTargetID();
    if (Truth(id != 0) && Truth(UO.Exists(id)))
    {
        UO.Print(UO.GetName(id));
    }

    return null;
}

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

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

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

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

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

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

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

UO.WarTargetID() — UO.WarTargetID()

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

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

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

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

case "lastattack":

                case "wartargetid": return new InjectionValue(bridge.LastAttack);

Clone this wiki locally