Skip to content

UO Topic record playback

Codex edited this page Oct 12, 2026 · 6 revisions

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

Запис і повторення дій

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

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

Розділи

Тема Команди та пояснення
Початок запису UO.SetRec
Відтворення запису 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