Repository navigation
RU UO Topic client connection
Українська · Русский · 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
В каждой карточке команды есть несколько самостоятельных сценариев: прямой код, функции и классы. Ниже приведены отдельные короткие сценарии; ограничения и полный разбор находятся в карточках.
Параметры, результат и все сценарии
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;Параметры, результат и все сценарии
var address = UO.GameServerIPString();
UO.Print(address);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.CheckLag();
UO.Print("CheckLag: " + Convert.ToString(result));Параметры и ход выполнения:
- Форма без параметров может ждать до 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;Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- 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.
Параметры: Параметров нет.
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.CheckLag. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CheckLag:bridge.CheckLag(10_000).
Внутренний код реализации, не самостоятельный скрипт.
public int CheckLag() => bridge.CheckLag(10_000);Параметры: timeoutMS (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CheckLag:bridge.CheckLag(Arg(0, 10_000)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0, 10_000).
Внутренний код реализации, не самостоятельный скрипт.
case "checklag": return new InjectionValue(bridge.CheckLag(Arg(0, 10_000)));Параметры: timeout (Any), retries (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.CheckLag. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(timeout). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CheckLag:bridge.CheckLag(timeoutMs).
Внутренний код реализации, не самостоятельный скрипт.
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;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.CloseUO();Запрашивает выход текущего приложения клиента через Client.Game.Exit.
Параметров нет.
void — возвращаемого значения нет.
- CloseUO направляется в тот же bridge.CloseHandle. Exit выполняется на игровом потоке; если Client.Game отсутствует, действие отсутствует. Команда не является закрытием отдельного gump.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.CloseUO");
UO.CloseUO();Параметры и ход выполнения:
- Вызов запрашивает завершение приложения клиента.
UO.CloseUO();Параметры и ход выполнения:
- Пример показывает управляемое условие; значение 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;Параметры и ход выполнения:
- Полностью объявленный 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.
Параметры: Параметров нет.
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CloseHandle:bridge.CloseHandle().
Внутренний код реализации, не самостоятельный скрипт.
case "closeuo": bridge.CloseHandle(); break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.Connect();Запрашивает подключение или переподключение текущей клиентской сессии.
Параметров нет.
void — возвращаемого значения нет.
- В менеджерской сессии вызывает SessionControl.RequestConnect. В самостоятельном клиенте активное/подготавливаемое соединение оставляет без изменений.
- Для GameScene планирует сохранённое переподключение, чтобы не менять scene во время её Update. В LoginScene использует текущую учётную запись и сохранённый пароль, включает Reconnect и вызывает Connect с запомнённым shard/character даже при выключенном автоматическом reconnect.
- Команда не ждёт входа в мир. Проверяйте UO.Connected после отдельного ожидания, если дальнейшие действия требуют соединения.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.Connect");
UO.Connect();Параметры и ход выполнения:
- Вызов только инициирует подключение.
UO.Connect();Параметры и ход выполнения:
- Проверка может избежать повторного запроса.
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;Параметры и ход выполнения:
- Ожидание 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.
Параметры: Параметров нет.
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ConnectClient:bridge.ConnectClient().
Внутренний код реализации, не самостоятельный скрипт.
case "connect": bridge.ConnectClient(); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 принимает миллисекунды. Автопауза при разрыве связи и ручная пауза задерживают выполнение примеров: проверка таймаута продолжится только после снятия паузы. Эти команды сами не снимают паузу и не включают автореконнект.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.Connected();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- Сравнение с 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;Параметры и ход выполнения:
- 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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsOnline:bridge.IsOnline().
Внутренний код реализации, не самостоятельный скрипт.
case "connected": return new InjectionValue(bridge.IsOnline());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.ConnectedTime();Возвращает календарную отметку последнего успешного входа персонажа в мир. Помогает понять, изменилось ли подключение за время ожидания или паузы, прежде чем продолжать прежнюю задачу.
Параметров нет.
double: число дней от 1899-12-30, дробная часть — время суток (OLE Automation date). 0 означает, что этот владелец сеанса ещё не входил в мир. После отключения последняя отметка входа сохраняется. Это не bool и не длительность в секундах.
- Аргументов нет. История общая для скриптов одного владельца сеанса: поздний запуск, пауза и закрытие IDE не меняют отметки. Новый процесс сеанса начинает новую историю; это не журнал всех подключений.
- Неудачная попытка входа без появления персонажа в мире не считается успешным подключением. Повторные проверки офлайн не меняют время отключения. Для текущего состояния используйте UO.Connected(), а не ненулевую дату.
- Отметки берутся по локальным часам компьютера. Разность, умноженная на 86400, даёт календарные секунды; изменение часов/часового пояса может исказить результат. Для таймаутов используйте монотонный Timer(). Отдельные вызовы не образуют атомарный снимок; одинаковая отметка не является уникальным ID подключения.
- UO.Wait принимает миллисекунды. Автопауза при разрыве связи и ручная пауза задерживают выполнение примеров: проверка таймаута продолжится только после снятия паузы. Эти команды сами не снимают паузу и не включают автореконнект.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.ConnectedTime();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- 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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.UpdateConnectionState:UpdateConnectionState().
Внутренний код реализации, не самостоятельный скрипт.
case "connectedtime":
UpdateConnectionState();
return new InjectionValue(state.ConnectedTime == default(DateTime) ? 0d : state.ConnectedTime.ToOADate());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.Disconnect();Отключает текущий или устанавливаемый транспорт клиента и готовит скрипты к переподключению.
Параметров нет.
void — возвращаемого значения нет.
- Если автоматический reconnect выключен, BeginScriptControlledDisconnect сохраняет выполняющий вызов worker для последующего UO.Connect. Менеджерская сессия получает RequestDisconnect.
- Самостоятельный клиент вызывает Socket.Disconnect и PrepareForReconnect. При включённом глобальном reconnect явно планирует сохранённый переход сцены. В LoginScene очищает popup и возвращает Main.
- Возврат void не сообщает результата переподключения. Состояние соединения читается отдельно; настройки автоматического reconnect могут инициировать новый вход.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.Disconnect");
UO.Disconnect();Параметры и ход выполнения:
- Команда отменяет и активный, и устанавливаемый транспорт.
UO.Disconnect();Параметры и ход выполнения:
- При выключенном 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)));Параметры и ход выполнения:
- Условие использует локальный флаг текущей сессии.
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.
Параметры: Параметров нет.
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.DisconnectClient:bridge.DisconnectClient().
Внутренний код реализации, не самостоятельный скрипт.
case "disconnect": bridge.DisconnectClient(); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.DisconnectedTime();Возвращает календарную отметку последней потери игрового подключения. Нужна для диагностики обрыва и оценки длительности завершённого подключения, а не для определения числа попыток входа.
Параметров нет.
double: число дней от 1899-12-30 с дробной частью суток. После обрыва — время, когда клиент заметил отключение; до первого обрыва — время создания владельца сеанса. Это не флаг офлайн и не миллисекунды.
- Аргументов нет. История общая для скриптов одного владельца сеанса: поздний запуск, пауза и закрытие IDE не меняют отметки. Новый процесс сеанса начинает новую историю; это не журнал всех подключений.
- Неудачная попытка входа без появления персонажа в мире не считается успешным подключением. Повторные проверки офлайн не меняют время отключения. Для текущего состояния используйте UO.Connected(), а не ненулевую дату.
- Отметки берутся по локальным часам компьютера. Разность, умноженная на 86400, даёт календарные секунды; изменение часов/часового пояса может исказить результат. Для таймаутов используйте монотонный Timer(). Отдельные вызовы не образуют атомарный снимок; одинаковая отметка не является уникальным ID подключения.
- UO.Wait принимает миллисекунды. Автопауза при разрыве связи и ручная пауза задерживают выполнение примеров: проверка таймаута продолжится только после снятия паузы. Эти команды сами не снимают паузу и не включают автореконнект.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.DisconnectedTime();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- При включённой автопаузе этот контроллер сразу выходит; для работы офлайн она должна быть заранее выключена. После 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;Параметры и ход выполнения:
- Сравнение с 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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.UpdateConnectionState:UpdateConnectionState().
Внутренний код реализации, не самостоятельный скрипт.
case "disconnectedtime":
UpdateConnectionState();
return new InjectionValue(state.DisconnectedTime.ToOADate());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GameServerIPString();Читает настроенный адрес сервера из глобальных настроек клиента.
Параметров нет.
string — Settings.GlobalSettings.IP либо пустая строка, если значение отсутствует.
- GameServerAddress в текущем bridge читает глобальную настройку IP. Это не DNS/сетевой запрос и не проверка адреса фактического peer; менеджерская сессия может иметь собственные параметры соединения.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.GameServerIPString();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Возвращается текущая глобальная настройка IP.
var address = UO.GameServerIPString();
UO.Print(address);Параметры и ход выполнения:
- Пустое значение означает отсутствие настройки, а не измеренный сетевой отказ.
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;Параметры и ход выполнения:
- Переменная сохраняет строку, полученную первым вызовом.
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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GameServerAddress:bridge.GameServerAddress.
Внутренний код реализации, не самостоятельный скрипт.
case "gameserveripstring": return new InjectionValue(bridge.GameServerAddress);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetCharsListForShard();Возвращает известные клиенту имена персонажей текущего shard.
Параметров нет.
Array строк. Нет известных имён и текущего персонажа — пустой массив.
- В менеджерской сессии читается SessionControl.Characters. В standalone сначала используются LastCharacterManager для account/server; если список пуст, читается LoginScene.Characters без пустых имён; затем используется текущий Player.Name как единственный элемент.
- Это локальные известные имена; команда не запрашивает полный список у сервера и не гарантирует свежесть кэша.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.GetCharsListForShard();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Цикл работает с фактическим массивом известных имён.
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;Параметры и ход выполнения:
- Индекс 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;Параметры и ход выполнения:
- Размер списка не сообщает число слотов аккаунта на сервере.
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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.StringArray:StringArray(bridge.GetCharactersForCurrentShard()). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetCharactersForCurrentShard:bridge.GetCharactersForCurrentShard().
Внутренний код реализации, не самостоятельный скрипт.
case "getcharslistforshard": return StringArray(bridge.GetCharactersForCurrentShard());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.GetPing();
UO.Print("GetPing: " + Convert.ToString(result));Параметры и ход выполнения:
- Чтение кэша без нового сетевого запроса. Пример выбирает 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;Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- 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.
Параметры: Параметров нет.
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.GetPing. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetPing:bridge.GetPing().
Внутренний код реализации, не самостоятельный скрипт.
public int GetPing() => bridge.GetPing();Параметры: timeout (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.GetPing. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetPing:bridge.GetPing(Math.Max(0, NumberConversions.ToInt(timeout))). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(timeout).
Внутренний код реализации, не самостоятельный скрипт.
public int GetPing(InjectionValue timeout) => bridge.GetPing(Math.Max(0, NumberConversions.ToInt(timeout)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 принимает миллисекунды. Автопауза при разрыве связи и ручная пауза задерживают выполнение примеров: проверка таймаута продолжится только после снятия паузы. Эти команды сами не снимают паузу и не включают автореконнект.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.IsOnline();
UO.Print("IsOnline: " + Convert.ToString(result));Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- Сравнение с 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;Параметры и ход выполнения:
- 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.
Параметры: Параметров нет.
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.IsOnline. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsOnline:bridge.IsOnline().
Внутренний код реализации, не самостоятельный скрипт.
public int IsOnline() => bridge.IsOnline();Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 принимает миллисекунды. Автопауза при разрыве связи и ручная пауза задерживают выполнение примеров: проверка таймаута продолжится только после снятия паузы. Эти команды сами не снимают паузу и не включают автореконнект.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.Online();
UO.Print("Online: " + Convert.ToString(result));Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- Сравнение с 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;Параметры и ход выполнения:
- 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.
Параметры: Параметров нет.
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [Online]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsOnline:bridge.IsOnline().
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
() => bridge.IsOnline()Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.Resend();Посылает запрос повторной синхронизации мира.
Параметров нет.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- Resync отправляет NetClient.Socket.Send_Resync на игровом потоке. Это запрос обновления, не переподключение и не подтверждение получения данных.
- В примерах UO.Wait задаёт только паузу скрипта; окончание паузы не доказывает выполнение запроса сервером.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.Resend");
UO.Resend();Параметры и ход выполнения:
- Посылает запрос повторной синхронизации мира.
UO.Resend();Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- В примерах 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.
Параметры: Параметров нет.
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Resync:bridge.Resync().
Внутренний код реализации, не самостоятельный скрипт.
case "resend": bridge.Resync(); break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.ShardName();Читает имя шарда.
Параметров нет.
string — текст поля bridge.ShardName; без доступных данных возможна пустая строка. Это не признак подключения и не числовой ID.
- ExecuteClientApiCompatibility возвращает bridge.ShardName без изменения выбора профиля или сервера.
- Читает текущее локальное состояние. Пакета, target и автоматического обновления нет; отдельные чтения могут видеть разные состояния.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.ShardName();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Читает имя шарда.
var value = UO.ShardName();
UO.Print(value);Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- Читает текущее локальное состояние. Пакета, 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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ShardName:bridge.ShardName.
Внутренний код реализации, не самостоятельный скрипт.
case "shardname":
case "profileshardname": return new InjectionValue(bridge.ShardName);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.ShardPath();Читает путь текущего профиля.
Параметров нет.
string — текст поля bridge.CurrentProfilePath; без доступных данных возможна пустая строка. Это не признак подключения и не числовой ID.
- ExecuteClientApiCompatibility возвращает bridge.CurrentProfilePath без изменения выбора профиля или сервера.
- Читает текущее локальное состояние. Пакета, target и автоматического обновления нет; отдельные чтения могут видеть разные состояния.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.ShardPath();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Читает путь текущего профиля.
var value = UO.ShardPath();
UO.Print(value);Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- Читает текущее локальное состояние. Пакета, 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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CurrentProfilePath:bridge.CurrentProfilePath.
Внутренний код реализации, не самостоятельный скрипт.
case "shardpath":
case "clientprofilepath": return new InjectionValue(bridge.CurrentProfilePath);ClassicUO — Bad Newbie & C# Scripts IDE