Skip to content

UO Topic character

Codex edited this page Oct 12, 2026 · 9 revisions

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

Персонаж і спорядження

Головна · C# · IDE · Команди UO · За абеткою · Приклади · Мови

Здоров’я, мана, витривалість, характеристики, опір і спорядження свого персонажа. Якщо команда підтримує параметр serial — унікальний ідентифікатор об’єкта, — її можна застосувати до зазначеного персонажа.

Розділи

Тема Команди та пояснення
Ім’я та ідентифікатор UO.Self · UO.GetSerial · UO.GetName · UO.GetTitle · UO.GetSex · UO.GetRace
Характеристики 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
Стан UO.Alive · UO.Dead · UO.Hidden · UO.Poisoned · UO.Frozen · UO.Paralyzed · UO.Flying · UO.WarMode · UO.IsYellowHits
Опір 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
Спорядження UO.GetEquipment · UO.EquipItems · UO.UnequipItems · UO.WearItem
Одягання та зняття спорядження UO.SetDress · UO.Dress · UO.Undress · UO.DressSavedSet
Озброєння та зняття зброї UO.SetArm · UO.Arm · UO.Disarm
Посадка на їздову істоту та спішування UO.Mount · UO.Dismount
Вікно персонажа 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

Одягання та зняття спорядження

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

Озброєння та зняття зброї

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

Посадка на їздову істоту та спішування

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. Сам виклик не створює файл і не гарантує перенесення набору в інший профіль або новий timer. Спочатку збережіть потрібний набір у стані. Завантаження/збереження загального стану клієнта – окремий механізм.
  • Точний збіг поточного та збереженого 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) мілісекунд; Відмінність може бути негативною. Проміжні оновлення можуть бути пропущені. Пауза відноситься, наприклад, не до затримки 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.

Поведінка

  • Читаються вже отримані локальні дані. Запит не відкриває статус і не змушує сервер надіслати оновлення. Після смерті, переходу на карту або видалення об'єкта значення можуть змінитися між двома викликами.
  • 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.

Поведінка

  • Читаються вже отримані локальні дані. Запит не відкриває статус і не змушує сервер надіслати оновлення. Після смерті, переходу на карту або видалення об'єкта значення можуть змінитися між двома викликами.
  • 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.

Поведінка

  • Читаються вже отримані локальні дані. Запит не відкриває статус і не змушує сервер надіслати оновлення. Після смерті, переходу на карту або видалення об'єкта значення можуть змінитися між двома викликами.
  • 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) мілісекунд; Відмінність може бути негативною. Проміжні оновлення можуть бути пропущені. Пауза відноситься, наприклад, не до затримки 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

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

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

void UO.Dismount();

Запитує поспішання, якщо персонаж зараз верхи.

Параметри

Параметрів немає.

Повернене значення

void — значення, що повертається, немає. Викликайте окремим рядком, не порівнюйте результат з 1/true. Перевіряйте шар 25 після відповіді сервера.

Поведінка

  • Команда надсилає запит використання об'єкта протоколу UO (0x06), без емуляції миші. Вона обходить загальний обробник double-click інтерфейсу: у war mode запит не замінюється атакою.
  • Стан верхової тварини читається із шару 25. Воно змінюється після даних сервера; повернення з команди не підтверджує завершення посадки/спішування.
  • Повторні mount/dismount запити тимчасово поєднуються: до зміни шару, зміни персонажа або закінчення 5 секунд новий запит не надсилається. Це захищає від дублювання між скриптами.
  • За відсутності персонажа, поза грою або для мертвого персонажа, запит не надсилається. Остаточні правила володіння, доступності та посадки визначає сервер.
  • Якщо шар 25 порожній, запиту немає і paperdoll не відкривається. Службовий boat item з graphic 0x3E96 не вважається звичайною верховою твариною для цієї команди.
  • UO.Exec("dismount") викликає той самий обробник і використовує той самий захист від повторних запитів. У рядку dismount не можна передавати параметри: зайвий аргумент викликає помилку і надсилає запит.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

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

Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.

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

1. Запитати поспішання – прямий скрипт

Параметри та порядок виконання:

  • Параметрів немає. Значення, що повертається, теж немає.
UO.Dismount();

2. Перевірити наявність верхового предмета до запиту – функція сценарію

Параметри та порядок виконання:

  • ridden — ID шару, не мета для повторного виклику Mount. Dismount приймає нуль аргументів.
return  RunScenario();
 object? RunScenario()
{
    var ridden = UO.ObjAtLayer(25);
    if (Truth(ridden == 0))
    {
        UO.Print("No loaded mount layer");
        return null;
    }

    UO.Print("Mounted item ID: " + Convert.ToString(ridden));
    UO.Dismount();
    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. Повна функція очікування порожнього шару – клас сценарію

Параметри та порядок виконання:

  • Допоміжна функція повертає true, якщо шар уже порожній або став порожнім у межах часу очікування. Вона надсилає не більше одного запиту.
  • Це перевірка стану клієнта після відповіді сервера, а не повертається значення UO.Dismount.
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 dismounted = await TryDismount();
        UO.Print("Mount layer empty: " + Convert.ToString(dismounted));
        return null;
    }

    async Task<dynamic> TryDismount()
    {
        if (Truth(UO.ObjAtLayer(25) == 0))
        {
            return true;
        }

        UO.Dismount();
        var attempts = 0;
        while (Truth(attempts < 20))
        {
            if (Truth(UO.ObjAtLayer(25) == 0))
            {
                return true;
            }

            await Delay(50);
            attempts = attempts + 1;
        }

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

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

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.Dismount() — UO.Dismount()

Параметри: Немає параметрів.

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

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "dismount": bridge.Dismount(); break;

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. Сам виклик не створює файл і не гарантує перенесення набору в інший профіль або новий timer. Спочатку збережіть потрібний набір у стані. Завантаження/збереження загального стану клієнта – окремий механізм.
  • Точний збіг поточного та збереженого 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. Сам виклик не створює файл і не гарантує перенесення набору в інший профіль або новий timer. Спочатку збережіть потрібний набір у стані. Завантаження/збереження загального стану клієнта – окремий механізм.
  • Точний збіг поточного та збереженого 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) мілісекунд; Відмінність може бути негативною. Проміжні оновлення можуть бути пропущені. Пауза відноситься, наприклад, не до затримки 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. Сам виклик не створює файл і не гарантує перенесення набору в інший профіль або новий timer. Спочатку збережіть потрібний набір у стані. Завантаження/збереження загального стану клієнта – окремий механізм.
  • Точний збіг поточного та збереженого 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) мілісекунд; Відмінність може бути негативною. Проміжні оновлення можуть бути пропущені. Пауза відноситься, наприклад, не до затримки 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 — увімкнено автоматичне перепідключення; 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) мілісекунд; Відмінність може бути негативною. Проміжні оновлення можуть бути пропущені. Пауза відноситься, наприклад, не до затримки 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) мілісекунд; Відмінність може бути негативною. Проміжні оновлення можуть бути пропущені. Пауза відноситься, наприклад, не до затримки 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) мілісекунд; Відмінність може бути негативною. Проміжні оновлення можуть бути пропущені. Пауза відноситься, наприклад, не до затримки 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