Skip to content

UO Topic mobiles

Codex edited this page Oct 12, 2026 · 6 revisions

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

Персонажі та істоти

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

Гравці, неігрові персонажі (NPC), монстри й приручені істоти, які вже відомі клієнту. Параметр serial визначає конкретну істоту; body або type — її графічний тип.

Розділи

Тема Команди та пояснення
Гравці UO.GetMobiles · UO.FindMobile
Неігрові персонажі (NPC) UO.IsNpc · UO.FindMobile
Монстри UO.FindType · UO.FindMobile
Приручені істоти UO.GetPetsCurrent · UO.GetPetsMax
Підконтрольні істоти UO.GetFollowers · UO.GetFollowersMax
Ім’я, ідентифікатор і графічний тип UO.GetName · UO.GetSerial · UO.GetType
Координати UO.GetX · UO.GetY · UO.GetZ
Відстань UO.GetDistance
Репутація та статус щодо гравця UO.Notoriety
Стан UO.GetStatus · UO.Alive · UO.Dead · UO.Hidden · UO.Poisoned · UO.Paralyzed
Зміна імені UO.Rename

Усі команди теми

Гравці, NPC та монстри

UO.GetMobile · UO.GetMobiles · UO.IsNpc

Приручені та підконтрольні істоти

UO.Followers · UO.GetFollowers · UO.FollowersMax · UO.GetFollowersMax · UO.PetsCurrent · UO.GetPetsCurrent · UO.PetsMax · UO.GetPetsMax

Репутація та статус щодо гравця

UO.Notoriety · UO.GetNotoriety

Зміна імені

UO.CanChangeName · UO.MobileCanBeRenamed · UO.Rename · UO.RenameMobile

Приклади на тему

Нижче наведено короткі приклади. У повному описі кожної команди є параметри, результат, обмеження та кілька самостійних скриптів: прямий код, варіант із функцією та варіант із класом.

UO.GetMobiles

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

var radius = 12;
var allyStatus = 2;
var anyBody = -1;
var maxHeight = 8;
dynamic nearestFirst = true;
dynamic includeMe = false;
dynamic livingOnly = true;
dynamic visibleOnly = true;
var allies = UO.GetMobiles(radius, allyStatus, anyBody, maxHeight, nearestFirst, includeMe, livingOnly, visibleOnly);
if (Truth(ArrayLength(allies) == 0))
{
    return null;
}
UO.AddObject("leader", allies[0]);
UO.Follow(allies[0], 2, false);

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;

UO.GetNotoriety

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

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

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


UO.CanChangeName

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

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

int UO.CanChangeName(object? id);

Перевіряє відомий клієнту ознака можливості перейменувати mobile.

Параметри

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

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

int 1 — завантажений mobile має ознаку IsRenamable. int 0 — ознака відсутня, об'єкт не є mobile, невідомий чи видалений. Це остання серверна роздільна здатність, наприклад для вихованця. Команда не перейменовує об'єкт і не гарантує, що наступний запит буде прийнято сервером.

Результат команди — числовий прапор: 1 означає виконану умову, 0 — невиконану. Після var result = команда (...) перевіряйте if (result != 0) або if (result == 0). Збережіть результат одного виклику: повторний виклик може виконати дію знову або прочитати стан, що вже змінився.

Поведінка

  • Читається локальна модель клієнта; запитів серверу, очікування та переміщення немає.
  • Результат відноситься до моменту читання. Після UO.Wait або іншої дії об'єкт та його прапори можуть змінитися.
  • Це остання серверна роздільна здатність, наприклад для вихованця. Команда не перейменовує об'єкт і не гарантує, що наступний запит буде прийнято сервером.

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

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

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

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

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

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

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

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

  • Аргумент self явно вибирає свого персонажа. state — лише 1/0.
  • Це остання серверна роздільна здатність, наприклад для вихованця. Команда не перейменовує об'єкт і не гарантує, що наступний запит буде прийнято сервером.
var state = UO.CanChangeName("self");
if (Truth(state))
{
    UO.Print("Rename permission flag is present");
}
else
{
    UO.Print("Rename permission flag is absent");
}

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

2. Перевірити вибраного mobile - функція сценарію

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

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

    return null;
}

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

3. Порівняти стан до та після паузи – клас сценарію

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

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

    async public Task<object?> RunScenarioAsync()
    {
        var target = UO.GetSerial("lasttarget");
        if (Truth(UO.IsNPC(target)))
        {
            var before = UO.CanChangeName(target);
            await Delay(500);
            if (Truth(UO.IsNPC(target)))
            {
                var after = UO.CanChangeName(target);
                if (Truth(before != after))
                {
                    UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
                }
            }
            else
            {
                UO.Print("Mobile left the local world");
            }
        }

        return null;
    }

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

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

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

UO.CanChangeName(id) — UO.CanChangeName(Any)

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

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

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

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

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

UO.Followers

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

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

int UO.Followers();

Допомагає заздалегідь вирішити, чи вистачить персонажу місця для наступної прирученої чи покликаної істоти. Followers показує зайняті слоти управління, FollowersMax — їхня спільна межа. Це не число тварин поряд і не команда руху Follow. Читає лічильник статусу свого персонажа: зайняті слоти управління вихованцями.

Параметри

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

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

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

Поведінка

  • Наприклад, зайнято «3» з «5» — вільно «2» слота. Значення 4 може означати чотири істоти по одному слоту, одне на чотири або іншу комбінацію. Для істоти на 2 слота перевірки «зайнято < максимум» недостатньо: потрібно maximum - current> = 2. Вартість конкретної істоти та ліміт визначає сервер; не підставляйте постійне 5 замість FollowersMax.
  • 0 не доводить, що вихованець втрачений, помер або відпущений: це може бути порожнім або ще не оновленим статусом. Збільшення лічильника – лише додаткова ознака зміни контролю; воно не визначає, яка істота приручена. Перевіряйте також повідомлення сервера та самого вихованця. Ці слоти не рівні місцям у стайні.
  • Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
  • Читання в ігровому потоці бере Player. Followers, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
  • PetsCurrent/Followers повідомляє зайняті слоти управління зі свого статусу type >= 3. Один вихованець може займати кілька слотів; правила для покликаних та приручених істот задає сервер. Це не число видимих ​​mobile, не список ID вихованців і не число тварин поряд.
  • 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.Followers();
UO.Print("Followers: " + Convert.ToString(result));

1. Порахувати доступні слоти перед виходом – прямий скрипт

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

  • current - зайнято, maximum - межа, freeSlots - різниця. При невідомій/нульовій межі або суперечливих даних приклад припиняється, не стверджуючи, що місце є вільним. Команда лише читає останній статус, не вимагає нове оновлення.
var current = UO.Followers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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

2. Перевірити місткість перед Animal Taming – функція сценарію

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

  • Спочатку виберіть потрібну тварину, щоб її ID був у lasttarget. requiredSlots=2 — налаштування прикладу, замініть її реальною вартістю цієї істоти на вашому сервері. При нестачі місця не ставиться target і не викликається навички. Інакше черга мети готується до єдиного аргументу UseSkill("Animal Taming"). Початок спроби не гарантує успіху: важливі навички, дальність, приручення та відповідь сервера.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.Followers();
    var maximum = UO.FollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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. Перевикористовувати перевірку для різної вартості — клас сценарію

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

  • CanAddFollower — повністю оголошений помічник користувача, не нова UO-команда. Він повертає 1/true за достатнього кешованого ліміту, інакше 0/false. Параметр extraSlots — вартість істоти, що додається, не її type/ID. 2 - приклад; функція не приручає та не закликає. Перевірку слід повторити безпосередньо перед дії.
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(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

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

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

        return extraSlots <= 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.Followers() — UO.Followers()

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

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

() => bridge.Followers

Створення API: Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди.


UO.FollowersMax

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

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

int UO.FollowersMax();

Допомагає заздалегідь вирішити, чи вистачить персонажу місця для наступної прирученої чи покликаної істоти. Followers показує зайняті слоти управління, FollowersMax — їхня спільна межа. Це не число тварин поряд і не команда руху Follow. Читає лічильник статусу свого персонажа: максимум слотів управління вихованцями.

Параметри

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

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

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

Поведінка

  • Наприклад, зайнято «3» з «5» — вільно «2» слота. Значення 4 може означати чотири істоти по одному слоту, одне на чотири або іншу комбінацію. Для істоти на 2 слота перевірки «зайнято < максимум» недостатньо: потрібно maximum - current> = 2. Вартість конкретної істоти та ліміт визначає сервер; не підставляйте постійне 5 замість FollowersMax.
  • 0 не доводить, що вихованець втрачений, помер або відпущений: це може бути порожнім або ще не оновленим статусом. Збільшення лічильника – лише додаткова ознака зміни контролю; воно не визначає, яка істота приручена. Перевіряйте також повідомлення сервера та самого вихованця. Ці слоти не рівні місцям у стайні.
  • Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
  • Читання в ігровому потоці бере Player. FollowersMax, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
  • PetsMax/FollowersMax повідомляє загальну дозволену сервером межу слотів зі статусу type >= 3, а не вільні слоти. Зайнятих слотів може бути більше межі. Вільну ємність рахуйте як maximum - current, замінюючи негативний результат на 0. Команда нічого не відпускає, не приручає та не закликає.
  • 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.FollowersMax();
UO.Print("FollowersMax: " + Convert.ToString(result));

1. Порахувати доступні слоти перед виходом – прямий скрипт

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

  • current - зайнято, maximum - межа, freeSlots - різниця. При невідомій/нульовій межі або суперечливих даних приклад припиняється, не стверджуючи, що місце є вільним. Команда лише читає останній статус, не вимагає нове оновлення.
var current = UO.Followers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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

2. Перевірити місткість перед Animal Taming – функція сценарію

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

  • Спочатку виберіть потрібну тварину, щоб її ID був у lasttarget. requiredSlots=2 — налаштування прикладу, замініть її реальною вартістю цієї істоти на вашому сервері. При нестачі місця не ставиться target і не викликається навички. Інакше черга мети готується до єдиного аргументу UseSkill("Animal Taming"). Початок спроби не гарантує успіху: важливі навички, дальність, приручення та відповідь сервера.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.Followers();
    var maximum = UO.FollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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. Перевикористовувати перевірку для різної вартості — клас сценарію

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

  • CanAddFollower — повністю оголошений помічник користувача, не нова UO-команда. Він повертає 1/true за достатнього кешованого ліміту, інакше 0/false. Параметр extraSlots — вартість істоти, що додається, не її type/ID. 2 - приклад; функція не приручає та не закликає. Перевірку слід повторити безпосередньо перед дії.
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(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

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

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

        return extraSlots <= 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.FollowersMax() — UO.FollowersMax()

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

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

() => bridge.FollowersMax

Створення API: Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди.


UO.GetFollowers

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

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

int UO.GetFollowers();

Допомагає заздалегідь вирішити, чи вистачить персонажу місця для наступної прирученої чи покликаної істоти. Followers показує зайняті слоти управління, FollowersMax — їхня спільна межа. Це не число тварин поряд і не команда руху Follow. Читає лічильник статусу свого персонажа: зайняті слоти управління вихованцями.

Параметри

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

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

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

Поведінка

  • Наприклад, зайнято «3» з «5» — вільно «2» слота. Значення 4 може означати чотири істоти по одному слоту, одне на чотири або іншу комбінацію. Для істоти на 2 слота перевірки «зайнято < максимум» недостатньо: потрібно maximum - current> = 2. Вартість конкретної істоти та ліміт визначає сервер; не підставляйте постійне 5 замість FollowersMax.
  • 0 не доводить, що вихованець втрачений, помер або відпущений: це може бути порожнім або ще не оновленим статусом. Збільшення лічильника – лише додаткова ознака зміни контролю; воно не визначає, яка істота приручена. Перевіряйте також повідомлення сервера та самого вихованця. Ці слоти не рівні місцям у стайні.
  • Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
  • Читання в ігровому потоці бере Player. Followers, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
  • PetsCurrent/Followers повідомляє зайняті слоти управління зі свого статусу type >= 3. Один вихованець може займати кілька слотів; правила для покликаних та приручених істот задає сервер. Це не число видимих ​​mobile, не список ID вихованців і не число тварин поряд.
  • 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.GetFollowers();
UO.Print("GetFollowers: " + Convert.ToString(result));

1. Порахувати доступні слоти перед виходом – прямий скрипт

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

  • current - зайнято, maximum - межа, freeSlots - різниця. При невідомій/нульовій межі або суперечливих даних приклад припиняється, не стверджуючи, що місце є вільним. Команда лише читає останній статус, не вимагає нове оновлення.
var current = UO.GetFollowers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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

2. Перевірити місткість перед Animal Taming – функція сценарію

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

  • Спочатку виберіть потрібну тварину, щоб її ID був у lasttarget. requiredSlots=2 — налаштування прикладу, замініть її реальною вартістю цієї істоти на вашому сервері. При нестачі місця не ставиться target і не викликається навички. Інакше черга мети готується до єдиного аргументу UseSkill("Animal Taming"). Початок спроби не гарантує успіху: важливі навички, дальність, приручення та відповідь сервера.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.GetFollowers();
    var maximum = UO.FollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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. Перевикористовувати перевірку для різної вартості — клас сценарію

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

  • CanAddFollower — повністю оголошений помічник користувача, не нова UO-команда. Він повертає 1/true за достатнього кешованого ліміту, інакше 0/false. Параметр extraSlots — вартість істоти, що додається, не її type/ID. 2 - приклад; функція не приручає та не закликає. Перевірку слід повторити безпосередньо перед дії.
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(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

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

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

        return extraSlots <= 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.GetFollowers() — UO.GetFollowers()

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

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

() => bridge.Followers

Створення API: Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди.


UO.GetFollowersMax

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

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

int UO.GetFollowersMax();

Допомагає заздалегідь вирішити, чи вистачить персонажу місця для наступної прирученої чи покликаної істоти. Followers показує зайняті слоти управління, FollowersMax — їхня спільна межа. Це не число тварин поряд і не команда руху Follow. Читає лічильник статусу свого персонажа: максимум слотів управління вихованцями.

Параметри

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

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

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

Поведінка

  • Наприклад, зайнято «3» з «5» — вільно «2» слота. Значення 4 може означати чотири істоти по одному слоту, одне на чотири або іншу комбінацію. Для істоти на 2 слота перевірки «зайнято < максимум» недостатньо: потрібно maximum - current> = 2. Вартість конкретної істоти та ліміт визначає сервер; не підставляйте постійне 5 замість FollowersMax.
  • 0 не доводить, що вихованець втрачений, помер або відпущений: це може бути порожнім або ще не оновленим статусом. Збільшення лічильника – лише додаткова ознака зміни контролю; воно не визначає, яка істота приручена. Перевіряйте також повідомлення сервера та самого вихованця. Ці слоти не рівні місцям у стайні.
  • Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
  • Читання в ігровому потоці бере Player. FollowersMax, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
  • PetsMax/FollowersMax повідомляє загальну дозволену сервером межу слотів зі статусу type >= 3, а не вільні слоти. Зайнятих слотів може бути більше межі. Вільну ємність рахуйте як maximum - current, замінюючи негативний результат на 0. Команда нічого не відпускає, не приручає та не закликає.
  • 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.GetFollowersMax();
UO.Print("GetFollowersMax: " + Convert.ToString(result));

1. Порахувати доступні слоти перед виходом – прямий скрипт

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

  • current - зайнято, maximum - межа, freeSlots - різниця. При невідомій/нульовій межі або суперечливих даних приклад припиняється, не стверджуючи, що місце є вільним. Команда лише читає останній статус, не вимагає нове оновлення.
var current = UO.Followers();
var maximum = UO.GetFollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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

2. Перевірити місткість перед Animal Taming – функція сценарію

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

  • Спочатку виберіть потрібну тварину, щоб її ID був у lasttarget. requiredSlots=2 — налаштування прикладу, замініть її реальною вартістю цієї істоти на вашому сервері. При нестачі місця не ставиться target і не викликається навички. Інакше черга мети готується до єдиного аргументу UseSkill("Animal Taming"). Початок спроби не гарантує успіху: важливі навички, дальність, приручення та відповідь сервера.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.Followers();
    var maximum = UO.GetFollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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. Перевикористовувати перевірку для різної вартості — клас сценарію

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

  • CanAddFollower — повністю оголошений помічник користувача, не нова UO-команда. Він повертає 1/true за достатнього кешованого ліміту, інакше 0/false. Параметр extraSlots — вартість істоти, що додається, не її type/ID. 2 - приклад; функція не приручає та не закликає. Перевірку слід повторити безпосередньо перед дії.
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(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

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

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

        return extraSlots <= 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.GetFollowersMax() — UO.GetFollowersMax()

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

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

() => bridge.FollowersMax

Створення API: Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди.


UO.GetMobile

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

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

dynamic UO.GetMobile(object? id);

Збирає компактний запис властивостей по одному ID.

Параметри

  • id — Serial/ID конкретного об'єкта: int, десятковий/hex-рядок або встановлений аліас self, backpack, lasttarget, lastobject або ім'я AddObject. Це не graphic/type.

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

Array з 9 полів: [0] int serial, [1] string ім'я, [2] int X, [3] int Y, [4] int Z, [5] int HP, [6] int MaxHP, [7] int notoriety, [8] int напрям 0..7. Для невідомого ID масив теж має 9 полів: переданий ID зберігається, ім'я порожнє, недоступні числові властивості рівні 0. Це не повний Pascal record TMobile.

Поведінка

  • Читаються дані, які вже завантажені клієнтом. Команда не відкриває контейнер, не переміщає предмети та не завантажує об'єкти з усього сервера.
  • Array - масив з індексами від 0. Зберігайте його у var, перевіряйте ArrayLength перед доступом. Елементи можуть зникнути зі світу після зйомки: перед дією перевіряйте Exists(serial).
  • Наявність дев'яти полів не підтверджує існування персонажа; Використовуйте Exists. Команда сама не перевіряє, що ID належить саме Mobile. Для предмета можуть повернутися його ім'я/координати та нульові властивості персонажа.
  • HP/MaxHP іншого персонажа залежать від надісланої сервером шкали. Z – висота, не шар екіпірування.

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

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

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

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

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

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

1. Прочитати ім'я та здоров'я свого персонажа — прямий скрипт

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

  • ID=self. [1] - ім'я, [5]/[6] - поточні та максимальні HP, а не Mana.
  • Масив має фіксовані дев'ять полів. Порожнє ім'я та 0/0 можливі до входу у світ.
var mobile = UO.GetMobile("self");
UO.Print(mobile[1] + ": " + Convert.ToString(mobile[5]) + "/" + Convert.ToString(mobile[6]));

2. Прочитати координати обраного персонажа – функція сценарію

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

  • lasttarget повинен вказувати на персонажа. [2]/[3]/[4] — X/Y/Z світу.
  • Спочатку перевіряється наявність об'єкта. Якщо target – предмет у сумці, координати відносяться до його гампа.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(target)))
    {
        var mobile = UO.GetMobile(target);
        UO.Print(Convert.ToString(mobile[2]) + "," + Convert.ToString(mobile[3]) + "," + Convert.ToString(mobile[4]));
    }

    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. Перевірити стан вибраного класу Mobile - скрипт

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

  • [7] – значення notoriety, [8] – напрямок 0..7. Жодне поле не є type.
  • Команда читає відомі дані, не спрямовує персонажа і не перемикає бойовий режим.
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 target = UO.GetSerial("lasttarget");
        if (Truth(UO.Exists(target)))
        {
            var mobile = UO.GetMobile(target);
            UO.Print("Notoriety: " + Convert.ToString(mobile[7]));
            UO.Print("Direction: " + Convert.ToString(mobile[8]));
        }

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

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

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

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

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

case "getmobile":

                {

                    int id = Arg(0);

                    return new InjectionValue(new[]

                    {

                        new InjectionValue(id), new InjectionValue(bridge.GetName(id)), new InjectionValue(bridge.GetX(id)),

                        new InjectionValue(bridge.GetY(id)), new InjectionValue(bridge.GetZ(id)), new InjectionValue(bridge.GetHP(id)),

                        new InjectionValue(bridge.GetMaxHP(id)), new InjectionValue(bridge.GetNotoriety(id)), new InjectionValue(bridge.GetDir(id))

                    });

                }

UO.GetMobiles

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

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

dynamic UO.GetMobiles();
dynamic UO.GetMobiles(object? distance);
dynamic UO.GetMobiles(object? distance, object? notoriety);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest, object? includeSelf);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest, object? includeSelf, object? aliveOnly);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest, object? includeSelf, object? aliveOnly, object? visibleOnly);

Отримує масив ID відповідних завантажених персонажів/NPC. Потрібний, коли скрипту треба перевірити кілька цілей, вибрати свою, порахувати оточення чи додати власну умову перед дією.

Параметри

  • distance — Горизонтальний радіус у клітинах включно: 5 допускає відстань 0..5. Відстань — max(abs(dx),abs(dy)), тому сусідня діагональ теж 1. За замовчуванням або за негативного числа береться UO.FindDistance(), а не безлімітний пошук. 0 залишає ту ж клітину X/Y. Чи не довжина маршруту; перешкоди та поверхи цим параметром не перевіряються.
  • notoriety - Статус відношення до персонажа, отриманий від сервера: 0 - Невідомий, 1 — Innocent, 2 — Ally, 3 — Gray, 4 — Criminal, 5 — Enemy, 6 — Murderer, 7 - Invulnerable. Число означає один статус; "5|6або масив чисел - будь-який з перерахованих. Це не колір одягу і не клас. Негативне число (зазвичай -1), 0xFFFF, "any", порожній рядок або порожній масив окремо відключають цей фільтр. Некоректний рядок без допустимих чисел не знаходить нікого. Порядок статусів пріоритет не задає. Фільтр 5 вибирає Enemy, а не автоматично будь-якого NPC/монстра; реальні значення залежить від сервера.
  • body — Graphic тіла персонажа/NPC, не ID конкретного персонажа і не type одягненої броні. Число, hex-рядок, рядок 0x0190|0x0191" або масив чисел. 0x0190 (400) - чоловік-людина; 0x0191 (401) - жінка-людина. Маска поєднує обидва тіла. Список автоматично не включає інші раси, привидів або перетворення; таблиці стандартних графічних типів тіла. Негативне число (-1 за умовчанням), 0xFFFF, "any", порожній рядок або порожній масив окремо - будь-яке тіло. Невідомий текст без допустимого числа дає результат.
  • maxZ — максимальна abs(Z цілі - Z власного персонажа) включно, в одиницях Z світу. Це не кількість поверхів і не клітинки X/Y. maxZ=4 за Z гравця 10 допускає Z цілі 6..14; 0 вимагає однакової висоти. За замовчуванням/за від’ємного числа використовується UO.FindVertical(). На сходах однакова Z може виключити потрібну ціль. Навіть мала різниця Z не доводить доступність поверху.
  • nearest — true/1 сортує масив від ближнього до дальнього, а за однакової відстані — за serial. false/0 за замовчуванням зберігає порядок клієнта. Це не додатковий радіус і не вибір одного об’єкта.
  • includeSelf — true/1 дозволяє увімкнути self, якщо всі інші фільтри та Ignore це допускають. false/0 за умовчанням виключає self. Включення не гарантує наявність self у результаті.
  • aliveOnly — true/1 виключає mobiles з IsDead != 0; false/0 за умовчанням не додає цієї умови. Не порівняння HP з нулем, не пошук трупів-предметів і не гарантія, що ціль залишиться живою після виклику.
  • visibleOnly — true/1 вимагає IsVisible=1 за поточним станом ClassicUO; false/0 за умовчанням не додає умову. Це видимість завантаженого об'єкта клієнту, а чи не перевірка стін/лінії огляду. Для геометричної перевірки є окрема UO.CheckLOS з координатами; сервер все одно може відхилити дію.

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

Array - serial mobiles. Порожній масив означає відсутність збігів; перевіряйте ArrayLength перед targets[0]. Не body/type, не сумарні HP, не 1/0. Форма без аргументів все одно застосовує FindDistance/FindVertical/Ignore та виключає self.

Поведінка

  • Пошук локальний: тільки вже завантажені mobiles. Враховується Ignore; self виключений, крім явного includeSelf=true у командах, що його підтримують. Контейнери та предмети не є мобільними.
  • Умови застосовуються разом (AND). Допустимі альтернативи всередині body/notoriety об'єднані через OR. Пошук не змінює FindItem, FindCount та GetFoundItems.
  • У body/notoriety маска з допустимими числами використовує саме їх: "any|5" однаково обмежує значенням 5. Порожні/невірні елементи поруч із допустимими числами ігноруються. Для відсутності обмеження передайте окремо -1. Не переносіть це правило на classMask: невідоме ім'я класу відхиляє весь список.
  • Команди не відкривають область світу, не біжать до мети та не перевіряють прохідність маршруту. Між вибором та обробкою сервером стан світу може змінитися.
  • Передача true та 1 рівнозначна для прапорів, false та 0 також. Інші ненульові числа теж перетворюються на true, але 8/9 не є окремими режимами; використовуйте зрозумілі true/false.
  • Підтримуються 0..8 позиційних аргументів. classMask та color у цій команді відсутні; не переносіть сюди порядок аргументів AttackNearest.
  • Масив - знімок ID. Ціль може зникнути пізніше; повторно перевірте Exists, якщо між пошуком та дією було очікування. Нічого не атакує самотужки.

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

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

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

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

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

object? result = UO.GetMobiles(5, 2, -1, 8, true, false, true, true);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Вибрати найближчого союзника та включити слідування — прямий скрипт

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

  • nearestFirst=true робить allies[0] найближчим союзником. Follow включає фонову ходьбу; зупиняється UO.Follow(0). Назва/клас союзника не визначаються цією командою.
var radius = 12;
var allyStatus = 2;
var anyBody = -1;
var maxHeight = 8;
dynamic nearestFirst = true;
dynamic includeMe = false;
dynamic livingOnly = true;
dynamic visibleOnly = true;
var allies = UO.GetMobiles(radius, allyStatus, anyBody, maxHeight, nearestFirst, includeMe, livingOnly, visibleOnly);
if (Truth(ArrayLength(allies) == 0))
{
    return null;
}
UO.AddObject("leader", allies[0]);
UO.Follow(allies[0], 2, false);

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;

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

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

  • Тут nearest=false доречний: важливий лічильник. ArrayLength - число mobiles, не кількість предметів у стосі. Alarm друкує повідомлення у журнал.
return  RunScenario();
 object? RunScenario()
{
    var enemies = UO.GetMobiles(5, "5|6", -1, 4, false, false, true, true);
    var count = ArrayLength(enemies);
    if (Truth(count == 1))
    {
        UO.Attack(enemies[0]);
    }
    else if (Truth(count > 1))
    {
        UO.Alarm();
    }

    return null;
}

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

3. Список на тій же клітці та висоті з включенням себе – клас сценарію

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

  • distance = 0 - однакові X / Y, maxZ - = 0 - однаковий Z. body обмежений двома graphic. includeSelf=true дозволяє self, але він, як і раніше, повинен підходити по body і aliveOnly. Приклад повідомляє про інших персонажів на тій самій клітині.
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 sameCell = UO.GetMobiles(0, -1, "0x0190|0x0191", 0, false, true, true, false);
        var i = 0;
        var others = 0;
        while (Truth(i < ArrayLength(sameCell)))
        {
            if (Truth(sameCell[i] != UO.GetSerial("self")))
            {
                others += 1;
            }

            i += 1;
        }

        if (Truth(others > 0))
        {
            UO.Alarm();
        }

        return null;
    }

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

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

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

UO.GetMobiles() — UO.GetMobiles()

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

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

values => CompactGetMobiles(values)

UO.GetMobiles(distance) — UO.GetMobiles(Any)

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

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

values => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety) — UO.GetMobiles(Any,Any)

Параметри: distance (Any), notoriety (Any)

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

values => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety, body) — UO.GetMobiles(Any,Any,Any)

Параметри: distance (Any), notoriety (Any), body (Any)

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

values => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety, body, maxZ) — UO.GetMobiles(Any,Any,Any,Any)

Параметри: distance (Any), notoriety (Any), body (Any), maxZ (Any)

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

values => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety, body, maxZ, nearest) — UO.GetMobiles(Any,Any,Any,Any,Any)

Параметри: distance (Any), notoriety (Any), body (Any), maxZ (Any), nearest (Any)

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

values => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety, body, maxZ, nearest, includeSelf) — UO.GetMobiles(Any,Any,Any,Any,Any,Any)

Параметри: distance (Any), notoriety (Any), body (Any), maxZ (Any), nearest (Any), includeSelf (Any)

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

values => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety, body, maxZ, nearest, includeSelf, aliveOnly) — UO.GetMobiles(Any,Any,Any,Any,Any,Any,Any)

Параметри: distance (Any), notoriety (Any), body (Any), maxZ (Any), nearest (Any), includeSelf (Any), aliveOnly (Any)

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

values => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety, body, maxZ, nearest, includeSelf, aliveOnly, visibleOnly) — UO.GetMobiles(Any,Any,Any,Any,Any,Any,Any,Any)

Параметри: distance (Any), notoriety (Any), body (Any), maxZ (Any), nearest (Any), includeSelf (Any), aliveOnly (Any), visibleOnly (Any)

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

values => CompactGetMobiles(values)

UO.GetNotoriety

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

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

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

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

Параметри

  • id — Необов'язковий об'єкт тільки у зазначених однопараметричних формах: serial числом/hex-рядком, "self", "lasttarget" або ім'я AddObject. Це не graphic/type. Без аргументу читається свій персонаж. Перед читанням іншого об'єкта перевіряйте UO.Exists; невідоме ім'я не відкриває прицілу.

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

int — 0=unknown, 1=innocent, 2=ally, 3=gray, 4=criminal, 5=enemy, 6=murderer, 7= invulnerable. Це код стану, а не hue, karma чи fame. Невідомий mobile дає 0.

Поведінка

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

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

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

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

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

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

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

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

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

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

2. Використовувати значення у прикладній перевірці – функція сценарію

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

  • Значення читається одного разу без аргументів. Репутацію персонажа використовується у наведеному розрахунку або умові.
  • Числові пороги — приклад умов скрипту, а чи не нові межі клієнта. Поле зберігає серверні одиниці та обмеження, описані вище.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetNotoriety();
    if (Truth(value == 3) || Truth(value == 4))
    {
        UO.Print("Gray or criminal notoriety");
    }

    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. Прочитати властивість вибраного об'єкта - клас сценарію

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

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

     public object? RunScenario()
    {
        if (Truth(UO.Exists("lasttarget")))
        {
            var targetValue = UO.GetNotoriety("lasttarget");
            UO.Print("Selected value: " + Convert.ToString(targetValue));
        }
        else
        {
            UO.Print("Target is not loaded");
        }

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

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

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

() => bridge.GetNotoriety(bridge.Self)

Створення API: Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди.

UO.GetNotoriety(id) — UO.GetNotoriety(Any)

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

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

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

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

case "getnotoriety": return new InjectionValue(bridge.GetNotoriety(Arg(0)));

UO.GetNotoriety(id) — UO.GetNotoriety(Integer)

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

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

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

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

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

UO.GetNotoriety(id) — UO.GetNotoriety(String)

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

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

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

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

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

UO.GetPetsCurrent

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

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

int UO.GetPetsCurrent();

Допомагає заздалегідь вирішити, чи вистачить персонажу місця для наступної прирученої чи покликаної істоти. Followers показує зайняті слоти управління, FollowersMax — їхня спільна межа. Це не число тварин поряд і не команда руху Follow. Читає лічильник статусу свого персонажа: зайняті слоти управління вихованцями.

Параметри

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

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

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

Поведінка

  • Наприклад, зайнято «3» з «5» — вільно «2» слота. Значення 4 може означати чотири істоти по одному слоту, одне на чотири або іншу комбінацію. Для істоти на 2 слота перевірки «зайнято < максимум» недостатньо: потрібно maximum - current> = 2. Вартість конкретної істоти та ліміт визначає сервер; не підставляйте постійне 5 замість FollowersMax.
  • 0 не доводить, що вихованець втрачений, помер або відпущений: це може бути порожнім або ще не оновленим статусом. Збільшення лічильника – лише додаткова ознака зміни контролю; воно не визначає, яка істота приручена. Перевіряйте також повідомлення сервера та самого вихованця. Ці слоти не рівні місцям у стайні.
  • Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
  • Читання в ігровому потоці бере Player. Followers, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
  • PetsCurrent/Followers повідомляє зайняті слоти управління зі свого статусу type >= 3. Один вихованець може займати кілька слотів; правила для покликаних та приручених істот задає сервер. Це не число видимих ​​mobile, не список ID вихованців і не число тварин поряд.
  • 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.GetPetsCurrent();
UO.Print("GetPetsCurrent: " + Convert.ToString(result));

1. Порахувати доступні слоти перед виходом – прямий скрипт

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

  • current - зайнято, maximum - межа, freeSlots - різниця. При невідомій/нульовій межі або суперечливих даних приклад припиняється, не стверджуючи, що місце є вільним. Команда лише читає останній статус, не вимагає нове оновлення.
var current = UO.GetPetsCurrent();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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

2. Перевірити місткість перед Animal Taming – функція сценарію

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

  • Спочатку виберіть потрібну тварину, щоб її ID був у lasttarget. requiredSlots=2 — налаштування прикладу, замініть її реальною вартістю цієї істоти на вашому сервері. При нестачі місця не ставиться target і не викликається навички. Інакше черга мети готується до єдиного аргументу UseSkill("Animal Taming"). Початок спроби не гарантує успіху: важливі навички, дальність, приручення та відповідь сервера.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.GetPetsCurrent();
    var maximum = UO.FollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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. Перевикористовувати перевірку для різної вартості — клас сценарію

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

  • CanAddFollower — повністю оголошений помічник користувача, не нова UO-команда. Він повертає 1/true за достатнього кешованого ліміту, інакше 0/false. Параметр extraSlots — вартість істоти, що додається, не її type/ID. 2 - приклад; функція не приручає та не закликає. Перевірку слід повторити безпосередньо перед дії.
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(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

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

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

        return extraSlots <= 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.GetPetsCurrent() — UO.GetPetsCurrent()

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

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

() => bridge.Followers

Створення API: Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди.


UO.GetPetsMax

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

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

int UO.GetPetsMax();

Допомагає заздалегідь вирішити, чи вистачить персонажу місця для наступної прирученої чи покликаної істоти. Followers показує зайняті слоти управління, FollowersMax — їхня спільна межа. Це не число тварин поряд і не команда руху Follow. Читає лічильник статусу свого персонажа: максимум слотів управління вихованцями.

Параметри

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

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

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

Поведінка

  • Наприклад, зайнято «3» з «5» — вільно «2» слота. Значення 4 може означати чотири істоти по одному слоту, одне на чотири або іншу комбінацію. Для істоти на 2 слота перевірки «зайнято < максимум» недостатньо: потрібно maximum - current> = 2. Вартість конкретної істоти та ліміт визначає сервер; не підставляйте постійне 5 замість FollowersMax.
  • 0 не доводить, що вихованець втрачений, помер або відпущений: це може бути порожнім або ще не оновленим статусом. Збільшення лічильника – лише додаткова ознака зміни контролю; воно не визначає, яка істота приручена. Перевіряйте також повідомлення сервера та самого вихованця. Ці слоти не рівні місцям у стайні.
  • Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
  • Читання в ігровому потоці бере Player. FollowersMax, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
  • PetsMax/FollowersMax повідомляє загальну дозволену сервером межу слотів зі статусу type >= 3, а не вільні слоти. Зайнятих слотів може бути більше межі. Вільну ємність рахуйте як maximum - current, замінюючи негативний результат на 0. Команда нічого не відпускає, не приручає та не закликає.
  • 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.GetPetsMax();
UO.Print("GetPetsMax: " + Convert.ToString(result));

1. Порахувати доступні слоти перед виходом – прямий скрипт

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

  • current - зайнято, maximum - межа, freeSlots - різниця. При невідомій/нульовій межі або суперечливих даних приклад припиняється, не стверджуючи, що місце є вільним. Команда лише читає останній статус, не вимагає нове оновлення.
var current = UO.Followers();
var maximum = UO.GetPetsMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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

2. Перевірити місткість перед Animal Taming – функція сценарію

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

  • Спочатку виберіть потрібну тварину, щоб її ID був у lasttarget. requiredSlots=2 — налаштування прикладу, замініть її реальною вартістю цієї істоти на вашому сервері. При нестачі місця не ставиться target і не викликається навички. Інакше черга мети готується до єдиного аргументу UseSkill("Animal Taming"). Початок спроби не гарантує успіху: важливі навички, дальність, приручення та відповідь сервера.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.Followers();
    var maximum = UO.GetPetsMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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. Перевикористовувати перевірку для різної вартості — клас сценарію

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

  • CanAddFollower — повністю оголошений помічник користувача, не нова UO-команда. Він повертає 1/true за достатнього кешованого ліміту, інакше 0/false. Параметр extraSlots — вартість істоти, що додається, не її type/ID. 2 - приклад; функція не приручає та не закликає. Перевірку слід повторити безпосередньо перед дії.
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(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

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

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

        return extraSlots <= 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.GetPetsMax() — UO.GetPetsMax()

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

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

() => bridge.FollowersMax

Створення API: Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди.


UO.IsNPC

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

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

int UO.IsNPC(object? objID);

Перевіряє завантажений mobile явно переданий serial.

Параметри

  • objID — Обов'язковий serial/ID конкретного об'єкта: int, hex-рядок або аліас self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse або ім'я AddObject. Це не graphic/type. Невстановлене ім'я дозволяється у 0; ніякий новий target команда не відкриває. Тільки у IsNpc також зареєстровано форму без аргументів: використовується self.

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

int 1 - завантажений, не віддалений mobile. int 0 - предмет, невідомий serial або віддалений об'єкт. Назва IsNPC не означає «тільки неігровий персонаж»: власний персонаж та інші гравці теж дають 1.

Результат команди — числовий прапор: 1 означає виконану умову, 0 — невиконану. Після var result = команда (...) перевіряйте if (result != 0) або if (result == 0). Збережіть результат одного виклику: повторний виклик може виконати дію знову або прочитати стан, що вже змінився.

Поведінка

  • Читається локальна модель клієнта; запитів серверу, очікування та переміщення немає.
  • Результат відноситься до моменту читання. Після UO.Wait або іншої дії об'єкт та його прапори можуть змінитися.
  • Ігровий диспетчер обробляє IsNpc та IsNPC як варіанти одного імені; у вихідному коді C# використовуйте точне написання публічної форми. За цим результатом не можна надійно відрізнити гравця від NPC; правила такого розрізнення залежить від сервера.

У C# регістр символів імені значущий: UO.IsNPC вимагає аргумент; форма UO.IsNpc() без аргументів вибирає self. Обидва імені перевіряють mobile, включаючи гравців, а не тільки NPC.

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

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

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

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

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

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

1. Перевірити serial власного персонажа - прямий скрипт

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

  • Ця C#-форма потребує аргументу. Власний персонаж також дає 1; це перевірка mobile, а не виключно NPC.
int mobile = UO.IsNPC(UO.Self());
UO.Print($"Self is a loaded mobile: {mobile != 0}");

2. Відібрати завантажену мету перед читанням координат – функція сценарію

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

  • Serial береться з lasttarget. Координати читаються лише за наявності відомого клієнта mobile.
return  RunScenario();
 object? RunScenario()
{
    string target = UO.GetSerial("lasttarget");
    if (UO.IsNPC(target) == 0)
        return false;
    UO.Print($"Mobile coordinates: {UO.GetX(target)}, {UO.GetY(target)}, {UO.GetZ(target)}");
    return true;
    return null;
}

3. Порівняти персонажа та рюкзак - клас сценарію

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

  • Персонал, що увійшов у світ, є mobile, а рюкзак — предметом. Результат належить моменту локального читання.
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()
    {
        int character = UO.IsNPC(UO.Self());
        int bag = UO.IsNPC(UO.Backpack());
        UO.Print($"Character mobile flag: {character}; backpack mobile flag: {bag}");
        return null;
    }
}

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

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

UO.IsNPC(objID) — UO.IsNPC(Any)

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

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

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

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

case "isnpc": return new InjectionValue(bridge.IsNpc(Arg(0)));

UO.IsNpc

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

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

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

Параметри

  • id — Обов'язковий serial/ID конкретного об'єкта: int, hex-рядок або аліас self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse або ім'я AddObject. Це не graphic/type. Невстановлене ім'я дозволяється у 0; ніякий новий target команда не відкриває. Тільки у IsNpc також зареєстровано форму без аргументів: використовується self.

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

int 1 - завантажений, не віддалений mobile. int 0 - предмет, невідомий serial або віддалений об'єкт. Назва IsNPC не означає «тільки неігровий персонаж»: власний персонаж та інші гравці теж дають 1.

Результат команди — числовий прапор: 1 означає виконану умову, 0 — невиконану. Після var result = команда (...) перевіряйте if (result != 0) або if (result == 0). Збережіть результат одного виклику: повторний виклик може виконати дію знову або прочитати стан, що вже змінився.

Поведінка

  • Читається локальна модель клієнта; запитів серверу, очікування та переміщення немає.
  • Результат відноситься до моменту читання. Після UO.Wait або іншої дії об'єкт та його прапори можуть змінитися.
  • Ігровий диспетчер обробляє IsNpc та IsNPC як варіанти одного імені; у вихідному коді C# використовуйте точне написання публічної форми. За цим результатом не можна надійно відрізнити гравця від NPC; правила такого розрізнення залежить від сервера.

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

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

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

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

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

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

1. Перевірити власного персонажа - прямий скрипт

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

  • Форма без аргументів вибирає self. Результат 1/0 не є serial і не відрізняє NPC від гравця.
int mobile = UO.IsNpc();
if (mobile != 0) UO.Print("Self is a loaded mobile");

2. Розрізнити mobile, предмет та невідому мету — функція сценарію

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

  • Попередньо виберіть lasttarget. Спочатку перевіряється завантаження об'єкта; Класифікація mobile не визначає його ворожість.
return  RunScenario();
 object? RunScenario()
{
    string target = UO.GetSerial("lasttarget");
    if (UO.Exists(target) == 0)
        UO.Print("Target is not loaded");
    else
        UO.Print(UO.IsNpc(target) != 0 ? "Mobile: NPC or player" : "Loaded item");
    return null;
}

3. Читати відомі клієнту хіти тільки у mobile - клас сценарію

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

  • Чужі хіти можуть бути нормалізовані сервером. Перевірка не вимагає повного статусу.
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()
    {
        string target = UO.GetSerial("lasttarget");
        if (UO.IsNpc(target) != 0)
            UO.Print($"Known hits: {UO.GetHP(target)}/{UO.GetMaxHP(target)}");
        return null;
    }
}

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

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

UO.IsNpc() — UO.IsNpc()

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

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

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

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

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

UO.IsNpc(id) — UO.IsNpc(Integer)

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

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

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

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

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

UO.IsNpc(id) — UO.IsNpc(String)

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

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

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

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

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

UO.MobileCanBeRenamed

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

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

int UO.MobileCanBeRenamed(object? mobID);

Перевіряє відомий клієнту ознака можливості перейменувати mobile.

Параметри

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

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

int 1 — завантажений mobile має ознаку IsRenamable. int 0 — ознака відсутня, об'єкт не є mobile, невідомий чи видалений. Це остання серверна роздільна здатність, наприклад для вихованця. Команда не перейменовує об'єкт і не гарантує, що наступний запит буде прийнято сервером.

Результат команди — числовий прапор: 1 означає виконану умову, 0 — невиконану. Після var result = команда (...) перевіряйте if (result != 0) або if (result == 0). Збережіть результат одного виклику: повторний виклик може виконати дію знову або прочитати стан, що вже змінився.

Поведінка

  • Читається локальна модель клієнта; запитів серверу, очікування та переміщення немає.
  • Результат відноситься до моменту читання. Після UO.Wait або іншої дії об'єкт та його прапори можуть змінитися.
  • Це остання серверна роздільна здатність, наприклад для вихованця. Команда не перейменовує об'єкт і не гарантує, що наступний запит буде прийнято сервером.

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

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

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

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

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

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

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

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

  • Аргумент self явно вибирає свого персонажа. state — лише 1/0.
  • Це остання серверна роздільна здатність, наприклад для вихованця. Команда не перейменовує об'єкт і не гарантує, що наступний запит буде прийнято сервером.
var state = UO.MobileCanBeRenamed("self");
if (Truth(state))
{
    UO.Print("Rename permission flag is present");
}
else
{
    UO.Print("Rename permission flag is absent");
}

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

2. Перевірити вибраного mobile - функція сценарію

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

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

    return null;
}

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

3. Порівняти стан до та після паузи – клас сценарію

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

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

    async public Task<object?> RunScenarioAsync()
    {
        var target = UO.GetSerial("lasttarget");
        if (Truth(UO.IsNPC(target)))
        {
            var before = UO.MobileCanBeRenamed(target);
            await Delay(500);
            if (Truth(UO.IsNPC(target)))
            {
                var after = UO.MobileCanBeRenamed(target);
                if (Truth(before != after))
                {
                    UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
                }
            }
            else
            {
                UO.Print("Mobile left the local world");
            }
        }

        return null;
    }

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

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

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

UO.MobileCanBeRenamed(mobID) — UO.MobileCanBeRenamed(Any)

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

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

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

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

case "mobilecanberenamed": return new InjectionValue(bridge.CanChangeName(Arg(0)));

UO.Notoriety

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

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

int UO.Notoriety();

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

Параметри

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

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

int — 0=unknown, 1=innocent, 2=ally, 3=gray, 4=criminal, 5=enemy, 6=murderer, 7= invulnerable. Це код стану, а не hue, karma чи fame. Невідомий mobile дає 0.

Поведінка

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

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

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

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

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

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

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

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

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

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

2. Використовувати значення у прикладній перевірці – функція сценарію

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

  • Значення читається одного разу без аргументів. Репутацію персонажа використовується у наведеному розрахунку або умові.
  • Числові пороги — приклад умов скрипту, а чи не нові межі клієнта. Поле зберігає серверні одиниці та обмеження, описані вище.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.Notoriety();
    if (Truth(value == 3) || Truth(value == 4))
    {
        UO.Print("Gray or criminal notoriety");
    }

    return null;
}

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

3. Спостерігати зміну за одну секунду – клас сценарію

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

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

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.Notoriety();
        await Delay(1000);
        var after = UO.Notoriety();
        if (Truth(before != after))
        {
            UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        }

        return null;
    }

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

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

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

UO.Notoriety() — UO.Notoriety()

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

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

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

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

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

() => bridge.GetNotoriety(bridge.Self)

Створення API: Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди.


UO.PetsCurrent

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

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

int UO.PetsCurrent();

Допомагає заздалегідь вирішити, чи вистачить персонажу місця для наступної прирученої чи покликаної істоти. Followers показує зайняті слоти управління, FollowersMax — їхня спільна межа. Це не число тварин поряд і не команда руху Follow. Читає лічильник статусу свого персонажа: зайняті слоти управління вихованцями.

Параметри

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

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

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

Поведінка

  • Наприклад, зайнято «3» з «5» — вільно «2» слота. Значення 4 може означати чотири істоти по одному слоту, одне на чотири або іншу комбінацію. Для істоти на 2 слота перевірки «зайнято < максимум» недостатньо: потрібно maximum - current> = 2. Вартість конкретної істоти та ліміт визначає сервер; не підставляйте постійне 5 замість FollowersMax.
  • 0 не доводить, що вихованець втрачений, помер або відпущений: це може бути порожнім або ще не оновленим статусом. Збільшення лічильника – лише додаткова ознака зміни контролю; воно не визначає, яка істота приручена. Перевіряйте також повідомлення сервера та самого вихованця. Ці слоти не рівні місцям у стайні.
  • Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
  • Читання в ігровому потоці бере Player. Followers, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
  • PetsCurrent/Followers повідомляє зайняті слоти управління зі свого статусу type >= 3. Один вихованець може займати кілька слотів; правила для покликаних та приручених істот задає сервер. Це не число видимих ​​mobile, не список ID вихованців і не число тварин поряд.
  • 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.PetsCurrent();
UO.Print("PetsCurrent: " + Convert.ToString(result));

1. Порахувати доступні слоти перед виходом – прямий скрипт

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

  • current - зайнято, maximum - межа, freeSlots - різниця. При невідомій/нульовій межі або суперечливих даних приклад припиняється, не стверджуючи, що місце є вільним. Команда лише читає останній статус, не вимагає нове оновлення.
var current = UO.PetsCurrent();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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

2. Перевірити місткість перед Animal Taming – функція сценарію

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

  • Спочатку виберіть потрібну тварину, щоб її ID був у lasttarget. requiredSlots=2 — налаштування прикладу, замініть її реальною вартістю цієї істоти на вашому сервері. При нестачі місця не ставиться target і не викликається навички. Інакше черга мети готується до єдиного аргументу UseSkill("Animal Taming"). Початок спроби не гарантує успіху: важливі навички, дальність, приручення та відповідь сервера.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.PetsCurrent();
    var maximum = UO.FollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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. Перевикористовувати перевірку для різної вартості — клас сценарію

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

  • CanAddFollower — повністю оголошений помічник користувача, не нова UO-команда. Він повертає 1/true за достатнього кешованого ліміту, інакше 0/false. Параметр extraSlots — вартість істоти, що додається, не її type/ID. 2 - приклад; функція не приручає та не закликає. Перевірку слід повторити безпосередньо перед дії.
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(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

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

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

        return extraSlots <= 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.PetsCurrent() — UO.PetsCurrent()

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

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

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

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

case "petscurrent": return new InjectionValue(bridge.Followers);

UO.PetsMax

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

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

int UO.PetsMax();

Допомагає заздалегідь вирішити, чи вистачить персонажу місця для наступної прирученої чи покликаної істоти. Followers показує зайняті слоти управління, FollowersMax — їхня спільна межа. Це не число тварин поряд і не команда руху Follow. Читає лічильник статусу свого персонажа: максимум слотів управління вихованцями.

Параметри

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

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

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

Поведінка

  • Наприклад, зайнято «3» з «5» — вільно «2» слота. Значення 4 може означати чотири істоти по одному слоту, одне на чотири або іншу комбінацію. Для істоти на 2 слота перевірки «зайнято < максимум» недостатньо: потрібно maximum - current> = 2. Вартість конкретної істоти та ліміт визначає сервер; не підставляйте постійне 5 замість FollowersMax.
  • 0 не доводить, що вихованець втрачений, помер або відпущений: це може бути порожнім або ще не оновленим статусом. Збільшення лічильника – лише додаткова ознака зміни контролю; воно не визначає, яка істота приручена. Перевіряйте також повідомлення сервера та самого вихованця. Ці слоти не рівні місцям у стайні.
  • Команда не сприймає аргументів. Використовуйте точні сигнатури вище.
  • Читання в ігровому потоці бере Player. FollowersMax, якщо поточний Player існує і не знищений; інакше 0. Екіпірування не перебирається, бонуси не перераховуються, статус не запитується, очікування поновлення немає. Присутня примара не дорівнює знищеному Player.
  • PetsMax/FollowersMax повідомляє загальну дозволену сервером межу слотів зі статусу type >= 3, а не вільні слоти. Зайнятих слотів може бути більше межі. Вільну ємність рахуйте як maximum - current, замінюючи негативний результат на 0. Команда нічого не відпускає, не приручає та не закликає.
  • 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.PetsMax();
UO.Print("PetsMax: " + Convert.ToString(result));

1. Порахувати доступні слоти перед виходом – прямий скрипт

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

  • current - зайнято, maximum - межа, freeSlots - різниця. При невідомій/нульовій межі або суперечливих даних приклад припиняється, не стверджуючи, що місце є вільним. Команда лише читає останній статус, не вимагає нове оновлення.
var current = UO.Followers();
var maximum = UO.PetsMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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

2. Перевірити місткість перед Animal Taming – функція сценарію

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

  • Спочатку виберіть потрібну тварину, щоб її ID був у lasttarget. requiredSlots=2 — налаштування прикладу, замініть її реальною вартістю цієї істоти на вашому сервері. При нестачі місця не ставиться target і не викликається навички. Інакше черга мети готується до єдиного аргументу UseSkill("Animal Taming"). Початок спроби не гарантує успіху: важливі навички, дальність, приручення та відповідь сервера.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.Followers();
    var maximum = UO.PetsMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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. Перевикористовувати перевірку для різної вартості — клас сценарію

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

  • CanAddFollower — повністю оголошений помічник користувача, не нова UO-команда. Він повертає 1/true за достатнього кешованого ліміту, інакше 0/false. Параметр extraSlots — вартість істоти, що додається, не її type/ID. 2 - приклад; функція не приручає та не закликає. Перевірку слід повторити безпосередньо перед дії.
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(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

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

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

        return extraSlots <= 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.PetsMax() — UO.PetsMax()

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

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

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

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

case "petsmax": return new InjectionValue(bridge.FollowersMax);

UO.Rename

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

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

void UO.Rename(object? mobile, object? newName);

Запитує зміну імені персонажа/вихованця.

Параметри

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

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

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

Поведінка

  • Порядок – serial, потім нове ім'я. Bridge.RenameMobile викликає GameActions.Rename(serial, name). API не перевіряє CanChangeName і не змінює локальне Name сам.
  • Сервер перевіряє право на перейменування. Для вихованця спочатку перевірте MobileCanBeRenamed; запит не гарантує ухвалення імені.

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

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

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

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

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

UO.Print("Calling UO.Rename");
UO.Rename(UO.GetSerial("lasttarget"), "Companion");

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

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

  • Запитує зміну імені персонажа/вихованця.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.MobileCanBeRenamed(id)))
{
    UO.Rename(id, "Companion");
}

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

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

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

  • Порядок – serial, потім нове ім'я. Bridge.RenameMobile викликає GameActions.Rename(serial, name). API не перевіряє CanChangeName і не змінює локальне Name сам.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(id)) && Truth(UO.MobileCanBeRenamed(id)))
    {
        UO.Rename(id, "Guardian");
    }

    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. Повна допоміжна функція – клас сценарію

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

  • Сервер перевіряє право на перейменування. Для вихованця спочатку перевірте MobileCanBeRenamed; запит не гарантує ухвалення імені.
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()
    {
        RenamePet(UO.GetSerial("lasttarget"), "Companion");
        return null;
    }

    void RenamePet(dynamic id, dynamic name)
    {
        if (Truth(UO.MobileCanBeRenamed(id)) && Truth(Len(name) > 0))
        {
            UO.Rename(id, name);
        }
    }

    int Len(object? value) => Convert.ToString(value)?.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.Rename(mobile, newName) — UO.Rename(Any,Any)

Параметри: mobile (Any), newName (Any)

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

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

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

case "rename": bridge.RenameMobile(Arg(0, bridge.LastTarget), Text(1)); break;

UO.RenameMobile

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

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

void UO.RenameMobile(object? mobID, object? newName);

Запитує зміну імені персонажа/вихованця.

Параметри

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

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

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

Поведінка

  • Порядок – serial, потім нове ім'я. Bridge.RenameMobile викликає GameActions.Rename(serial, name). API не перевіряє CanChangeName і не змінює локальне Name сам.
  • Сервер перевіряє право на перейменування. Для вихованця спочатку перевірте MobileCanBeRenamed; запит не гарантує ухвалення імені.

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

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

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

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

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

UO.Print("Calling UO.RenameMobile");
UO.RenameMobile(UO.GetSerial("lasttarget"), "Companion");

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

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

  • Запитує зміну імені персонажа/вихованця.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.MobileCanBeRenamed(id)))
{
    UO.RenameMobile(id, "Companion");
}

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

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

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

  • Порядок – serial, потім нове ім'я. Bridge.RenameMobile викликає GameActions.Rename(serial, name). API не перевіряє CanChangeName і не змінює локальне Name сам.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(id)) && Truth(UO.MobileCanBeRenamed(id)))
    {
        UO.RenameMobile(id, "Guardian");
    }

    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. Повна допоміжна функція – клас сценарію

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

  • Сервер перевіряє право на перейменування. Для вихованця спочатку перевірте MobileCanBeRenamed; запит не гарантує ухвалення імені.
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()
    {
        RenamePet(UO.GetSerial("lasttarget"), "Companion");
        return null;
    }

    void RenamePet(dynamic id, dynamic name)
    {
        if (Truth(UO.MobileCanBeRenamed(id)) && Truth(Len(name) > 0))
        {
            UO.RenameMobile(id, name);
        }
    }

    int Len(object? value) => Convert.ToString(value)?.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.RenameMobile(mobID, newName) — UO.RenameMobile(Any,Any)

Параметри: mobID (Any), newName (Any)

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

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

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

case "renamemobile": bridge.RenameMobile(Arg(0), Text(1)); return InjectionValue.Unit;

Clone this wiki locally