Skip to content

UO Topic conversion compatibility

Codex edited this page Oct 12, 2026 · 6 revisions

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

Перетворення значень і сумісність

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

Перетворення чисел та ідентифікаторів об’єктів між підтримуваними форматами. Для команд сумісності перевіряйте опис: деякі імена збережено в API, але відповідна операція має обмеження або недоступна.

Розділи

Тема Команди та пояснення
Шістнадцяткові та цілі числа UO.Hex2Int · UO.Int2Hex
Формати ідентифікаторів EUO та Injection UO.EUO2ID · UO.EUO2Type · UO.EUO2Inj · UO.Inj2EUO
Формат EasyUO UO.GetEasyUO · UO.SetEasyUO
Перетворення типів C# та стандартна бібліотека · C# та стандартна бібліотека · C# та стандартна бібліотека · C# та стандартна бібліотека · C# та стандартна бібліотека · C# та стандартна бібліотека

Усі команди теми

Перетворення

UO.Hex2Int · UO.Int2Hex · UO.ScanInt · UO.EUO2ID · UO.EUO2Inj · UO.EUO2Type · UO.Inj2EUO

Обмеження сумісності

UO.BoxHack · UO.ShutdownWindows

Приклади на тему

Нижче наведено короткі приклади. У повному описі кожної команди є параметри, результат, обмеження та кілька самостійних скриптів: прямий код, варіант із функцією та варіант із класом.

UO.Int2Hex

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

UO.Print(UO.Int2Hex(1073746484));

UO.EUO2ID

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

var value = UO.EUO2ID("B");
UO.Print(Convert.ToString(value));

Повний опис команд


UO.BoxHack

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

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

void UO.BoxHack();

Друкує повідомлення, що застарілий патч нативного клієнта BoxHack не потрібний ClassicUO.

Параметри

Параметрів немає.

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

void - значення, що повертається немає.

Поведінка

  • Гілка ExecuteLegacyManualAlias тільки викликає SystemMessage. Вона не виправляє рух, мовлення, контейнери чи мережевий протокол.

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

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

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

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

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

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

1. Сповіщення про сумісність — прямий скрипт

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

  • Повідомлення описує відсутність потреби у старому патчі.
UO.BoxHack();

2. Виклик у процедурі – функція сценарію

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

  • Процедура сумісності не змінює світ ігор.
return  RunScenario();
 object? RunScenario()
{
    CompatibilityNotice();
    return null;
}

void CompatibilityNotice()
{
    UO.BoxHack();
}

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.BoxHack();
        UO.Print("continued");
        return null;
    }
}

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

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

UO.BoxHack() — UO.BoxHack()

Параметри: Немає параметрів.

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

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

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

case "boxhack":

                case "fixtalk":

                case "fixwalk":

                    SystemMessage($"{name}: obsolete native-client patch; ClassicUO does not require it.");

                    break;

UO.EUO2ID

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

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

dynamic UO.EUO2ID(object? euo);

Декодує літерний запис EasyUO на основі 26 з A=0.

Параметри

  • euo — Рядок/значення EasyUO. Літери наводяться до верхнього регістру; небуквенні символи пропускаються.

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

int - отримане 32-бітне числове значення; це не hex-рядок.

Поведінка

  • Послідовно обчислює value=value*26+(letter-A). Акумулятор uint працює unchecked, тому переповнення обертається по 32 бітам. Порожній рядок і рядок без букв дають 0. Жодних об'єктів світу не шукає.

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

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

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

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

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

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

1. Однолітерне значення - прямий скрипт

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

  • B кодує число 1.
var value = UO.EUO2ID("B");
UO.Print(Convert.ToString(value));

2. Небуквенні символи – функція сценарію

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

  • Реєстр не важливий; дефіс та знак оклику пропускаються.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.EUO2ID("b-!");
    UO.Print(Convert.ToString(value));
    return null;
}

3. Нульовий запис – клас сценарію

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

  • A кодує нуль; результат не означає знайдений об'єкт.
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 value = UO.EUO2ID("A");
        UO.Print(Convert.ToString(value));
        return null;
    }
}

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

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

UO.EUO2ID(euo) — UO.EUO2ID(Any)

Параметри: euo (Any)

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

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

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

case "euo2id":

                case "euo2type": return new InjectionValue(DecodeEasyUoId(Text(0)));

UO.EUO2Inj

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

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

string UO.EUO2Inj(object? easyValue);

Декодує літерний запис EasyUO на основі 26 з A=0.

Параметри

  • easyValue — Рядок/значення EasyUO. Літери наводяться до верхнього регістру; небуквенні символи пропускаються.

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

string - hex-рядок Injection отриманого serial.

Поведінка

  • Послідовно обчислює value=value*26+(letter-A). Акумулятор uint працює unchecked, тому переповнення обертається по 32 бітам. Порожній рядок і рядок без букв дають 0. Жодних об'єктів світу не шукає.

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

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

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

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

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

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

1. Однолітерне значення - прямий скрипт

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

  • B кодує число 1.
var value = UO.EUO2Inj("B");
UO.Print(Convert.ToString(value));

2. Небуквенні символи – функція сценарію

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

  • Реєстр не важливий; дефіс та знак оклику пропускаються.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.EUO2Inj("b-!");
    UO.Print(Convert.ToString(value));
    return null;
}

3. Нульовий запис – клас сценарію

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

  • A кодує нуль; результат не означає знайдений об'єкт.
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 value = UO.EUO2Inj("A");
        UO.Print(Convert.ToString(value));
        return null;
    }
}

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

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

UO.EUO2Inj(easyValue) — UO.EUO2Inj(Any)

Параметри: easyValue (Any)

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

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

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

public string EUO2Inj(InjectionValue easyValue)

        {

            uint value = 0;

            foreach (char c in easyValue.ToString().ToUpperInvariant())

            {

                if (c < 'A' || c > 'Z')

                    continue;

                value = unchecked(value * 26 + (uint)(c - 'A'));

            }

            return NumberConversions.ToHex(unchecked((int)value));

        }

UO.EUO2Type

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

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

dynamic UO.EUO2Type(object? euo);

Декодує літерний запис EasyUO на основі 26 з A=0.

Параметри

  • euo — Рядок/значення EasyUO. Літери наводяться до верхнього регістру; небуквенні символи пропускаються.

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

int - отримане 32-бітне числове значення; це не hex-рядок.

Поведінка

  • Послідовно обчислює value=value*26+(letter-A). Акумулятор uint працює unchecked, тому переповнення обертається по 32 бітам. Порожній рядок і рядок без букв дають 0. Жодних об'єктів світу не шукає.

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

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

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

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

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

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

1. Однолітерне значення - прямий скрипт

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

  • B кодує число 1.
var value = UO.EUO2Type("B");
UO.Print(Convert.ToString(value));

2. Небуквенні символи – функція сценарію

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

  • Реєстр не важливий; дефіс та знак оклику пропускаються.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.EUO2Type("b-!");
    UO.Print(Convert.ToString(value));
    return null;
}

3. Нульовий запис – клас сценарію

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

  • A кодує нуль; результат не означає знайдений об'єкт.
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 value = UO.EUO2Type("A");
        UO.Print(Convert.ToString(value));
        return null;
    }
}

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

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

UO.EUO2Type(euo) — UO.EUO2Type(Any)

Параметри: euo (Any)

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

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

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

case "euo2id":

                case "euo2type": return new InjectionValue(DecodeEasyUoId(Text(0)));

UO.Hex2Int

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

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

int UO.Hex2Int(object? value);

Перетворює числове значення або числовий текст на int.

Параметри

  • value - int, double, double-текст або hex-текст з 0x. Пробіли по краях та знак допускаються. Рядки аліасів "self"/"lasttarget" тут не дозволяються.

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

int з 32 бітами; hex 0xFFFFFFFF дає -1. double усікається до нуля з перевіркою діапазону. Array і null в NumberConversions.ToInt дають 0.

Поведінка

  • Незважаючи на ім'я, приймається десятковий текст. Неправильний текст дає FormatException, непідтримуваний тип - InvalidCastException; переповнення double – помилку перетворення.
  • Зворотне форматування - UO.Int2Hex. Перетворення не доводить існування об'єкта.

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

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

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

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

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

var result = UO.Hex2Int("0x40001234");
UO.Print("Hex2Int: " + Convert.ToString(result));

1. Прямий виклик – прямий скрипт

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

  • Перетворює числове значення або числовий текст на int.
UO.Print(UO.Hex2Int("0x40001234"));

2. Явний варіант – функція сценарію

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

  • Незважаючи на ім'я, приймається десятковий текст. Неправильний текст дає FormatException, непідтримуваний тип - InvalidCastException; переповнення double – помилку перетворення.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.Hex2Int("255"));
    UO.Print(UO.Hex2Int("0xFFFFFFFF"));
    return null;
}

3. Повна допоміжна функція – клас сценарію

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

  • Зворотне форматування - UO.Int2Hex. Перетворення не доводить існування об'єкта.
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 = UO.Hex2Int("0x000000FF");
        UO.Print(UO.Int2Hex(number));
        return null;
    }
}

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

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

UO.Hex2Int(value) — UO.Hex2Int(Any)

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

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

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

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

public int Hex2Int(InjectionValue value) => NumberConversions.ToInt(value);

UO.Inj2EUO

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

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

string UO.Inj2EUO(object? serialValue);

Кодує 32-бітне число serial літерами A..Z для EasyUO.

Параметри

  • serialValue — Число через NumberConversions.ToInt, потім unsigned uint із збереженням бітів. Для аліасу спочатку отримайте GetSerial/Hex2Int.

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

string — звичайні цифри основи 26 з A=0..Z=25. Нуль дає "A". Це не hex та не ім'я об'єкта.

Поведінка

  • Алгоритм вставляє ліворуч букву A + value % 26 і ділить uint на 26 до нуля. Це власна конвертація проекту, не Excel A1 номер колонки.
  • EUO2Inj виконує зворотну конвертацію в hex-рядок. Кодування не створює об'єкт і не вимагає його у клієнта.

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

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

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

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

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

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

1. Прямий виклик – прямий скрипт

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

  • Кодує 32-бітне число serial літерами A..Z для EasyUO.
UO.Print(UO.Inj2EUO(0));

2. Явний варіант – функція сценарію

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

  • Алгоритм вставляє ліворуч букву A + value % 26 і ділить uint на 26 до нуля. Це власна конвертація проекту, не Excel A1 номер колонки.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.Inj2EUO(26));
    UO.Print(UO.Inj2EUO(25));
    return null;
}

3. Повна допоміжна функція – клас сценарію

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

  • EUO2Inj виконує зворотну конвертацію в hex-рядок. Кодування не створює об'єкт і не вимагає його у клієнта.
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 value = UO.Hex2Int("0x40001234");
        var encoded = UO.Inj2EUO(value);
        UO.Print(encoded);
        UO.Print(UO.EUO2Inj(encoded));
        return null;
    }
}

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

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

UO.Inj2EUO(serialValue) — UO.Inj2EUO(Any)

Параметри: serialValue (Any)

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

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

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

public string Inj2EUO(InjectionValue serialValue)

        {

            uint value = unchecked((uint)NumberConversions.ToInt(serialValue));

            if (value == 0)

                return "A";

            var result = new StringBuilder();

            while (value > 0)

            {

                result.Insert(0, (char)('A' + value % 26));

                value /= 26;

            }

            return result.ToString();

        }

UO.Int2Hex

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

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

string UO.Int2Hex(object? value);

Форматує int як hexadecimal serial-рядок.

Параметри

  • value - int або числовий/hex-текст; double усікається до нуля з перевіркою переповнення. Не виконується пошук аліасу об'єкта.

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

string "0xXXXXXXXX": вісім hex-цифр, всі 32 біта int. Негативне значення представлено додатковому коді.

Поведінка

  • NumberConversions.ToInt виконує перетворення, потім ToHex використовує формат X8. Наприклад -1 дає "0xFFFFFFFF". Неправильний числовий текст викликає помилку; це не перевірка існування serial.
  • Для уявлення числа достатньо конвертації; наявність об'єкта перевіряється UO.Exists окремо.

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

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

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

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

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

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

1. Прямий виклик – прямий скрипт

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

  • Форматує int як hexadecimal serial-рядок.
UO.Print(UO.Int2Hex(1073746484));

2. Явний варіант – функція сценарію

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

  • NumberConversions.ToInt виконує перетворення, потім ToHex використовує формат X8. Наприклад -1 дає "0xFFFFFFFF". Неправильний числовий текст викликає помилку; це не перевірка існування serial.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.Int2Hex(-1));
    return null;
}

3. Повна допоміжна функція – клас сценарію

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

  • Для уявлення числа достатньо конвертації; наявність об'єкта перевіряється UO.Exists окремо.
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 encoded = UO.Int2Hex(255);
        UO.Print(encoded);
        UO.Print(UO.Hex2Int(encoded));
        return null;
    }
}

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

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

UO.Int2Hex(value) — UO.Int2Hex(Any)

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

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

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

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

public string Int2Hex(InjectionValue value) => NumberConversions.ToHex(NumberConversions.ToInt(value));

UO.ScanInt

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

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

int UO.ScanInt(object? textValue, object? startValue);

Знаходить перше підписане double/hex-число у рядку, починаючи з позиції.

Параметри

  • textValue - Текст через ToString. Шукається перший збіг регулярного вираження [-+]?(?:0[xX][0-9A-Fa-f]+|\d+).
  • startValue — int, нульова позиція UTF-16. Обмежується до 0..text.Length; не індекс від 1.

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

int - перше розпізнане 32-бітне число. Немає збігу або число не міститься - 0; справжній нуль також дає 0.

Поведінка

  • Regex.Match застосовується до Substring(start). Якщо перший збіг не вдається перетворити TryStr2Int, наступні числа не шукаються. Дробова частина, наприклад .5, не входить до числового токена.
  • Негативний start стає 0, start за кінцем рядка - text.Length і результат 0. Вихідний рядок не змінюється.

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

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

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

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

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

var result = UO.ScanInt("gold=123", 0);
UO.Print("ScanInt: " + Convert.ToString(result));

1. Прямий виклик – прямий скрипт

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

  • Знаходить перше підписане double/hex-число у рядку, починаючи з позиції.
UO.Print(UO.ScanInt("gold=123", 0));

2. Явний варіант – функція сценарію

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

  • Regex.Match застосовується до Substring(start). Якщо перший збіг не вдається перетворити TryStr2Int, наступні числа не шукаються. Дробова частина, наприклад .5, не входить до числового токена.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.ScanInt("-7 0xFF", 3));
    return null;
}

3. Повна допоміжна функція – клас сценарію

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

  • Негативний start стає 0, start за кінцем рядка - text.Length і результат 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 text = "count=0x20";
        var amount = UO.ScanInt(text, 6);
        UO.Print(amount);
        return null;
    }
}

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

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

UO.ScanInt(textValue, startValue) — UO.ScanInt(Any,Any)

Параметри: textValue (Any), startValue (Any)

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

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

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

public int ScanInt(InjectionValue textValue, InjectionValue startValue)

        {

            string text = textValue.ToString() ?? string.Empty;

            int start = Math.Max(0, Math.Min(text.Length, NumberConversions.ToInt(startValue)));

            Match match = Regex.Match(text.Substring(start), @"[-+]?(?:0[xX][0-9A-Fa-f]+|\d+)", RegexOptions.CultureInvariant);

            return match.Success && NumberConversions.TryStr2Int(match.Value, out int value) ? value : 0;

        }

UO.ShutdownWindows

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

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

void UO.ShutdownWindows(object? state);

Завжди відхиляє спробу вимкнення Windows зі скрипту.

Параметри

  • state — Legacy-аргумент збережений у сигнатурі, але не використовується: будь-який виклик блокується.

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

Нормального результату немає: NativeSubrutineException з повідомленням "shutdownwindows is intentionally blocked: scripts not shut down Windows."

Поведінка

  • ExecuteLegacyManualAlias відразу кидає виняток. Ні вимкнення, ні перезавантаження, ні запуску зовнішнього процесу не виконується.
  • Усі три приклади навмисно показують заборонені дзвінки та при запуску завершуються помилкою. Їх не можна використовувати як умову успішного вимкнення.

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

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

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

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

try { UO.ShutdownWindows(0); }
catch (Exception error) { UO.Print(error.Message); }

1. Прямий виклик – прямий скрипт

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

  • Завжди відхиляє спробу вимкнення Windows зі скрипту.
UO.ShutdownWindows(0);

2. Явний варіант – функція сценарію

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

  • ExecuteLegacyManualAlias відразу кидає виняток. Ні вимкнення, ні перезавантаження, ні запуску зовнішнього процесу не виконується.
return  RunScenario();
 object? RunScenario()
{
    UO.ShutdownWindows(1);
    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.Print("The next command is expected to fail");
        UO.ShutdownWindows(0);
        return null;
    }
}

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

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

UO.ShutdownWindows(state) — UO.ShutdownWindows(Any)

Параметри: state (Any)

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

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

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

case "shutdownwindows":

                    throw new NativeSubrutineException("shutdownwindows is intentionally blocked: scripts may not shut down Windows.");

Clone this wiki locally