Skip to content

RU UO Topic client connection

Codex edited this page Oct 12, 2026 · 4 revisions

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

Клиент и подключение

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

Соединение, состояние входа в мир, задержка, адрес сервера и список персонажей.

Разделы

Тема Команды и пояснения
Connect UO.Connect
Disconnect UO.Disconnect
Connected UO.Connected
Online UO.Online
Ping UO.GetPing
Server IP UO.GameServerIPString
Shard Name UO.ShardName
Shard Path UO.ShardPath
Список персонажей UO.GetCharsListForShard
Resend UO.Resend
CheckLag UO.CheckLag

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

Связь

UO.Connect · UO.Disconnect · UO.Connected · UO.Online · UO.IsOnline · UO.ConnectedTime · UO.DisconnectedTime · UO.GetPing · UO.CheckLag · UO.GameServerIPString · UO.ShardName · UO.ShardPath · UO.GetCharsListForShard · UO.Resend · UO.CloseUO

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

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

UO.Connected

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

if (Truth(Truth(UO.Connected()) == false))
{
    return null;
}
UO.UseSkill("Hiding");

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

UO.GameServerIPString

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

var address = UO.GameServerIPString();
UO.Print(address);

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


UO.CheckLag

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

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

int UO.CheckLag();
dynamic UO.CheckLag(object? timeoutMS);
int UO.CheckLag(object? timeout, object? retries);

Проверяет, получен ли свежий ответ игрового сервера за отведённое время. Удобна перед продолжением скрипта после сетевой задержки.

Параметры

  • timeout — timeout / timeoutMS — время ожидания одной попытки в миллисекундах, преобразуется в int. Отрицательное значение ограничивается нулём. При 0 запрос может быть отправлен, но ожидания ответа нет; это не бесконечный тайм-аут.
  • timeoutMS — timeout / timeoutMS — время ожидания одной попытки в миллисекундах, преобразуется в int. Отрицательное значение ограничивается нулём. При 0 запрос может быть отправлен, но ожидания ответа нет; это не бесконечный тайм-аут.
  • retries — retries — ОБЩЕЕ число попыток, а не число дополнительных повторов. Преобразуется в int и ограничивается снизу единицей. Например, (250, 3) — до трёх попыток по 250 мс; успешный ответ завершает проверку раньше.

Возвращает

Числовой флаг int: 1 (условие выполнено) — свежий ответ получен; 0 (условие не выполнено) — запрос невозможен либо срок истёк. Однопараметрическая регистрация object? фактически возвращает этот int. Это не величина пинга и не число попыток.

Поведение

  • CheckLag() выполняет одну попытку с ожиданием до 10000 мс. CheckLag(timeoutMS) — одну попытку с указанным ожиданием. CheckLag(timeout, retries) повторяет проверку до успеха или исчерпания общего числа попыток.
  • Ожидание задерживает вызывающий скрипт, а не подтверждает игровое действие. Команда не переподключается и не меняет настройки сети. Сервер может не отвечать на echo: неудача сама по себе не доказывает разрыв связи. Срок зависит также от планирования потоков; не вызывайте активную проверку на каждом кадре. Остановка скрипта прерывает ожидание.
  • UO.GetPing · UO.CheckLag · UO.IsOnline

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

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

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

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

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

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

1. CheckLag — 1 — прямой скрипт

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

  • Форма без параметров может ждать до 10 секунд. true означает свежий echo-ответ. Hiding вызывается отдельной командой и может быть отклонён игровой механикой.
if (Truth(Truth(UO.CheckLag()) == true))
{
    UO.UseSkill("Hiding");
}
else
{
    UO.Print("No fresh server response");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. CheckLag — 2 — функция сценария

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

  • 250 — ожидание одной попытки, 3 — всего попыток. При успехе дальнейшие попытки не выполняются; при 0 скрипт не продолжает действие. Это не измерение пинга 250 мс и не три дополнительных повтора.
return  RunScenario();
 object? RunScenario()
{
    var responsive = UO.CheckLag(250, 3);
    if (Truth(responsive == 0))
    {
        UO.Print("No response after the allowed attempts");
        return null;
    }

    UO.Print("Fresh response received; the script can continue");
    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. CheckLag — 3 — класс сценария

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

  • CanContinue(timeoutMs, attempts) сначала проверяет UO.IsOnline, затем свежий ответ. false и 0 равнозначны именно для этого предиката. 500 мс и 2 попытки задаются отдельно; функция не запускает автоматическое переподключение.
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(CanContinue(500, 2))))
        {
            return null;
        }

        UO.UseSkill("Hiding");
        return null;
    }

    dynamic CanContinue(dynamic timeoutMs, dynamic attempts)
    {
        if (Truth(Truth(UO.IsOnline()) == false))
        {
            return false;
        }

        return Truth(Truth(UO.CheckLag(timeoutMs, attempts)) == true);
    }

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

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

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

При вызове:

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

public int CheckLag() => bridge.CheckLag(10_000);

UO.CheckLag(timeoutMS) — UO.CheckLag(Any)

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

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

При вызове:

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

case "checklag": return new InjectionValue(bridge.CheckLag(Arg(0, 10_000)));

UO.CheckLag(timeout, retries) — UO.CheckLag(Any,Any)

Параметры: timeout (Any), retries (Any)

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

При вызове:

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

public int CheckLag(InjectionValue timeout, InjectionValue retries)

        {

            int timeoutMs = Math.Max(0, NumberConversions.ToInt(timeout));

            int attempts = Math.Max(1, NumberConversions.ToInt(retries));

            for (int attempt = 0; attempt < attempts; attempt++)

            {

                if (bridge.CheckLag(timeoutMs) != 0)

                    return 1;

            }

            return 0;

        }

UO.CloseUO

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

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

void UO.CloseUO();

Запрашивает выход текущего приложения клиента через Client.Game.Exit.

Параметры

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

Возвращает

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

Поведение

  • CloseUO направляется в тот же bridge.CloseHandle. Exit выполняется на игровом потоке; если Client.Game отсутствует, действие отсутствует. Команда не является закрытием отдельного gump.

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

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

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

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

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

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

1. Завершить клиент — прямой скрипт

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

  • Вызов запрашивает завершение приложения клиента.
UO.CloseUO();

2. Явное условие завершения — функция сценария

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

  • Пример показывает управляемое условие; значение 0 сохраняет клиент открытым.
return  RunScenario();
 object? RunScenario()
{
    var finishClient = 0;
    if (Truth(finishClient))
    {
        UO.CloseUO();
    }

    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. Процедура завершения — класс сценария

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

  • Полностью объявленный helper допускает явное включение выхода.
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()
    {
        FinishClient(0);
        return null;
    }

    void FinishClient(dynamic enabled)
    {
        if (Truth(enabled))
        {
            UO.CloseUO();
        }
    }

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

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

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

При вызове:

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

case "closeuo": bridge.CloseHandle(); break;

UO.Connect

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

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

void UO.Connect();

Запрашивает подключение или переподключение текущей клиентской сессии.

Параметры

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

Возвращает

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

Поведение

  • В менеджерской сессии вызывает SessionControl.RequestConnect. В самостоятельном клиенте активное/подготавливаемое соединение оставляет без изменений.
  • Для GameScene планирует сохранённое переподключение, чтобы не менять scene во время её Update. В LoginScene использует текущую учётную запись и сохранённый пароль, включает Reconnect и вызывает Connect с запомнённым shard/character даже при выключенном автоматическом reconnect.
  • Команда не ждёт входа в мир. Проверяйте UO.Connected после отдельного ожидания, если дальнейшие действия требуют соединения.

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

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

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

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

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

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

1. Подключиться — прямой скрипт

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

  • Вызов только инициирует подключение.
UO.Connect();

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

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

  • Проверка может избежать повторного запроса.
return  RunScenario();
 object? RunScenario()
{
    if (!(Truth(UO.Connected())))
    {
        UO.Connect();
    }

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

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

  • Ожидание 1000 мс не гарантирует вход; вывод показывает фактический текущий флаг.
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()
    {
        UO.Connect();
        await Delay(1000);
        UO.Print(Convert.ToString(UO.Connected()));
        return null;
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}

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

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

UO.Connect() — UO.Connect()

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

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

При вызове:

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

case "connect": bridge.ConnectClient(); return InjectionValue.Unit;

UO.Connected

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

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

dynamic UO.Connected();

Проверяет, находится ли текущий сеанс в игровом мире и открыто ли его игровое соединение. Используйте перед действием персонажа или при ожидании входа.

Параметры

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

Возвращает

int. 1 — одновременно есть игрок, загруженная карта и активный игровой сокет; иначе 0. Открытое окно клиента, список персонажей или TCP-соединение на этапе входа ещё не означают 1. Числовой флаг int: 1 (условие выполнено), 0 (условие не выполнено). Это числовой флаг: в C# проверяйте result != 0 либо result == 0. Прямое сравнение int с true/false и if (result) недопустимо.

Результат команды — числовой флаг: 1 означает выполненное условие, 0 — невыполненное. После var result = команда(...) проверяйте if (result != 0) или if (result == 0). Сохраните результат одного вызова: повторный вызов может выполнить действие снова либо прочитать уже изменившееся состояние.

Поведение

  • Параметров нет: serial, type, имя персонажа и IP передавать нельзя. UO.Online(), UO.Connected() и UO.IsOnline() проверяют одно и то же. Это состояние данного владельца сеанса, а не другого профиля менеджера.
  • Команда только читает локальное состояние. Она не посылает ping, не подключается, не снимает паузу и не проверяет доступность интернета. После чтения связь может измениться; 1 не гарантирует успех следующего действия.
  • UO.Wait принимает миллисекунды. Автопауза при разрыве связи и ручная пауза задерживают выполнение примеров: проверка таймаута продолжится только после снятия паузы. Эти команды сами не снимают паузу и не включают автореконнект.

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

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

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

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

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

object? result = UO.Connected();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Не выполнять игровой навык офлайн — прямой скрипт

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

  • false равнозначно 0. return завершает Main до UseSkill. Hiding — единственный параметр UseSkill, название навыка. При 1 скрипт лишь запрашивает применение навыка; результат зависит от состояния персонажа и сервера.
  • Команда только читает локальное состояние. Она не посылает ping, не подключается, не снимает паузу и не проверяет доступность интернета. После чтения связь может измениться; 1 не гарантирует успех следующего действия.
if (Truth(Truth(UO.Connected()) == false))
{
    return null;
}
UO.UseSkill("Hiding");

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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

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

  • Сравнение с 0 проверяет текущее подключение, а не настройку автореконнекта. Connect без аргументов использует сохранённые настройки и не ждёт завершения входа. Повторная команда во время уже начатого входа не должна создавать второй сеанс.
  • Команда только читает локальное состояние. Она не посылает ping, не подключается, не снимает паузу и не проверяет доступность интернета. После чтения связь может измениться; 1 не гарантирует успех следующего действия.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Connected() == 0))
    {
        UO.Connect();
    }

    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. Подождать готовность мира с ограничением времени — класс сценария

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

  • WaitForWorld(timeoutMs) — полностью показанная пользовательская функция, не встроенная команда. 5000 — бюджет в мс, UO.Wait(50) — интервал проверок. Отрицательное значение даёт false; 0 разрешает только уже готовый мир. Timer измеряет секунды, поэтому разница умножается на 1000. Автопауза должна быть заранее выключена, иначе Main выходит. Функция не вызывает Connect и не отменяет начатый вход при истечении времени.
  • Команда только читает локальное состояние. Она не посылает ping, не подключается, не снимает паузу и не проверяет доступность интернета. После чтения связь может измениться; 1 не гарантирует успех следующего действия.
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()
    {
        if (Truth(UO.GetPauseScriptOnDisconnectStatus()))
        {
            return null;
        }

        if (Truth(await WaitForWorld(5000)))
        {
            UO.UseSkill("Hiding");
        }

        return null;
    }

    async Task<dynamic> WaitForWorld(dynamic timeoutMs)
    {
        if (Truth(timeoutMs < 0))
        {
            return false;
        }

        var started = Environment.TickCount;
        while (!(Truth(UO.Connected())))
        {
            if (Truth((Environment.TickCount - started) * 1000.0 >= timeoutMs))
            {
                return false;
            }

            await Delay(50);
        }

        return true;
    }

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

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

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

При вызове:

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

case "connected": return new InjectionValue(bridge.IsOnline());

UO.ConnectedTime

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

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

dynamic UO.ConnectedTime();

Возвращает календарную отметку последнего успешного входа персонажа в мир. Помогает понять, изменилось ли подключение за время ожидания или паузы, прежде чем продолжать прежнюю задачу.

Параметры

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

Возвращает

double: число дней от 1899-12-30, дробная часть — время суток (OLE Automation date). 0 означает, что этот владелец сеанса ещё не входил в мир. После отключения последняя отметка входа сохраняется. Это не bool и не длительность в секундах.

Поведение

  • Аргументов нет. История общая для скриптов одного владельца сеанса: поздний запуск, пауза и закрытие IDE не меняют отметки. Новый процесс сеанса начинает новую историю; это не журнал всех подключений.
  • Неудачная попытка входа без появления персонажа в мире не считается успешным подключением. Повторные проверки офлайн не меняют время отключения. Для текущего состояния используйте UO.Connected(), а не ненулевую дату.
  • Отметки берутся по локальным часам компьютера. Разность, умноженная на 86400, даёт календарные секунды; изменение часов/часового пояса может исказить результат. Для таймаутов используйте монотонный Timer(). Отдельные вызовы не образуют атомарный снимок; одинаковая отметка не является уникальным ID подключения.
  • UO.Wait принимает миллисекунды. Автопауза при разрыве связи и ручная пауза задерживают выполнение примеров: проверка таймаута продолжится только после снятия паузы. Эти команды сами не снимают паузу и не включают автореконнект.

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

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

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

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

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

object? result = UO.ConnectedTime();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Запросить самый первый вход — прямой скрипт

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

  • 0 проверяет отсутствие входов именно в этом процессе. Connect использует сохранённый профиль и лишь запрашивает вход. Этот пример намеренно не восстанавливает уже завершённое подключение.
  • UO.Wait принимает миллисекунды. Автопауза при разрыве связи и ручная пауза задерживают выполнение примеров: проверка таймаута продолжится только после снятия паузы. Эти команды сами не снимают паузу и не включают автореконнект.
if (Truth(UO.ConnectedTime() == 0))
{
    UO.Connect();
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Сбросить ожидаемую цель после нового входа — функция сценария

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

  • 30.0 — бюджет наблюдения в секундах Timer; 250 — интервал UO.Wait в мс. После изменения отметки входа CancelWaitTarget очищает прежнюю отложенную цель. При отсутствии нового входа цикл заканчивается без этого действия.
  • UO.Wait принимает миллисекунды. Автопауза при разрыве связи и ручная пауза задерживают выполнение примеров: проверка таймаута продолжится только после снятия паузы. Эти команды сами не снимают паузу и не включают автореконнект.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var login = UO.ConnectedTime();
    var started = Environment.TickCount;
    while (Truth(Environment.TickCount - started < 30.0))
    {
        if (Truth(UO.Connected()) && Truth(UO.ConnectedTime() != login))
        {
            UO.CancelWaitTarget();
            return null;
        }

        await Delay(250);
    }

    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. Проверить подключение перед продолжением — класс сценария

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

  • SameConnection(login) возвращает bool. Сохраняем отметку, ждём 500 мс, затем запрещаем продолжение при отсутствии связи или смене входа. Это повторная проверка, а не гарантия будущей доступности сервера.
  • UO.Wait принимает миллисекунды. Автопауза при разрыве связи и ручная пауза задерживают выполнение примеров: проверка таймаута продолжится только после снятия паузы. Эти команды сами не снимают паузу и не включают автореконнект.
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 login = UO.ConnectedTime();
        await Delay(500);
        if (!(Truth(SameConnection(login))))
        {
            return null;
        }

        UO.AddToSystemJournal("Same connection; continue this batch");
        return null;
    }

    dynamic SameConnection(dynamic login)
    {
        return Truth(login != 0) && Truth(UO.Connected()) && Truth(UO.ConnectedTime() == login);
    }

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

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

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

При вызове:

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

case "connectedtime":

                    UpdateConnectionState();

                    return new InjectionValue(state.ConnectedTime == default(DateTime) ? 0d : state.ConnectedTime.ToOADate());

UO.Disconnect

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

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

void UO.Disconnect();

Отключает текущий или устанавливаемый транспорт клиента и готовит скрипты к переподключению.

Параметры

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

Возвращает

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

Поведение

  • Если автоматический reconnect выключен, BeginScriptControlledDisconnect сохраняет выполняющий вызов worker для последующего UO.Connect. Менеджерская сессия получает RequestDisconnect.
  • Самостоятельный клиент вызывает Socket.Disconnect и PrepareForReconnect. При включённом глобальном reconnect явно планирует сохранённый переход сцены. В LoginScene очищает popup и возвращает Main.
  • Возврат void не сообщает результата переподключения. Состояние соединения читается отдельно; настройки автоматического reconnect могут инициировать новый вход.

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

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

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

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

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

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

1. Отключить сессию — прямой скрипт

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

  • Команда отменяет и активный, и устанавливаемый транспорт.
UO.Disconnect();

2. Явное повторное подключение — функция сценария

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

  • При выключенном AR вызывающий worker может сам дойти до Connect.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    UO.Disconnect();
    await Delay(1000);
    UO.Connect();
    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));

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()
    {
        if (Truth(UO.Connected()))
        {
            UO.Disconnect();
        }

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

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

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

При вызове:

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

case "disconnect": bridge.DisconnectClient(); return InjectionValue.Unit;

UO.DisconnectedTime

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

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

dynamic UO.DisconnectedTime();

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

Параметры

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

Возвращает

double: число дней от 1899-12-30 с дробной частью суток. После обрыва — время, когда клиент заметил отключение; до первого обрыва — время создания владельца сеанса. Это не флаг офлайн и не миллисекунды.

Поведение

  • Аргументов нет. История общая для скриптов одного владельца сеанса: поздний запуск, пауза и закрытие IDE не меняют отметки. Новый процесс сеанса начинает новую историю; это не журнал всех подключений.
  • Неудачная попытка входа без появления персонажа в мире не считается успешным подключением. Повторные проверки офлайн не меняют время отключения. Для текущего состояния используйте UO.Connected(), а не ненулевую дату.
  • Отметки берутся по локальным часам компьютера. Разность, умноженная на 86400, даёт календарные секунды; изменение часов/часового пояса может исказить результат. Для таймаутов используйте монотонный Timer(). Отдельные вызовы не образуют атомарный снимок; одинаковая отметка не является уникальным ID подключения.
  • UO.Wait принимает миллисекунды. Автопауза при разрыве связи и ручная пауза задерживают выполнение примеров: проверка таймаута продолжится только после снятия паузы. Эти команды сами не снимают паузу и не включают автореконнект.

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

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

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

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

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

object? result = UO.DisconnectedTime();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Оценить длительность завершённого подключения — прямой скрипт

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

  • CompletedConnectionSeconds() возвращает секунды либо -1, если нет завершённого подключения или вход изменился между чтениями. 86400 — секунд в сутках. Пересчитывается только последняя пара вход/обрыв; историю всех сеансов функция не суммирует.
  • UO.Wait принимает миллисекунды. Автопауза при разрыве связи и ручная пауза задерживают выполнение примеров: проверка таймаута продолжится только после снятия паузы. Эти команды сами не снимают паузу и не включают автореконнект.
var seconds = CompletedConnectionSeconds();
if (Truth(seconds >= 0))
{
    UO.AddToSystemJournal("Completed connection seconds: " + Convert.ToString(seconds));
}

dynamic CompletedConnectionSeconds()
{
    var login = UO.ConnectedTime();
    var loss = UO.DisconnectedTime();
    if (Truth(login == 0) || Truth(loss < login) || Truth(UO.Connected()))
    {
        return -1;
    }
    if (Truth(UO.ConnectedTime() != login))
    {
        return -1;
    }
    return (loss - login) * 86400.0;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Запросить вход после короткого ожидания офлайн — функция сценария

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

  • При включённой автопаузе этот контроллер сразу выходит; для работы офлайн она должна быть заранее выключена. После UO.Wait(1000) повторно проверяются офлайн и прежняя отметка обрыва. Connect не гарантирует успех и не заменяет настройку автореконнекта.
  • UO.Wait принимает миллисекунды. Автопауза при разрыве связи и ручная пауза задерживают выполнение примеров: проверка таймаута продолжится только после снятия паузы. Эти команды сами не снимают паузу и не включают автореконнект.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    if (Truth(UO.GetPauseScriptOnDisconnectStatus()))
    {
        return null;
    }

    if (Truth(UO.Connected()))
    {
        return null;
    }

    var loss = UO.DisconnectedTime();
    await Delay(1000);
    if (!(Truth(UO.Connected())) && Truth(UO.DisconnectedTime() == loss))
    {
        UO.Connect();
    }

    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. Заметить обрыв между проверками — класс сценария

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

  • Сравнение с previousLoss замечает обрыв даже после уже состоявшегося повторного входа. 30 секунд ограничивают наблюдение при исполняющемся скрипте, WaitAsync(250) освобождает поток между проверками. Несколько обрывов могут объединиться в одно уведомление.
  • UO.Wait принимает миллисекунды. Автопауза при разрыве связи и ручная пауза задерживают выполнение примеров: проверка таймаута продолжится только после снятия паузы. Эти команды сами не снимают паузу и не включают автореконнект.
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 previousLoss = UO.DisconnectedTime();
        var started = Environment.TickCount;
        while (Truth(Environment.TickCount - started < 30.0))
        {
            if (Truth(UO.DisconnectedTime() != previousLoss))
            {
                UO.AddToSystemJournal("A connection loss occurred; check the session");
                return null;
            }

            await Delay(250);
        }

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

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

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

UO.DisconnectedTime() — UO.DisconnectedTime()

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

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

При вызове:

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

case "disconnectedtime":

                    UpdateConnectionState();

                    return new InjectionValue(state.DisconnectedTime.ToOADate());

UO.GameServerIPString

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

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

dynamic UO.GameServerIPString();

Читает настроенный адрес сервера из глобальных настроек клиента.

Параметры

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

Возвращает

string — Settings.GlobalSettings.IP либо пустая строка, если значение отсутствует.

Поведение

  • GameServerAddress в текущем bridge читает глобальную настройку IP. Это не DNS/сетевой запрос и не проверка адреса фактического peer; менеджерская сессия может иметь собственные параметры соединения.

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

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

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

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

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

object? result = UO.GameServerIPString();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Прочитать адрес — прямой скрипт

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

  • Возвращается текущая глобальная настройка IP.
var address = UO.GameServerIPString();
UO.Print(address);

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

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

  • Пустое значение означает отсутствие настройки, а не измеренный сетевой отказ.
return  RunScenario();
 object? RunScenario()
{
    var address = UO.GameServerIPString();
    if (Truth(Len(address) == 0))
    {
        UO.Print("no configured address");
    }

    return null;
}

int Len(object? value) => Convert.ToString(value)?.Length ?? 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Сохранить снимок — класс сценария

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

  • Переменная сохраняет строку, полученную первым вызовом.
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 address = UO.GameServerIPString();
        await Delay(100);
        UO.Print(address);
        return null;
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}

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

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

UO.GameServerIPString() — UO.GameServerIPString()

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

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

При вызове:

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

case "gameserveripstring": return new InjectionValue(bridge.GameServerAddress);

UO.GetCharsListForShard

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

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

dynamic UO.GetCharsListForShard();

Возвращает известные клиенту имена персонажей текущего shard.

Параметры

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

Возвращает

Array строк. Нет известных имён и текущего персонажа — пустой массив.

Поведение

  • В менеджерской сессии читается SessionControl.Characters. В standalone сначала используются LastCharacterManager для account/server; если список пуст, читается LoginScene.Characters без пустых имён; затем используется текущий Player.Name как единственный элемент.
  • Это локальные известные имена; команда не запрашивает полный список у сервера и не гарантирует свежесть кэша.

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

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

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

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

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

object? result = UO.GetCharsListForShard();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Вывести имена — прямой скрипт

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

  • Цикл работает с фактическим массивом известных имён.
var names = UO.GetCharsListForShard();
for (int i = (int)(0); i <= ArrayLength(names)-1; i += (int)(1))
{
    UO.Print(names[i]);
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

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

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

  • Индекс 0 используется только для непустого массива.
return  RunScenario();
 object? RunScenario()
{
    var names = UO.GetCharsListForShard();
    if (Truth(ArrayLength(names) > 0))
    {
        UO.Print(names[0]);
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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()
    {
        var names = UO.GetCharsListForShard();
        UO.Print(Convert.ToString(ArrayLength(names)));
        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
}

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

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

UO.GetCharsListForShard() — UO.GetCharsListForShard()

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

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

При вызове:

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

case "getcharslistforshard": return StringArray(bridge.GetCharactersForCurrentShard());

UO.GetPing

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

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

int UO.GetPing();
int UO.GetPing(object? timeout);

Читает задержку ответа игрового сервера. Без аргумента использует последнее измерение; с тайм-аутом запрашивает свежий ответ.

Параметры

  • timeout — timeout / timeoutMS — время ожидания одной попытки в миллисекундах, преобразуется в int. Отрицательное значение ограничивается нулём. При 0 запрос может быть отправлен, но ожидания ответа нет; это не бесконечный тайм-аут.

Возвращает

int, миллисекунды. Значение >= 0 — измерение; 0 мс тоже допустимы. -1 — измерения нет: для формы с аргументом запрос не выполнен или ответ не получен вовремя. Это НЕ bool; нельзя считать 0 неудачей, а -1 успехом.

Поведение

  • GetPing() ничего не отправляет и немедленно читает последнее ServerPing. Старое значение само по себе не доказывает, что связь сейчас исправна. Это последнее серверное echo-измерение, а не сглаженный/резервный TCP ping индикатора и не ICMP Ping(host). GetPing(timeout) ждёт новый ответ и затем читает последнее серверное измерение.
  • Ожидание задерживает вызывающий скрипт, а не подтверждает игровое действие. Команда не переподключается и не меняет настройки сети. Сервер может не отвечать на echo: неудача сама по себе не доказывает разрыв связи. Срок зависит также от планирования потоков; не вызывайте активную проверку на каждом кадре. Остановка скрипта прерывает ожидание.
  • UO.GetPing · UO.CheckLag · UO.IsOnline

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

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

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

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

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

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

1. GetPing — 1 — прямой скрипт

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

  • Чтение кэша без нового сетевого запроса. Пример выбирает 50 или 200 мс ожидания самого скрипта при пороге 250 мс. Неизвестное измерение обрабатывается отдельно. Эти числа — пример настройки, не универсальное ограничение сервера.
var pingMs = UO.GetPing();
if (Truth(pingMs < 0))
{
    UO.Print("No server latency sample");
    return null;
}
var delayMs = 50;
if (Truth(pingMs > 250))
{
    delayMs = 200;
}
await Delay(delayMs);

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;

2. GetPing — 2 — функция сценария

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

  • 1000 — максимум ожидания свежего ответа в миллисекундах. При -1 процедура заканчивается. При успешном измерении запрашивается Hiding; ответ echo не доказывает успешное применение навыка.
return  RunScenario();
 object? RunScenario()
{
    var pingMs = UO.GetPing(1000);
    if (Truth(pingMs == -1))
    {
        UO.Print("No fresh server response");
        return null;
    }

    UO.UseSkill("Hiding");
    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. GetPing — 3 — класс сценария

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

  • MeanPing(samples, timeoutMs) показана полностью: 3 попытки по 500 мс; неудачные измерения исключаются из среднего. При отсутствии успешных возвращается -1. samples ограничено 1–10; UO.Wait(100) между попытками уменьшает частоту запросов.
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 meanMs = await MeanPing(3, 500);
        if (Truth(meanMs < 0))
        {
            UO.Print("No successful samples");
        }
        else
        {
            UO.Print("Measured mean, ms: " + Convert.ToString(meanMs));
        }

        return null;
    }

    async Task<dynamic> MeanPing(dynamic samples, dynamic timeoutMs)
    {
        if (Truth(samples < 1) || Truth(samples > 10))
        {
            return -1;
        }

        var total = 0;
        var count = 0;
        for (int i = (int)(1); i <= samples; i += (int)(1))
        {
            var current = UO.GetPing(timeoutMs);
            if (Truth(current >= 0))
            {
                total = total + current;
                count = count + 1;
            }

            await Delay(100);
        }

        if (Truth(count == 0))
        {
            return -1;
        }

        return total / count;
    }

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

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

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

При вызове:

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

public int GetPing() => bridge.GetPing();

UO.GetPing(timeout) — UO.GetPing(Any)

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

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

При вызове:

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

public int GetPing(InjectionValue timeout) => bridge.GetPing(Math.Max(0, NumberConversions.ToInt(timeout)));

UO.IsOnline

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

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

int UO.IsOnline();

Проверяет, находится ли текущий сеанс в игровом мире и открыто ли его игровое соединение. Используйте перед действием персонажа или при ожидании входа.

Параметры

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

Возвращает

int. 1 — одновременно есть игрок, загруженная карта и активный игровой сокет; иначе 0. Открытое окно клиента, список персонажей или TCP-соединение на этапе входа ещё не означают 1. Числовой флаг int: 1 (условие выполнено), 0 (условие не выполнено). Это числовой флаг: в C# проверяйте result != 0 либо result == 0. Прямое сравнение int с true/false и if (result) недопустимо.

Результат команды — числовой флаг: 1 означает выполненное условие, 0 — невыполненное. После var result = команда(...) проверяйте if (result != 0) или if (result == 0). Сохраните результат одного вызова: повторный вызов может выполнить действие снова либо прочитать уже изменившееся состояние.

Поведение

  • Параметров нет: serial, type, имя персонажа и IP передавать нельзя. UO.Online(), UO.Connected() и UO.IsOnline() проверяют одно и то же. Это состояние данного владельца сеанса, а не другого профиля менеджера.
  • Команда только читает локальное состояние. Она не посылает ping, не подключается, не снимает паузу и не проверяет доступность интернета. После чтения связь может измениться; 1 не гарантирует успех следующего действия.
  • UO.Wait принимает миллисекунды. Автопауза при разрыве связи и ручная пауза задерживают выполнение примеров: проверка таймаута продолжится только после снятия паузы. Эти команды сами не снимают паузу и не включают автореконнект.

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

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

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

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

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

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

1. Не выполнять игровой навык офлайн — прямой скрипт

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

  • false равнозначно 0. return завершает Main до UseSkill. Hiding — единственный параметр UseSkill, название навыка. При 1 скрипт лишь запрашивает применение навыка; результат зависит от состояния персонажа и сервера.
  • Команда только читает локальное состояние. Она не посылает ping, не подключается, не снимает паузу и не проверяет доступность интернета. После чтения связь может измениться; 1 не гарантирует успех следующего действия.
if (Truth(Truth(UO.IsOnline()) == false))
{
    return null;
}
UO.UseSkill("Hiding");

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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

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

  • Сравнение с 0 проверяет текущее подключение, а не настройку автореконнекта. Connect без аргументов использует сохранённые настройки и не ждёт завершения входа. Повторная команда во время уже начатого входа не должна создавать второй сеанс.
  • Команда только читает локальное состояние. Она не посылает ping, не подключается, не снимает паузу и не проверяет доступность интернета. После чтения связь может измениться; 1 не гарантирует успех следующего действия.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.IsOnline() == 0))
    {
        UO.Connect();
    }

    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. Подождать готовность мира с ограничением времени — класс сценария

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

  • WaitForWorld(timeoutMs) — полностью показанная пользовательская функция, не встроенная команда. 5000 — бюджет в мс, UO.Wait(50) — интервал проверок. Отрицательное значение даёт false; 0 разрешает только уже готовый мир. Timer измеряет секунды, поэтому разница умножается на 1000. Автопауза должна быть заранее выключена, иначе Main выходит. Функция не вызывает Connect и не отменяет начатый вход при истечении времени.
  • Команда только читает локальное состояние. Она не посылает ping, не подключается, не снимает паузу и не проверяет доступность интернета. После чтения связь может измениться; 1 не гарантирует успех следующего действия.
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()
    {
        if (Truth(UO.GetPauseScriptOnDisconnectStatus()))
        {
            return null;
        }

        if (Truth(await WaitForWorld(5000)))
        {
            UO.UseSkill("Hiding");
        }

        return null;
    }

    async Task<dynamic> WaitForWorld(dynamic timeoutMs)
    {
        if (Truth(timeoutMs < 0))
        {
            return false;
        }

        var started = Environment.TickCount;
        while (!(Truth(UO.IsOnline())))
        {
            if (Truth((Environment.TickCount - started) * 1000.0 >= timeoutMs))
            {
                return false;
            }

            await Delay(50);
        }

        return true;
    }

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

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

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

При вызове:

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

public int IsOnline() => bridge.IsOnline();

UO.Online

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

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

int UO.Online();

Проверяет, находится ли текущий сеанс в игровом мире и открыто ли его игровое соединение. Используйте перед действием персонажа или при ожидании входа.

Параметры

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

Возвращает

int. 1 — одновременно есть игрок, загруженная карта и активный игровой сокет; иначе 0. Открытое окно клиента, список персонажей или TCP-соединение на этапе входа ещё не означают 1. Числовой флаг int: 1 (условие выполнено), 0 (условие не выполнено). Это числовой флаг: в C# проверяйте result != 0 либо result == 0. Прямое сравнение int с true/false и if (result) недопустимо.

Результат команды — числовой флаг: 1 означает выполненное условие, 0 — невыполненное. После var result = команда(...) проверяйте if (result != 0) или if (result == 0). Сохраните результат одного вызова: повторный вызов может выполнить действие снова либо прочитать уже изменившееся состояние.

Поведение

  • Параметров нет: serial, type, имя персонажа и IP передавать нельзя. UO.Online(), UO.Connected() и UO.IsOnline() проверяют одно и то же. Это состояние данного владельца сеанса, а не другого профиля менеджера.
  • Команда только читает локальное состояние. Она не посылает ping, не подключается, не снимает паузу и не проверяет доступность интернета. После чтения связь может измениться; 1 не гарантирует успех следующего действия.
  • UO.Wait принимает миллисекунды. Автопауза при разрыве связи и ручная пауза задерживают выполнение примеров: проверка таймаута продолжится только после снятия паузы. Эти команды сами не снимают паузу и не включают автореконнект.

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

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

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

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

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

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

1. Не выполнять игровой навык офлайн — прямой скрипт

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

  • false равнозначно 0. return завершает Main до UseSkill. Hiding — единственный параметр UseSkill, название навыка. При 1 скрипт лишь запрашивает применение навыка; результат зависит от состояния персонажа и сервера.
  • Команда только читает локальное состояние. Она не посылает ping, не подключается, не снимает паузу и не проверяет доступность интернета. После чтения связь может измениться; 1 не гарантирует успех следующего действия.
if (Truth(Truth(UO.Online()) == false))
{
    return null;
}
UO.UseSkill("Hiding");

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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

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

  • Сравнение с 0 проверяет текущее подключение, а не настройку автореконнекта. Connect без аргументов использует сохранённые настройки и не ждёт завершения входа. Повторная команда во время уже начатого входа не должна создавать второй сеанс.
  • Команда только читает локальное состояние. Она не посылает ping, не подключается, не снимает паузу и не проверяет доступность интернета. После чтения связь может измениться; 1 не гарантирует успех следующего действия.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Online() == 0))
    {
        UO.Connect();
    }

    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. Подождать готовность мира с ограничением времени — класс сценария

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

  • WaitForWorld(timeoutMs) — полностью показанная пользовательская функция, не встроенная команда. 5000 — бюджет в мс, UO.Wait(50) — интервал проверок. Отрицательное значение даёт false; 0 разрешает только уже готовый мир. Timer измеряет секунды, поэтому разница умножается на 1000. Автопауза должна быть заранее выключена, иначе Main выходит. Функция не вызывает Connect и не отменяет начатый вход при истечении времени.
  • Команда только читает локальное состояние. Она не посылает ping, не подключается, не снимает паузу и не проверяет доступность интернета. После чтения связь может измениться; 1 не гарантирует успех следующего действия.
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()
    {
        if (Truth(UO.GetPauseScriptOnDisconnectStatus()))
        {
            return null;
        }

        if (Truth(await WaitForWorld(5000)))
        {
            UO.UseSkill("Hiding");
        }

        return null;
    }

    async Task<dynamic> WaitForWorld(dynamic timeoutMs)
    {
        if (Truth(timeoutMs < 0))
        {
            return false;
        }

        var started = Environment.TickCount;
        while (!(Truth(UO.Online())))
        {
            if (Truth((Environment.TickCount - started) * 1000.0 >= timeoutMs))
            {
                return false;
            }

            await Delay(50);
        }

        return true;
    }

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

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

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

При вызове:

Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.

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

() => bridge.IsOnline()

Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.


UO.Resend

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

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

void UO.Resend();

Посылает запрос повторной синхронизации мира.

Параметры

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

Возвращает

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

Поведение

  • Resync отправляет NetClient.Socket.Send_Resync на игровом потоке. Это запрос обновления, не переподключение и не подтверждение получения данных.
  • В примерах UO.Wait задаёт только паузу скрипта; окончание паузы не доказывает выполнение запроса сервером.

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

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

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

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

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

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

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

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

  • Посылает запрос повторной синхронизации мира.
UO.Resend();

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

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

  • Resync отправляет NetClient.Socket.Send_Resync на игровом потоке. Это запрос обновления, не переподключение и не подтверждение получения данных.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.IsOnline()))
    {
        UO.Resend();
    }

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

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

  • В примерах UO.Wait задаёт только паузу скрипта; окончание паузы не доказывает выполнение запроса сервером.
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.Resend();
        UO.Wait(500);
        UO.Print(UO.GetX());
        return null;
    }
}

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

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

UO.Resend() — UO.Resend()

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

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

При вызове:

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

case "resend": bridge.Resync(); break;

UO.ShardName

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

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

dynamic UO.ShardName();

Читает имя шарда.

Параметры

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

Возвращает

string — текст поля bridge.ShardName; без доступных данных возможна пустая строка. Это не признак подключения и не числовой ID.

Поведение

  • ExecuteClientApiCompatibility возвращает bridge.ShardName без изменения выбора профиля или сервера.
  • Читает текущее локальное состояние. Пакета, target и автоматического обновления нет; отдельные чтения могут видеть разные состояния.

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

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

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

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

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

object? result = UO.ShardName();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

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

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

  • Читает имя шарда.
var value = UO.ShardName();
UO.Print(value);

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

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

  • ExecuteClientApiCompatibility возвращает bridge.ShardName без изменения выбора профиля или сервера.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.ShardName();
    if (Truth(Len(value) > 0))
    {
        UO.TextPrint(value);
    }

    return null;
}

int Len(object? value) => Convert.ToString(value)?.Length ?? 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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

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

  • Читает текущее локальное состояние. Пакета, target и автоматического обновления нет; отдельные чтения могут видеть разные состояния.
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.ShardName();
        UO.Wait(500);
        var after = UO.ShardName();
        UO.Print(before = after);
        return null;
    }
}

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

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

UO.ShardName() — UO.ShardName()

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

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

При вызове:

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

case "shardname":

                case "profileshardname": return new InjectionValue(bridge.ShardName);

UO.ShardPath

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

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

dynamic UO.ShardPath();

Читает путь текущего профиля.

Параметры

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

Возвращает

string — текст поля bridge.CurrentProfilePath; без доступных данных возможна пустая строка. Это не признак подключения и не числовой ID.

Поведение

  • ExecuteClientApiCompatibility возвращает bridge.CurrentProfilePath без изменения выбора профиля или сервера.
  • Читает текущее локальное состояние. Пакета, target и автоматического обновления нет; отдельные чтения могут видеть разные состояния.

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

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

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

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

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

object? result = UO.ShardPath();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

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

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

  • Читает путь текущего профиля.
var value = UO.ShardPath();
UO.Print(value);

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

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

  • ExecuteClientApiCompatibility возвращает bridge.CurrentProfilePath без изменения выбора профиля или сервера.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.ShardPath();
    if (Truth(Len(value) > 0))
    {
        UO.TextPrint(value);
    }

    return null;
}

int Len(object? value) => Convert.ToString(value)?.Length ?? 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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

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

  • Читает текущее локальное состояние. Пакета, target и автоматического обновления нет; отдельные чтения могут видеть разные состояния.
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.ShardPath();
        UO.Wait(500);
        var after = UO.ShardPath();
        UO.Print(before = after);
        return null;
    }
}

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

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

UO.ShardPath() — UO.ShardPath()

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

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

При вызове:

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

case "shardpath":

                case "clientprofilepath": return new InjectionValue(bridge.CurrentProfilePath);

Clone this wiki locally