Repository navigation
UO Topic profiles configuration
Українська · Русский · 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
Нижче наведено короткі приклади. У повному описі кожної команди є параметри, результат, обмеження та кілька самостійних скриптів: прямий код, варіант із функцією та варіант із класом.
Параметри, результат та всі сценарії
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("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;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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.
Кожен приклад можна зберегти окремим файлом .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));Параметри та порядок виконання:
- Використовуйте збережене ім'я профілю; негативний код визначає відмову.
var status = UO.ChangeProfile("ExampleProfile");
UO.Print(Convert.ToString(status));Параметри та порядок виконання:
- Відключений standalone клієнт без іншого порушення повертає -4 для порожнього імені.
return RunScenario();
object? RunScenario()
{
var status = UO.ChangeProfile("");
UO.Print(Convert.ToString(status));
return null;
}Параметри та порядок виконання:
- 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.
Параметри: name (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ChangeProfileSelection:bridge.ChangeProfileSelection(Text(0), string.Empty, string.Empty). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
Внутрішній код реалізації, не самостійний скрипт.
case "changeprofile":
return new InjectionValue(bridge.ChangeProfileSelection(Text(0), string.Empty, string.Empty));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
string UO.ClientPath();Повертає каталог установки/виконуваних файлів клієнта.
Параметрів немає.
string – шлях до каталогу. Це не bool, не масив і не ID. Порожній шлях означає, що значення недоступне; не використовуйте його як поточну робочу папку за промовчанням.
- Читається CUOEnviroment. ExecutablePath. Це не маршрут руху, не перелік точок, не папка скрипта і не шлях до даних гри.
- Команда лише читає шлях, нічого не відкриває, не створює та не зберігає. Кінцевий роздільник не слід припускати; приклад helper додає його за необхідності.
- Ім'я є ігровим/клієнтським API і пишеться з UO. ClientPath повертає каталог клієнта, ClientProfilePath — каталог активного профілю.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.ClientPath();
UO.Print("ClientPath: " + Convert.ToString(result));Параметри та порядок виконання:
- Аргументів немає. 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;Параметри та порядок виконання:
- Ці папки мають різне призначення. Скрипт виводить обидва рядки, не змінюючи конфігурацію чи профіль.
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;Параметри та порядок виконання:
- 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.
Параметри: Немає параметрів.
Результат: string / String.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ClientPath:bridge.ClientPath.
Внутрішній код реалізації, не самостійний скрипт.
case "clientpath": return new InjectionValue(bridge.ClientPath);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
string UO.ClientProfilePath();Повертає поточний каталог профілю клієнта.
Параметрів немає.
string – шлях до каталогу. Це не bool, не масив і не ID. Порожній шлях означає, що значення недоступне; не використовуйте його як поточну робочу папку за промовчанням.
- Читається ProfileManager.ProfilePath; якщо профіль ще не вибрано, повертається порожній рядок. Сам виклик не створює профіль та не переносить налаштування.
- Команда лише читає шлях, нічого не відкриває, не створює та не зберігає. Кінцевий роздільник не слід припускати; приклад helper додає його за необхідності.
- Ім'я є ігровим/клієнтським API і пишеться з UO. ClientPath повертає каталог клієнта, ClientProfilePath — каталог активного профілю.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.ClientProfilePath();
UO.Print("ClientProfilePath: " + Convert.ToString(result));Параметри та порядок виконання:
- Аргументів немає. 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;Параметри та порядок виконання:
- Ці папки мають різне призначення. Скрипт виводить обидва рядки, не змінюючи конфігурацію чи профіль.
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;Параметри та порядок виконання:
- 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.
Параметри: Немає параметрів.
Результат: string / String.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CurrentProfilePath:bridge.CurrentProfilePath.
Внутрішній код реалізації, не самостійний скрипт.
case "shardpath":
case "clientprofilepath": return new InjectionValue(bridge.CurrentProfilePath);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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.
Кожен приклад можна зберегти окремим файлом .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));Параметри та порядок виконання:
- Використовуйте збережене ім'я профілю; негативний код визначає відмову.
var status = UO.ExtChangeProfile("ExampleProfile");
UO.Print(Convert.ToString(status));Параметри та порядок виконання:
- Відключений standalone клієнт без іншого порушення повертає -4 для порожнього імені.
return RunScenario();
object? RunScenario()
{
var status = UO.ExtChangeProfile("");
UO.Print(Convert.ToString(status));
return null;
}Параметри та порядок виконання:
- 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.
Параметри: profileName (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ChangeProfileSelection:bridge.ChangeProfileSelection(requestedProfile, requestedShard, requestedCharacter).
Внутрішній код реалізації, не самостійний скрипт.
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));
}Параметри: profileName (Any), shardName (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ChangeProfileSelection:bridge.ChangeProfileSelection(requestedProfile, requestedShard, requestedCharacter).
Внутрішній код реалізації, не самостійний скрипт.
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));
}Параметри: profileName (Any), shardName (Any), charName (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ChangeProfileSelection:bridge.ChangeProfileSelection(requestedProfile, requestedShard, requestedCharacter).
Внутрішній код реалізації, не самостійний скрипт.
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));
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.GListClear();Очищає весь тимчасовий перелік перед новою серією дій.
Параметрів немає.
void - результату немає. Після очищення GListSize() повертає 0.
- Список належить екземпляру runtime. Інші запуски скриптів мають списки. GList не є спільним міжпрофільним сховищем; ці команди не записують файл і не входять до збереженого стану профілю. Новому runtime дістається порожній список. Це також не var/оголошення змінної і не UO.SetGlobal.
- Нове ім'я додається до кінця. Повторне ім'я без урахування регістру замінює значення та написання імені на попередньому місці. Читання нічого не видаляє. Не можна очищати чи додавати записи серед перебору, якщо потрібні стабільні індекси.
- Операції локальні: без пакетів, пошуку об'єктів та затримки. Set/Get шукають ім'я послідовно; для великих наборів використовуйте Dictionary. Окремої команди видалення одного ключа у цій родині немає; Clear очищає усі записи.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.GListClear");
UO.GListClear();Параметри та порядок виконання:
- 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;Параметри та порядок виконання:
- Старі правила видаляються перед додаванням 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;Параметри та порядок виконання:
- Число, раніше прочитане в 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.
Параметри: Немає параметрів.
Результат: void / Unit.
Під час виклику:
Внутрішній код реалізації, не самостійний скрипт.
public void GListClear() => globalList.Clear();Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GListGet(object? nameValue);Читає значення з тимчасового списку на ім'я правила або лічильника.
-
nameValue- object? перетворюється на рядок. Імена порівнюються без урахування регістру: "bandage" та "BANDAGE" - один ключ. Рекомендується непусте рядкове ім'я; порожнє ім'я також припустимо.
object? - Збережене значення з колишнім типом. Якщо ключа немає, int 0. Збережений 0 не відрізняється від відсутності по одному GListGet; перевіряйте імена.
- Список належить екземпляру runtime. Інші запуски скриптів мають списки. GList не є спільним міжпрофільним сховищем; ці команди не записують файл і не входять до збереженого стану профілю. Новому runtime дістається порожній список. Це також не var/оголошення змінної і не UO.SetGlobal.
- Нове ім'я додається до кінця. Повторне ім'я без урахування регістру замінює значення та написання імені на попередньому місці. Читання нічого не видаляє. Не можна очищати чи додавати записи серед перебору, якщо потрібні стабільні індекси.
- Операції локальні: без пакетів, пошуку об'єктів та затримки. Set/Get шукають ім'я послідовно; для великих наборів використовуйте Dictionary. Окремої команди видалення одного ключа у цій родині немає; Clear очищає усі записи.
Кожен приклад можна зберегти окремим файлом .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));Параметри та порядок виконання:
- 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;Параметри та порядок виконання:
- Повна функція 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;Параметри та порядок виконання:
- 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.
Параметри: nameValue (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GListGet. -
InjectionScript.Runtime.InjectionValue.ToString:nameValue.ToString().
Внутрішній код реалізації, не самостійний скрипт.
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;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
string UO.GListPosName(object? index);Читає ім'я запису за її позицією для перебору правил.
-
index— int: індекс від 0 до GListSize()-1 включно. Це не serial, graphic або кількість одиниць у стопці.
string - ім'я в останній записаній формі регістру. Неприпустимий індекс повертає ""; порожній ключ теж повертає "".
- Список належить екземпляру runtime. Інші запуски скриптів мають списки. GList не є спільним міжпрофільним сховищем; ці команди не записують файл і не входять до збереженого стану профілю. Новому runtime дістається порожній список. Це також не var/оголошення змінної і не UO.SetGlobal.
- Нове ім'я додається до кінця. Повторне ім'я без урахування регістру замінює значення та написання імені на попередньому місці. Читання нічого не видаляє. Не можна очищати чи додавати записи серед перебору, якщо потрібні стабільні індекси.
- Операції локальні: без пакетів, пошуку об'єктів та затримки. Set/Get шукають ім'я послідовно; для великих наборів використовуйте Dictionary. Окремої команди видалення одного ключа у цій родині немає; Clear очищає усі записи.
Кожен приклад можна зберегти окремим файлом .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));Параметри та порядок виконання:
- Індекс 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;Параметри та порядок виконання:
- 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;Параметри та порядок виконання:
- Повторний запис 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.
Параметри: index (Integer)
Результат: string / String.
Під час виклику:
Внутрішній код реалізації, не самостійний скрипт.
public string GListPosName(int index) => index >= 0 && index < globalList.Count ? globalList[index].Key : string.Empty;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 очищає усі записи.
Кожен приклад можна зберегти окремим файлом .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 вибирає друге правило 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;Параметри та порядок виконання:
- Перебір шукає 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;Параметри та порядок виконання:
- Індекс 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.
Параметри: index (Integer)
Результат: dynamic / Any.
Під час виклику:
Внутрішній код реалізації, не самостійний скрипт.
public InjectionValue GListPosValue(int index) => index >= 0 && index < globalList.Count ? globalList[index].Value : InjectionValue.Zero;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.GListSet(object? nameValue, object? value);Записує іменоване значення у тимчасовий список: наприклад, graphic правила лута чи лічильник оброблених предметів.
-
nameValue- object? перетворюється на рядок. Імена порівнюються без урахування регістру: "bandage" та "BANDAGE" - один ключ. Рекомендується непусте рядкове ім'я; порожнє ім'я також припустимо.
void - результату немає; окрема команда, без присвоєння.
- Список належить екземпляру runtime. Інші запуски скриптів мають списки. GList не є спільним міжпрофільним сховищем; ці команди не записують файл і не входять до збереженого стану профілю. Новому runtime дістається порожній список. Це також не var/оголошення змінної і не UO.SetGlobal.
- Нове ім'я додається до кінця. Повторне ім'я без урахування регістру замінює значення та написання імені на попередньому місці. Читання нічого не видаляє. Не можна очищати чи додавати записи серед перебору, якщо потрібні стабільні індекси.
- Операції локальні: без пакетів, пошуку об'єктів та затримки. Set/Get шукають ім'я послідовно; для великих наборів використовуйте Dictionary. Окремої команди видалення одного ключа у цій родині немає; Clear очищає усі записи.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.GListSet");
UO.GListSet("gold", 0x0EED);Параметри та порядок виконання:
- 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;Параметри та порядок виконання:
- 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;
}Параметри та порядок виконання:
- 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.
Параметри: nameValue (Any), value (Any)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GListSet. -
InjectionScript.Runtime.InjectionValue.ToString:nameValue.ToString().
Внутрішній код реалізації, не самостійний скрипт.
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);
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GListSize();Вважає іменовані записи тимчасового списку, щоб перевірити порожнечу або обмежити перебір.
Параметрів немає.
int >= 0 — кількість унікальних імен, не кількість предметів чи одиниць у стосах.
- Список належить екземпляру runtime. Інші запуски скриптів мають списки. GList не є спільним міжпрофільним сховищем; ці команди не записують файл і не входять до збереженого стану профілю. Новому runtime дістається порожній список. Це також не var/оголошення змінної і не UO.SetGlobal.
- Нове ім'я додається до кінця. Повторне ім'я без урахування регістру замінює значення та написання імені на попередньому місці. Читання нічого не видаляє. Не можна очищати чи додавати записи серед перебору, якщо потрібні стабільні індекси.
- Операції локальні: без пакетів, пошуку об'єктів та затримки. Set/Get шукають ім'я послідовно; для великих наборів використовуйте Dictionary. Окремої команди видалення одного ключа у цій родині немає; Clear очищає усі записи.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.GListSize();
UO.Print("GListSize: " + Convert.ToString(result));Параметри та порядок виконання:
- Порожній набір припиняє процедуру до обробки правил.
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;Параметри та порядок виконання:
- Два правила перебираються за індексами 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;Параметри та порядок виконання:
- Заміна 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.
Параметри: Немає параметрів.
Результат: int / Integer.
Під час виклику:
Внутрішній код реалізації, не самостійний скрипт.
public int GListSize() => globalList.Count;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 немає.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.GetEasyUO(1);
UO.Print("GetEasyUO: " + Convert.ToString(result));Параметри та порядок виконання:
- Спочатку читається ім'я 1, потім * 1.
var value = UO.GetEasyUO(1);
UO.Print(value);Параметри та порядок виконання:
- Порожній рядок може бути відсутністю значення або пустим текстом.
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;Параметри та порядок виконання:
- Номер визначає 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.
Параметри: number (Any)
Результат: string / String.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetEasyUO. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetEasyUO:bridge.GetEasyUO(NumberConversions.ToInt(number)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(number).
Внутрішній код реалізації, не самостійний скрипт.
public string GetEasyUO(InjectionValue number) => bridge.GetEasyUO(NumberConversions.ToInt(number));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.GetGlobal("manual.delay");
UO.Print("GetGlobal: " + Convert.ToString(result));Параметри та порядок виконання:
- Затримка: 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;Параметри та порядок виконання:
- Режим: 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;Параметри та порядок виконання:
- 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.
Параметри: name (String)
Результат: string / String.
Під час виклику:
Внутрішній код реалізації, не самостійний скрипт.
public string GetGlobal(string name)
{
lock (globalsLock)
return globals.TryGetValue(name, out var value) ? value : "N/A";
}Параметри: globalRegion (Any), varName (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
Внутрішній код реалізації, не самостійний скрипт.
case "getglobal":
return new InjectionValue(state.GlobalVariables.TryGetValue(Text(0) + "\u001F" + Text(1), out string globalValue)
? globalValue : string.Empty);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
string UO.GetProfile(object? serial);Читає публічний опис персонажа, який сервер надсилає вікна Profile. Корисно для читання нотаток або пошуку тексту в описі вибраного персонажа. Це не налаштування профілю менеджера.
-
serial— serial персонажа: число, рядок з ID 0x… або селектор об’єкта, наприклад "self" чи "lasttarget". Це не тип тіла, не ім’я файлу й не профіль менеджера.
string - текст основного опису, без заголовка та підпису. Порожній опис є законним; порожній результат також можливий за відсутності відповіді за 3 секунди. Це не true/false. Запит надсилається при кожному виклику; якщо опис вже збережено в сеансі, він повертається відразу, включаючи чернетку відкритого вікна. Це не гарантія свіжої відповіді сервера.
- Опис та його чернетка належать сеансу. Закриття вікна гри зберігає їх без публікації, відкриття відновлює вікно Profile. Явне закриття власного Profile відправляє змінений текст один раз; чужий текст не вирушає. Нова відповідь сервера замінює старі дані, розрив їх з'єднання очищає. GetProfile сам нічого не редагує.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.GetProfile("self");
UO.Print("GetProfile: " + Convert.ToString(result));Параметри та порядок виконання:
- "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;Параметри та порядок виконання:
- Потрібен існуючий 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;
}Параметри та порядок виконання:
- Вся функція 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.
Параметри: serial (Any)
Результат: string / String.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetProfile. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetProfile:bridge.GetProfile(GetObject(serial)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(serial).
Внутрішній код реалізації, не самостійний скрипт.
public string GetProfile(InjectionValue serial) => bridge.GetProfile(GetObject(serial));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.LoadHotkeys();Завантажує збережені макроси та гарячі клавіші.
Параметрів немає.
void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.
- LoadHotkeys викликає _world.Macros.Load через Invoke. Поточна таблиця макросів замінюється даними локального профілю.
- Змінює або показує лише вказані локальні дані. Серверного підтвердження цієї команди немає.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.LoadHotkeys");
UO.LoadHotkeys();Параметри та порядок виконання:
- Завантажує збережені макроси та гарячі клавіші.
UO.LoadHotkeys();Параметри та порядок виконання:
- LoadHotkeys викликає _world.Macros.Load через Invoke. Поточна таблиця макросів замінюється даними локального профілю.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.ProfileName());
UO.LoadHotkeys();
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.LoadHotkeys();
UO.Print("Macros loaded");
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LoadHotkeys:bridge.LoadHotkeys().
Внутрішній код реалізації, не самостійний скрипт.
case "loadhotkeys": bridge.LoadHotkeys(); break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.ProfileName();Читає ім'я поточного профілю.
Параметрів немає.
string - текст поля bridge. ProfileName; без доступних даних можливий порожній рядок. Це не ознака підключення і не числової ID.
- ExecuteClientApiCompatibility повертає bridge.ProfileName без зміни вибору профілю або сервера.
- Читає поточний локальний стан. Пакету, target та автоматичного оновлення немає; окремі читання можуть бачити різні стани.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.ProfileName();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- Читає ім'я поточного профілю.
var value = UO.ProfileName();
UO.Print(value);Параметри та порядок виконання:
- 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;Параметри та порядок виконання:
- Читає поточний локальний стан. Пакету, 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.
Параметри: Немає параметрів.
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ProfileName:bridge.ProfileName.
Внутрішній код реалізації, не самостійний скрипт.
case "profilename": return new InjectionValue(bridge.ProfileName);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.ProfileShardName();Читає ім'я шарда.
Параметрів немає.
string - текст поля bridge. ShardName; без доступних даних можливий порожній рядок. Це не ознака підключення і не числової ID.
- ExecuteClientApiCompatibility повертає bridge.ShardName без зміни вибору профілю або сервера.
- Читає поточний локальний стан. Пакету, target та автоматичного оновлення немає; окремі читання можуть бачити різні стани.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.ProfileShardName();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- Читає ім'я шарда.
var value = UO.ProfileShardName();
UO.Print(value);Параметри та порядок виконання:
- 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;Параметри та порядок виконання:
- Читає поточний локальний стан. Пакету, 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.
Параметри: Немає параметрів.
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ShardName:bridge.ShardName.
Внутрішній код реалізації, не самостійний скрипт.
case "shardname":
case "profileshardname": return new InjectionValue(bridge.ShardName);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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. Наявність тексту не є доказом успішного перейменування чи статусу персонажа.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.ReqProfile");
UO.ReqProfile();Параметри та порядок виконання:
- Друкує відомий profile-текст персонажа.
UO.ReqProfile();Параметри та порядок виконання:
- ExecuteLegacyManualAlias викликає GetProfile, потім SystemMessage. Bridge.GetProfile відправляє RequestProfile, потім до 3 секунд перевіряє CharacterPanels.Profile.CurrentText з паузами 25 ms. Вже наявний текст може повернутися відразу; при timeout виводить повідомлення та дає порожній рядок. Ця команда друкує текст, але не повертає його.
return RunScenario();
object? RunScenario()
{
UO.ReqProfile("self");
return null;
}Параметри та порядок виконання:
- Для значення 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.
Параметри: Немає параметрів.
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage(GetProfile(arguments.Length > 0 ? arguments[0] : new InjectionValue("lasttarget"))). -
InjectionScript.Runtime.InjectionApiUO.GetProfile:GetProfile(arguments.Length > 0 ? arguments[0] : new InjectionValue("lasttarget")).
Внутрішній код реалізації, не самостійний скрипт.
case "reqprofile":
SystemMessage(GetProfile(arguments.Length > 0 ? arguments[0] : new InjectionValue("lasttarget")));
break;Параметри: mobile (Any)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage(GetProfile(arguments.Length > 0 ? arguments[0] : new InjectionValue("lasttarget"))). -
InjectionScript.Runtime.InjectionApiUO.GetProfile:GetProfile(arguments.Length > 0 ? arguments[0] : new InjectionValue("lasttarget")).
Внутрішній код реалізації, не самостійний скрипт.
case "reqprofile":
SystemMessage(GetProfile(arguments.Length > 0 ? arguments[0] : new InjectionValue("lasttarget")));
break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.ResetProfile();Скидає активний профіль до значень за промовчанням.
Параметрів немає.
void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.
- ResetProfile викликає ProfileManager.ResetCurrentProfileToDefault; якщо активного профілю немає, виводиться помилка. Змінює локальні налаштування, тому збережені значення користувача можуть бути втрачені.
- Змінює або показує лише вказані локальні дані. Серверного підтвердження цієї команди немає.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.ResetProfile");
UO.ResetProfile();Параметри та порядок виконання:
- Скидає активний профіль до значень за промовчанням.
UO.ResetProfile();Параметри та порядок виконання:
- ResetProfile викликає ProfileManager.ResetCurrentProfileToDefault; якщо активного профілю немає, виводиться помилка. Змінює локальні налаштування, тому збережені значення користувача можуть бути втрачені.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.ProfileName());
UO.ResetProfile();
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.ResetProfile();
UO.SaveConfig();
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ResetProfile:bridge.ResetProfile().
Внутрішній код реалізації, не самостійний скрипт.
case "resetprofile": bridge.ResetProfile(); break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SaveConfig();Зберігає поточний профіль ClassicUO.
Параметрів немає.
void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.
- SaveConfig викликає ProfileManager.SaveCurrentProfile через Invoke. Команда записує налаштування локального профілю; шлях береться у ProfileManager.
- Змінює або показує лише вказані локальні дані. Серверного підтвердження цієї команди немає.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.SaveConfig");
UO.SaveConfig();Параметри та порядок виконання:
- Зберігає поточний профіль ClassicUO.
UO.SaveConfig();Параметри та порядок виконання:
- SaveConfig викликає ProfileManager.SaveCurrentProfile через Invoke. Команда записує налаштування локального профілю; шлях береться у ProfileManager.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.ProfileName());
UO.SaveConfig();
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.SaveConfig();
UO.Print(UO.ShardPath());
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.SaveConfig. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SaveConfig:bridge.SaveConfig().
Внутрішній код реалізації, не самостійний скрипт.
public void SaveConfig() => bridge.SaveConfig();Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SaveHotkeys();Зберігає макроси та гарячі клавіші.
Параметрів немає.
void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.
- SaveHotkeys викликає _world.Macros.Save через Invoke. Зберігається локальна таблиця макросів поточного профілю.
- Змінює або показує лише вказані локальні дані. Серверного підтвердження цієї команди немає.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.SaveHotkeys");
UO.SaveHotkeys();Параметри та порядок виконання:
- Зберігає макроси та гарячі клавіші.
UO.SaveHotkeys();Параметри та порядок виконання:
- SaveHotkeys викликає _world.Macros.Save через Invoke. Зберігається локальна таблиця макросів поточного профілю.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.ProfileName());
UO.SaveHotkeys();
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.SaveHotkeys();
UO.LoadHotkeys();
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SaveHotkeys:bridge.SaveHotkeys().
Внутрішній код реалізації, не самостійний скрипт.
case "savehotkeys": bridge.SaveHotkeys(); break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 не шукає предметів і не переодягає.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.Set");
UO.Set("finddistance", 10);Параметри та порядок виконання:
- Змінює одну з трьох legacy-налаштувань.
UO.Set("finddistance", 10);Параметри та порядок виконання:
- finddistance викликає bridge.SetFindDistance, grabdelay - bridge.SetGrabDelay, equipfordress присвоює state.UseEquipForDress. Це три окремі налаштування; універсального setter довільних властивостей немає.
return RunScenario();
object? RunScenario()
{
UO.Set("grabdelay", "250");
return null;
}Параметри та порядок виконання:
- Рядкове значення спочатку перетворюється 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.
Параметри: name (String), value (Integer/String)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.Set. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetFindDistance:bridge.SetFindDistance(value). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetGrabDelay:bridge.SetGrabDelay(value).
Внутрішній код реалізації, не самостійний скрипт.
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;
}
}Параметри: name (String), value (Integer/String)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.Set. -
InjectionScript.Runtime.NumberConversions.TryStr2Int:NumberConversions.TryStr2Int(valueStr, out var value). -
InjectionScript.Runtime.InjectionApiUO.Set:Set(name, valueInt).
Внутрішній код реалізації, не самостійний скрипт.
public void Set(string name, string valueStr)
{
int valueInt = NumberConversions.TryStr2Int(valueStr, out var value) ? value : 0;
Set(name, valueInt);
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 все одно перевіряються по завантаженому світу.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.SetDefault");
UO.SetDefault("manualObject", UO.Self());Параметри та порядок виконання:
- Зберігає іменований або serial в стані runtime.
UO.SetDefault("manualObject", UO.Self());Параметри та порядок виконання:
- 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;
}Параметри та порядок виконання:
- Це запис імені об’єкта, не скидання профілю й не відновлення всіх налаштувань до 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.
Параметри: name (Any), object (Any)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.State.RuntimeDictionary.Set:state.Objects.Set(Text(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Text:Text(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(1).
Внутрішній код реалізації, не самостійний скрипт.
case "setdefault":
if (arguments.Length > 1) state.Objects.Set(Text(0), Arg(1));
break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 не приховуються цією функцією.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.SetEasyUO");
UO.SetEasyUO(9001, "manual-example");Параметри та порядок виконання:
- Записує рядкове значення у Windows registry EasyUO.
UO.SetEasyUO(9001, "manual-example");Параметри та порядок виконання:
- На Windows відкриває/створює HKCU\Software\EasyUO з правом запису, SetValue(decimalNumber,value,RegistryValueKind.String). На інших ОС виводить повідомлення та не записує.
return RunScenario();
object? RunScenario()
{
UO.SetEasyUO(9001, "");
return null;
}Параметри та порядок виконання:
- Це зовнішній постійний запис в 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.
Параметри: number (Any), value (Any)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.SetEasyUO. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetEasyUO:bridge.SetEasyUO(NumberConversions.ToInt(number), value.ToString()). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(number). -
InjectionScript.Runtime.InjectionValue.ToString:value.ToString().
Внутрішній код реалізації, не самостійний скрипт.
public void SetEasyUO(InjectionValue number, InjectionValue value)
=> bridge.SetEasyUO(NumberConversions.ToInt(number), value.ToString());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 все одно перевіряються по завантаженому світу.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.SetGlobal");
UO.SetGlobal("manual.delay", 350);Параметри та порядок виконання:
- Затримка: 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;Параметри та порядок виконання:
- Режим: 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;Параметри та порядок виконання:
- 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.
Параметри: name (String), value (Decimal/Integer/String)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.State.Globals.SetGlobal. -
InjectionScript.Runtime.State.Globals.SetGlobal:SetGlobal(name, value.ToString()).
Внутрішній код реалізації, не самостійний скрипт.
public void SetGlobal(string name, double value) => SetGlobal(name, value.ToString());Параметри: name (String), value (Decimal/Integer/String)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.State.Globals.SetGlobal. -
InjectionScript.Runtime.State.Globals.SetGlobal:SetGlobal(name, value.ToString()).
Внутрішній код реалізації, не самостійний скрипт.
public void SetGlobal(string name, int value) => SetGlobal(name, value.ToString());Параметри: name (String), value (Decimal/Integer/String)
Результат: void / Unit.
Під час виклику:
Внутрішній код реалізації, не самостійний скрипт.
public void SetGlobal(string name, string value)
{
lock (globalsLock)
globals[name] = value;
}Параметри: globalRegion (Any), varName (Any), varValue (Any)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
Внутрішній код реалізації, не самостійний скрипт.
case "setglobal":
state.GlobalVariables[Text(0) + "\u001F" + Text(1)] = Text(2);
return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetMulPath(object? pathValue);Зберігає рядок шляху mulPath у runtime.
-
pathValue— Текст через ToString; зберігається як переданий.
void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.
- Надає mulPath = ToString або порожній рядок. Файл не відкривається, дані картки не перезавантажуються та доступність шляху не перевіряється цією функцією.
- Це compatibility-сховище поточного runtime. У проекті немає споживачів private mulPath/showZ; зміна не перезавантажує assets і не змінює відображення висоти.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.SetMulPath");
UO.SetMulPath("C:\\Ultima Online");Параметри та порядок виконання:
- Зберігає рядок шляху mulPath у runtime.
UO.SetMulPath("C:\\Ultima Online");Параметри та порядок виконання:
- Надає mulPath = ToString або порожній рядок. Файл не відкривається, дані картки не перезавантажуються та доступність шляху не перевіряється цією функцією.
return RunScenario();
object? RunScenario()
{
UO.SetMulPath("");
return null;
}Параметри та порядок виконання:
- Це 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.
Параметри: pathValue (Any)
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.SetMulPath. -
InjectionScript.Runtime.InjectionValue.ToString:pathValue.ToString().
Внутрішній код реалізації, не самостійний скрипт.
public void SetMulPath(InjectionValue pathValue) => mulPath = pathValue.ToString() ?? string.Empty;ClassicUO — Bad Newbie & C# Scripts IDE