Skip to content

RU UO Topic record playback

Codex edited this page Oct 12, 2026 · 4 revisions

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

Запись/воспроизведение

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

Запись и повтор поддерживаемых действий. Состав записи и ограничения воспроизведения определяются реализацией команд.

Разделы

Тема Команды и пояснения
SetRec UO.SetRec
UseRec UO.UseRec

Все команды темы

Запись

UO.SetRec · UO.UseRec

Примеры по теме

В каждой карточке команды есть несколько самостоятельных сценариев: прямой код, функции и классы. Ниже приведены отдельные короткие сценарии; ограничения и полный разбор находятся в карточках.

UO.SetRec

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

UO.SetRec();
UO.Light(15);

UO.UseRec

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

UO.SetRec();
UO.Light(15);
UO.UseRec();

Полное описание команд


UO.SetRec

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

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

void UO.SetRec();

Готовит запись следующей legacy-команды UO.

Параметры

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

Возвращает

void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.

Поведение

  • ExecuteLegacyManualAlias очищает state.RecordedAction и задаёт recordNextLegacyAction=true. Следующий вызов того же legacy-dispatcher, кроме SetRec/UseRec, сериализует имя и аргументы до выполнения команды, затем снимает флаг.
  • Это не запись всех действий мышью, любых UO getters или серверных событий. Повторяет только одну команду поддерживаемого legacy-dispatcher. Старое сохранение стирается сразу.
  • В обычном клиентском host эти данные состояния берутся из GetPersistentState менеджера и общие для скриптов/чата/макросов одного мира/профиля, а не принадлежат одному скрипту. Другой процесс или явно отдельный InjectionRuntimeState имеет другое состояние. Загрузка/очистка профиля может его заменить; сохранённые serial всё равно проверяются по загруженному миру.
  • Запись сохраняет виды аргументов int, double, string, рекурсивный Array и void. Другие Object записываются как текст ToString; живой объект/handle при повторе не восстанавливается.
  • RecordedAction — общее состояние профиля, а recordNextLegacyAction/replayingLegacyAction — private-поля этого InjectionApiUO. Только этот экземпляр записывает свой следующий legacy-вызов. Другой скрипт может очистить или повторить общую запись, но не расходует флаг ожидания записи этого экземпляра.
  • Зарегистрирована только SetRec() строго без аргументов. Она сразу очищает RecordedAction, поэтому remain() возвращает 0 до записи последующего legacy-действия этим экземпляром; включение ожидания записи само не создаёт сохранённое действие. remain() только читает и не расходует флаг ожидания.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

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

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

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

1. Прямой вызов — прямой скрипт

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

  • Готовит запись следующей legacy-команды UO.
UO.SetRec();
UO.Light(15);

2. Явный вариант — функция сценария

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

  • ExecuteLegacyManualAlias очищает state.RecordedAction и задаёт recordNextLegacyAction=true. Следующий вызов того же legacy-dispatcher, кроме SetRec/UseRec, сериализует имя и аргументы до выполнения команды, затем снимает флаг.
return  RunScenario();
 object? RunScenario()
{
    UO.SetRec();
    UO.Sound(0x0040);
    UO.UseRec();
    return null;
}

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

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

  • Это не запись всех действий мышью, любых UO getters или серверных событий. Повторяет только одну команду поддерживаемого legacy-dispatcher. Старое сохранение стирается сразу.
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.SetRec();
        UO.TextPrint("This is not a legacy recording route");
        UO.Light(15);
        UO.UseRec();
        return null;
    }
}

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

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

UO.SetRec() — UO.SetRec()

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

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

При вызове:

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

case "setrec":

                    state.RecordedAction = string.Empty;

                    recordNextLegacyAction = true;

                    break;

UO.UseRec

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

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

void UO.UseRec();

Повторяет сохранённую legacy-команду UO.

Параметры

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

Возвращает

void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.

Поведение

  • TryDeserializeRecordedLegacyAction проверяет префикс YOKOREC1 и typed-аргументы. Нет/неверная запись — локальное сообщение, действия нет. Допустимая запись вызывает ExecuteLegacyManualAlias с сохранённым именем и аргументами.
  • Флаг replayingLegacyAction защищает повтор от записи самого себя и сбрасывается finally, даже при ошибке. Запись не удаляется после повтора: UseRec можно вызывать снова. Имена/serial разрешаются согласно сохранённым типам и текущему миру.
  • В обычном клиентском host эти данные состояния берутся из GetPersistentState менеджера и общие для скриптов/чата/макросов одного мира/профиля, а не принадлежат одному скрипту. Другой процесс или явно отдельный InjectionRuntimeState имеет другое состояние. Загрузка/очистка профиля может его заменить; сохранённые serial всё равно проверяются по загруженному миру.
  • Запись сохраняет виды аргументов int, double, string, рекурсивный Array и void. Другие Object записываются как текст ToString; живой объект/handle при повторе не восстанавливается.
  • RecordedAction — общее состояние профиля, а recordNextLegacyAction/replayingLegacyAction — private-поля этого InjectionApiUO. Только этот экземпляр записывает свой следующий legacy-вызов. Другой скрипт может очистить или повторить общую запись, но не расходует флаг ожидания записи этого экземпляра.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

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

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

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

1. Прямой вызов — прямой скрипт

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

  • Повторяет сохранённую legacy-команду UO.
UO.SetRec();
UO.Light(15);
UO.UseRec();

2. Явный вариант — функция сценария

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

  • TryDeserializeRecordedLegacyAction проверяет префикс YOKOREC1 и typed-аргументы. Нет/неверная запись — локальное сообщение, действия нет. Допустимая запись вызывает ExecuteLegacyManualAlias с сохранённым именем и аргументами.
return  RunScenario();
 object? RunScenario()
{
    UO.SetRec();
    UO.Sound(0x0040);
    UO.Wait(250);
    UO.UseRec();
    return null;
}

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

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

  • Флаг replayingLegacyAction защищает повтор от записи самого себя и сбрасывается finally, даже при ошибке. Запись не удаляется после повтора: UseRec можно вызывать снова. Имена/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()
    {
        UO.SetRec();
        UO.Light(15);
        UO.UseRec();
        UO.Wait(250);
        UO.UseRec();
        return null;
    }
}

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

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

UO.UseRec() — UO.UseRec()

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

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

При вызове:

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

case "userec":

                    if (!TryDeserializeRecordedLegacyAction(state.RecordedAction, out string recordedName, out InjectionValue[] recordedArguments))

                    {

                        if (bridge != null) SystemMessage("UseRec: no recorded UO action is available. Call UO.SetRec() before the action to record.");

                        break;

                    }

                    replayingLegacyAction = true;

                    try

                    {

                        ExecuteLegacyManualAlias(recordedName, recordedArguments);

                    }

                    finally

                    {

                        replayingLegacyAction = false;

                    }

                    break;

Clone this wiki locally