RU UO Topic profiles configuration - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Главная · C# · IDE · UO API · A–Z · Примеры · Языки
Профили, сохранение настроек, глобальные значения и горячие клавиши. Глобальное значение runtime и локальная переменная процедуры имеют разное время жизни.
| Тема | Команды и пояснения |
|---|---|
| GetProfile | UO.GetProfile |
| ProfileName | UO.ProfileName |
| ProfileShardName | UO.ProfileShardName |
| ChangeProfile | UO.ChangeProfile |
| ExtChangeProfile | UO.ExtChangeProfile |
| ResetProfile | UO.ResetProfile |
| SaveConfig | UO.SaveConfig |
| Global Variables | UO.GetGlobal · UO.SetGlobal · UO.GListGet · UO.GListSet · UO.GListSize |
| EasyUO Variables | UO.GetEasyUO · UO.SetEasyUO |
| MUL Path | 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));string UO.GetGlobal(object? name);
dynamic UO.GetGlobal(object? globalRegion, object? varName);SetGlobal и GetGlobal используют одно пространство для всех скриптов и профилей, включая разные процессы Full Client и Client. Значения хранятся как строки; отсутствующий ключ возвращает "N/A". Регистр ключа учитывается. Формы с region используют пару region/name. Файл Manager/Game Manager/CSharp/globals.json читается заново под межпроцессной блокировкой; перезапуск сохраняет значения. Shared-формы — явные синонимы этого же хранилища.
-
globalRegion— Пространство имён; объединяется с именем ключа. -
name— Имя общего ключа с учётом регистра. -
varName— Имя общего ключа с учётом регистра.
Каждый блок — полный отдельный .csx. Замените демонстрационные serial, type и координаты своими. Параметры идут в порядке сигнатуры; именованные параметры C# позволяют явно указать их назначение.
#getglobal team.target
#get global team.message
Каждый блок — полный отдельный .csx. Замените демонстрационные serial, type и координаты своими. Параметры идут в порядке сигнатуры; именованные параметры C# позволяют явно указать их назначение.
string value = UO.GetGlobal("team.target");
UO.Print(value);string value = UO.GetGlobal("team.delay");
if (int.TryParse(value, out int milliseconds))
UO.Print(milliseconds.ToString());UO.Print(Convert.ToString(UO.GetGlobal("team", "delay")));new CommandSample().Execute(UO);
sealed class CommandSample
{
public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
{
string value = api.GetGlobal("team.target");
api.Print(value);
}
}CSharpGameApi.GetGlobal
-> CSharpScriptGlobals
-> InjectionScript.Runtime.InjectionApiUO.RegisterClientApiCompatibility
-> InjectionScript.Runtime.State.Globals.GetGlobal
Globals -> SharedGlobalStore -> named mutex -> atomic JSON replacement
Українська · Русский · 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);Сохраняет именованный alias serial в состоянии runtime.
-
name— Имя alias как текст, регистр обрабатывает 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());Параметры и ход выполнения:
- Сохраняет именованный alias 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. Ошибки доступа к registry не скрываются этой функцией.
Каждый пример можно сохранить отдельным файлом .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. Ошибки доступа к registry не скрываются этой функцией.
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());void UO.SetGlobal(object? name, object? value);
void UO.SetGlobal(object? globalRegion, object? varName, object? varValue);SetGlobal и GetGlobal используют одно пространство для всех скриптов и профилей, включая разные процессы Full Client и Client. Значения хранятся как строки; отсутствующий ключ возвращает "N/A". Регистр ключа учитывается. Формы с region используют пару region/name. Файл Manager/Game Manager/CSharp/globals.json читается заново под межпроцессной блокировкой; перезапуск сохраняет значения. Shared-формы — явные синонимы этого же хранилища.
-
globalRegion— Пространство имён; объединяется с именем ключа. -
name— Имя общего ключа с учётом регистра. -
value— Значение, сохраняемое как текст. -
varName— Имя общего ключа с учётом регистра. -
varValue— Значение, сохраняемое как текст.
Каждый блок — полный отдельный .csx. Замените демонстрационные serial, type и координаты своими. Параметры идут в порядке сигнатуры; именованные параметры C# позволяют явно указать их назначение.
#setglobal team.target 0x40001234
#set global team.message Привіт усім
Каждый блок — полный отдельный .csx. Замените демонстрационные serial, type и координаты своими. Параметры идут в порядке сигнатуры; именованные параметры C# позволяют явно указать их назначение.
UO.SetGlobal("team.target", 0x40001234);
UO.Print(UO.GetGlobal("team.target"));UO.SetGlobal("team.message", "Привіт");
UO.Print(UO.GetGlobal("team.message"));UO.SetGlobal("team", "delay", "350");
UO.Print(Convert.ToString(UO.GetGlobal("team", "delay")));new CommandSample().Execute(UO);
sealed class CommandSample
{
public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
{
api.SetGlobal("team.target", 0x40001234);
api.Print(api.GetGlobal("team.target"));
}
}CSharpGameApi.SetGlobal
-> CSharpScriptGlobals
-> InjectionScript.Runtime.InjectionApiUO.RegisterClientApiCompatibility
-> InjectionScript.Runtime.State.Globals.SetGlobal
Globals -> SharedGlobalStore -> named mutex -> atomic JSON replacement
Українська · Русский · 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;