RU UO Topic skills - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Главная · C# · IDE · UO API · A–Z · Примеры · Языки
Применение навыков, чтение значений и управление замками навыков. Название навыка и доступность действия зависят от поддерживаемых клиентом/сервером данных.
Открыть полный каталог и примеры
| Тема | Команды и пояснения |
|---|---|
| UseSkill | UO.UseSkill |
| Skill Value | UO.GetSkillValue · UO.SkillVal |
| Skill Current Value | UO.GetSkillCurrentValue |
| Skill Cap | UO.GetSkillCap |
| Skill Locks | UO.GetSkillLockState · UO.SetSkillLockState |
| Tracking | UO.Track |
| Snooping | UO.Snoop |
| Stealth | UO.StealthCnt · UO.UseSkill |
UO.UseSkill · UO.GetSkillCap · UO.GetSkillCurrentValue · UO.GetSkillValue · UO.GetSkillLockState · UO.SetSkillLockState · UO.SkillLockState · UO.SkillVal · UO.Track · UO.Snoop · UO.StealthCnt · UO.TicksSkill
В каждой карточке команды есть несколько самостоятельных сценариев: прямой код, функции и классы. Ниже приведены отдельные короткие сценарии; ограничения и полный разбор находятся в карточках.
Параметры, результат и все сценарии
if (!(Truth(UO.Connected())) || Truth(UO.Dead()) || Truth(UO.Hidden()))
{
return null;
}
if (!(Truth(UO.UseSkill("Hiding"))))
{
UO.Print("Hiding request rejected");
return null;
}
await Delay(1000);
if (Truth(UO.Hidden()))
{
UO.Print("Character is hidden");
}
else
{
UO.Print("Not hidden yet; check the game journal");
}
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;Параметры, результат и все сценарии
var selector = "Mining";
var value = UO.GetSkillValue(selector);
UO.Print(Convert.ToString(value));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
double UO.GetSkillCap(object? skillName);Читает предел навыка, полученный от сервера.
-
skillName— Обязательный навык: имя из данных клиента, например "Mining" или "Animal Lore", либо десятичный индекс от 0 до Skills.Length−1, числом или строкой. Регистр имени не важен, крайние пробелы удаляются, _ заменяется пробелом. Индекс не является ID предмета или индексом от 1. Числовая строка всегда означает индекс.
double (Double) — очки навыка с шагом 0,1, например 95,1, а не 951. Поле CapFixed делится на 10 непосредственно в Double. 0 означает нулевой навык либо отсутствие персонажа/навыка. Результат не bool. Legacy SkillVal/BaseVal имеют другой масштаб — не смешивайте эти семейства.
- Чтение выполняется через Invoke на игровом потоке по уже полученным данным; сетевые пакеты не отправляются. Навык не используется и не тренируется. Два запроса — два отдельных снимка.
- Обязательный навык: имя из данных клиента, например "Mining" или "Animal Lore", либо десятичный индекс от 0 до Skills.Length−1, числом или строкой. Регистр имени не важен, крайние пробелы удаляются, _ заменяется пробелом. Индекс не является ID предмета или индексом от 1. Числовая строка всегда означает индекс.
- ExecuteClientApiCompatibility выбирает ветку команды. Text читает селектор навыка, Arg — числовые номера и режимы. Непреобразуемый аргумент может завершить вызов ошибкой преобразования.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.GetSkillCap("Mining");
UO.Print("GetSkillCap: " + Convert.ToString(result));Параметры и ход выполнения:
- В примере явно заданы selector и, при записи, mode. Первая строка выбирает навык по имени или характеристику по номеру. Print только выводит результат.
var selector = "Mining";
var value = UO.GetSkillCap(selector);
UO.Print(Convert.ToString(value));Параметры и ход выполнения:
- Порог 95.1 и режимы 0/1/2 заданы для примера. −1 проверяется до изменения режима. После записи читается только локальная копия; это не ожидание ответа сервера.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.GetSkillLockState("Mining") >= 0))
{
var value = UO.GetSkillCap("Mining");
if (Truth(value >= 95.1))
{
UO.Print("Value >= 95.1: " + Convert.ToString(value));
}
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Весь код помощника приведён ниже Main. selector выбирает навык/характеристику, mode задаёт режим записи. ReadValue/ReadMode возвращают исходное число; ApplyMode проверяет аргументы, выполняет действие и не возвращает значение. UO.Wait(1000) в примере чтения разделяет два снимка.
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()
{
var before = ReadValue("Animal_Lore");
await Delay(1000);
var after = ReadValue("Animal Lore");
UO.Print(Convert.ToString(after - before));
return null;
}
dynamic ReadValue(dynamic selector)
{
return UO.GetSkillCap(selector);
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: skillName (Any)
Результат: double / Decimal.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetSkillValue:bridge.GetSkillValue(Text(0), false, true). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
Внутренний код реализации, не самостоятельный скрипт.
case "getskillcap": return new InjectionValue(bridge.GetSkillValue(Text(0), false, true));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
double UO.GetSkillCurrentValue(object? skillName);Читает эффективное значение навыка с модификаторами.
-
skillName— Обязательный навык: имя из данных клиента, например "Mining" или "Animal Lore", либо десятичный индекс от 0 до Skills.Length−1, числом или строкой. Регистр имени не важен, крайние пробелы удаляются, _ заменяется пробелом. Индекс не является ID предмета или индексом от 1. Числовая строка всегда означает индекс.
double (Double) — очки навыка с шагом 0,1, например 95,1, а не 951. Поле ValueFixed делится на 10 непосредственно в Double. 0 означает нулевой навык либо отсутствие персонажа/навыка. Результат не bool. Legacy SkillVal/BaseVal имеют другой масштаб — не смешивайте эти семейства.
- Чтение выполняется через Invoke на игровом потоке по уже полученным данным; сетевые пакеты не отправляются. Навык не используется и не тренируется. Два запроса — два отдельных снимка.
- Обязательный навык: имя из данных клиента, например "Mining" или "Animal Lore", либо десятичный индекс от 0 до Skills.Length−1, числом или строкой. Регистр имени не важен, крайние пробелы удаляются, _ заменяется пробелом. Индекс не является ID предмета или индексом от 1. Числовая строка всегда означает индекс.
- ExecuteClientApiCompatibility выбирает ветку команды. Text читает селектор навыка, Arg — числовые номера и режимы. Непреобразуемый аргумент может завершить вызов ошибкой преобразования.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.GetSkillCurrentValue("Mining");
UO.Print("GetSkillCurrentValue: " + Convert.ToString(result));Параметры и ход выполнения:
- В примере явно заданы selector и, при записи, mode. Первая строка выбирает навык по имени или характеристику по номеру. Print только выводит результат.
var selector = "Mining";
var value = UO.GetSkillCurrentValue(selector);
UO.Print(Convert.ToString(value));Параметры и ход выполнения:
- Порог 95.1 и режимы 0/1/2 заданы для примера. −1 проверяется до изменения режима. После записи читается только локальная копия; это не ожидание ответа сервера.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.GetSkillLockState("Mining") >= 0))
{
var value = UO.GetSkillCurrentValue("Mining");
if (Truth(value >= 95.1))
{
UO.Print("Value >= 95.1: " + Convert.ToString(value));
}
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Весь код помощника приведён ниже Main. selector выбирает навык/характеристику, mode задаёт режим записи. ReadValue/ReadMode возвращают исходное число; ApplyMode проверяет аргументы, выполняет действие и не возвращает значение. UO.Wait(1000) в примере чтения разделяет два снимка.
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()
{
var before = ReadValue("Animal_Lore");
await Delay(1000);
var after = ReadValue("Animal Lore");
UO.Print(Convert.ToString(after - before));
return null;
}
dynamic ReadValue(dynamic selector)
{
return UO.GetSkillCurrentValue(selector);
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: skillName (Any)
Результат: double / Decimal.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetSkillValue:bridge.GetSkillValue(Text(0), true, false). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
Внутренний код реализации, не самостоятельный скрипт.
case "getskillcurrentvalue": return new InjectionValue(bridge.GetSkillValue(Text(0), true, false));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetSkillLockState(object? skillName);Читает локальный режим изменения навыка.
-
skillName— Обязательный навык: имя из данных клиента, например "Mining" или "Animal Lore", либо десятичный индекс от 0 до Skills.Length−1, числом или строкой. Регистр имени не важен, крайние пробелы удаляются, _ заменяется пробелом. Индекс не является ID предмета или индексом от 1. Числовая строка всегда означает индекс.
int: 0 — повышение, 1 — понижение, 2 — блокировка. Это код режима, не true/false. Для неизвестного навыка или отсутствующего персонажа возвращается −1.
- Чтение выполняется через Invoke на игровом потоке по уже полученным данным; сетевые пакеты не отправляются. Навык не используется и не тренируется. Два запроса — два отдельных снимка.
- Обязательный навык: имя из данных клиента, например "Mining" или "Animal Lore", либо десятичный индекс от 0 до Skills.Length−1, числом или строкой. Регистр имени не важен, крайние пробелы удаляются, _ заменяется пробелом. Индекс не является ID предмета или индексом от 1. Числовая строка всегда означает индекс.
- ExecuteClientApiCompatibility выбирает ветку команды. Text читает селектор навыка, Arg — числовые номера и режимы. Непреобразуемый аргумент может завершить вызов ошибкой преобразования.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.GetSkillLockState("Mining");
UO.Print("GetSkillLockState: " + Convert.ToString(result));Параметры и ход выполнения:
- В примере явно заданы selector и, при записи, mode. Первая строка выбирает навык по имени или характеристику по номеру. Print только выводит результат.
var selector = "Mining";
var mode = UO.GetSkillLockState(selector);
UO.Print(Convert.ToString(mode));Параметры и ход выполнения:
- Порог 95.1 и режимы 0/1/2 заданы для примера. −1 проверяется до изменения режима. После записи читается только локальная копия; это не ожидание ответа сервера.
return RunScenario();
object? RunScenario()
{
var mode = UO.GetSkillLockState("Mining");
if (Truth(mode == 2))
{
UO.Print("Locked");
}
else
{
if (Truth(mode == -1))
{
UO.Print("Unknown selector");
}
else
{
UO.Print("Mode: " + Convert.ToString(mode));
}
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Весь код помощника приведён ниже Main. selector выбирает навык/характеристику, mode задаёт режим записи. ReadValue/ReadMode возвращают исходное число; ApplyMode проверяет аргументы, выполняет действие и не возвращает значение. UO.Wait(1000) в примере чтения разделяет два снимка.
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()
{
var before = ReadMode("Mining");
await Delay(1000);
var after = ReadMode("Mining");
UO.Print(Convert.ToString(before) + " -> " + Convert.ToString(after));
return null;
}
dynamic ReadMode(dynamic selector)
{
return UO.GetSkillLockState(selector);
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: skillName (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetSkillLockState:bridge.GetSkillLockState(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
Внутренний код реализации, не самостоятельный скрипт.
case "getskilllockstate": return new InjectionValue(bridge.GetSkillLockState(Text(0)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
double UO.GetSkillValue(object? skillName);Читает базовое значение навыка без модификаторов.
-
skillName— Обязательный навык: имя из данных клиента, например "Mining" или "Animal Lore", либо десятичный индекс от 0 до Skills.Length−1, числом или строкой. Регистр имени не важен, крайние пробелы удаляются, _ заменяется пробелом. Индекс не является ID предмета или индексом от 1. Числовая строка всегда означает индекс.
double (Double) — очки навыка с шагом 0,1, например 95,1, а не 951. Поле BaseFixed делится на 10 непосредственно в Double. 0 означает нулевой навык либо отсутствие персонажа/навыка. Результат не bool. Legacy SkillVal/BaseVal имеют другой масштаб — не смешивайте эти семейства.
- Чтение выполняется через Invoke на игровом потоке по уже полученным данным; сетевые пакеты не отправляются. Навык не используется и не тренируется. Два запроса — два отдельных снимка.
- Обязательный навык: имя из данных клиента, например "Mining" или "Animal Lore", либо десятичный индекс от 0 до Skills.Length−1, числом или строкой. Регистр имени не важен, крайние пробелы удаляются, _ заменяется пробелом. Индекс не является ID предмета или индексом от 1. Числовая строка всегда означает индекс.
- ExecuteClientApiCompatibility выбирает ветку команды. Text читает селектор навыка, Arg — числовые номера и режимы. Непреобразуемый аргумент может завершить вызов ошибкой преобразования.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.GetSkillValue("Mining");
UO.Print("GetSkillValue: " + Convert.ToString(result));Параметры и ход выполнения:
- В примере явно заданы selector и, при записи, mode. Первая строка выбирает навык по имени или характеристику по номеру. Print только выводит результат.
var selector = "Mining";
var value = UO.GetSkillValue(selector);
UO.Print(Convert.ToString(value));Параметры и ход выполнения:
- Порог 95.1 и режимы 0/1/2 заданы для примера. −1 проверяется до изменения режима. После записи читается только локальная копия; это не ожидание ответа сервера.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.GetSkillLockState("Mining") >= 0))
{
var value = UO.GetSkillValue("Mining");
if (Truth(value >= 95.1))
{
UO.Print("Value >= 95.1: " + Convert.ToString(value));
}
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Весь код помощника приведён ниже Main. selector выбирает навык/характеристику, mode задаёт режим записи. ReadValue/ReadMode возвращают исходное число; ApplyMode проверяет аргументы, выполняет действие и не возвращает значение. UO.Wait(1000) в примере чтения разделяет два снимка.
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()
{
var before = ReadValue("Animal_Lore");
await Delay(1000);
var after = ReadValue("Animal Lore");
UO.Print(Convert.ToString(after - before));
return null;
}
dynamic ReadValue(dynamic selector)
{
return UO.GetSkillValue(selector);
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: skillName (Any)
Результат: double / Decimal.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetSkillValue:bridge.GetSkillValue(Text(0), false, false). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
Внутренний код реализации, не самостоятельный скрипт.
case "getskillvalue": return new InjectionValue(bridge.GetSkillValue(Text(0), false, false));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetSkillLockState(object? skillName, object? skillState);Запрашивает изменение режима навыка.
-
skillName— Обязательный навык: имя из данных клиента, например "Mining" или "Animal Lore", либо десятичный индекс от 0 до Skills.Length−1, числом или строкой. Регистр имени не важен, крайние пробелы удаляются, _ заменяется пробелом. Индекс не является ID предмета или индексом от 1. Числовая строка всегда означает индекс. -
skillState— Обязательный режим: 0 — повышение, 1 — понижение, 2 — блокировка. Это три кода, не bool; true/false не заменяют названия всех режимов.
void — возвращаемого значения нет. Нельзя использовать результат как успех/ошибку или сравнивать с true. Последующее чтение показывает локальную модель, а не подтверждение сервера.
- Допустимый запрос отправляет один пакет через GameActions и сразу меняет локальный режим. Сервер может применить свои ограничения; повышение навыка или характеристики не гарантируется. Неизвестный навык, недопустимый индекс/режим и отсутствие персонажа игнорируются без пакета.
- Обязательный навык: имя из данных клиента, например "Mining" или "Animal Lore", либо десятичный индекс от 0 до Skills.Length−1, числом или строкой. Регистр имени не важен, крайние пробелы удаляются, _ заменяется пробелом. Индекс не является ID предмета или индексом от 1. Числовая строка всегда означает индекс.
- ExecuteClientApiCompatibility выбирает ветку команды. Text читает селектор навыка, Arg — числовые номера и режимы. Непреобразуемый аргумент может завершить вызов ошибкой преобразования.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.SetSkillLockState");
UO.SetSkillLockState("Mining", 2);Параметры и ход выполнения:
- В примере явно заданы selector и, при записи, mode. Первая строка выбирает навык по имени или характеристику по номеру. Print только выводит результат.
var selector = "Mining";
var mode = 2;
UO.SetSkillLockState(selector, mode);
UO.Print(Convert.ToString(UO.GetSkillLockState(selector)));Параметры и ход выполнения:
- Порог 95.1 и режимы 0/1/2 заданы для примера. −1 проверяется до изменения режима. После записи читается только локальная копия; это не ожидание ответа сервера.
return RunScenario();
object? RunScenario()
{
var selector = "Mining";
var before = UO.GetSkillLockState(selector);
if (Truth(before >= 0) && Truth(before <= 2))
{
UO.SetSkillLockState(selector, 0);
UO.Print(Convert.ToString(UO.GetSkillLockState(selector)));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Весь код помощника приведён ниже Main. selector выбирает навык/характеристику, mode задаёт режим записи. ReadValue/ReadMode возвращают исходное число; ApplyMode проверяет аргументы, выполняет действие и не возвращает значение. UO.Wait(1000) в примере чтения разделяет два снимка.
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()
{
ApplyMode("Mining", 2);
return null;
}
void ApplyMode(dynamic selector, dynamic mode)
{
if (Truth(mode < 0) || Truth(mode > 2))
{
return;
}
if (Truth(UO.GetSkillLockState(selector) < 0))
{
return;
}
UO.SetSkillLockState(selector, mode);
}
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.
Параметры: skillName (Any), skillState (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetSkillLockState:bridge.SetSkillLockState(Text(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1).
Внутренний код реализации, не самостоятельный скрипт.
case "setskilllockstate":
case "skilllockstate": bridge.SetSkillLockState(Text(0), Arg(1)); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SkillLockState(object? skillName, object? skillState);Запрашивает изменение режима навыка.
-
skillName— Обязательный навык: имя из данных клиента, например "Mining" или "Animal Lore", либо десятичный индекс от 0 до Skills.Length−1, числом или строкой. Регистр имени не важен, крайние пробелы удаляются, _ заменяется пробелом. Индекс не является ID предмета или индексом от 1. Числовая строка всегда означает индекс. -
skillState— Обязательный режим: 0 — повышение, 1 — понижение, 2 — блокировка. Это три кода, не bool; true/false не заменяют названия всех режимов.
void — возвращаемого значения нет. Нельзя использовать результат как успех/ошибку или сравнивать с true. Последующее чтение показывает локальную модель, а не подтверждение сервера.
- Допустимый запрос отправляет один пакет через GameActions и сразу меняет локальный режим. Сервер может применить свои ограничения; повышение навыка или характеристики не гарантируется. Неизвестный навык, недопустимый индекс/режим и отсутствие персонажа игнорируются без пакета.
- Обязательный навык: имя из данных клиента, например "Mining" или "Animal Lore", либо десятичный индекс от 0 до Skills.Length−1, числом или строкой. Регистр имени не важен, крайние пробелы удаляются, _ заменяется пробелом. Индекс не является ID предмета или индексом от 1. Числовая строка всегда означает индекс.
- ExecuteClientApiCompatibility выбирает ветку команды. Text читает селектор навыка, Arg — числовые номера и режимы. Непреобразуемый аргумент может завершить вызов ошибкой преобразования.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.SkillLockState");
UO.SkillLockState("Mining", 2);Параметры и ход выполнения:
- В примере явно заданы selector и, при записи, mode. Первая строка выбирает навык по имени или характеристику по номеру. Print только выводит результат.
var selector = "Mining";
var mode = 2;
UO.SkillLockState(selector, mode);
UO.Print(Convert.ToString(UO.GetSkillLockState(selector)));Параметры и ход выполнения:
- Порог 95.1 и режимы 0/1/2 заданы для примера. −1 проверяется до изменения режима. После записи читается только локальная копия; это не ожидание ответа сервера.
return RunScenario();
object? RunScenario()
{
var selector = "Mining";
var before = UO.GetSkillLockState(selector);
if (Truth(before >= 0) && Truth(before <= 2))
{
UO.SkillLockState(selector, 0);
UO.Print(Convert.ToString(UO.GetSkillLockState(selector)));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Весь код помощника приведён ниже Main. selector выбирает навык/характеристику, mode задаёт режим записи. ReadValue/ReadMode возвращают исходное число; ApplyMode проверяет аргументы, выполняет действие и не возвращает значение. UO.Wait(1000) в примере чтения разделяет два снимка.
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()
{
ApplyMode("Mining", 2);
return null;
}
void ApplyMode(dynamic selector, dynamic mode)
{
if (Truth(mode < 0) || Truth(mode > 2))
{
return;
}
if (Truth(UO.GetSkillLockState(selector) < 0))
{
return;
}
UO.SkillLockState(selector, mode);
}
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.
Параметры: skillName (Any), skillState (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetSkillLockState:bridge.SetSkillLockState(Text(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1).
Внутренний код реализации, не самостоятельный скрипт.
case "setskilllockstate":
case "skilllockstate": bridge.SetSkillLockState(Text(0), Arg(1)); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.SkillVal(object? skillName);
int UO.SkillVal(object? skill, object? variant);Читает legacy-значение навыкa или его режим/прирост.
-
variant— Необязательный int: 0 — эффективное значение (по умолчанию), 1 — базовое значение, 2 — прирост базового значения от первого чтения этого навыка в runtime, 3 — режим блокировки. -
skillName— Имя из словаря runtime skillNameToSkillId, например "Mining". Регистр не важен, но пробелы не обрезаются и _ не заменяется. Числовой текст в этой legacy-функции не является индексом; неизвестное имя выводит сообщение и даёт 0. -
skill— Имя из словаря runtime skillNameToSkillId, например "Mining". Регистр не важен, но пробелы не обрезаются и _ не заменяется. Числовой текст в этой legacy-функции не является индексом; неизвестное имя выводит сообщение и даёт 0.
int: варианты 0/1/2 — десятые очка навыка (951 = 95.1); вариант 3 — режим 0/1/2 либо -1, если нет Player/навыка. Неизвестное имя/вариант даёт 0. Вариант 2 может быть отрицательным, если base ниже сохранённого baseline runtime, в том числе при отсутствии Player и base=0. Это не bool.
- Перед выбором variant берётся SkillBaseVal и, если навык впервые читается, сохраняется baseline. Поэтому даже чтение variant=0/1/3 устанавливает начальную точку будущего прироста variant=2.
- Некорректный variant выводит сообщение и даёт 0, но baseline уже мог быть создан. Значения GetSkillValue/GetSkillCurrentValue измеряются очками double и имеют другой масштаб.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.SkillVal("Mining");
UO.Print("SkillVal: " + Convert.ToString(result));Параметры и ход выполнения:
- Читает legacy-значение навыкa или его режим/прирост.
UO.Print(UO.SkillVal("Mining"));
UO.Print(UO.SkillVal("Mining", 1));Параметры и ход выполнения:
- Перед выбором variant берётся SkillBaseVal и, если навык впервые читается, сохраняется baseline. Поэтому даже чтение variant=0/1/3 устанавливает начальную точку будущего прироста variant=2.
return RunScenario();
object? RunScenario()
{
var baseline = UO.SkillVal("Mining", 2);
UO.Wait(1000);
UO.Print(UO.SkillVal("Mining", 2) - baseline);
return null;
}Параметры и ход выполнения:
- Некорректный variant выводит сообщение и даёт 0, но baseline уже мог быть создан. Значения GetSkillValue/GetSkillCurrentValue измеряются очками double и имеют другой масштаб.
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 lockMode = UO.SkillVal("Mining", 3);
if (Truth(lockMode == 2))
{
UO.Print("Skill locked");
}
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.
Параметры: skillName (String)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.SkillVal. -
InjectionScript.Runtime.InjectionApiUO.SkillVal:SkillVal(skillName, 0).
Внутренний код реализации, не самостоятельный скрипт.
public int SkillVal(string skillName) => SkillVal(skillName, 0);Параметры: skill (Any), variant (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [SkillVal]. -
InjectionScript.Runtime.InjectionApiUO.SkillVal:SkillVal(values[0].ToString(), NumberConversions.ToInt(values[1])). -
InjectionScript.Runtime.InjectionValue.ToString:values[0].ToString(). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(values[1]).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(SkillVal(values[0].ToString(), NumberConversions.ToInt(values[1])))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.Snoop();
void UO.Snoop(object? container);Использует контейнер/объект, обычно запрашивая его открытие.
-
container— Необязательный serial/алиас. По умолчанию bridge.LastTarget. Команда не проверяет IsContainer или принадлежность.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- ExecuteLegacyManualAlias вызывает bridge.UseObject(Arg(0,bridge.LastTarget)). Это обычный double-click запрос, а не отдельный клиентский алгоритм навыка Snooping.
- Bridge посылает запрос на игровом потоке. Действуют правила сервера; встроенного ожидания подтверждения нет.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.Snoop");
UO.Snoop();Параметры и ход выполнения:
- Использует контейнер/объект, обычно запрашивая его открытие.
UO.Snoop();Параметры и ход выполнения:
- ExecuteLegacyManualAlias вызывает bridge.UseObject(Arg(0,bridge.LastTarget)). Это обычный double-click запрос, а не отдельный клиентский алгоритм навыка Snooping.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.IsContainer("lasttarget")))
{
UO.Snoop("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;Параметры и ход выполнения:
- Bridge посылает запрос на игровом потоке. Действуют правила сервера; встроенного ожидания подтверждения нет.
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.Snoop(id);
UO.Wait(500);
UO.Print(UO.GetContent(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. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseObject:bridge.UseObject(Arg(0, bridge.LastTarget)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0, bridge.LastTarget). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastTarget:bridge.LastTarget.
Внутренний код реализации, не самостоятельный скрипт.
case "snoop": bridge.UseObject(Arg(0, bridge.LastTarget)); break;Параметры: container (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseObject:bridge.UseObject(Arg(0, bridge.LastTarget)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0, bridge.LastTarget). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastTarget:bridge.LastTarget.
Внутренний код реализации, не самостоятельный скрипт.
case "snoop": bridge.UseObject(Arg(0, bridge.LastTarget)); break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.StealthCnt();Читает локальный счётчик смещения персонажа в скрытности.
Параметров нет.
int — накопленная сумма max(abs(deltaX),abs(deltaY)) между вызовами при IsHidden. Это не гарантированное число серверных stealth-шагов и не оставшийся лимит.
- Без Player или когда Player не скрыт, сбрасывает count=0 и сохраняет текущие X/Y (либо -1). При скрытности сравнивает с предыдущими сохранёнными X/Y, прибавляет смещение и обновляет координаты.
- Счётчик изменяется при чтении. Перемещение туда и обратно между вызовами может быть пропущено; смена Z без X/Y не увеличивает счётчик.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.StealthCnt();
UO.Print("StealthCnt: " + Convert.ToString(result));Параметры и ход выполнения:
- Читает локальный счётчик смещения персонажа в скрытности.
UO.Print(UO.StealthCnt());Параметры и ход выполнения:
- Без Player или когда Player не скрыт, сбрасывает count=0 и сохраняет текущие X/Y (либо -1). При скрытности сравнивает с предыдущими сохранёнными X/Y, прибавляет смещение и обновляет координаты.
return RunScenario();
object? RunScenario()
{
var before = UO.StealthCnt();
UO.Wait(500);
UO.Print(UO.StealthCnt() - before);
return null;
}Параметры и ход выполнения:
- Счётчик изменяется при чтении. Перемещение туда и обратно между вызовами может быть пропущено; смена Z без X/Y не увеличивает счётчик.
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(UO.Hidden()))
{
UO.Print(UO.StealthCnt());
}
else
{
UO.Print(UO.StealthCnt());
}
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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.StealthCnt. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.StealthCnt:bridge.StealthCnt().
Внутренний код реализации, не самостоятельный скрипт.
public int StealthCnt() => bridge.StealthCnt();Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.TicksSkill();Читает сохранённую отметку TicksSkill.
Параметров нет.
int — отметка UO.Timer в десятых долях секунды от старта runtime. 0 — отметка ещё не установлена либо событие было в первую десятую секунды; это не миллисекунды и не календарное время.
- Возвращает поле ticksSkill. Его обновляет успешно принятый UseSkill/UseSkillAtTarget; это не автоматическое наблюдение всех ручных/серверных действий. Сама команда отметку не меняет.
- UO.Timer() - отметка вычисляет возраст в десятых секунды. Между разными runtime отметки не сравниваются.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.TicksSkill();
UO.Print("TicksSkill: " + Convert.ToString(result));Параметры и ход выполнения:
- Читает сохранённую отметку TicksSkill.
var stamp = UO.TicksSkill();
UO.Print(stamp);Параметры и ход выполнения:
- Возвращает поле ticksSkill. Его обновляет успешно принятый UseSkill/UseSkillAtTarget; это не автоматическое наблюдение всех ручных/серверных действий. Сама команда отметку не меняет.
return RunScenario();
object? RunScenario()
{
var stamp = UO.TicksSkill();
var ageTenths = UO.Timer() - stamp;
UO.Print(ageTenths);
return null;
}Параметры и ход выполнения:
- UO.Timer() - отметка вычисляет возраст в десятых секунды. Между разными runtime отметки не сравниваются.
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.TicksSkill();
UO.Wait(250);
var after = UO.TicksSkill();
UO.Print(before = after);
return null;
}
}C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Параметры: Параметров нет.
Результат: int / Integer.
При вызове:
Внутренний код реализации, не самостоятельный скрипт.
public int TicksSkill() => ticksSkill;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.Track();
void UO.Track(object? flag);
void UO.Track(object? flagRaw, object? x, object? y);Создаёт или убирает локальную стрелку к координатам. Помогает отметить место возвращения. Не запускает навык Tracking, не ищет существ и не перемещает персонажа.
-
flag— 0 — убрать локальную стрелку; любое другое целое — показать. UO.Track() и UO.Track(1) ставят её в текущих X/Y персонажа. UO.Track(1, x, y) ставит её в указанной точке; UO.Track(0, x, y) игнорирует координаты. Двухпараметровая форма не входит в зарегистрированный API. -
flagRaw— 0 — убрать локальную стрелку; любое другое целое — показать. UO.Track() и UO.Track(1) ставят её в текущих X/Y персонажа. UO.Track(1, x, y) ставит её в указанной точке; UO.Track(0, x, y) игнорирует координаты. Двухпараметровая форма не входит в зарегистрированный API. -
x— Координаты клетки на текущей карте, не пиксели окна. Z и номер карты не принимаются. Выберите существующую точку своей карты; команда не проверяет проходимость, не прокладывает маршрут и не следует за движущейся целью. -
y— Координаты клетки на текущей карте, не пиксели окна. Z и номер карты не принимаются. Выберите существующую точку своей карты; команда не проверяет проходимость, не прокладывает маршрут и не следует за движущейся целью.
void — значения нет; команда не возвращает успех движения или bool. Изменяется только локальный маркер.
- Серверные и локальная стрелки хранятся отдельно. Track(0) не удаляет серверную стрелку. Без графики маркер сохраняется и появляется при открытии окна. Закрытие игрового окна не удаляет маркеры; разрыв соединения очищает их. Сервер может переместить или убрать свою стрелку. Координаты не доказывают, что цель достижима.
- Координаты клетки на текущей карте, не пиксели окна. Z и номер карты не принимаются. Выберите существующую точку своей карты; команда не проверяет проходимость, не прокладывает маршрут и не следует за движущейся целью.
- 0 — убрать локальную стрелку; любое другое целое — показать. UO.Track() и UO.Track(1) ставят её в текущих X/Y персонажа. UO.Track(1, x, y) ставит её в указанной точке; UO.Track(0, x, y) игнорирует координаты. Двухпараметровая форма не входит в зарегистрированный API.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.Track");
UO.Track();Параметры и ход выполнения:
- UO.Track() запоминает текущую точку: после ухода стрелка показывает назад. Точка не обновляется автоматически вслед за персонажем.
UO.Track();Параметры и ход выполнения:
- Показывается локальная стрелка к 1450,1690 на текущей карте. Если вы уже в пределах одной клетки, Track(0) убирает её. Подставьте свои координаты.
return RunScenario();
object? RunScenario()
{
var x = 1450;
var y = 1690;
UO.Track(1, x, y);
if (Truth(UO.GetDistance(x, y) <= 1))
{
UO.Track(0);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметры и ход выполнения:
- Функция MarkIfDistant использует те же X/Y и distance: если цель дальше двух клеток, ставит стрелку, иначе убирает. Функция целиком приведена ниже; движения или ожидания достижения здесь нет.
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()
{
MarkIfDistant(1450, 1690);
return null;
}
void MarkIfDistant(dynamic x, dynamic y)
{
if (Truth(UO.GetDistance(x, y) > 2))
{
UO.Track(1, x, y);
}
else
{
UO.Track(0);
}
}
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.Track. -
InjectionScript.Runtime.InjectionApiUO.Track:Track(1, GetX(), GetY()). -
InjectionScript.Runtime.InjectionApiUO.GetX:GetX(). -
InjectionScript.Runtime.InjectionApiUO.GetY:GetY().
Внутренний код реализации, не самостоятельный скрипт.
public void Track() => Track(1, GetX(), GetY());Параметры: flag (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Track. -
InjectionScript.Runtime.InjectionApiUO.Track:Track(NumberConversions.ToInt(flag), GetX(), GetY()). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(flag). -
InjectionScript.Runtime.InjectionApiUO.GetX:GetX(). -
InjectionScript.Runtime.InjectionApiUO.GetY:GetY().
Внутренний код реализации, не самостоятельный скрипт.
public void Track(InjectionValue flag) => Track(NumberConversions.ToInt(flag), GetX(), GetY());Параметры: flagRaw (Any), x (Any), y (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Track. -
InjectionScript.Runtime.InjectionApiUO.Track:Track(NumberConversions.ToInt(flagRaw), NumberConversions.ToInt(x), NumberConversions.ToInt(y)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(flagRaw).
Внутренний код реализации, не самостоятельный скрипт.
public void Track(InjectionValue flagRaw, InjectionValue x, InjectionValue y)
=> Track(NumberConversions.ToInt(flagRaw), NumberConversions.ToInt(x), NumberConversions.ToInt(y));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.UseSkill(object? skillName);Просит сервер применить навык по названию. Ровно один параметр: skillName. UO.UseSkill("Hiding") пытается скрыть собственного персонажа. Если навыку нужна цель, выберите её игровым прицелом или заранее отдельной командой WaitTargetObject.
-
skillName— Обязательная строка — точное английское имя навыка, например "Hiding", "Anatomy" или "Meditation". Регистр не важен; пробелы и подчёркивания автоматически не исправляются. Номер навыка, serial, self, расстояние, notoriety, maxZ и ожидание сюда не передаются. Все имена.
int: 1/true — клиент принял запрос; 0/false — неизвестное имя либо локальный отказ. Это не успешный результат навыка, рост навыка или признак скрытности. Для скрытности читайте Hidden(). Можно писать if UO.UseSkill("Hiding") { ... } либо сравнивать с 1/true. Отсутствующий или лишний аргумент — ошибка вызова.
- Единственная форма: UO.UseSkill(skillName). Второго и последующих параметров нет. Поиск, цель и ожидание выполняются другими командами.
- Hiding и Meditation не требуют выбора другого объекта. Не готовьте для них WaitTargetObject: оставшаяся очередь может ответить следующему постороннему прицелу.
- Anatomy использует прицел. Вызовите UseSkill("Anatomy") и выберите персонажа мышкой. Для автоматического ответа сначала выполните WaitTargetObject, затем UseSkill: так не пропустите быстрый ответ сервера.
- UseSkill не создаёт и не очищает очередь target. Если вы подготовили ответ, очистите его CancelWaitTarget при отказе/тайм-ауте. Другие сценарии с прицелом одновременно не запускайте.
- Poisoning, Provocation и другие многошаговые навыки требуют отдельной обработки дополнительных целей/инструментов. Один заранее выбранный объект не завершает любой навык.
- Название в словаре не гарантирует применение без инструмента. Для добычи нужен инструмент; заклинания вызываются Cast. Правила и успешность определяет сервер.
- Принятый запрос обновляет TicksSkill. Команда не ждёт скрытность, эффект, повышение навыка или расходование очереди.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.UseSkill("Hiding");
UO.Print("UseSkill: " + Convert.ToString(result));Параметры и ход выполнения:
- Hiding — единственный аргумент. UO.Wait(1000) даёт время для ответа; Hidden читает полученный флаг. Возврат 1 у UseSkill ещё не означает, что вы скрылись.
if (!(Truth(UO.Connected())) || Truth(UO.Dead()) || Truth(UO.Hidden()))
{
return null;
}
if (!(Truth(UO.UseSkill("Hiding"))))
{
UO.Print("Hiding request rejected");
return null;
}
await Delay(1000);
if (Truth(UO.Hidden()))
{
UO.Print("Character is hidden");
}
else
{
UO.Print("Not hidden yet; check the game journal");
}
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;Параметры и ход выполнения:
- Anatomy — единственный параметр UseSkill; mobile относится к WaitTargetObject. ASC переводит hex-строку GetSerial в число для проверки диапазона. 1500 — миллисекунды ожидания в примере. Finally убирает оставшуюся очередь; результат Anatomy смотрите в игре.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var mobile = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(mobile <= 0) || Truth(mobile >= 0x40000000) || !(Truth(UO.Exists(mobile))))
{
return null;
}
UO.CancelWaitTarget();
try
{
UO.WaitTargetObject(mobile);
if (Truth(UO.UseSkill("Anatomy")))
{
await Delay(1500);
}
}
finally
{
UO.CancelWaitTarget();
}
return null;
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
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;Параметры и ход выполнения:
- Meditation вызывается без цели. before хранит прежнюю ману, 2000 — период наблюдения. Рост маны может иметь другие причины; это не доказательство медитации и не обещание фиксированной скорости восстановления.
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()
{
if (!(Truth(UO.Connected())) || Truth(UO.Dead()))
{
return null;
}
var before = UO.Mana();
if (!(Truth(UO.UseSkill("Meditation"))))
{
UO.Print("Meditation request rejected");
return null;
}
await Delay(2000);
if (Truth(UO.Mana() > before))
{
UO.Print("Mana increased");
}
else
{
UO.Print("No mana increase observed yet");
}
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.
Параметры: skillName (String)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.UseSkill. -
InjectionScript.Runtime.InjectionApiUO.UseSkillCore:UseSkillCore(skillName).
Внутренний код реализации, не самостоятельный скрипт.
public int UseSkill(string skillName)
{
return UseSkillCore(skillName) ? 1 : 0;
}