Skip to content

UO Topic character Part 5

Codex edited this page Oct 12, 2026 · 1 revision

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

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

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

Частини довідника

1 · 2 · 3 · 4 · 5

Повний опис команд


UO.Undress

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

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

int UO.Undress();

Знімає одяг та обладунки з шарів 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. Руки, волосся, бороду, рюкзак, верхова тварина та банк не торкається.

Параметри

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

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

Числовий прапор 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.Undress();
UO.Print("Undress: " + Convert.ToString(result));

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

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

  • Спочатку виберіть потрібну річ у грі: lasttarget - її ID. У прикладі Equip/WearItem шар 1 вимагає зброю правої руки. Unequip(1) знімає праву руку; Disarm/Undress працюють зі своїми фіксованими шарами. Після відмови немає автоматичних повторів.
return UO.Undress();

2. Undress — Два предмети та збережені ID — функція сценарію

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

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

    UO.AddObject("saved_first", first);
    UO.AddObject("saved_second", second);
    return UO.Undress();
    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. Undress — Повна функція з обмеженим очікуванням — клас сценарію

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

  • 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.Undress())))
        {
            return 0;
        }

        dynamic[] layers = new dynamic[checked((int)(16) + 1)];
        layers[0] = 3;
        layers[1] = 4;
        layers[2] = 5;
        layers[3] = 6;
        layers[4] = 7;
        layers[5] = 8;
        layers[6] = 10;
        layers[7] = 12;
        layers[8] = 13;
        layers[9] = 14;
        layers[10] = 17;
        layers[11] = 18;
        layers[12] = 19;
        layers[13] = 20;
        layers[14] = 22;
        layers[15] = 23;
        layers[16] = 24;
        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.Undress() — UO.Undress()

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

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

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

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

public int Undress()

            => Unequip(dressLayers, "Clothing removed.");

UO.Unequip

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

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

int UO.Unequip(object? layer);

Знімає свою річ із вказаного шару у власний рюкзак.

Параметри

  • layer — Номер шару, наприклад 1 — права рука, 2 — ліва. Equip та Unequip також приймають ім'я шару, наприклад "Rhand". WearItem використовує числовий шар. Шар повинен збігатися з wearable шаром предмета; це не 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 та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

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

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

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

  • Спочатку виберіть потрібну річ у грі: lasttarget - її ID. У прикладі Equip/WearItem шар 1 вимагає зброю правої руки. Unequip(1) знімає праву руку; Disarm/Undress працюють зі своїми фіксованими шарами. Після відмови немає автоматичних повторів.
return UO.Unequip(1);

2. Unequip — Два предмети та збережені 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);
    var firstOk = UO.Unequip(1);
    var secondOk = UO.Unequip(2);
    return firstOk != 0 && secondOk != 0;
    return null;
}

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

3. Unequip — Повна функція з обмеженим очікуванням — клас сценарію

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

  • 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 = UO.ObjAtLayerEx(1, UO.Self());
        return ChangeAndConfirm(1, item);
        return null;
    }

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

        if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) != item))
        {
            return 0;
        }

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

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

            UO.Wait(100);
        }

        return 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.Unequip(layer) — UO.Unequip(Any)

Параметри: layer (Any/String)

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

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

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

case "unequip":

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

UO.Unequip(layer) — UO.Unequip(String)

Параметри: layer (Any/String)

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

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

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

public int Unequip(string layer) => bridge.Unequip(ConvertLayer(layer));

UO.UnequipItems

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

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

dynamic UO.UnequipItems(object? items);

Знімає перелічені власні одягнені речі у рюкзак. ID чужої речі не знімає вашу річ з того ж шару.

Параметри

  • 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.UnequipItems(UO.ObjAtLayerEx(1, "self"));
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

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

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

  • Спочатку виберіть потрібну річ у грі: lasttarget - її ID. У прикладі Equip/WearItem шар 1 вимагає зброю правої руки. Unequip(1) знімає праву руку; Disarm/Undress працюють зі своїми фіксованими шарами. Після відмови немає автоматичних повторів.
var item = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(item == 0))
{
    return 0;
}
return UO.UnequipItems(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. UnequipItems — Два предмети та збережені 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);
    dynamic[] items = new dynamic[checked((int)(1) + 1)];
    items[0] = first;
    items[1] = second;
    return UO.UnequipItems(items);
    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. UnequipItems — Повна функція з обмеженим очікуванням — клас сценарію

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

  • 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.ObjAtLayerEx(layer, UO.Self()) != item))
        {
            return 0;
        }

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

        for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
        {
            if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == 0))
            {
                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.UnequipItems(items) — UO.UnequipItems(Any)

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

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

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

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

case "unequipitems":

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

UO.UnsetArm

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

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

void UO.UnsetArm(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. Спочатку збережіть потрібний набір у стані. Завантаження/збереження загального стану клієнта – окремий механізм.
  • Видалення стосується лише запису вибраного імені. Речі залишаються на персонажі, інші імена та інший вид наборів не торкаються. Повторне видалення відсутнього запису допустиме. У UnsetDress та UnsetArm ім'я обов'язкове.
  • UO.SetDress · UO.Dress · UO.DressSavedSet · UO.SetArm · UO.Arm · UO.DressSpeed
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

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

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

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

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

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

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

1. Пряме використання – прямий скрипт

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

  • Видаляється лише вказаний запис. Одяг/зброя не знімається.
UO.UnsetArm("battle");

2. Імена та режим запиту – функція сценарію

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

  • Імена travel та battle видаляються окремо. Одинакове ім'я іншого типу набору зберігається.
return  RunScenario();
 object? RunScenario()
{
    UO.UnsetArm("travel");
    UO.UnsetArm("battle");
    return null;
}

3. Повний допоміжний сценарій - клас сценарію

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

  • CleanupSets — повністю оголошена процедура прибирання двох власних імен. prefix формує імена записів, не файлові шляхи.
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()
    {
        CleanupSets("mine_");
        return null;
    }

    void CleanupSets(dynamic prefix)
    {
        UO.UnsetArm(prefix + "travel");
        UO.UnsetArm(prefix + "battle");
    }
}

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

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

UO.UnsetArm(name) — UO.UnsetArm(String)

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

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

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

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

public void UnsetArm(string name)

        {

            armSets.Remove(name);

            SystemMessage("Arm set removed.");

        }

UO.UnsetDress

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

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

void UO.UnsetDress(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. Спочатку збережіть потрібний набір у стані. Завантаження/збереження загального стану клієнта – окремий механізм.
  • Видалення стосується лише запису вибраного імені. Речі залишаються на персонажі, інші імена та інший вид наборів не торкаються. Повторне видалення відсутнього запису допустиме. У UnsetDress та UnsetArm ім'я обов'язкове.
  • UO.SetDress · UO.Dress · UO.DressSavedSet · UO.SetArm · UO.Arm · UO.DressSpeed
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

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

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

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

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

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

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

1. Пряме використання – прямий скрипт

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

  • Видаляється лише вказаний запис. Одяг/зброя не знімається.
UO.UnsetDress("travel");

2. Імена та режим запиту – функція сценарію

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

  • Імена travel та battle видаляються окремо. Одинакове ім'я іншого типу набору зберігається.
return  RunScenario();
 object? RunScenario()
{
    UO.UnsetDress("travel");
    UO.UnsetDress("battle");
    return null;
}

3. Повний допоміжний сценарій - клас сценарію

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

  • CleanupSets — повністю оголошена процедура прибирання двох власних імен. prefix формує імена записів, не файлові шляхи.
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()
    {
        CleanupSets("mine_");
        return null;
    }

    void CleanupSets(dynamic prefix)
    {
        UO.UnsetDress(prefix + "travel");
        UO.UnsetDress(prefix + "battle");
    }
}

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

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

UO.UnsetDress(name) — UO.UnsetDress(String)

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

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

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

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

public void UnsetDress(string name)

        {

            dressSets.Remove(name);

            SystemMessage("Dress set removed.");

        }

UO.UseOtherPaperdollScroll

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

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

void UO.UseOtherPaperdollScroll(object? objID);

Використовує вказаний serial через bridge.UseObject, зазвичай відкриваючи paperdoll персонажа.

Параметри

  • objID — Serial/ID об'єкта: int, числова/hex-рядок або встановлений аліас, наприклад "lasttarget". Це не graphic/type. До дії перевіряйте завантажений об'єкт.

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

void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.

Поведінка

  • ObjID відноситься до персонажа, не до ID кнопки прокручування. Виклик не читає структуру paperdoll і не чекає її відкриття.
  • Bridge надсилає запит на ігровому потоці. Діють правила сервера; вбудованого очікування підтвердження немає.

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

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

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

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

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

UO.Print("Calling UO.UseOtherPaperdollScroll");
UO.UseOtherPaperdollScroll(UO.GetSerial("lasttarget"));

1. Прямий виклик – прямий скрипт

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

  • Використовує вказаний serial через bridge.UseObject, зазвичай відкриваючи paperdoll персонажа.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
    UO.UseOtherPaperdollScroll(id);
}

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

2. Явний варіант – функція сценарію

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

  • ObjID відноситься до персонажа, не до ID кнопки прокручування. Виклик не читає структуру paperdoll і не чекає її відкриття.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("self");
    if (Truth(UO.Exists(id)))
    {
        UO.UseOtherPaperdollScroll(id);
    }

    return null;
}

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

3. Повна допоміжна функція – клас сценарію

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

  • Bridge надсилає запит на ігровому потоці. Діють правила сервера; вбудованого очікування підтвердження немає.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        ApplyToLoaded(UO.GetSerial("lasttarget"));
        return null;
    }

    void ApplyToLoaded(dynamic id)
    {
        if (Truth(UO.Exists(id)))
        {
            UO.UseOtherPaperdollScroll(id);
        }
    }

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

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

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

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

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

case "useotherpaperdollscroll": bridge.UseObject(Arg(0)); return InjectionValue.Unit;

UO.UseSelfPaperdollScroll

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

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

void UO.UseSelfPaperdollScroll();

Використовує поточний персонаж, зазвичай відкриваючи paperdoll.

Параметри

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

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

void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.

Поведінка

  • ExecuteClientApiCompatibility викликає bridge.UseObject(bridge.Self). Немає окремого читання чи натискання елемента paperdoll; це звичайний запит UseObject для self.
  • У прикладах UO.Wait задає лише паузу скрипта; закінчення паузи не доводить виконання запиту сервером.

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

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

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

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

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

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

1. Прямий виклик – прямий скрипт

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

  • Використовує поточний персонаж, зазвичай відкриваючи paperdoll.
UO.UseSelfPaperdollScroll();

2. Явний варіант – функція сценарію

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

  • ExecuteClientApiCompatibility викликає bridge.UseObject(bridge.Self). Немає окремого читання чи натискання елемента paperdoll; це звичайний запит UseObject для self.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Self() != 0))
    {
        UO.UseSelfPaperdollScroll();
    }

    return null;
}

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

3. Повна допоміжна функція – клас сценарію

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

  • У прикладах UO.Wait задає лише паузу скрипта; закінчення паузи не доводить виконання запиту сервером.
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()
    {
        UO.UseSelfPaperdollScroll();
        UO.Wait(500);
        UO.Print(UO.Name());
        return null;
    }
}

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

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

UO.UseSelfPaperdollScroll() — UO.UseSelfPaperdollScroll()

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

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

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

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

case "useselfpaperdollscroll": bridge.UseObject(bridge.Self); return InjectionValue.Unit;

UO.WearItem

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

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

dynamic UO.WearItem(object? layer, object? objID);

Вдягає обраний предмет на числовий шар свого персонажа.

Параметри

  • layer — Номер шару, наприклад 1 — права рука, 2 — ліва. Equip та Unequip також приймають ім'я шару, наприклад "Rhand". WearItem використовує числовий шар. Шар повинен збігатися з wearable шаром предмета; це не graphic і не ID.
  • objID — 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: " + Convert.ToString(UO.WearItem(1, item)));

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

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

  • Спочатку виберіть потрібну річ у грі: lasttarget - її ID. У прикладі Equip/WearItem шар 1 вимагає зброю правої руки. Unequip(1) знімає праву руку; Disarm/Undress працюють зі своїми фіксованими шарами. Після відмови немає автоматичних повторів.
var item = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(item == 0))
{
    return 0;
}
return UO.WearItem(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. WearItem — Два предмети та збережені 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.WearItem(1, first);
    var secondOk = UO.WearItem(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. WearItem — Повна функція з обмеженим очікуванням — клас сценарію

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

  • 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.WearItem(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.WearItem(layer, objID) — UO.WearItem(Any,Any)

Параметри: layer (Any), objID (Any)

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

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

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

case "wearitem": return new InjectionValue(bridge.Equip(Arg(0), Arg(1)));

UO.Weight

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

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

int UO.Weight();

Читає лічильник статусу свого персонажа: поточна вага у stones.

Параметри

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

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

int — поточна вага в stones, 0..65535 у моделі клієнта. 0 може бути реальним значенням, відсутністю даних або відсутнім/знищеним Player. Ця кількість не bool, ID або type: 1 означає одну одиницю, а не успіх. Команда не перебирає об'єкти та не повертає масив.

Поведінка

  • Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
  • Читання в ігровому потоці бере Player. Weight, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
  • Weight читає загальну вагу, повідомлену сервером, у stones. Які ваги тіла, екіпірування та вкладених сумок входять до суми, визначають правила шарду. Команда не оминає контейнери, не підсумовує ваги предметів та не оновлює закриті сумки. Це не властивість Weight окремого предмету та не число items.
  • CharacterStatus перевіряє обов'язкове тіло до оновлення. Weight є у своєму розширеному статусі, слоти - з type 3, Luck - з type 4, серверний WeightMax - з type 5. Компактний/старий пакет без необов'язкового лічильника залишає його попередній кеш. Новий Player починає з нулів; дзвінок не доводить отримання свіжого статусу.
  • Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди. C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
  • Кожен дзвінок читає локальні дані заново. Змінна зберігає знімок; окремі читання можуть отримати різні оновлення сервера. Ненульовий результат не перевіряє підключення. Нуль може бути значенням чи відсутністю даних.

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

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

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

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

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

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

1. Вивести збережений лічильник - прямий скрипт

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

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

2. Спостерігати зміну – функція сценарію

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

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

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

3. Повна допоміжна функція – клас сценарію

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

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

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

        return null;
    }

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

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

        return extra <= maximum - current;
    }

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

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

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

UO.Weight() — UO.Weight()

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

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

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

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

case "weight": return new InjectionValue(bridge.Weight);

Clone this wiki locally