Skip to content

UO Topic magic

Codex edited this page Oct 11, 2026 · 7 revisions

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

Магія

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

Застосування заклинань і магічних здібностей та подорожі за допомогою магії. Для заклинання з ціллю підготуйте вибір цілі й перевірте необхідні умови.

Заклинання: всі назви та номери

Відкрити повний каталог та приклади

Розділи

Тема Команди та пояснення
Застосування заклинання UO.Cast
Заклинання на об’єкт UO.CastToObject
Магічна здібність UO.CastAbility
Активна здібність UO.IsActiveSpellAbility
Таймери заклинань UO.TicksSpell

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

Застосування заклинань

UO.Cast · UO.CastToObject · UO.CastAbility · UO.IsActiveSpellAbility · UO.TicksSpell

Подорожі

UO.AddRecall · UO.AddGate

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

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

UO.Cast

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

UO.CancelWaitTarget();
if (Truth(UO.Cast("Cure")))
{
    UO.Print("Choose the character with the spell cursor");
}
else
{
    UO.Print("Cure request rejected");
}

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

UO.CastToObject

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

var accepted = UO.CastToObject("Heal", "self");
UO.Print(Convert.ToString(accepted));

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


UO.AddGate

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

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

void UO.AddGate(object? arg0);

Параметри

  • bookSerial — значення-ідентифікатор, яке сумісний скрипт зберігає як запис legacy-списку. У поточному runtime значення серіалізується в рядок; команда не перевіряє наявність об'єкта у світі.

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

void. Команда не підтверджує наявність книги або створення ігрового порталу.

Поведінка

  • Значення додається до списку AddGate поточного стану runtime. У ClassicUO цей compatibility-list не викликає ігрову дію і немає документованого публічного getter для читання.

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

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

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

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

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

UO.Print("Calling UO.AddGate");
UO.AddGate("0x40012345");

1. Зберегти ідентифікатор як legacy-дані, не відкриваючи ворота. - Прямий скрипт

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

  • Збережіть ідентифікатор як застарілі дані, не відкриваючи ворота.
UO.AddGate("0x40012345");

2. Використовувати значення з рядка передане сумісному скрипту. - Функція сценарію

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

  • Використовувати значення з рядка передане сумісному скрипту.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var bookSerial = "0x40012345";
    UO.AddGate(bookSerial);
    return null;
}

3. Записати значення в runtime-список AddGate. - Клас сценарію

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

  • Записати значення в runtime-список AddGate.
  • Виклик зберігає compatibility-дані; він не використовує книгу у світі.
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()
    {
        RememberGateBook("0x40012345");
        return null;
    }

    void RememberGateBook(dynamic bookSerial)
    {
        UO.AddGate(bookSerial);
    }
}

UO.AddRecall

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

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

void UO.AddRecall(object? arg0);

Параметри

  • bookSerial — значення-ідентифікатор, яке сумісний скрипт зберігає як запис legacy-списку. Runtime серіалізує передане значення у рядок.

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

void. Виклик не повертає результату та не підтверджує наявність книги.

Поведінка

  • Значення додається до списку AddRecall поточного стану runtime. У ClassicUO цей compatibility-list сам не відправляє ігрові команди і не має документованого публічного getter для читання.

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

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

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

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

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

UO.Print("Calling UO.AddRecall");
UO.AddRecall("0x40012345");

1. Зберегти значення як compatibility-дані, не запускати Recall. - Прямий скрипт

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

  • Зберегти значення як compatibility-дані, не запускати Recall.
UO.AddRecall("0x40012345");

2. Надіслати ідентифікатор через рядкову змінну. - Функція сценарію

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

  • Надіслати ідентифікатор через рядкову змінну.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var bookSerial = "0x40012345";
    UO.AddRecall(bookSerial);
    return null;
}

3. Кожен виклик додає окремий запис до AddRecall поточного runtime. - Клас сценарію

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

  • Кожен виклик додає окремий запис до AddRecall поточного runtime.
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()
    {
        UO.AddRecall("0x40012345");
        UO.AddRecall("0x40012346");
        return null;
    }
}

UO.Cast

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

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

int UO.Cast(object? arg0);

Запитує застосування заклинання за назвою. Рівно один параметр: spellName, наприклад UO.Cast("Heal"). Мета вибирається окремо: мишкою прицілом, що з'явився, або через WaitTargetObject перед Cast. Прийняття запиту не підтверджує успішного ефекту.

Параметри

  • spellName - Обов'язковий рядок - англійська назва заклинання в лапках: "Heal", "Cure", "Greater Heal". Імена не перекладаються разом із інтерфейсом. Словник також розпізнає вбудовані аліаси та слова заклинань. Числовий ID, включаючи рядок "29", target, відстань, notoriety, maxZ та очікування не є параметрами Cast. Всі імена та школи.

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

int: 1/true — клієнт прийняв запит; 0/false - назва не розпізнана або запит локально відхилений. Можна писати if UO.Cast("Heal") { ... } або порівнювати з 1/true. Це не ID заклинання та не підтвердження лікування/урону. Відсутній чи зайвий аргумент викликає помилку. Приціл та завершення заклинання команда не чекає.

Поведінка

  • Єдина форма: UO.Cast(spellName). Другого та наступних аргументів немає. Пошук мети, підготовка відповіді, очікування та очищення виконуються окремими командами.
  • Для ручного вибору очистіть колишню чергу CancelWaitTarget, викличте Cast і клацніть потрібний об'єкт прицілом. Сам Cast черга не очищає: сценарій міг підготувати її наперед.
  • Для автоматичної мети спочатку викличте WaitTargetObject(serial/аліас), потім Cast(name). Такий порядок дозволяє відповісти на швидкий сервер сервера. Для заклинань без прицілу відповіді не готуйте.
  • Сервер визначає доступність заклинання, ресурси, допустиму мету, дальність та ефект. Позитивний результат підтверджує лише локальне прийняття запиту.
  • Підготовлена ​​черга може залишитися у разі відмови сервера без прицілу. Видаліть її CancelWaitTarget після обмеженого очікування або локальної відмови. Не запускайте паралельно інші сценарії з target.
  • Прийнятий запит оновлює TicksSpell. Cast не чекає на анімацію, лікування або зміну HP. Каталожний ID пояснює внутрішній протокол, але не замінює назву аргументу.

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

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

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

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

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

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

1. Cure: вибрати мету мишкою — прямий скрипт

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

  • Cure – єдиний аргумент Cast. Після запуску оберіть персонажа ігровим прицілом. Серверну відмову та результат перевіряйте у грі.
UO.CancelWaitTarget();
if (Truth(UO.Cast("Cure")))
{
    UO.Print("Choose the character with the spell cursor");
}
else
{
    UO.Print("Cure request rejected");
}

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

2. Heal: окрема мета на себе – функція сценарію

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

  • self - аргумент WaitTargetObject; Heal – єдиний аргумент Cast. 3000 — три секунди для прицілу у цьому прикладі, не гарантія завершення лікування. Finally видаляє відповідь, що залишилася, і при відмові.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    UO.CancelWaitTarget();
    try
    {
        UO.WaitTargetObject("self");
        if (Truth(UO.Cast("Heal")))
        {
            await Delay(3000);
        }
    }
    finally
    {
        UO.CancelWaitTarget();
    }

    return null;
}

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

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

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

  • spellName, target, cleanupDelayMs — параметри вашої функції CastAtObject, не навантаження UO.Cast. Всередині Cast приймає лише spellName. ASC переводить рядковий ID до числа; 4000 - затримка очищення черги. true означає прийняття запиту, що не успіх лікування.

Spells / Заклинання

Spells / Заклинання

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 = Asc(UO.GetSerial("lasttarget"), 0);
        if (Truth(await CastAtObject("Greater Heal", target, 4000)))
        {
            UO.Print("Request sent; verify healing in the game");
        }

        return null;
    }

    async Task<dynamic> CastAtObject(dynamic spellName, dynamic target, dynamic cleanupDelayMs)
    {
        if (!(Truth(UO.Connected())) || Truth(UO.Dead()) || Truth(target <= 0) || !(Truth(UO.Exists(target))))
        {
            return false;
        }

        dynamic accepted = false;
        UO.CancelWaitTarget();
        try
        {
            UO.WaitTargetObject(target);
            accepted = UO.Cast(spellName);
            if (Truth(accepted))
            {
                await Delay(cleanupDelayMs);
            }
        }
        finally
        {
            UO.CancelWaitTarget();
        }

        return accepted;
    }

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

    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;
}

UO.CastAbility

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

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

int UO.CastAbility(object? arg0);

Перемикає вибрану здатність поточної зброї через UseAbility: повторний виклик вже вибраної здатності знімає вибір.

Параметри

  • abilityName — Назва здібності або числовий рядок, що дозволяється ResolveClassicUOAbilityId; невідоме значення дає 0.
  • abilityId — int від 1 до довжини каталогу AbilityData.Abilities; Здатність повинна збігатися з першим або вторинним поточним персонажем.

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

int 1 - клієнт викликав поточну primary/secondary здатність; 0 — немає персонажа, невідомий ID або здатність не відповідає поточній зброї.

Поведінка

  • 1 описує прийняття клієнтського запиту, а чи не успішний удар чи списання ресурсів сервером. ID, який не є поточною primary/secondary здатністю, повертає 0 навіть якщо є в каталозі.
  • GameActions.UsePrimaryAbility/UseSecondaryAbility перевіряють біт 0x80. При вимкненому биті знімають інший вибір та відправляють обрану здатність; при вже увімкненому відправляють ID 0 для відключення. Потім перемикають біт. Повернення 1 підтверджує виклик цієї клієнтської гілки, включаючи вимкнення.

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

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

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

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

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

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

1. Дозволити ім'я здібності - прямий скрипт

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

  • Наявність у каталозі окремо від відповідності зброї.
var id = UO.GetAbilityID("Armor Ignore");
if (Truth(id > 0))
{
    var accepted = UO.CastAbility(id);
    UO.Print(Convert.ToString(accepted));
}

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

2. Виклик на ім'я — функція сценарію

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

  • Ім'я дозволяється в ID та перевіряється проти поточної зброї.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var accepted = UO.CastAbility("Armor Ignore");
    UO.Print(Convert.ToString(accepted));
    return null;
}

3. Невірний ID - клас сценарію

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

  • Нуль знаходиться поза каталогом і повертає 0 без активації.

Spells / Заклинання

Spells / Заклинання

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 accepted = UO.CastAbility(0);
        UO.Print(Convert.ToString(accepted));
        return null;
    }
}

UO.CastToObject

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

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

dynamic UO.CastToObject(object? arg0, object? arg1);

Ставить очікувану об'єктну мету і відправляє заклинання на ім'я або числове ID.

Параметри

  • SpellName - string з ім'ям заклинання, у тому числі underscore замість пробілу, або числовий ID для bridge.Cast.
  • ObjID — Serial об'єкта або підтримуване ім'я self/backpack/lasttarget/збереженого об'єкта; числові рядки та 0x-рядки дозволяються runtime.

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

int/логічний результат 1 - клієнт прийняв запит Cast; 0 — запит відхилено. Успіх заклинання сервером не підтверджується.

Поведінка

  • Рядкова форма йде через CastAtTarget; числова форма ставить WaitTargetObject, потім bridge.Cast. При відмові Cast скасовується очікувана мета. При прийнятті оновлюється ticksSpell.
  • Bridge відхиляє непозитивний spellId, відсутність з'єднання та мертвого персонажа. Таймер відзначає відправлення, а чи не закінчення кастування; Результат впливу об'єкт залежить від сервера.

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

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

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

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

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

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

1. Лікувати себе – прямий скрипт

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

  • Heal ставить self метою наступного серверного курсору.
var accepted = UO.CastToObject("Heal", "self");
UO.Print(Convert.ToString(accepted));

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

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

  • Числова форма передає ID 4 клієнту; 1 означає надсилання запиту.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var accepted = UO.CastToObject(4, UO.Self());
    UO.Print(Convert.ToString(accepted));
    return null;
}

3. Перевірити вибраний об'єкт — клас сценарію

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

  • Локальна перевірка існування допомагає не використовувати відсутній lasttarget.

Spells / Заклинання

Spells / Заклинання

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.LastTarget();
        if (Truth(UO.Exists(target)))
        {
            var accepted = UO.CastToObject("Greater Heal", target);
            UO.Print(Convert.ToString(accepted));
        }

        return null;
    }

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

UO.IsActiveSpellAbility

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

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

dynamic UO.IsActiveSpellAbility(object? arg0);

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

Параметри

  • SpellName — Єдиний обов'язковий параметр: англійське ім'я з каталогу заклинань або цілий ID. Наприклад, "Confidence" і 402 позначають одне заклинання Bushido. Регістр не важливий, підкреслення імені замінюються пробілами. Числовий рядок також розпізнається. Не передавайте ID персонажа, type предмета чи номер навички.

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

int: 1 — сервер повідомив активний стан цього ID; 0 — такого активного стану зараз немає. У C# перевіряйте числовий результат: if (UO.IsActiveSpellAbility(402) != 0) { ... }. Це логічний ознака, а чи не кількість, час чи результат останнього каста. Невідоме ім'я, ID поза 1…65535 і відсутність отриманого стану теж дають 0.

Поведінка

  • Список оновлює пакет сервера 0xBF/0x25: увімкнення додає ID, вимкнення прибирає. Працює без графічного вікна та без кнопки заклинання на екрані. Закриття вікна зберігає стан; розрив з'єднання очищує його. Відповідь 0 не доводить, що персонаж не здатний використовувати заклинання. Сервер має надсилати цей статус; це універсальна перевірка всіх баффів. Для миттєвих Heal/Recall такий приклад не підтверджує успішного касту. Тривалість, мана, доступність і успіх заклинання цією командою, що залишилася, не визначаються.

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

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

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

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

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

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

1. Перевірка стану за ID — прямий скрипт

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

  • 402 — ID Confidence. Змінна active містить 1 або 0; true тут еквівалентний 1. Повідомлення описує набутий статус, не результат спроби каста.
var active = UO.IsActiveSpellAbility(402);
if (Truth(Truth(active) == true))
{
    UO.Print("Confidence is active");
}
else
{
    UO.Print("No active Confidence state received");
}

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

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

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

  • "Confidence" - той же ID 402. Cast приймає лише назву. Запит надсилається один раз, якщо активного статусу немає; він не гарантує успіху на сервері. Не запускайте цей фрагмент у швидкому циклі: відповідь сервера може запізнюватися.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    if (Truth(UO.IsActiveSpellAbility("Confidence") == 0))
    {
        UO.Cast("Confidence");
    }

    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. Очікування підтвердження з межею – клас сценарію

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

  • spell - назва або ID; expected - true для включення, false для вимкнення; timeoutMs — межа очікування в мілісекундах. Main чекає до '500' мс з перевірками кожні '25' мс і нічого не кастує. Функція повертає true під час збігу, інакше false. Це обмежене очікування локального стану, що не доказ причини його зміни; фактичний час може збільшитись при паузі скрипту або навантаженні.

Spells / Заклинання

Spells / Заклинання

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()
    {
        if (Truth(WaitAbilityState("Confidence", true, 500)))
        {
            UO.Print("Active state received");
        }
        else
        {
            UO.Print("No active state before timeout");
        }

        return null;
    }

    dynamic WaitAbilityState(dynamic spell, dynamic expected, dynamic timeoutMs)
    {
        var elapsed = 0;
        while (Truth(elapsed < timeoutMs))
        {
            if (Truth((UO.IsActiveSpellAbility(spell) == 1) == expected))
            {
                return true;
            }

            UO.Wait(25);
            elapsed = elapsed + 25;
        }

        return Truth((UO.IsActiveSpellAbility(spell) == 1) == expected);
    }

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

UO.TicksSpell

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

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

int UO.TicksSpell();

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

Параметри

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

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

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

Поведінка

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

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

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

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

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

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

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

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

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

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

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

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

  • Повертає поле ticksSpell. Його оновлює успішно прийнятий Cast/CastAtTarget; це не автоматичне відстеження всіх ручних/серверних дій. Сама команда позначку не змінює.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var stamp = UO.TicksSpell();
    var ageTenths = UO.Timer() - stamp;
    UO.Print(ageTenths);
    return null;
}

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

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

  • UO.Timer() - позначка обчислює вік десятих секунди. Між різними runtime позначки не порівнюються.

Spells / Заклинання

Spells / Заклинання

return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.TicksSpell();
        UO.Wait(250);
        var after = UO.TicksSpell();
        UO.Print(before = after);
        return null;
    }
}

Clone this wiki locally