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

Примеры по теме

В каждой карточке команды есть несколько самостоятельных сценариев: прямой код, функции и классы. Ниже приведены отдельные короткие сценарии; ограничения и полный разбор находятся в карточках.

UO.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;

UO.GetSkillValue

Параметры, результат и все сценарии

var selector = "Mining";
var value = UO.GetSkillValue(selector);
UO.Print(Convert.ToString(value));

Полное описание команд


UO.GetSkillCap

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

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 — числовые номера и режимы. Непреобразуемый аргумент может завершить вызов ошибкой преобразования.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.GetSkillCap("Mining");
UO.Print("GetSkillCap: " + Convert.ToString(result));

1. Прочитать и вывести — прямой скрипт

Параметры и ход выполнения:

  • В примере явно заданы selector и, при записи, mode. Первая строка выбирает навык по имени или характеристику по номеру. Print только выводит результат.
var selector = "Mining";
var value = UO.GetSkillCap(selector);
UO.Print(Convert.ToString(value));

2. Применить в условии или сравнении — функция сценария

Параметры и ход выполнения:

  • Порог 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;

3. Полная вспомогательная функция — класс сценария

Параметры и ход выполнения:

  • Весь код помощника приведён ниже Main. selector выбирает навык/характеристику, mode задаёт режим записи. ReadValue/ReadMode возвращают исходное число; ApplyMode проверяет аргументы, выполняет действие и не возвращает значение. UO.Wait(1000) в примере чтения разделяет два снимка.

Skills / Навыки

Skills / Навыки

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.

UO.GetSkillCap(skillName) — UO.GetSkillCap(Any)

Параметры: skillName (Any)

Результат: double / Decimal.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "getskillcap": return new InjectionValue(bridge.GetSkillValue(Text(0), false, true));

UO.GetSkillCurrentValue

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

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 — числовые номера и режимы. Непреобразуемый аргумент может завершить вызов ошибкой преобразования.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.GetSkillCurrentValue("Mining");
UO.Print("GetSkillCurrentValue: " + Convert.ToString(result));

1. Прочитать и вывести — прямой скрипт

Параметры и ход выполнения:

  • В примере явно заданы selector и, при записи, mode. Первая строка выбирает навык по имени или характеристику по номеру. Print только выводит результат.
var selector = "Mining";
var value = UO.GetSkillCurrentValue(selector);
UO.Print(Convert.ToString(value));

2. Применить в условии или сравнении — функция сценария

Параметры и ход выполнения:

  • Порог 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;

3. Полная вспомогательная функция — класс сценария

Параметры и ход выполнения:

  • Весь код помощника приведён ниже Main. selector выбирает навык/характеристику, mode задаёт режим записи. ReadValue/ReadMode возвращают исходное число; ApplyMode проверяет аргументы, выполняет действие и не возвращает значение. UO.Wait(1000) в примере чтения разделяет два снимка.

Skills / Навыки

Skills / Навыки

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.

UO.GetSkillCurrentValue(skillName) — UO.GetSkillCurrentValue(Any)

Параметры: skillName (Any)

Результат: double / Decimal.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "getskillcurrentvalue": return new InjectionValue(bridge.GetSkillValue(Text(0), true, false));

UO.GetSkillLockState

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

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 — числовые номера и режимы. Непреобразуемый аргумент может завершить вызов ошибкой преобразования.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.GetSkillLockState("Mining");
UO.Print("GetSkillLockState: " + Convert.ToString(result));

1. Прочитать и вывести — прямой скрипт

Параметры и ход выполнения:

  • В примере явно заданы selector и, при записи, mode. Первая строка выбирает навык по имени или характеристику по номеру. Print только выводит результат.
var selector = "Mining";
var mode = UO.GetSkillLockState(selector);
UO.Print(Convert.ToString(mode));

2. Применить в условии или сравнении — функция сценария

Параметры и ход выполнения:

  • Порог 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;

3. Полная вспомогательная функция — класс сценария

Параметры и ход выполнения:

  • Весь код помощника приведён ниже Main. selector выбирает навык/характеристику, mode задаёт режим записи. ReadValue/ReadMode возвращают исходное число; ApplyMode проверяет аргументы, выполняет действие и не возвращает значение. UO.Wait(1000) в примере чтения разделяет два снимка.

Skills / Навыки

Skills / Навыки

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.

UO.GetSkillLockState(skillName) — UO.GetSkillLockState(Any)

Параметры: skillName (Any)

Результат: int / Integer.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "getskilllockstate": return new InjectionValue(bridge.GetSkillLockState(Text(0)));

UO.GetSkillValue

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

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 — числовые номера и режимы. Непреобразуемый аргумент может завершить вызов ошибкой преобразования.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.GetSkillValue("Mining");
UO.Print("GetSkillValue: " + Convert.ToString(result));

1. Прочитать и вывести — прямой скрипт

Параметры и ход выполнения:

  • В примере явно заданы selector и, при записи, mode. Первая строка выбирает навык по имени или характеристику по номеру. Print только выводит результат.
var selector = "Mining";
var value = UO.GetSkillValue(selector);
UO.Print(Convert.ToString(value));

2. Применить в условии или сравнении — функция сценария

Параметры и ход выполнения:

  • Порог 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;

3. Полная вспомогательная функция — класс сценария

Параметры и ход выполнения:

  • Весь код помощника приведён ниже Main. selector выбирает навык/характеристику, mode задаёт режим записи. ReadValue/ReadMode возвращают исходное число; ApplyMode проверяет аргументы, выполняет действие и не возвращает значение. UO.Wait(1000) в примере чтения разделяет два снимка.

Skills / Навыки

Skills / Навыки

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.

UO.GetSkillValue(skillName) — UO.GetSkillValue(Any)

Параметры: skillName (Any)

Результат: double / Decimal.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "getskillvalue": return new InjectionValue(bridge.GetSkillValue(Text(0), false, false));

UO.SetSkillLockState

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

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 — числовые номера и режимы. Непреобразуемый аргумент может завершить вызов ошибкой преобразования.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.SetSkillLockState");
UO.SetSkillLockState("Mining", 2);

1. Прочитать и вывести — прямой скрипт

Параметры и ход выполнения:

  • В примере явно заданы selector и, при записи, mode. Первая строка выбирает навык по имени или характеристику по номеру. Print только выводит результат.
var selector = "Mining";
var mode = 2;
UO.SetSkillLockState(selector, mode);
UO.Print(Convert.ToString(UO.GetSkillLockState(selector)));

2. Применить в условии или сравнении — функция сценария

Параметры и ход выполнения:

  • Порог 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;

3. Полная вспомогательная функция — класс сценария

Параметры и ход выполнения:

  • Весь код помощника приведён ниже Main. selector выбирает навык/характеристику, mode задаёт режим записи. ReadValue/ReadMode возвращают исходное число; ApplyMode проверяет аргументы, выполняет действие и не возвращает значение. UO.Wait(1000) в примере чтения разделяет два снимка.

Skills / Навыки

Skills / Навыки

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.

UO.SetSkillLockState(skillName, skillState) — UO.SetSkillLockState(Any,Any)

Параметры: skillName (Any), skillState (Any)

Результат: void / Unit.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "setskilllockstate":

                case "skilllockstate": bridge.SetSkillLockState(Text(0), Arg(1)); return InjectionValue.Unit;

UO.SkillLockState

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

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 — числовые номера и режимы. Непреобразуемый аргумент может завершить вызов ошибкой преобразования.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.SkillLockState");
UO.SkillLockState("Mining", 2);

1. Прочитать и вывести — прямой скрипт

Параметры и ход выполнения:

  • В примере явно заданы selector и, при записи, mode. Первая строка выбирает навык по имени или характеристику по номеру. Print только выводит результат.
var selector = "Mining";
var mode = 2;
UO.SkillLockState(selector, mode);
UO.Print(Convert.ToString(UO.GetSkillLockState(selector)));

2. Применить в условии или сравнении — функция сценария

Параметры и ход выполнения:

  • Порог 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;

3. Полная вспомогательная функция — класс сценария

Параметры и ход выполнения:

  • Весь код помощника приведён ниже 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.

UO.SkillLockState(skillName, skillState) — UO.SkillLockState(Any,Any)

Параметры: skillName (Any), skillState (Any)

Результат: void / Unit.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "setskilllockstate":

                case "skilllockstate": bridge.SetSkillLockState(Text(0), Arg(1)); return InjectionValue.Unit;

UO.SkillVal

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

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 и имеют другой масштаб.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.SkillVal("Mining");
UO.Print("SkillVal: " + Convert.ToString(result));

1. Прямой вызов — прямой скрипт

Параметры и ход выполнения:

  • Читает legacy-значение навыкa или его режим/прирост.
UO.Print(UO.SkillVal("Mining"));
UO.Print(UO.SkillVal("Mining", 1));

2. Явный вариант — функция сценария

Параметры и ход выполнения:

  • Перед выбором 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;
}

3. Полная вспомогательная функция — класс сценария

Параметры и ход выполнения:

  • Некорректный variant выводит сообщение и даёт 0, но baseline уже мог быть создан. Значения GetSkillValue/GetSkillCurrentValue измеряются очками double и имеют другой масштаб.

Skills / Навыки

Skills / Навыки

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.

UO.SkillVal(skillName) — UO.SkillVal(String)

Параметры: skillName (String)

Результат: int / Integer.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public int SkillVal(string skillName) => SkillVal(skillName, 0);

UO.SkillVal(skill, variant) — UO.SkillVal(Any,Any)

Параметры: skill (Any), variant (Any)

Результат: int / Integer.

При вызове:

Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.

Внутренний код реализации, не самостоятельный скрипт.

values => new InjectionValue(SkillVal(values[0].ToString(), NumberConversions.ToInt(values[1])))

UO.Snoop

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

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 посылает запрос на игровом потоке. Действуют правила сервера; встроенного ожидания подтверждения нет.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.Snoop");
UO.Snoop();

1. Прямой вызов — прямой скрипт

Параметры и ход выполнения:

  • Использует контейнер/объект, обычно запрашивая его открытие.
UO.Snoop();

2. Явный вариант — функция сценария

Параметры и ход выполнения:

  • 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;

3. Полная вспомогательная функция — класс сценария

Параметры и ход выполнения:

  • 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.

UO.Snoop() — UO.Snoop()

Параметры: Параметров нет.

Результат: void / Unit.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "snoop": bridge.UseObject(Arg(0, bridge.LastTarget)); break;

UO.Snoop(container) — UO.Snoop(Any)

Параметры: container (Any)

Результат: void / Unit.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

case "snoop": bridge.UseObject(Arg(0, bridge.LastTarget)); break;

UO.StealthCnt

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

int UO.StealthCnt();

Читает локальный счётчик смещения персонажа в скрытности.

Параметры

Параметров нет.

Возвращает

int — накопленная сумма max(abs(deltaX),abs(deltaY)) между вызовами при IsHidden. Это не гарантированное число серверных stealth-шагов и не оставшийся лимит.

Поведение

  • Без Player или когда Player не скрыт, сбрасывает count=0 и сохраняет текущие X/Y (либо -1). При скрытности сравнивает с предыдущими сохранёнными X/Y, прибавляет смещение и обновляет координаты.
  • Счётчик изменяется при чтении. Перемещение туда и обратно между вызовами может быть пропущено; смена Z без X/Y не увеличивает счётчик.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.StealthCnt();
UO.Print("StealthCnt: " + Convert.ToString(result));

1. Прямой вызов — прямой скрипт

Параметры и ход выполнения:

  • Читает локальный счётчик смещения персонажа в скрытности.
UO.Print(UO.StealthCnt());

2. Явный вариант — функция сценария

Параметры и ход выполнения:

  • Без 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;
}

3. Полная вспомогательная функция — класс сценария

Параметры и ход выполнения:

  • Счётчик изменяется при чтении. Перемещение туда и обратно между вызовами может быть пропущено; смена 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.

UO.StealthCnt() — UO.StealthCnt()

Параметры: Параметров нет.

Результат: int / Integer.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public int StealthCnt() => bridge.StealthCnt();

UO.TicksSkill

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

int UO.TicksSkill();

Читает сохранённую отметку TicksSkill.

Параметры

Параметров нет.

Возвращает

int — отметка UO.Timer в десятых долях секунды от старта runtime. 0 — отметка ещё не установлена либо событие было в первую десятую секунды; это не миллисекунды и не календарное время.

Поведение

  • Возвращает поле ticksSkill. Его обновляет успешно принятый UseSkill/UseSkillAtTarget; это не автоматическое наблюдение всех ручных/серверных действий. Сама команда отметку не меняет.
  • UO.Timer() - отметка вычисляет возраст в десятых секунды. Между разными runtime отметки не сравниваются.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.TicksSkill();
UO.Print("TicksSkill: " + Convert.ToString(result));

1. Прямой вызов — прямой скрипт

Параметры и ход выполнения:

  • Читает сохранённую отметку TicksSkill.
var stamp = UO.TicksSkill();
UO.Print(stamp);

2. Явный вариант — функция сценария

Параметры и ход выполнения:

  • Возвращает поле ticksSkill. Его обновляет успешно принятый UseSkill/UseSkillAtTarget; это не автоматическое наблюдение всех ручных/серверных действий. Сама команда отметку не меняет.
return  RunScenario();
 object? RunScenario()
{
    var stamp = UO.TicksSkill();
    var ageTenths = UO.Timer() - stamp;
    UO.Print(ageTenths);
    return null;
}

3. Полная вспомогательная функция — класс сценария

Параметры и ход выполнения:

  • UO.Timer() - отметка вычисляет возраст в десятых секунды. Между разными runtime отметки не сравниваются.

Skills / Навыки

Skills / Навыки

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.

UO.TicksSkill() — UO.TicksSkill()

Параметры: Параметров нет.

Результат: int / Integer.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public int TicksSkill() => ticksSkill;

UO.Track

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

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.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.

UO.Print("Calling UO.Track");
UO.Track();

1. Прямое применение — прямой скрипт

Параметры и ход выполнения:

  • UO.Track() запоминает текущую точку: после ухода стрелка показывает назад. Точка не обновляется автоматически вслед за персонажем.
UO.Track();

2. Игровое условие — функция сценария

Параметры и ход выполнения:

  • Показывается локальная стрелка к 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;

3. Полная вспомогательная функция — класс сценария

Параметры и ход выполнения:

  • Функция 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.

UO.Track() — UO.Track()

Параметры: Параметров нет.

Результат: void / Unit.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public void Track() => Track(1, GetX(), GetY());

UO.Track(flag) — UO.Track(Any)

Параметры: flag (Any)

Результат: void / Unit.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public void Track(InjectionValue flag) => Track(NumberConversions.ToInt(flag), GetX(), GetY());

UO.Track(flagRaw, x, y) — UO.Track(Any,Any,Any)

Параметры: flagRaw (Any), x (Any), y (Any)

Результат: void / Unit.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public void Track(InjectionValue flagRaw, InjectionValue x, InjectionValue y)

            => Track(NumberConversions.ToInt(flagRaw), NumberConversions.ToInt(x), NumberConversions.ToInt(y));

UO.UseSkill

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатуры

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. Команда не ждёт скрытность, эффект, повышение навыка или расходование очереди.

Самостоятельные C#-скрипты

Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.

Простой пример

Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.

Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.

var result = UO.UseSkill("Hiding");
UO.Print("UseSkill: " + Convert.ToString(result));

1. Скрыться через Hiding — прямой скрипт

Параметры и ход выполнения:

  • 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;

2. Anatomy с отдельно подготовленной целью — функция сценария

Параметры и ход выполнения:

  • 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;

3. Meditation и наблюдение за маной — класс сценария

Параметры и ход выполнения:

  • Meditation вызывается без цели. before хранит прежнюю ману, 2000 — период наблюдения. Рост маны может иметь другие причины; это не доказательство медитации и не обещание фиксированной скорости восстановления.

Skills / Навыки

Skills / Навыки

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.

UO.UseSkill(skillName) — UO.UseSkill(String)

Параметры: skillName (String)

Результат: int / Integer.

При вызове:

Внутренний код реализации, не самостоятельный скрипт.

public int UseSkill(string skillName)

        {

            return UseSkillCore(skillName) ? 1 : 0;

        }
⚠️ **GitHub.com Fallback** ⚠️