Skip to content

RU UO Topic character

Bad Newbie edited this page Oct 16, 2026 · 6 revisions

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

Характер

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

Состояние своего персонажа, характеристики, сопротивления и экипировка. Для конкретной сущности используйте перегрузку с serial, если она есть в карточке команды.

Разделы

Тема Команды и пояснения
Identity UO.Self · UO.GetSerial · UO.GetName · UO.GetTitle · UO.GetSex · UO.GetRace
Stats UO.HP · UO.MaxHP · UO.Mana · UO.MaxMana · UO.Stamina · UO.MaxStamina · UO.Str · UO.Dex · UO.Int · UO.Weight · UO.MaxWeight · UO.Luck · UO.GetStatLockState · UO.SetStatLockState
Status UO.Alive · UO.Dead · UO.Hidden · UO.Poisoned · UO.Frozen · UO.Paralyzed · UO.Flying · UO.WarMode · UO.IsYellowHits
Resists UO.PhysicalResist · UO.GetPhysicalResist · UO.ResistPhysical · UO.GetResistPhysical · UO.FireResist · UO.GetFireResist · UO.ResistFire · UO.GetResistFire · UO.ColdResist · UO.GetColdResist · UO.ResistCold · UO.GetResistCold · UO.PoisonResist · UO.GetPoisonResist · UO.ResistPoison · UO.GetResistPoison · UO.EnergyResist · UO.GetEnergyResist · UO.ResistEnergy · UO.GetResistEnergy · UO.GetResist
Слои персонажей UO.ObjAtLayer · UO.ObjAtLayerEx · UO.GetLayer · UO.GetEquipment
Equipment UO.GetEquipment · UO.EquipItems · UO.UnequipItems · UO.WearItem
Dress / Undress UO.SetDress · UO.Dress · UO.Undress · UO.DressSavedSet
Arm / Disarm UO.SetArm · UO.Arm · UO.Disarm
Mount / Dismount UO.Mount · UO.Dismount
Paperdoll UO.UseSelfPaperdollScroll · UO.UseOtherPaperdollScroll

Все команды темы

Личность

UO.Self · UO.CharacterTitle · UO.CharName · UO.CharTitle · UO.GetRace · UO.GetSex · UO.Race · UO.Sex · UO.IsFemale · UO.GetTitle

Статистика

UO.Armor · UO.GetArmor · UO.HP · UO.GetHP · UO.Life · UO.GetLife · UO.MaxHP · UO.GetMaxHP · UO.MaxLife · UO.GetMaxLife · UO.Mana · UO.GetMana · UO.MaxMana · UO.GetMaxMana · UO.Stam · UO.GetStam · UO.Stamina · UO.GetStamina · UO.MaxStam · UO.GetMaxStam · UO.MaxStamina · UO.GetMaxStamina · UO.Str · UO.GetStr · UO.Strength · UO.GetStrength · UO.Dex · UO.GetDex · UO.Dexterity · UO.GetDexterity · UO.Int · UO.GetInt · UO.Intelligence · UO.GetIntelligence · UO.Weight · UO.GetWeight · UO.MaxWeight · UO.GetMaxWeight · UO.Luck · UO.GetLuck · UO.Gold · UO.GetGold · UO.GetStatLockState · UO.SetStatLockState · UO.SetStatState · UO.RequestStats · UO.GetStatus · UO.GetPlayerStatusText · UO.LastStatus · UO.LastStatusX · UO.LastStatusY · UO.GetARStatus · UO.SetARStatus · UO.SetARExtParams

Статус

UO.Alive · UO.GetAlive · UO.IsAlive · UO.Dead · UO.GetDead · UO.IsDead · UO.Hidden · UO.GetHidden · UO.IsHidden · UO.Poison · UO.Poisoned · UO.GetPoisoned · UO.IsPoisoned · UO.Frozen · UO.GetFrozen · UO.IsFrozen · UO.Paralyzed · UO.GetParalisa · UO.GetParalysed · UO.GetParalyzed · UO.IsParalysed · UO.IsParalyzed · UO.Flying · UO.GetFlying · UO.IsFlying · UO.ToggleFly · UO.GetYellowBar · UO.IsYellowHits · UO.TicksDead

Сопротивляется

UO.PhysicalResist · UO.GetPhysicalResist · UO.ResistPhysical · UO.GetResistPhysical · UO.FireResist · UO.GetFireResist · UO.ResistFire · UO.GetResistFire · UO.ColdResist · UO.GetColdResist · UO.ResistCold · UO.GetResistCold · UO.PoisonResist · UO.GetPoisonResist · UO.ResistPoison · UO.GetResistPoison · UO.EnergyResist · UO.GetEnergyResist · UO.ResistEnergy · UO.GetResistEnergy · UO.GetResist

Оборудование

UO.GetEquipment · UO.ObjAtLayer · UO.ObjAtLayerEx · UO.Equip · UO.EquipT · UO.EquipItems · UO.Unequip · UO.UnequipItems · UO.WearItem · UO.EquipLastWeapon · UO.RemoveEarrings · UO.RemoveHat · UO.RemoveNeckless · UO.RemoveRing

Dress / Undress

UO.Dress · UO.Undress · UO.SetDress · UO.UnsetDress · UO.DressSavedSet · UO.EquipDressSet · UO.DressSpeed · UO.SetDressSpeed

Arm / Disarm

UO.Arm · UO.Disarm · UO.SetArm · UO.UnsetArm

Mount / Dismount

UO.Mount · UO.Dismount

Бумажная кукла

UO.UseSelfPaperdollScroll · UO.UseOtherPaperdollScroll

Слои персонажей

Все слои: назначение, значения и примеры. Номер слоя, serial надетого предмета и его graphic — разные значения.

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

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

UO.HP

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

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

UO.ObjAtLayer

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

object? hand = UO.ObjAtLayer("Rhand");
if (hand is string serial)
{
    UO.Print("Right hand serial: " + serial);
}
else
{
    UO.Print("Right hand is empty or unavailable");
}

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

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

1 · 2 · 3 · 4 · 5

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


UO.Alive

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

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

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

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

Параметры

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

Возвращает

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

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

Поведение

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

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

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

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

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

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

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

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

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

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

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

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

При вызове:

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

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

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

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

() => getter(bridge.Self)

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

UO.Alive(value) — UO.Alive(Any)

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

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

При вызове:

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

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

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

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

value => getter(GetObject(value))

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


UO.Arm

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

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

void UO.Arm(object? name);

Восстанавливает ранее сохранённый именованный набор оружия и щита.

Параметры

  • name — Строковое имя набора, например "travel" или "battle". Имена нечувствительны к регистру. Наборы одежды и оружия хранятся отдельно: одинаковое имя допустимо в обоих. Это не ID вещи и не имя файла. Только SetDress допускает отсутствие имени: тогда записывается отдельный набор для DressSavedSet/EquipDressSet.

Возвращает

void — значения нет. Вызывайте отдельной строкой; не присваивайте результат и не сравнивайте его с true. Сохранение и удаление меняют запись, а не экипировку.

Поведение

  • Одежда: слои 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. Оружие: только 1 и 2. Волосы, борода, рюкзак, животное и банк в эти наборы не входят.
  • Записываются конкретные serial уже загруженных вещей в своих слоях. Повторное сохранение того же имени заменяет запись. Пустые слои тоже имеют смысл: при восстановлении соответствующий занятый слой будет освобождён в собственный рюкзак. Поэтому сохранённый полностью пустой набор снимает вещи своих слоёв.
  • Набор хранится в состоянии runtime. Сам вызов не создаёт файл и не гарантирует перенос набора в другой профиль или новый runtime. Сначала сохраните нужный набор в используемом состоянии. Загрузка/сохранение общего состояния клиента — отдельный механизм.
  • Точное совпадение текущего и сохранённого ID пропускается, без повторного use/поднятия. Исчезнувшая вещь не заменяется похожим type. Ошибка одной операции не отменяет успешные и не мешает попыткам остальных; автоматического отката нет. Нужны соединение и загруженные вещи. При снятии используется настоящий рюкзак.
  • UO.Set("equipfordress", 0) выбирает запрос использования предмета (исходный режим); ненулевое значение — pickup/equip. Нужный wearable-слой проверяется в обоих режимах. Уже надетая вещь не переключается повторным использованием. DressSpeed действует после принятого запроса, снятие дополнительно соблюдает DropDelay.
  • Dress и Arm возвращают void даже при отказе. Сообщение о принятии запросов не означает подтверждения сервером. Для продолжения, зависящего от надевания, проверяйте фактические слои с ограниченным ожиданием.
  • UO.SetDress · UO.Dress · UO.DressSavedSet · UO.SetArm · UO.Arm · UO.DressSpeed

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

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

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

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

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

UO.Print("Calling UO.Arm");
UO.Arm("battle");

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

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

  • Нужный набор должен быть сохранён ранее в том же состоянии runtime. Не вызывайте SetDress/SetArm непосредственно перед каждым восстановлением: это перепишет цель текущими вещами.
UO.Arm("battle");

2. Имена и режим запроса — функция сценария

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

  • Ненулевой equipfordress выбирает pickup/equip; 350 — миллисекунды DressSpeed. Эти настройки остаются в runtime после примера. Снятие и надевание решает сервер.
return  RunScenario();
 object? RunScenario()
{
    UO.Set("equipfordress", 1);
    UO.DressSpeed(350);
    UO.Arm("battle");
    return null;
}

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

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

  • lasttarget — ID вещи, которая должна входить в заранее сохранённый набор. Контрольный слой 3 означает обувь, 1 — правую руку. AwaitSlot делает до 20 проверок с паузой 100 мс и не повторяет команду. Это подтверждает только выбранную вещь, не весь набор.
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 expected = Asc(UO.GetSerial("lasttarget"), 0);
        if (Truth(expected == 0))
        {
            return 0;
        }

        UO.Arm("battle");
        return AwaitSlot(1, expected);
        return null;
    }

    dynamic AwaitSlot(dynamic layer, dynamic expected)
    {
        for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
        {
            if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == expected))
            {
                return 1;
            }

            UO.Wait(100);
        }

        return 0;
    }

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

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

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

UO.Arm(name) — UO.Arm(String)

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

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

При вызове:

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

public void Arm(string name)

            => Equip(name, armSets, weaponLayers, "Weapon set requests processed.", "No weapons set with setarm.");

UO.Armor

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

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

int UO.Armor();

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

Параметры

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

Возвращает

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

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

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

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

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

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

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

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

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

При вызове:

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

case "armor": return new InjectionValue(bridge.Armor);

UO.CharName

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

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

dynamic UO.CharName();

Читает имя персонажа.

Параметры

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

Возвращает

string — известное клиенту имя. Пустая строка означает пустое/неизвестное значение либо отсутствие объекта. Это не serial и не путь профиля. Игровое имя/титул не переводится по языку IDE.

Поведение

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

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

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

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

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

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

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

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

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

  • Параметров нет: читается self.
  • Пустая строка обрабатывается явно; это не текст "0".
var text = UO.CharName();
if (Truth(text != ""))
{
    UO.Print(text);
}
else
{
    UO.Print("Text is unavailable");
}

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

2. Добавить текст в сообщение журнала — функция сценария

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

  • Читается свой персонаж, значение сохраняется строкой.
  • Оператор + соединяет строки; Convert.ToString для этого результата не нужен.
return  RunScenario();
 object? RunScenario()
{
    var text = UO.CharName();
    UO.Print("Player имя: " + text);
    return null;
}

3. Сравнить два снимка — класс сценария

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

  • Оба вызова относятся к 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 previous = UO.CharName();
        await Delay(1000);
        var current = UO.CharName();
        if (Truth(previous != current))
        {
            UO.Print("Updated text: " + current);
        }

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

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

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

При вызове:

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

case "getname":

                case "charname": return new InjectionValue(bridge.GetName(Arg(0, bridge.Self)));

UO.CharTitle

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

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

dynamic UO.CharTitle();

Читает титул персонажа.

Параметры

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

Возвращает

string — известное клиенту титул. Пустая строка означает пустое/неизвестное значение либо отсутствие объекта. Это не serial и не путь профиля. Игровое имя/титул не переводится по языку IDE.

Поведение

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

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

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

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

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

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

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

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

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

  • Параметров нет: читается self.
  • Пустая строка обрабатывается явно; это не текст "0".
var text = UO.CharTitle();
if (Truth(text != ""))
{
    UO.Print(text);
}
else
{
    UO.Print("Text is unavailable");
}

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

2. Добавить текст в сообщение журнала — функция сценария

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

  • Читается свой персонаж, значение сохраняется строкой.
  • Оператор + соединяет строки; Convert.ToString для этого результата не нужен.
return  RunScenario();
 object? RunScenario()
{
    var text = UO.CharTitle();
    UO.Print("Player титул: " + text);
    return null;
}

3. Сравнить два снимка — класс сценария

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

  • Оба вызова относятся к 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 previous = UO.CharTitle();
        await Delay(1000);
        var current = UO.CharTitle();
        if (Truth(previous != current))
        {
            UO.Print("Updated text: " + current);
        }

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

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

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

При вызове:

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

case "chartitle": return new InjectionValue(bridge.CharacterTitle);

UO.CharacterTitle

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

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

string UO.CharacterTitle();

Читает титул персонажа.

Параметры

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

Возвращает

string — известное клиенту титул. Пустая строка означает пустое/неизвестное значение либо отсутствие объекта. Это не serial и не путь профиля. Игровое имя/титул не переводится по языку IDE.

Поведение

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

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

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

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

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

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

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

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

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

  • Параметров нет: читается self.
  • Пустая строка обрабатывается явно; это не текст "0".
var text = UO.CharacterTitle();
if (Truth(text != ""))
{
    UO.Print(text);
}
else
{
    UO.Print("Text is unavailable");
}

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

2. Добавить текст в сообщение журнала — функция сценария

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

  • Читается свой персонаж, значение сохраняется строкой.
  • Оператор + соединяет строки; Convert.ToString для этого результата не нужен.
return  RunScenario();
 object? RunScenario()
{
    var text = UO.CharacterTitle();
    UO.Print("Player титул: " + text);
    return null;
}

3. Сравнить два снимка — класс сценария

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

  • Оба вызова относятся к 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 previous = UO.CharacterTitle();
        await Delay(1000);
        var current = UO.CharacterTitle();
        if (Truth(previous != current))
        {
            UO.Print("Updated text: " + current);
        }

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

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

Результат: string / String.

При вызове:

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

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

() => bridge.CharacterTitle

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


UO.ColdResist

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

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

int UO.ColdResist();

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

Параметры

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

Возвращает

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

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

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

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

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

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

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

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

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

При вызове:

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

case "coldresist": return new InjectionValue(bridge.ColdResistance);

UO.Dead

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

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

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

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

Параметры

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

Возвращает

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

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

Поведение

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

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

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

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

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

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

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

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

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

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

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

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

При вызове:

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

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

UO.Dead(id) — UO.Dead(Any)

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

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

При вызове:

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

public int Dead(InjectionValue id)

        {

            int serial = GetObject(id);

            if (serial == bridge.Self)

                return Dead();

            return serial > 0 ? bridge.IsDead(serial) : 0;

        }

UO.Dex

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

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

int UO.Dex();

Читает текущую ловкость (Dexterity, DEX) персонажа.

Параметры

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

Возвращает

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

Поведение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

При вызове:

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

case "dex": return new InjectionValue(bridge.Dexterity);

UO.Dexterity

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

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

int UO.Dexterity();

Читает текущую ловкость (Dexterity, DEX) персонажа.

Параметры

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

Возвращает

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

Поведение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

При вызове:

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

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

() => bridge.Dexterity

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


UO.Disarm

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

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

int UO.Disarm();

Снимает оружие и щит из рук: слои 1 и 2. Одежду не затрагивает.

Параметры

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

Возвращает

Числовой флаг int: 1 (условие выполнено) — локальная операция принята, 0 (условие не выполнено) — отказ. Это не подтверждение сервера, не ID и не количество. Сервер может отказать позже; проверяйте фактическую экипировку после ответа.

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

Поведение

  • Нужны загруженные предметы и свободная рука перетаскивания. При снятии требуется настоящий рюкзак self: запасной GrabBag не используется. Неизвестные, уничтоженные и неподходящие вещи дают отказ. Чужие предметы нельзя снять через UnequipItems. Набор не является атомарной транзакцией.
  • EquipItems/UnequipItems применяют DressSpeed после принятой операции перед следующим элементом; Disarm/Undress — после каждого занятого слоя. Снятие дополнительно соблюдает DropDelay при принятом переносе. Одноимённые настройки других runtime не меняются; ускорение не отменяет ограничения сервера.
  • Неверная форма вызова, неизвестное имя слоя или непереводимое в число значение могут вызвать ошибку скрипта вместо 0. Снимок экипировки содержит только уже загруженные данные. В помощнике ChangeAndConfirm layer=1 — правая рука: для другой вещи передайте её реальный слой.
  • Для массива 1 означает, что приняты все перечисленные операции; при любом отказе возвращается 0. Остальные элементы всё равно обрабатываются, отката нет. Пустой массив даёт 1 без действий. Disarm/Undress дают 1 также при уже пустых нужных слоях; частичный отказ даёт 0.
  • UO.EquipItems · UO.UnequipItems · UO.DressSpeed · UO.DropDelay · UO.ObjAtLayerEx

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

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

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

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

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

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

1. Disarm — Один выбранный предмет или слой — прямой скрипт

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

  • Сначала выберите подходящую вещь в игре: lasttarget — её ID. В примере Equip/WearItem слой 1 требует оружие правой руки. Unequip(1) снимает правую руку; Disarm/Undress работают со своими фиксированными слоями. После отказа нет автоматических повторов.
return UO.Disarm();

2. Disarm — Два предмета и сохранённые ID — функция сценария

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

  • Для надевания 0x0F5E — пример меча, 0x1B76 — пример щита. FindType ищет их среди загруженных вещей рюкзака, ASC преобразует возвращённый hex-ID. Для снятия читаются собственные текущие слои. Если нужной вещи нет, сценарий завершается. Массив хранит два ID; каждый предмет переносится целиком.
return  RunScenario();
 object? RunScenario()
{
    var first = UO.ObjAtLayerEx(1, UO.Self());
    var second = UO.ObjAtLayerEx(2, UO.Self());
    if (Truth(first == 0) || Truth(second == 0))
    {
        return 0;
    }

    UO.AddObject("saved_first", first);
    UO.AddObject("saved_second", second);
    return UO.Disarm();
    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. Disarm — Полная функция с ограниченным ожиданием — класс сценария

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

  • ChangeAndConfirm выполняет команду один раз. Затем до 20 раз проверяет фактическое состояние с паузой 100 мс. 1 — проверка увидела ожидаемое состояние, 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()
    {
        return ChangeAndConfirm();
        return null;
    }

    dynamic ChangeAndConfirm()
    {
        if (!(Truth(UO.Disarm())))
        {
            return 0;
        }

        dynamic[] layers = new dynamic[checked((int)(1) + 1)];
        layers[0] = 1;
        layers[1] = 2;
        for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
        {
            dynamic empty = true;
            for (int i = (int)(0); i <= ArrayLength(layers) - 1; i += (int)(1))
            {
                if (Truth(UO.ObjAtLayerEx(layers[i], UO.Self()) != 0))
                {
                    empty = false;
                }
            }

            if (Truth(empty))
            {
                return 1;
            }

            UO.Wait(100);
        }

        return 0;
    }

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

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

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

При вызове:

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

public int Disarm()

            => Unequip(weaponLayers, "Weapons disarmed.");

UO.Dismount

Сигнатуры C#

int UO.Dismount();

Поведение и результат

Mount и Dismount отправляют протокольный запрос использования объекта без ручного двойного клика и без превращения действия в атаку в war mode. Результат int — текущий serial предмета слоя Mount, а не признак успеха. Ответ сервера асинхронен: после Mount результат ещё может быть 0, а Dismount может вернуть serial до подтверждения снятия. Проверяйте ObjAtLayer("Mount") после ответа сервера.

Параметры

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

Каждый блок — полный отдельный .csx. Замените демонстрационные serial, type и координаты своими. Параметры идут в порядке сигнатуры; именованные параметры C# позволяют явно указать их назначение.

Команды чата

#dismount

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

Каждый блок — полный отдельный .csx. Замените демонстрационные serial, type и координаты своими. Параметры идут в порядке сигнатуры; именованные параметры C# позволяют явно указать их назначение.

1

int mountLayerSerial = UO.Dismount();
UO.Print(UO.Int2Hex(mountLayerSerial));

2

var before = UO.ObjAtLayer("Mount");
int currentSerial = UO.Dismount();
UO.Print($"{before} -> {UO.Int2Hex(currentSerial)}");

3

UO.Dismount();
await WaitAsync(250);
UO.Print(Convert.ToString(UO.ObjAtLayer("Mount")));

4

new CommandSample().Execute(UO);

sealed class CommandSample
{
    public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
    {
        int mountLayerSerial = api.Dismount();
        api.Print(api.Int2Hex(mountLayerSerial));
    }
}

Внутренние вызовы

CSharpGameApi.Dismount
  -> CSharpScriptGlobals
  -> InjectionScript.Runtime.InjectionApiUO.Dismount
ClassicUOInjectionApiBridge -> NativeMountController.Request
  -> OutgoingPackets.Send_UseObjectRequest (0x06)
  -> MountedLayerSerialUnsafe -> Player.FindItemByLayer(Layer.Mount)

Источники

ClassicUO · ServUO BaseMount


UO.Dress

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

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

void UO.Dress(object? name);

Восстанавливает ранее сохранённый именованный набор одежды.

Параметры

  • name — Строковое имя набора, например "travel" или "battle". Имена нечувствительны к регистру. Наборы одежды и оружия хранятся отдельно: одинаковое имя допустимо в обоих. Это не ID вещи и не имя файла. Только SetDress допускает отсутствие имени: тогда записывается отдельный набор для DressSavedSet/EquipDressSet.

Возвращает

void — значения нет. Вызывайте отдельной строкой; не присваивайте результат и не сравнивайте его с true. Сохранение и удаление меняют запись, а не экипировку.

Поведение

  • Одежда: слои 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. Оружие: только 1 и 2. Волосы, борода, рюкзак, животное и банк в эти наборы не входят.
  • Записываются конкретные serial уже загруженных вещей в своих слоях. Повторное сохранение того же имени заменяет запись. Пустые слои тоже имеют смысл: при восстановлении соответствующий занятый слой будет освобождён в собственный рюкзак. Поэтому сохранённый полностью пустой набор снимает вещи своих слоёв.
  • Набор хранится в состоянии runtime. Сам вызов не создаёт файл и не гарантирует перенос набора в другой профиль или новый runtime. Сначала сохраните нужный набор в используемом состоянии. Загрузка/сохранение общего состояния клиента — отдельный механизм.
  • Точное совпадение текущего и сохранённого ID пропускается, без повторного use/поднятия. Исчезнувшая вещь не заменяется похожим type. Ошибка одной операции не отменяет успешные и не мешает попыткам остальных; автоматического отката нет. Нужны соединение и загруженные вещи. При снятии используется настоящий рюкзак.
  • UO.Set("equipfordress", 0) выбирает запрос использования предмета (исходный режим); ненулевое значение — pickup/equip. Нужный wearable-слой проверяется в обоих режимах. Уже надетая вещь не переключается повторным использованием. DressSpeed действует после принятого запроса, снятие дополнительно соблюдает DropDelay.
  • Dress и Arm возвращают void даже при отказе. Сообщение о принятии запросов не означает подтверждения сервером. Для продолжения, зависящего от надевания, проверяйте фактические слои с ограниченным ожиданием.
  • UO.SetDress · UO.Dress · UO.DressSavedSet · UO.SetArm · UO.Arm · UO.DressSpeed

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

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

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

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

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

UO.Print("Calling UO.Dress");
UO.Dress("travel");

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

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

  • Нужный набор должен быть сохранён ранее в том же состоянии runtime. Не вызывайте SetDress/SetArm непосредственно перед каждым восстановлением: это перепишет цель текущими вещами.
UO.Dress("travel");

2. Имена и режим запроса — функция сценария

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

  • Ненулевой equipfordress выбирает pickup/equip; 350 — миллисекунды DressSpeed. Эти настройки остаются в runtime после примера. Снятие и надевание решает сервер.
return  RunScenario();
 object? RunScenario()
{
    UO.Set("equipfordress", 1);
    UO.DressSpeed(350);
    UO.Dress("travel");
    return null;
}

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

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

  • lasttarget — ID вещи, которая должна входить в заранее сохранённый набор. Контрольный слой 3 означает обувь, 1 — правую руку. AwaitSlot делает до 20 проверок с паузой 100 мс и не повторяет команду. Это подтверждает только выбранную вещь, не весь набор.
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 expected = Asc(UO.GetSerial("lasttarget"), 0);
        if (Truth(expected == 0))
        {
            return 0;
        }

        UO.Dress("travel");
        return AwaitSlot(3, expected);
        return null;
    }

    dynamic AwaitSlot(dynamic layer, dynamic expected)
    {
        for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
        {
            if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == expected))
            {
                return 1;
            }

            UO.Wait(100);
        }

        return 0;
    }

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

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

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

UO.Dress(name) — UO.Dress(String)

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

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

При вызове:

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

public void Dress(string name)

            => Equip(name, dressSets, dressLayers, "Clothing set requests processed.", "No clothing set with setdress.");

UO.DressSavedSet

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

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

dynamic UO.DressSavedSet();

Восстанавливает набор одежды, сохранённый вызовом UO.SetDress() без имени.

Параметры

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

Возвращает

Фактически Числовой флаг int: 1 (условие выполнено) — все необходимые запросы локально приняты либо нужные слои уже совпали; 0 (условие не выполнено) — набора нет, соединения нет или хотя бы один запрос отклонён. Регистрация object? допускает этот int. Это не ID, не число надетых вещей и не подтверждение сервера.

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

Поведение

  • Одежда: слои 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. Оружие: только 1 и 2. Волосы, борода, рюкзак, животное и банк в эти наборы не входят.
  • Записываются конкретные serial уже загруженных вещей в своих слоях. Повторное сохранение того же имени заменяет запись. Пустые слои тоже имеют смысл: при восстановлении соответствующий занятый слой будет освобождён в собственный рюкзак. Поэтому сохранённый полностью пустой набор снимает вещи своих слоёв.
  • Набор хранится в состоянии runtime. Сам вызов не создаёт файл и не гарантирует перенос набора в другой профиль или новый runtime. Сначала сохраните нужный набор в используемом состоянии. Загрузка/сохранение общего состояния клиента — отдельный механизм.
  • Точное совпадение текущего и сохранённого ID пропускается, без повторного use/поднятия. Исчезнувшая вещь не заменяется похожим type. Ошибка одной операции не отменяет успешные и не мешает попыткам остальных; автоматического отката нет. Нужны соединение и загруженные вещи. При снятии используется настоящий рюкзак.
  • UO.Set("equipfordress", 0) выбирает запрос использования предмета (исходный режим); ненулевое значение — pickup/equip. Нужный wearable-слой проверяется в обоих режимах. Уже надетая вещь не переключается повторным использованием. DressSpeed действует после принятого запроса, снятие дополнительно соблюдает DropDelay.
  • Dress и Arm возвращают null даже при отказе. Сообщение о принятии запросов не означает подтверждения сервером. Для продолжения, зависящего от надевания, проверяйте фактические слои с ограниченным ожиданием.
  • UO.SetDress · UO.Dress · UO.DressSavedSet · UO.SetArm · UO.Arm · UO.DressSpeed

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

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

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

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

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

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

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

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

  • Нужный набор должен быть сохранён ранее в том же состоянии runtime. Не вызывайте SetDress/SetArm непосредственно перед каждым восстановлением: это перепишет цель текущими вещами.
return UO.DressSavedSet();

2. Имена и режим запроса — функция сценария

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

  • Ненулевой equipfordress выбирает pickup/equip; 350 — миллисекунды DressSpeed. Эти настройки остаются в runtime после примера. Снятие и надевание решает сервер.
return  RunScenario();
 object? RunScenario()
{
    UO.Set("equipfordress", 1);
    UO.DressSpeed(350);
    return UO.DressSavedSet();
    return null;
}

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

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

  • lasttarget — ID вещи, которая должна входить в заранее сохранённый набор. Контрольный слой 3 означает обувь, 1 — правую руку. AwaitSlot делает до 20 проверок с паузой 100 мс и не повторяет команду. Это подтверждает только выбранную вещь, не весь набор.
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 expected = Asc(UO.GetSerial("lasttarget"), 0);
        if (Truth(expected == 0))
        {
            return 0;
        }

        if (!(Truth(UO.DressSavedSet())))
        {
            return 0;
        }

        return AwaitSlot(3, expected);
        return null;
    }

    dynamic AwaitSlot(dynamic layer, dynamic expected)
    {
        for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
        {
            if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == expected))
            {
                return 1;
            }

            UO.Wait(100);
        }

        return 0;
    }

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

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

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

UO.DressSavedSet() — UO.DressSavedSet()

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

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

При вызове:

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

case "dresssavedset":

                case "equipdressset": return new InjectionValue(Equip("__stealth_saved_set__", dressSets, dressLayers, "Clothing set requests processed.", "No clothing set with setdress."));

UO.DressSpeed

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

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

dynamic UO.DressSpeed();
dynamic UO.DressSpeed(object? value);

Читает или задаёт паузу между операциями одевания/раздевания в текущем runtime. Помогает не отправлять серию действий слишком быстро для правил сервера.

Параметры

  • value — Необязательные миллисекунды. Без аргумента — чтение; с аргументом значение ограничивается 10..10000. Исходное значение runtime может быть 0, если задержка ещё не задавалась; записать 0 через эту команду нельзя.

Возвращает

Без аргумента: int, текущие миллисекунды. С аргументом: null, возвращаемого значения нет; затем отдельно прочитайте UO.DressSpeed(). Это не bool.

Поведение

  • EquipItems/UnequipItems применяют DressSpeed после принятой операции перед следующим элементом; Disarm/Undress — после каждого занятого слоя. Снятие дополнительно соблюдает DropDelay при принятом переносе. Одноимённые настройки других runtime не меняются; ускорение не отменяет ограничения сервера.
  • UO.EquipItems · UO.UnequipItems · UO.DressSpeed · UO.DropDelay · UO.ObjAtLayerEx

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

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

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

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

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

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

1. DressSpeed — 1 — прямой скрипт

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

  • Прочитать текущую паузу и выбрать минимум для следующего набора; 0 означает ещё не заданную задержку.
var delay = UO.DressSpeed();
if (Truth(delay < 350))
{
    UO.DressSpeed(350);
}
return UO.DressSpeed();

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

2. DressSpeed — 2 — функция сценария

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

  • Задать 350 мс и отдельно проверить сохранённое значение. Присваивать результат setter переменной нельзя: setter возвращает Unit.
return  RunScenario();
 object? RunScenario()
{
    UO.DressSpeed(350);
    return UO.DressSpeed();
    return null;
}

3. DressSpeed — 3 — класс сценария

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

  • ConfigureDressDelay принимает настройку скрипта. 15000 ограничивается до 10000 мс; помощник возвращает реально сохранённые миллисекунды.
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()
    {
        return ConfigureDressDelay(15000);
        return null;
    }

    dynamic ConfigureDressDelay(dynamic requested)
    {
        UO.DressSpeed(requested);
        return UO.DressSpeed();
    }
}

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

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

UO.DressSpeed() — UO.DressSpeed()

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

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

При вызове:

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

case "dressspeed":

                    if (arguments.Length > 0) { SetDressSpeed(Arg(0)); return InjectionValue.Unit; }

                    return new InjectionValue(state.DressSpeed);

UO.DressSpeed(value) — UO.DressSpeed(Any)

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

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

При вызове:

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

case "dressspeed":

                    if (arguments.Length > 0) { SetDressSpeed(Arg(0)); return InjectionValue.Unit; }

                    return new InjectionValue(state.DressSpeed);

UO.EnergyResist

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

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

int UO.EnergyResist();

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

Параметры

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

Возвращает

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

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

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

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

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

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

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

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

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

При вызове:

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

case "energyresist": return new InjectionValue(bridge.EnergyResistance);

UO.Equip

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

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

int UO.Equip(object? layer, object? id);

Надевает выбранный предмет на указанный слой своего персонажа.

Параметры

  • layer — Номер слоя, например 1 — правая рука, 2 — левая. Equip и Unequip также принимают имя слоя, например "Rhand". WearItem использует числовой слой. Слой должен совпадать с wearable-слоем предмета; это не graphic и не ID.
  • id — ID конкретной загруженной вещи: целое число, hex-строка, "lasttarget" или имя AddObject. Это не type. Пример с 0x0F5E сначала ищет меч этого graphic и получает его ID.

Возвращает

Числовой флаг int: 1 (условие выполнено) — локальная операция принята, 0 (условие не выполнено) — отказ. Это не подтверждение сервера, не ID и не количество. Сервер может отказать позже; проверяйте фактическую экипировку после ответа.

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

Поведение

  • Нужны загруженные предметы и свободная рука перетаскивания. При снятии требуется настоящий рюкзак self: запасной GrabBag не используется. Неизвестные, уничтоженные и неподходящие вещи дают отказ. Чужие предметы нельзя снять через UnequipItems. Набор не является атомарной транзакцией.
  • EquipItems/UnequipItems применяют DressSpeed после принятой операции перед следующим элементом; Disarm/Undress — после каждого занятого слоя. Снятие дополнительно соблюдает DropDelay при принятом переносе. Одноимённые настройки других runtime не меняются; ускорение не отменяет ограничения сервера.
  • Неверная форма вызова, неизвестное имя слоя или непереводимое в число значение могут вызвать ошибку скрипта вместо 0. Снимок экипировки содержит только уже загруженные данные. В помощнике ChangeAndConfirm layer=1 — правая рука: для другой вещи передайте её реальный слой.
  • UO.EquipItems · UO.UnequipItems · UO.DressSpeed · UO.DropDelay · UO.ObjAtLayerEx

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

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

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

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

int item = UO.LastTarget();
if (item != 0)
    UO.Print("Accepted flag: " + UO.Equip(1, item));

1. Equip — Один выбранный предмет или слой — прямой скрипт

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

  • Сначала выберите подходящую вещь в игре: lasttarget — её ID. В примере Equip/WearItem слой 1 требует оружие правой руки. Unequip(1) снимает правую руку; Disarm/Undress работают со своими фиксированными слоями. После отказа нет автоматических повторов.
var item = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(item == 0))
{
    return 0;
}
return UO.Equip(1, item);

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;

2. Equip — Два предмета и сохранённые ID — функция сценария

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

  • Для надевания 0x0F5E — пример меча, 0x1B76 — пример щита. FindType ищет их среди загруженных вещей рюкзака, ASC преобразует возвращённый hex-ID. Для снятия читаются собственные текущие слои. Если нужной вещи нет, сценарий завершается. Массив хранит два ID; каждый предмет переносится целиком.
return  RunScenario();
 object? RunScenario()
{
    var first = Asc(UO.FindType(0x0F5E, -1, "backpack"), 0);
    var second = Asc(UO.FindType(0x1B76, -1, "backpack"), 0);
    if (Truth(first == 0) || Truth(second == 0))
    {
        return 0;
    }

    UO.AddObject("saved_first", first);
    UO.AddObject("saved_second", second);
    var firstOk = UO.Equip(1, first);
    var secondOk = UO.Equip(2, second);
    return firstOk != 0 && secondOk != 0;
    return null;
}

int Asc(object? value, int fallback = 0)
{
    string text = Convert.ToString(value) ?? "";
    if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
        return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
    return int.TryParse(text, out int number) ? number : fallback;
}

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

3. Equip — Полная функция с ограниченным ожиданием — класс сценария

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

  • ChangeAndConfirm выполняет команду один раз. Затем до 20 раз проверяет фактическое состояние с паузой 100 мс. 1 — проверка увидела ожидаемое состояние, 0 — отказ или истёкшее ожидание. Это результат нашего помощника, не новая встроенная команда. Сам вызов операции тоже может занять время.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var item = Asc(UO.GetSerial("lasttarget"), 0);
        if (Truth(item == 0))
        {
            return 0;
        }

        return ChangeAndConfirm(1, item);
        return null;
    }

    dynamic ChangeAndConfirm(dynamic layer, dynamic item)
    {
        if (Truth(item == 0))
        {
            return 0;
        }

        if (!(Truth(UO.Equip(layer, item))))
        {
            return 0;
        }

        for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
        {
            if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == item))
            {
                return 1;
            }

            UO.Wait(100);
        }

        return 0;
    }

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

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

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

UO.Equip(layer, id) — UO.Equip(Any,Any)

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

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

При вызове:

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

case "equip":

                    return new InjectionValue(arguments[0].Kind == InjectionValueKind.String ? Equip(Text(0), Arg(1)) : bridge.Equip(Arg(0), Arg(1)));

UO.Equip(layer, id) — UO.Equip(String,Integer)

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

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

При вызове:

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

public int Equip(string layer, int id) => bridge.Equip(ConvertLayer(layer), id);

UO.Equip(layer, id) — UO.Equip(String,String)

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

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

При вызове:

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

public int Equip(string layer, string id) => Equip(layer, GetObject(id));

UO.EquipDressSet

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

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

dynamic UO.EquipDressSet();

Альтернативное имя DressSavedSet: восстанавливает тот же безымянный набор одежды.

Параметры

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

Возвращает

Фактически Числовой флаг int: 1 (условие выполнено) — все необходимые запросы локально приняты либо нужные слои уже совпали; 0 (условие не выполнено) — набора нет, соединения нет или хотя бы один запрос отклонён. Регистрация object? допускает этот int. Это не ID, не число надетых вещей и не подтверждение сервера.

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

Поведение

  • Одежда: слои 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. Оружие: только 1 и 2. Волосы, борода, рюкзак, животное и банк в эти наборы не входят.
  • Записываются конкретные serial уже загруженных вещей в своих слоях. Повторное сохранение того же имени заменяет запись. Пустые слои тоже имеют смысл: при восстановлении соответствующий занятый слой будет освобождён в собственный рюкзак. Поэтому сохранённый полностью пустой набор снимает вещи своих слоёв.
  • Набор хранится в состоянии runtime. Сам вызов не создаёт файл и не гарантирует перенос набора в другой профиль или новый runtime. Сначала сохраните нужный набор в используемом состоянии. Загрузка/сохранение общего состояния клиента — отдельный механизм.
  • Точное совпадение текущего и сохранённого ID пропускается, без повторного use/поднятия. Исчезнувшая вещь не заменяется похожим type. Ошибка одной операции не отменяет успешные и не мешает попыткам остальных; автоматического отката нет. Нужны соединение и загруженные вещи. При снятии используется настоящий рюкзак.
  • UO.Set("equipfordress", 0) выбирает запрос использования предмета (исходный режим); ненулевое значение — pickup/equip. Нужный wearable-слой проверяется в обоих режимах. Уже надетая вещь не переключается повторным использованием. DressSpeed действует после принятого запроса, снятие дополнительно соблюдает DropDelay.
  • Dress и Arm возвращают null даже при отказе. Сообщение о принятии запросов не означает подтверждения сервером. Для продолжения, зависящего от надевания, проверяйте фактические слои с ограниченным ожиданием.
  • UO.SetDress · UO.Dress · UO.DressSavedSet · UO.SetArm · UO.Arm · UO.DressSpeed

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

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

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

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

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

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

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

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

  • Нужный набор должен быть сохранён ранее в том же состоянии runtime. Не вызывайте SetDress/SetArm непосредственно перед каждым восстановлением: это перепишет цель текущими вещами.
return UO.EquipDressSet();

2. Имена и режим запроса — функция сценария

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

  • Ненулевой equipfordress выбирает pickup/equip; 350 — миллисекунды DressSpeed. Эти настройки остаются в runtime после примера. Снятие и надевание решает сервер.
return  RunScenario();
 object? RunScenario()
{
    UO.Set("equipfordress", 1);
    UO.DressSpeed(350);
    return UO.EquipDressSet();
    return null;
}

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

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

  • lasttarget — ID вещи, которая должна входить в заранее сохранённый набор. Контрольный слой 3 означает обувь, 1 — правую руку. AwaitSlot делает до 20 проверок с паузой 100 мс и не повторяет команду. Это подтверждает только выбранную вещь, не весь набор.
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 expected = Asc(UO.GetSerial("lasttarget"), 0);
        if (Truth(expected == 0))
        {
            return 0;
        }

        if (!(Truth(UO.EquipDressSet())))
        {
            return 0;
        }

        return AwaitSlot(3, expected);
        return null;
    }

    dynamic AwaitSlot(dynamic layer, dynamic expected)
    {
        for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
        {
            if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == expected))
            {
                return 1;
            }

            UO.Wait(100);
        }

        return 0;
    }

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

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

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

UO.EquipDressSet() — UO.EquipDressSet()

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

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

При вызове:

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

case "dresssavedset":

                case "equipdressset": return new InjectionValue(Equip("__stealth_saved_set__", dressSets, dressLayers, "Clothing set requests processed.", "No clothing set with setdress."));

UO.EquipItems

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

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

dynamic UO.EquipItems(object? items);

Надевает один предмет или массив предметов. Слой каждой вещи определяется по её wearable-данным, поэтому вещь можно надеть из рюкзака.

Параметры

  • items — Обязательный ID или массив ID предметов. Элементы массива — числа или числовые hex-строки. Одиночный аргумент также принимает "lasttarget"/имя AddObject. Для массива используйте объявление переменной items[1] для двух элементов с индексами 0 и 1. Передаются вещи, а не номера слоёв и не type.

Возвращает

Числовой флаг int: 1 (условие выполнено) — локальная операция принята, 0 (условие не выполнено) — отказ. Это не подтверждение сервера, не ID и не количество. Сервер может отказать позже; проверяйте фактическую экипировку после ответа.

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

Поведение

  • Нужны загруженные предметы и свободная рука перетаскивания. При снятии требуется настоящий рюкзак self: запасной GrabBag не используется. Неизвестные, уничтоженные и неподходящие вещи дают отказ. Чужие предметы нельзя снять через UnequipItems. Набор не является атомарной транзакцией.
  • EquipItems/UnequipItems применяют DressSpeed после принятой операции перед следующим элементом; Disarm/Undress — после каждого занятого слоя. Снятие дополнительно соблюдает DropDelay при принятом переносе. Одноимённые настройки других runtime не меняются; ускорение не отменяет ограничения сервера.
  • Неверная форма вызова, неизвестное имя слоя или непереводимое в число значение могут вызвать ошибку скрипта вместо 0. Снимок экипировки содержит только уже загруженные данные. В помощнике ChangeAndConfirm layer=1 — правая рука: для другой вещи передайте её реальный слой.
  • Для массива 1 означает, что приняты все перечисленные операции; при любом отказе возвращается 0. Остальные элементы всё равно обрабатываются, отката нет. Пустой массив даёт 1 без действий. Disarm/Undress дают 1 также при уже пустых нужных слоях; частичный отказ даёт 0.
  • UO.EquipItems · UO.UnequipItems · UO.DressSpeed · UO.DropDelay · UO.ObjAtLayerEx

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

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

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

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

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

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

1. EquipItems — Один выбранный предмет или слой — прямой скрипт

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

  • Сначала выберите подходящую вещь в игре: lasttarget — её ID. В примере Equip/WearItem слой 1 требует оружие правой руки. Unequip(1) снимает правую руку; Disarm/Undress работают со своими фиксированными слоями. После отказа нет автоматических повторов.
var item = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(item == 0))
{
    return 0;
}
return UO.EquipItems(item);

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;

2. EquipItems — Два предмета и сохранённые ID — функция сценария

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

  • Для надевания 0x0F5E — пример меча, 0x1B76 — пример щита. FindType ищет их среди загруженных вещей рюкзака, ASC преобразует возвращённый hex-ID. Для снятия читаются собственные текущие слои. Если нужной вещи нет, сценарий завершается. Массив хранит два ID; каждый предмет переносится целиком.
return  RunScenario();
 object? RunScenario()
{
    var first = Asc(UO.FindType(0x0F5E, -1, "backpack"), 0);
    var second = Asc(UO.FindType(0x1B76, -1, "backpack"), 0);
    if (Truth(first == 0) || Truth(second == 0))
    {
        return 0;
    }

    UO.AddObject("saved_first", first);
    UO.AddObject("saved_second", second);
    dynamic[] items = new dynamic[checked((int)(1) + 1)];
    items[0] = first;
    items[1] = second;
    return UO.EquipItems(items);
    return null;
}

int Asc(object? value, int fallback = 0)
{
    string text = Convert.ToString(value) ?? "";
    if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
        return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
    return int.TryParse(text, out int number) ? number : fallback;
}

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

3. EquipItems — Полная функция с ограниченным ожиданием — класс сценария

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

  • ChangeAndConfirm выполняет команду один раз. Затем до 20 раз проверяет фактическое состояние с паузой 100 мс. 1 — проверка увидела ожидаемое состояние, 0 — отказ или истёкшее ожидание. Это результат нашего помощника, не новая встроенная команда. Сам вызов операции тоже может занять время.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var item = Asc(UO.GetSerial("lasttarget"), 0);
        if (Truth(item == 0))
        {
            return 0;
        }

        return ChangeAndConfirm(1, item);
        return null;
    }

    dynamic ChangeAndConfirm(dynamic layer, dynamic item)
    {
        if (Truth(item == 0))
        {
            return 0;
        }

        if (!(Truth(UO.EquipItems(item))))
        {
            return 0;
        }

        for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
        {
            if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == item))
            {
                return 1;
            }

            UO.Wait(100);
        }

        return 0;
    }

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

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

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

UO.EquipItems(items) — UO.EquipItems(Any)

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

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

При вызове:

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

case "equipitems":

                    return new InjectionValue(ChangeEquipmentItems(ArrayArg(0), true));

UO.EquipLastWeapon

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

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

void UO.EquipLastWeapon();

Запрашивает повторное экипирование последних сохранённых предметов правой и левой руки.

Параметры

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

Возвращает

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

Поведение

  • Bridge хранит _lastRightHand и _lastLeftHand. Ненулевой правый serial передаётся Equip(OneHanded), ненулевой левый — Equip(TwoHanded). Пустые записи пропускаются. Это два возможных запроса, а не атомарное подтверждённое восстановление сервером.

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

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

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

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

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

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

1. Восстановить оружие — прямой скрипт

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

  • Используются только сохранённые bridge serial рук.
UO.EquipLastWeapon();

2. При наличии соединения — функция сценария

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

  • Проверка соединения выполняется перед отправкой запросов.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Connected()))
    {
        UO.EquipLastWeapon();
    }

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

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

  • Полностью объявленный helper вызывает одно восстановление набора рук.
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()
    {
        RestoreWeapons();
        return null;
    }

    void RestoreWeapons()
    {
        UO.EquipLastWeapon();
    }
}

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

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

UO.EquipLastWeapon() — UO.EquipLastWeapon()

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

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

При вызове:

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

case "equiplastweapon": bridge.EquipLastWeapon(); return InjectionValue.Unit;

UO.EquipT

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

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

void UO.EquipT(object? layer, object? @type);

Параметры

  • layer — Слой экипировки. Строка "Rhand" — правая рука (1), "Lhand" — левая рука (2); числовой номер также допустим. Все распознаваемые имена приведены в таблице слоёв. Строка "1" не заменяет число 1: неизвестное строковое имя вызывает ошибку. Выбирайте реальный слой самой вещи: команда не меняет её допустимый слот.
  • type — Один graphic предмета, например 0x0F51 — кинжал. Это не serial конкретной вещи и не graphic тела mobile. Число или числовая hex-строка. Цвет не задаётся: ищется любой hue; поиск рекурсивно включает загруженные вложенные контейнеры рюкзака. -1/0xFFFF как wildcard поиска здесь практически бесполезны для выбора оружия: будет взята первая вещь, которая может не соответствовать слою.

Возвращает

void: эта C#-форма не возвращает значение. Не присваивайте её вызов переменной и не используйте его в if. Для проверки принятия запроса с двумя целыми аргументами используйте UO.Equipt. В обоих случаях фактическую экипировку после ответа сервера проверяйте через ObjAtLayer и GetType.

Поведение

  • Оба аргумента обязательны. Сначала FindType ищет вещь в рюкзаке, затем Equip проверяет её пригодность. Поиск обновляет общие результаты FindItem/FindCount/GetFoundItems. При нескольких совпадениях выбирается первая подходящая для поиска вещь; отдельного выбора по качеству, hue или имени нет.
  • Клиент проверяет wearable-флаг, фактический слой вещи (1..29) и возможность поднять её. Предмет должен быть загружен. Сервер дополнительно решает, разрешено ли его надеть; принятый локальный запрос не доказывает успех.
  • При отсутствии вещи форма void выводит сообщение No item found; числовая форма возвращает 0. При необходимости подобрать конкретную вещь по цвету/serial используйте отдельные FindType и Equip. UO.Equip принимает ID найденной вещи.
  • В ожидании ответа не запускайте одновременно другой перенос предметов. Проверяйте изменение слоя, а не повторяйте действие бесконечно.

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

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

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

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

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

UO.Print("Calling UO.EquipT");
UO.EquipT("Rhand", 0x0F51);

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

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

  • Строка Rhand выбирает слой правой руки. Кинжал должен быть доступен в загруженном рюкзаке. Цвет любой; количество аргументов всегда два.
if (Truth(UO.Connected()))
{
    UO.EquipT("Rhand", 0x0F51);
}

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

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

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

  • 1 — слой, 0x0F51 — type. Строковая C#-форма EquipT возвращает void; принятие запроса по её результату проверить нельзя. 300 мс — короткое ожидание примера; отсутствие вещи после него не доказывает окончательный отказ сервера.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    UO.EquipT("Rhand", 0x0F51);
    await Delay(300);
    var worn = UO.ObjAtLayer(1);
    if (Truth(worn != 0) && Truth(UO.GetType(worn) == 0x0F51))
    {
        UO.AddObject("equipped_dagger", worn);
    }

    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Полная функция: надеть и дождаться нужного type — класс сценария

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

  • timeoutMs=2000 задаёт максимум ожидания в миллисекундах. Проверка каждые 50 мс не отправляет повторную экипировку. true этой пользовательской функции означает, что клиент уже видит нужный type на слое; это более сильная проверка, чем возвращаемое Equipt принятие запроса.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        if (Truth(UO.Connected()) && !(Truth(await EnsureDagger(2000))))
        {
            UO.Print("Dagger was not confirmed within the timeout");
        }

        return null;
    }

    async Task<dynamic> EnsureDagger(dynamic timeoutMs)
    {
        var worn = UO.ObjAtLayer(1);
        if (Truth(worn != 0) && Truth(UO.GetType(worn) == 0x0F51))
        {
            return true;
        }

        UO.EquipT("Rhand", 0x0F51);
        var started = Now();
        while (Truth(Now() - started < timeoutMs))
        {
            await Delay(50);
            worn = UO.ObjAtLayer(1);
            if (Truth(worn != 0) && Truth(UO.GetType(worn) == 0x0F51))
            {
                return true;
            }
        }

        return false;
    }

    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;
    private int Now() => global::ClassicUO.CSharp.CSharpScriptContext.Current.Now();
}

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

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

UO.EquipT(layer, type) — UO.EquipT(Any,Any)

Параметры: layer (Any), type (Any)

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

При вызове:

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

public void EquipT(InjectionValue layer, InjectionValue type)

        {

            var obj = bridge.FindType(ResolveType(type), -1, bridge.Backpack, -1, true);

            if (obj == 0)

            {

                SystemMessage("No item found.");

                return;

            }



            if (layer.Kind == InjectionValueKind.String)

                Equip(layer.String, obj);

            else

                bridge.Equip(NumberConversions.ToInt(layer), obj);

        }

UO.Equipt

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

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

int UO.Equipt(object? layer, object? @type);

Параметры

  • layer / layer — целый номер слоя экипировки. Правая рука — 1, левая — 2. Выбирайте реальный слот вещи.
  • type / type — целый graphic предмета, например 0x0F51 для кинжала. Это не serial. Ищется любой hue в загруженном содержимом рюкзака и вложенных контейнеров.

Возвращает

Эта C#-форма возвращает int: 1, если клиент принял запрос экипировки, иначе 0. Передавайте два целых числа (номер слоя и graphic); строковые значения выбирают другой контракт runtime и не подходят для этой формы. Вызов не ждёт подтверждения сервера. Для строкового имени слоя используйте UO.EquipT, которая возвращает void.

Поведение

  • Оба аргумента обязательны. Сначала FindType ищет вещь в рюкзаке, затем Equip проверяет её пригодность. Поиск обновляет общие результаты FindItem/FindCount/GetFoundItems. При нескольких совпадениях выбирается первая подходящая для поиска вещь; отдельного выбора по качеству, hue или имени нет.
  • Клиент проверяет wearable-флаг, фактический слой вещи (1..29) и возможность поднять её. Предмет должен быть загружен. Сервер дополнительно решает, разрешено ли его надеть; принятый локальный запрос не доказывает успех.
  • При отсутствии вещи форма null выводит сообщение No item found; числовая форма возвращает 0. При необходимости подобрать конкретную вещь по цвету/serial используйте отдельные FindType и Equip. UO.Equip принимает ID найденной вещи.
  • В ожидании ответа не запускайте одновременно другой перенос предметов. Проверяйте изменение слоя, а не повторяйте действие бесконечно.

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

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

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

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

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

var result = UO.Equipt(1, 0x0F51);
UO.Print("Equipt: " + Convert.ToString(result));

1. Запросить экипировку кинжала по graphic — прямой скрипт

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

  • Оба аргумента — целые числа: слой 1 и graphic кинжала. Значение 1 подтверждает принятие запроса клиентом, а не сервером.
int accepted = UO.Equipt(1, 0x0F51);
UO.Print(accepted != 0 ? "Equip request accepted locally" : "Equip request not accepted");

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

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

  • Ожидание не заменяет проверку: читается фактическая вещь на слое. Скрипт не повторяет перенос бесконечно.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    int accepted = UO.Equipt(1, 0x0F51);
    if (accepted == 0)
        return false;
    await WaitAsync(300);
    int worn = UO.ObjAtLayer(1);
    return worn != 0 && UO.GetType(worn) == 0x0F51;
    return null;
}

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

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

  • Сначала проверяется текущая экипировка; после одного запроса проверка ограничена двадцатью попытками.
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()
    {
        return await EnsureDagger();
        return null;
    }

    async Task<bool> EnsureDagger()
    {
        int current = UO.ObjAtLayer(1);
        if (current != 0 && UO.GetType(current) == 0x0F51)
            return true;
        if (UO.Equipt(1, 0x0F51) == 0)
            return false;
        for (int attempt = 0; attempt < 20; attempt++)
        {
            await WaitAsync(100);
            current = UO.ObjAtLayer(1);
            if (current != 0 && UO.GetType(current) == 0x0F51)
                return true;
        }

        return false;
    }
}

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

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

UO.Equipt(layer, type) — UO.Equipt(Integer,Integer)

Параметры: layer (Integer), type (Integer)

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

При вызове:

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

public int Equipt(int layer, int type)

        {

            int item = bridge.FindType(type, -1, bridge.Backpack, -1, true);

            return item == 0 ? 0 : bridge.Equip(layer, item);

        }

UO.FireResist

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

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

int UO.FireResist();

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

Параметры

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

Возвращает

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

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

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

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

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

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

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

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

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

При вызове:

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

case "fireresist": return new InjectionValue(bridge.FireResistance);

UO.Flying

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

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

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

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

Параметры

  • id — Необязательный 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.Flying();
UO.Print("Flying: " + Convert.ToString(result));

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

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

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

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

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

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

        return UO.Flying();
    }

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

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

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

При вызове:

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

public int Flying() => bridge.Flying(bridge.Self);

UO.Flying(id) — UO.Flying(Any)

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

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

При вызове:

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

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

UO.Frozen

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

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

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

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

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

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

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

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

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

При вызове:

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

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

serial => bridge.GetLocked(serial)

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

() => getter(bridge.Self)

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

UO.Frozen(value) — UO.Frozen(Any)

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

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

При вызове:

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

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

serial => bridge.GetLocked(serial)

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

value => getter(GetObject(value))

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


UO.GetARStatus

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

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

dynamic UO.GetARStatus();

Читает флаг автоматического переподключения текущей менеджерской сессии или глобального клиента.

Параметры

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

Возвращает

int 1 — автоматический reconnect включён; 0 — выключен.

Поведение

  • SessionControl.AutoReconnect имеет приоритет. При отсутствии SessionControl используется Settings.GlobalSettings.Reconnect. Это настройка, а не состояние текущего соединения или число попыток.

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

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

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

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

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

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

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

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

  • Чтение не выполняет подключение.
var enabled = UO.GetARStatus();
UO.Print(Convert.ToString(enabled));

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

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

  • Настройка AR и фактическое соединение — два отдельных значения.
return  RunScenario();
 object? RunScenario()
{
    var enabled = UO.GetARStatus();
    var online = UO.Connected();
    UO.Print(Convert.ToString(enabled) + " " + Convert.ToString(online));
    return null;
}

3. Подключение вручную при выключенном AR — класс сценария

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

  • Connect вручную допускается при выключенном автоматическом reconnect.
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.GetARStatus() == 0) && !(Truth(UO.Connected())))
        {
            UO.Connect();
        }

        return null;
    }

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

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

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

UO.GetARStatus() — UO.GetARStatus()

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

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

При вызове:

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

case "getarstatus": return new InjectionValue(bridge.GetAutoReconnect());

UO.GetAlive

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

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

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

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

Параметры

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

Возвращает

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

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

Поведение

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

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

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

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

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

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

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

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

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

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

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

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

При вызове:

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

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

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

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

() => getter(bridge.Self)

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

UO.GetAlive(value) — UO.GetAlive(Any)

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

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

При вызове:

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

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

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

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

value => getter(GetObject(value))

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


UO.GetArmor

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

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

int UO.GetArmor();

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

Параметры

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

Возвращает

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

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

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

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

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

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

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

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

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

При вызове:

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

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

() => bridge.Armor

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


UO.GetColdResist

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

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

int UO.GetColdResist();

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

Параметры

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

Возвращает

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

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

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

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

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

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

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

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

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

При вызове:

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

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

() => bridge.ColdResistance

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


UO.GetDead

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

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

int UO.GetDead();
int UO.GetDead(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 имеет IsDead, 0 — признака нет или mobile отсутствует. HP=0 само по себе не означает смерть.

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

Поведение

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

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

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

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

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

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

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

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

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

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

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

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

При вызове:

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

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

IsDeadState

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

() => getter(bridge.Self)

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

UO.GetDead(value) — UO.GetDead(Any)

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

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

При вызове:

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

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

IsDeadState

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

value => getter(GetObject(value))

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


UO.GetDex

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

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

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

Читает текущую ловкость (Dexterity, DEX) персонажа.

Параметры

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

Возвращает

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

Поведение

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

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

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

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

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

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

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

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

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

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

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

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

  • before и after разделяет 1000 мс; UO.Wait добавлен в пример. change=after-before бывает положительным, нулевым или отрицательным. Сам по себе он не различает все промежуточные обновления и выход из мира.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.GetDex();
    await Delay(1000);
    var after = UO.GetDex();
    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.GetDex();
        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.GetDex(id);
    var byName = UO.GetDex("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.GetDex() — UO.GetDex()

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

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

При вызове:

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

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

() => bridge.Dexterity

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

UO.GetDex(objID) — UO.GetDex(Any)

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

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

При вызове:

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

case "getdex": return new InjectionValue(arguments.Length > 0 ? bridge.GetDexterity(Arg(0)) : bridge.Dexterity);

UO.GetDexterity

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

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

int UO.GetDexterity();

Читает текущую ловкость (Dexterity, DEX) персонажа.

Параметры

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

Возвращает

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

Поведение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

При вызове:

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

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

() => bridge.Dexterity

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


UO.GetEnergyResist

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

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

int UO.GetEnergyResist();

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

Параметры

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

Возвращает

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

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

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

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

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

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

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

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

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

При вызове:

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

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

() => bridge.EnergyResistance

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

Clone this wiki locally