RU UO Topic profiles configuration - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

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

Профили и конфигурация

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

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

Разделы

Тема Команды и пояснения
GetProfile UO.GetProfile
ProfileName UO.ProfileName
ProfileShardName UO.ProfileShardName
ChangeProfile UO.ChangeProfile
ExtChangeProfile UO.ExtChangeProfile
ResetProfile UO.ResetProfile
SaveConfig UO.SaveConfig
Global Variables UO.GetGlobal · UO.SetGlobal · UO.GListGet · UO.GListSet · UO.GListSize
EasyUO Variables UO.GetEasyUO · UO.SetEasyUO
MUL Path UO.SetMulPath

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

Профили

UO.GetProfile · UO.ProfileName · UO.ProfileShardName · UO.ChangeProfile · UO.ExtChangeProfile · UO.ResetProfile · UO.SaveConfig · UO.ReqProfile · UO.ClientProfilePath · UO.ClientPath · UO.SetMulPath

Глобальные переменные

UO.GetGlobal · UO.SetGlobal · UO.GetEasyUO · UO.SetEasyUO · UO.GListClear · UO.GListGet · UO.GListPosName · UO.GListPosValue · UO.GListSet · UO.GListSize

Горячие клавиши/Настройки

UO.LoadHotkeys · UO.SaveHotkeys · UO.Set · UO.SetDefault

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

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

UO.GetGlobal

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

var text = UO.GetGlobal("manual.delay");
var delayMs = 350;
if (Truth(text != "N/A") && Truth(IsNumeric(text)))
{
    var parsed = Val(text);
    if (Truth(parsed >= 50) && Truth(parsed <= 5000))
    {
        delayMs = checked((int)parsed);
    }
}
await Delay(delayMs);

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool IsNumeric(object? value) => double.TryParse(Convert.ToString(value), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out _);
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
double Val(object? value) => double.TryParse(Convert.ToString(value), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out var number) ? number : 0;

UO.SetGlobal

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

UO.SetGlobal("manual.delay", 350);
UO.SetGlobal("manual.delay", 600);
var text = UO.GetGlobal("manual.delay");
if (Truth(IsNumeric(text)))
{
    await Delay(Val(text));
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool IsNumeric(object? value) => double.TryParse(Convert.ToString(value), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out _);
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
double Val(object? value) => double.TryParse(Convert.ToString(value), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out var number) ? number : 0;

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


UO.ChangeProfile

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

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

dynamic UO.ChangeProfile(object? name);

Меняет выбранный профиль следующего подключения самостоятельного клиента, когда сессия отключена.

Параметры

  • name — Имя сохранённого профиля/персонажа, разрешаемое TryResolveProfileCharacter для выбранного shard. Пустое/неизвестное имя даёт -4.

Возвращает

int: 0 — выбор подготовлен; -2 — менеджерская сессия либо подключение/игровой мир активны; -3 — выполняется более одного скрипта; -4 — имя профиля/shard не разрешается.

Поведение

  • ChangeProfile передаёт пустые shard/character; ExtChangeProfile допускает явный shard и character. В менеджерской сессии нужно выбрать другую сессию в ClassicUO Manager — работающая сессия сохраняет свой профиль.
  • При успехе сохраняет и выгружает текущий профиль, меняет LastServerName, сохраняет настройки и назначает следующий character. Само подключение не начинается; для него отдельно вызывается Connect.

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

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

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

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

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

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

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

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

  • Используйте фактическое сохранённое имя профиля; отрицательный код описывает отказ.
var status = UO.ChangeProfile("ExampleProfile");
UO.Print(Convert.ToString(status));

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

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

  • Отключённый standalone клиент без другого нарушения возвращает -4 для пустого имени.
return  RunScenario();
 object? RunScenario()
{
    var status = UO.ChangeProfile("");
    UO.Print(Convert.ToString(status));
    return null;
}

3. Подключение после успешного выбора — класс сценария

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

  • Connect вызывается только после кода 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 status = UO.ChangeProfile("ExampleProfile");
        if (Truth(status == 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;
}

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

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

UO.ChangeProfile(name) — UO.ChangeProfile(Any)

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

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

При вызове:

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

case "changeprofile":

                    return new InjectionValue(bridge.ChangeProfileSelection(Text(0), string.Empty, string.Empty));

UO.ClientPath

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

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

string UO.ClientPath();

Возвращает каталог установки/исполняемых файлов клиента.

Параметры

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

Возвращает

string — путь к каталогу. Это не bool, не массив и не ID. Пустой путь означает, что значение недоступно; не используйте его как текущую рабочую папку по умолчанию.

Поведение

  • Читается CUOEnviroment.ExecutablePath. Это не маршрут движения, не список точек, не папка скрипта и не путь к данным игры.
  • Команда только читает путь, ничего не открывает, не создаёт и не сохраняет. Конечный разделитель не следует предполагать; пример helper добавляет его при необходимости.
  • Имя является игровым/клиентским API и пишется с UO. ClientPath возвращает каталог клиента, ClientProfilePath — каталог активного профиля.

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

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

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

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

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

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

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

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

  • Аргументов нет. folder — строка; пустое значение обрабатывается отдельно.
var folder = UO.ClientPath();
if (Truth(folder == ""))
{
    UO.Print("Folder is not available");
    return null;
}
UO.Print(folder);

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

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

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

  • Эти папки имеют разное назначение. Скрипт выводит обе строки, не меняя конфигурацию или профиль.
return  RunScenario();
 object? RunScenario()
{
    var client = UO.ClientPath();
    var profile = UO.ClientProfilePath();
    UO.Print("Client: " + client);
    if (Truth(profile == ""))
    {
        UO.Print("No current profile");
    }
    else
    {
        UO.Print("Profile: " + profile);
    }

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

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

  • ChildPath показана целиком: folder — полученный каталог, leaf — имя файла. Это соединение строк для заданного имени, не универсальный нормализатор путей.
  • Файл не создаётся и не читается; сначала можно проверить полученную строку.
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 folder = UO.ClientPath();
        var filePath = ChildPath(folder, "sample.json");
        if (Truth(filePath != ""))
        {
            UO.Print("Example path: " + filePath);
        }

        return null;
    }

    dynamic ChildPath(dynamic folder, dynamic leaf)
    {
        if (Truth(folder == ""))
        {
            return "";
        }

        var last = Right(folder, 1);
        if (Truth(last == "/") || Truth(last == "\\"))
        {
            return folder + leaf;
        }

        return folder + "/" + leaf;
    }

    string Right(object? value, int count)
    {
        string text = Convert.ToString(value) ?? "";
        return text[Math.Max(0, text.Length - count)..];
    }

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

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

Результат: string / String.

При вызове:

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

case "clientpath": return new InjectionValue(bridge.ClientPath);

UO.ClientProfilePath

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

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

string UO.ClientProfilePath();

Возвращает текущий каталог профиля клиента.

Параметры

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

Возвращает

string — путь к каталогу. Это не bool, не массив и не ID. Пустой путь означает, что значение недоступно; не используйте его как текущую рабочую папку по умолчанию.

Поведение

  • Читается ProfileManager.ProfilePath; если профиль ещё не выбран, возвращается пустая строка. Сам вызов не создаёт профиль и не переносит настройки.
  • Команда только читает путь, ничего не открывает, не создаёт и не сохраняет. Конечный разделитель не следует предполагать; пример helper добавляет его при необходимости.
  • Имя является игровым/клиентским API и пишется с UO. ClientPath возвращает каталог клиента, ClientProfilePath — каталог активного профиля.

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

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

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

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

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

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

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

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

  • Аргументов нет. folder — строка; пустое значение обрабатывается отдельно.
var folder = UO.ClientProfilePath();
if (Truth(folder == ""))
{
    UO.Print("Folder is not available");
    return null;
}
UO.Print(folder);

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

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

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

  • Эти папки имеют разное назначение. Скрипт выводит обе строки, не меняя конфигурацию или профиль.
return  RunScenario();
 object? RunScenario()
{
    var client = UO.ClientPath();
    var profile = UO.ClientProfilePath();
    UO.Print("Client: " + client);
    if (Truth(profile == ""))
    {
        UO.Print("No current profile");
    }
    else
    {
        UO.Print("Profile: " + profile);
    }

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

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

  • ChildPath показана целиком: folder — полученный каталог, leaf — имя файла. Это соединение строк для заданного имени, не универсальный нормализатор путей.
  • Файл не создаётся и не читается; сначала можно проверить полученную строку.
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 folder = UO.ClientProfilePath();
        var filePath = ChildPath(folder, "sample.json");
        if (Truth(filePath != ""))
        {
            UO.Print("Example path: " + filePath);
        }

        return null;
    }

    dynamic ChildPath(dynamic folder, dynamic leaf)
    {
        if (Truth(folder == ""))
        {
            return "";
        }

        var last = Right(folder, 1);
        if (Truth(last == "/") || Truth(last == "\\"))
        {
            return folder + leaf;
        }

        return folder + "/" + leaf;
    }

    string Right(object? value, int count)
    {
        string text = Convert.ToString(value) ?? "";
        return text[Math.Max(0, text.Length - count)..];
    }

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

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

Результат: string / String.

При вызове:

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

case "shardpath":

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

UO.ExtChangeProfile

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

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

dynamic UO.ExtChangeProfile(object? profileName);
dynamic UO.ExtChangeProfile(object? profileName, object? shardName);
dynamic UO.ExtChangeProfile(object? profileName, object? shardName, object? charName);

Меняет выбранный профиль следующего подключения самостоятельного клиента, когда сессия отключена.

Параметры

  • profileName — Имя сохранённого профиля/персонажа, разрешаемое TryResolveProfileCharacter для выбранного shard. Пустое/неизвестное имя даёт -4.
  • shardName — Необязательное имя shard. Пустое значение использует CurrentProfile.ServerName, World.ServerName или LastServerName.
  • charName — Необязательное имя персонажа. Пустое значение использует сохранённое имя профиля.

Возвращает

int: 0 — выбор подготовлен; -2 — менеджерская сессия либо подключение/игровой мир активны; -3 — выполняется более одного скрипта; -4 — имя профиля/shard не разрешается.

Поведение

  • ChangeProfile передаёт пустые shard/character; ExtChangeProfile допускает явный shard и character. В менеджерской сессии нужно выбрать другую сессию в ClassicUO Manager — работающая сессия сохраняет свой профиль.
  • При успехе сохраняет и выгружает текущий профиль, меняет LastServerName, сохраняет настройки и назначает следующий character. Само подключение не начинается; для него отдельно вызывается Connect.

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

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

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

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

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

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

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

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

  • Используйте фактическое сохранённое имя профиля; отрицательный код описывает отказ.
var status = UO.ExtChangeProfile("ExampleProfile");
UO.Print(Convert.ToString(status));

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

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

  • Отключённый standalone клиент без другого нарушения возвращает -4 для пустого имени.
return  RunScenario();
 object? RunScenario()
{
    var status = UO.ExtChangeProfile("");
    UO.Print(Convert.ToString(status));
    return null;
}

3. Подключение после успешного выбора — класс сценария

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

  • Connect вызывается только после кода 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 status = UO.ExtChangeProfile("ExampleProfile");
        if (Truth(status == 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;
}

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

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

UO.ExtChangeProfile(profileName) — UO.ExtChangeProfile(Any)

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

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

При вызове:

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

case "extchangeprofile":

                {

                    string requestedProfile = Text(0);

                    string requestedShard = arguments.Length > 1 ? Text(1) : string.Empty;

                    string requestedCharacter = arguments.Length > 2 ? Text(2) : string.Empty;

                    return new InjectionValue(bridge.ChangeProfileSelection(requestedProfile, requestedShard, requestedCharacter));

                }

UO.ExtChangeProfile(profileName, shardName) — UO.ExtChangeProfile(Any,Any)

Параметры: profileName (Any), shardName (Any)

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

При вызове:

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

case "extchangeprofile":

                {

                    string requestedProfile = Text(0);

                    string requestedShard = arguments.Length > 1 ? Text(1) : string.Empty;

                    string requestedCharacter = arguments.Length > 2 ? Text(2) : string.Empty;

                    return new InjectionValue(bridge.ChangeProfileSelection(requestedProfile, requestedShard, requestedCharacter));

                }

UO.ExtChangeProfile(profileName, shardName, charName) — UO.ExtChangeProfile(Any,Any,Any)

Параметры: profileName (Any), shardName (Any), charName (Any)

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

При вызове:

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

case "extchangeprofile":

                {

                    string requestedProfile = Text(0);

                    string requestedShard = arguments.Length > 1 ? Text(1) : string.Empty;

                    string requestedCharacter = arguments.Length > 2 ? Text(2) : string.Empty;

                    return new InjectionValue(bridge.ChangeProfileSelection(requestedProfile, requestedShard, requestedCharacter));

                }

UO.GListClear

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

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

void UO.GListClear();

Очищает весь временный список перед новой серией действий.

Параметры

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

Возвращает

void — результата нет. После очистки GListSize() возвращает 0.

Поведение

  • Список принадлежит экземпляру runtime. Другие запуски скриптов имеют свои списки. GList не является общим межпрофильным хранилищем; эти команды не записывают файл и не входят в сохранённое состояние профиля. Новому runtime достаётся пустой список. Это также не var/объявление переменной и не UO.SetGlobal.
  • Новое имя добавляется в конец. Повторное имя без учёта регистра заменяет значение и написание имени на прежнем месте. Чтение ничего не удаляет. Нельзя очищать или добавлять записи посреди перебора, если нужны стабильные индексы.
  • Операции локальные: без пакетов, поиска объектов и задержки. Set/Get ищут имя последовательно; для больших наборов используйте Dictionary. Отдельной команды удаления одного ключа в этом семействе нет; Clear очищает все записи.

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

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

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

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

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

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

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

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

  • Clear удаляет оба правила, Size подтверждает пустоту. Предметы персонажа остаются на месте.
UO.GListClear();
UO.GListSet("bandage", 0x0E21);
UO.GListSet("gold", 0x0EED);
UO.GListClear();
if (Truth(UO.GListSize() == 0))
{
    UO.Print("Batch rules cleared");
}

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

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

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

  • Старые правила удаляются перед добавлением ore; перебор показывает только новое правило с graphic 0x19B9.
return  RunScenario();
 object? RunScenario()
{
    UO.GListClear();
    UO.GListSet("bandage", 0x0E21);
    UO.GListSet("gold", 0x0EED);
    UO.GListClear();
    UO.GListSet("ore", 0x19B9);
    var i = 0;
    while (Truth(i < UO.GListSize()))
    {
        var name = UO.GListPosName(i);
        var graphic = UO.GListPosValue(i);
        UO.Print(name + " | graphic: " + Convert.ToString(graphic));
        i = i + 1;
    }

    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. GListClear — 3 — класс сценария

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

  • Число, ранее прочитанное в retained, остаётся доступным после очистки списка. Список уже содержит 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()
    {
        UO.GListClear();
        UO.GListSet("bandage", 0x0E21);
        UO.GListSet("gold", 0x0EED);
        var retained = UO.GListGet("bandage");
        UO.GListClear();
        UO.Print("Retained graphic: " + Convert.ToString(retained));
        UO.Print("Remaining entries: " + Convert.ToString(UO.GListSize()));
        return null;
    }
}

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

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

UO.GListClear() — UO.GListClear()

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

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

При вызове:

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

public void GListClear() => globalList.Clear();

UO.GListGet

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

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

dynamic UO.GListGet(object? nameValue);

Читает значение из временного списка по имени правила или счётчика.

Параметры

  • nameValue — object? преобразуется в строку. Имена сравниваются без учёта регистра: "bandage" и "BANDAGE" — один ключ. Рекомендуется непустое строковое имя; пустое имя тоже допустимо.

Возвращает

object? — сохранённое значение с прежним типом. Если ключа нет, int 0. Сохранённый 0 неотличим от отсутствия по одному GListGet; проверяйте имена.

Поведение

  • Список принадлежит экземпляру runtime. Другие запуски скриптов имеют свои списки. GList не является общим межпрофильным хранилищем; эти команды не записывают файл и не входят в сохранённое состояние профиля. Новому runtime достаётся пустой список. Это также не var/объявление переменной и не UO.SetGlobal.
  • Новое имя добавляется в конец. Повторное имя без учёта регистра заменяет значение и написание имени на прежнем месте. Чтение ничего не удаляет. Нельзя очищать или добавлять записи посреди перебора, если нужны стабильные индексы.
  • Операции локальные: без пакетов, поиска объектов и задержки. Set/Get ищут имя последовательно; для больших наборов используйте Dictionary. Отдельной команды удаления одного ключа в этом семействе нет; Clear очищает все записи.

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

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

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

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

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

UO.GListSet("simple_value", 42);
object? result = UO.GListGet("simple_value");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

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

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

  • BANDAGE находит ключ bandage. 0x0E21 — graphic бинта, не его уникальный serial.
UO.GListClear();
UO.GListSet("bandage", 0x0E21);
UO.GListSet("gold", 0x0EED);
var graphic = UO.GListGet("BANDAGE");
if (Truth(graphic == 0x0E21))
{
    UO.Print("Bandage rule selected");
}

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

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

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

  • Полная функция HasEntry перебирает имена; так 0 в processed отличается от отсутствующего missing. Для собственных ключей здесь использованы ASCII-имена.
return  RunScenario();
 object? RunScenario()
{
    UO.GListClear();
    UO.GListSet("processed", 0);
    if (Truth(HasEntry("processed")))
    {
        var count = UO.GListGet("processed");
        UO.Print("Recorded count: " + Convert.ToString(count));
    }

    if (!(Truth(HasEntry("missing"))))
    {
        UO.Print("No entry named missing");
    }

    return null;
}

dynamic HasEntry(dynamic name)
{
    var i = 0;
    while (Truth(i < UO.GListSize()))
    {
        if (Truth(Convert.ToString(UO.GListPosName(i)) == Convert.ToString(name)))
        {
            return true;
        }

        i = i + 1;
    }

    return false;
}

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

3. GListGet — 3 — класс сценария

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

  • delay — число миллисекунд; UO.Wait вызывается только для значения в диапазоне 50–5000. Пример ждёт 350 мс.
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.GListClear();
        UO.GListSet("delay", 350);
        var delayMs = UO.GListGet("delay");
        if (Truth(delayMs >= 50) && Truth(delayMs <= 5000))
        {
            await Delay(delayMs);
        }
        else
        {
            UO.Print("Delay outside the accepted range");
        }

        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.GListGet(nameValue) — UO.GListGet(Any)

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

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

При вызове:

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

public InjectionValue GListGet(InjectionValue nameValue)

        {

            string name = nameValue.ToString();

            int index = globalList.FindIndex(pair => pair.Key.Equals(name, StringComparison.OrdinalIgnoreCase));

            return index >= 0 ? globalList[index].Value : InjectionValue.Zero;

        }

UO.GListPosName

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

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

string UO.GListPosName(object? index);

Читает имя записи по её позиции для перебора правил.

Параметры

  • index — int: индекс от 0 до GListSize()-1 включительно. Это не serial, graphic или количество единиц в стопке.

Возвращает

string — имя в последней записанной форме регистра. Недопустимый индекс возвращает ""; пустой ключ тоже возвращает "".

Поведение

  • Список принадлежит экземпляру runtime. Другие запуски скриптов имеют свои списки. GList не является общим межпрофильным хранилищем; эти команды не записывают файл и не входят в сохранённое состояние профиля. Новому runtime достаётся пустой список. Это также не var/объявление переменной и не UO.SetGlobal.
  • Новое имя добавляется в конец. Повторное имя без учёта регистра заменяет значение и написание имени на прежнем месте. Чтение ничего не удаляет. Нельзя очищать или добавлять записи посреди перебора, если нужны стабильные индексы.
  • Операции локальные: без пакетов, поиска объектов и задержки. Set/Get ищут имя последовательно; для больших наборов используйте Dictionary. Отдельной команды удаления одного ключа в этом семействе нет; Clear очищает все записи.

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

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

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

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

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

UO.GListClear();
UO.GListSet("simple_value", 42);
var result = UO.GListPosName(0);
UO.Print("GListPosName: " + Convert.ToString(result));

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

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

  • Индекс 0 означает первое правило. Перед чтением проверяется, что список не пуст.
UO.GListClear();
UO.GListSet("bandage", 0x0E21);
UO.GListSet("gold", 0x0EED);
if (Truth(UO.GListSize() > 0))
{
    var first = UO.GListPosName(0);
    UO.Print("First rule: " + first);
}

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

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

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

  • HasEntry возвращает true для записанного нулевого счётчика и false для отсутствующего имени.
return  RunScenario();
 object? RunScenario()
{
    UO.GListClear();
    UO.GListSet("processed", 0);
    if (Truth(HasEntry("processed")))
    {
        var count = UO.GListGet("processed");
        UO.Print("Recorded count: " + Convert.ToString(count));
    }

    if (!(Truth(HasEntry("missing"))))
    {
        UO.Print("No entry named missing");
    }

    return null;
}

dynamic HasEntry(dynamic name)
{
    var i = 0;
    while (Truth(i < UO.GListSize()))
    {
        if (Truth(Convert.ToString(UO.GListPosName(i)) == Convert.ToString(name)))
        {
            return true;
        }

        i = i + 1;
    }

    return false;
}

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

3. GListPosName — 3 — класс сценария

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

  • Повторная запись BANDAGE меняет написание имени на первой позиции; gold остаётся второй.
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.GListClear();
        UO.GListSet("bandage", 0x0E21);
        UO.GListSet("gold", 0x0EED);
        UO.GListSet("BANDAGE", 0x0E21);
        var i = 0;
        while (Truth(i < UO.GListSize()))
        {
            var name = UO.GListPosName(i);
            var graphic = UO.GListPosValue(i);
            UO.Print(name + " | graphic: " + Convert.ToString(graphic));
            i = i + 1;
        }

        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.GListPosName(index) — UO.GListPosName(Integer)

Параметры: index (Integer)

Результат: string / String.

При вызове:

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

public string GListPosName(int index) => index >= 0 && index < globalList.Count ? globalList[index].Key : string.Empty;

UO.GListPosValue

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

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

dynamic UO.GListPosValue(object? index);

Читает значение записи по позиции, например graphic из заранее заполненного списка.

Параметры

  • index — int: индекс от 0 до GListSize()-1 включительно. Это не serial, graphic или количество единиц в стопке.

Возвращает

object? — значение с сохранённым типом; недопустимый индекс возвращает int 0. Проверяйте границы, так как настоящий 0 допустим.

Поведение

  • Список принадлежит экземпляру runtime. Другие запуски скриптов имеют свои списки. GList не является общим межпрофильным хранилищем; эти команды не записывают файл и не входят в сохранённое состояние профиля. Новому runtime достаётся пустой список. Это также не var/объявление переменной и не UO.SetGlobal.
  • Новое имя добавляется в конец. Повторное имя без учёта регистра заменяет значение и написание имени на прежнем месте. Чтение ничего не удаляет. Нельзя очищать или добавлять записи посреди перебора, если нужны стабильные индексы.
  • Операции локальные: без пакетов, поиска объектов и задержки. Set/Get ищут имя последовательно; для больших наборов используйте Dictionary. Отдельной команды удаления одного ключа в этом семействе нет; Clear очищает все записи.

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

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

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

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

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

UO.GListClear();
UO.GListSet("simple_value", 42);
object? result = UO.GListPosValue(0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

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

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

  • Индекс 1 выбирает второе правило gold. Проверка границ предшествует чтению значения.
UO.GListClear();
UO.GListSet("bandage", 0x0E21);
UO.GListSet("gold", 0x0EED);
var index = 1;
if (Truth(index >= 0) && Truth(index < UO.GListSize()))
{
    var graphic = UO.GListPosValue(index);
    UO.Print("Second rule graphic: " + Convert.ToString(graphic));
}

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

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

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

  • Перебор ищет graphic бинта в правилах, а не предмет в мире; никаких игровых запросов не отправляется.
return  RunScenario();
 object? RunScenario()
{
    UO.GListClear();
    UO.GListSet("bandage", 0x0E21);
    UO.GListSet("gold", 0x0EED);
    var total = UO.GListSize();
    var i = 0;
    while (Truth(i < total))
    {
        var graphic = UO.GListPosValue(i);
        if (Truth(graphic == 0x0E21))
        {
            UO.Print("Bandage rule at index " + Convert.ToString(i));
        }

        i = i + 1;
    }

    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. GListPosValue — 3 — класс сценария

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

  • Индекс 0 существует, поэтому значение 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()
    {
        UO.GListClear();
        UO.GListSet("processed", 0);
        var index = 0;
        if (Truth(index < UO.GListSize()))
        {
            var count = UO.GListPosValue(index);
            UO.Print("Valid zero count: " + Convert.ToString(count));
        }

        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.GListPosValue(index) — UO.GListPosValue(Integer)

Параметры: index (Integer)

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

При вызове:

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

public InjectionValue GListPosValue(int index) => index >= 0 && index < globalList.Count ? globalList[index].Value : InjectionValue.Zero;

UO.GListSet

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

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

void UO.GListSet(object? nameValue, object? value);

Записывает именованное значение во временный список: например, graphic правила лута или счётчик обработанных предметов.

Параметры

  • nameValue — object? преобразуется в строку. Имена сравниваются без учёта регистра: "bandage" и "BANDAGE" — один ключ. Рекомендуется непустое строковое имя; пустое имя тоже допустимо.

Возвращает

void — результата нет; отдельная команда, без присваивания.

Поведение

  • Список принадлежит экземпляру runtime. Другие запуски скриптов имеют свои списки. GList не является общим межпрофильным хранилищем; эти команды не записывают файл и не входят в сохранённое состояние профиля. Новому runtime достаётся пустой список. Это также не var/объявление переменной и не UO.SetGlobal.
  • Новое имя добавляется в конец. Повторное имя без учёта регистра заменяет значение и написание имени на прежнем месте. Чтение ничего не удаляет. Нельзя очищать или добавлять записи посреди перебора, если нужны стабильные индексы.
  • Операции локальные: без пакетов, поиска объектов и задержки. Set/Get ищут имя последовательно; для больших наборов используйте Dictionary. Отдельной команды удаления одного ключа в этом семействе нет; Clear очищает все записи.

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

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

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

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

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

UO.Print("Calling UO.GListSet");
UO.GListSet("gold", 0x0EED);

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

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

  • bandage и gold — имена правил, числа — graphic. BANDAGE заменяет первую запись, не создаёт третью; вывод показывает порядок.
UO.GListClear();
UO.GListSet("bandage", 0x0E21);
UO.GListSet("gold", 0x0EED);
UO.GListSet("BANDAGE", 0x0E21);
var i = 0;
while (Truth(i < UO.GListSize()))
{
    var name = UO.GListPosName(i);
    var graphic = UO.GListPosValue(i);
    UO.Print(name + " | graphic: " + Convert.ToString(graphic));
    i = i + 1;
}

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

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

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

  • processed начинается с 0. Три шага увеличивают сохранённый счётчик до 3; игровые предметы здесь не перемещаются.
return  RunScenario();
 object? RunScenario()
{
    UO.GListClear();
    UO.GListSet("processed", 0);
    for (int i = (int)(1); i <= 3; i += (int)(1))
    {
        UO.GListSet("processed", UO.GListGet("processed") + 1);
    }

    UO.Print("Recorded count: " + Convert.ToString(UO.GListGet("processed")));
    return null;
}

3. GListSet — 3 — класс сценария

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

  • mode — строка, limit — число 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()
    {
        UO.GListClear();
        UO.GListSet("mode", "inspect");
        UO.GListSet("limit", 2);
        if (Truth(UO.GListGet("mode") == "inspect"))
        {
            for (int i = (int)(1); i <= UO.GListGet("limit"); i += (int)(1))
            {
                UO.Print("Inspect batch: " + Convert.ToString(i));
            }
        }

        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.GListSet(nameValue, value) — UO.GListSet(Any,Any)

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

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

При вызове:

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

public void GListSet(InjectionValue nameValue, InjectionValue value)

        {

            string name = nameValue.ToString();

            int index = globalList.FindIndex(pair => pair.Key.Equals(name, StringComparison.OrdinalIgnoreCase));

            var entry = new KeyValuePair<string, InjectionValue>(name, value);

            if (index >= 0)

                globalList[index] = entry;

            else

                globalList.Add(entry);

        }

UO.GListSize

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

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

int UO.GListSize();

Считает именованные записи временного списка, чтобы проверить пустоту или ограничить перебор.

Параметры

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

Возвращает

int >= 0 — число уникальных имён, не количество предметов или единиц в стопках.

Поведение

  • Список принадлежит экземпляру runtime. Другие запуски скриптов имеют свои списки. GList не является общим межпрофильным хранилищем; эти команды не записывают файл и не входят в сохранённое состояние профиля. Новому runtime достаётся пустой список. Это также не var/объявление переменной и не UO.SetGlobal.
  • Новое имя добавляется в конец. Повторное имя без учёта регистра заменяет значение и написание имени на прежнем месте. Чтение ничего не удаляет. Нельзя очищать или добавлять записи посреди перебора, если нужны стабильные индексы.
  • Операции локальные: без пакетов, поиска объектов и задержки. Set/Get ищут имя последовательно; для больших наборов используйте Dictionary. Отдельной команды удаления одного ключа в этом семействе нет; Clear очищает все записи.

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

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

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

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

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

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

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

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

  • Пустой набор прекращает процедуру до обработки правил.
UO.GListClear();
if (Truth(UO.GListSize() == 0))
{
    UO.Print("No batch rules; stop here");
    return null;
}

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

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

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

  • Два правила перебираются по индексам 0 и 1; условие i < Size не допускает обращения к индексу 2.
return  RunScenario();
 object? RunScenario()
{
    UO.GListClear();
    UO.GListSet("bandage", 0x0E21);
    UO.GListSet("gold", 0x0EED);
    var i = 0;
    while (Truth(i < UO.GListSize()))
    {
        var name = UO.GListPosName(i);
        var graphic = UO.GListPosValue(i);
        UO.Print(name + " | graphic: " + Convert.ToString(graphic));
        i = i + 1;
    }

    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. GListSize — 3 — класс сценария

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

  • Замена BANDAGE не увеличивает число имён; до и после Size равно 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()
    {
        UO.GListClear();
        UO.GListSet("bandage", 0x0E21);
        UO.GListSet("gold", 0x0EED);
        var before = UO.GListSize();
        UO.GListSet("BANDAGE", 0x0E21);
        if (Truth(UO.GListSize() == before))
        {
            UO.Print("Existing rule updated without an extra entry");
        }

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

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

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

При вызове:

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

public int GListSize() => globalList.Count;

UO.GetEasyUO

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

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

string UO.GetEasyUO(object? number);

Читает строку из пользовательского Windows registry EasyUO.

Параметры

  • number — int/значение, преобразуемое NumberConversions.ToInt. Формирует десятичное имя registry value.

Возвращает

string — значение HKCU\Software\EasyUO<number>; если его нет, проверяется имя *. При отсутствии ключа/значения или вне Windows возвращается пустая строка.

Поведение

  • Чтение не создаёт ключ и не обращается к игровому миру. Устаревший registry интерфейс отличается от GetGlobal. Системная ошибка доступа registry может распространиться; отдельного catch в bridge нет.

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

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

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

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

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

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

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

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

  • Сначала читается имя 1, затем *1.
var value = UO.GetEasyUO(1);
UO.Print(value);

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

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

  • Пустая строка может быть отсутствием значения или сохранённым пустым текстом.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetEasyUO(999);
    if (Truth(Len(value) == 0))
    {
        UO.Print("empty");
    }

    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. Сохранённый номер — класс сценария

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

  • Номер определяет registry value, а не serial объекта.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var number = 2;
        var value = UO.GetEasyUO(number);
        UO.Print(value);
        return null;
    }
}

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

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

UO.GetEasyUO(number) — UO.GetEasyUO(Any)

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

Результат: string / String.

При вызове:

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

public string GetEasyUO(InjectionValue number) => bridge.GetEasyUO(NumberConversions.ToInt(number));

UO.GetGlobal

Сигнатуры C#

string UO.GetGlobal(object? name);
dynamic UO.GetGlobal(object? globalRegion, object? varName);

Поведение и результат

SetGlobal и GetGlobal используют одно пространство для всех скриптов и профилей, включая разные процессы Full Client и Client. Значения хранятся как строки; отсутствующий ключ возвращает "N/A". Регистр ключа учитывается. Формы с region используют пару region/name. Файл Manager/Game Manager/CSharp/globals.json читается заново под межпроцессной блокировкой; перезапуск сохраняет значения. Shared-формы — явные синонимы этого же хранилища.

Параметры

  • globalRegion — Пространство имён; объединяется с именем ключа.
  • name — Имя общего ключа с учётом регистра.
  • varName — Имя общего ключа с учётом регистра.

Каждый блок — полный отдельный .csx. Замените демонстрационные serial, type и координаты своими. Параметры идут в порядке сигнатуры; именованные параметры C# позволяют явно указать их назначение.

Команды чата

#getglobal team.target
#get global team.message

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

Каждый блок — полный отдельный .csx. Замените демонстрационные serial, type и координаты своими. Параметры идут в порядке сигнатуры; именованные параметры C# позволяют явно указать их назначение.

1

string value = UO.GetGlobal("team.target");
UO.Print(value);

2

string value = UO.GetGlobal("team.delay");
if (int.TryParse(value, out int milliseconds))
    UO.Print(milliseconds.ToString());

3

UO.Print(Convert.ToString(UO.GetGlobal("team", "delay")));

4

new CommandSample().Execute(UO);

sealed class CommandSample
{
    public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
    {
        string value = api.GetGlobal("team.target");
        api.Print(value);
    }
}

Внутренние вызовы

CSharpGameApi.GetGlobal
  -> CSharpScriptGlobals
  -> InjectionScript.Runtime.InjectionApiUO.RegisterClientApiCompatibility
  -> InjectionScript.Runtime.State.Globals.GetGlobal
Globals -> SharedGlobalStore -> named mutex -> atomic JSON replacement


UO.GetProfile

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

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

string UO.GetProfile(object? serial);

Читает публичное описание персонажа, которое сервер присылает для окна Profile. Полезно для чтения заметок или поиска текста в описании выбранного персонажа. Это не настройки профиля менеджера.

Параметры

  • serial — Serial персонажа: число, строка с ID 0x… либо объектный селектор, например "self" или "lasttarget". Это не тип тела, не имя файла и не профиль менеджера.

Возвращает

string — текст основного описания, без заголовка и подписи. Пустое описание законно; пустой результат также возможен при отсутствии ответа за 3 секунды. Это не true/false. Запрос посылается при каждом вызове; если описание уже сохранено в сеансе, оно возвращается сразу, включая черновик открытого окна. Это не гарантия свежего ответа сервера.

Поведение

  • Описание и его черновик принадлежат сеансу. Закрытие игрового окна сохраняет их без публикации, открытие восстанавливает окно Profile. Явное закрытие собственного Profile отправляет изменённый текст один раз; чужой текст не отправляется. Новый ответ сервера заменяет старые данные, разрыв соединения их очищает. GetProfile сам ничего не редактирует.

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

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

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

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

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

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

1. Прямое применение — прямой скрипт

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

  • "self" — описание своего персонажа; не конфигурация аккаунта. Выводится текст, полученный от сервера или уже сохранённый в сеансе.
var note = UO.GetProfile("self");
if (Truth(note != ""))
{
    UO.Print(note);
}

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

2. Игровое условие — функция сценария

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

  • Нужен существующий lasttarget. FindText ищет регистрозависимое слово "Healer" в произвольном тексте. При совпадении AddObject сохраняет выбранный serial под именем healerNote. Это заметка пользователя, не доказательство профессии NPC.
return  RunScenario();
 object? RunScenario()
{
    if (!(Truth(UO.Exists("lasttarget"))))
    {
        return null;
    }

    var note = UO.GetProfile("lasttarget");
    if (Truth(FindText(note, "Healer") > 0))
    {
        UO.AddObject("healerNote", "lasttarget");
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
int FindText(object? text, object? value) => (Convert.ToString(text) ?? "").IndexOf(Convert.ToString(value) ?? "", StringComparison.Ordinal) + 1;
int FindText(int start, object? text, object? value)
{
    string input = Convert.ToString(text) ?? "";
    return input.IndexOf(Convert.ToString(value) ?? "", Math.Clamp(start - 1, 0, input.Length), StringComparison.Ordinal) + 1;
}

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

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

  • Вся функция HasPublicNote приведена ниже. Проверяет существование объекта и подстроку, возвращает true/false. "Guild" — демонстрационный текст; пустой ответ не подтверждает отсутствие такой записи на сервере.
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(HasPublicNote("lasttarget", "Guild")))
        {
            UO.AddObject("guildNote", "lasttarget");
        }

        return null;
    }

    dynamic HasPublicNote(dynamic serial, dynamic phrase)
    {
        if (!(Truth(UO.Exists(serial))))
        {
            return false;
        }

        return FindText(UO.GetProfile(serial), phrase) > 0;
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
    int FindText(object? text, object? value) => (Convert.ToString(text) ?? "").IndexOf(Convert.ToString(value) ?? "", StringComparison.Ordinal) + 1;
    int FindText(int start, object? text, object? value)
    {
        string input = Convert.ToString(text) ?? "";
        return input.IndexOf(Convert.ToString(value) ?? "", Math.Clamp(start - 1, 0, input.Length), StringComparison.Ordinal) + 1;
    }
}

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

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

UO.GetProfile(serial) — UO.GetProfile(Any)

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

Результат: string / String.

При вызове:

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

public string GetProfile(InjectionValue serial) => bridge.GetProfile(GetObject(serial));

UO.LoadHotkeys

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

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

void UO.LoadHotkeys();

Загружает сохранённые макросы и горячие клавиши.

Параметры

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

Возвращает

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

Поведение

  • LoadHotkeys вызывает _world.Macros.Load через Invoke. Текущая таблица макросов заменяется данными локального профиля.
  • Изменяет или показывает только указанные локальные данные. Серверного подтверждения у этой команды нет.

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

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

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

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

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

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

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

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

  • Загружает сохранённые макросы и горячие клавиши.
UO.LoadHotkeys();

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

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

  • LoadHotkeys вызывает _world.Macros.Load через Invoke. Текущая таблица макросов заменяется данными локального профиля.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.ProfileName());
    UO.LoadHotkeys();
    return null;
}

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

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

  • Изменяет или показывает только указанные локальные данные. Серверного подтверждения у этой команды нет.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.LoadHotkeys();
        UO.Print("Macros loaded");
        return null;
    }
}

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

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

UO.LoadHotkeys() — UO.LoadHotkeys()

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

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

При вызове:

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

case "loadhotkeys": bridge.LoadHotkeys(); break;

UO.ProfileName

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

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

dynamic UO.ProfileName();

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

Параметры

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

Возвращает

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

Поведение

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

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

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

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

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

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

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

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

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

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

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

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

  • ExecuteClientApiCompatibility возвращает bridge.ProfileName без изменения выбора профиля или сервера.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.ProfileName();
    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.ProfileName();
        UO.Wait(500);
        var after = UO.ProfileName();
        UO.Print(before = after);
        return null;
    }
}

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

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

UO.ProfileName() — UO.ProfileName()

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

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

При вызове:

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

case "profilename": return new InjectionValue(bridge.ProfileName);

UO.ProfileShardName

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

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

dynamic UO.ProfileShardName();

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

Параметры

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

Возвращает

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

Поведение

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

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

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

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

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

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

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

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

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

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

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

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

  • ExecuteClientApiCompatibility возвращает bridge.ShardName без изменения выбора профиля или сервера.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.ProfileShardName();
    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.ProfileShardName();
        UO.Wait(500);
        var after = UO.ProfileShardName();
        UO.Print(before = after);
        return null;
    }
}

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

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

UO.ProfileShardName() — UO.ProfileShardName()

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

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

При вызове:

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

case "shardname":

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

UO.ReqProfile

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

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

void UO.ReqProfile();
void UO.ReqProfile(object? mobile);

Печатает известный profile-текст персонажа.

Параметры

  • mobile — Необязательный serial/алиас. Без аргумента — "lasttarget". Это не локальный профиль настроек ClassicUO.

Возвращает

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

Поведение

  • ExecuteLegacyManualAlias вызывает GetProfile, затем SystemMessage. Bridge.GetProfile отправляет RequestProfile, затем до 3 секунд проверяет CharacterPanels.Profile.CurrentText с паузами 25 ms. Уже имеющийся текст может вернуться сразу; при timeout выводит сообщение и даёт пустую строку. Эта команда печатает текст, но не возвращает его.
  • Для значения string используйте UO.GetProfile. Наличие текста не является доказательством успешного переименования или статуса персонажа.

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

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

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

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

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

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

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

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

  • Печатает известный profile-текст персонажа.
UO.ReqProfile();

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

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

  • ExecuteLegacyManualAlias вызывает GetProfile, затем SystemMessage. Bridge.GetProfile отправляет RequestProfile, затем до 3 секунд проверяет CharacterPanels.Profile.CurrentText с паузами 25 ms. Уже имеющийся текст может вернуться сразу; при timeout выводит сообщение и даёт пустую строку. Эта команда печатает текст, но не возвращает его.
return  RunScenario();
 object? RunScenario()
{
    UO.ReqProfile("self");
    return null;
}

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

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

  • Для значения string используйте UO.GetProfile. Наличие текста не является доказательством успешного переименования или статуса персонажа.
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 id = UO.GetSerial("lasttarget");
        if (Truth(UO.Exists(id)))
        {
            UO.ReqProfile(id);
        }

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

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

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

При вызове:

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

case "reqprofile":

                    SystemMessage(GetProfile(arguments.Length > 0 ? arguments[0] : new InjectionValue("lasttarget")));

                    break;

UO.ReqProfile(mobile) — UO.ReqProfile(Any)

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

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

При вызове:

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

case "reqprofile":

                    SystemMessage(GetProfile(arguments.Length > 0 ? arguments[0] : new InjectionValue("lasttarget")));

                    break;

UO.ResetProfile

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

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

void UO.ResetProfile();

Сбрасывает активный профиль к значениям по умолчанию.

Параметры

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

Возвращает

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

Поведение

  • ResetProfile вызывает ProfileManager.ResetCurrentProfileToDefault; если активного профиля нет, выводится ошибка. Меняет локальные настройки, поэтому сохранённые пользовательские значения могут быть потеряны.
  • Изменяет или показывает только указанные локальные данные. Серверного подтверждения у этой команды нет.

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

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

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

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

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

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

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

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

  • Сбрасывает активный профиль к значениям по умолчанию.
UO.ResetProfile();

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

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

  • ResetProfile вызывает ProfileManager.ResetCurrentProfileToDefault; если активного профиля нет, выводится ошибка. Меняет локальные настройки, поэтому сохранённые пользовательские значения могут быть потеряны.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.ProfileName());
    UO.ResetProfile();
    return null;
}

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

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

  • Изменяет или показывает только указанные локальные данные. Серверного подтверждения у этой команды нет.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.ResetProfile();
        UO.SaveConfig();
        return null;
    }
}

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

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

UO.ResetProfile() — UO.ResetProfile()

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

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

При вызове:

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

case "resetprofile": bridge.ResetProfile(); break;

UO.SaveConfig

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

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

void UO.SaveConfig();

Сохраняет текущий профиль ClassicUO.

Параметры

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

Возвращает

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

Поведение

  • SaveConfig вызывает ProfileManager.SaveCurrentProfile через Invoke. Команда записывает настройки локального профиля; путь берётся у ProfileManager.
  • Изменяет или показывает только указанные локальные данные. Серверного подтверждения у этой команды нет.

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

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

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

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

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

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

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

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

  • Сохраняет текущий профиль ClassicUO.
UO.SaveConfig();

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

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

  • SaveConfig вызывает ProfileManager.SaveCurrentProfile через Invoke. Команда записывает настройки локального профиля; путь берётся у ProfileManager.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.ProfileName());
    UO.SaveConfig();
    return null;
}

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

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

  • Изменяет или показывает только указанные локальные данные. Серверного подтверждения у этой команды нет.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.SaveConfig();
        UO.Print(UO.ShardPath());
        return null;
    }
}

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

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

UO.SaveConfig() — UO.SaveConfig()

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

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

При вызове:

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

public void SaveConfig() => bridge.SaveConfig();

UO.SaveHotkeys

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

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

void UO.SaveHotkeys();

Сохраняет макросы и горячие клавиши.

Параметры

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

Возвращает

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

Поведение

  • SaveHotkeys вызывает _world.Macros.Save через Invoke. Сохраняется локальная таблица макросов текущего профиля.
  • Изменяет или показывает только указанные локальные данные. Серверного подтверждения у этой команды нет.

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

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

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

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

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

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

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

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

  • Сохраняет макросы и горячие клавиши.
UO.SaveHotkeys();

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

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

  • SaveHotkeys вызывает _world.Macros.Save через Invoke. Сохраняется локальная таблица макросов текущего профиля.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.ProfileName());
    UO.SaveHotkeys();
    return null;
}

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

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

  • Изменяет или показывает только указанные локальные данные. Серверного подтверждения у этой команды нет.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.SaveHotkeys();
        UO.LoadHotkeys();
        return null;
    }
}

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

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

UO.SaveHotkeys() — UO.SaveHotkeys()

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

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

При вызове:

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

case "savehotkeys": bridge.SaveHotkeys(); break;

UO.Set

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

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

void UO.Set(object? name, object? value);

Меняет одну из трёх legacy-настроек.

Параметры

  • name — Строка без учёта регистра: "finddistance", "grabdelay" либо "equipfordress". Неизвестное имя молча игнорируется.
  • value — int либо double/0x-текст. Для строковой формы TryStr2Int; неверный текст превращается в 0, не ошибку.

Возвращает

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

Поведение

  • finddistance вызывает bridge.SetFindDistance, grabdelay — bridge.SetGrabDelay, equipfordress присваивает state.UseEquipForDress. Это три отдельных настройки; универсального setter произвольных свойств нет.
  • Строковое значение сначала преобразуется TryStr2Int с fallback=0. Поэтому опечатка может записать 0 в распознанную настройку. Сам Set не ищет предметы и не переодевает.

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

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

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

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

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

UO.Print("Calling UO.Set");
UO.Set("finddistance", 10);

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

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

  • Меняет одну из трёх legacy-настроек.
UO.Set("finddistance", 10);

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

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

  • finddistance вызывает bridge.SetFindDistance, grabdelay — bridge.SetGrabDelay, equipfordress присваивает state.UseEquipForDress. Это три отдельных настройки; универсального setter произвольных свойств нет.
return  RunScenario();
 object? RunScenario()
{
    UO.Set("grabdelay", "250");
    return null;
}

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

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

  • Строковое значение сначала преобразуется TryStr2Int с fallback=0. Поэтому опечатка может записать 0 в распознанную настройку. Сам Set не ищет предметы и не переодевает.
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.Set("equipfordress", 1);
        UO.Print(UO.FindDistance());
        return null;
    }
}

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

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

UO.Set(name, value) — UO.Set(String,Integer)

Параметры: name (String), value (Integer/String)

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

При вызове:

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

public void Set(string name, int value)

        {

            if (name.Equals("finddistance", StringComparison.OrdinalIgnoreCase))

            {

                bridge.SetFindDistance(value);

            }

            else if (name.Equals("grabdelay", StringComparison.OrdinalIgnoreCase))

            {

                bridge.SetGrabDelay(value);

            }

            else if (name.Equals("equipfordress", StringComparison.OrdinalIgnoreCase))

            {

                state.UseEquipForDress = value;

            }

        }

UO.Set(name, value) — UO.Set(String,String)

Параметры: name (String), value (Integer/String)

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

При вызове:

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

public void Set(string name, string valueStr)

        {

            int valueInt = NumberConversions.TryStr2Int(valueStr, out var value) ? value : 0;

            Set(name, valueInt);

        }

UO.SetDefault

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

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

void UO.SetDefault(object? name, object? @object);

Сохраняет именованный alias serial в состоянии runtime.

Параметры

  • name — Имя alias как текст, регистр обрабатывает Objects-словарь.
  • object — Serial/алиас через Arg/GetObject. Имя и serial идут в этом порядке.

Возвращает

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

Поведение

  • ExecuteLegacyManualAlias вызывает state.Objects.Set(Text(0),Arg(1)). Интерактивного выбора нет; существование serial не проверяется.
  • Это запись имени объекта, не сброс профиля и не изменение всех настроек на defaults. При последующих вызовах alias разрешается заново.
  • В обычном клиентском host эти данные состояния берутся из GetPersistentState менеджера и общие для скриптов/чата/макросов одного мира/профиля, а не принадлежат одному скрипту. Другой процесс или явно отдельный InjectionRuntimeState имеет другое состояние. Загрузка/очистка профиля может его заменить; сохранённые serial всё равно проверяются по загруженному миру.

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

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

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

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

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

UO.Print("Calling UO.SetDefault");
UO.SetDefault("manualObject", UO.Self());

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

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

  • Сохраняет именованный alias serial в состоянии runtime.
UO.SetDefault("manualObject", UO.Self());

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

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

  • ExecuteLegacyManualAlias вызывает state.Objects.Set(Text(0),Arg(1)). Интерактивного выбора нет; существование serial не проверяется.
return  RunScenario();
 object? RunScenario()
{
    UO.SetDefault("manualBag", UO.Backpack());
    UO.Print(UO.GetSerial("manualBag"));
    return null;
}

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

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

  • Это запись имени объекта, не сброс профиля и не изменение всех настроек на defaults. При последующих вызовах alias разрешается заново.
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 id = UO.GetSerial("lasttarget");
        if (Truth(UO.Exists(id)))
        {
            UO.SetDefault("manualTarget", id);
            UO.Print(UO.GetName("manualTarget"));
        }

        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.SetDefault(name, object) — UO.SetDefault(Any,Any)

Параметры: name (Any), object (Any)

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

При вызове:

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

case "setdefault":

                    if (arguments.Length > 1) state.Objects.Set(Text(0), Arg(1));

                    break;

UO.SetEasyUO

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

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

void UO.SetEasyUO(object? number, object? value);

Записывает строковое значение в Windows registry EasyUO.

Параметры

  • number — int номер значения, форматируется double без *-префикса.
  • value — Текст через ToString; сохраняется как передан.

Возвращает

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

Поведение

  • На Windows открывает/создаёт HKCU\Software\EasyUO с правом записи, SetValue(decimalNumber,value,RegistryValueKind.string). На других ОС выводит сообщение и не записывает.
  • Это внешняя постоянная запись в registry текущего пользователя, не scoped global runtime и не игровой serial. Ошибки доступа к registry не скрываются этой функцией.

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

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

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

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

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

UO.Print("Calling UO.SetEasyUO");
UO.SetEasyUO(9001, "manual-example");

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

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

  • Записывает строковое значение в Windows registry EasyUO.
UO.SetEasyUO(9001, "manual-example");

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

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

  • На Windows открывает/создаёт HKCU\Software\EasyUO с правом записи, SetValue(decimalNumber,value,RegistryValueKind.String). На других ОС выводит сообщение и не записывает.
return  RunScenario();
 object? RunScenario()
{
    UO.SetEasyUO(9001, "");
    return null;
}

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

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

  • Это внешняя постоянная запись в registry текущего пользователя, не scoped global runtime и не игровой serial. Ошибки доступа к registry не скрываются этой функцией.
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.SetEasyUO(9001, "manual-example");
        UO.Print(UO.GetEasyUO(9001));
        return null;
    }
}

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

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

UO.SetEasyUO(number, value) — UO.SetEasyUO(Any,Any)

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

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

При вызове:

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

public void SetEasyUO(InjectionValue number, InjectionValue value)

            => bridge.SetEasyUO(NumberConversions.ToInt(number), value.ToString());

UO.SetGlobal

Сигнатуры C#

void UO.SetGlobal(object? name, object? value);
void UO.SetGlobal(object? globalRegion, object? varName, object? varValue);

Поведение и результат

SetGlobal и GetGlobal используют одно пространство для всех скриптов и профилей, включая разные процессы Full Client и Client. Значения хранятся как строки; отсутствующий ключ возвращает "N/A". Регистр ключа учитывается. Формы с region используют пару region/name. Файл Manager/Game Manager/CSharp/globals.json читается заново под межпроцессной блокировкой; перезапуск сохраняет значения. Shared-формы — явные синонимы этого же хранилища.

Параметры

  • globalRegion — Пространство имён; объединяется с именем ключа.
  • name — Имя общего ключа с учётом регистра.
  • value — Значение, сохраняемое как текст.
  • varName — Имя общего ключа с учётом регистра.
  • varValue — Значение, сохраняемое как текст.

Каждый блок — полный отдельный .csx. Замените демонстрационные serial, type и координаты своими. Параметры идут в порядке сигнатуры; именованные параметры C# позволяют явно указать их назначение.

Команды чата

#setglobal team.target 0x40001234
#set global team.message Привіт усім

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

Каждый блок — полный отдельный .csx. Замените демонстрационные serial, type и координаты своими. Параметры идут в порядке сигнатуры; именованные параметры C# позволяют явно указать их назначение.

1

UO.SetGlobal("team.target", 0x40001234);
UO.Print(UO.GetGlobal("team.target"));

2

UO.SetGlobal("team.message", "Привіт");
UO.Print(UO.GetGlobal("team.message"));

3

UO.SetGlobal("team", "delay", "350");
UO.Print(Convert.ToString(UO.GetGlobal("team", "delay")));

4

new CommandSample().Execute(UO);

sealed class CommandSample
{
    public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
    {
        api.SetGlobal("team.target", 0x40001234);
        api.Print(api.GetGlobal("team.target"));
    }
}

Внутренние вызовы

CSharpGameApi.SetGlobal
  -> CSharpScriptGlobals
  -> InjectionScript.Runtime.InjectionApiUO.RegisterClientApiCompatibility
  -> InjectionScript.Runtime.State.Globals.SetGlobal
Globals -> SharedGlobalStore -> named mutex -> atomic JSON replacement


UO.SetMulPath

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

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

void UO.SetMulPath(object? pathValue);

Сохраняет строку пути mulPath в runtime.

Параметры

  • pathValue — Текст через ToString; сохраняется как передан.

Возвращает

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

Поведение

  • Присваивает mulPath = ToString или пустая строка. Файл не открывается, данные карты не перезагружаются и доступность пути не проверяется этой функцией.
  • Это compatibility-хранилище текущего runtime. В проекте нет потребителей private mulPath/showZ; изменение не перезагружает assets и не меняет отображение высоты.

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

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

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

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

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

UO.Print("Calling UO.SetMulPath");
UO.SetMulPath("C:\\Ultima Online");

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

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

  • Сохраняет строку пути mulPath в runtime.
UO.SetMulPath("C:\\Ultima Online");

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

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

  • Присваивает mulPath = ToString или пустая строка. Файл не открывается, данные карты не перезагружаются и доступность пути не проверяется этой функцией.
return  RunScenario();
 object? RunScenario()
{
    UO.SetMulPath("");
    return null;
}

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

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

  • Это compatibility-хранилище текущего runtime. В проекте нет потребителей private mulPath/showZ; изменение не перезагружает assets и не меняет отображение высоты.
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()
    {
        ApplyValue("C:\\Ultima Online");
        return null;
    }

    void ApplyValue(dynamic value)
    {
        UO.SetMulPath(value);
    }
}

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

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

UO.SetMulPath(pathValue) — UO.SetMulPath(Any)

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

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

При вызове:

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

public void SetMulPath(InjectionValue pathValue) => mulPath = pathValue.ToString() ?? string.Empty;
⚠️ **GitHub.com Fallback** ⚠️