RU UO Topic sound visual environment - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

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

Sound и визуальная среда

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

Звуки, освещение, сезон и погодные эффекты клиента.

Разделы

Тема Команды и пояснения
Sound UO.Sound
PlayWav UO.PlayWav
Light UO.Light
Season UO.SetSeason
Weather Filter UO.FilterWeather

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

Среда

UO.Sound · UO.PlayWav · UO.Alarm · UO.Light · UO.SetSeason · UO.FilterWeather · UO.TicksAnim

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

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

UO.PlayWav

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

UO.Print(UO.PlayWav("alert.wav"));

UO.Light

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

UO.Light();

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


UO.Alarm

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

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

void UO.Alarm();

Печатает слово Alarm в локальный системный журнал ClassicUO. Используйте как заметку о наступившем условии в скрипте.

Параметры

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

Возвращает

void — значения нет. Выполняйте отдельной строкой. Это не bool и не подтверждение, что пользователь увидел сообщение.

Поведение

  • Зарегистрирована только форма UO.Alarm() без параметров. Для собственного текста используйте UO.Print(text).
  • Команда не воспроизводит звук, не мигает значком и не активирует окно. Сообщение остаётся локальным: оно не отправляется в игровой чат.

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

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

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

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

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

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

1. Поставить отметку в журнале — прямой скрипт

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

  • Параметров нет; в системном журнале появляется слово Alarm.
UO.Alarm();

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

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

  • У Alarm нет параметра текста. Life возвращает число HP; Print добавляет понятное описание причины.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Life() < 30))
    {
        UO.Alarm();
        UO.Print("Health is below 30");
    }

    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. Отметить результат поиска — класс сценария

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

  • 0x0EED — тип золота, -1 — любой цвет, backpack — рюкзак. Alarm вызывается только при найденном 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()
    {
        var item = UO.FindType(0x0EED, -1, "backpack");
        if (Truth(item != ""))
        {
            UO.Alarm();
            UO.Print("Gold stack found: " + Convert.ToString(item));
        }
        else
        {
            UO.Print("No gold stack in the loaded backpack");
        }

        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.Alarm() — UO.Alarm()

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

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

При вызове:

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

case "alarm":

                    SystemMessage(arguments.Length > 0 ? Text(0) : "Alarm"); return InjectionValue.Unit;

UO.FilterWeather

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

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

void UO.FilterWeather();
void UO.FilterWeather(object? enabled);

Включает или выключает клиентский фильтр погоды.

Параметры

  • enabled — Необязательное значение: без аргумента фильтр включается; 0 выключает, ненулевое int включает.

Возвращает

void — возвращаемого значения нет.

Поведение

  • Записывает нормализованный флаг в runtime state и передаёт его менеджеру. Фильтр влияет на обработку клиентом; серверные события и остальные настройки журнала остаются отдельными.

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

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

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

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

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

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

1. Включить без аргумента — прямой скрипт

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

  • Нулевое число аргументов означает включение, а не чтение.
UO.FilterWeather();

2. Выключить — функция сценария

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

  • Явный 0 выключает клиентский фильтр.
return  RunScenario();
 object? RunScenario()
{
    UO.FilterWeather(0);
    return null;
}

3. Включить и затем выключить — класс сценария

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

  • Фильтр включается и явно возвращается в выключенное состояние.
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.FilterWeather(1);
        UO.FilterWeather(0);
        return null;
    }
}

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

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

UO.FilterWeather() — UO.FilterWeather()

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

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

При вызове:

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

case "filterweather": state.WeatherFilter = arguments.Length == 0 || Arg(0) != 0 ? 1 : 0; bridge.SetWeatherFilter(state.WeatherFilter); break;

UO.FilterWeather(enabled) — UO.FilterWeather(Any)

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

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

При вызове:

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

case "filterweather": state.WeatherFilter = arguments.Length == 0 || Arg(0) != 0 ? 1 : 0; bridge.SetWeatherFilter(state.WeatherFilter); break;

UO.Light

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

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

void UO.Light();
void UO.Light(object? value);

Локально задаёт общую освещённость клиента.

Параметры

  • value — Необязательное целое: 0..30, ограничивается до этого диапазона. Форма без аргументов использует 0; это запись, не чтение.

Возвращает

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

Поведение

  • ExecuteLegacyManualAlias передаёт Arg(0), где отсутствующий аргумент равен 0. SetLight присваивает Light.Overall и Light.RealOverall ограниченное значение byte.
  • Не меняет освещённость у других игроков и не запрашивает её у сервера. Следующий серверный пакет освещения может заменить значение.

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

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

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

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

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

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

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

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

  • Локально задаёт общую освещённость клиента.
UO.Light();

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

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

  • ExecuteLegacyManualAlias передаёт Arg(0), где отсутствующий аргумент равен 0. SetLight присваивает Light.Overall и Light.RealOverall ограниченное значение byte.
return  RunScenario();
 object? RunScenario()
{
    UO.Light(15);
    return null;
}

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

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

  • Не меняет освещённость у других игроков и не запрашивает её у сервера. Следующий серверный пакет освещения может заменить значение.
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.Light(99);
        UO.Print("Light clamped to 30");
        return null;
    }
}

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

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

UO.Light() — UO.Light()

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

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

При вызове:

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

case "light": bridge.SetLight(Arg(0)); break;

UO.Light(value) — UO.Light(Any)

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

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

При вызове:

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

case "light": bridge.SetLight(Arg(0)); break;

UO.PlayWav

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

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

int UO.PlayWav(object? file);

Воспроизводит локальный звуковой файл.

Параметры

  • file — Путь к аудиофайлу. Абсолютный путь сохраняется, относительный разрешается от CUOEnviroment.ExecutablePath. Расширение само не проверяется: файл читает SoundEffect.FromStream.

Возвращает

Числовой флаг int: 1 — sound.Play() принят, 0 — нет файла, отказ воспроизведения или пойманная ошибка. Это не завершение воспроизведения.

Поведение

  • Bridge открывает файл для чтения, декодирует SoundEffect.FromStream, хранит принятые звуки в ограниченном _sounds списке и удаляет/Dispose старые при достижении лимита.
  • При несуществующем файле/ошибке выводится сообщение, результат 0. Команда не ждёт окончания звучания и не передаёт файл серверу.

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

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

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

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

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.PlayWav("alert.wav");
UO.Print("PlayWav: " + Convert.ToString(result));

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

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

  • Воспроизводит локальный звуковой файл.
UO.Print(UO.PlayWav("alert.wav"));

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

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

  • Bridge открывает файл для чтения, декодирует SoundEffect.FromStream, хранит принятые звуки в ограниченном _sounds списке и удаляет/Dispose старые при достижении лимита.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.PlayWav("C:\\UO Sounds\\alert.wav"));
    return null;
}

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

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

  • При несуществующем файле/ошибке выводится сообщение, результат 0. Команда не ждёт окончания звучания и не передаёт файл серверу.
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.PlayWav("alert.wav");
        if (Truth(accepted == 0))
        {
            UO.Print("Audio file could not be played");
        }

        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.PlayWav(file) — UO.PlayWav(Any)

Параметры: file (Any/String)

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

При вызове:

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

case "playwav": return new InjectionValue(bridge.PlayWav(Text(0)));

UO.PlayWav(file) — UO.PlayWav(String)

Параметры: file (Any/String)

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

При вызове:

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

public int PlayWav(string file) => bridge.PlayWav(file);

UO.SetSeason

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

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

void UO.SetSeason(object? season);

Локально меняет отображаемый сезон.

Параметры

  • season — int: 0..4; значения ниже 0/выше 4 ограничиваются ближайшей границей. Номер соответствует enum Season клиента.

Возвращает

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

Поведение

  • Bridge.SetSeason вызывает _world.ChangeSeason((Season)clamp(season,0,4), -1). Это отображение мира клиента, а не запрос смены серверного времени года.
  • Данные сервера могут позднее изменить сезон снова. Команда не изменяет карту, погоду сервера или календарную дату.

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

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

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

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

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

UO.Print("Calling UO.SetSeason");
UO.SetSeason(0);

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

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

  • Локально меняет отображаемый сезон.
UO.SetSeason(0);

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

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

  • Bridge.SetSeason вызывает _world.ChangeSeason((Season)clamp(season,0,4), -1). Это отображение мира клиента, а не запрос смены серверного времени года.
return  RunScenario();
 object? RunScenario()
{
    UO.SetSeason(4);
    return null;
}

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

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

  • Данные сервера могут позднее изменить сезон снова. Команда не изменяет карту, погоду сервера или календарную дату.
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.SetSeason(99);
        UO.Print("Season clamped to 4");
        return null;
    }
}

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

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

UO.SetSeason(season) — UO.SetSeason(Any)

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

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

При вызове:

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

case "setseason": bridge.SetSeason(Arg(0)); break;

UO.Sound

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

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

void UO.Sound(object? soundId);

Воспроизводит звук по ID из ресурсов клиента.

Параметры

  • soundId — int ID звука ресурсов UO; не путь к WAV и не duration.

Возвращает

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

Поведение

  • ExecuteLegacyManualAlias вызывает bridge.PlaySound, где RequireGameView("PlaySound").Audio.PlaySound(sound) выполняется на игровом потоке.
  • Требуется открытое графическое окно с audio. Ошибка отсутствия GUI может прервать вызов; результат воспроизведения эта void-команда не возвращает. Для локального файла используйте PlayWav.

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

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

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

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

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

UO.Print("Calling UO.Sound");
UO.Sound(0x0040);

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

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

  • Воспроизводит звук по ID из ресурсов клиента.
UO.Sound(0x0040);

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

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

  • ExecuteLegacyManualAlias вызывает bridge.PlaySound, где RequireGameView("PlaySound").Audio.PlaySound(sound) выполняется на игровом потоке.
return  RunScenario();
 object? RunScenario()
{
    var soundId = 0x0040;
    UO.Sound(soundId);
    return null;
}

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

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

  • Требуется открытое графическое окно с audio. Ошибка отсутствия GUI может прервать вызов; результат воспроизведения эта Unit-команда не возвращает. Для локального файла используйте PlayWav.
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.Sound(0x0040);
        UO.Wait(250);
        UO.Print("Sound request made");
        return null;
    }
}

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

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

UO.Sound(soundId) — UO.Sound(Any)

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

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

При вызове:

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

case "sound": bridge.PlaySound(Arg(0)); break;

UO.TicksAnim

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

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

int UO.TicksAnim();

Читает сохранённую отметку TicksAnim.

Параметры

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

Возвращает

int — отметка UO.Timer в десятых долях секунды от старта runtime. 0 — отметка ещё не установлена либо событие было в первую десятую секунды; это не миллисекунды и не календарное время.

Поведение

  • Возвращает поле ticksAnim. Его обновляет Morph либо ненулевой результат Move; это не автоматическое наблюдение всех ручных/серверных действий. Сама команда отметку не меняет.
  • UO.Timer() - отметка вычисляет возраст в десятых секунды. Между разными runtime отметки не сравниваются.

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

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

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

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

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

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

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

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

  • Читает сохранённую отметку TicksAnim.
var stamp = UO.TicksAnim();
UO.Print(stamp);

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

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

  • Возвращает поле ticksAnim. Его обновляет Morph либо ненулевой результат Move; это не автоматическое наблюдение всех ручных/серверных действий. Сама команда отметку не меняет.
return  RunScenario();
 object? RunScenario()
{
    var stamp = UO.TicksAnim();
    var ageTenths = UO.Timer() - stamp;
    UO.Print(ageTenths);
    return null;
}

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

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

  • UO.Timer() - отметка вычисляет возраст в десятых секунды. Между разными 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()
    {
        var before = UO.TicksAnim();
        UO.Wait(250);
        var after = UO.TicksAnim();
        UO.Print(before = after);
        return null;
    }
}

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

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

UO.TicksAnim() — UO.TicksAnim()

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

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

При вызове:

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

public int TicksAnim() => ticksAnim;
⚠️ **GitHub.com Fallback** ⚠️