RU UO Topic character Part 3 - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

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

Характер — 3

Главная · C# · IDE · UO API · A–Z · Примеры · Языки

Части справочника

1 · 2 · 3 · 4 · 5

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


UO.GetSex

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

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

int UO.GetSex();

Читает код пола и расы из модели клиента.

Параметры

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

Возвращает

int — совместимый код: 0=human male, 1=human female, 2=elf male, 3=elf female, 4=gargoyle male, 5=gargoyle female. Без персонажа также 0, поэтому для наличия проверяйте Exists(self). Это не простой bool female.

Поведение

  • Читаются уже полученные локальные данные. Запрос не открывает status и не заставляет сервер прислать обновление. После смерти, перехода карты или удаления объекта значения могут измениться между двумя вызовами.
  • C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

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

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

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

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

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

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

1. Вывести текущее значение своего персонажа — прямой скрипт

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

  • Вызов без аргументов относится к self. Код пола и расы сохраняется в value.
  • Convert.ToString преобразует число для вывода и не меняет смысл результата.
var value = UO.GetSex();
UO.Print("GetSex: " + Convert.ToString(value));

2. Использовать значение в прикладной проверке — функция сценария

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

  • Значение читается один раз без аргументов. Код пола и расы используется в показанном расчёте или условии.
  • Числовые пороги — пример условий скрипта, а не новые пределы клиента. Поле сохраняет серверные единицы и ограничения, описанные выше.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetSex();
    if (Truth(value == 4) || Truth(value == 5))
    {
        UO.Print("Gargoyle sex/race code");
    }

    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. Наблюдать изменение за одну секунду — класс сценария

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

  • Оба вызова без аргумента читают своё текущее значение. 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 = UO.GetSex();
        await Delay(1000);
        var after = UO.GetSex();
        if (Truth(before != after))
        {
            UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        }

        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.GetSex() — UO.GetSex()

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

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

При вызове:

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

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

() => bridge.Sex

Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.


UO.GetStam

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

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

int UO.GetStam();
dynamic UO.GetStam(object? objID);

Читает текущую выносливость из локальной модели.

Параметры

  • objID — Необязательный объект в показанных формах: serial числом/hex-строкой, self, lasttarget или зарегистрированное имя AddObject. Это не type. Без аргумента читается self. Неизвестный текст в некоторых формах вызывает ошибку преобразования; проверяйте имя перед вызовом.

Возвращает

int — значение поля Stamina, не процент и не bool. 0 бывает настоящим значением или признаком отсутствующих данных. Нулевой максимум нельзя использовать как делитель. У чужого mobile значения могут быть неизвестны. HP/HitsMax могут содержать относительную шкалу сервера вместо точных очков. HP=0 не доказывает смерть; для этого есть Dead/IsDead.

Поведение

  • Команда не открывает status и не запрашивает обновление сервера. Клиент только читает уже загруженные данные. Не меняет характеристики и не отправляет пакеты.
  • Результат — отдельное чтение. Мир может измениться между Exists и следующим вызовом; несколько запросов не образуют атомарный снимок.
  • При чтении объекта World.Get отвергает отсутствующий или IsDestroyed и получается 0. HP/HitsMax читаются у Entity, включая предметы с этими полями; Mana/Stamina — только у Mobile. Без аргумента читается self. Одноимённый вариант без параметров не обязательно имеет вариант с ID: смотрите сигнатуры.
  • Чтение без аргументов тоже возвращает 0 для отсутствующего или уничтоженного Player. Это относится и к прямым Mana/Stamina и их максимумам, а не только к формам через World.Get. Присутствующий мёртвый персонаж может сохранять значения.

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

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

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

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

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

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

1. Вывести значение своего персонажа — прямой скрипт

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

  • Вызов без аргументов читает self. value сохраняет одно число, Convert.ToString преобразует его только для сообщения.
var value = UO.GetStam();
UO.Print("GetStam: " + Convert.ToString(value));

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

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

  • Показан прикладной порог или расчёт для этого поля. Числа в условии — настройки примера, не пределы сервера. Перед делением на максимум проверяется его положительность.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetStam();
    if (Truth(value < 15))
    {
        UO.Print("Known stamina is below the movement threshold of 15");
    }

    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. Полная вспомогательная функция ReadValue — класс сценария

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

  • lasttarget — ранее выбранный объект; Exists проверяет наличие. obj — единственный параметр ReadValue. Функция возвращает число команды без изменений и приведена целиком.
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.Exists("lasttarget")))
        {
            var value = ReadValue("lasttarget");
            UO.Print("Selected value: " + Convert.ToString(value));
        }

        return null;
    }

    dynamic ReadValue(dynamic obj)
    {
        return UO.GetStam(obj);
    }

    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.GetStam() — UO.GetStam()

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

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

При вызове:

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

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

() => bridge.Stamina

Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.

UO.GetStam(objID) — UO.GetStam(Any)

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

Результат: dynamic / Any.

При вызове:

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

case "getstam": return new InjectionValue(arguments.Length > 0 ? bridge.GetStamina(Arg(0)) : bridge.Stamina);

UO.GetStamina

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

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

int UO.GetStamina();

Читает текущую выносливость из локальной модели.

Параметры

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

Возвращает

int — значение поля Stamina, не процент и не bool. 0 бывает настоящим значением или признаком отсутствующих данных. Нулевой максимум нельзя использовать как делитель. У чужого mobile значения могут быть неизвестны. HP/HitsMax могут содержать относительную шкалу сервера вместо точных очков. HP=0 не доказывает смерть; для этого есть Dead/IsDead.

Поведение

  • Команда не открывает status и не запрашивает обновление сервера. Клиент только читает уже загруженные данные. Не меняет характеристики и не отправляет пакеты.
  • Результат — отдельное чтение. Мир может измениться между Exists и следующим вызовом; несколько запросов не образуют атомарный снимок.
  • При чтении объекта World.Get отвергает отсутствующий или IsDestroyed и получается 0. HP/HitsMax читаются у Entity, включая предметы с этими полями; Mana/Stamina — только у Mobile. Без аргумента читается self. Одноимённый вариант без параметров не обязательно имеет вариант с ID: смотрите сигнатуры.
  • Чтение без аргументов тоже возвращает 0 для отсутствующего или уничтоженного Player. Это относится и к прямым Mana/Stamina и их максимумам, а не только к формам через World.Get. Присутствующий мёртвый персонаж может сохранять значения.

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

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

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

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

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

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

1. Вывести значение своего персонажа — прямой скрипт

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

  • Вызов без аргументов читает self. value сохраняет одно число, Convert.ToString преобразует его только для сообщения.
var value = UO.GetStamina();
UO.Print("GetStamina: " + Convert.ToString(value));

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

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

  • Показан прикладной порог или расчёт для этого поля. Числа в условии — настройки примера, не пределы сервера. Перед делением на максимум проверяется его положительность.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetStamina();
    if (Truth(value < 15))
    {
        UO.Print("Known stamina is below the movement threshold of 15");
    }

    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. Полная вспомогательная функция ReadValue — класс сценария

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

  • У этого имени нет формы с ID. ReadValue без параметров читает self; два вызова разделены 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();
        await Delay(1000);
        var after = ReadValue();
        UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        return null;
    }

    dynamic ReadValue()
    {
        return UO.GetStamina();
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}

Реализация команды

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.GetStamina() — UO.GetStamina()

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

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

При вызове:

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

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

() => bridge.Stamina

Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.


UO.GetStatLockState

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

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

int UO.GetStatLockState(object? statNum);

Читает локальный режим изменения характеристики.

Параметры

  • statNum — Обязательный номер характеристики: 0 — STR, 1 — DEX, 2 — INT. Это не её текущее значение и не название строкой.

Возвращает

int: 0 — повышение, 1 — понижение, 2 — блокировка. Это код режима, не true/false. Для номера вне 0..2 возвращается −1. Если персонаж отсутствует, допустимый номер возвращает 0 по умолчанию; это не подтверждение состояния сервера.

Поведение

  • Чтение выполняется через Invoke на игровом потоке по уже полученным данным; сетевые пакеты не отправляются. Навык не используется и не тренируется. Два запроса — два отдельных снимка.
  • Обязательный номер характеристики: 0 — STR, 1 — DEX, 2 — INT. Это не её текущее значение и не название строкой.
  • ExecuteClientApiCompatibility выбирает ветку команды. Text читает селектор навыка, Arg — числовые номера и режимы. Непреобразуемый аргумент может завершить вызов ошибкой преобразования.

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

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

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

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

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

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

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

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

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

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

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

  • Порог 95.1 и режимы 0/1/2 заданы для примера. −1 проверяется до изменения режима. После записи читается только локальная копия; это не ожидание ответа сервера.
return  RunScenario();
 object? RunScenario()
{
    var mode = UO.GetStatLockState(0);
    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) в примере чтения разделяет два снимка.
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(0);
        await Delay(1000);
        var after = ReadMode(0);
        UO.Print(Convert.ToString(before) + " -> " + Convert.ToString(after));
        return null;
    }

    dynamic ReadMode(dynamic selector)
    {
        return UO.GetStatLockState(selector);
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}

Реализация команды

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.GetStatLockState(statNum) — UO.GetStatLockState(Any)

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

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

При вызове:

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

case "getstatlockstate": return new InjectionValue(bridge.GetStatLockState(Arg(0)));

UO.GetStatus

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

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

void UO.GetStatus(object? id);

Отправляет серверный запрос статуса указанного mobile.

Параметры

  • id — Serial объекта или поддерживаемое имя self/backpack/lasttarget/сохранённого объекта; числовые строки и 0x-строки разрешаются runtime.

Возвращает

void — возвращаемого значения нет.

Поведение

  • string-форма разрешает имя через GetObject; int-форма передаёт serial прямо. Bridge вызывает GameActions.RequestMobileStatus(world,serial,true). Команда не возвращает данные и не ждёт ответа. Читайте GetHP/GetMaxHP и другие getters отдельно после обновления мира.

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

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

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

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

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

UO.Print("Calling UO.GetStatus");
UO.GetStatus("self");

1. Запрос статуса себя — прямой скрипт

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

  • Отправляется запрос статуса, без ожидания ответа.
UO.GetStatus("self");

2. Запрос по serial — функция сценария

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

  • int-форма направляет тот же запрос.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.Self();
    UO.GetStatus(id);
    return null;
}

3. Чтение после паузы — класс сценария

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

  • Пауза не гарантирует новый ответ; getters возвращают текущую локальную модель.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        UO.GetStatus("self");
        await Delay(500);
        UO.Print(Convert.ToString(UO.GetHP()) + "/" + Convert.ToString(UO.GetMaxHP()));
        return null;
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}

Реализация команды

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.GetStatus(id) — UO.GetStatus(Integer)

Параметры: id (Integer/String)

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

При вызове:

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

public void GetStatus(int id) => bridge.GetStatus(id);

UO.GetStatus(id) — UO.GetStatus(String)

Параметры: id (Integer/String)

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

При вызове:

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

public void GetStatus(string id) => GetStatus(GetObject(id));

UO.GetStr

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

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

int UO.GetStr();
int UO.GetStr(object? objID);

Читает текущую силу (Strength, Str) персонажа.

Параметры

  • objID — ObjID только в показанной форме с одним аргументом: serial персонажа числом, десятичной/0x hex-строкой, "self", "lasttarget" или именем AddObject. Выбирает объект, не graphic/type. Без аргумента читается текущий персонаж.

Возвращает

int — текущие очки характеристики, 0..65535 в модели клиента; не процент, ID, навык, режим блокировки или bool. 0 также означает отсутствие/удаление персонажа или недоступный объект. Сравнивайте с числовым требованием, не == true. Это не предел характеристики и не гарантированное базовое значение без модификаторов.

Поведение

  • Поддерживаются () для self и (ObjID) для явного объекта. Других необязательных аргументов нет.
  • Читает Player.Strength, если Player существует и не уничтожен; иначе 0. Присутствующий мёртвый персонаж не является удалённым объектом. Характеристика не вычисляется из HP, маны или выносливости.
  • GetStr/GetInt/GetDex принимают ObjID. Данные PlayerMobile доступны только для self; для другого serial — 0, даже для загруженного mobile. Чужая характеристика не подставляется и не угадывается.
  • Invoke читает на игровом потоке с возможностью отменить ожидание скриптом. Не запрашивает status, не открывает target, не посылает пакет, не меняет характеристику и не добавляет задержку.
  • Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.
  • C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool. UO.Str(), UO.Strength(), UO.GetStr(), UO.GetStrength().
  • ExecuteClientApiCompatibility.Arg сначала разрешает имя объекта, затем преобразует число. Неизвестная нечисловая строка вызывает ошибку преобразования, не прицел. double приводится к int, Array/void — к 0. Для выбора персонажа используйте корректный serial, не такие преобразования.

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

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

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

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

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

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

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

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

  • value сохраняет числовой результат; Convert.ToString лишь форматирует его для журнала. Аргументов и действия персонажа нет.
var value = UO.GetStr();
UO.Print("Strength: " + Convert.ToString(value));

2. Сравнить два снимка — функция сценария

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

  • before и after разделяет 1000 мс; UO.Wait добавлен в пример. change=after-before бывает положительным, нулевым или отрицательным. Сам по себе он не различает все промежуточные обновления и выход из мира.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.GetStr();
    await Delay(1000);
    var after = UO.GetStr();
    var change = after - before;
    UO.Print("Change: " + Convert.ToString(change));
    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));

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

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

  • minimum=80 — пример требования, не предел клиента. AttributeAtLeast(minimum) отвергает отсутствующего персонажа, один раз читает характеристику и возвращает bool: true или false по условию >= minimum. Логическое значение даёт сравнение, не сама характеристика.
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(Truth(AttributeAtLeast(80)) == true))
        {
            UO.Print("Requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic AttributeAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.GetStr();
        return value >= minimum;
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

4. Выбрать персонажа по serial и имени объекта — прямой скрипт

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

  • id — результат UO.Self(), не type. AddObject сохраняет ID под именем statSubject без прицела, поскольку второй аргумент указан. Оба вызова выбирают одного персонажа, но чтения не атомарны.
var id = UO.Self();
if (Truth(id != 0))
{
    UO.AddObject("statSubject", id);
    var direct = UO.GetStr(id);
    var byName = UO.GetStr("statSubject");
    UO.Print("Direct: " + Convert.ToString(direct) + "; alias: " + Convert.ToString(byName));
}

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.GetStr() — UO.GetStr()

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

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

При вызове:

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

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

() => bridge.Strength

Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.

UO.GetStr(objID) — UO.GetStr(Any)

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

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

При вызове:

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

case "getstr": return new InjectionValue(arguments.Length > 0 ? bridge.GetStrength(Arg(0)) : bridge.Strength);

UO.GetStrength

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

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

int UO.GetStrength();

Читает текущую силу (Strength, Str) персонажа.

Параметры

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

Возвращает

int — текущие очки характеристики, 0..65535 в модели клиента; не процент, ID, навык, режим блокировки или bool. 0 также означает отсутствие/удаление персонажа или недоступный объект. Сравнивайте с числовым требованием, не == true. Это не предел характеристики и не гарантированное базовое значение без модификаторов.

Поведение

  • Команда не принимает аргументов. Используйте точные сигнатуры выше.
  • Читает Player.Strength, если Player существует и не уничтожен; иначе 0. Присутствующий мёртвый персонаж не является удалённым объектом. Характеристика не вычисляется из HP, маны или выносливости.
  • GetStr/GetInt/GetDex принимают ObjID. Данные PlayerMobile доступны только для self; для другого serial — 0, даже для загруженного mobile. Чужая характеристика не подставляется и не угадывается.
  • Invoke читает на игровом потоке с возможностью отменить ожидание скриптом. Не запрашивает status, не открывает target, не посылает пакет, не меняет характеристику и не добавляет задержку.
  • Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.
  • C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool. UO.Str(), UO.Strength(), UO.GetStr(), UO.GetStrength().

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

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

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

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

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

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

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

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

  • value сохраняет числовой результат; Convert.ToString лишь форматирует его для журнала. Аргументов и действия персонажа нет.
var value = UO.GetStrength();
UO.Print("Strength: " + Convert.ToString(value));

2. Сравнить два снимка — функция сценария

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

  • before и after разделяет 1000 мс; UO.Wait добавлен в пример. change=after-before бывает положительным, нулевым или отрицательным. Сам по себе он не различает все промежуточные обновления и выход из мира.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.GetStrength();
    await Delay(1000);
    var after = UO.GetStrength();
    var change = after - before;
    UO.Print("Change: " + Convert.ToString(change));
    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));

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

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

  • minimum=80 — пример требования, не предел клиента. AttributeAtLeast(minimum) отвергает отсутствующего персонажа, один раз читает характеристику и возвращает bool: true или false по условию >= minimum. Логическое значение даёт сравнение, не сама характеристика.
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(Truth(AttributeAtLeast(80)) == true))
        {
            UO.Print("Requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic AttributeAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.GetStrength();
        return value >= minimum;
    }

    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.GetStrength() — UO.GetStrength()

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

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

При вызове:

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

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

() => bridge.Strength

Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.


UO.GetTitle

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

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

dynamic UO.GetTitle(object? objID);

Читает известный клиенту титул персонажа: например, профессию или подпись после имени.

Параметры

  • objID — Обязательный serial/ID объекта, не type и не cliloc. Допускается int, десятичная/hex-строка, self, backpack, lasttarget, finditem или имя AddObject. 0 означает отсутствие объекта.

Возвращает

string — текст поля Title у Mobile. Пустая строка, если титул неизвестен, объект не является персонажем или ID отсутствует. Это не serial, не полное имя и не массив свойств. GetAltName использует то же поле, что GetTitle.

Поведение

  • Сам вызов читает локальные данные, не ждёт сервер и не отправляет одиночный клик. Для запроса имени/титула используйте ClickOnObject отдельно; ответ приходит асинхронно.
  • Пустая строка допустима и у существующего персонажа. Проверка Exists отвечает на другой вопрос — загружен ли объект.
  • В этой реализации альтернативное имя сопоставлено полю Title персонажа.

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

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

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

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

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

object? result = UO.GetTitle("self");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Титул своего персонажа — прямой скрипт

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

  • ObjID=self — персонаж текущего клиента.
  • title содержит только титул; пустое поле не означает ошибку скрипта.
var title = UO.GetTitle("self");
UO.Print(title);

2. Проверить выбранного персонажа — функция сценария

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

  • ObjID=id — serial последней цели. GetName и титул читаются отдельно.
  • Цель-предмет не имеет поля Title и даст пустую строку.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(id)))
    {
        var title = UO.GetTitle(id);
        if (Truth(title != ""))
        {
            UO.Print(UO.GetName(id) + " " + title);
        }
    }

    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. Запросить имя перед чтением — класс сценария

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

  • 350 — пример паузы в миллисекундах после одиночного клика; это не параметр getter.
  • Сервер может ответить позже или не передать титул. Сохраняйте обработку пустой строки.
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.ClickOnObject(id);
            UO.Wait(350);
            UO.Print(UO.GetTitle(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.GetTitle(objID) — UO.GetTitle(Any)

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

Результат: dynamic / Any.

При вызове:

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

case "gettitle": return new InjectionValue(bridge.GetTitle(Arg(0, bridge.Self)));

UO.GetWeight

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

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

int UO.GetWeight();

Читает счётчик статуса своего персонажа: текущий вес в stones.

Параметры

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

Возвращает

int — текущий вес в stones, 0..65535 в модели клиента. 0 может быть реальным значением, отсутствием данных либо отсутствующим/уничтоженным Player. Это количество, не bool, ID или type: 1 означает одну единицу, а не успех. Команда не перебирает объекты и не возвращает массив.

Поведение

  • Команда не принимает аргументов. Используйте точные сигнатуры выше.
  • Чтение в игровом потоке берёт Player.Weight, если текущий Player существует и не уничтожен; иначе 0. Экипировка не перебирается, бонусы не пересчитываются, статус не запрашивается, ожидания обновления нет. Присутствующий призрак не равен уничтоженному Player.
  • Weight читает общий вес, сообщённый сервером, в stones. Какие веса тела, экипировки и вложенных сумок входят в сумму, определяют правила шарда. Команда не обходит контейнеры, не суммирует веса предметов и не обновляет закрытые сумки. Это не свойство Weight отдельного предмета и не число items.
  • CharacterStatus проверяет обязательное тело до обновления. Weight есть в собственном расширенном статусе, слоты — с type 3, Luck — с type 4, серверный WeightMax — с type 5. Компактный/старый пакет без необязательного счётчика оставляет его предыдущий кэш. Новый Player начинает с нулей; вызов не доказывает получение свежего статуса.
  • Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды. C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
  • Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.

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

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

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

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

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

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

1. Вывести сохранённый счётчик — прямой скрипт

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

  • value хранит один вызов без аргументов для собственного персонажа; Convert.ToString форматирует число для журнала, не меняя его смысл.
var value = UO.GetWeight();
UO.Print("Weight: " + Convert.ToString(value));

2. Наблюдать изменение — функция сценария

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

  • UO.Wait(500) разделяет before и after на 500 миллисекунд. difference может быть положительной, нулевой или отрицательной; промежуточные обновления и смена персонажа могут быть пропущены. Пауза относится к примеру.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.GetWeight();
    await Delay(500);
    var after = UO.GetWeight();
    var difference = after - before;
    UO.Print("Counter change: " + Convert.ToString(difference));
    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));

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

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

  • CanCarry(extra) получает дополнительный вес в stones; 10 — пример, не число стопок. Отвергает отрицательный extra, отсутствие Player или maximum <= 0, читает текущий вес и предел, затем возвращает bool: true либо false по extra <= maximum - current. Вычитание избегает переполнения current + extra. При перегрузе результат false даже для extra=0. Это локальная оценка, не разрешение сервера; чтения не атомарны, а нулевой вес может быть неизвестным.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (Truth(Truth(CanCarry(10)) == true))
        {
            UO.Print("Local check passed");
        }
        else
        {
            UO.Print("Local check failed or data unavailable");
        }

        return null;
    }

    dynamic CanCarry(dynamic extra)
    {
        if (Truth(extra < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.GetWeight();
        var maximum = UO.MaxWeight();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extra <= maximum - current;
    }

    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.GetWeight() — UO.GetWeight()

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

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

При вызове:

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

public int Weight() => bridge.Weight;

UO.GetYellowBar

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

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

int UO.GetYellowBar(object? id);

Проверяет флаг жёлтой полосы здоровья mobile.

Параметры

  • id — Обязательный serial/ID конкретного объекта: int, hex-строка либо алиас self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse или имя AddObject. Это не graphic/type. Неустановленное имя разрешается в 0; никакой новый target команда не открывает. Аргумент обязателен; для себя передайте self.

Возвращает

int 1 — загруженный mobile имеет признак IsYellowHits. int 0 — признак отсутствует, объект не является mobile, неизвестен или удалён. Это серверный/совместимый флаг, а не цвет темы IDE и не количество HP. Отсутствие флага не доказывает уязвимость: сервер может обозначать защиту иначе.

Результат команды — числовой флаг: 1 означает выполненное условие, 0 — невыполненное. После var result = команда(...) проверяйте if (result != 0) или if (result == 0). Сохраните результат одного вызова: повторный вызов может выполнить действие снова либо прочитать уже изменившееся состояние.

Поведение

  • Читается локальная модель клиента; запросов серверу, ожидания и перемещения нет.
  • Результат относится к моменту чтения. После UO.Wait или другого действия объект и его флаги могут измениться.
  • Это серверный/совместимый флаг, а не цвет темы IDE и не количество HP. Отсутствие флага не доказывает уязвимость: сервер может обозначать защиту иначе.

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

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

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

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

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

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

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

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

  • Аргумент self явно выбирает своего персонажа. state — только 1/0.
  • Это серверный/совместимый флаг, а не цвет темы IDE и не количество HP. Отсутствие флага не доказывает уязвимость: сервер может обозначать защиту иначе.
var state = UO.GetYellowBar("self");
var hp = UO.GetHP("self");
UO.Print("Yellow flag: " + Convert.ToString(state));
UO.Print("Known HP: " + Convert.ToString(hp));

2. Проверить выбранного mobile — функция сценария

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

  • IsNpc исключает предмет и неизвестный объект. target сохраняет один serial, а не живую ссылку на меняющийся lasttarget.
  • Результат относится к полю IsYellowHits. Данные обновляются только после получения соответствующего состояния клиентом.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.GetYellowBar(target);
        UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    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. Сравнить состояние до и после паузы — класс сценария

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

  • UO.Wait(500) — пауза в миллисекундах. После неё отдельно проверяется, что mobile ещё существует.
  • Сравниваются два снимка. Промежуточные изменения могут быть пропущены, и это не непрерывная подписка на серверные события.
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 target = UO.GetSerial("lasttarget");
        if (Truth(UO.IsNPC(target)))
        {
            var before = UO.GetYellowBar(target);
            await Delay(500);
            if (Truth(UO.IsNPC(target)))
            {
                var after = UO.GetYellowBar(target);
                if (Truth(before != after))
                {
                    UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
                }
            }
            else
            {
                UO.Print("Mobile left the local world");
            }
        }

        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.GetYellowBar(id) — UO.GetYellowBar(Any)

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

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

При вызове:

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

public int GetYellowBar(InjectionValue id) => bridge.GetYellowBar(GetObject(id));

UO.Gold

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

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

dynamic UO.Gold();

Читает количество золота из статуса текущего персонажа.

Параметры

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

Возвращает

int/double — неотрицательная сумма 0..4294967295. До 2147483647 включительно возвращается int, выше — double (Double), точно представляющий любое 32-битное беззнаковое целое. 0 также означает отсутствие текущего неудалённого Player или полученной суммы. Это не bool, ID, число стопок или обход рюкзака/банка.

Поведение

  • Параметров нет. Читает кэш Player.Gold из CharacterStatus (0x11). Сервер определяет, какое золото входит в его счётчик; команда не перебирает вложенные сумки и не запрашивает банковский баланс. Нет/уничтожен Player — 0; присутствующий призрак может сохранять сумму статуса.
  • ReadGoldValue один раз читает bridge.Gold. Старый C# bridge сохраняет сигнатуру Int32 и передаёт биты UInt32. unchecked-преобразование восстанавливает беззнаковую сумму; малая сумма оборачивается в int, большая — в double. Старший бит больше не превращает баланс в отрицательный. Преобразование локальное, пакетов нет.
  • Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.

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

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

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

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

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

object? result = UO.Gold();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Вывести полученную сумму — прямой скрипт

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

  • amount хранит один результат; Convert.ToString форматирует его для журнала. Золото не ищется, не переносится и не тратится.
var amount = UO.Gold();
UO.Print("Status gold: " + Convert.ToString(amount));

2. Полная функция CanAfford с большой ценой — функция сценария

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

  • price=3000000000.0 — пример цены, не предел. CanAfford(price) отвергает отрицательную цену или отсутствие Player, один раз читает сумму и возвращает bool: true либо false по условию amount >= price. Сама сумма не bool. Функция полностью определена ниже.
return  RunScenario();
 object? RunScenario()
{
    var price = 3000000000.0;
    if (Truth(Truth(CanAfford(price)) == true))
    {
        UO.Print("Local balance is sufficient");
    }
    else
    {
        UO.Print("Local check failed");
    }

    return null;
}

dynamic CanAfford(dynamic price)
{
    if (Truth(price < 0) || Truth(UO.Self() == 0))
    {
        return false;
    }

    var amount = UO.Gold();
    return amount >= price;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Наблюдать изменение баланса — класс сценария

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

  • before/after разделяет UO.Wait(500) миллисекунд. difference=after-before может быть отрицательной при уменьшении баланса; это не исправленное переполнение беззнакового счётчика. Промежуточные обновления и смена персонажа могут быть пропущены.
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 = UO.Gold();
        await Delay(500);
        var after = UO.Gold();
        var difference = after - before;
        UO.Print("Balance change: " + Convert.ToString(difference));
        return null;
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}

Реализация команды

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.Gold() — UO.Gold()

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

Результат: dynamic / Any.

При вызове:

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

case "gold": return ReadGoldValue();

UO.HP

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

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

int UO.HP();

Читает текущее здоровье из локальной модели.

Параметры

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

Возвращает

int — значение поля Hits, не процент и не bool. 0 бывает настоящим значением или признаком отсутствующих данных. Нулевой максимум нельзя использовать как делитель. У чужого mobile значения могут быть неизвестны. HP/HitsMax могут содержать относительную шкалу сервера вместо точных очков. HP=0 не доказывает смерть; для этого есть Dead/IsDead.

Поведение

  • Команда не открывает status и не запрашивает обновление сервера. Клиент только читает уже загруженные данные. Не меняет характеристики и не отправляет пакеты.
  • Результат — отдельное чтение. Мир может измениться между Exists и следующим вызовом; несколько запросов не образуют атомарный снимок.
  • При чтении объекта World.Get отвергает отсутствующий или IsDestroyed и получается 0. HP/HitsMax читаются у Entity, включая предметы с этими полями; Mana/Stamina — только у Mobile. Без аргумента читается self. Одноимённый вариант без параметров не обязательно имеет вариант с ID: смотрите сигнатуры.
  • Чтение без аргументов тоже возвращает 0 для отсутствующего или уничтоженного Player. Это относится и к прямым Mana/Stamina и их максимумам, а не только к формам через World.Get. Присутствующий мёртвый персонаж может сохранять значения.

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

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

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

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

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

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

1. Вывести значение своего персонажа — прямой скрипт

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

  • Вызов без аргументов читает self. value сохраняет одно число, Convert.ToString преобразует его только для сообщения.
var value = UO.HP();
UO.Print("HP: " + Convert.ToString(value));

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

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

  • Показан прикладной порог или расчёт для этого поля. Числа в условии — настройки примера, не пределы сервера. Перед делением на максимум проверяется его положительность.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.HP();
    var maximum = UO.GetMaxHP();
    if (Truth(maximum > 0) && Truth(value * 100 / maximum < 50))
    {
        UO.Print("Health below half of the known maximum");
    }

    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. Полная вспомогательная функция ReadValue — класс сценария

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

  • У этого имени нет формы с ID. ReadValue без параметров читает self; два вызова разделены 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();
        await Delay(1000);
        var after = ReadValue();
        UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        return null;
    }

    dynamic ReadValue()
    {
        return UO.HP();
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}

Реализация команды

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.HP() — UO.HP()

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

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

При вызове:

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

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

() => bridge.GetHP(bridge.Self)

Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.


UO.Hidden

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

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

int UO.Hidden();
int UO.Hidden(object? id);

Проверяет скрытность персонажа.

Параметры

  • id — Необязательный объект в показанных формах: serial числом/hex-строкой, self, lasttarget или зарегистрированное имя AddObject. Это не type. Без аргумента читается self. Неизвестный текст в некоторых формах вызывает ошибку преобразования; проверяйте имя перед вызовом.

Возвращает

Числовой флаг int: 1 (условие выполнено), 0 (условие не выполнено). Это числовой флаг: в C# проверяйте result != 0 либо result == 0. Прямое сравнение int с true/false и if (result) недопустимо. 1 — mobile имеет IsHidden, 0 — флага нет или mobile отсутствует. Это серверный флаг, а не видимость за стеной.

Результат команды — числовой флаг: 1 означает выполненное условие, 0 — невыполненное. После var result = команда(...) проверяйте if (result != 0) или if (result == 0). Сохраните результат одного вызова: повторный вызов может выполнить действие снова либо прочитать уже изменившееся состояние.

Поведение

  • Читает локальную модель: не открывает target, не запрашивает status, не меняет флаг и не отправляет пакет. Уничтоженный объект считается отсутствующим ещё до удаления записи из словаря.
  • Результат — отдельное чтение. Мир может измениться между Exists и следующим вызовом; несколько запросов не образуют атомарный снимок.

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

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

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

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

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

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

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

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

  • Пустые скобки читают self. active сохраняет результат один раз; true и false задают две ветви. Print только выводит пример сообщения.
var active = UO.Hidden();
if (Truth(Truth(active) == true))
{
    UO.Print("State is active");
}
else
{
    UO.Print("State is inactive or unavailable");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Выбранный объект и полная функция ReadState — функция сценария

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

  • lasttarget — ранее выбранный объект. Exists проверяет его наличие. obj — единственный параметр ReadState; функция возвращает результат команды без изменения. Её определение входит в копируемый код.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("lasttarget")))
    {
        var observed = ReadState("lasttarget");
        UO.Print("State 1/0: " + Convert.ToString(observed));
    }

    return null;
}

dynamic ReadState(dynamic obj)
{
    return UO.Hidden(obj);
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Заметить изменение за полсекунды — класс сценария

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

  • Два вызова без аргументов читают self, UO.Wait(500) задаёт 500 миллисекунд. Сравниваются два снимка; промежуточные переходы могут быть пропущены. Бесконечного ожидания нет.
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 = UO.Hidden();
        await Delay(500);
        var after = UO.Hidden();
        if (Truth(before != after))
        {
            UO.Print("State changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
        }

        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.Hidden() — UO.Hidden()

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

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

При вызове:

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

public int Hidden() => Hidden("self");

UO.Hidden(id) — UO.Hidden(Integer)

Параметры: id (Integer/String)

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

При вызове:

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

public int Hidden(int id) => bridge.Hidden(id);

UO.Hidden(id) — UO.Hidden(String)

Параметры: id (Integer/String)

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

При вызове:

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

public int Hidden(string idText) => Hidden(GetObject(idText));

UO.Int

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

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

int UO.Int();

Читает текущий интеллект (Intelligence, INT) персонажа.

Параметры

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

Возвращает

int — текущие очки характеристики, 0..65535 в модели клиента; не процент, ID, навык, режим блокировки или bool. 0 также означает отсутствие/удаление персонажа или недоступный объект. Сравнивайте с числовым требованием, не == true. Это не предел характеристики и не гарантированное базовое значение без модификаторов.

Поведение

  • Команда не принимает аргументов. Используйте точные сигнатуры выше.
  • Читает Player.Intelligence, если Player существует и не уничтожен; иначе 0. Присутствующий мёртвый персонаж не является удалённым объектом. Характеристика не вычисляется из HP, маны или выносливости.
  • GetStr/GetInt/GetDex принимают ObjID. Данные PlayerMobile доступны только для self; для другого serial — 0, даже для загруженного mobile. Чужая характеристика не подставляется и не угадывается.
  • Invoke читает на игровом потоке с возможностью отменить ожидание скриптом. Не запрашивает status, не открывает target, не посылает пакет, не меняет характеристику и не добавляет задержку.
  • Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.
  • C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool. UO.Int(), UO.Intelligence(), UO.GetInt(), UO.GetIntelligence().

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

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

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

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

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

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

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

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

  • value сохраняет числовой результат; Convert.ToString лишь форматирует его для журнала. Аргументов и действия персонажа нет.
var value = UO.Int();
UO.Print("Intelligence: " + Convert.ToString(value));

2. Сравнить два снимка — функция сценария

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

  • before и after разделяет 1000 мс; UO.Wait добавлен в пример. change=after-before бывает положительным, нулевым или отрицательным. Сам по себе он не различает все промежуточные обновления и выход из мира.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.Int();
    await Delay(1000);
    var after = UO.Int();
    var change = after - before;
    UO.Print("Change: " + Convert.ToString(change));
    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));

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

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

  • minimum=80 — пример требования, не предел клиента. AttributeAtLeast(minimum) отвергает отсутствующего персонажа, один раз читает характеристику и возвращает bool: true или false по условию >= minimum. Логическое значение даёт сравнение, не сама характеристика.
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(Truth(AttributeAtLeast(80)) == true))
        {
            UO.Print("Requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic AttributeAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.Int();
        return value >= minimum;
    }

    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.Int() — UO.Int()

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

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

При вызове:

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

case "int": return new InjectionValue(bridge.Intelligence);

UO.Intelligence

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

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

int UO.Intelligence();

Читает текущий интеллект (Intelligence, INT) персонажа.

Параметры

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

Возвращает

int — текущие очки характеристики, 0..65535 в модели клиента; не процент, ID, навык, режим блокировки или bool. 0 также означает отсутствие/удаление персонажа или недоступный объект. Сравнивайте с числовым требованием, не == true. Это не предел характеристики и не гарантированное базовое значение без модификаторов.

Поведение

  • Команда не принимает аргументов. Используйте точные сигнатуры выше.
  • Читает Player.Intelligence, если Player существует и не уничтожен; иначе 0. Присутствующий мёртвый персонаж не является удалённым объектом. Характеристика не вычисляется из HP, маны или выносливости.
  • GetStr/GetInt/GetDex принимают ObjID. Данные PlayerMobile доступны только для self; для другого serial — 0, даже для загруженного mobile. Чужая характеристика не подставляется и не угадывается.
  • Invoke читает на игровом потоке с возможностью отменить ожидание скриптом. Не запрашивает status, не открывает target, не посылает пакет, не меняет характеристику и не добавляет задержку.
  • Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.
  • C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool. UO.Int(), UO.Intelligence(), UO.GetInt(), UO.GetIntelligence().

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

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

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

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

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

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

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

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

  • value сохраняет числовой результат; Convert.ToString лишь форматирует его для журнала. Аргументов и действия персонажа нет.
var value = UO.Intelligence();
UO.Print("Intelligence: " + Convert.ToString(value));

2. Сравнить два снимка — функция сценария

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

  • before и after разделяет 1000 мс; UO.Wait добавлен в пример. change=after-before бывает положительным, нулевым или отрицательным. Сам по себе он не различает все промежуточные обновления и выход из мира.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.Intelligence();
    await Delay(1000);
    var after = UO.Intelligence();
    var change = after - before;
    UO.Print("Change: " + Convert.ToString(change));
    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));

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

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

  • minimum=80 — пример требования, не предел клиента. AttributeAtLeast(minimum) отвергает отсутствующего персонажа, один раз читает характеристику и возвращает bool: true или false по условию >= minimum. Логическое значение даёт сравнение, не сама характеристика.
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(Truth(AttributeAtLeast(80)) == true))
        {
            UO.Print("Requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

    dynamic AttributeAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.Intelligence();
        return value >= minimum;
    }

    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.Intelligence() — UO.Intelligence()

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

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

При вызове:

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

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

() => bridge.Intelligence

Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.


UO.IsAlive

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

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

int UO.IsAlive();
int UO.IsAlive(object? value);

Проверяет наличие объекта без признака смерти.

Параметры

  • value — Необязательный объект в показанных формах: serial числом/hex-строкой, self, lasttarget или зарегистрированное имя AddObject. Это не type. Без аргумента читается self. Неизвестный текст в некоторых формах вызывает ошибку преобразования; проверяйте имя перед вызовом.

Возвращает

Числовой флаг int: 1 (условие выполнено), 0 (условие не выполнено). Это числовой флаг: в C# проверяйте result != 0 либо result == 0. Прямое сравнение int с true/false и if (result) недопустимо. 1 — положительный serial существует и не помечен мёртвым. Известный предмет тоже даёт 1: это не фильтр mobile. Мёртвый/отсутствующий объект даёт 0.

Результат команды — числовой флаг: 1 означает выполненное условие, 0 — невыполненное. После var result = команда(...) проверяйте if (result != 0) или if (result == 0). Сохраните результат одного вызова: повторный вызов может выполнить действие снова либо прочитать уже изменившееся состояние.

Поведение

  • Читает локальную модель: не открывает target, не запрашивает status, не меняет флаг и не отправляет пакет. Уничтоженный объект считается отсутствующим ещё до удаления записи из словаря.
  • Результат — отдельное чтение. Мир может измениться между Exists и следующим вызовом; несколько запросов не образуют атомарный снимок.

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

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

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

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

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

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

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

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

  • Пустые скобки читают self. active сохраняет результат один раз; true и false задают две ветви. Print только выводит пример сообщения.
var active = UO.IsAlive();
if (Truth(Truth(active) == true))
{
    UO.Print("State is active");
}
else
{
    UO.Print("State is inactive or unavailable");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Выбранный объект и полная функция ReadState — функция сценария

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

  • lasttarget — ранее выбранный объект. Exists проверяет его наличие. obj — единственный параметр ReadState; функция возвращает результат команды без изменения. Её определение входит в копируемый код.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("lasttarget")))
    {
        var observed = ReadState("lasttarget");
        UO.Print("State 1/0: " + Convert.ToString(observed));
    }

    return null;
}

dynamic ReadState(dynamic obj)
{
    return UO.IsAlive(obj);
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Заметить изменение за полсекунды — класс сценария

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

  • Два вызова без аргументов читают self, UO.Wait(500) задаёт 500 миллисекунд. Сравниваются два снимка; промежуточные переходы могут быть пропущены. Бесконечного ожидания нет.
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 = UO.IsAlive();
        await Delay(500);
        var after = UO.IsAlive();
        if (Truth(before != after))
        {
            UO.Print("State changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
        }

        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.IsAlive() — UO.IsAlive()

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

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

При вызове:

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

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

serial => serial > 0 && bridge.Exists(serial) != 0 && IsDeadState(serial) == 0 ? 1 : 0

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

() => getter(bridge.Self)

Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.

UO.IsAlive(value) — UO.IsAlive(Any)

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

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

При вызове:

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

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

serial => serial > 0 && bridge.Exists(serial) != 0 && IsDeadState(serial) == 0 ? 1 : 0

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

value => getter(GetObject(value))

Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.


UO.IsDead

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

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

int UO.IsDead();
dynamic UO.IsDead(object? objID);

Проверяет смерть персонажа.

Параметры

  • objID — Необязательный объект в показанных формах: serial числом/hex-строкой, self, lasttarget или зарегистрированное имя AddObject. Это не type. Без аргумента читается self. Неизвестный текст в некоторых формах вызывает ошибку преобразования; проверяйте имя перед вызовом.

Возвращает

Числовой флаг int: 1 (условие выполнено), 0 (условие не выполнено). Это числовой флаг: в C# проверяйте result != 0 либо result == 0. Прямое сравнение int с true/false и if (result) недопустимо. 1 — mobile имеет IsDead, 0 — признака нет или mobile отсутствует. HP=0 само по себе не означает смерть.

Результат команды — числовой флаг: 1 означает выполненное условие, 0 — невыполненное. После var result = команда(...) проверяйте if (result != 0) или if (result == 0). Сохраните результат одного вызова: повторный вызов может выполнить действие снова либо прочитать уже изменившееся состояние.

Поведение

  • Читает локальную модель: не открывает target, не запрашивает status, не меняет флаг и не отправляет пакет. Уничтоженный объект считается отсутствующим ещё до удаления записи из словаря.
  • Результат — отдельное чтение. Мир может измениться между Exists и следующим вызовом; несколько запросов не образуют атомарный снимок.

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

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

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

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

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

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

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

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

  • Пустые скобки читают self. active сохраняет результат один раз; true и false задают две ветви. Print только выводит пример сообщения.
var active = UO.IsDead();
if (Truth(Truth(active) == true))
{
    UO.Print("State is active");
}
else
{
    UO.Print("State is inactive or unavailable");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Выбранный объект и полная функция ReadState — функция сценария

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

  • lasttarget — ранее выбранный объект. Exists проверяет его наличие. obj — единственный параметр ReadState; функция возвращает результат команды без изменения. Её определение входит в копируемый код.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("lasttarget")))
    {
        var observed = ReadState("lasttarget");
        UO.Print("State 1/0: " + Convert.ToString(observed));
    }

    return null;
}

dynamic ReadState(dynamic obj)
{
    return UO.IsDead(obj);
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Заметить изменение за полсекунды — класс сценария

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

  • Два вызова без аргументов читают self, UO.Wait(500) задаёт 500 миллисекунд. Сравниваются два снимка; промежуточные переходы могут быть пропущены. Бесконечного ожидания нет.
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 = UO.IsDead();
        await Delay(500);
        var after = UO.IsDead();
        if (Truth(before != after))
        {
            UO.Print("State changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
        }

        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.IsDead() — UO.IsDead()

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

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

При вызове:

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

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

IsDeadState

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

() => getter(bridge.Self)

Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.

UO.IsDead(objID) — UO.IsDead(Any)

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

Результат: dynamic / Any.

При вызове:

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

case "isdead": return new InjectionValue(arguments.Length > 0 ? bridge.IsDead(Arg(0)) : bridge.Dead());

UO.IsFemale

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

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

int UO.IsFemale(object? objID);

Проверяет признак женского пола mobile.

Параметры

  • objID — Обязательный serial/ID конкретного объекта: int, hex-строка либо алиас self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse или имя AddObject. Это не graphic/type. Неустановленное имя разрешается в 0; никакой новый target команда не открывает. Аргумент обязателен; для себя передайте self.

Возвращает

int 1 — загруженный mobile имеет признак IsFemale. int 0 — признак отсутствует, объект не является mobile, неизвестен или удалён. Не определяет расу, имя, возраст или тип владельца объекта.

Результат команды — числовой флаг: 1 означает выполненное условие, 0 — невыполненное. После var result = команда(...) проверяйте if (result != 0) или if (result == 0). Сохраните результат одного вызова: повторный вызов может выполнить действие снова либо прочитать уже изменившееся состояние.

Поведение

  • Читается локальная модель клиента; запросов серверу, ожидания и перемещения нет.
  • Результат относится к моменту чтения. После UO.Wait или другого действия объект и его флаги могут измениться.
  • Не определяет расу, имя, возраст или тип владельца объекта.

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

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

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

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

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

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

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

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

  • Аргумент self явно выбирает своего персонажа. state — только 1/0.
  • Не определяет расу, имя, возраст или тип владельца объекта.
var state = UO.IsFemale("self");
if (Truth(state))
{
    UO.Print("Female flag is set");
}
else
{
    UO.Print("Female flag is not set");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Проверить выбранного mobile — функция сценария

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

  • IsNpc исключает предмет и неизвестный объект. target сохраняет один serial, а не живую ссылку на меняющийся lasttarget.
  • Результат относится к полю IsFemale. Данные обновляются только после получения соответствующего состояния клиентом.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.IsFemale(target);
        UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    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. Сравнить состояние до и после паузы — класс сценария

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

  • UO.Wait(500) — пауза в миллисекундах. После неё отдельно проверяется, что mobile ещё существует.
  • Сравниваются два снимка. Промежуточные изменения могут быть пропущены, и это не непрерывная подписка на серверные события.
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 target = UO.GetSerial("lasttarget");
        if (Truth(UO.IsNPC(target)))
        {
            var before = UO.IsFemale(target);
            await Delay(500);
            if (Truth(UO.IsNPC(target)))
            {
                var after = UO.IsFemale(target);
                if (Truth(before != after))
                {
                    UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
                }
            }
            else
            {
                UO.Print("Mobile left the local world");
            }
        }

        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.IsFemale(objID) — UO.IsFemale(Any)

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

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

При вызове:

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

case "isfemale": return new InjectionValue(bridge.IsFemale(Arg(0, bridge.Self)));

UO.IsFlying

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

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

int UO.IsFlying();
int UO.IsFlying(object? value);

Проверяет, летит ли сейчас персонаж. Обычно это нужно для Gargoyle: например, перед запуском маршрута или перед запросом включения полёта. Без аргумента отвечает на вопрос «мой персонаж сейчас летит?». Команда только читает состояние: она не включает полёт, не приземляет и не двигает персонажа.

Параметры

  • value — Необязательный serial персонажа: число, hex-строка, self, lasttarget или имя, сохранённое через UO.AddObject. Без аргумента используется свой персонаж. Это ID конкретного mobile, не graphic/type и не координата Z. Неизвестное имя, отсутствующий/удалённый mobile или предмет дают 0.

Возвращает

Числовой флаг int: 1 (условие выполнено), 0 (условие не выполнено). Это числовой флаг: в C# проверяйте result != 0 либо result == 0. Прямое сравнение int с true/false и if (result) недопустимо. 1 — mobile имеет IsFlying, 0 — флага нет или mobile отсутствует. Высота Z сама по себе не означает полёт.

Результат команды — числовой флаг: 1 означает выполненное условие, 0 — невыполненное. После var result = команда(...) проверяйте if (result != 0) или if (result == 0). Сохраните результат одного вызова: повторный вызов может выполнить действие снова либо прочитать уже изменившееся состояние.

Поведение

  • Основное игровое применение — полёт Gargoyle. Однако getter не проверяет расу: в этом клиенте читает бит 0x04 у mobile при версии протокола 7.0.0.0 и новее. На старом протоколе возвращает 0. Стояние на крыше, высокая Z, анимация крыльев или сама раса Gargoyle не являются доказательством включённого полёта.
  • Для изменения состояния есть отдельная UO.ToggleFly(): она отправляет запрос переключения, а не команду «включить». Если уже летите, повторный вызов запрашивает посадку. Сервер может отказать; после запроса читайте Flying повторно с ограниченным ожиданием. false также возможен без персонажа/доступных данных, поэтому перед игровым действием проверьте Connected.
  • Читает локальную модель: не открывает target, не запрашивает status, не меняет флаг и не отправляет пакет. Уничтоженный объект считается отсутствующим ещё до удаления записи из словаря.
  • Результат — отдельное чтение. Мир может измениться между Exists и следующим вызовом; несколько запросов не образуют атомарный снимок.

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

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

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

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

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

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

1. Проверить режим перед следующим этапом скрипта — прямой скрипт

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

  • Пустые скобки означают self. true равен 1, false равен 0; if UO.Flying() { ... } допустим. Этот пример ничего не переключает.
var active = UO.IsFlying();
if (Truth(Truth(active) == true))
{
    UO.Print("Flying mode active");
}
else
{
    UO.Print("Ground mode or character data unavailable");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Проверить ранее выбранного персонажа — функция сценария

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

  • ReadState(obj) принимает serial/алиас и возвращает состояние. Полное определение приведено ниже; отсутствие объекта обрабатывается до чтения. Чужой персонаж тоже проверяется по данным, уже полученным клиентом.
return  RunScenario();
 object? RunScenario()
{
    var target = Asc(UO.GetSerial("lasttarget"), 0);
    if (Truth(target != 0) && Truth(UO.Exists(target)))
    {
        if (Truth(ReadState(target)))
        {
            UO.AddObject("flying_mobile", target);
        }
    }

    return null;
}

dynamic ReadState(dynamic obj)
{
    if (!(Truth(UO.Exists(obj))))
    {
        return false;
    }

    return UO.IsFlying(obj);
}

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

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Запросить полёт один раз и дождаться результата — класс сценария

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

  • Пример предназначен для своего Gargoyle на поддерживающем полёт сервере. EnsureFlight(timeoutMs) возвращает 1/true, если наблюдён полёт, иначе 0/false. 2000 — предел ожидания в миллисекундах; проверки каждые 50 мс. Если уже летите, ToggleFly не вызывается. Отправляется не больше одного запроса, затем проверяется ответное состояние. Пауза скрипта/задержка планировщика могут увеличить реальное время.
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(await EnsureFlight(2000)))
        {
            UO.Print("Flight confirmed; ready for the next stage");
        }
        else
        {
            UO.Print("Flight not confirmed; route was not started");
        }

        return null;
    }

    async Task<dynamic> EnsureFlight(dynamic timeoutMs)
    {
        if (!(Truth(UO.Connected())) || Truth(UO.Dead()))
        {
            return false;
        }

        if (Truth(UO.IsFlying()))
        {
            return true;
        }

        UO.ToggleFly();
        var waited = 0;
        while (Truth(waited < timeoutMs))
        {
            if (!(Truth(UO.Connected())))
            {
                return false;
            }

            if (Truth(UO.IsFlying()))
            {
                return true;
            }

            await Delay(50);
            waited += 50;
        }

        return UO.IsFlying();
    }

    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.IsFlying() — UO.IsFlying()

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

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

При вызове:

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

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

serial => bridge.Flying(serial)

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

() => getter(bridge.Self)

Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.

UO.IsFlying(value) — UO.IsFlying(Any)

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

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

При вызове:

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

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

serial => bridge.Flying(serial)

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

value => getter(GetObject(value))

Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.


UO.IsFrozen

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

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

int UO.IsFrozen();
int UO.IsFrozen(object? value);

Проверяет известный клиенту флаг паралича персонажа.

Параметры

  • value — Необязательный serial/ID mobile: число, hex-строка, self, lasttarget либо другое стандартное имя объекта или имя AddObject. Это не graphic/type. Без аргумента используется self. Неизвестное имя разрешается в 0; target не открывается.

Возвращает

Числовой флаг int: 1 (условие выполнено) — загруженный mobile имеет флаг IsParalyzed; 0 (условие не выполнено) — флага нет, mobile неизвестен, удалён либо объект является предметом. Это не время паралича и не гарантия возможности движения при результате 0.

Поведение

  • Используйте Paralyzed для проверки флага паралича. Варианты Is/Get, GetParalisa, Frozen и GetLocked читают тот же флаг.
  • Команда только читает локальные данные. Она не накладывает и не снимает паралич, не ждёт его окончания и не отправляет запрос обновления серверу.
  • Результат этой команды имеет тип int: используйте if (value != 0) или if (value == 0). Прямое сравнение с true/false и if (value) в C# недопустимы. Значение сохраняет смысл флага, а не количества или ID.

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

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

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

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

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

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

1. Проверить себя через true — прямой скрипт

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

  • Пустые скобки выбирают self. state сохраняет один снимок флага; true — числовая константа 1.
  • Результат false не исключает стену, отсутствие выносливости или другую причину остановки.
var state = UO.IsFrozen();
if (Truth(Truth(state) == true))
{
    UO.Print("Paralysis flag is set");
}
else
{
    UO.Print("Paralysis flag is absent or unavailable");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Проверить выбранного mobile — функция сценария

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

  • target сохраняет hex-строку serial последней цели. IsNpc проверяет, что это загруженный mobile, включая игроков.
  • Команда с аргументом читает именно target. Она не выбирает нового персонажа и не меняет lasttarget.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.IsFrozen(target);
        UO.Print("Selected mobile paralysis 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    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. Ограниченно подождать снятия паралича — класс сценария

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

  • Не больше 10 пауз по 100 мс. Каждый вызов без аргумента заново читает self.
  • После цикла отдельно проверяется наличие self. Это наблюдение примерно на секунду плюс исполнение команд, а не гарантированное снятие паралича.
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 attempts = 0;
        while (Truth(Truth(UO.IsFrozen()) == true) && Truth(attempts < 10))
        {
            await Delay(100);
            attempts = attempts + 1;
        }

        if (Truth(UO.IsNPC("self")))
        {
            if (Truth(Truth(UO.IsFrozen()) == false))
            {
                UO.Print("Paralysis flag is clear");
            }
            else
            {
                UO.Print("Still paralyzed");
            }
        }
        else
        {
            UO.Print("Self is unavailable");
        }

        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.IsFrozen() — UO.IsFrozen()

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

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

При вызове:

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

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

serial => bridge.GetLocked(serial)

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

() => getter(bridge.Self)

Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.

UO.IsFrozen(value) — UO.IsFrozen(Any)

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

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

При вызове:

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

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

serial => bridge.GetLocked(serial)

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

value => getter(GetObject(value))

Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.


UO.IsHidden

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

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

int UO.IsHidden();
dynamic UO.IsHidden(object? objID);

Проверяет скрытность персонажа.

Параметры

  • objID — Необязательный объект в показанных формах: serial числом/hex-строкой, self, lasttarget или зарегистрированное имя AddObject. Это не type. Без аргумента читается self. Неизвестный текст в некоторых формах вызывает ошибку преобразования; проверяйте имя перед вызовом.

Возвращает

Числовой флаг int: 1 (условие выполнено), 0 (условие не выполнено). Это числовой флаг: в C# проверяйте result != 0 либо result == 0. Прямое сравнение int с true/false и if (result) недопустимо. 1 — mobile имеет IsHidden, 0 — флага нет или mobile отсутствует. Это серверный флаг, а не видимость за стеной.

Результат команды — числовой флаг: 1 означает выполненное условие, 0 — невыполненное. После var result = команда(...) проверяйте if (result != 0) или if (result == 0). Сохраните результат одного вызова: повторный вызов может выполнить действие снова либо прочитать уже изменившееся состояние.

Поведение

  • Читает локальную модель: не открывает target, не запрашивает status, не меняет флаг и не отправляет пакет. Уничтоженный объект считается отсутствующим ещё до удаления записи из словаря.
  • Результат — отдельное чтение. Мир может измениться между Exists и следующим вызовом; несколько запросов не образуют атомарный снимок.

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

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

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

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

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

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

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

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

  • Пустые скобки читают self. active сохраняет результат один раз; true и false задают две ветви. Print только выводит пример сообщения.
var active = UO.IsHidden();
if (Truth(Truth(active) == true))
{
    UO.Print("State is active");
}
else
{
    UO.Print("State is inactive or unavailable");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Выбранный объект и полная функция ReadState — функция сценария

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

  • lasttarget — ранее выбранный объект. Exists проверяет его наличие. obj — единственный параметр ReadState; функция возвращает результат команды без изменения. Её определение входит в копируемый код.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("lasttarget")))
    {
        var observed = ReadState("lasttarget");
        UO.Print("State 1/0: " + Convert.ToString(observed));
    }

    return null;
}

dynamic ReadState(dynamic obj)
{
    return UO.IsHidden(obj);
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Заметить изменение за полсекунды — класс сценария

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

  • Два вызова без аргументов читают self, UO.Wait(500) задаёт 500 миллисекунд. Сравниваются два снимка; промежуточные переходы могут быть пропущены. Бесконечного ожидания нет.
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 = UO.IsHidden();
        await Delay(500);
        var after = UO.IsHidden();
        if (Truth(before != after))
        {
            UO.Print("State changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
        }

        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.IsHidden() — UO.IsHidden()

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

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

При вызове:

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

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

serial => bridge.Hidden(serial)

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

() => getter(bridge.Self)

Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.

UO.IsHidden(objID) — UO.IsHidden(Any)

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

Результат: dynamic / Any.

При вызове:

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

case "ishidden": return new InjectionValue(bridge.Hidden(Arg(0, bridge.Self)));

UO.IsParalysed

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

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

int UO.IsParalysed();
int UO.IsParalysed(object? value);

Проверяет известный клиенту флаг паралича персонажа.

Параметры

  • value — Необязательный serial/ID mobile: число, hex-строка, self, lasttarget либо другое стандартное имя объекта или имя AddObject. Это не graphic/type. Без аргумента используется self. Неизвестное имя разрешается в 0; target не открывается.

Возвращает

Числовой флаг int: 1 (условие выполнено) — загруженный mobile имеет флаг IsParalyzed; 0 (условие не выполнено) — флага нет, mobile неизвестен, удалён либо объект является предметом. Это не время паралича и не гарантия возможности движения при результате 0.

Поведение

  • Используйте Paralyzed для проверки флага паралича. Варианты Is/Get, GetParalisa, Frozen и GetLocked читают тот же флаг.
  • Команда только читает локальные данные. Она не накладывает и не снимает паралич, не ждёт его окончания и не отправляет запрос обновления серверу.
  • Результат этой команды имеет тип int: используйте if (value != 0) или if (value == 0). Прямое сравнение с true/false и if (value) в C# недопустимы. Значение сохраняет смысл флага, а не количества или ID.

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

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

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

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

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

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

1. Проверить себя через true — прямой скрипт

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

  • Пустые скобки выбирают self. state сохраняет один снимок флага; true — числовая константа 1.
  • Результат false не исключает стену, отсутствие выносливости или другую причину остановки.
var state = UO.IsParalysed();
if (Truth(Truth(state) == true))
{
    UO.Print("Paralysis flag is set");
}
else
{
    UO.Print("Paralysis flag is absent or unavailable");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Проверить выбранного mobile — функция сценария

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

  • target сохраняет hex-строку serial последней цели. IsNpc проверяет, что это загруженный mobile, включая игроков.
  • Команда с аргументом читает именно target. Она не выбирает нового персонажа и не меняет lasttarget.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.IsParalysed(target);
        UO.Print("Selected mobile paralysis 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    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. Ограниченно подождать снятия паралича — класс сценария

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

  • Не больше 10 пауз по 100 мс. Каждый вызов без аргумента заново читает self.
  • После цикла отдельно проверяется наличие self. Это наблюдение примерно на секунду плюс исполнение команд, а не гарантированное снятие паралича.
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 attempts = 0;
        while (Truth(Truth(UO.IsParalysed()) == true) && Truth(attempts < 10))
        {
            await Delay(100);
            attempts = attempts + 1;
        }

        if (Truth(UO.IsNPC("self")))
        {
            if (Truth(Truth(UO.IsParalysed()) == false))
            {
                UO.Print("Paralysis flag is clear");
            }
            else
            {
                UO.Print("Still paralyzed");
            }
        }
        else
        {
            UO.Print("Self is unavailable");
        }

        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.IsParalysed() — UO.IsParalysed()

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

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

При вызове:

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

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

serial => bridge.GetLocked(serial)

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

() => getter(bridge.Self)

Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.

UO.IsParalysed(value) — UO.IsParalysed(Any)

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

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

При вызове:

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

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

serial => bridge.GetLocked(serial)

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

value => getter(GetObject(value))

Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.


UO.IsParalyzed

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

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

int UO.IsParalyzed();
int UO.IsParalyzed(object? objID);

Проверяет известный клиенту флаг паралича персонажа.

Параметры

  • objID — Необязательный serial/ID mobile: число, hex-строка, self, lasttarget либо другое стандартное имя объекта или имя AddObject. Это не graphic/type. Без аргумента используется self. Неизвестное имя разрешается в 0; target не открывается.

Возвращает

Числовой флаг int: 1 (условие выполнено) — загруженный mobile имеет флаг IsParalyzed; 0 (условие не выполнено) — флага нет, mobile неизвестен, удалён либо объект является предметом. Это не время паралича и не гарантия возможности движения при результате 0.

Поведение

  • Используйте Paralyzed для проверки флага паралича. Варианты Is/Get, GetParalisa, Frozen и GetLocked читают тот же флаг.
  • Команда только читает локальные данные. Она не накладывает и не снимает паралич, не ждёт его окончания и не отправляет запрос обновления серверу.
  • Результат этой команды имеет тип int: используйте if (value != 0) или if (value == 0). Прямое сравнение с true/false и if (value) в C# недопустимы. Значение сохраняет смысл флага, а не количества или ID.

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

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

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

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

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

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

1. Проверить себя через true — прямой скрипт

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

  • Пустые скобки выбирают self. state сохраняет один снимок флага; true — числовая константа 1.
  • Результат false не исключает стену, отсутствие выносливости или другую причину остановки.
var state = UO.IsParalyzed();
if (Truth(Truth(state) == true))
{
    UO.Print("Paralysis flag is set");
}
else
{
    UO.Print("Paralysis flag is absent or unavailable");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Проверить выбранного mobile — функция сценария

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

  • target сохраняет hex-строку serial последней цели. IsNpc проверяет, что это загруженный mobile, включая игроков.
  • Команда с аргументом читает именно target. Она не выбирает нового персонажа и не меняет lasttarget.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.IsParalyzed(target);
        UO.Print("Selected mobile paralysis 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    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. Ограниченно подождать снятия паралича — класс сценария

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

  • Не больше 10 пауз по 100 мс. Каждый вызов без аргумента заново читает self.
  • После цикла отдельно проверяется наличие self. Это наблюдение примерно на секунду плюс исполнение команд, а не гарантированное снятие паралича.
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 attempts = 0;
        while (Truth(Truth(UO.IsParalyzed()) == true) && Truth(attempts < 10))
        {
            await Delay(100);
            attempts = attempts + 1;
        }

        if (Truth(UO.IsNPC("self")))
        {
            if (Truth(Truth(UO.IsParalyzed()) == false))
            {
                UO.Print("Paralysis flag is clear");
            }
            else
            {
                UO.Print("Still paralyzed");
            }
        }
        else
        {
            UO.Print("Self is unavailable");
        }

        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.IsParalyzed() — UO.IsParalyzed()

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

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

При вызове:

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

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

serial => bridge.GetLocked(serial)

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

() => getter(bridge.Self)

Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.

UO.IsParalyzed(objID) — UO.IsParalyzed(Any)

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

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

При вызове:

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

case "isparalyzed": return new InjectionValue(bridge.GetLocked(Arg(0, bridge.Self)));

UO.IsPoisoned

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

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

int UO.IsPoisoned();
dynamic UO.IsPoisoned(object? objID);

Проверяет отравление персонажа.

Параметры

  • objID — Необязательный объект в показанных формах: serial числом/hex-строкой, self, lasttarget или зарегистрированное имя AddObject. Это не type. Без аргумента читается self. Неизвестный текст в некоторых формах вызывает ошибку преобразования; проверяйте имя перед вызовом.

Возвращает

Числовой флаг int: 1 (условие выполнено), 0 (условие не выполнено). Это числовой флаг: в C# проверяйте result != 0 либо result == 0. Прямое сравнение int с true/false и if (result) недопустимо. 1 — mobile имеет IsPoisoned, 0 — флага нет или mobile отсутствует. Степень яда и оставшееся время не возвращаются.

Результат команды — числовой флаг: 1 означает выполненное условие, 0 — невыполненное. После var result = команда(...) проверяйте if (result != 0) или if (result == 0). Сохраните результат одного вызова: повторный вызов может выполнить действие снова либо прочитать уже изменившееся состояние.

Поведение

  • Читает локальную модель: не открывает target, не запрашивает status, не меняет флаг и не отправляет пакет. Уничтоженный объект считается отсутствующим ещё до удаления записи из словаря.
  • Результат — отдельное чтение. Мир может измениться между Exists и следующим вызовом; несколько запросов не образуют атомарный снимок.
  • Для Poisoned/Flying учитывается версия протокола: до 7.0.0.0 бит 0x04 означает яд; начиная с 7.0.0.0 он означает полёт, а яд хранится отдельно. Полёт не вычисляется из Z.

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

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

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

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

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

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

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

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

  • Пустые скобки читают self. active сохраняет результат один раз; true и false задают две ветви. Print только выводит пример сообщения.
var active = UO.IsPoisoned();
if (Truth(Truth(active) == true))
{
    UO.Print("State is active");
}
else
{
    UO.Print("State is inactive or unavailable");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Выбранный объект и полная функция ReadState — функция сценария

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

  • lasttarget — ранее выбранный объект. Exists проверяет его наличие. obj — единственный параметр ReadState; функция возвращает результат команды без изменения. Её определение входит в копируемый код.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("lasttarget")))
    {
        var observed = ReadState("lasttarget");
        UO.Print("State 1/0: " + Convert.ToString(observed));
    }

    return null;
}

dynamic ReadState(dynamic obj)
{
    return UO.IsPoisoned(obj);
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Заметить изменение за полсекунды — класс сценария

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

  • Два вызова без аргументов читают self, UO.Wait(500) задаёт 500 миллисекунд. Сравниваются два снимка; промежуточные переходы могут быть пропущены. Бесконечного ожидания нет.
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 = UO.IsPoisoned();
        await Delay(500);
        var after = UO.IsPoisoned();
        if (Truth(before != after))
        {
            UO.Print("State changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
        }

        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.IsPoisoned() — UO.IsPoisoned()

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

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

При вызове:

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

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

serial => bridge.Poisoned(serial)

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

() => getter(bridge.Self)

Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.

UO.IsPoisoned(objID) — UO.IsPoisoned(Any)

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

Результат: dynamic / Any.

При вызове:

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

case "ispoisoned": return new InjectionValue(bridge.Poisoned(Arg(0, bridge.Self)));

UO.IsYellowHits

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

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

int UO.IsYellowHits(object? objID);

Проверяет флаг жёлтой полосы здоровья mobile.

Параметры

  • objID — Обязательный serial/ID конкретного объекта: int, hex-строка либо алиас self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse или имя AddObject. Это не graphic/type. Неустановленное имя разрешается в 0; никакой новый target команда не открывает. Аргумент обязателен; для себя передайте self.

Возвращает

int 1 — загруженный mobile имеет признак IsYellowHits. int 0 — признак отсутствует, объект не является mobile, неизвестен или удалён. Это серверный/совместимый флаг, а не цвет темы IDE и не количество HP. Отсутствие флага не доказывает уязвимость: сервер может обозначать защиту иначе.

Результат команды — числовой флаг: 1 означает выполненное условие, 0 — невыполненное. После var result = команда(...) проверяйте if (result != 0) или if (result == 0). Сохраните результат одного вызова: повторный вызов может выполнить действие снова либо прочитать уже изменившееся состояние.

Поведение

  • Читается локальная модель клиента; запросов серверу, ожидания и перемещения нет.
  • Результат относится к моменту чтения. После UO.Wait или другого действия объект и его флаги могут измениться.
  • Это серверный/совместимый флаг, а не цвет темы IDE и не количество HP. Отсутствие флага не доказывает уязвимость: сервер может обозначать защиту иначе.

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

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

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

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

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

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

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

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

  • Аргумент self явно выбирает своего персонажа. state — только 1/0.
  • Это серверный/совместимый флаг, а не цвет темы IDE и не количество HP. Отсутствие флага не доказывает уязвимость: сервер может обозначать защиту иначе.
var state = UO.IsYellowHits("self");
var hp = UO.GetHP("self");
UO.Print("Yellow flag: " + Convert.ToString(state));
UO.Print("Known HP: " + Convert.ToString(hp));

2. Проверить выбранного mobile — функция сценария

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

  • IsNpc исключает предмет и неизвестный объект. target сохраняет один serial, а не живую ссылку на меняющийся lasttarget.
  • Результат относится к полю IsYellowHits. Данные обновляются только после получения соответствующего состояния клиентом.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.IsYellowHits(target);
        UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    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. Сравнить состояние до и после паузы — класс сценария

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

  • UO.Wait(500) — пауза в миллисекундах. После неё отдельно проверяется, что mobile ещё существует.
  • Сравниваются два снимка. Промежуточные изменения могут быть пропущены, и это не непрерывная подписка на серверные события.
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 target = UO.GetSerial("lasttarget");
        if (Truth(UO.IsNPC(target)))
        {
            var before = UO.IsYellowHits(target);
            await Delay(500);
            if (Truth(UO.IsNPC(target)))
            {
                var after = UO.IsYellowHits(target);
                if (Truth(before != after))
                {
                    UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
                }
            }
            else
            {
                UO.Print("Mobile left the local world");
            }
        }

        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.IsYellowHits(objID) — UO.IsYellowHits(Any)

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

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

При вызове:

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

case "isyellowhits": return new InjectionValue(bridge.GetYellowBar(Arg(0, bridge.Self)));

UO.LastStatus

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

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

int UO.LastStatus();

Возвращает serial последнего объекта, для которого клиент принял статус.

Параметры

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

Возвращает

int — 32 бита serial, не type и не логический результат. 0: ещё нет принятого статуса либо мир очищен. Старший бит сохраняется; отрицательное число тоже может представлять serial. Проверяйте != 0, а не > 0 и не == true.

Поведение

  • Без параметров. Чтение не отправляет пакеты, не открывает окно и не ждёт ответа. UO.GetStatus(id), RequestStats и UpdateObject лишь запрашивают данные: отправка не меняет LastStatus.
  • Принятый пакет 0x11 сохраняет serial и известные клиенту X/Y вместе в World для всех скриптов. Неизвестный/уничтоженный объект и неполный базовый пакет не заменяют запись. Последующие пакеты других объектов могут её заменить.
  • X/Y — снимок Entity на момент получения, а не текущая позиция. Для mobile это мировые клетки; для предмета внутри контейнера это могут быть координаты содержимого. Пакет статуса сам не передаёт X/Y. Перемещение/удаление объекта после приёма не меняет снимок; World.Clear сбрасывает его. Для текущих координат существующего объекта используйте GetX/GetY.
  • Отдельные вызовы не образуют атомарный снимок; сервер может обновить запись между ними. Равенство serial не доказывает новый ответ именно на ваш запрос. laststatus без скобок — живое встроенное значение, если скрипт не переопределил его переменной; UO.LastStatus() — зарегистрированная функция.

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

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

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

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

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

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

1. Прочитать последнее значение — прямой скрипт

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

  • Значение читается один раз. Для serial HEX сохраняет удобную шестнадцатеричную запись; для координаты Convert.ToString выводит число. Вызов не выбирает объект.
var value = UO.LastStatus();
UO.Print("Saved value: " + Hex(value));

string Hex(object? value) => Convert.ToInt64(value).ToString("X");

2. Запросить статус и прочитать известные данные — функция сценария

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

  • subject — serial self. 500 — пауза в миллисекундах, выбранная только для примера. Она не гарантирует ответа: показана текущая запись, которая могла остаться старой или принадлежать другому объекту.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var subject = UO.Self();
    if (Truth(subject != 0))
    {
        UO.GetStatus(subject);
        await Delay(500);
        var value = UO.LastStatus();
        UO.Print("Known value: " + Hex(value));
    }

    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Полный помощник ReadSavedStatus — класс сценария

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

  • expectedId — serial, сохранённый в Main. Помощник полностью определён ниже; -1 означает, что выбранной записи уже нет, и не является результатом самой команды. Проверка до/после снижает риск смешения объектов, но не гарантирует атомарность при обновлениях того же serial.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var expectedId = UO.LastStatus();
        if (Truth(expectedId != 0))
        {
            var value = ReadSavedStatus(expectedId);
            UO.Print("Checked value: " + Convert.ToString(value));
        }

        return null;
    }

    dynamic ReadSavedStatus(dynamic expectedId)
    {
        if (Truth(expectedId == 0) || Truth(UO.LastStatus() != expectedId))
        {
            return -1;
        }

        var value = UO.LastStatus();
        if (Truth(UO.LastStatus() != expectedId))
        {
            return -1;
        }

        return value;
    }

    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.LastStatus() — UO.LastStatus()

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

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

При вызове:

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

case "laststatus": return new InjectionValue(bridge.LastStatus);

UO.LastStatusX

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

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

int UO.LastStatusX();

Возвращает сохранённую координату X объекта последнего принятого статуса.

Параметры

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

Возвращает

int — сохранённая координата X, не пиксель окна статуса и не bool. До первого статуса или после очистки мира — 0; сама координата 0 тоже допустима. Проверяйте UO.LastStatus() для отличия отсутствия записи.

Поведение

  • Без параметров. Чтение не отправляет пакеты, не открывает окно и не ждёт ответа. UO.GetStatus(id), RequestStats и UpdateObject лишь запрашивают данные: отправка не меняет LastStatus.
  • Принятый пакет 0x11 сохраняет serial и известные клиенту X/Y вместе в World для всех скриптов. Неизвестный/уничтоженный объект и неполный базовый пакет не заменяют запись. Последующие пакеты других объектов могут её заменить.
  • X/Y — снимок Entity на момент получения, а не текущая позиция. Для mobile это мировые клетки; для предмета внутри контейнера это могут быть координаты содержимого. Пакет статуса сам не передаёт X/Y. Перемещение/удаление объекта после приёма не меняет снимок; World.Clear сбрасывает его. Для текущих координат существующего объекта используйте GetX/GetY.
  • Отдельные вызовы не образуют атомарный снимок; сервер может обновить запись между ними. Равенство serial не доказывает новый ответ именно на ваш запрос. laststatus без скобок — живое встроенное значение, если скрипт не переопределил его переменной; UO.LastStatus() — зарегистрированная функция.

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

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

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

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

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

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

1. Прочитать последнее значение — прямой скрипт

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

  • Значение читается один раз. Для serial HEX сохраняет удобную шестнадцатеричную запись; для координаты Convert.ToString выводит число. Вызов не выбирает объект.
var value = UO.LastStatusX();
UO.Print("Saved value: " + Convert.ToString(value));

2. Запросить статус и прочитать известные данные — функция сценария

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

  • subject — serial self. 500 — пауза в миллисекундах, выбранная только для примера. Она не гарантирует ответа: показана текущая запись, которая могла остаться старой или принадлежать другому объекту.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var subject = UO.Self();
    if (Truth(subject != 0))
    {
        UO.GetStatus(subject);
        await Delay(500);
        var value = UO.LastStatusX();
        UO.Print("Known value: " + Convert.ToString(value));
    }

    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;

3. Полный помощник ReadSavedStatus — класс сценария

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

  • expectedId — serial, сохранённый в Main. Помощник полностью определён ниже; -1 означает, что выбранной записи уже нет, и не является результатом самой команды. Проверка до/после снижает риск смешения объектов, но не гарантирует атомарность при обновлениях того же serial.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var expectedId = UO.LastStatus();
        if (Truth(expectedId != 0))
        {
            var value = ReadSavedStatus(expectedId);
            UO.Print("Checked value: " + Convert.ToString(value));
        }

        return null;
    }

    dynamic ReadSavedStatus(dynamic expectedId)
    {
        if (Truth(expectedId == 0) || Truth(UO.LastStatus() != expectedId))
        {
            return -1;
        }

        var value = UO.LastStatusX();
        if (Truth(UO.LastStatus() != expectedId))
        {
            return -1;
        }

        return value;
    }

    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.LastStatusX() — UO.LastStatusX()

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

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

При вызове:

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

public int LastStatusX() => bridge is IStatusSnapshotBridge snapshot ? snapshot.LastStatusX : bridge.GetX(bridge.LastStatus);

UO.LastStatusY

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

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

int UO.LastStatusY();

Возвращает сохранённую координату Y объекта последнего принятого статуса.

Параметры

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

Возвращает

int — сохранённая координата Y, не пиксель окна статуса и не bool. До первого статуса или после очистки мира — 0; сама координата 0 тоже допустима. Проверяйте UO.LastStatus() для отличия отсутствия записи.

Поведение

  • Без параметров. Чтение не отправляет пакеты, не открывает окно и не ждёт ответа. UO.GetStatus(id), RequestStats и UpdateObject лишь запрашивают данные: отправка не меняет LastStatus.
  • Принятый пакет 0x11 сохраняет serial и известные клиенту X/Y вместе в World для всех скриптов. Неизвестный/уничтоженный объект и неполный базовый пакет не заменяют запись. Последующие пакеты других объектов могут её заменить.
  • X/Y — снимок Entity на момент получения, а не текущая позиция. Для mobile это мировые клетки; для предмета внутри контейнера это могут быть координаты содержимого. Пакет статуса сам не передаёт X/Y. Перемещение/удаление объекта после приёма не меняет снимок; World.Clear сбрасывает его. Для текущих координат существующего объекта используйте GetX/GetY.
  • Отдельные вызовы не образуют атомарный снимок; сервер может обновить запись между ними. Равенство serial не доказывает новый ответ именно на ваш запрос. laststatus без скобок — живое встроенное значение, если скрипт не переопределил его переменной; UO.LastStatus() — зарегистрированная функция.

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

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

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

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

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

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

1. Прочитать последнее значение — прямой скрипт

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

  • Значение читается один раз. Для serial HEX сохраняет удобную шестнадцатеричную запись; для координаты Convert.ToString выводит число. Вызов не выбирает объект.
var value = UO.LastStatusY();
UO.Print("Saved value: " + Convert.ToString(value));

2. Запросить статус и прочитать известные данные — функция сценария

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

  • subject — serial self. 500 — пауза в миллисекундах, выбранная только для примера. Она не гарантирует ответа: показана текущая запись, которая могла остаться старой или принадлежать другому объекту.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var subject = UO.Self();
    if (Truth(subject != 0))
    {
        UO.GetStatus(subject);
        await Delay(500);
        var value = UO.LastStatusY();
        UO.Print("Known value: " + Convert.ToString(value));
    }

    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;

3. Полный помощник ReadSavedStatus — класс сценария

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

  • expectedId — serial, сохранённый в Main. Помощник полностью определён ниже; -1 означает, что выбранной записи уже нет, и не является результатом самой команды. Проверка до/после снижает риск смешения объектов, но не гарантирует атомарность при обновлениях того же serial.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var expectedId = UO.LastStatus();
        if (Truth(expectedId != 0))
        {
            var value = ReadSavedStatus(expectedId);
            UO.Print("Checked value: " + Convert.ToString(value));
        }

        return null;
    }

    dynamic ReadSavedStatus(dynamic expectedId)
    {
        if (Truth(expectedId == 0) || Truth(UO.LastStatus() != expectedId))
        {
            return -1;
        }

        var value = UO.LastStatusY();
        if (Truth(UO.LastStatus() != expectedId))
        {
            return -1;
        }

        return value;
    }

    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.LastStatusY() — UO.LastStatusY()

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

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

При вызове:

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

public int LastStatusY() => bridge is IStatusSnapshotBridge snapshot ? snapshot.LastStatusY : bridge.GetY(bridge.LastStatus);

UO.Life

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

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

dynamic UO.Life();

Читает текущее здоровье из локальной модели.

Параметры

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

Возвращает

int — значение поля Hits, не процент и не bool. 0 бывает настоящим значением или признаком отсутствующих данных. Нулевой максимум нельзя использовать как делитель. У чужого mobile значения могут быть неизвестны. HP/HitsMax могут содержать относительную шкалу сервера вместо точных очков. HP=0 не доказывает смерть; для этого есть Dead/IsDead.

Поведение

  • Команда не открывает status и не запрашивает обновление сервера. Клиент только читает уже загруженные данные. Не меняет характеристики и не отправляет пакеты.
  • Результат — отдельное чтение. Мир может измениться между Exists и следующим вызовом; несколько запросов не образуют атомарный снимок.
  • При чтении объекта World.Get отвергает отсутствующий или IsDestroyed и получается 0. HP/HitsMax читаются у Entity, включая предметы с этими полями; Mana/Stamina — только у Mobile. Без аргумента читается self. Одноимённый вариант без параметров не обязательно имеет вариант с ID: смотрите сигнатуры.
  • Чтение без аргументов тоже возвращает 0 для отсутствующего или уничтоженного Player. Это относится и к прямым Mana/Stamina и их максимумам, а не только к формам через World.Get. Присутствующий мёртвый персонаж может сохранять значения.

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

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

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

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

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

object? result = UO.Life();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Вывести значение своего персонажа — прямой скрипт

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

  • Вызов без аргументов читает self. value сохраняет одно число, Convert.ToString преобразует его только для сообщения.
var value = UO.Life();
UO.Print("Life: " + Convert.ToString(value));

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

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

  • Показан прикладной порог или расчёт для этого поля. Числа в условии — настройки примера, не пределы сервера. Перед делением на максимум проверяется его положительность.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.Life();
    var maximum = UO.GetMaxHP();
    if (Truth(maximum > 0) && Truth(value * 100 / maximum < 50))
    {
        UO.Print("Health below half of the known maximum");
    }

    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. Полная вспомогательная функция ReadValue — класс сценария

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

  • У этого имени нет формы с ID. ReadValue без параметров читает self; два вызова разделены 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();
        await Delay(1000);
        var after = ReadValue();
        UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        return null;
    }

    dynamic ReadValue()
    {
        return UO.Life();
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}

Реализация команды

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.Life() — UO.Life()

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

Результат: dynamic / Any.

При вызове:

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

case "life": return new InjectionValue(bridge.GetHP(bridge.Self));

UO.Luck

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

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

int UO.Luck();

Читает счётчик статуса своего персонажа: очки удачи.

Параметры

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

Возвращает

int — очки удачи, 0..65535 в модели клиента. 0 может быть реальным значением, отсутствием данных либо отсутствующим/уничтоженным Player. Это количество, не bool, ID или type: 1 означает одну единицу, а не успех. Команда не перебирает объекты и не возвращает массив.

Поведение

  • Команда не принимает аргументов. Используйте точные сигнатуры выше.
  • Чтение в игровом потоке берёт Player.Luck, если текущий Player существует и не уничтожен; иначе 0. Экипировка не перебирается, бонусы не пересчитываются, статус не запрашивается, ожидания обновления нет. Присутствующий призрак не равен уничтоженному Player.
  • Luck читает серверные очки удачи, сохранённые как UInt16, из статуса type >= 4. Это не процент, случайное число или гарантия качества добычи. При чтении клиент не вычисляет шанс выпадения и не прибавляет бонусы экипировки.
  • CharacterStatus проверяет обязательное тело до обновления. Weight есть в собственном расширенном статусе, слоты — с type 3, Luck — с type 4, серверный WeightMax — с type 5. Компактный/старый пакет без необязательного счётчика оставляет его предыдущий кэш. Новый Player начинает с нулей; вызов не доказывает получение свежего статуса.
  • Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды. C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
  • Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.

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

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

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

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

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

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

1. Вывести сохранённый счётчик — прямой скрипт

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

  • value хранит один вызов без аргументов для собственного персонажа; Convert.ToString форматирует число для журнала, не меняя его смысл.
var value = UO.Luck();
UO.Print("Luck: " + Convert.ToString(value));

2. Наблюдать изменение — функция сценария

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

  • UO.Wait(500) разделяет before и after на 500 миллисекунд. difference может быть положительной, нулевой или отрицательной; промежуточные обновления и смена персонажа могут быть пропущены. Пауза относится к примеру.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.Luck();
    await Delay(500);
    var after = UO.Luck();
    var difference = after - before;
    UO.Print("Counter change: " + Convert.ToString(difference));
    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));

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

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

  • LuckAtLeast(minimum) получает числовое требование; 1000 — пример, не предел или процент. Отвергает отсутствие Player, один раз читает удачу и возвращает bool: true либо false по value >= minimum. Сама удача не bool. Сравниваются кэшированные очки, выпадение добычи не предсказывается.
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(Truth(LuckAtLeast(1000)) == true))
        {
            UO.Print("Local check passed");
        }
        else
        {
            UO.Print("Local check failed or data unavailable");
        }

        return null;
    }

    dynamic LuckAtLeast(dynamic minimum)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var value = UO.Luck();
        return value >= minimum;
    }

    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.Luck() — UO.Luck()

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

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

При вызове:

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

case "luck": return new InjectionValue(bridge.Luck);

UO.Mana

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

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

dynamic UO.Mana();

Читает текущую ману из локальной модели.

Параметры

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

Возвращает

int — значение поля Mana, не процент и не bool. 0 бывает настоящим значением или признаком отсутствующих данных. Нулевой максимум нельзя использовать как делитель. У чужого mobile значения могут быть неизвестны. HP/HitsMax могут содержать относительную шкалу сервера вместо точных очков. HP=0 не доказывает смерть; для этого есть Dead/IsDead.

Поведение

  • Команда не открывает status и не запрашивает обновление сервера. Клиент только читает уже загруженные данные. Не меняет характеристики и не отправляет пакеты.
  • Результат — отдельное чтение. Мир может измениться между Exists и следующим вызовом; несколько запросов не образуют атомарный снимок.
  • При чтении объекта World.Get отвергает отсутствующий или IsDestroyed и получается 0. HP/HitsMax читаются у Entity, включая предметы с этими полями; Mana/Stamina — только у Mobile. Без аргумента читается self. Одноимённый вариант без параметров не обязательно имеет вариант с ID: смотрите сигнатуры.
  • Чтение без аргументов тоже возвращает 0 для отсутствующего или уничтоженного Player. Это относится и к прямым Mana/Stamina и их максимумам, а не только к формам через World.Get. Присутствующий мёртвый персонаж может сохранять значения.

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

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

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

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

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

object? result = UO.Mana();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Вывести значение своего персонажа — прямой скрипт

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

  • Вызов без аргументов читает self. value сохраняет одно число, Convert.ToString преобразует его только для сообщения.
var value = UO.Mana();
UO.Print("Mana: " + Convert.ToString(value));

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

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

  • Показан прикладной порог или расчёт для этого поля. Числа в условии — настройки примера, не пределы сервера. Перед делением на максимум проверяется его положительность.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.Mana();
    if (Truth(value >= 10))
    {
        UO.Print("At least ten mana points are known");
    }

    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. Полная вспомогательная функция ReadValue — класс сценария

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

  • У этого имени нет формы с ID. ReadValue без параметров читает self; два вызова разделены 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();
        await Delay(1000);
        var after = ReadValue();
        UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        return null;
    }

    dynamic ReadValue()
    {
        return UO.Mana();
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}

Реализация команды

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.Mana() — UO.Mana()

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

Результат: dynamic / Any.

При вызове:

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

case "mana": return new InjectionValue(bridge.Mana);

UO.MaxHP

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

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

int UO.MaxHP();

Читает максимальное здоровье из локальной модели.

Параметры

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

Возвращает

int — значение поля HitsMax, не процент и не bool. 0 бывает настоящим значением или признаком отсутствующих данных. Нулевой максимум нельзя использовать как делитель. У чужого mobile значения могут быть неизвестны. HP/HitsMax могут содержать относительную шкалу сервера вместо точных очков. HP=0 не доказывает смерть; для этого есть Dead/IsDead.

Поведение

  • Команда не открывает status и не запрашивает обновление сервера. Клиент только читает уже загруженные данные. Не меняет характеристики и не отправляет пакеты.
  • Результат — отдельное чтение. Мир может измениться между Exists и следующим вызовом; несколько запросов не образуют атомарный снимок.
  • При чтении объекта World.Get отвергает отсутствующий или IsDestroyed и получается 0. HP/HitsMax читаются у Entity, включая предметы с этими полями; Mana/Stamina — только у Mobile. Без аргумента читается self. Одноимённый вариант без параметров не обязательно имеет вариант с ID: смотрите сигнатуры.
  • Чтение без аргументов тоже возвращает 0 для отсутствующего или уничтоженного Player. Это относится и к прямым Mana/Stamina и их максимумам, а не только к формам через World.Get. Присутствующий мёртвый персонаж может сохранять значения.

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

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

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

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

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

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

1. Вывести значение своего персонажа — прямой скрипт

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

  • Вызов без аргументов читает self. value сохраняет одно число, Convert.ToString преобразует его только для сообщения.
var value = UO.MaxHP();
UO.Print("MaxHP: " + Convert.ToString(value));

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

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

  • Показан прикладной порог или расчёт для этого поля. Числа в условии — настройки примера, не пределы сервера. Перед делением на максимум проверяется его положительность.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.MaxHP();
    if (Truth(value > 0))
    {
        UO.Print("Known HP percent: " + Convert.ToString(UO.GetHP() * 100 / value));
    }
    else
    {
        UO.Print("HP maximum unavailable");
    }

    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. Полная вспомогательная функция ReadValue — класс сценария

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

  • У этого имени нет формы с ID. ReadValue без параметров читает self; два вызова разделены 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();
        await Delay(1000);
        var after = ReadValue();
        UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        return null;
    }

    dynamic ReadValue()
    {
        return UO.MaxHP();
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}

Реализация команды

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.MaxHP() — UO.MaxHP()

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

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

При вызове:

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

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

() => bridge.GetMaxHP(bridge.Self)

Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.


UO.MaxLife

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

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

dynamic UO.MaxLife();

Читает максимальное здоровье из локальной модели.

Параметры

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

Возвращает

int — значение поля HitsMax, не процент и не bool. 0 бывает настоящим значением или признаком отсутствующих данных. Нулевой максимум нельзя использовать как делитель. У чужого mobile значения могут быть неизвестны. HP/HitsMax могут содержать относительную шкалу сервера вместо точных очков. HP=0 не доказывает смерть; для этого есть Dead/IsDead.

Поведение

  • Команда не открывает status и не запрашивает обновление сервера. Клиент только читает уже загруженные данные. Не меняет характеристики и не отправляет пакеты.
  • Результат — отдельное чтение. Мир может измениться между Exists и следующим вызовом; несколько запросов не образуют атомарный снимок.
  • При чтении объекта World.Get отвергает отсутствующий или IsDestroyed и получается 0. HP/HitsMax читаются у Entity, включая предметы с этими полями; Mana/Stamina — только у Mobile. Без аргумента читается self. Одноимённый вариант без параметров не обязательно имеет вариант с ID: смотрите сигнатуры.
  • Чтение без аргументов тоже возвращает 0 для отсутствующего или уничтоженного Player. Это относится и к прямым Mana/Stamina и их максимумам, а не только к формам через World.Get. Присутствующий мёртвый персонаж может сохранять значения.

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

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

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

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

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

object? result = UO.MaxLife();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Вывести значение своего персонажа — прямой скрипт

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

  • Вызов без аргументов читает self. value сохраняет одно число, Convert.ToString преобразует его только для сообщения.
var value = UO.MaxLife();
UO.Print("MaxLife: " + Convert.ToString(value));

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

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

  • Показан прикладной порог или расчёт для этого поля. Числа в условии — настройки примера, не пределы сервера. Перед делением на максимум проверяется его положительность.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.MaxLife();
    if (Truth(value > 0))
    {
        UO.Print("Known HP percent: " + Convert.ToString(UO.GetHP() * 100 / value));
    }
    else
    {
        UO.Print("HP maximum unavailable");
    }

    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. Полная вспомогательная функция ReadValue — класс сценария

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

  • У этого имени нет формы с ID. ReadValue без параметров читает self; два вызова разделены 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();
        await Delay(1000);
        var after = ReadValue();
        UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        return null;
    }

    dynamic ReadValue()
    {
        return UO.MaxLife();
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}

Реализация команды

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.MaxLife() — UO.MaxLife()

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

Результат: dynamic / Any.

При вызове:

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

case "maxlife": return new InjectionValue(bridge.GetMaxHP(bridge.Self));

UO.MaxMana

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

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

dynamic UO.MaxMana();

Читает максимальную ману из локальной модели.

Параметры

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

Возвращает

int — значение поля ManaMax, не процент и не bool. 0 бывает настоящим значением или признаком отсутствующих данных. Нулевой максимум нельзя использовать как делитель. У чужого mobile значения могут быть неизвестны. HP/HitsMax могут содержать относительную шкалу сервера вместо точных очков. HP=0 не доказывает смерть; для этого есть Dead/IsDead.

Поведение

  • Команда не открывает status и не запрашивает обновление сервера. Клиент только читает уже загруженные данные. Не меняет характеристики и не отправляет пакеты.
  • Результат — отдельное чтение. Мир может измениться между Exists и следующим вызовом; несколько запросов не образуют атомарный снимок.
  • При чтении объекта World.Get отвергает отсутствующий или IsDestroyed и получается 0. HP/HitsMax читаются у Entity, включая предметы с этими полями; Mana/Stamina — только у Mobile. Без аргумента читается self. Одноимённый вариант без параметров не обязательно имеет вариант с ID: смотрите сигнатуры.
  • Чтение без аргументов тоже возвращает 0 для отсутствующего или уничтоженного Player. Это относится и к прямым Mana/Stamina и их максимумам, а не только к формам через World.Get. Присутствующий мёртвый персонаж может сохранять значения.

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

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

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

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

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

object? result = UO.MaxMana();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Вывести значение своего персонажа — прямой скрипт

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

  • Вызов без аргументов читает self. value сохраняет одно число, Convert.ToString преобразует его только для сообщения.
var value = UO.MaxMana();
UO.Print("MaxMana: " + Convert.ToString(value));

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

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

  • Показан прикладной порог или расчёт для этого поля. Числа в условии — настройки примера, не пределы сервера. Перед делением на максимум проверяется его положительность.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.MaxMana();
    if (Truth(value > 0))
    {
        UO.Print("Mana percent: " + Convert.ToString(UO.Mana() * 100 / 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. Полная вспомогательная функция ReadValue — класс сценария

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

  • У этого имени нет формы с ID. ReadValue без параметров читает self; два вызова разделены 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();
        await Delay(1000);
        var after = ReadValue();
        UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        return null;
    }

    dynamic ReadValue()
    {
        return UO.MaxMana();
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}

Реализация команды

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.MaxMana() — UO.MaxMana()

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

Результат: dynamic / Any.

При вызове:

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

case "maxmana": return new InjectionValue(bridge.MaxMana);

UO.MaxStam

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

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

dynamic UO.MaxStam();

Читает максимальную выносливость из локальной модели.

Параметры

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

Возвращает

int — значение поля StaminaMax, не процент и не bool. 0 бывает настоящим значением или признаком отсутствующих данных. Нулевой максимум нельзя использовать как делитель. У чужого mobile значения могут быть неизвестны. HP/HitsMax могут содержать относительную шкалу сервера вместо точных очков. HP=0 не доказывает смерть; для этого есть Dead/IsDead.

Поведение

  • Команда не открывает status и не запрашивает обновление сервера. Клиент только читает уже загруженные данные. Не меняет характеристики и не отправляет пакеты.
  • Результат — отдельное чтение. Мир может измениться между Exists и следующим вызовом; несколько запросов не образуют атомарный снимок.
  • При чтении объекта World.Get отвергает отсутствующий или IsDestroyed и получается 0. HP/HitsMax читаются у Entity, включая предметы с этими полями; Mana/Stamina — только у Mobile. Без аргумента читается self. Одноимённый вариант без параметров не обязательно имеет вариант с ID: смотрите сигнатуры.
  • Чтение без аргументов тоже возвращает 0 для отсутствующего или уничтоженного Player. Это относится и к прямым Mana/Stamina и их максимумам, а не только к формам через World.Get. Присутствующий мёртвый персонаж может сохранять значения.

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

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

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

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

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

object? result = UO.MaxStam();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Вывести значение своего персонажа — прямой скрипт

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

  • Вызов без аргументов читает self. value сохраняет одно число, Convert.ToString преобразует его только для сообщения.
var value = UO.MaxStam();
UO.Print("MaxStam: " + Convert.ToString(value));

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

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

  • Показан прикладной порог или расчёт для этого поля. Числа в условии — настройки примера, не пределы сервера. Перед делением на максимум проверяется его положительность.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.MaxStam();
    if (Truth(value > 0))
    {
        UO.Print("Stamina percent: " + Convert.ToString(UO.Stamina() * 100 / 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. Полная вспомогательная функция ReadValue — класс сценария

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

  • У этого имени нет формы с ID. ReadValue без параметров читает self; два вызова разделены 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();
        await Delay(1000);
        var after = ReadValue();
        UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        return null;
    }

    dynamic ReadValue()
    {
        return UO.MaxStam();
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}

Реализация команды

C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

UO.MaxStam() — UO.MaxStam()

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

Результат: dynamic / Any.

При вызове:

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

case "maxstam": return new InjectionValue(bridge.MaxStamina);
⚠️ **GitHub.com Fallback** ⚠️