Repository navigation
RU UO Topic conversion compatibility
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Главная · C# · IDE · UO API · A–Z · Примеры · Языки
Преобразования чисел, serial и старых форматов скриптов. Совместимое имя может иметь ограничения или явно запрещённую операцию — это указано в карточке.
| Тема | Команды и пояснения |
|---|---|
| Hex / int | UO.Hex2Int · UO.Int2Hex |
| EUO ↔ Injection | UO.EUO2ID · UO.EUO2Type · UO.EUO2Inj · UO.Inj2EUO |
| EasyUO | UO.GetEasyUO · UO.SetEasyUO |
| Type Conversion | 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.Print(UO.Int2Hex(1073746484));Параметры, результат и все сценарии
var value = UO.EUO2ID("B");
UO.Print(Convert.ToString(value));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.BoxHack();Печатает уведомление, что устаревший патч нативного клиента BoxHack не требуется ClassicUO.
Параметров нет.
void — возвращаемого значения нет.
- Ветка ExecuteLegacyManualAlias только вызывает SystemMessage. Она не исправляет движение, речь, контейнеры или сетевой протокол.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.BoxHack");
UO.BoxHack();Параметры и ход выполнения:
- Сообщение описывает отсутствие необходимости в старом патче.
UO.BoxHack();Параметры и ход выполнения:
- Процедура совместимости не изменяет игровой мир.
return RunScenario();
object? RunScenario()
{
CompatibilityNotice();
return null;
}
void CompatibilityNotice()
{
UO.BoxHack();
}Параметры и ход выполнения:
- После диагностического сообщения выполнение продолжается.
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.
Параметры: Параметров нет.
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage($"{name}: obsolete native-client patch; ClassicUO does not require it.").
Внутренний код реализации, не самостоятельный скрипт.
case "boxhack":
case "fixtalk":
case "fixwalk":
SystemMessage($"{name}: obsolete native-client patch; ClassicUO does not require it.");
break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.EUO2ID(object? euo);Декодирует буквенную запись EasyUO по основанию 26 с A=0.
-
euo— Строка/значение EasyUO. Буквы приводятся к верхнему регистру; небуквенные символы пропускаются.
int — полученное 32-битное числовое значение; это не hex-строка.
- Последовательно вычисляет value=value*26+(letter-A). Аккумулятор uint работает unchecked, поэтому переполнение оборачивается по 32 битам. Пустая строка и строка без букв дают 0. Никаких объектов мира не ищет.
Каждый пример можно сохранить отдельным файлом .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));Параметры и ход выполнения:
- B кодирует число 1.
var value = UO.EUO2ID("B");
UO.Print(Convert.ToString(value));Параметры и ход выполнения:
- Регистр не важен; дефис и восклицательный знак пропускаются.
return RunScenario();
object? RunScenario()
{
var value = UO.EUO2ID("b-!");
UO.Print(Convert.ToString(value));
return null;
}Параметры и ход выполнения:
- 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.
Параметры: euo (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.DecodeEasyUoId:DecodeEasyUoId(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
Внутренний код реализации, не самостоятельный скрипт.
case "euo2id":
case "euo2type": return new InjectionValue(DecodeEasyUoId(Text(0)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
string UO.EUO2Inj(object? easyValue);Декодирует буквенную запись EasyUO по основанию 26 с A=0.
-
easyValue— Строка/значение EasyUO. Буквы приводятся к верхнему регистру; небуквенные символы пропускаются.
string — hex-строка Injection полученного serial.
- Последовательно вычисляет value=value*26+(letter-A). Аккумулятор uint работает unchecked, поэтому переполнение оборачивается по 32 битам. Пустая строка и строка без букв дают 0. Никаких объектов мира не ищет.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.EUO2Inj("B");
UO.Print("EUO2Inj: " + Convert.ToString(result));Параметры и ход выполнения:
- B кодирует число 1.
var value = UO.EUO2Inj("B");
UO.Print(Convert.ToString(value));Параметры и ход выполнения:
- Регистр не важен; дефис и восклицательный знак пропускаются.
return RunScenario();
object? RunScenario()
{
var value = UO.EUO2Inj("b-!");
UO.Print(Convert.ToString(value));
return null;
}Параметры и ход выполнения:
- 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.
Параметры: easyValue (Any)
Результат: string / String.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.EUO2Inj. -
InjectionScript.Runtime.InjectionValue.ToString:easyValue.ToString(). -
InjectionScript.Runtime.NumberConversions.ToHex:NumberConversions.ToHex(unchecked((int)value)).
Внутренний код реализации, не самостоятельный скрипт.
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));
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.EUO2Type(object? euo);Декодирует буквенную запись EasyUO по основанию 26 с A=0.
-
euo— Строка/значение EasyUO. Буквы приводятся к верхнему регистру; небуквенные символы пропускаются.
int — полученное 32-битное числовое значение; это не hex-строка.
- Последовательно вычисляет value=value*26+(letter-A). Аккумулятор uint работает unchecked, поэтому переполнение оборачивается по 32 битам. Пустая строка и строка без букв дают 0. Никаких объектов мира не ищет.
Каждый пример можно сохранить отдельным файлом .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));Параметры и ход выполнения:
- B кодирует число 1.
var value = UO.EUO2Type("B");
UO.Print(Convert.ToString(value));Параметры и ход выполнения:
- Регистр не важен; дефис и восклицательный знак пропускаются.
return RunScenario();
object? RunScenario()
{
var value = UO.EUO2Type("b-!");
UO.Print(Convert.ToString(value));
return null;
}Параметры и ход выполнения:
- 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.
Параметры: euo (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.DecodeEasyUoId:DecodeEasyUoId(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
Внутренний код реализации, не самостоятельный скрипт.
case "euo2id":
case "euo2type": return new InjectionValue(DecodeEasyUoId(Text(0)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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. Преобразование не доказывает существование объекта.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.Hex2Int("0x40001234");
UO.Print("Hex2Int: " + Convert.ToString(result));Параметры и ход выполнения:
- Преобразует числовое значение или числовой текст в int.
UO.Print(UO.Hex2Int("0x40001234"));Параметры и ход выполнения:
- Несмотря на имя, принимается десятичный текст. Неверный текст даёт FormatException, неподдерживаемый тип — InvalidCastException; переполнение double — ошибку преобразования.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.Hex2Int("255"));
UO.Print(UO.Hex2Int("0xFFFFFFFF"));
return null;
}Параметры и ход выполнения:
- Обратное форматирование — 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.
Параметры: value (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Hex2Int. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(value).
Внутренний код реализации, не самостоятельный скрипт.
public int Hex2Int(InjectionValue value) => NumberConversions.ToInt(value);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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-строку. Кодирование не создаёт объект и не запрашивает его у клиента.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.Inj2EUO(0);
UO.Print("Inj2EUO: " + Convert.ToString(result));Параметры и ход выполнения:
- Кодирует 32-битное число serial буквами A..Z для EasyUO.
UO.Print(UO.Inj2EUO(0));Параметры и ход выполнения:
- Алгоритм вставляет слева букву A + value % 26 и делит uint на 26 до нуля. Это собственная конвертация проекта, не Excel A1-номер колонки.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.Inj2EUO(26));
UO.Print(UO.Inj2EUO(25));
return null;
}Параметры и ход выполнения:
- 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.
Параметры: serialValue (Any)
Результат: string / String.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Inj2EUO. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(serialValue).
Внутренний код реализации, не самостоятельный скрипт.
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();
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 отдельно.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.Int2Hex(1073746484);
UO.Print("Int2Hex: " + Convert.ToString(result));Параметры и ход выполнения:
- Форматирует int как hexadecimal serial-строку.
UO.Print(UO.Int2Hex(1073746484));Параметры и ход выполнения:
- NumberConversions.ToInt выполняет преобразование, затем ToHex использует формат X8. Например -1 даёт "0xFFFFFFFF". Неверный числовой текст вызывает ошибку; это не проверка существования serial.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.Int2Hex(-1));
return null;
}Параметры и ход выполнения:
- Для представления числа достаточно конвертации; наличие объекта проверяется 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.
Параметры: value (Any)
Результат: string / String.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Int2Hex. -
InjectionScript.Runtime.NumberConversions.ToHex:NumberConversions.ToHex(NumberConversions.ToInt(value)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(value).
Внутренний код реализации, не самостоятельный скрипт.
public string Int2Hex(InjectionValue value) => NumberConversions.ToHex(NumberConversions.ToInt(value));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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. Исходная строка не меняется.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.ScanInt("gold=123", 0);
UO.Print("ScanInt: " + Convert.ToString(result));Параметры и ход выполнения:
- Находит первое подписанное double/hex-число в строке, начиная с позиции.
UO.Print(UO.ScanInt("gold=123", 0));Параметры и ход выполнения:
- Regex.Match применяется к Substring(start). Если первое совпадение не удаётся преобразовать TryStr2Int, следующие числа не ищутся. Дробная часть, например .5, не входит в числовой токен.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.ScanInt("-7 0xFF", 3));
return null;
}Параметры и ход выполнения:
- Отрицательный 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.
Параметры: textValue (Any), startValue (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ScanInt. -
InjectionScript.Runtime.InjectionValue.ToString:textValue.ToString(). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(startValue). -
InjectionScript.Runtime.NumberConversions.TryStr2Int:NumberConversions.TryStr2Int(match.Value, out int value).
Внутренний код реализации, не самостоятельный скрипт.
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;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.ShutdownWindows(object? state);Всегда отклоняет попытку выключения Windows из скрипта.
-
state— Legacy-аргумент сохранён в сигнатуре, но не используется: любой вызов блокируется.
Нормального результата нет: NativeSubrutineException с сообщением "shutdownwindows is intentionally blocked: scripts may not shut down Windows."
- ExecuteLegacyManualAlias сразу бросает исключение. Ни выключения, ни перезагрузки, ни запуска внешнего процесса не выполняется.
- Все три примера намеренно показывают запрещённые вызовы и при запуске завершаются ошибкой. Их нельзя использовать как условие успешного выключения.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
try { UO.ShutdownWindows(0); }
catch (Exception error) { UO.Print(error.Message); }Параметры и ход выполнения:
- Всегда отклоняет попытку выключения Windows из скрипта.
UO.ShutdownWindows(0);Параметры и ход выполнения:
- ExecuteLegacyManualAlias сразу бросает исключение. Ни выключения, ни перезагрузки, ни запуска внешнего процесса не выполняется.
return RunScenario();
object? RunScenario()
{
UO.ShutdownWindows(1);
return null;
}Параметры и ход выполнения:
- Все три примера намеренно показывают запрещённые вызовы и при запуске завершаются ошибкой. Их нельзя использовать как условие успешного выключения.
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.
Параметры: state (Any)
Результат: void / Unit.
При вызове:
Внутренний код реализации, не самостоятельный скрипт.
case "shutdownwindows":
throw new NativeSubrutineException("shutdownwindows is intentionally blocked: scripts may not shut down Windows.");ClassicUO — Bad Newbie & C# Scripts IDE