Skip to content

RU UO Topic magic

Codex edited this page Oct 12, 2026 · 4 revisions

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

Магия

Главная · C# · IDE · UO API · A–Z · Примеры · Языки

Заклинания, способности и перемещение магией. Для направленного действия заранее настройте цель и проверьте условия применения.

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

Открыть полный каталог и примеры

Разделы

Тема Команды и пояснения
Cast UO.Cast
CastToObject UO.CastToObject
CastAbility UO.CastAbility
Active Spell Ability UO.IsActiveSpellAbility
Spell Timers 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? bookSerial);

Параметры

  • 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-данные, не открывая ворота. — прямой скрипт

Параметры и ход выполнения:

  • Сохранить идентификатор как legacy-данные, не открывая ворота.
UO.AddGate("0x40012345");

2. Использовать значение из строки, переданное совместимому скрипту. — функция сценария

Параметры и ход выполнения:

  • Использовать значение из строки, переданное совместимому скрипту.
return  RunScenario();
 object? RunScenario()
{
    var bookSerial = "0x40012345";
    UO.AddGate(bookSerial);
    return null;
}

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

Параметры и ход выполнения:

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

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

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

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.AddGate(bookSerial) — UO.AddGate(Any)

Параметры: bookSerial (Any)

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "adddir":

                case "addfindlist":

                case "addgate":

                case "addrecall":

                case "addstep":

                    LegacyList(name).Add(string.Join("|", arguments.Select(value => value.ToString())));

                    break;

UO.AddRecall

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

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

void UO.AddRecall(object? bookSerial);

Параметры

  • 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  RunScenario();
 object? RunScenario()
{
    var bookSerial = "0x40012345";
    UO.AddRecall(bookSerial);
    return null;
}

3. Каждый вызов добавляет отдельную запись в AddRecall текущего runtime. — класс сценария

Параметры и ход выполнения:

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

     public object? RunScenario()
    {
        UO.AddRecall("0x40012345");
        UO.AddRecall("0x40012346");
        return null;
    }
}

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

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.AddRecall(bookSerial) — UO.AddRecall(Any)

Параметры: bookSerial (Any)

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "adddir":

                case "addfindlist":

                case "addgate":

                case "addrecall":

                case "addstep":

                    LegacyList(name).Add(string.Join("|", arguments.Select(value => value.ToString())));

                    break;

UO.Cast

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

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

int UO.Cast(object? spellName);

Запрашивает применение заклинания по названию. Ровно один параметр: 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;
}

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

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.Cast(spellName) — UO.Cast(String)

Параметры: spellName (String)

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public int Cast(string spellName)

        {

            if (NumberConversions.TryStr2Int((spellName ?? string.Empty).Trim(), out _))

            {

                SystemMessage("UO.Cast: use one spell name, for example UO.Cast(\"Heal\").");

                return 0;

            }

            return CastCore(spellName) ? 1 : 0;

        }

UO.CastAbility

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

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

int UO.CastAbility(object? abilityId);

Переключает выбранную способность текущего оружия через UseAbility: повторный вызов уже выбранной способности снимает выбор.

Параметры

  • abilityId — Название способности или числовая строка, разрешаемая ResolveClassicUOAbilityId; неизвестное значение даёт 0.

Возвращает

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  RunScenario();
 object? RunScenario()
{
    var accepted = UO.CastAbility("Armor Ignore");
    UO.Print(Convert.ToString(accepted));
    return null;
}

3. Неверный ID — класс сценария

Параметры и ход выполнения:

  • Ноль находится вне каталога и возвращает 0 без активации.

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

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

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

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

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.CastAbility(abilityId) — UO.CastAbility(Integer)

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

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

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

UO.CastAbility(abilityId) — UO.CastAbility(String)

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

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public int UseAbility(string abilityName)

        {

            int abilityId = bridge.ResolveAbility(abilityName);

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

        }

UO.CastToObject

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

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

dynamic UO.CastToObject(object? spellName, object? objID);

Ставит ожидающую объектную цель и отправляет заклинание по имени или числовому 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  RunScenario();
 object? RunScenario()
{
    var accepted = UO.CastToObject(4, UO.Self());
    UO.Print(Convert.ToString(accepted));
    return null;
}

3. Проверить выбранный объект — класс сценария

Параметры и ход выполнения:

  • Локальная проверка существования помогает не использовать отсутствующий lasttarget.

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

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

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

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

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.CastToObject(spellName, objID) — UO.CastToObject(Any,Any)

Параметры: spellName (Any), objID (Any)

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "casttoobject":

                    if (arguments[0].Kind == InjectionValueKind.String)

                        return CastAtTarget(arguments[0], arguments[1]) != 0 ? InjectionValue.True : InjectionValue.False;



                    WaitTargetObject(Arg(1));

                    int castAccepted = bridge.Cast(Arg(0));

                    if (castAccepted != 0)

                    {

                        ticksSpell = Timer();

                        return InjectionValue.True;

                    }



                    bridge.CancelTarget();

                    return InjectionValue.False;

UO.IsActiveSpellAbility

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

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

dynamic UO.IsActiveSpellAbility(object? spellName);

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

Параметры

  • 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  RunScenario();
 object? RunScenario()
{
    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  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(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;
}

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

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.IsActiveSpellAbility(spellName) — UO.IsActiveSpellAbility(Any)

Параметры: spellName (Any)

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "isactivespellability":

                {

                    int? spellId = arguments[0].Kind == InjectionValueKind.String

                        ? ConvertSpellName(Text(0).Replace('_', ' '))

                        : (int?)Arg(0);

                    return new InjectionValue(spellId.HasValue ? bridge.IsActiveSpell(spellId.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  RunScenario();
 object? RunScenario()
{
    var stamp = UO.TicksSpell();
    var ageTenths = UO.Timer() - stamp;
    UO.Print(ageTenths);
    return null;
}

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

Параметры и ход выполнения:

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

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

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

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.TicksSpell();
        UO.Wait(250);
        var after = UO.TicksSpell();
        UO.Print(before = after);
        return null;
    }
}

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

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.TicksSpell() — UO.TicksSpell()

Параметры: Параметров нет.

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

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public int TicksSpell() => ticksSpell;

Clone this wiki locally