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

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

Характер — 2

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

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

1 · 2 · 3 · 4 · 5

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


UO.GetEquipment

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

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

dynamic UO.GetEquipment(object? id);

Читает список экипировки на ненулевых слоях объекта.

Параметры

  • id — Serial/ID конкретного объекта: int, десятичная/hex-строка или установленный алиас self, backpack, lasttarget, lastobject либо имя AddObject. Это не graphic/type. Строки my/backpack выбирают рюкзак. Только явные 0, "0" или "ground" выбирают землю. Неизвестный алиас, отсутствующий рюкзак, отрицательный ID или неподходящий вид значения дают пустой массив.

Возвращает

Array — serial каждого предмета, у которого Container равен ID и Layer не равен Invalid. Для ground/0 возвращается пустой Array. Без записей возвращается пустой Array. Список содержит ID, не type и не слои.

Поведение

  • Читаются данные, уже загруженные клиентом. Команда не открывает контейнер, не перемещает предметы и не загружает объекты со всего сервера.
  • Array — массив с индексами от 0. Сохраняйте его в var, проверяйте ArrayLength перед доступом. Элементы могут исчезнуть из мира после создания снимка: перед действием проверяйте Exists(serial).
  • Нет рекурсивного обхода вложенных сумок, сортировки по расстоянию, фильтра Ignore или FindDistance/FindVertical. Снимок обычного FindType не меняется.
  • GetEquipment(self) включает рюкзак и другие известные ненулевые слои; сам факт слоя не означает оружие или надеваемую броню. GetContent(self) может включать экипировку, поскольку её родитель — персонаж.

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

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

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

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

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

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

1. Получить размер списка — прямой скрипт

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

  • ID="self" — текущий персонаж, отбираются его прямые предметы с ненулевым Layer.
  • Длина — число записей/ID. Это не сумма Amount в стопках. Пустой список даёт 0.
var items = UO.GetEquipment("self");
UO.Print(Convert.ToString(ArrayLength(items)));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

2. Обойти все найденные ID — функция сценария

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

  • ID="self" — текущий персонаж, отбираются его прямые предметы с ненулевым Layer.
  • items[i] — числовой serial. Hex используется только для вывода. Цикл не обращается за последним индексом.
return  RunScenario();
 object? RunScenario()
{
    var items = UO.GetEquipment("self");
    var i = 0;
    while (Truth(i < ArrayLength(items)))
    {
        UO.Print("0x" + Hex(items[i]));
        i = i + 1;
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
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. Проверить первую запись перед чтением — класс сценария

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

  • ID="self" — текущий персонаж, отбираются его прямые предметы с ненулевым Layer.
  • Проверяются две разные вещи: запись в снимке и существование объекта сейчас. Порядок без явной сортировки не означает близость.
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 items = UO.GetEquipment("self");
        if (Truth(ArrayLength(items) > 0))
        {
            var first = items[0];
            if (Truth(UO.Exists(first)))
            {
                UO.Print(UO.GetName(first));
            }
        }
        else
        {
            UO.Print("Empty list");
        }

        return null;
    }

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

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

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

UO.GetEquipment(id) — UO.GetEquipment(Any)

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

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

При вызове:

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

case "getcontent":

                case "getequipment":

                {

                    InjectionValue selection = arguments[0];

                    bool ground = false, explicitZero;

                    int container;

                    if (selection.Kind == InjectionValueKind.String)

                    {

                        string text = Text(0).Trim();

                        ground = text.Equals("ground", StringComparison.OrdinalIgnoreCase);

                        explicitZero = NumberConversions.TryStr2Int(text, out int literal) && literal == 0;

                        container = ground ? 0 : text.Equals("my", StringComparison.OrdinalIgnoreCase)

                            ? bridge.Backpack : GetObject(text);

                    }

                    else

                    {

                        if (selection.Kind != InjectionValueKind.Integer && selection.Kind != InjectionValueKind.Decimal)

                            return new InjectionValue(Array.Empty<InjectionValue>());

                        container = Arg(0);

                        explicitZero = selection.Kind == InjectionValueKind.Integer ? selection.Integer == 0 : selection.Decimal == 0d;

                    }

                    // Only an explicit ground/zero selector may query world items.

                    if (container < 0 || container == 0 && !ground && !explicitZero)

                        return new InjectionValue(Array.Empty<InjectionValue>());

                    bool equipment = name.Equals("GetEquipment", StringComparison.OrdinalIgnoreCase);

                    int[] items = equipment

                        ? container == 0 ? Array.Empty<int>() : bridge.GetEquipment(container)

                        : bridge.GetContent(container);

                    return new InjectionValue(items.Select(serial => new InjectionValue(serial)).ToArray());

                }

UO.GetFireResist

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

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

int UO.GetFireResist();

Читает поле сопротивления текущего персонажа: огонь.

Параметры

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

Возвращает

int — знаковое значение статуса, -32768..32767 в модели клиента. Отрицательное значение сохраняется. 0 бывает реальным сопротивлением, отсутствием данных либо отсутствующим/уничтоженным Player; GetResist также даёт 0 для неизвестного селектора. Это не bool, ID, навык или предел сопротивления. 1 означает один пункт, а не успешное выполнение.

Поведение

  • Команда не принимает аргументов. Используйте точные сигнатуры выше.
  • Чтение в игровом потоке берёт Player.FireResistance, если текущий Player существует и не уничтожен; иначе 0. Экипировка не перебирается, бонусы не пересчитываются, статус не запрашивается, ожидания обновления нет. Присутствующий призрак не равен уничтоженному Player.
  • Стихийные поля приходят в расширенном CharacterStatus (0x11), type >= 4. Сама команда не проверяет эпоху сервера. Компактный/старый статус без этих полей оставляет предыдущий кэш; у нового Player исходно 0. Сопротивление яду не является флагом Poisoned; это также не навык Resisting Spells.
  • CharacterStatus проверяет обязательное тело до изменения имени, здоровья и собственных характеристик, затем переводит каждое слово сопротивления в знаковый Int16. Обрезанное обязательное тело не меняет прежние данные. Необязательный хвост type 6 сохраняет прежние правила; команды сопротивлений не читают из него максимальные пределы.
  • Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.
  • Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды. C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • minimum=50 — пример требования, не предел клиента. ResistanceAtLeast отвергает отсутствующий 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(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

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

        var value = UO.GetFireResist();
        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.GetFireResist() — UO.GetFireResist()

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

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

При вызове:

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

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

() => bridge.FireResistance

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


UO.GetFlying

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

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

int UO.GetFlying();
int UO.GetFlying(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.GetFlying();
UO.Print("GetFlying: " + Convert.ToString(result));

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

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

  • Пустые скобки означают self. true равен 1, false равен 0; if UO.Flying() { ... } допустим. Этот пример ничего не переключает.
var active = UO.GetFlying();
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.GetFlying(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.GetFlying()))
        {
            return true;
        }

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

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

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

        return UO.GetFlying();
    }

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

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

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

При вызове:

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

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

serial => bridge.Flying(serial)

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

() => getter(bridge.Self)

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

UO.GetFlying(value) — UO.GetFlying(Any)

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

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

При вызове:

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

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

serial => bridge.Flying(serial)

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

value => getter(GetObject(value))

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


UO.GetFrozen

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

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

int UO.GetFrozen();
int UO.GetFrozen(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.GetFrozen();
UO.Print("GetFrozen: " + Convert.ToString(result));

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

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

  • Пустые скобки выбирают self. state сохраняет один снимок флага; true — числовая константа 1.
  • Результат false не исключает стену, отсутствие выносливости или другую причину остановки.
var state = UO.GetFrozen();
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.GetFrozen(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.GetFrozen()) == true) && Truth(attempts < 10))
        {
            await Delay(100);
            attempts = attempts + 1;
        }

        if (Truth(UO.IsNPC("self")))
        {
            if (Truth(Truth(UO.GetFrozen()) == 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.GetFrozen() — UO.GetFrozen()

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

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

При вызове:

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

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

serial => bridge.GetLocked(serial)

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

() => getter(bridge.Self)

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

UO.GetFrozen(value) — UO.GetFrozen(Any)

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

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

При вызове:

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

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

serial => bridge.GetLocked(serial)

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

value => getter(GetObject(value))

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


UO.GetGold

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

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

dynamic UO.GetGold();

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

Параметры

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

Возвращает

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.GetGold();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

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

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

  • amount хранит один результат; Convert.ToString форматирует его для журнала. Золото не ищется, не переносится и не тратится.
var amount = UO.GetGold();
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.GetGold();
    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.GetGold();
        await Delay(500);
        var after = UO.GetGold();
        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.GetGold() — UO.GetGold()

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

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

При вызове:

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

private InjectionValue ReadGoldValue()

        {

            // The existing bridge carries all 32 unsigned status-counter bits in

            // an Int32. Keep small results Integer; Double exactly represents

            // every UInt32 and avoids returning a negative large gold amount.

            uint amount = unchecked((uint)bridge.Gold);

            return amount <= int.MaxValue ? new InjectionValue((int)amount)

                : new InjectionValue((double)amount);

        }

UO.GetHP

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

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

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

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

Параметры

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

Возвращает

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. Присутствующий мёртвый персонаж может сохранять значения.

Пример .csx

int hp = UO.GetHP();
UO.Print($"HP = {hp}");

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

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

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

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

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

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

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

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

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

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

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

  • Показан прикладной порог или расчёт для этого поля. Числа в условии — настройки примера, не пределы сервера. Перед делением на максимум проверяется его положительность.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetHP();
    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 — класс сценария

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

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

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

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

При вызове:

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

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

UO.GetHP(id) — UO.GetHP(Any)

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

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

При вызове:

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

case "gethp": return new InjectionValue(bridge.GetHP(Arg(0, bridge.Self)));

UO.GetHP(id) — UO.GetHP(Integer)

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

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

При вызове:

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

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

UO.GetHP(id) — UO.GetHP(String)

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

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

При вызове:

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

public int GetHP(string id) => GetHP(GetObject(id));

UO.GetHidden

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

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

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

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

Параметры

  • value — Необязательный объект в показанных формах: 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.GetHidden();
UO.Print("GetHidden: " + Convert.ToString(result));

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

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

  • Пустые скобки читают self. active сохраняет результат один раз; true и false задают две ветви. Print только выводит пример сообщения.
var active = UO.GetHidden();
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.GetHidden(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.GetHidden();
        await Delay(500);
        var after = UO.GetHidden();
        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.GetHidden() — UO.GetHidden()

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

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

При вызове:

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

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

serial => bridge.Hidden(serial)

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

() => getter(bridge.Self)

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

UO.GetHidden(value) — UO.GetHidden(Any)

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

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

При вызове:

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

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

serial => bridge.Hidden(serial)

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

value => getter(GetObject(value))

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


UO.GetInt

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

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

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

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

Параметры

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

Возвращает

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

Поведение

  • Поддерживаются () для self и (ObjID) для явного объекта. Других необязательных аргументов нет.
  • Читает 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().
  • ExecuteClientApiCompatibility.Arg сначала разрешает имя объекта, затем преобразует число. Неизвестная нечисловая строка вызывает ошибку преобразования, не прицел. double приводится к int, Array/void — к 0. Для выбора персонажа используйте корректный serial, не такие преобразования.

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

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

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

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

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

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

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

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

  • value сохраняет числовой результат; Convert.ToString лишь форматирует его для журнала. Аргументов и действия персонажа нет.
var value = UO.GetInt();
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.GetInt();
    await Delay(1000);
    var after = UO.GetInt();
    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.GetInt();
        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.GetInt(id);
    var byName = UO.GetInt("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.GetInt() — UO.GetInt()

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

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

При вызове:

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

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

() => bridge.Intelligence

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

UO.GetInt(objID) — UO.GetInt(Any)

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

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

При вызове:

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

case "getint": return new InjectionValue(arguments.Length > 0 ? bridge.GetIntelligence(Arg(0)) : bridge.Intelligence);

UO.GetIntelligence

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

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

int UO.GetIntelligence();

Читает текущий интеллект (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.GetIntelligence();
UO.Print("GetIntelligence: " + Convert.ToString(result));

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

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

  • value сохраняет числовой результат; Convert.ToString лишь форматирует его для журнала. Аргументов и действия персонажа нет.
var value = UO.GetIntelligence();
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.GetIntelligence();
    await Delay(1000);
    var after = UO.GetIntelligence();
    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.GetIntelligence();
        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.GetIntelligence() — UO.GetIntelligence()

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

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

При вызове:

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

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

() => bridge.Intelligence

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


UO.GetLife

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

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

int UO.GetLife();

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

Параметры

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

Возвращает

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.GetLife();
UO.Print("GetLife: " + Convert.ToString(result));

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

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

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

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

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

  • Показан прикладной порог или расчёт для этого поля. Числа в условии — настройки примера, не пределы сервера. Перед делением на максимум проверяется его положительность.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetLife();
    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.GetLife();
    }

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

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

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

UO.GetLife() — UO.GetLife()

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

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

При вызове:

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

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

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

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


UO.GetLuck

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

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

int UO.GetLuck();

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

Параметры

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

Возвращает

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.GetLuck();
UO.Print("GetLuck: " + Convert.ToString(result));

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

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

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

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

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

  • UO.Wait(500) разделяет before и after на 500 миллисекунд. difference может быть положительной, нулевой или отрицательной; промежуточные обновления и смена персонажа могут быть пропущены. Пауза относится к примеру.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.GetLuck();
    await Delay(500);
    var after = UO.GetLuck();
    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.GetLuck();
        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.GetLuck() — UO.GetLuck()

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

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

При вызове:

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

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

() => bridge.Luck

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


UO.GetMana

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

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

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

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

Параметры

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

Возвращает

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; для массива показано количество элементов.

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

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

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

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

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

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

  • Показан прикладной порог или расчёт для этого поля. Числа в условии — настройки примера, не пределы сервера. Перед делением на максимум проверяется его положительность.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetMana();
    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 — класс сценария

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

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

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

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

При вызове:

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

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

() => bridge.Mana

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

UO.GetMana(objID) — UO.GetMana(Any)

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

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

При вызове:

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

case "getmana": return new InjectionValue(arguments.Length > 0 ? bridge.GetMana(Arg(0)) : bridge.Mana);

UO.GetMaxHP

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

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

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

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

Параметры

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

Возвращает

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.GetMaxHP();
UO.Print("GetMaxHP: " + Convert.ToString(result));

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

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

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

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

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

  • Показан прикладной порог или расчёт для этого поля. Числа в условии — настройки примера, не пределы сервера. Перед делением на максимум проверяется его положительность.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetMaxHP();
    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 — класс сценария

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

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

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

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

При вызове:

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

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

UO.GetMaxHP(id) — UO.GetMaxHP(Any)

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

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

При вызове:

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

case "getmaxhp": return new InjectionValue(bridge.GetMaxHP(Arg(0, bridge.Self)));

UO.GetMaxHP(id) — UO.GetMaxHP(Integer)

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

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

При вызове:

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

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

UO.GetMaxHP(id) — UO.GetMaxHP(String)

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

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

При вызове:

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

public int GetMaxHP(string id) => GetMaxHP(GetObject(id));

UO.GetMaxLife

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

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

int UO.GetMaxLife();

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

Параметры

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

Возвращает

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.GetMaxLife();
UO.Print("GetMaxLife: " + Convert.ToString(result));

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

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

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

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

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

  • Показан прикладной порог или расчёт для этого поля. Числа в условии — настройки примера, не пределы сервера. Перед делением на максимум проверяется его положительность.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetMaxLife();
    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.GetMaxLife();
    }

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

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

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

UO.GetMaxLife() — UO.GetMaxLife()

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

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

При вызове:

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

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

() => bridge.GetMaxHP(bridge.Self)

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


UO.GetMaxMana

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

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

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

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

Параметры

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

Возвращает

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; для массива показано количество элементов.

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

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

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

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

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

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

  • Показан прикладной порог или расчёт для этого поля. Числа в условии — настройки примера, не пределы сервера. Перед делением на максимум проверяется его положительность.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetMaxMana();
    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 — класс сценария

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

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

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

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

При вызове:

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

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

() => bridge.MaxMana

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

UO.GetMaxMana(objID) — UO.GetMaxMana(Any)

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

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

При вызове:

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

case "getmaxmana": return new InjectionValue(bridge.GetMaxMana(Arg(0, bridge.Self)));

UO.GetMaxStam

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

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

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

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

Параметры

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

Возвращает

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; для массива показано количество элементов.

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

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

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

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

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

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

  • Показан прикладной порог или расчёт для этого поля. Числа в условии — настройки примера, не пределы сервера. Перед делением на максимум проверяется его положительность.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetMaxStam();
    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 — класс сценария

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

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

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

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

При вызове:

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

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

() => bridge.MaxStamina

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

UO.GetMaxStam(objID) — UO.GetMaxStam(Any)

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

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

При вызове:

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

case "getmaxstam": return new InjectionValue(bridge.GetMaxStamina(Arg(0, bridge.Self)));

UO.GetMaxStamina

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

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

int UO.GetMaxStamina();

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

Параметры

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

Возвращает

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; для массива показано количество элементов.

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

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

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

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

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

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

  • Показан прикладной порог или расчёт для этого поля. Числа в условии — настройки примера, не пределы сервера. Перед делением на максимум проверяется его положительность.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetMaxStamina();
    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.GetMaxStamina();
    }

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

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

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

UO.GetMaxStamina() — UO.GetMaxStamina()

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

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

При вызове:

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

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

() => bridge.MaxStamina

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


UO.GetMaxWeight

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

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

int UO.GetMaxWeight();

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

Параметры

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

Возвращает

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

Поведение

  • Команда не принимает аргументов. Используйте точные сигнатуры выше.
  • Чтение в игровом потоке берёт Player.WeightMax, если текущий Player существует и не уничтожен; иначе 0. Экипировка не перебирается, бонусы не пересчитываются, статус не запрашивается, ожидания обновления нет. Присутствующий призрак не равен уничтоженному Player.
  • MaxWeight читает кэш WeightMax. Собственный статус type >= 5 задаёт серверный предел UInt16, даже если он равен 0. Старый расширенный статус вычисляет его один раз при приёме: протокол UO >= 5.0.0a — 7 * floor(Strength / 2) + 40; более старый — Strength * 4 + 25. Результат сохраняется как UInt16; крайние значения оборачиваются по модулю 65536. Strength=101 даёт соответственно 390 или 429. При отдельном изменении Strength сам getter предел не пересчитывает.
  • 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.GetMaxWeight();
UO.Print("GetMaxWeight: " + Convert.ToString(result));

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

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

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

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

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

  • UO.Wait(500) разделяет before и after на 500 миллисекунд. difference может быть положительной, нулевой или отрицательной; промежуточные обновления и смена персонажа могут быть пропущены. Пауза относится к примеру.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.GetMaxWeight();
    await Delay(500);
    var after = UO.GetMaxWeight();
    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.Weight();
        var maximum = UO.GetMaxWeight();
        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.GetMaxWeight() — UO.GetMaxWeight()

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

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

При вызове:

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

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

() => bridge.MaxWeight

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


UO.GetParalisa

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

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

int UO.GetParalisa();
int UO.GetParalisa(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.GetParalisa();
UO.Print("GetParalisa: " + Convert.ToString(result));

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

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

  • Пустые скобки выбирают self. state сохраняет один снимок флага; true — числовая константа 1.
  • Результат false не исключает стену, отсутствие выносливости или другую причину остановки.
var state = UO.GetParalisa();
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.GetParalisa(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.GetParalisa()) == true) && Truth(attempts < 10))
        {
            await Delay(100);
            attempts = attempts + 1;
        }

        if (Truth(UO.IsNPC("self")))
        {
            if (Truth(Truth(UO.GetParalisa()) == 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.GetParalisa() — UO.GetParalisa()

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

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

При вызове:

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

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

serial => bridge.GetLocked(serial)

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

() => getter(bridge.Self)

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

UO.GetParalisa(value) — UO.GetParalisa(Any)

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

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

При вызове:

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

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

serial => bridge.GetLocked(serial)

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

value => getter(GetObject(value))

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


UO.GetParalysed

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

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

int UO.GetParalysed();
int UO.GetParalysed(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.GetParalysed();
UO.Print("GetParalysed: " + Convert.ToString(result));

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

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

  • Пустые скобки выбирают self. state сохраняет один снимок флага; true — числовая константа 1.
  • Результат false не исключает стену, отсутствие выносливости или другую причину остановки.
var state = UO.GetParalysed();
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.GetParalysed(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.GetParalysed()) == true) && Truth(attempts < 10))
        {
            await Delay(100);
            attempts = attempts + 1;
        }

        if (Truth(UO.IsNPC("self")))
        {
            if (Truth(Truth(UO.GetParalysed()) == 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.GetParalysed() — UO.GetParalysed()

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

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

При вызове:

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

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

serial => bridge.GetLocked(serial)

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

() => getter(bridge.Self)

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

UO.GetParalysed(value) — UO.GetParalysed(Any)

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

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

При вызове:

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

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

serial => bridge.GetLocked(serial)

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

value => getter(GetObject(value))

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


UO.GetParalyzed

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

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

int UO.GetParalyzed();
int UO.GetParalyzed(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.GetParalyzed();
UO.Print("GetParalyzed: " + Convert.ToString(result));

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

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

  • Пустые скобки выбирают self. state сохраняет один снимок флага; true — числовая константа 1.
  • Результат false не исключает стену, отсутствие выносливости или другую причину остановки.
var state = UO.GetParalyzed();
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.GetParalyzed(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.GetParalyzed()) == true) && Truth(attempts < 10))
        {
            await Delay(100);
            attempts = attempts + 1;
        }

        if (Truth(UO.IsNPC("self")))
        {
            if (Truth(Truth(UO.GetParalyzed()) == 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.GetParalyzed() — UO.GetParalyzed()

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

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

При вызове:

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

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

serial => bridge.GetLocked(serial)

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

() => getter(bridge.Self)

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

UO.GetParalyzed(value) — UO.GetParalyzed(Any)

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

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

При вызове:

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

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

serial => bridge.GetLocked(serial)

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

value => getter(GetObject(value))

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


UO.GetPhysicalResist

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

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

int UO.GetPhysicalResist();

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

Параметры

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

Возвращает

int — знаковое значение статуса, -32768..32767 в модели клиента. Отрицательное значение сохраняется. 0 бывает реальным сопротивлением, отсутствием данных либо отсутствующим/уничтоженным Player; GetResist также даёт 0 для неизвестного селектора. Это не bool, ID, навык или предел сопротивления. 1 означает один пункт, а не успешное выполнение.

Поведение

  • Команда не принимает аргументов. Используйте точные сигнатуры выше.
  • Чтение в игровом потоке берёт Player.PhysicalResistance, если текущий Player существует и не уничтожен; иначе 0. Экипировка не перебирается, бонусы не пересчитываются, статус не запрашивается, ожидания обновления нет. Присутствующий призрак не равен уничтоженному Player.
  • PhysicalResistance — серверное поле брони/статуса: классический сервер может передавать рейтинг брони, а правила с сопротивлениями — физическое сопротивление. API не переводит одно в другое и не вычисляет процент снижения урона. Armor и физические псевдонимы читают одно поле.
  • CharacterStatus проверяет обязательное тело до изменения имени, здоровья и собственных характеристик, затем переводит каждое слово сопротивления в знаковый Int16. Обрезанное обязательное тело не меняет прежние данные. Необязательный хвост type 6 сохраняет прежние правила; команды сопротивлений не читают из него максимальные пределы.
  • Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.
  • Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды. C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • minimum=50 — пример требования, не предел клиента. ResistanceAtLeast отвергает отсутствующий 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(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

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

        var value = UO.GetPhysicalResist();
        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.GetPhysicalResist() — UO.GetPhysicalResist()

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

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

При вызове:

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

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

() => bridge.Armor

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


UO.GetPlayerStatusText

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

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

dynamic UO.GetPlayerStatusText(object? objID);

Формирует короткий текст имени и здоровья объекта.

Параметры

  • objID — Serial/ID конкретного объекта: int, десятичная/hex-строка или установленный алиас self, backpack, lasttarget, lastobject либо имя AddObject. Это не graphic/type.

Возвращает

string в формате "имя HP/MaxHP". Например "Raven 75/100". Для неизвестного объекта обычно " 0/0" с начальным пробелом. Это текст, а не структура, bool или открытый статус-гамп.

Поведение

  • Читаются GetName/GetHP/GetMaxHP без запроса обновления. Не разбирайте текст по пробелу для получения ID или HP: имя может содержать пробелы, для чисел используйте отдельные getter-команды.

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

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

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

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

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

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

1. Показать своё здоровье — прямой скрипт

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

  • ObjID=self — текущий персонаж.
  • Print показывает готовый текст в журнале.
UO.Print(UO.GetPlayerStatusText("self"));

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

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

  • ObjID=serial последней цели.
  • Exists предотвращает вывод неизвестного объекта как 0/0.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(target)))
    {
        UO.Print(UO.GetPlayerStatusText(target));
    }

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

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

  • 500 — миллисекунды между чтениями.
  • Сравнивается текст имени/HP, не все характеристики персонажа.
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.GetPlayerStatusText("self");
        await Delay(500);
        var after = UO.GetPlayerStatusText("self");
        if (Truth(before != after))
        {
            UO.Print(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.GetPlayerStatusText(objID) — UO.GetPlayerStatusText(Any)

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

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

При вызове:

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

case "getplayerstatustext": return new InjectionValue(bridge.GetName(Arg(0)) + " " + bridge.GetHP(Arg(0)) + "/" + bridge.GetMaxHP(Arg(0)));

UO.GetPoisonResist

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

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

int UO.GetPoisonResist();

Читает поле сопротивления текущего персонажа: яд.

Параметры

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

Возвращает

int — знаковое значение статуса, -32768..32767 в модели клиента. Отрицательное значение сохраняется. 0 бывает реальным сопротивлением, отсутствием данных либо отсутствующим/уничтоженным Player; GetResist также даёт 0 для неизвестного селектора. Это не bool, ID, навык или предел сопротивления. 1 означает один пункт, а не успешное выполнение.

Поведение

  • Команда не принимает аргументов. Используйте точные сигнатуры выше.
  • Чтение в игровом потоке берёт Player.PoisonResistance, если текущий Player существует и не уничтожен; иначе 0. Экипировка не перебирается, бонусы не пересчитываются, статус не запрашивается, ожидания обновления нет. Присутствующий призрак не равен уничтоженному Player.
  • Стихийные поля приходят в расширенном CharacterStatus (0x11), type >= 4. Сама команда не проверяет эпоху сервера. Компактный/старый статус без этих полей оставляет предыдущий кэш; у нового Player исходно 0. Сопротивление яду не является флагом Poisoned; это также не навык Resisting Spells.
  • CharacterStatus проверяет обязательное тело до изменения имени, здоровья и собственных характеристик, затем переводит каждое слово сопротивления в знаковый Int16. Обрезанное обязательное тело не меняет прежние данные. Необязательный хвост type 6 сохраняет прежние правила; команды сопротивлений не читают из него максимальные пределы.
  • Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.
  • Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды. C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • minimum=50 — пример требования, не предел клиента. ResistanceAtLeast отвергает отсутствующий 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(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

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

        var value = UO.GetPoisonResist();
        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.GetPoisonResist() — UO.GetPoisonResist()

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

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

При вызове:

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

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

() => bridge.PoisonResistance

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


UO.GetPoisoned

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

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

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

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

Параметры

  • value — Необязательный объект в показанных формах: 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.GetPoisoned();
UO.Print("GetPoisoned: " + Convert.ToString(result));

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

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

  • Пустые скобки читают self. active сохраняет результат один раз; true и false задают две ветви. Print только выводит пример сообщения.
var active = UO.GetPoisoned();
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.GetPoisoned(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.GetPoisoned();
        await Delay(500);
        var after = UO.GetPoisoned();
        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.GetPoisoned() — UO.GetPoisoned()

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

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

При вызове:

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

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

serial => bridge.Poisoned(serial)

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

() => getter(bridge.Self)

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

UO.GetPoisoned(value) — UO.GetPoisoned(Any)

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

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

При вызове:

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

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

serial => bridge.Poisoned(serial)

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

value => getter(GetObject(value))

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


UO.GetRace

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

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

int UO.GetRace();

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

Параметры

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

Возвращает

int — 1=human, 2=elf, 3=gargoyle по модели клиента. 0 означает отсутствие загруженного персонажа. Это не body/graphic и не serial.

Поведение

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

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

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

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

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

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

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

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

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

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

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

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

  • Значение читается один раз без аргументов. Расу персонажа используется в показанном расчёте или условии.
  • Числовые пороги — пример условий скрипта, а не новые пределы клиента. Поле сохраняет серверные единицы и ограничения, описанные выше.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetRace();
    if (Truth(value == 3))
    {
        UO.Print("Player race is gargoyle");
    }

    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.GetRace();
        await Delay(1000);
        var after = UO.GetRace();
        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.GetRace() — UO.GetRace()

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

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

При вызове:

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

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

() => bridge.Race

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


UO.GetResist

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

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

int UO.GetResist(object? resistance);

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

Параметры

  • resistance — resistance обязателен. Числа: 0=physical, 1=fire, 2=cold, 3=poison, 4=energy. Строки: physical/phys/armor, fire, cold, poison, energy. Регистр и крайние пробелы игнорируются. Нет serial, type, hue, прицела или второго аргумента.

Возвращает

int — знаковое значение статуса, -32768..32767 в модели клиента. Отрицательное значение сохраняется. 0 бывает реальным сопротивлением, отсутствием данных либо отсутствующим/уничтоженным Player; GetResist также даёт 0 для неизвестного селектора. Это не bool, ID, навык или предел сопротивления. 1 означает один пункт, а не успешное выполнение.

Поведение

  • GetResistance сначала различает тип значения: строки "1" и "0" — неизвестные имена, дают 0 и не являются числовыми селекторами. Нестроковый double отбрасывает дробь к нулю: 1.9 -> fire, -0.9 -> physical. true=1 выбирает fire, false=0 — physical; Array/null тоже преобразуются в 0. Используйте явное целое либо допустимое имя. Имена AddObject не разрешаются.
  • GetResistance выбирает ровно одно поле bridge. Неизвестные числа/имена дают int 0 без чтения поля. Команда не снимает пять значений атомарно и не меняет сопротивления.
  • PhysicalResistance — серверное поле брони/статуса: классический сервер может передавать рейтинг брони, а правила с сопротивлениями — физическое сопротивление. API не переводит одно в другое и не вычисляет процент снижения урона. Armor и физические псевдонимы читают одно поле.
  • Стихийные поля приходят в расширенном CharacterStatus (0x11), type >= 4. Сама команда не проверяет эпоху сервера. Компактный/старый статус без этих полей оставляет предыдущий кэш; у нового Player исходно 0. Сопротивление яду не является флагом Poisoned; это также не навык Resisting Spells.
  • CharacterStatus проверяет обязательное тело до изменения имени, здоровья и собственных характеристик, затем переводит каждое слово сопротивления в знаковый Int16. Обрезанное обязательное тело не меняет прежние данные. Необязательный хвост type 6 сохраняет прежние правила; команды сопротивлений не читают из него максимальные пределы.
  • Invoke читает на игровом потоке с возможностью отменить ожидание скриптом. Не запрашивает status, не открывает target, не посылает пакет, не меняет характеристику и не добавляет задержку.
  • Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.

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

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

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

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

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

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

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

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

  • resistance=" FiRe " выбирает огонь после удаления крайних пробелов и без учёта регистра. value остаётся знаковым числом; прицел не появляется.
var value = UO.GetResist(" FiRe ");
UO.Print("Fire resistance: " + Convert.ToString(value));

2. Сравнить числовой и строковый селекторы — функция сценария

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

  • 2 выбирает холод; "poison" — яд. Это селекторы, не serial. Сравнение двух снимков возвращает bool; сопротивление яду не говорит, отравлен ли персонаж.
return  RunScenario();
 object? RunScenario()
{
    var cold = UO.GetResist(2);
    var poison = UO.GetResist("poison");
    if (Truth(cold < poison))
    {
        UO.Print("Cold resistance is lower");
    }
    else
    {
        UO.Print("Cold resistance is equal or higher");
    }

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

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

  • minimum=50 — пример требования, не предел клиента. ResistanceAtLeast отвергает отсутствующий Player, читает одно значение и возвращает bool: true либо false по условию value >= minimum. Само сопротивление не bool. Функция полностью объявлена ниже.
  • selector передаётся из функции в GetResist без изменений; пример использует "fire". Функция проверяет наличие Player, но не валидирует произвольный селектор и не подтверждает свежесть статуса. Используйте селектор из списка выше.
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(ResistanceAtLeast("fire", 50)) == true))
        {
            UO.Print("Local fire resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

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

        var value = UO.GetResist(selector);
        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.GetResist(resistance) — UO.GetResist(Any)

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

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

При вызове:

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

private int GetResistance(InjectionValue resistance)

        {

            if (resistance.Kind != InjectionValueKind.String)

            {

                switch (NumberConversions.ToInt(resistance))

                {

                    case 0: return bridge.Armor;

                    case 1: return bridge.FireResistance;

                    case 2: return bridge.ColdResistance;

                    case 3: return bridge.PoisonResistance;

                    case 4: return bridge.EnergyResistance;

                    default: return 0;

                }

            }



            switch ((resistance.String ?? string.Empty).Trim().ToLowerInvariant())

            {

                case "physical":

                case "phys":

                case "armor": return bridge.Armor;

                case "fire": return bridge.FireResistance;

                case "cold": return bridge.ColdResistance;

                case "poison": return bridge.PoisonResistance;

                case "energy": return bridge.EnergyResistance;

                default: return 0;

            }

        }

UO.GetResistCold

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

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

int UO.GetResistCold();

Читает поле сопротивления текущего персонажа: холод.

Параметры

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

Возвращает

int — знаковое значение статуса, -32768..32767 в модели клиента. Отрицательное значение сохраняется. 0 бывает реальным сопротивлением, отсутствием данных либо отсутствующим/уничтоженным Player; GetResist также даёт 0 для неизвестного селектора. Это не bool, ID, навык или предел сопротивления. 1 означает один пункт, а не успешное выполнение.

Поведение

  • Команда не принимает аргументов. Используйте точные сигнатуры выше.
  • Чтение в игровом потоке берёт Player.ColdResistance, если текущий Player существует и не уничтожен; иначе 0. Экипировка не перебирается, бонусы не пересчитываются, статус не запрашивается, ожидания обновления нет. Присутствующий призрак не равен уничтоженному Player.
  • Стихийные поля приходят в расширенном CharacterStatus (0x11), type >= 4. Сама команда не проверяет эпоху сервера. Компактный/старый статус без этих полей оставляет предыдущий кэш; у нового Player исходно 0. Сопротивление яду не является флагом Poisoned; это также не навык Resisting Spells.
  • CharacterStatus проверяет обязательное тело до изменения имени, здоровья и собственных характеристик, затем переводит каждое слово сопротивления в знаковый Int16. Обрезанное обязательное тело не меняет прежние данные. Необязательный хвост type 6 сохраняет прежние правила; команды сопротивлений не читают из него максимальные пределы.
  • Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.
  • Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды. C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • minimum=50 — пример требования, не предел клиента. ResistanceAtLeast отвергает отсутствующий 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(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

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

        var value = UO.GetResistCold();
        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.GetResistCold() — UO.GetResistCold()

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

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

При вызове:

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

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

() => bridge.ColdResistance

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


UO.GetResistEnergy

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

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

int UO.GetResistEnergy();

Читает поле сопротивления текущего персонажа: энергия.

Параметры

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

Возвращает

int — знаковое значение статуса, -32768..32767 в модели клиента. Отрицательное значение сохраняется. 0 бывает реальным сопротивлением, отсутствием данных либо отсутствующим/уничтоженным Player; GetResist также даёт 0 для неизвестного селектора. Это не bool, ID, навык или предел сопротивления. 1 означает один пункт, а не успешное выполнение.

Поведение

  • Команда не принимает аргументов. Используйте точные сигнатуры выше.
  • Чтение в игровом потоке берёт Player.EnergyResistance, если текущий Player существует и не уничтожен; иначе 0. Экипировка не перебирается, бонусы не пересчитываются, статус не запрашивается, ожидания обновления нет. Присутствующий призрак не равен уничтоженному Player.
  • Стихийные поля приходят в расширенном CharacterStatus (0x11), type >= 4. Сама команда не проверяет эпоху сервера. Компактный/старый статус без этих полей оставляет предыдущий кэш; у нового Player исходно 0. Сопротивление яду не является флагом Poisoned; это также не навык Resisting Spells.
  • CharacterStatus проверяет обязательное тело до изменения имени, здоровья и собственных характеристик, затем переводит каждое слово сопротивления в знаковый Int16. Обрезанное обязательное тело не меняет прежние данные. Необязательный хвост type 6 сохраняет прежние правила; команды сопротивлений не читают из него максимальные пределы.
  • Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.
  • Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды. C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • minimum=50 — пример требования, не предел клиента. ResistanceAtLeast отвергает отсутствующий 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(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

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

        var value = UO.GetResistEnergy();
        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.GetResistEnergy() — UO.GetResistEnergy()

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

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

При вызове:

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

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

() => bridge.EnergyResistance

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


UO.GetResistFire

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

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

int UO.GetResistFire();

Читает поле сопротивления текущего персонажа: огонь.

Параметры

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

Возвращает

int — знаковое значение статуса, -32768..32767 в модели клиента. Отрицательное значение сохраняется. 0 бывает реальным сопротивлением, отсутствием данных либо отсутствующим/уничтоженным Player; GetResist также даёт 0 для неизвестного селектора. Это не bool, ID, навык или предел сопротивления. 1 означает один пункт, а не успешное выполнение.

Поведение

  • Команда не принимает аргументов. Используйте точные сигнатуры выше.
  • Чтение в игровом потоке берёт Player.FireResistance, если текущий Player существует и не уничтожен; иначе 0. Экипировка не перебирается, бонусы не пересчитываются, статус не запрашивается, ожидания обновления нет. Присутствующий призрак не равен уничтоженному Player.
  • Стихийные поля приходят в расширенном CharacterStatus (0x11), type >= 4. Сама команда не проверяет эпоху сервера. Компактный/старый статус без этих полей оставляет предыдущий кэш; у нового Player исходно 0. Сопротивление яду не является флагом Poisoned; это также не навык Resisting Spells.
  • CharacterStatus проверяет обязательное тело до изменения имени, здоровья и собственных характеристик, затем переводит каждое слово сопротивления в знаковый Int16. Обрезанное обязательное тело не меняет прежние данные. Необязательный хвост type 6 сохраняет прежние правила; команды сопротивлений не читают из него максимальные пределы.
  • Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.
  • Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды. C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • minimum=50 — пример требования, не предел клиента. ResistanceAtLeast отвергает отсутствующий 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(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

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

        var value = UO.GetResistFire();
        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.GetResistFire() — UO.GetResistFire()

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

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

При вызове:

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

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

() => bridge.FireResistance

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


UO.GetResistPhysical

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

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

int UO.GetResistPhysical();

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

Параметры

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

Возвращает

int — знаковое значение статуса, -32768..32767 в модели клиента. Отрицательное значение сохраняется. 0 бывает реальным сопротивлением, отсутствием данных либо отсутствующим/уничтоженным Player; GetResist также даёт 0 для неизвестного селектора. Это не bool, ID, навык или предел сопротивления. 1 означает один пункт, а не успешное выполнение.

Поведение

  • Команда не принимает аргументов. Используйте точные сигнатуры выше.
  • Чтение в игровом потоке берёт Player.PhysicalResistance, если текущий Player существует и не уничтожен; иначе 0. Экипировка не перебирается, бонусы не пересчитываются, статус не запрашивается, ожидания обновления нет. Присутствующий призрак не равен уничтоженному Player.
  • PhysicalResistance — серверное поле брони/статуса: классический сервер может передавать рейтинг брони, а правила с сопротивлениями — физическое сопротивление. API не переводит одно в другое и не вычисляет процент снижения урона. Armor и физические псевдонимы читают одно поле.
  • CharacterStatus проверяет обязательное тело до изменения имени, здоровья и собственных характеристик, затем переводит каждое слово сопротивления в знаковый Int16. Обрезанное обязательное тело не меняет прежние данные. Необязательный хвост type 6 сохраняет прежние правила; команды сопротивлений не читают из него максимальные пределы.
  • Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.
  • Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды. C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • minimum=50 — пример требования, не предел клиента. ResistanceAtLeast отвергает отсутствующий 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(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

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

        var value = UO.GetResistPhysical();
        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.GetResistPhysical() — UO.GetResistPhysical()

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

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

При вызове:

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

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

() => bridge.Armor

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


UO.GetResistPoison

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

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

int UO.GetResistPoison();

Читает поле сопротивления текущего персонажа: яд.

Параметры

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

Возвращает

int — знаковое значение статуса, -32768..32767 в модели клиента. Отрицательное значение сохраняется. 0 бывает реальным сопротивлением, отсутствием данных либо отсутствующим/уничтоженным Player; GetResist также даёт 0 для неизвестного селектора. Это не bool, ID, навык или предел сопротивления. 1 означает один пункт, а не успешное выполнение.

Поведение

  • Команда не принимает аргументов. Используйте точные сигнатуры выше.
  • Чтение в игровом потоке берёт Player.PoisonResistance, если текущий Player существует и не уничтожен; иначе 0. Экипировка не перебирается, бонусы не пересчитываются, статус не запрашивается, ожидания обновления нет. Присутствующий призрак не равен уничтоженному Player.
  • Стихийные поля приходят в расширенном CharacterStatus (0x11), type >= 4. Сама команда не проверяет эпоху сервера. Компактный/старый статус без этих полей оставляет предыдущий кэш; у нового Player исходно 0. Сопротивление яду не является флагом Poisoned; это также не навык Resisting Spells.
  • CharacterStatus проверяет обязательное тело до изменения имени, здоровья и собственных характеристик, затем переводит каждое слово сопротивления в знаковый Int16. Обрезанное обязательное тело не меняет прежние данные. Необязательный хвост type 6 сохраняет прежние правила; команды сопротивлений не читают из него максимальные пределы.
  • Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.
  • Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды. C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • minimum=50 — пример требования, не предел клиента. ResistanceAtLeast отвергает отсутствующий 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(ResistanceAtLeast(50)) == true))
        {
            UO.Print("Local resistance requirement met");
        }
        else
        {
            UO.Print("Requirement not met or no player");
        }

        return null;
    }

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

        var value = UO.GetResistPoison();
        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.GetResistPoison() — UO.GetResistPoison()

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

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

При вызове:

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

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

() => bridge.PoisonResistance

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

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