Skip to content

UO Topic profiles configuration

Codex edited this page Oct 12, 2026 · 7 revisions

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

Профілі та налаштування

Головна · C# · IDE · Команди UO · За абеткою · Приклади · Мови

Вибір профілю, збереження налаштувань, гарячі клавіші та спільні значення. Профіль зберігає налаштування персонажа; спільне значення середовища скриптів і локальна змінна у функції мають різний час життя.

Розділи

Тема Команди та пояснення
Дані профілю UO.GetProfile
Назва профілю UO.ProfileName
Сервер профілю UO.ProfileShardName
Зміна профілю UO.ChangeProfile
Зміна профілю з параметрами UO.ExtChangeProfile
Скидання профілю UO.ResetProfile
Збереження налаштувань UO.SaveConfig
Спільні значення UO.GetGlobal · UO.SetGlobal · UO.GListGet · UO.GListSet · UO.GListSize
Значення для сумісності з EasyUO UO.GetEasyUO · UO.SetEasyUO
Каталог ігрових даних 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

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

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

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

Параметри

  • name - Ім'я в короткій формі. Регістр важливий: "Loot" та "loot" - різні ключі. Це не шлях до файлу.
  • globalRegion - GlobalRegion - користувальницька мітка області, VarName - ім'я всередині неї; обидва перетворюються на рядки. У цій формі регістр обох частин не є важливим. Мітки 0 та 1 допустимі, але НЕ включають обмін між профілями та НЕ вибирають серверне сховище. Не використовуйте роздільник U+001F у цих іменах.
  • varName - GlobalRegion - користувальницька мітка області, VarName - ім'я всередині неї; обидва перетворюються на рядки. У цій формі регістр обох частин не є важливим. Мітки 0 та 1 допустимі, але НЕ включають обмін між профілями та НЕ вибирають серверне сховище. Не використовуйте роздільник U+001F у цих іменах.

Повернене значення

Завжди string: GetGlobal(name) повертає збережений рядок або "N/A", якщо ключ відсутній. GetGlobal(GlobalRegion, VarName) фактично повертає рядок або "" за відсутності, хоча зареєстрована як object?. Це не bool та не автоматично відновлене число.

Поведінка

  • Коротка форма та форма з регіоном — два незалежні сховища у поточному стані runtime. SetGlobal("x", value) не записує в GetGlobal(0, "x"). Знімок стану включає обидва сховища, однак сам виклик не зберігає файл: запис на диск виконує механізм збереження профілю. Інший профіль не одержує ці значення автоматично. Глобальні var/оголошення змінної та GList - окремі механізми.
  • Збережені "N/A" (коротка форма) та "" (форма з регіоном) не відрізняються від відсутності по одному GetGlobal. Для налаштувань виберіть допустимі значення, відмінні від маркера відсутності, або заведіть окремий ключ наявності. Спочатку перевіряйте рядок, а потім перетворіть число.
  • UO.GetGlobal · UO.SetGlobal · UO.GListGet

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

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

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

var result = UO.GetGlobal("manual.delay");
UO.Print("GetGlobal: " + Convert.ToString(result));

1. GetGlobal - 1 - прямий скрипт

Параметри та порядок виконання:

  • Затримка: manual.delay - ім'я; 350/600 - мілісекунди. GetGlobal читає рядок, IsNumeric перевіряє його перед Val. UO.Wait призупиняє лише цей скрипт. Приклад не змінює швидкість мережі.
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;

2. GetGlobal — 2 — функція сценарію

Параметри та порядок виконання:

  • Режим: manual та gather - різні мітки області; mode – ключ. Читання MANUAL/MODE знаходить manual/mode. Тільки режим hide викликає навичку Hiding; сам SetGlobal нічого у грі не виконує.
return  RunScenario();
 object? RunScenario()
{
    UO.SetGlobal("manual", "mode", "hide");
    UO.SetGlobal("gather", "mode", "idle");
    var mode = UO.GetGlobal("MANUAL", "MODE");
    if (Truth(mode == "hide"))
    {
        UO.UseSkill("Hiding");
    }

    return null;
}

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

3. GetGlobal - 3 - клас сценарію

Параметри та порядок виконання:

  • ReadDelay(name, fallback) показана цілком: повертає запасні 350 мс за відсутнього, нечислового або вихідного за діапазон 50–5000 налаштування. Цикл обмежений трьома спробами очікування, нескінченний.
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()
    {
        for (int attempt = (int)(1); attempt <= 3; attempt += (int)(1))
        {
            await Delay(ReadDelay("manual.delay", 350));
        }

        return null;
    }

    dynamic ReadDelay(dynamic name, dynamic fallback)
    {
        var text = UO.GetGlobal(name);
        if (Truth(text == "N/A"))
        {
            return fallback;
        }

        if (!(Truth(IsNumeric(text))))
        {
            return fallback;
        }

        var value = Val(text);
        if (Truth(value < 50) || Truth(value > 5000))
        {
            return fallback;
        }

        return value;
    }

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

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

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetGlobal(name) — UO.GetGlobal(String)

Параметри: name (String)

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

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public string GetGlobal(string name)
        {
            lock (globalsLock)
                return globals.TryGetValue(name, out var value) ? value : "N/A";
        }

UO.GetGlobal(globalRegion, varName) — UO.GetGlobal(Any,Any)

Параметри: globalRegion (Any), varName (Any)

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

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "getglobal":

                    return new InjectionValue(state.GlobalVariables.TryGetValue(Text(0) + "\u001F" + Text(1), out string globalValue)

                        ? globalValue : string.Empty);

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

Зберігає іменований або serial в стані runtime.

Параметри

  • name — Ім'я або як текст, регістр обробляє 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. Прямий виклик – прямий скрипт

Параметри та порядок виконання:

  • Зберігає іменований або 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. Помилки доступу до registra не приховуються цією функцією.

Самостійні 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. Помилки доступу до registra не приховуються цією функцією.
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

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

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

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

Записує іменоване налаштування скрипта для подальшого читання через UO.GetGlobal. Повторний запис замінює значення того самого ключа.

Параметри

  • name - Ім'я в короткій формі. Регістр важливий: "Loot" та "loot" - різні ключі. Це не шлях до файлу.
  • globalRegion - GlobalRegion - користувальницька мітка області, VarName - ім'я всередині неї; обидва перетворюються на рядки. У цій формі регістр обох частин не є важливим. Мітки 0 та 1 допустимі, але НЕ включають обмін між профілями та НЕ вибирають серверне сховище. Не використовуйте роздільник U+001F у цих іменах.
  • varName - GlobalRegion - користувальницька мітка області, VarName - ім'я всередині неї; обидва перетворюються на рядки. У цій формі регістр обох частин не є важливим. Мітки 0 та 1 допустимі, але НЕ включають обмін між профілями та НЕ вибирають серверне сховище. Не використовуйте роздільник U+001F у цих іменах.

Повернене значення

void — значення, що повертається, немає. Викликайте окремим рядком, без надання результату та порівняння з true.

Поведінка

  • Коротка форма та форма з регіоном — два незалежні сховища у поточному стані runtime. SetGlobal("x", value) не записує в GetGlobal(0, "x"). Знімок стану включає обидва сховища, однак сам виклик не зберігає файл: запис на диск виконує механізм збереження профілю. Інший профіль не одержує ці значення автоматично. Глобальні var/оголошення змінної та GList - окремі механізми.
  • Збережені "N/A" (коротка форма) та "" (форма з регіоном) не відрізняються від відсутності по одному GetGlobal. Для налаштувань виберіть допустимі значення, відмінні від маркера відсутності, або заведіть окремий ключ наявності. Спочатку перевіряйте рядок, а потім перетворіть число.
  • UO.GetGlobal · UO.SetGlobal · UO.GListGet
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

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

Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.

UO.Print("Calling UO.SetGlobal");
UO.SetGlobal("manual.delay", 350);

1. SetGlobal - 1 - прямий скрипт

Параметри та порядок виконання:

  • Затримка: manual.delay - ім'я; 350/600 - мілісекунди. GetGlobal читає рядок, IsNumeric перевіряє його перед Val. UO.Wait призупиняє лише цей скрипт. Приклад не змінює швидкість мережі.
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;

2. SetGlobal — 2 — функція сценарію

Параметри та порядок виконання:

  • Режим: manual та gather - різні мітки області; mode – ключ. Читання MANUAL/MODE знаходить manual/mode. Тільки режим hide викликає навичку Hiding; сам SetGlobal нічого у грі не виконує.
return  RunScenario();
 object? RunScenario()
{
    UO.SetGlobal("manual", "mode", "idle");
    UO.SetGlobal("gather", "mode", "hide");
    UO.SetGlobal("MANUAL", "MODE", "hide");
    if (Truth(UO.GetGlobal("manual", "mode") == "hide"))
    {
        UO.UseSkill("Hiding");
    }

    return null;
}

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

3. SetGlobal - 3 - клас сценарію

Параметри та порядок виконання:

  • ReadDelay(name, fallback) показана цілком: повертає запасні 350 мс за відсутнього, нечислового або вихідного за діапазон 50–5000 налаштування. Цикл обмежений трьома спробами очікування, нескінченний.
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.SetGlobal("manual.delay", "invalid");
        for (int attempt = (int)(1); attempt <= 3; attempt += (int)(1))
        {
            await Delay(ReadDelay("manual.delay", 350));
        }

        return null;
    }

    dynamic ReadDelay(dynamic name, dynamic fallback)
    {
        var text = UO.GetGlobal(name);
        if (Truth(text == "N/A"))
        {
            return fallback;
        }

        if (!(Truth(IsNumeric(text))))
        {
            return fallback;
        }

        var value = Val(text);
        if (Truth(value < 50) || Truth(value > 5000))
        {
            return fallback;
        }

        return value;
    }

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

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

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.SetGlobal(name, value) — UO.SetGlobal(String,Decimal)

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

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

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public void SetGlobal(string name, double value) => SetGlobal(name, value.ToString());

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

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

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

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public void SetGlobal(string name, int value) => SetGlobal(name, value.ToString());

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

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

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

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public void SetGlobal(string name, string value)
        {
            lock (globalsLock)
                globals[name] = value;
        }

UO.SetGlobal(globalRegion, varName, varValue) — UO.SetGlobal(Any,Any,Any)

Параметри: globalRegion (Any), varName (Any), varValue (Any)

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

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "setglobal":

                    state.GlobalVariables[Text(0) + "\u001F" + Text(1)] = Text(2);

                    return InjectionValue.Unit;

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;

Clone this wiki locally