Repository navigation
RU UO Topic record playback
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Главная · C# · IDE · UO API · A–Z · Примеры · Языки
Запись и повтор поддерживаемых действий. Состав записи и ограничения воспроизведения определяются реализацией команд.
| Тема | Команды и пояснения |
|---|---|
| SetRec | UO.SetRec |
| UseRec | UO.UseRec |
В каждой карточке команды есть несколько самостоятельных сценариев: прямой код, функции и классы. Ниже приведены отдельные короткие сценарии; ограничения и полный разбор находятся в карточках.
Параметры, результат и все сценарии
UO.SetRec();
UO.Light(15);Параметры, результат и все сценарии
UO.SetRec();
UO.Light(15);
UO.UseRec();Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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() только читает и не расходует флаг ожидания.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.SetRec");
UO.SetRec();Параметры и ход выполнения:
- Готовит запись следующей legacy-команды UO.
UO.SetRec();
UO.Light(15);Параметры и ход выполнения:
- ExecuteLegacyManualAlias очищает state.RecordedAction и задаёт recordNextLegacyAction=true. Следующий вызов того же legacy-dispatcher, кроме SetRec/UseRec, сериализует имя и аргументы до выполнения команды, затем снимает флаг.
return RunScenario();
object? RunScenario()
{
UO.SetRec();
UO.Sound(0x0040);
UO.UseRec();
return null;
}Параметры и ход выполнения:
- Это не запись всех действий мышью, любых 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.
Параметры: Параметров нет.
Результат: void / Unit.
При вызове:
Внутренний код реализации, не самостоятельный скрипт.
case "setrec":
state.RecordedAction = string.Empty;
recordNextLegacyAction = true;
break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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-вызов. Другой скрипт может очистить или повторить общую запись, но не расходует флаг ожидания записи этого экземпляра.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.UseRec");
UO.UseRec();Параметры и ход выполнения:
- Повторяет сохранённую legacy-команду UO.
UO.SetRec();
UO.Light(15);
UO.UseRec();Параметры и ход выполнения:
- TryDeserializeRecordedLegacyAction проверяет префикс YOKOREC1 и typed-аргументы. Нет/неверная запись — локальное сообщение, действия нет. Допустимая запись вызывает ExecuteLegacyManualAlias с сохранённым именем и аргументами.
return RunScenario();
object? RunScenario()
{
UO.SetRec();
UO.Sound(0x0040);
UO.Wait(250);
UO.UseRec();
return null;
}Параметры и ход выполнения:
- Флаг 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.
Параметры: Параметров нет.
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.TryDeserializeRecordedLegacyAction:TryDeserializeRecordedLegacyAction(state.RecordedAction, out string recordedName, out InjectionValue[] recordedArguments). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("UseRec: no recorded UO action is available. Call UO.SetRec() before the action to record."). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias:ExecuteLegacyManualAlias(recordedName, recordedArguments).
Внутренний код реализации, не самостоятельный скрипт.
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;ClassicUO — Bad Newbie & C# Scripts IDE