Skip to content

UO Topic search Part 2

Codex edited this page Oct 12, 2026 · 3 revisions

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

Пошук об’єктів — 2

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

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

1 · 2

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


UO.FindMan

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

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

void UO.FindMan();
dynamic UO.FindMan(object? notoriety);
dynamic UO.FindMan(object? notoriety, object? distance);
dynamic UO.FindMan(object? notoriety, object? distance, object? nearest);
dynamic UO.FindMan(object? notoriety, object? distance, object? nearest, object? maxZ);
dynamic UO.FindMan(object? notoriety, object? distance, object? nearest, object? maxZ, object? body);
dynamic UO.FindMan(object? notoriety, object? distance, object? nearest, object? maxZ, object? body, object? color);
dynamic UO.FindMan(object? notoriety, object? distance, object? nearest, object? maxZ, object? body, object? color, object? includeSelf);

Знаходить один serial по notoriety, відстані, висоті, тілу та hue. Застосовується попереднього вибору мети без автоматичної атаки.

Параметри

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

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

int serial, або 0 без результату. Перевіряйте id != 0; це не bool і не кількість. Не змінює FindItem/FindCount/GetFoundItems і не починає атаку.

Поведінка

  • Пошук локальний: тільки вже завантажені 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.
  • Точний порядок: notoriety, distance, nearest, maxZ, body, color, includeSelf. Відрізняється від AttackNearest та GetMobiles.
  • Немає параметрів classMask, aliveOnly або visibleOnly. За потреби перевіряйте знайдений ID окремо; для вибору серед усіх живих/видимих ​​використовуйте GetMobiles, щоб мертвий найближчий не заступав інших.

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

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

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

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

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

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

1. Знайти та зберегти найближчого союзника — прямий скрипт

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

  • 2 - Ally, 12 - радіус. Решта: nearest=true, maxZ=FindVertical(), будь-яке body/hue, self виключено. Команда лише зберігає ціль, не атакує.
var ally = UO.FindMan(2, 12);
if (Truth(ally == 0))
{
    return null;
}
UO.AddObject("ally_nearby", ally);

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

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

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

  • Перевірка IsDead виконана окремо. body ставить тіла; bodyHue=-1 не обмежує їх hue. По одязі ця команда не класифікує.
return  RunScenario();
 object? RunScenario()
{
    var status = 5;
    var radius = 8;
    dynamic nearest = true;
    var height = 4;
    var bodies = "0x0190|0x0191";
    var bodyHue = -1;
    dynamic includeMe = false;
    var enemy = UO.FindMan(status, radius, nearest, height, bodies, bodyHue, includeMe);
    if (Truth(enemy != 0))
    {
        if (Truth(UO.IsDead(enemy) == 0))
        {
            UO.Attack(enemy);
        }
    }

    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 з конкретним hue - клас сценарію

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

  • Перший -1 відключає notoriety, другий -1 відключає body. false у третій позиції вимикає сортування; останній false виключає self. Hue одяг не перевіряється.
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 chosenHue = 0x0455;
        var mobile = UO.FindMan(-1, 10, false, 8, -1, chosenHue, false);
        if (Truth(mobile == 0))
        {
            return null;
        }

        UO.AddObject("body_hue_match", mobile);
        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.FindMan() — UO.FindMan()

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

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

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

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

case "findman":

                {

                    int mobile = bridge.GetMobiles().FirstOrDefault();

                    if (mobile != 0) state.Objects.Set(arguments.Length > 0 ? Text(0) : "findman", mobile);

                    break;

                }

UO.FindMan(notoriety) — UO.FindMan(Any)

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

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

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

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

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

values => new InjectionValue(CompactFindMan(values))

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

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

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

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

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

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

values => new InjectionValue(CompactFindMan(values))

UO.FindMan(notoriety, distance, nearest) — UO.FindMan(Any,Any,Any)

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

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

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

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

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

values => new InjectionValue(CompactFindMan(values))

UO.FindMan(notoriety, distance, nearest, maxZ) — UO.FindMan(Any,Any,Any,Any)

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

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

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

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

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

values => new InjectionValue(CompactFindMan(values))

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

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

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

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

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

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

values => new InjectionValue(CompactFindMan(values))

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

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

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

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

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

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

values => new InjectionValue(CompactFindMan(values))

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

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

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

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

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

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

values => new InjectionValue(CompactFindMan(values))

UO.FindMobile

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

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

int UO.FindMobile();
int UO.FindMobile(object? stateFilter);
int UO.FindMobile(object? stateFilter, object? rangeFilter);
int UO.FindMobile(object? stateFilter, object? rangeFilter, object? verticalFilter);
int UO.FindMobile(object? stateFilter, object? rangeFilter, object? verticalFilter, object? directionOrKind);
int UO.FindMobile(object? stateFilter, object? rangeFilter, object? verticalFilter, object? directionFilter, object? kindFilter);

Знаходить одного найближчого завантаженого персонажа/істота за спільними рядковими фільтрами. Самого гравця виключає.

Параметри

  • stateFilter - Зазвичай all / alive / dead; необов'язковий. Всі аргументи в реалізації є рядками фільтрів, тому можна об'єднати кілька слів в одному аргументі.
  • rangeFilter — Зазвичай all/near (0..4) / medium (5..9) / far (від 10 до загального радіусу). Числовий радіус у цій позиції не приймається; загальна межа змінюється через UO.FindDistance(value).
  • verticalFilter - all / above / below. above: candidate.Z > self.Z, нижче: candidate.Z < self.Z. Це не поверх і не числовий допуск Z.
  • directionOrKind — Четверта позиція форми з чотирма аргументами: all, north/south/east/west чи human/npc/mob. Може бути складовим рядком.
  • directionFilter — Четверта позиція форми з п'ятьма аргументами: all або порівняння X/Y north/south/east/west. Це розташування відносно self, а не напрям погляду.
  • kindFilter - П'ята позиція: all / human / npc / mob. human включає чоловічі та жіночі тіла: 0x0190 — чоловік-людина, 0x0191 — жінка-людина, а також стандартні тіла ельфів/горгулій та привидів. Повний перелік: human. npc - IsNpc і human; mob - IsNpc і НЕ human. Слова monster та female не приймаються.

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

int: serial одного mobile, або 0, якщо збігів немає. Це не кількість, не масив, не type і не bool. Перевірка found != 0 означає наявність результату; порівняння found == true неприпустимо в C#: int не порівнюється з bool.

Поведінка

  • Застосовується в UO.FindMobile: від 0 до 5 аргументів. Пропущені хвостові аргументи дорівнюють all. Кожен аргумент може містити одне слово або кілька слів, розділених пробілом, табуляцією, комою, крапкою з комою, | або +. Усі умови об'єднуються через AND; символ | тут не означає OR.
  • Пошук переглядає тільки завантажені mobiles, виключає self і обмежує відстань величиною max(1, UO.FindDistance()). Відстань вимірюється за правилом max(abs(dx), abs(dy)); діагональна клітина вважається однією. Для об'єктів, що рухаються, дистанція може враховувати чергу кроків, а порівняння X/Y/Z читають поточні координати.
  • З потрібних вибирається найближчий; при рівній дистанції – менший serial. Повертається int serial або 0, а не true/false, кількість чи масив.
  • UO.FindMobile не змінює FindItem/FindCount/GetFoundItems, не застосовує Ignore та UO.FindVertical, не перевіряє видимість, прохідність або лінію огляду. Він не виконує переміщення, вибір target чи завантаження віддалених об’єктів.
  • Числові радіуси/Z/напрями, слова monster, northeast, northwest, southeast, southwest не є фільтрами. Невідоме слово викликає помилку під час перевірки кандидата; якщо кандидатів немає, ця ділянка може не виконатися. Для діагональної області об'єднуйте north east тощо; для числової перевірки використовуйте властивості знайдених об'єктів або UO.GetMobiles().

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

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

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

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

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

var result = UO.FindMobile("all", "all", "above");
UO.Print("FindMobile: " + Convert.ToString(result));

1. Пошук та перевірка результату – прямий скрипт

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

  • Передано all, all, above: Висота об'єкта строго більша за Z персонажа. Рівна Z не підходить.
  • 0 обробляється до читання властивостей. Print показує ID, ім'я та висоти; ніяка ігрова дія не запускається.
var found = UO.FindMobile("all", "all", "above");
if (Truth(found == 0))
{
    UO.Print("No matching mobile");
    return null;
}
UO.Print("ID: " + Convert.ToString(found) + " | Name: " + UO.GetName(found));
UO.Print("Z: " + Convert.ToString(UO.GetZ(found)) + " | Self Z: " + Convert.ToString(UO.GetZ("self")));

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

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

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

  • 18 - зовнішня межа; alive, near, all, all, mob задає спільні умови. near залишається діапазоном до 4, medium - 5..9, far - від ?10?.
  • Finally повертає колишній радіус при звичайному завершенні або помилці, що обробляється. Скрипт не розширює завантаження світу.
return  RunScenario();
 object? RunScenario()
{
    var previous = UO.FindDistance();
    try
    {
        UO.FindDistance(18);
        var found = UO.FindMobile("alive", "near", "all", "all", "mob");
        if (Truth(found != 0))
        {
            UO.Print("Match: " + Convert.ToString(found));
            UO.Print("Distance: " + Convert.ToString(UO.GetDistance(found)));
        }
        else
        {
            UO.Print("No match in the loaded area");
        }
    }
    finally
    {
        UO.FindDistance(previous);
    }

    return null;
}

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

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

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

  • У Helper передається рядок "north east". Це кілька умов одного запиту, а чи не послідовний пошук різних цілей.
  • FindAndDescribe оголошена повністю. Вона повертає ID/0, не змінюючи target чи персонажа.
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 id = FindAndDescribe("north east");
        UO.Print("Returned ID: " + Convert.ToString(id));
        return null;
    }

    dynamic FindAndDescribe(dynamic filters)
    {
        var id = UO.FindMobile(filters);
        if (Truth(id == 0))
        {
            UO.Print("Nothing matched: " + filters);
            return 0;
        }

        UO.Print(UO.GetName(id) + " | " + Convert.ToString(id));
        return id;
    }

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

4. Знайти істоту та окремо перевірити точну дистанцію — прямий скрипт

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

  • alive/all/all/all/mob — п'ять позицій, що підтримуються. Дистанція 2 перевіряється після отримання найближчого результату.
  • Такий скрипт не перевіряє шлях до істоти й не починає рух.
var found = UO.FindMobile("alive", "all", "all", "all", "mob");
if (Truth(found == 0))
{
    UO.Print("No loaded creature");
    return null;
}
if (Truth(UO.GetDistance(found) <= 2))
{
    UO.Print("Creature within two tiles: " + Convert.ToString(found));
}
else
{
    UO.Print("Nearest creature is farther away");
}

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

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

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

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

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

public int FindMobile() => FindMobile(new InjectionValue("all"), new InjectionValue("all"),

            new InjectionValue("all"), new InjectionValue("all"));

UO.FindMobile(stateFilter) — UO.FindMobile(Any)

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

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

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

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

public int FindMobile(InjectionValue stateFilter) => FindMobile(stateFilter, new InjectionValue("all"),

            new InjectionValue("all"), new InjectionValue("all"));

UO.FindMobile(stateFilter, rangeFilter) — UO.FindMobile(Any,Any)

Параметри: stateFilter (Any), rangeFilter (Any)

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

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

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

public int FindMobile(InjectionValue stateFilter, InjectionValue rangeFilter) => FindMobile(stateFilter,

            rangeFilter, new InjectionValue("all"), new InjectionValue("all"));

UO.FindMobile(stateFilter, rangeFilter, verticalFilter) — UO.FindMobile(Any,Any,Any)

Параметри: stateFilter (Any), rangeFilter (Any), verticalFilter (Any)

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

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

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

public int FindMobile(InjectionValue stateFilter, InjectionValue rangeFilter, InjectionValue verticalFilter) =>

            FindMobile(stateFilter, rangeFilter, verticalFilter, new InjectionValue("all"));

UO.FindMobile(stateFilter, rangeFilter, verticalFilter, directionOrKind) — UO.FindMobile(Any,Any,Any,Any)

Параметри: stateFilter (Any), rangeFilter (Any), verticalFilter (Any), directionOrKind (Any)

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

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

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

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

values => new InjectionValue(

                    FindMobile(values[0], values[1], values[2], values[3]))

UO.FindMobile(stateFilter, rangeFilter, verticalFilter, directionFilter, kindFilter) — UO.FindMobile(Any,Any,Any,Any,Any)

Параметри: stateFilter (Any), rangeFilter (Any), verticalFilter (Any), directionFilter (Any), kindFilter (Any)

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

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

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

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

values => new InjectionValue(

                    FindMobile(values[0], values[1], values[2], values[3], values[4]))

UO.FindNotoriety

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

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

dynamic UO.FindNotoriety(object? @type, object? notoriety);
dynamic UO.FindNotoriety(object? @type, object? notoriety, object? distance);
dynamic UO.FindNotoriety(object? @type, object? notoriety, object? distance, object? nearest);
dynamic UO.FindNotoriety(object? @type, object? notoriety, object? distance, object? nearest, object? maxZ);
dynamic UO.FindNotoriety(object? @type, object? notoriety, object? distance, object? nearest, object? maxZ, object? color);
dynamic UO.FindNotoriety(object? @type, object? notoriety, object? distance, object? nearest, object? maxZ, object? color, object? container);

Шукає іншого mobile по одному body/type та дозволеної notoriety. Підходить, коли потрібний певний вид персонажа з необхідним ставленням; розширені форми дозволяють обмежити радіус, висоту та hue. Це лише вибір об'єкта, не атака.

Параметри

  • type - Один числовий graphic тіла або hex-рядок; не serial, не type одягненої речі та не масив. 0x0190 (400) - чоловік-людина, 0x0191 (401) - жінка-людина; це різні точні фільтри. Для двох body потрібні окремі дзвінки або GetMobiles з маскою. -1 або 0xFFFF - будь-яке тіло.
  • notoriety — статус ставлення до персонажа, отриманий від сервера: 0 — невідомий, 1 — Innocent, 2 — Ally, 3 — Gray, 4 — Criminal, 5 — Enemy, 6 — Murderer, 7 — Invulnerable. Число означає один статус; "5|6" або масив чисел — будь-який із перелічених. Це не колір одягу й не клас. Від’ємне число (зазвичай -1), 0xFFFF, "any", порожній рядок або окремий порожній масив вимикають цей фільтр. Некоректний рядок без допустимих чисел не знаходить нікого. Порядок статусів не визначає пріоритет. Фільтр 5 вибирає Enemy, а не автоматично будь-якого NPC/монстра; реальні значення залежать від сервера. Кілька значень об’єднуються як OR: число 5, рядок "5|6" або плоский масив чисел/числових рядків. Можна поєднати плоский масив та окремі аргументи. Порядок значень не визначає пріоритет. Нечислові токени виключаються; повністю помилкова маска не знаходить нічого. Вкладені масиви не є числами й ігноруються як помилкові елементи; багатовимірні маски не підтримуються. Особливість числової форми з двома аргументами: лише від’ємний код вимикає фільтр, числовий 0xFFFF вважається буквальним кодом і зазвичай не знаходить нікого.
  • distance — Горизонтальний радіус у клітинах включно: 5 допускає відстань 0..5. Відстань — max(abs(dx),abs(dy)), тому сусідня діагональ теж 1. За замовчуванням або за негативного числа береться UO.FindDistance(), а не безлімітний пошук. 0 залишає ту ж клітину X/Y. Чи не довжина маршруту; перешкоди та поверхи цим параметром не перевіряються.
  • nearest — false/0 за замовчуванням: перший, що відповідає порядку перерахування світу, без гарантії найближчого або меншого ID. true/1: найближчий, при рівності менший serial.
  • maxZ — максимальна abs(Z цілі - Z власного персонажа) включно, в одиницях Z світу. Це не кількість поверхів і не клітинки X/Y. maxZ=4 за Z гравця 10 допускає Z цілі 6..14; 0 вимагає однакової висоти. За замовчуванням/за від’ємного числа використовується UO.FindVertical(). На сходах однакова Z може виключити потрібну ціль. Навіть мала різниця Z не доводить доступність поверху.
  • color — Hue самого mobile: int або числове/hex-рядок. Негативне число (-1 за умовчанням) і 0xFFFF - будь-який hue; 0 - саме hue 0, а не будь-яке значення. Чи не колір смужки notoriety і не відтінок одягу. Колір одягненої речі цей параметр не перевіряє.
  • container — Відсутнє за промовчанням: світ. При вказівці допустимі ground/"ground"/UO.Ground(), числа 0/1, а також -1/"my" як сумісні позначення світу саме в цій команді. Явний serial контейнер або "backpack" повертає 0: всередині контейнера немає mobiles. Чи не додає пошук речей.

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

int — serial обраного mobile або 0, якщо потрібного немає. Це ID, і ні graphic/type, кількість знайдених об'єктів або true/false: використовуйте if (found != 0) { ... }, не знайдено == true. Знайдений ID можна передати UO.AddObject, UO.Attack або UO.Follow, але кожна ігрова дія викликається окремо.

Поведінка

  • Пошук читає тільки мобільні, вже завантажені клієнтом; знищені записи та Ignore виключені. Сам виклик не відкриває target, не атакує, не йде до мети і не просить сервера віддалені об'єкти.
  • Відстань - геометрична max (abs (dx), abs (dy)), не довжина маршруту. Близькість не гарантує відсутність стіни чи доступність іншого поверху. Стан може змінитися після повернення.
  • Життя, скритність та лінія огляду автоматично не перевіряються. Якщо вони важливі, використовуйте GetMobiles з aliveOnly/visibleOnly або свої перевірки. Наявність сервера статусу Enemy не робить будь-якого NPC відповідним.
  • Від 2 до 7 аргументів. Для передачі maxZ потрібно вказати попередні distance та nearest. Для кількох notoriety в цій команді використовуйте одну маску "5"|6" або плоский масив у другому аргументі; Третій аргумент - distance, не другий статус.
  • Важлива відмінність форм: два аргументи з ЧИСЛОВОЮ notoriety викликають bridge.FindNotoriety, скидають старі FindItem/FindCount/GetFoundItems і записують всі збіги. Два аргументи зі РЯДКОЮ/МАСИВОМ, а також будь-які форми з 3..7 аргументами повертають тільки ID, зберігаючи колишні поля Find*. Не читайте FindCount як результат розширеного запиту.
  • Усі форми виключають self та Ignore, використовують межу Z; фільтри живий/бачимо та лінія огляду відсутні. Відсутність збігів повертає 0. Нечитаний type/distance/maxZ/color викликає помилку перетворення.

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

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

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

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

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

object? result = UO.FindNotoriety(0x0190, 5);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Порахувати чоловіків та жінок з репутацією Enemy - прямий скрипт

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

  • 0x0190 (400) - чоловіче людське тіло, 0x0191 (401) - жіноче. 5 - Enemy. Кожен виклик приймає один body; рядок 0x0190|0x0191 у цій позиції не підтримується. Використовуються поточні FindDistance/FindVertical.
  • Після другого виклику FindItem/FindCount/GetFoundItems відносяться лише до жіночих тел; перше кількість збережено в menCount. Повернені man/woman - перший serial або 0, не кількість. NPC з такими тілами теж можуть потрапити до результату; привиди та інші раси у ці два body не входять.
var man = UO.FindNotoriety(0x0190, 5);
var menCount = UO.FindCount();
var woman = UO.FindNotoriety(0x0191, 5);
var womenCount = UO.FindCount();
UO.Print("Male humans: " + Convert.ToString(menCount));
UO.Print("Female humans: " + Convert.ToString(womenCount));
UO.Print("Total humans: " + Convert.ToString(menCount + womenCount));

2. Найближчий із двох статусів з обмеженням висоти — функція сценарію

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

  • -1 у першому параметрі - будь-яке тіло; -1 у шостому - будь-який hue. ground - світ. FindCount після цієї форми не оновлено; використовуйте found.
return  RunScenario();
 object? RunScenario()
{
    var found = UO.FindNotoriety(-1, "5|6", 12, true, 4, -1, "ground");
    if (Truth(found != 0))
    {
        UO.AddObject("near_enemy", found);
    }

    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. Масив статусів у другому параметрі – клас сценарію

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

  • Масив містить два коди. Відсутні хвостові аргументи означають поточний радіус/Z, nearest=false та будь-який hue. Це не запис UO.FindNotoriety(type,5,6): там 6 було б радіусом.
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()
    {
        dynamic[] allowed = new dynamic[checked((int)(1) + 1)];
        allowed[0] = 5;
        allowed[1] = 6;
        var found = UO.FindNotoriety(0x0191, allowed);
        if (Truth(found != 0))
        {
            UO.AddObject("allowed_mobile", found);
            UO.Print("Selected ID: " + Convert.ToString(found));
        }

        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.FindNotoriety(type, notoriety) — UO.FindNotoriety(Any,Any)

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

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

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

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

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

values => new InjectionValue(CompactFindNotoriety(values))

UO.FindNotoriety(type, notoriety, distance) — UO.FindNotoriety(Any,Any,Any)

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

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

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

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

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

values => new InjectionValue(CompactFindNotoriety(values))

UO.FindNotoriety(type, notoriety, distance, nearest) — UO.FindNotoriety(Any,Any,Any,Any)

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

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

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

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

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

values => new InjectionValue(CompactFindNotoriety(values))

UO.FindNotoriety(type, notoriety, distance, nearest, maxZ) — UO.FindNotoriety(Any,Any,Any,Any,Any)

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

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

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

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

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

values => new InjectionValue(CompactFindNotoriety(values))

UO.FindNotoriety(type, notoriety, distance, nearest, maxZ, color) — UO.FindNotoriety(Any,Any,Any,Any,Any,Any)

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

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

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

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

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

values => new InjectionValue(CompactFindNotoriety(values))

UO.FindNotoriety(type, notoriety, distance, nearest, maxZ, color, container) — UO.FindNotoriety(Any,Any,Any,Any,Any,Any,Any)

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

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

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

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

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

values => new InjectionValue(CompactFindNotoriety(values))

UO.FindQuantity

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

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

dynamic UO.FindQuantity();

Читає поточну кількість у першому результаті пошуку.

Параметри

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

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

int — поточний Amount предмета з serial FindItem, 1 для існуючого персонажа, 0 для відсутнього/віддаленого об'єкта. Інші знайдені стоси не підсумовуються. На відміну від FindFullQuantity, кількість читається з поточного об'єкта під час виклику.

Поведінка

  • Дані належать до останнього звичайного пошуку цього скрипта. FindType з 1–5 аргументами, FindTypeEx, Count/CountEx/CountGround замінюють результати. Розширені фільтровані команди персонажів не повинні змінювати цей знімок.
  • Новий пошук без збігів обнуляє FindItem, FindCount та FindFullQuantity та очищує GetFoundItems. Читання результату саме собою новий пошук не запускає.

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

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

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

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

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

UO.FindType(0x0EED, -1, "backpack");
object? result = UO.FindQuantity();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Виміряти результат пошуку золота – прямий скрипт

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

  • type=0x0EED - золото; color=-1 - будь-який hue; backpack — лише прямий вміст рюкзака у цій формі FindType.
  • int — поточний Amount предмета з serial FindItem, 1 для існуючого персонажа, 0 для відсутнього/віддаленого об'єкта. Інші знайдені стоси не підсумовуються. На відміну від FindFullQuantity, кількість читається з поточного об'єкта під час виклику.
var found = UO.FindType(0x0EED, -1, "backpack");
var value = UO.FindQuantity();
UO.Print(Convert.ToString(value));

2. Порівняти предмети та одиниці - функція сценарію

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

  • Усі чотири читання відносяться до одного пошуку, доки між ними не викликано іншого пошуку.
  • Наприклад, дві стопки по 50: Items = 2, First stack = 50, All units = 100; First ID містить унікальний ID однієї стопки.
return  RunScenario();
 object? RunScenario()
{
    var found = UO.FindType(0x0EED, -1, "backpack");
    UO.Print("Items: " + Convert.ToString(UO.FindCount()));
    UO.Print("First stack: " + Convert.ToString(UO.FindQuantity()));
    UO.Print("All units: " + Convert.ToString(UO.FindFullQuantity()));
    UO.Print("First ID: 0x" + Hex(UO.FindItem()));
    return null;
}

string Hex(object? value) => Convert.ToInt64(value).ToString("X");

3. Зберегти результат до наступного пошуку – клас сценарію

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

  • Перший type - золото, другий 0x0F7A - окремий тип реагенту. Нова команда змінює спільний знімок.
  • saved залишається числом із першого пошуку. Друге читання відноситься до реагента навіть за відсутності збігів.
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 found = UO.FindType(0x0EED, -1, "backpack");
        var saved = UO.FindQuantity();
        found = UO.FindType(0x0F7A, -1, "backpack");
        UO.Print("Saved: " + Convert.ToString(saved));
        UO.Print("Current: " + Convert.ToString(UO.FindQuantity()));
        return null;
    }
}

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

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

UO.FindQuantity() — UO.FindQuantity()

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

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

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

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

case "findquantity": return new InjectionValue(bridge.FindQuantity());

UO.FindType

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

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

string UO.FindType(object? @type);
string UO.FindType(object? @type, object? color);
string UO.FindType(object? @type, object? color, object? container);
string UO.FindType(object? @type, object? color, object? container, object? range);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? recursive);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest, object? maxZ);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest, object? maxZ, object? mobileOnly);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest, object? maxZ, object? mobileOnly, object? itemOnly);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest, object? maxZ, object? mobileOnly, object? itemOnly, object? includeIgnored);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest, object? maxZ, object? mobileOnly, object? itemOnly, object? includeIgnored, object? includeSelf);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest, object? maxZ, object? mobileOnly, object? itemOnly, object? includeIgnored, object? includeSelf, object? aliveOnly);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest, object? maxZ, object? mobileOnly, object? itemOnly, object? includeIgnored, object? includeSelf, object? aliveOnly, object? visibleOnly);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest, object? maxZ, object? mobileOnly, object? itemOnly, object? includeIgnored, object? includeSelf, object? aliveOnly, object? visibleOnly, object? nameMask);

Шукає серед уже завантажених клієнтом предметів та персонажів. Можна шукати за типом, кольором, контейнером, відстанню та додатковими фільтрами. Результат - hex-рядок serial вибраного об'єкта; порожній рядок означає відсутність збігу. Команда сама не відкриває контейнери, не підбирає предмет та не атакує знайдену мету.

Параметри

  • type - Один graphic предмета або body персонажа: ціле число або числове рядок. 0x0EED - золото; 0x0190 (400) - чоловік-людина; 0x0191 (401) - жінка-людина. Один type 0x0190 не включає 0x0191. Для списку персонажів обох статей використовуйте GetMobiles з body="0x0190|0x0191"; маска в цей одиночний аргумент FindType не передається. Негативне значення або 0xFFFF знімає фільтр типу.
  • color - Hue/колір: ціле число або числове рядок. -1 або 0xFFFF означає будь-який колір; 0 - конкретно hue 0. Особливість двоаргументної форми: рядки "ground", "backpack", "my" на другій позиції вибирають область пошуку замість кольору. "my" включає обхід завантажених підконтейнерів.
  • container - Область пошуку: "ground" - світ, "backpack" - верхній рівень свого рюкзака, "my" - рюкзак із завантаженими підконтейнерами в короткій формі; також можна передати serial контейнера або збережене ім'я об'єкта. Контейнери не відкриваються автоматично. Розширені форми 7–14 аргументів перебирають прямий вміст заданого контейнера та не мають прапора recursive.
  • range — Четвертий аргумент чотирихаргументної форми: відстань у клітинах. Негативне значення використовує загальне налаштування FindDistance; 0 залишає тільки збіги на тій самій клітині. У предмета в контейнері враховується положення контейнера у світі.
  • distance — Відстань у клітинах на позиції 4 у формах від п'яти аргументів. -1 використовує FindDistance; число 0 і вище ставить явну межу. Це радіус пошуку, а чи не довжина прокладеного маршруту.
  • recursive — ТІЛЬКИ п'ятий аргумент форми з п'яти аргументів: 1/true — шукати також у завантажених підконтейнерах, 0/false — лише верхній рівень. Це не notoriety. Перехід до форми із шести аргументів змінює сенс позиції 5.
  • notoriety — Позиція 5 у формах із 6–14 аргументами. Репутація персонажа: 0 unknown, 1 innocent, 2 ally, 3 attackable, 4 criminal, 5 enemy, 6 murderer, 7 invulnerable. Можна передати число, рядок "3|6" або масив чисел. -1, 0xFFFF або "any" вимикає фільтр. За активного фільтра предмети виключаються, оскільки не мають notoriety.
  • nearest — Позиція 6: 1/true — вибирати найближчого відповідного персонажа, а в розширеній формі 7–14 — найближчого кандидата будь-якого дозволеного виду; при рівній дистанції використовується serial. 0/false зберігає порядок перебору. У вигляді шести аргументів під час переходу до пошуку предметів використовується звичайний порядок пошуку предметів.
  • maxZ — Позиція 7: максимальна абсолютна різниця висоти Z із власним персонажем. 0 - та ж висота; - 1 бере FindVertical. Для предметів усередині контейнера перевіряється висота контейнера. Це не номер поверху.
  • mobileOnly — Позиція 8: 1/true — залишити лише персонажів та мобів; 0/false - дозволити також предмети. Якщо аргументу немає, false.
  • itemOnly — Позиція 9: 1/true — залишити лише предмети; 0/false - дозволити також персонажів. Якщо відсутня, false. Одночасні mobileOnly=true та itemOnly=true дають порожній результат.
  • includeIgnored — Позиція 10: 1/true — дозволити об'єкти з IgnoreList; 0/false - виключити їх. За замовчуванням false. Сам IgnoreList команда не змінює.
  • includeSelf — Позиція 11: 1/true — дозволити власного персонажа серед кандидатів mobile; 0/false - виключити. За замовчуванням false. На предмети не впливає.
  • aliveOnly — Позиція 12: 1/true — виключити мертвих персонажів; 0/false — дозволити обидва стани. За замовчуванням false. Цей фільтр не перевіряє здоров'я предметів.
  • visibleOnly — Позиція 13: 1/true — вимагати позитивну перевірку IsVisible; 0/false - не застосовувати її. За замовчуванням false. Команда все одно працює лише з об'єктами, відомими клієнту.
  • nameMask — Позиція 14: текстова частина імені без урахування регістру. Рядок "orc|troll" дозволяє будь-який з двох збігів; роздільниками також можуть бути кома і крапка з комою. Порожній рядок "any" або "-1" знімає фільтр. Це пошук підрядка, а не регулярний вираз і не маска з *. Якщо аргумент відсутній, фільтр вимкнено.

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

string: наприклад, "0x40001234". Якщо нічого не знайдено - "". Перевіряйте результат порівняння з порожнім рядком. Не плутайте його з кількістю знайдених об'єктів або з кроками до них.

Поведінка

  • Існують форми з 1–14 аргументами, але це не одна довга сигнатура з параметрами, що довільно пропускаються. Виберіть точний рядок синтаксису; аргументи передаються позиційно.
  • Форми 1–5 використовують звичайний пошук та оновлюють FindItem / FindCount / список результатів. Для форм 6–14 використовуйте безпосередньо повернутий рядок: фільтрація персонажів виконується окремим шляхом і не обіцяє оновлення цих загальних значень.
  • У коротких форм за замовчуванням пошук у світі, будь-який колір, відстань FindDistance, без рекурсії. Рядок "my" - спеціальна скорочена форма для рюкзака з підконтейнерами.
  • Форма із шести аргументів спочатку шукає відповідного персонажа; за відсутності фільтра notoriety та відповідного персонажа можливий пошук предметів. Форми 7–14 об'єднують дозволених кандидатів та застосовують додаткові фільтри.
  • Зміна кількості аргументів з п'яти на шість особливо важлива: recursive замінюється на notoriety, а nearest стає шостим аргументом. Значення 1 на позиції 5 тоді означає innocent, а не рекурсивний обхід.

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

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

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

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

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

var result = UO.FindType(0x0EED, -1, "backpack");
UO.Print("FindType: " + Convert.ToString(result));

1. Знайти золото у верхньому рівні рюкзака та обробити відсутність результату — прямий скрипт

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

  • 1: type=0x0EED - шукаємо золото.
  • 2: color=-1 - будь-який hue.
  • 3: container="backpack" - тільки прямий вміст свого рюкзака.
  • gold отримує рядок serial. Перевірка "gold="" відокремлює відсутність предмета від знайденого об'єкта. Info(gold) виводить інформацію; золото не переміщується.
var gold = UO.FindType(0x0EED, -1, "backpack");
if (Truth(gold == ""))
{
    UO.Print("Gold was not found in the loaded backpack");
}
else
{
    UO.Print("Gold serial: " + gold);
    UO.Info(gold);
}

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

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

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

  • 1: wantedType містить graphic 0x0EED.
  • 2: -1 знімає колірний фільтр.
  • 3: "backpack" вибирає кореневий контейнер.
  • 4: -1 використовує поточний FindDistance.
  • 5: recursive=1 включає обхід підконтейнерів; це п'ятиаргументна форма. Вміст закритої сумки, який сервер ще не надіслав, не завантажується.
  • AddObject зберігає знайдений serial під ім'ям found_gold лише після перевірки результату.
return  RunScenario();
 object? RunScenario()
{
    var wantedType = 0x0EED;
    var recursive = 1;
    var found = UO.FindType(wantedType, -1, "backpack", -1, recursive);
    if (Truth(found != ""))
    {
        UO.AddObject("found_gold", found);
        UO.Print("Saved object: " + found);
    }
    else
    {
        UO.Print("No matching item in loaded containers");
    }

    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. Знайти найближчого персонажа з однією з двох репутацій – клас сценарію

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

  • 1: body=-1 дозволяє будь-який body.
  • 2: color=-1 дозволяє будь-який колір.
  • 3: "ground" означає завантажені світові об'єкти.
  • 4: radius=10 обмежує відстань десятьма клітинами.
  • 5: reputation="3|6" - attackable або murderer. Це notoriety, не recursive.
  • 6: nearest=1 просить обрати найближчого. Фільтр репутації виключає предмети. Приклад лише показує інформацію та не атакує мету.
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 body = -1;
        var radius = 10;
        var reputation = "3|6";
        var nearest = 1;
        var found = UO.FindType(body, -1, "ground", radius, reputation, nearest);
        if (Truth(found != ""))
        {
            UO.Print("Matching mobile: " + found);
            UO.Info(found);
        }
        else
        {
            UO.Print("No matching mobile within the radius");
        }

        return null;
    }

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

4. Усі чотирнадцять параметрів: живий видимий моб з відповідним ім'ям – прямий скрипт

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

  • 1 body=-1 та 2 hue=-1 не обмежують тип і колір.
  • 3 scope="ground" - пошук у світі; 4 radius = 5 - не далі п'яти клітин.
  • 5 reputation=-1 дозволяє будь-яку notoriety; 6 nearest=1 вибирає найближчого.
  • 7 maxZ=16 допускає абсолютну різницю висоти до 16 одиниць.
  • 8 mobileOnly=1 виключає предмети; 9 itemOnly=0 не забороняє мобів.
  • 10 includeIgnored=0 зберігає дію IgnoreList.
  • 11 includeSelf=0 виключає свого персонажа.
  • 12 aliveOnly=1 та 13 visibleOnly=1 залишають живих видимих ​​кандидатів.
  • 14 names="orc|troll" вимагає підрядку orc або troll у вже відомому клієнту імені. Усі фільтри повинні виконуватись одночасно.
var body = -1;
var hue = -1;
var scope = "ground";
var radius = 5;
var reputation = -1;
var nearest = 1;
var maxZ = 16;
var mobileOnly = 1;
var itemOnly = 0;
var includeIgnored = 0;
var includeSelf = 0;
var aliveOnly = 1;
var visibleOnly = 1;
var names = "orc|troll";
var found = UO.FindType(body, hue, scope, radius, reputation, nearest, maxZ, mobileOnly, itemOnly, includeIgnored, includeSelf, aliveOnly, visibleOnly, names);
if (Truth(found == ""))
{
    UO.Print("No loaded mobile satisfies every filter");
}
else
{
    UO.Print("Selected serial: " + found);
}

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

5. Скорочена форма пошуку в рюкзаку – функція сценарію

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

  • 1 wantedType=0x0EED — золото.
  • 2 "my" — спеціальний рядок двоаргументної форми: вибирає рюкзак, включає рекурсію та будь-який колір. Тут другий аргумент не є hue.
  • Для верхнього рівня замість "my" передайте "backpack"; для світу - "ground". Число на другій позиції, навпаки, буде кольоровим фільтром.
return  RunScenario();
 object? RunScenario()
{
    var wantedType = 0x0EED;
    var found = UO.FindType(wantedType, "my");
    if (Truth(found != ""))
    {
        UO.Print("Found in backpack or a loaded subcontainer: " + found);
    }
    else
    {
        UO.Print("Nothing found");
    }

    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.FindType(type) — UO.FindType(Any)

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

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

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

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

public string FindType(InjectionValue type)

            => FindType(ResolveType(type));

UO.FindType(type, color) — UO.FindType(Any,Any)

Параметри: type (Any), color (Any)

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

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

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

public string FindType(InjectionValue type, InjectionValue color)

        {

            if (color.Kind == InjectionValueKind.String

                && (color.String.Equals("ground", StringComparison.OrdinalIgnoreCase)

                    || color.String.Equals("backpack", StringComparison.OrdinalIgnoreCase)

                    || color.String.Equals("my", StringComparison.OrdinalIgnoreCase)))

            {

                return FindType(ResolveType(type), -1, ConvertContainer(color), -1, color.String.Equals("my", StringComparison.OrdinalIgnoreCase));

            }



            return FindType(ResolveType(type), NumberConversions.ToInt(color), -1, -1, false);

        }

UO.FindType(type, color, container) — UO.FindType(Any,Any,Any)

Параметри: type (Any), color (Any), container (Any)

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

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

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

public string FindType(InjectionValue type, InjectionValue color, InjectionValue container)

            => FindType(type, color, container, new InjectionValue(-1));

UO.FindType(type, color, container, range) — UO.FindType(Any,Any,Any,Any)

Параметри: type (Any), color (Any), container (Any), range (Any)

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

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

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

public string FindType(InjectionValue type, InjectionValue color, InjectionValue container, InjectionValue range)

        {

            if (container.Kind == InjectionValueKind.String && container.String.Equals("my", StringComparison.OrdinalIgnoreCase))

                return FindType(ResolveType(type), NumberConversions.ToInt(color), ConvertContainer(container), NumberConversions.ToInt(range), true);

            else

                return FindType(ResolveType(type), NumberConversions.ToInt(color), ConvertContainer(container), NumberConversions.ToInt(range), false);

        }

UO.FindType(type, color, container, distance, recursive) — UO.FindType(Any,Any,Any,Any,Any)

Параметри: type (Any), color (Any), container (Any), distance (Any), recursive (Any)

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

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

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

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

values =>

                new InjectionValue(FindType(values[0], values[1], values[2], values[3], values[4]))

UO.FindType(type, color, container, distance, notoriety, nearest) — UO.FindType(Any,Any,Any,Any,Any,Any)

Параметри: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any)

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

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

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

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

values =>

                CompactFindType(values[0], values[1], values[2], values[3], values[4], values[5])

UO.FindType(type, color, container, distance, notoriety, nearest, maxZ) — UO.FindType(Any,Any,Any,Any,Any,Any,Any)

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

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

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

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

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

values => CompactFindTypeExtended(values)

UO.FindType(type, color, container, distance, notoriety, nearest, maxZ, mobileOnly) — UO.FindType(Any,Any,Any,Any,Any,Any,Any,Any)

Параметри: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any), mobileOnly (Any)

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

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

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

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

values => CompactFindTypeExtended(values)

UO.FindType(type, color, container, distance, notoriety, nearest, maxZ, mobileOnly, itemOnly) — UO.FindType(Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметри: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any), mobileOnly (Any), itemOnly (Any)

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

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

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

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

values => CompactFindTypeExtended(values)

UO.FindType(type, color, container, distance, notoriety, nearest, maxZ, mobileOnly, itemOnly, includeIgnored) — UO.FindType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметри: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any), mobileOnly (Any), itemOnly (Any), includeIgnored (Any)

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

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

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

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

values => CompactFindTypeExtended(values)

UO.FindType(type, color, container, distance, notoriety, nearest, maxZ, mobileOnly, itemOnly, includeIgnored, includeSelf) — UO.FindType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметри: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any), mobileOnly (Any), itemOnly (Any), includeIgnored (Any), includeSelf (Any)

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

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

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

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

values => CompactFindTypeExtended(values)

UO.FindType(type, color, container, distance, notoriety, nearest, maxZ, mobileOnly, itemOnly, includeIgnored, includeSelf, aliveOnly) — UO.FindType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметри: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any), mobileOnly (Any), itemOnly (Any), includeIgnored (Any), includeSelf (Any), aliveOnly (Any)

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

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

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

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

values => CompactFindTypeExtended(values)

UO.FindType(type, color, container, distance, notoriety, nearest, maxZ, mobileOnly, itemOnly, includeIgnored, includeSelf, aliveOnly, visibleOnly) — UO.FindType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметри: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any), mobileOnly (Any), itemOnly (Any), includeIgnored (Any), includeSelf (Any), aliveOnly (Any), visibleOnly (Any)

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

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

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

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

values => CompactFindTypeExtended(values)

UO.FindType(type, color, container, distance, notoriety, nearest, maxZ, mobileOnly, itemOnly, includeIgnored, includeSelf, aliveOnly, visibleOnly, nameMask) — UO.FindType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметри: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any), mobileOnly (Any), itemOnly (Any), includeIgnored (Any), includeSelf (Any), aliveOnly (Any), visibleOnly (Any), nameMask (Any)

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

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

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

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

values => CompactFindTypeExtended(values)

UO.FindTypeEx

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

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

int UO.FindTypeEx(object? objType, object? color, object? container, object? inSub);

Шукає одну графіку і колір у контейнері або землі і повертає один знайдений ID.

Параметри

  • objType - Graphic/body, не serial предмета. 0..65534 - конкретна графіка; -1 або 0xFFFF - будь-яка. Інші негативні int у цьому клієнті також знімають фільтр.
  • color - Hue, не кількість предметів. 0 - незабарвлений предмет; -1 або 0xFFFF - будь-який hue. Інші негативні int теж знімають кольоровий фільтр.
  • container - Земля: ?UO.Ground()?, ?0?, -?1?, ?0xFFFFFFFF? або рядок ground. Рюкзак: рядок backpack або його serial. Приймаються десятковий/hex serial та ім'я AddObject. my вибирає весь інвентар свого персонажа, включаючи екіпірування та вкладені сумки. Невідоме ім'я спричиняє помилку скрипта. Перевіряйте отриманий serial: явний 0 вибирає землю. Імена ground/backpack зрозуміліші числових позначень, які різняться між сімействами команд.
  • inSub — Обов'язковий true/false (1/0). false - прямий вміст конкретного контейнера; true — також завантажені вкладені сумки. Для землі рекурсія нічого не змінює. my вже вибирає весь інвентар, що належить персонажу.

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

int: serial першого збігу в локальному порядку обходу; 0, якщо збігів немає. Не graphic, кількість, масив або bool. Перевіряйте result = 0, а не result == true або result == 1. Стоп вважається одним об'єктом; Mobile – одним об'єктом та однією одиницею. Порядок не означає близькості та не гарантований між пошуками.

Поведінка

  • Потрібні всі чотири позиційні аргументи. Необов'язкових аргументів немає.
  • Земля використовує FindDistance та FindVertical цього скрипту, виключає self і включає відповідні Item та Mobile. Пошук у конкретному контейнері ці межі відстані/висоти не застосовує. В обох випадках виключаються Ignore та знищені об'єкти.
  • До обходу очищаються FindItem, FindCount, FindFullQuantity і GetFoundItems. Потім вони належать до цього пошуку; порожній пошук залишає нулі та порожній масив. FindFullQuantity підсумовує max(1, Amount) предметів та по 1 для Mobile. FindQuantity читає поточну кількість FindItem. Збережіть GetFoundItems, якщо після пошуку ще потрібний список.
  • Bridge один раз обходить завантажені предмети, потім Mobile, якщо вибрано землю. Повинні збігатися тип, колір і хоча б один контейнер. Один об'єкт враховується один раз, навіть якщо він відповідає кільком умовам. Повторного повного обходу світу кожної комбінації немає.
  • Читаються лише дані, отримані клієнтом. Контейнери не відкриваються, клітини картки не завантажуються, перенесення немає. Порожній результат не доводить порожнечу скрині на сервері. Якщо потрібний активний зв'язок, перевіряйте Connected: сам пошук читає локальний стан.
  • Тут зберігається перший локальний збіг; невідоме ім'я не перемикає пошук на рюкзак. Ground також приймає 0; свій FindDistance за замовчуванням 18, максимум 255. Це особливості даного клієнта.

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

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

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

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

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

var result = UO.FindTypeEx(0x0EED, -1, "backpack", false);
UO.Print("FindTypeEx: " + Convert.ToString(result));

1. Прямий вміст рюкзака - прямий скрипт

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

  • 0x0EED - золото, - 1 - будь-який hue; backpack/false виключає вкладені сумки. Три рядки виводять перший ID у hex без 0x, кількість об'єктів та суму одиниць. Дві стоси по 20 і 50: об'єктів 2, одиниць 70.
var item = UO.FindTypeEx(0x0EED, -1, "backpack", false);
UO.Print(Hex(item));
UO.Print(Convert.ToString(UO.FindCount()));
UO.Print(Convert.ToString(UO.FindFullQuantity()));

string Hex(object? value) => Convert.ToInt64(value).ToString("X");

2. Повна функція тимчасового пошуку землі — функція сценарію

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

  • radius = 5 і height = 10 діють всередині FindGoldNearSelf. Finally відновлює обидві межі навіть у return або помилці. Функція повертає serial золота чи 0; Main перевіряє != 0 перед виведенням.
return  RunScenario();
 object? RunScenario()
{
    var item = FindGoldNearSelf(5, 10);
    if (Truth(item != 0))
    {
        UO.Print(Hex(item));
    }
    else
    {
        UO.Print("Empty");
    }

    return null;
}

dynamic FindGoldNearSelf(dynamic radius, dynamic height)
{
    var oldDistance = UO.FindDistance();
    var oldVertical = UO.FindVertical();
    try
    {
        UO.FindDistance(radius);
        UO.FindVertical(height);
        return UO.FindTypeEx(0x0EED, -1, UO.Ground(), false);
    }
    finally
    {
        UO.FindDistance(oldDistance);
        UO.FindVertical(oldVertical);
    }
}

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

3. Ім'я контейнера та вкладені сумки – клас сценарію.

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

  • GetSerial дозволяє backpack; перевірка на нуль не дозволяє випадково вибрати землю. AddObject зберігає ID як search_bag. true включає вкладені сумки. GetFoundItems зберігає окремий масив; IsObjectExists повторно перевіряє кожен ID.
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 bag = UO.GetSerial("backpack");
        if (Truth(bag != "0x00000000"))
        {
            UO.AddObject("search_bag", bag);
            UO.FindTypeEx(0x0EED, -1, "search_bag", true);
            var items = UO.GetFoundItems();
            foreach (var item in items)
            {
                if (Truth(UO.IsObjectExists(item)))
                {
                    UO.Print(Hex(item));
                }
            }
        }

        return null;
    }

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

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

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

UO.FindTypeEx(objType, color, container, inSub) — UO.FindTypeEx(Any,Any,Any,Any)

Параметри: objType (Any), color (Any), container (Any), inSub (Any)

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

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

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

case "findtypeex": return new InjectionValue(bridge.FindType(ResolveType(arguments[0]), Arg(1), StealthContainer(2), -1, Arg(3) != 0));

UO.FindTypesArrayEx

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

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

int UO.FindTypesArrayEx(object? objTypes, object? colors, object? containers, object? inSub);

За один обхід шукає різні графіки, кольори та контейнери та повертає один знайдений ID. Повний список читається через GetFoundItems.

Параметри

  • objTypes - Graphic/body, не serial предмета. 0..65534 - конкретна графіка; -1 або 0xFFFF - будь-яка. Інші негативні int у цьому клієнті також знімають фільтр.
  • colors - Hue, не кількість предметів. 0 - незабарвлений предмет; -1 або 0xFFFF - будь-який hue. Інші негативні int теж знімають кольоровий фільтр.
  • containers - Земля: ?UO.Ground()?, ?0?, -?1?, ?0xFFFFFFFF? або рядок ground. Рюкзак: рядок backpack або його serial. Приймаються десятковий/hex serial та ім'я AddObject. my вибирає весь інвентар свого персонажа, включаючи екіпірування та вкладені сумки. Невідоме ім'я спричиняє помилку скрипта. Перевіряйте отриманий serial: явний 0 вибирає землю. Імена ground/backpack зрозуміліші числових позначень, які різняться між сімействами команд.
  • inSub — Обов'язковий true/false (1/0). false - прямий вміст конкретного контейнера; true — також завантажені вкладені сумки. Для землі рекурсія нічого не змінює. my вже вибирає весь інвентар, що належить персонажу.

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

int: serial першого збігу в локальному порядку обходу; 0, якщо збігів немає. Не graphic, кількість, масив або bool. Перевіряйте result = 0, а не result == true або result == 1. Стоп вважається одним об'єктом; Mobile – одним об'єктом та однією одиницею. Порядок не означає близькості та не гарантований між пошуками.

Поведінка

  • Передається Array; окреме значення також приймається як масив з одного елемента. оголошення змінної values[1] створює індекси 0 та 1: заповніть кожен. Типи та кольори – незалежні варіанти, а не пари за індексом. Маска «будь-який» у будь-якій позиції або порожній масив типів/квітів знімають цей фільтр. Порожній масив контейнерів вибирає інструмент персонажа. Повтори та перетину контейнерів не дублюють ID.
  • Потрібні всі чотири позиційні аргументи. Необов'язкових аргументів немає.
  • Земля використовує FindDistance та FindVertical цього скрипту, виключає self і включає відповідні Item та Mobile. Пошук у конкретному контейнері ці межі відстані/висоти не застосовує. В обох випадках виключаються Ignore та знищені об'єкти.
  • До обходу очищаються FindItem, FindCount, FindFullQuantity і GetFoundItems. Потім вони належать до цього пошуку; порожній пошук залишає нулі та порожній масив. FindFullQuantity підсумовує max(1, Amount) предметів та по 1 для Mobile. FindQuantity читає поточну кількість FindItem. Збережіть GetFoundItems, якщо після пошуку ще потрібний список.
  • Bridge один раз обходить завантажені предмети, потім Mobile, якщо вибрано землю. Повинні збігатися тип, колір і хоча б один контейнер. Один об'єкт враховується один раз, навіть якщо він відповідає кільком умовам. Повторного повного обходу світу кожної комбінації немає.
  • Читаються лише дані, отримані клієнтом. Контейнери не відкриваються, клітини картки не завантажуються, перенесення немає. Порожній результат не доводить порожнечу скрині на сервері. Якщо потрібний активний зв'язок, перевіряйте Connected: сам пошук читає локальний стан.
  • Тут зберігається перший локальний збіг; невідоме ім'я не перемикає пошук на рюкзак. Ground також приймає 0; свій FindDistance за замовчуванням 18, максимум 255. Це особливості даного клієнта.

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

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

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

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

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

var result = UO.FindTypesArrayEx(new[] { 0x0EED }, new[] { -1 }, new[] { "backpack" }, false);
UO.Print("FindTypesArrayEx: " + Convert.ToString(result));

1. Дві графіки на землі – прямий скрипт

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

  • types містить золото 0x0EED і чорні перли 0x0F7A; один color=-1 - будь-який hue, один Ground - земля. false на землі нічого не змінює. Діють поточні межі пошуку. Виводяться ID, кількість об'єктів та сума одиниць.
dynamic[] types = new dynamic[checked((int)(1) + 1)];
types[0] = 0x0EED;
types[1] = 0x0F7A;
dynamic[] colors = new dynamic[checked((int)(0) + 1)];
colors[0] = -1;
dynamic[] containers = new dynamic[checked((int)(0) + 1)];
containers[0] = UO.Ground();
var first = UO.FindTypesArrayEx(types, colors, containers, false);
UO.Print(Hex(first));
UO.Print(Convert.ToString(UO.FindCount()));
UO.Print(Convert.ToString(UO.FindFullQuantity()));

string Hex(object? value) => Convert.ToInt64(value).ToString("X");

2. Золото в рюкзаку та на землі - функція сценарію

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

  • types - лише золото; colors - будь-який hue. Containers - backpack та земля; true включає вкладені сумки. Виводяться об'єкти/стопки та одиниці з обох областей, кожен об'єкт враховується один раз.
return  RunScenario();
 object? RunScenario()
{
    dynamic[] types = new dynamic[checked((int)(0) + 1)];
    types[0] = 0x0EED;
    dynamic[] colors = new dynamic[checked((int)(0) + 1)];
    colors[0] = -1;
    dynamic[] containers = new dynamic[checked((int)(1) + 1)];
    containers[0] = "backpack";
    containers[1] = UO.Ground();
    UO.FindTypesArrayEx(types, colors, containers, true);
    UO.Print(Convert.ToString(UO.FindCount()));
    UO.Print(Convert.ToString(UO.FindFullQuantity()));
    return null;
}

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

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

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

     public object? RunScenario()
    {
        var items = SearchTypesIn("backpack", 0x0EED, 0x0F7A);
        foreach (var item in items)
        {
            if (Truth(UO.IsObjectExists(item)))
            {
                UO.Print(Hex(item));
            }
        }

        return null;
    }

    dynamic SearchTypesIn(dynamic container, dynamic firstType, dynamic secondType)
    {
        dynamic[] types = new dynamic[checked((int)(1) + 1)];
        types[0] = firstType;
        types[1] = secondType;
        dynamic[] colors = new dynamic[checked((int)(0) + 1)];
        colors[0] = -1;
        dynamic[] containers = new dynamic[checked((int)(0) + 1)];
        containers[0] = container;
        UO.FindTypesArrayEx(types, colors, containers, true);
        return UO.GetFoundItems();
    }

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

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

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

UO.FindTypesArrayEx(objTypes, colors, containers, inSub) — UO.FindTypesArrayEx(Any,Any,Any,Any)

Параметри: objTypes (Any), colors (Any), containers (Any), inSub (Any)

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

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

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

case "findtypesarrayex":

                    InjectionValue[] searchContainers = arguments[2].Kind == InjectionValueKind.Array

                        ? arguments[2].Array : new[] { arguments[2] };

                    return new InjectionValue(bridge.FindTypes(arguments[0].Kind == InjectionValueKind.Array

                        ? arguments[0].Array.Select(ResolveType).ToArray() : new[] { ResolveType(arguments[0]) }, ArrayArg(1),

                        searchContainers.Select(ConvertClientSearchContainer).ToArray(), Arg(3) != 0));

UO.FindVertical

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

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

int UO.FindVertical();
void UO.FindVertical(object? value);

Читає або змінює допустиму різницю висоти під час пошуку за промовчанням.

Параметри

  • value - Необов'язковий int. Без аргументу читання; value - встановлення. Значення обмежується діапазоном 0..120; негативне стає 0, а не безлімітом. У новому runtime: 2; відновлений стан може містити інше значення. Дробова кількість усікається до нуля; допустимі також числові рядки double/0x. Використовуйте int, щоб уникнути неявного перетворення.

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

Без аргументів: int — поточна межа (різниця в одиницях світової Z), не знайдена ID, кількість об'єктів або bool. 0 означає нульову межу, а не невдачу. З value: void - значення немає; це не true/false і не колишнє налаштування. Після встановлення прочитайте FindVertical(), щоб дізнатися збережене значення.

Поведінка

  • Висота: abs(object.Z - player.Z), по обидва боки, включаючи кордон. При 0 підходить лише однакова Z. Це не номер поверху та не число горизонтальних клітин.
  • Налаштування зберігається в runtime поточного скрипта; Його процедури використовують одне значення. У незалежних runtime налаштування окремі. Читання та запис не запускають пошук, не очищають FindItem/FindCount/GetFoundItems, не відправляють пакет, не рухають персонажа та не завантажують дальні об'єкти.
  • FindTypeEx та FindTypesArrayEx використовують ці межі при пошуку на землі, але не всередині контейнера. Залишаються фільтри type, hue, Ignore та наявність завантаженого об'єкта. FindAtCoord ігнорує обидві межі. У розширених командах явні distance/maxZ можуть замінити налаштування; -1 у таких параметрах означає взяти налаштування, на відміну від установки самого налаштування -1. FindList також фільтрує Z під час пошуку в контейнерах; зазначений виняток контейнерів на нього не поширюється.
  • Перед тимчасовим пошуком збережіть значення та відновіть його у Finally. Встановлення автоматично не скасовується. Finally працює при звичайному завершенні та перехоплюваній помилці скрипту; аварійну зупинку не можна використовувати як механізм очищення.

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

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

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

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

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

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

1. Читання, встановлення та обмеження діапазону – прямий скрипт

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

  • previous зберігає фактичне налаштування. value:=10 задає звичайну межу; 1000 показує обмеження до 120. Print читає результат окремим дзвінком без аргументу. Finally відновлює previous.
var previous = UO.FindVertical();
try
{
    UO.FindVertical(10);
    UO.Print(Convert.ToString(UO.FindVertical()));
    UO.FindVertical(1000);
    UO.Print(Convert.ToString(UO.FindVertical()));
}
finally
{
    UO.FindVertical(previous);
}

2. Тимчасовий пошук на землі – функція сценарію

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

  • previous зберігає налаштування коду, що викликає. 10 змінює тільки FindVertical; друга межа залишається незмінною. "0x0EED" - графіка золота, - "1" - будь-який "hue", Container = - "1" - світ, "false" - без рекурсії контейнерів. id - один serial; != 0 перевіряє наявність. FindCount вважає цілі об'єкти/стопки. Finally відновлює налаштування, а не перелік результатів.
return  RunScenario();
 object? RunScenario()
{
    var previous = UO.FindVertical();
    try
    {
        UO.FindVertical(10);
        var id = UO.FindTypeEx(0x0EED, -1, -1, false);
        if (Truth(id != 0))
        {
            UO.Print(Hex(id) + ":" + Convert.ToString(UO.FindCount()));
        }
        else
        {
            UO.Print("0");
        }
    }
    finally
    {
        UO.FindVertical(previous);
    }

    return null;
}

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

3. Повна функція CountGroundInRange - клас сценарію

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

  • CountGroundInRange(graphic, radius, height) зберігає обидві межі, задає radius=5 і height=10, шукає graphic=0x0EED і повертає FindCount(). Стопка вважається одним об'єктом. Повна функція наведена після Main. Finally відновлює обидві межі навіть у виході через return; результат пошуку залишається доступним.
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 count = CountGroundInRange(0x0EED, 5, 10);
        UO.Print(Convert.ToString(count));
        return null;
    }

    dynamic CountGroundInRange(dynamic graphic, dynamic radius, dynamic height)
    {
        var oldDistance = UO.FindDistance();
        var oldVertical = UO.FindVertical();
        try
        {
            UO.FindDistance(radius);
            UO.FindVertical(height);
            UO.FindTypeEx(graphic, -1, -1, false);
            return UO.FindCount();
        }
        finally
        {
            UO.FindDistance(oldDistance);
            UO.FindVertical(oldVertical);
        }
    }
}

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

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

UO.FindVertical() — UO.FindVertical()

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

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

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

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

case "findvertical":

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

                    return new InjectionValue(bridge.GetFindVertical());

UO.FindVertical(value) — UO.FindVertical(Any)

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

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

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

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

case "findvertical":

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

                    return new InjectionValue(bridge.GetFindVertical());

UO.GetFindedList

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

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

dynamic UO.GetFindedList(object? userList);

Створює копію списку ID останнього звичайного пошуку.

Параметри

  • userList - Обов'язковий аргумент сумісності. У поточній реалізації не заповнюється та не змінюється: список повертається результатом команди. Можна передати 0. Для форми без аргументів використовуйте GetFoundItems.

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

Array - окремий масив serial/ID у порядку останнього пошуку. Порожній Array, якщо збігів не було. Не містить graphic, hue або Amount. Зміна поверненого масиву не редагує збережений список пошуку.

Поведінка

  • Читаються дані, які вже завантажені клієнтом. Команда не відкриває контейнер, не переміщає предмети та не завантажує об'єкти з усього сервера.
  • Array - масив з індексами від 0. Зберігайте його у var, перевіряйте ArrayLength перед доступом. Елементи можуть зникнути зі світу після зйомки: перед дією перевіряйте Exists(serial).
  • Дані належать до останнього звичайного пошуку цього скрипта. FindType з 1–5 аргументами, FindTypeEx, Count/CountEx/CountGround замінюють результати. Розширені фільтровані команди персонажів не повинні змінювати цей знімок.
  • Новий пошук без збігів обнуляє FindItem, FindCount та FindFullQuantity та очищує GetFoundItems. Читання результату саме собою новий пошук не запускає.

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

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

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

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

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

UO.FindType(0x0EED, -1, "backpack");
object? result = UO.GetFindedList(0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Отримати розмір списку – прямий скрипт

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

  • Попередньо виконаний звичайний FindType для золота в рюкзаку. UserList=0 — не вихідний параметр.
  • Довжина – число записів/ID. Це не сума Amount у стопках. Порожній список дає 0.
var found = UO.FindType(0x0EED, -1, "backpack");
var items = UO.GetFindedList(0);
UO.Print(Convert.ToString(ArrayLength(items)));

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

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

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

  • Попередньо виконаний звичайний FindType для золота в рюкзаку. UserList=0 — не вихідний параметр.
  • items[i] - числовий serial. Hex використовується лише для виведення. Цикл не звертається за останнім індексом.
return  RunScenario();
 object? RunScenario()
{
    var found = UO.FindType(0x0EED, -1, "backpack");
    var items = UO.GetFindedList(0);
    var i = 0;
    while (Truth(i < ArrayLength(items)))
    {
        UO.Print("0x" + Hex(items[i]));
        i = i + 1;
    }

    return null;
}

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

3. Перевірити перший запис перед читанням – клас сценарію

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

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

     public object? RunScenario()
    {
        var found = UO.FindType(0x0EED, -1, "backpack");
        var items = UO.GetFindedList(0);
        if (Truth(ArrayLength(items) > 0))
        {
            var first = items[0];
            if (Truth(UO.Exists(first)))
            {
                UO.Print(UO.GetName(first));
            }
        }
        else
        {
            UO.Print("Empty list");
        }

        return null;
    }

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

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

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

UO.GetFindedList(userList) — UO.GetFindedList(Any)

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

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

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

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

case "getfindedlist":

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

UO.GetFoundItems

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

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

dynamic UO.GetFoundItems();

Створює копію списку ID останнього звичайного пошуку.

Параметри

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

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

Array - окремий масив serial/ID у порядку останнього пошуку. Порожній Array, якщо збігів не було. Не містить graphic, hue або Amount. Зміна поверненого масиву не редагує збережений список пошуку.

Поведінка

  • Читаються дані, які вже завантажені клієнтом. Команда не відкриває контейнер, не переміщає предмети та не завантажує об'єкти з усього сервера.
  • Array - масив з індексами від 0. Зберігайте його у var, перевіряйте ArrayLength перед доступом. Елементи можуть зникнути зі світу після зйомки: перед дією перевіряйте Exists(serial).
  • Дані належать до останнього звичайного пошуку цього скрипта. FindType з 1–5 аргументами, FindTypeEx, Count/CountEx/CountGround замінюють результати. Розширені фільтровані команди персонажів не повинні змінювати цей знімок.
  • Новий пошук без збігів обнуляє FindItem, FindCount та FindFullQuantity та очищує GetFoundItems. Читання результату саме собою новий пошук не запускає.

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

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

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

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

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

UO.FindType(0x0EED, -1, "backpack");
object? result = UO.GetFoundItems();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Отримати розмір списку – прямий скрипт

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

  • Попередньо виконаний звичайний FindType для золота в рюкзаку. Параметрів немає.
  • Довжина – число записів/ID. Це не сума Amount у стопках. Порожній список дає 0.
var found = UO.FindType(0x0EED, -1, "backpack");
var items = UO.GetFoundItems();
UO.Print(Convert.ToString(ArrayLength(items)));

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

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

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

  • Попередньо виконаний звичайний FindType для золота в рюкзаку. Параметрів немає.
  • items[i] - числовий serial. Hex використовується лише для виведення. Цикл не звертається за останнім індексом.
return  RunScenario();
 object? RunScenario()
{
    var found = UO.FindType(0x0EED, -1, "backpack");
    var items = UO.GetFoundItems();
    var i = 0;
    while (Truth(i < ArrayLength(items)))
    {
        UO.Print("0x" + Hex(items[i]));
        i = i + 1;
    }

    return null;
}

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

3. Перевірити перший запис перед читанням – клас сценарію

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

  • Попередньо виконаний звичайний FindType для золота в рюкзаку. Параметрів немає.
  • Перевіряються дві різні речі: запис у знімку та існування об'єкту зараз. Порядок без явного сортування означає близькість.
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 found = UO.FindType(0x0EED, -1, "backpack");
        var items = UO.GetFoundItems();
        if (Truth(ArrayLength(items) > 0))
        {
            var first = items[0];
            if (Truth(UO.Exists(first)))
            {
                UO.Print(UO.GetName(first));
            }
        }
        else
        {
            UO.Print("Empty list");
        }

        return null;
    }

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

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

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

UO.GetFoundItems() — UO.GetFoundItems()

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

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

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

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

case "getfounditems":

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

UO.GetIgnoreList

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

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

dynamic UO.GetIgnoreList();

Показує конкретні ID, додані у serial-фільтр через Ignore. Допомагає перевірити, які вже оброблені предмети виключено із повторного пошуку. Іменовані правила type/hue з AddIgnoreList до цього масиву не входять.

Параметри

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

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

Array - serial з Ignore-списку за зростанням числового ID. Порожній Array у порожньому списку. ID можуть уже не існувати у світі; це правила пошуку, не список видимих ​​предметів.

Поведінка

  • Читаються дані, які вже завантажені клієнтом. Команда не відкриває контейнер, не переміщає предмети та не завантажує об'єкти з усього сервера.
  • Array - масив з індексами від 0. Зберігайте його у var, перевіряйте ArrayLength перед доступом. Елементи можуть зникнути зі світу після зйомки: перед дією перевіряйте Exists(serial).
  • У клієнті набір належить до загального стану скриптів профілю. Масив є копією: IgnoreOff(serial) знімає один виняток, IgnoreReset очищає все serial. Вони не вимикають вибрані правила type/hue; для них потрібні SelectIgnoreList, DeleteIgnoreList або ClearIgnoreList. GetContent/GetEquipment та GetWorldItems без аргументів самі цей фільтр не застосовують.

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

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

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

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

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

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

1. Отримати розмір списку – прямий скрипт

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

  • Параметрів немає; читається знімок явних serial-виключень. Порожній масив не означає, що іменовані правила type/hue відсутні.
  • Довжина – число записів/ID. Це не сума Amount у стопках. Порожній список дає 0.
var items = UO.GetIgnoreList();
UO.Print(Convert.ToString(ArrayLength(items)));

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

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

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

  • Параметрів немає; читається знімок явних serial-виключень. Порожній масив не означає, що іменовані правила type/hue відсутні.
  • items[i] - числовий serial. Hex використовується лише для виведення. Цикл не звертається за останнім індексом.
return  RunScenario();
 object? RunScenario()
{
    var items = UO.GetIgnoreList();
    var i = 0;
    while (Truth(i < ArrayLength(items)))
    {
        UO.Print("0x" + Hex(items[i]));
        i = i + 1;
    }

    return null;
}

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

3. Перевірити перший запис перед читанням – клас сценарію

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

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

     public object? RunScenario()
    {
        var items = UO.GetIgnoreList();
        if (Truth(ArrayLength(items) > 0))
        {
            var first = items[0];
            if (Truth(UO.Exists(first)))
            {
                UO.Print(UO.GetName(first));
            }
        }
        else
        {
            UO.Print("Empty list");
        }

        return null;
    }

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

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

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

UO.GetIgnoreList() — UO.GetIgnoreList()

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

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

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

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

case "getignorelist":

                    return new InjectionValue(bridge.GetIgnoreList().Select(value => new InjectionValue(value)).ToArray());

UO.GetWorldItems

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

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

dynamic UO.GetWorldItems();
dynamic UO.GetWorldItems(object? @type);
dynamic UO.GetWorldItems(object? @type, object? color);
dynamic UO.GetWorldItems(object? @type, object? color, object? distance);
dynamic UO.GetWorldItems(object? @type, object? color, object? distance, object? container);
dynamic UO.GetWorldItems(object? @type, object? color, object? distance, object? container, object? nearest);
dynamic UO.GetWorldItems(object? @type, object? color, object? distance, object? container, object? nearest, object? maxZ);

Повертає масив ID предметів світу чи обраного контейнера.

Параметри

  • type - Перший аргумент фільтрованої форми: graphic/type, -1 або 0xFFFF - будь-який. Це не serial. Без будь-яких аргументів використовується окрема форма без фільтрації.
  • color - Hue; за замовчуванням -1, будь-який колір. 0xFFFF також допускає будь-який hue.
  • distance — Радіус у клітинах X/Y. Негативне значення або відсутність використовують FindDistance; 0 означає ту ж клітину. Для контейнера перевіряється відстань до контейнера, чи не його внутрішні X/Y.
  • container — За умовчанням земля. ground, числові 0/1 та їх рядки - земля. backpack, my та числовий -1 - прямий вміст рюкзака. Serial/hex-рядок/аліас контейнера - його прямий вміст; self вибирає предмети, чий батьківський персонаж. Невідоме ім'я та відсутній рюкзак дають порожній масив, не землю.
  • nearest — За замовчуванням false. true сортує по відстані, потім по числовому serial. Для одного контейнера відстань у всіх результатів однакова.
  • maxZ — Допустима різниця висот щодо self. Негативне значення або відсутність використовують FindVertical; 0 вимагає таку ж висоту. У контейнері береться висота контейнера.

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

Array - serial/ID предметів, не type, координати або Amount. Порожній Array без збігів. GetWorldItems() повертає всі завантажені предмети поза контейнерами без Ignore/дальності/висоти; GetWorldItems(type,...) використовує перелічені фільтри та Ignore. NPC/гравці не включаються до жодної форми.

Поведінка

  • Читаються дані, які вже завантажені клієнтом. Команда не відкриває контейнер, не переміщає предмети та не завантажує об'єкти з усього сервера.
  • Array - масив з індексами від 0. Зберігайте його у var, перевіряйте ArrayLength перед доступом. Елементи можуть зникнути зі світу після зйомки: перед дією перевіряйте Exists(serial).
  • Знімок FindItem/FindCount/GetFoundItems не змінюється. Команда не відкриває контейнер і не оминає вкладені сумки.
  • Для вимкнення обмежень недостатньо -1: це вибір поточного налаштування, а не нескінченного радіусу. Вкажіть необхідну невід'ємну distance/maxZ або використовуйте форму без аргументів для всіх завантажених предметів землі.

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

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

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

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

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

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

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

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

  • Параметрів немає: спеціальна форма без фільтрів.
  • Результат не означає всі предмети картки чи сервера. Ignore тут не застосовується.
var items = UO.GetWorldItems();
UO.Print(Convert.ToString(ArrayLength(items)));

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

2. Знайти найближчу стопку потрібного типу та кольору – функція сценарію

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

  • type=0x0EED - золото, color=-1 - будь-який; distance=5, container=ground, nearest=true, maxZ=3.
  • Перший запис — найближчий предмет, що не ігнорується; відстань не перевіряє стіни чи доступність перенесення.
return  RunScenario();
 object? RunScenario()
{
    var items = UO.GetWorldItems(0x0EED, -1, 5, "ground", true, 3);
    if (Truth(ArrayLength(items) > 0))
    {
        var item = items[0];
        if (Truth(UO.Exists(item)))
        {
            UO.Print("Nearest ID: 0x" + Hex(item));
        }
    }

    return null;
}

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

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

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

  • Будь-які type/color; my вибирає рюкзак. Відстань 20 та перепад Z 255 відносяться до контейнера. false зберігає вихідний порядок.
  • Вважаються прямі items, не одиниці в стосах і вміст вкладених сумок. Без рюкзака вертається порожній Array.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var items = UO.GetWorldItems(-1, -1, 20, "my", false, 255);
        UO.Print(Convert.ToString(ArrayLength(items)));
        return null;
    }

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

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

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

UO.GetWorldItems() — UO.GetWorldItems()

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

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

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

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

case "getworlditems":

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

UO.GetWorldItems(type) — UO.GetWorldItems(Any)

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

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

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

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

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

values => CompactGetWorldItems(values)

UO.GetWorldItems(type, color) — UO.GetWorldItems(Any,Any)

Параметри: type (Any), color (Any)

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

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

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

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

values => CompactGetWorldItems(values)

UO.GetWorldItems(type, color, distance) — UO.GetWorldItems(Any,Any,Any)

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

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

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

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

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

values => CompactGetWorldItems(values)

UO.GetWorldItems(type, color, distance, container) — UO.GetWorldItems(Any,Any,Any,Any)

Параметри: type (Any), color (Any), distance (Any), container (Any)

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

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

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

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

values => CompactGetWorldItems(values)

UO.GetWorldItems(type, color, distance, container, nearest) — UO.GetWorldItems(Any,Any,Any,Any,Any)

Параметри: type (Any), color (Any), distance (Any), container (Any), nearest (Any)

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

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

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

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

values => CompactGetWorldItems(values)

UO.GetWorldItems(type, color, distance, container, nearest, maxZ) — UO.GetWorldItems(Any,Any,Any,Any,Any,Any)

Параметри: type (Any), color (Any), distance (Any), container (Any), nearest (Any), maxZ (Any)

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

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

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

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

values => CompactGetWorldItems(values)

UO.Ignore

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

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

void UO.Ignore(object? objID);
void UO.Ignore(object? id, object? stateValue);

Додає або видаляє serial у звичайному списку ігнорування пошуку.

Параметри

  • id — Serial/ID об'єкта: int, числова/hex-рядок або встановлений аліас, наприклад "lasttarget". Це не graphic/type. До дії перевіряйте завантажений об'єкт.
  • objID — Serial/ID об'єкта: int, числова/hex-рядок або встановлений аліас, наприклад "lasttarget". Це не graphic/type. До дії перевіряйте завантажений об'єкт.
  • stateValue — Необов'язковий режим. Число 0 вимикає, ненульове включає. Рядки "off", "false" (без урахування регістру) і рівно "0" вимикають; будь-який інший рядок включає. Без аргументу режиму додати.

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

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

Поведінка

  • Ignore(id) викликає bridge.Ignore(serial), що додає serial у State.IgnoredSerials. Ignore(id,stateValue) вибирає Ignore чи Unignore. Не можна вважати будь-який непустий рядок істинним: перелічені вимикаючі слова обробляються окремо.
  • Це фільтр пошуку, не приховування та не видалення об'єкта. Іменовані фільтри типів AddIgnoreList зберігаються окремо.
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

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

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

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

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

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

UO.Print("Calling UO.Ignore");
UO.Ignore("lasttarget");

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

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

  • Додає або видаляє serial у звичайному списку ігнорування пошуку.
UO.Ignore("lasttarget");

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

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

  • Ignore(id) викликає bridge.Ignore(serial), що додає serial у State.IgnoredSerials. Ignore(id,stateValue) вибирає Ignore чи Unignore. Не можна вважати будь-який непустий рядок істинним: перелічені вимикаючі слова обробляються окремо.
return  RunScenario();
 object? RunScenario()
{
    UO.Ignore("lasttarget", "off");
    return null;
}

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

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

  • Це фільтр пошуку, не приховування та не видалення об'єкта. Іменовані фільтри типів AddIgnoreList зберігаються окремо.
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 id = UO.GetSerial("lasttarget");
        if (Truth(UO.Exists(id)))
        {
            UO.Ignore(id, 1);
            UO.Print(UO.GetIgnoreList());
            UO.Ignore(id, 0);
        }

        return null;
    }

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

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

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

UO.Ignore(objID) — UO.Ignore(Any)

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

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

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

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

case "ignore": bridge.Ignore(Arg(0)); return InjectionValue.Unit;

UO.Ignore(objID) — UO.Ignore(Integer)

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

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

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

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

public void Ignore(int id) => bridge.Ignore(id);

UO.Ignore(objID) — UO.Ignore(String)

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

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

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

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

public void Ignore(string id) => Ignore(GetObject(id));

UO.Ignore(id, stateValue) — UO.Ignore(Any,Any)

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

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

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

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

public void Ignore(InjectionValue id, InjectionValue stateValue)

        {

            int serial = GetObject(id);

            bool enabled = stateValue.Kind != InjectionValueKind.String

                ? NumberConversions.ToInt(stateValue) != 0

                : !stateValue.String.Equals("off", StringComparison.OrdinalIgnoreCase)

                    && !stateValue.String.Equals("false", StringComparison.OrdinalIgnoreCase)

                    && stateValue.String != "0";



            if (enabled)

                bridge.Ignore(serial);

            else

                bridge.Unignore(serial);

        }

UO.IgnoreOff

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

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

void UO.IgnoreOff(object? objID);

Забирає один serial зі звичайного списку ігнорування.

Параметри

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

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

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

Поведінка

  • Bridge.Unignore видаляє ID з State.IgnoredSerials. Інші serial та іменовані фільтри AddIgnoreList не очищаються; предмети не видаляються зі світу.
  • локальна зміна фільтра пошуку; пакети не надсилаються.
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

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

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

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

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

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

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

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

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

  • Забирає один serial зі звичайного списку ігнорування.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
    UO.IgnoreOff(id);
}

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

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

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

  • Bridge.Unignore видаляє ID з State.IgnoredSerials. Інші serial та іменовані фільтри AddIgnoreList не очищаються; предмети не видаляються зі світу.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("self");
    if (Truth(UO.Exists(id)))
    {
        UO.IgnoreOff(id);
    }

    return null;
}

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

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

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

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

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

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

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

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

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

UO.IgnoreOff(objID) — UO.IgnoreOff(Any)

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

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

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

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

case "ignoreoff": bridge.Unignore(Arg(0)); return InjectionValue.Unit;

UO.IgnoreReset

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

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

void UO.IgnoreReset();

Очищає звичайний список ігнорованих serial.

Параметри

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

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

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

Поведінка

  • Bridge.IgnoreReset викликає State.IgnoredSerials.Clear. Видаляє всі serial з цього фільтра, включаючи додані іншим пошуком у загальній bridge-сесії.
  • Не очищає іменовані AddIgnoreList, не видаляє об'єкти та не скидає результати FindType.
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

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

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

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

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

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

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

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

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

  • Очищає звичайний список ігнорованих serial.
UO.IgnoreReset();

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

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

  • Bridge.IgnoreReset викликає State.IgnoredSerials.Clear. Видаляє всі serial з цього фільтра, включаючи додані іншим пошуком у загальній bridge-сесії.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.GetIgnoreList());
    UO.IgnoreReset();
    return null;
}

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

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

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

     public object? RunScenario()
    {
        UO.Ignore("lasttarget");
        UO.IgnoreReset();
        UO.Print(UO.GetIgnoreList());
        return null;
    }
}

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

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

UO.IgnoreReset() — UO.IgnoreReset()

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

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

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

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

public void IgnoreReset() => bridge.IgnoreReset();

UO.InfoFindList

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

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

void UO.InfoFindList();

Виводить збережені визначення AddFindList у локальний журнал клієнта. Корисна для перевірки імені, порядку, type та hue після додавання чи видалення правил. Не відображає об'єктів, знайдених у світі.

Параметри

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

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

void: значення, що повертається, немає. Не привласнюйте виклик змінною та не перевіряйте його на true/1. Стан визначень можна вивести UO.InfoFindList(); сам пошук запускається окремо через UO.FindList().

Поведінка

  • Чи не приймає аргументів; друкує всі набори поточного runtime одним рядком.
  • У записі list|type|color колір відсутній, якщо AddFindList викликали з двома аргументами. Між записами використовується "|". Числові літерали відображаються десятковим текстом; порядок відповідає доданню.
  • Не запускає FindList і не змінює FindItem/FindCount. Для порожнього сховища канал повідомлень передається порожній рядок; це не явне повідомлення "список порожній".
  • Визначення перебувають у стані даного скриптового runtime. Самостійний інший runtime має свій набір; закриття вікна IDE не є очищенням цих правил. Це не файл налаштувань та не список глобальних об'єктів гри.
  • AddFindList дописує запис до кінця; повторення не видаляються. Для повторної підготовки свого набору спершу викликайте ClearFindList("ім'я"). Зміна визначень не очищає вже отримані FindItem/FindCount/GetFoundItems.
  • Запис зберігає текстові поля. Числовий літерал "0x0EED" зберігається як "3821", рядок "0x0EED" - як "0x0EED". Пошук перетворює обидва варіанти на число, а DeleteFindList порівнює саме збережений текст. Використовуйте однакову форму при додаванні та видаленні.
  • Невідоме ім'я в FindList не є порожнім зареєстрованим набором: двигун намагається розібрати його як список числових типів. Число ім'я викликає помилку перетворення. Після видалення останнього запису створіть новий набір до пошуку цього імені.
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

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

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

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

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

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

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

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

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

  • Для цього набору видно рядок loot|3821|-1| loot|3962|-1: 3821 = 0x0EED, 3962 = 0x0F7A. Це type, а не serial знайденої речі.
BuildLoot();
UO.InfoFindList();

void BuildLoot()
{
    UO.ClearFindList("loot");
    UO.AddFindList("loot", 0x0EED, -1);
    UO.AddFindList("loot", 0x0F7A, -1);
}

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

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

  • Висновок Before/After дозволяє побачити видалення лише одного забарвлення; інші іменовані набори будуть показані, якщо існують.
return  RunScenario();
 object? RunScenario()
{
    UO.ClearFindList("check");
    UO.AddFindList("check", 0x0EED, 0);
    UO.AddFindList("check", 0x0EED, 0x0044);
    UO.Print("Before:");
    UO.InfoFindList();
    UO.DeleteFindList("check", 0x0EED, 0x0044);
    UO.Print("After:");
    UO.InfoFindList();
    return null;
}

3. Розрізнити правила та фактичну наявність речей — клас сценарію

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

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

     public object? RunScenario()
    {
        UO.ClearFindList("stock");
        UO.AddFindList("stock", 0x0EED);
        UO.InfoFindList();
        var first = UO.FindList("stock", "backpack");
        if (Truth(first == ""))
        {
            UO.Print("Rule exists, but no matching item is loaded");
        }
        else
        {
            UO.Print("Objects: " + Convert.ToString(UO.FindCount()));
            UO.Print("Units: " + Convert.ToString(UO.FindFullQuantity()));
        }

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

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

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

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

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

case "infofindlist": SystemMessage(string.Join(" | ", LegacyList("AddFindList"))); break;

UO.MFGI

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

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

void UO.MFGI();

Друкує поточний список результатів пошуку.

Параметри

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

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

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

Поведінка

  • ExecuteLegacyManualAlias читає GetFoundItems, форматує кожен serial як 0xXXXXXXXX і з'єднує рядки роздільником " | ". Новий пошук не виконується; пустий список дає порожній рядок.
  • Змінює або показує лише вказані локальні дані. Серверного підтвердження цієї команди немає.

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

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

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

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

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

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

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

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

  • Друкує поточний список результатів пошуку.
UO.MFGI();

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

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

  • ExecuteLegacyManualAlias читає GetFoundItems, форматує кожен serial як 0xXXXXXXXX і з'єднує рядки роздільником " | ". Новий пошук не виконується; пустий список дає порожній рядок.
return  RunScenario();
 object? RunScenario()
{
    UO.FindType("0x0E21");
    UO.MFGI();
    return null;
}

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

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

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

     public object? RunScenario()
    {
        UO.MFGI();
        UO.Print(UO.GetArrayLength(UO.GetFoundItems()));
        return null;
    }
}

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

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

UO.MFGI() — UO.MFGI()

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

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

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

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

case "mfgi":

                    SystemMessage(string.Join(" | ", bridge.GetFoundItems().Select(id => $"0x{id:X8}")));

                    break;

UO.SelectIgnoreList

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

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

void UO.SelectIgnoreList(object? list);

Перемикає активний іменований пошуковий фільтр. Корисно змінювати набір винятків між видобутком, сортуванням та вибором мети без видалення збережених правил. Сам пошук ця команда не виконує.

Параметри

  • list — Довільне непусте ім'я, наприклад "loot_skip". Ім'я не враховує регістру. Це не назва предмета, не serial контейнера і не назва FindList. Тут допустимий також порожній рядок "": відключити іменовані правила.

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

void - значення немає. Використовуйте окремий рядок без var result = і без перевірки = true. Команда змінює локальний фільтр; не повертає кількість предметів і не надсилає серверу.

Поведінка

  • Неіснуюче ім'я вибирає порожній фільтр. Пізній AddIgnoreList з цим ім'ям почне діяти у наступних пошуках. Звичайні Ignore(serial) продовжують діяти за будь-якого вибору.
  • Іменований список містить правила graphic/type + hue, а звичайний Ignore містить конкретні serial. Це різні фільтри: вони об'єднуються при підтримуючому їх пошуку. Об'єкти залишаються видимими та доступними прямому UseObject/MoveItem; це не Hide і не заборона дій.
  • Ім'я списку не враховує регістр; пробіли з обох боків видаляються. Активний один іменований список, спочатку default. AddIgnoreList не вибирає його автоматично. SelectIgnoreList("") вимикає лише іменований фільтр.
  • Правила діють нові пошуки, включаючи предмети, завантажені ПІСЛЯ їх додавання. Вже отриманий масив та попередній результат FindCount не перераховуються до нового пошуку. Не вибирайте список із правилом -1, -1, якщо не хочете виключити все.
  • Фільтр враховують FindType/FindTypeEx/FindTypesArrayEx, FindList, FindAtCoord, FindNotoriety, Count/CountEx та розширені вибірки GetMobiles, GetWorldItems, UseType, WaitTarget, Attack/AttackNearest/FindMan. includeIgnored=true, де його передбачено, обходить і serial, і type/hue. Повний перелік GetContent/GetEquipment, GetWorldItems() без аргументів та словесний FindMobile(Human, near, ...) не використовують ці правила.
  • GetIgnoreList повертає тільки явно додані serial; рядки іменованого списку до цього масиву не входять. IgnoreReset очищає весь serial-фільтр, IgnoreOff(serial) знімає одне serial-виключення; іменовані правила зберігаються. ClearIgnoreList() без аргументів очищає обидва види.
  • Стан належить загальному стану скриптів профілю клієнта; зміна впливає інші скрипти з цим станом. Установки входять у знімок, що зберігається. Після зміни правил інший скрипт може вже виконувати пошук зі знятим раніше знімком наступний пошук побачить оновлення.
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

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

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

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

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

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

UO.Print("Calling UO.SelectIgnoreList");
UO.SelectIgnoreList("SORT");

1. Переключити режим сортування – прямий скрипт

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

  • SORT та sort — один список. Пошук обирає перший дозволений об'єкт рюкзака; збереження імені не переносить його.
UO.AddIgnoreList("sort", 0x0EED);
UO.SelectIgnoreList("SORT");
var item = UO.FindType(-1, -1, "backpack");
if (Truth(item != ""))
{
    UO.AddObject("sort_candidate", item);
}

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

2. Вимкнути правила type, зберігши самі набори – функція сценарію

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

  • Порожній рядок вимикає лише іменований фільтр. Щоб відновити його, знову передайте ім'я набору.
return  RunScenario();
 object? RunScenario()
{
    UO.SelectIgnoreList("");
    var gold = UO.FindType(0x0EED, -1, "backpack");
    if (Truth(gold != ""))
    {
        UO.AddObject("gold_candidate", gold);
    }

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

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

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

     public object? RunScenario()
    {
        UO.SelectIgnoreList("later");
        UO.AddIgnoreList("later", 0x0EED);
        var item = UO.FindType(0x0EED, -1, "ground");
        if (Truth(item == ""))
        {
            UO.Print("Gold is excluded by the selected rule");
        }

        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.SelectIgnoreList(list) — UO.SelectIgnoreList(Any)

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

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

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

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

case "selectignorelist": state.SelectedIgnoreList = Text(0).Trim(); break;

UO.SetBadLocation

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

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

void UO.SetBadLocation(object? x, object? y);

Додає X/Y до списку заборонених клітин для наступних маршрутів MoveXY, NewMoveXY, MoveXYZ, PMove та запитів GetPathArray/GetPathArray3D.

Параметри

  • x — Світовий X клітини, що виключається.
  • y — Світовий Y клітини, що виключається.

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

void - значення, що повертається немає. Викликайте окремим рядком; це не true/false та не число кроків.

Поведінка

  • Ключ складається з X/Y, без карти та Z. Координати мають бути цілими в межах 0..65535; Вихід за діапазон викликає помилку скрипта.
  • Заборони відносяться до runtime скрипта. Новий маршрут або запит отримує їхній знімок. Вже маршрут, що йде, зберігає свій знімок, включаючи внутрішній перерахунок. Після зміни списку запустіть новий маршрут.
  • Це не зміна карти: звичайний ручний рух та маршрути іншого runtime не отримують цю заборону. Вихідну клітину можна залишити, навіть якщо вона відзначена забороненою.
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

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

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

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

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

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

UO.Print("Calling UO.SetBadLocation");
UO.SetBadLocation(UO.GetX() + 1, UO.GetY());

1. Виключити сусідню клітинку з розрахунку – прямий скрипт

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

  • X/Y — клітина на схід від персонажа.
  • Якщо можливий обхід, повертається інший шлях; персонаж не рухається.
UO.SetBadLocation(UO.GetX() + 1, UO.GetY());
var path = UO.GetPathArray(UO.GetX() + 3, UO.GetY(), true, 0);
UO.Print(Convert.ToString(ArrayLength(path)));

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

2. Додати дві клітинки – функція сценарію

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

  • Кожен дзвінок додає одну пару X/Y.
  • Повторення пари не створює другої окремої заборони; Z не є параметром.
return  RunScenario();
 object? RunScenario()
{
    UO.SetBadLocation(1445, 1690);
    UO.SetBadLocation(1445, 1691);
    return null;
}

3. Задати відому перешкоду в сусідній клітині – клас сценарію

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

  • Координати замініть реально непрохідною клітиною. Команда налаштовує локальні дані маршруту та не створює об'єкт у світі.
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 x = UO.GetX() + 1;
        int y = UO.GetY();
        UO.SetBadLocation(x, y);
        UO.Print($"Marked known blocked location: {x},{y}");
        return null;
    }
}

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

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

UO.SetBadLocation(x, y) — UO.SetBadLocation(Any,Any)

Параметри: x (Any), y (Any)

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

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

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

case "setbadlocation":

                {

                    int x = Arg(0), y = Arg(1);

                    if (x < 0 || x > ushort.MaxValue || y < 0 || y > ushort.MaxValue)

                        throw new NativeSubrutineException("UO.SetBadLocation requires world X/Y in 0..65535.");

                    state.BadLocations.Add(x + "," + y);

                    return InjectionValue.Unit;

                }

UO.SetBadObject

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

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

void UO.SetBadObject(object? objType, object? color, object? radius);

Виключає з наступних маршрутів та запитів шляху клітини навколо завантажених предметів світу, вибраних graphic та hue.

Параметри

  • objType — Graphic/type предмета, 0..65535. 0xFFFF або -1 дозволяє будь-який тип. Це не serial конкретного екземпляра.
  • color — Hue предмета, 0..65535. 0xFFFF або -1 дозволяє будь-який колір; 0 означає саме hue 0.
  • radius — Радіус у клітинах, 0..255 включно. 0 виключає клітину предмета. R виключає квадрат max(abs(dx),abs(dy)) <= R навколо нього, включаючи діагональні клітини.

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

void - значення, що повертається немає. Викликайте окремим рядком; це не true/false та не число кроків.

Поведінка

  • Параметри є обов'язковими. Невідповідний діапазон викликає помилку скрипта, а не мовчазне усічення числа.
  • Правила накопичуються у поточному runtime. Збіглися правила об'єднуються: для одного предмета застосовується найбільший радіус. ClearBadObjectList видаляє всі ці правила.
  • Враховуються завантажені динамічні предмети з Container=0, включаючи доступні для клієнта двері. Предмети всередині контейнерів, NPC та статика картки цим фільтром не вибираються. Для персонажів використовуйте avoidMobiles, для окремих клітин - SetBadLocation.
  • На початку MoveXY/NewMoveXY/MoveXYZ/PMove або GetPathArray/GetPathArray3D створюється знімок правил та положень предметів. Подальші зміни світу та списку не змінюють цей знімок; новий запуск отримує нові дані.
  • Фільтр не надсилає нічого серверу, не змушує закритий контейнер завантажити вміст та не змінює ручний рух. Правила X/Y не мають окремого обмеження Z.
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

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

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

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

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

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

UO.Print("Calling UO.SetBadObject");
UO.SetBadObject(0x398C, 0xFFFF, 1);

1. Обійти предмети певного типу – прямий скрипт

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

  • ObjType=0x398C – приклад graphic: замініть типом перешкоди на своєму сервері. Color=0xFFFF вибирає будь-який колір; Radius=1 виключає квадрат 3×3 навколо кожного відповідного предмета.
  • NewMoveXY йде на п'ять клітин на схід, з точними X/Y, пішки, без callback і з timeout=5000 мс. ok = 1 означає досягнення мети; 0 не підтверджує обхід.
UO.SetBadObject(0x398C, 0xFFFF, 1);
var ok = UO.NewMoveXY(UO.GetX() + 5, UO.GetY(), true, 0, false, 0, 5000);
UO.Print(Convert.ToString(ok));

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

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

  • Color = 0x0044 вибирає тільки цей hue, а Radius = 0 виключає тільки зайняту предметом клітину. ClearBadObjectList видаляє колишні правила типу та кольору.
  • GetPathArray повертає записи [x,y,z], включаючи вихідну точку. Порожній масив означає відсутність повного шляху за поточних обмежень. Персонаж залишається дома.
return  RunScenario();
 object? RunScenario()
{
    UO.ClearBadObjectList();
    UO.SetBadObject(0x398C, 0x0044, 0);
    var path = UO.GetPathArray(UO.GetX() + 4, UO.GetY(), true, 0);
    UO.Print("Path records: " + Convert.ToString(ArrayLength(path)));
    return null;
}

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

3. Тимчасово виключити клітини будь-яких предметів світу – клас сценарію

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

  • ObjType=-1 і Color=-1 — обидва wildcard. Radius=0 виключає клітинки всіх завантажених предметів світу, але не NPC і не вміст сумок.
  • Очищення діє на майбутні запити. Вже отриманий path зберігається; це масив координат, а чи не активний маршрут.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.SetBadObject(-1, -1, 0);
        var path = UO.GetPathArray(UO.GetX() + 2, UO.GetY(), true, 0);
        UO.ClearBadObjectList();
        UO.Print(Convert.ToString(ArrayLength(path)));
        return null;
    }

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

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

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

UO.SetBadObject(objType, color, radius) — UO.SetBadObject(Any,Any,Any)

Параметри: objType (Any), color (Any), radius (Any)

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

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

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

case "setbadobject":

                {

                    int type = ResolveType(arguments[0]), hue = Arg(1), radius = Arg(2);

                    if (type < -1 || type > ushort.MaxValue || hue < -1 || hue > ushort.MaxValue || radius < 0 || radius > byte.MaxValue)

                        throw new NativeSubrutineException("UO.SetBadObject requires type/color 0..65535 (or -1) and radius 0..255.");

                    state.BadObjects.Add(type + "," + hue + "," + radius);

                    return InjectionValue.Unit;

                }

Clone this wiki locally