Repository navigation
UO Topic conversion compatibility
Українська · Русский · 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.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 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